Release 0.16.0
This release adds support for a long-requested feature—descendant and sibling
selectors! We've also expanded defineConsts capabilities, improved our lint
rules, added a webpack example, and made some performance optimizations.
Descendant and sibling selectors
We’re adding a new suite of APIs under stylex.when with support for descendant
and sibling selectors: ancestor, descendant, anySibling, siblingBefore,
and siblingAfter.
- Ancestor/descendant (
stylex.when.ancestorandstylex.when.descendant) selectors let you style an element based on the state of ancestors or descendants in the DOM tree. - Sibling selectors (
stylex.when.anySibling,stylex.when.siblingBeforeandstylex.when.siblingAfter) let you style an element based on the state of adjacent siblings.
To use descendant and sibling selectors, you'll need to mark the element being
observed by passing the stylex.defaultMarker class name. Support for custom
markers will be added in a future release.
import * as stylex from '@stylexjs/stylex';
const styles = stylex.create({
foo: {
backgroundColor: {
default: 'blue',
[stylex.when.ancestor(':hover')]: 'red',
},
},
});
<div {...stylex.props(stylex.defaultMarker())}>
<div {...stylex.props(styles.foo)}> Some Content </div>
</div>;Note: Lookahead selectors like stylex.when.siblingAfter,
stylex.when.anySibling, and stylex.when.descendant rely on the CSS has()
selector, which does not yet have
widespread browser support.
defineConsts improvements
We’ve added support for overriding defineConsts constants that reference CSS
variables (var(--*)) when set to variables and variable fallbacks. Constants
now behave like passthroughs, with overrides applying to the original CSS
variable. This allows you to re-define them within create calls as you would
for defineVars.
export const colors = stylex.defineConsts({
bg: 'var(--background-color)',
accent: 'var(--accent, lightblue)',
});
import { colors } from './colors.stylex.js';
const styles = stylex.create({
root: {
[colors.bg]: 'red',
[colors.accent]: 'darkblue',
},
});We've also added support for defineConsts in dynamic styles. You can now use
defineConsts to declare media queries within dynamic styles as you would in
regular StyleX namespaces.
const style = stylex.create({
main: (height) => ({
color: {
default: colors.red,
[breakpoints.sm]: colors.blue,
[breakpoints.md]: colors.yellow,
},
height: height - 10,
}),
});Linter improvements
We made several improvements and lint fixes to the valid-styles rule. The
valid-styles rule now has support for locally resolved constants.
const HEIGHT = 5;
const styles = stylex.create({
default: {
scrollMarginTop: HEIGHT + 5,
scrollMarginBottom: HEIGHT * 5,
},
});We added linter support for setting CSS custom properties within create calls.
(Thanks @dwei-figma!)
const styles = stylex.create({
default: {
--background-color: 'red',
},
});We also added support for positionTry styles (Thanks @abhakat!), better validation for pseudo-elements (Thanks @dwrth!), migrated object type validation to Flow (Thanks @jcperez-ch!), and of 0 values as strings ('0') for length properties.
Bug fixes
- Fixed class name construction for dynamic contextual styles.
- Reduced chances of dynamic variable name collisions. (Thanks @necolas!)
Miscellaneous
- A webpack example was added to our suite of StyleX example integrations! (Thanks @RavenColEvol!)
- Support to hoist
stylex.createand nested objects within functions. - Optimized precomputed props calls in JSX. (Thanks @necolas!)
- More efficient handling of null/undefined in dynamic styles.

