January 26, 2020

Looping in bs-emotion

If you like to do a loop in bs-emotion for list of classes and do something, for example different background colors for class of name 1 - 10.

.class_1 {background-color: ...}
.class_2 {background-color: ...}
.class_3 {background-color: ...}
.class_4 {background-color: ...}

here's how:

First you create a loop function with list of colors that you want to loop over and each class_index_number, since bs-emotion uese ocaml syntax, I am using Belt library in my case, you might want to use stdlib List.mapi

let colors = ["a6d5c0"; "bbdbb9"; "d6e2b1"]
let classLoop i = 
  let selector idx item = 
    select ("&.class_index_" ^ string_of_int idx) [
      backgroundColor (`hex item);
    ]
    in
    i |. Belt.List.mapWithIndex (fun idx -> fun item -> selector idx item)

Next you create a variable that has list of child classes which contains different background colors.

Since bs-emotion only allow emotion inside emotion css even with ppx, you want to use extend method provided by bs-emotion to extend to classList that we created.

let myClassName = css ~extend: classList [
  display `inlineBlock;
  ...
]

This will translate into:

let myClassName = css ~extend: classList [
  display `inlineBlock;

  select "&.class_index_1" [
    backgroundColor (`hex "a6d5c0");
  ];
  select "&.class_index_2" [
    backgroundColor (`hex "bbdbb9");
  ];
  select "&.class_index_3" [
    backgroundColor (`hex "d6e2b1");
  ];
]

You might not need this usually, but if you really need hopefully this method will be useful for you.