callstack / linaria

Zero-runtime CSS in JS library
https://linaria.dev
MIT License
11.68k stars 417 forks source link

Consider leverage css layers to control rule priorities. #993

Open hackwaly opened 2 years ago

hackwaly commented 2 years ago

Describe the enhancement

Inspired from https://github.com/unocss/unocss#layers

linaria.config.js

module.exports = {
  layers: ["utility", "component", "application"],
  defaultLayer: "application"
}

Add optional options argument which can be used to pass layer option to css function.

function Button(props: { className?: string; children?: ReactNode }) {
  return (
    <button
      className={cx(
        css({ layer: "component" })`
          border-radius: 4px;
        `,
        props.className
      )}
    >
      {props.children}
    </button>
  );
}

function App() {
  return (
    <Button
      className={css`
        border-radius: 8px;
      `}
    ></Button>
  );
}

Output rules with care of layers order, except that in development environment could just simply rely on browser's native css layers feature.

Motivation

The cx function of@linaria/atomic has high runtime overhead.

Possible implementations

Related Issues

jpnelson commented 2 years ago

I think this is a good idea too. What do you think about doing something similar to what we do with @media rules, and supporting the native API? Eg.

const class = css`
    @layer component {
        border-radius: 8px;
    }
`;
hackwaly commented 2 years ago

I think this is a good idea too. What do you think about doing something similar to what we do with @media rules, and supporting the native API? Eg.

const class = css`
    @layer component {
        border-radius: 8px;
    }
`;

I think the native syntax is better.