API ReferenceSelectors

Selectors

The extensions cx and styled support selectors; on the other hand css does not because it only generates one Rule.

The syntax is similar to SASS but the only difference is that for nesting you need to use & in front of each selector.

let link = %cx(`
  color: $(Color.Text.body);
 
  &:hover {
    color: $(Color.Text.accent);
  }
`)
let link = [%cx {|
  color: $(Color.Text.body);
 
  &:hover {
    color: $(Color.Text.accent);
  }
|}];

Note: Selectors can be nested within your CSS which will be attached to the classname generated (in this case by cx)

More than one level of selectors is not supported. It might compile but it will generate the wrong result.

The support for selectors is CSS Selectors Level 3 and the more stable part of level 4 (currently in draft).

Interpolation in selectors

It’s useful to keep classnames unique, or to reference other classnames in styled-ppx, that’s why we support interpolation in selectors.

// Here `outlined` is a classname generated by `cx`, but it can be any string
let outlined = %cx(`
  padding: 4px;
  outline: 1px solid red;
`)
 
let link = %cx(`
  color: $(Color.Text.body);
 
  & .$(outlined) {
    padding: 0px;
  }
`)
 
<div className={link ++ " " ++ (isActive ? outlined : "")} />
// Here `outlined` is a classname generated by `cx`, but it can be any string
let outlined = [%cx {|
  padding: 4px;
  outline: 1px solid red;
|}];
 
let link = [%cx {|
  color: $(Color.Text.body);
 
  & .$(outlined) {
    padding: 0px;
  }
|}];
 
<div className={(link ++ " ") ++ (if (isActive) {outlined} else {""})} />;