Styling
Styling
Preactile supports a few complementary approaches to styling.
CSS classes
The simplest approach is a standard class name:
import preactile.*
E.div(
A.`class`("card"),
E.h2(A.`class`("card-title"), "My Card"),
E.p(A.`class`("card-body"), "Card content here."),
)
Inline styles
A.style takes CSS Declarations from S, not a Map:
import preactile.*
E.div(
A.style(S.background("yellow"), S.padding("1rem")),
"This box is highlighted!",
)
CSS-in-JS (CssClass)
preactile.dsl.css.CssClass generates a scoped class and injects the rules into the
document. Use it for styles that belong to a component:
import preactile.*
import preactile.dsl.css.CssClass
object CardStyles extends CssClass(
S.background("#fff"),
S.borderRadius("8px"),
S.boxShadow("0 2px 4px rgba(0,0,0,0.1)"),
)
StyledElement is a CssClass that also constructs a specific HTML tag, so you can write
object Card extends StyledElement(E.div)(S.padding("1rem")) and then Card("…").
Live demo: CSS-in-JS and inline styles
This card uses CssClass for scoped styling plus inline styles for one-off overrides:
import preactile.*
import preactile.dsl.css.CssClass
object CardStyles
extends CssClass(
S.background("#fff"),
S.borderRadius("8px"),
S.boxShadow("0 2px 4px rgba(0,0,0,0.1)"),
S.padding("16px"),
S.maxWidth("300px"),
)
object TitleStyles
extends CssClass(
S.marginBottom("8px"),
S.color("#1f2937"),
)
object BodyStyles
extends CssClass(
S.color("#6b7280"),
S.fontSize("14px"),
S.lineHeight("1.5"),
)
object App extends Component[Unit]:
def render(props: Unit): VNode = E.div(
A.`class`("styling-demo"),
E.div(
CardStyles,
E.h3(TitleStyles, "Styled Card"),
E.p(BodyStyles, "This card uses Preactile's CSS-in-JS utilities for scoped styling."),
E.div(
A.style(S.marginTop("12px"), S.padding("8px"), S.background("#f3f4f6"), S.borderRadius("4px")),
E.small("Inline styles work too!"),
),
),
)
end AppThis example runs in your browser; enable JavaScript to see it.
The CardStyles, TitleStyles, and BodyStyles objects compose CSS rules that are scoped
to the component. Inline styles via A.style(S.marginTop("12px"), …) handle quick overrides
without defining a separate style object.
See the Examples page for the other live demos.