Axon 911 Frontend DocsAxon 911 Frontend Docs
Axon 911 Frontend Docs
    Loading navigation…
U
User
Switch to light mode
  1. Working On Features
  2. Styling

Styling

SCSS, BEM naming, and design tokens.

Quick Reference
Styling decision flowchart:
  1. Box/FlexBox props and shipped parts (Card, overlay headers and footers) — preferred
  2. Token-only CSS modules on Box/FlexBox — when props do not cover a gap (for example :hover)
  3. find-pattern / UX Guild — when no pattern exists
Never use:
  • ❌ sx prop or sxStyles
  • ❌ styled-components
  • ❌ Inline style={{}} on design-system components
  • ❌ className on shipped controls to override layout or paint
  • ❌ @layer chroma.overrides (or any CSS) to beat Box or component props
  • ❌ Raw lengths, colors, spacing, radii, shadows, z-index, opacity, or motion literals in product CSS
  • ❌ Utility classes with arbitrary values
Consumer styling (ADR 0002 consumer call-site rules):
  • Layout and paint through Box/FlexBox props and enum props on shipped components
  • Do not override @prepared911/ui styles; request gaps via find-pattern
  • CSS modules may target only Box or FlexBox, with Chroma var(--…) tokens only
  • bem() is not an export of @prepared911/ui
Design System First
Always check if Box/FlexBox props can handle the styling:
Co-located SCSS
When Box props aren't enough, use className + co-located SCSS:
File Naming
Match component filename convention:
  • MyComponent.tsx → MyComponent.scss (PascalCase)
  • filter-bar.tsx → filter-bar.scss (kebab-case)
  • Single stylesheet in directory → styles.scss
Importing
BEM Naming
Block Element Modifier
With Sass &
className and CSS modules
bem() and prefixClass() are not exports of @prepared911/ui. Consumers do not override shipped component styles. Layout and paint go through Box/FlexBox props and shipped parts; a co-located CSS module may style only the Box or FlexBox host, with token references enforced by pnpm lint:css (ADR 0002 consumer call-site rules). Generates:
Design Tokens
Always use design tokens instead of hardcoded values:
Max 2 Levels
Only .block and .block__element. Never .block__element__subelement.
Responsive Design
Use media queries with design tokens:
When to Use Each Approach
Use Box/FlexBox props when:
  • ✅ Layout (flex, grid, spacing, alignment)
  • ✅ Typography (font size, weight, color)
  • ✅ Spacing (margin, padding, gap)
  • ✅ Design system values exist
Use a token-only CSS module on Box/FlexBox when:
  • ✅ Complex selectors (:hover, :focus, :nth-child) props do not cover
  • ✅ Pseudo-elements (::before, ::after)
  • ✅ Media queries (token breakpoints and spacing only)
  • ✅ Motion tokens (--duration-*, --easing-*) for transitions
Do not use a module to override a shipped control's layout or paint. Escalate to UX Guild when:
  • ❌ No design system pattern exists
  • ❌ Component behavior unclear
  • ❌ New visual pattern needed
Common Patterns
Hover States
Conditional Classes
Related Documentation
  • Tokens - Design tokens reference
  • UI Components - @prepared/ui-* package usage
  • Component Patterns - Component organization
Reference Files
For more detailed technical guidance, see these reference files:
  • css-best-practices SKILL.md
  • stylesheets-for-react.md
  • using-bem-and-sass.md
  • react-ui-implementation SKILL.md
Previous
Working on features / Writing Hooks
Next
Working on features / Localization (i18n)
On this page
Quick Reference
Design System First
Co-located SCSS
File Naming
Importing
BEM Naming
Block Element Modifier
With Sass &
className and CSS modules
Design Tokens
Max 2 Levels
Responsive Design
When to Use Each Approach
Common Patterns
Hover States
Conditional Classes
Related Documentation
Reference Files