Runtime
Imported Stylable stylesheets contain minimal runtime code to help define the structure and state of the component.
/* style.st.css */
.root {
-st-states: selected;
}
.label {}
.icon {}
/* index.jsx */
import style from "style.st.css"; // import stylesheet's runtime API
Manual mapping
CSS class names, defined in the stylesheet, are exposed directly on the import reference and mapped to their runtime target value. The expected class name is then used as an element class name in the structure.
style.root // "style__root"
style.label // "style__label"
style.icon // "style__icon"
Note
The root class is available even when it is not defined in the stylesheet.
Custom state mapping
Custom states, which can be targeted from the style, are generated using the $cssStates
function. The function accepts a map of local state names and generates an object with data-*
attributes used to mark the element state.
/* { 'data-style-selected':true } */
style.$cssStates({ selected:true })
/* { 'data-style-unknownstate':true } */
style.$cssStates({ unknownState:true })
/* { } */
style.$cssStates({ selected:false }) // no states
/* { 'data-style-a':true, 'data-style-b':true } */
style.$cssStates({ a:true, b:true }) // multiple
Generate element attributes
The minimal runtime provides a function to help with component definition.
Calling the function returns an object describing the attributes of a node in the component view.
Element name
The first argument represents the name of the element, and returns a className
attribute to mark the element node.
/* { className:'style__root' } */
style('root')
/* { className:'style__label' } */
style('label')
/* { className:'style__label style__icon' } */
style('label icon') // multiple markings
Note
Any class name that is not found in the stylesheet is not namespaced and is treated as global.
Custom states
The second argument represents the custom state, and returns a data-*
attribute to represent the custom state on the element.
/* { className:'style__root', 'data-style-selected':true } */
style('root', { selected:true })
/* { className:'style__label', 'data-style-searched':true } */
style('label', { searched:true })
Merge props
The third argument can be used as a base for the generated class name and states.
/* { className:'style__root class-a' } */
style('root', {}, { className:'class-a' })
/* { className:'style__root label icon' } */
style('root', {}, { className:'label icon' }) // appended without namespacing
/* { className:'style__root', 'data-a':true } */
style('root', {}, { 'data-a':true })
Note
Anydata-*
attribute passed in the base overrides its generated equivalent.