A style api to make system.css your own
Color scheme toggle
system.css uses the custom property --system-cs-is-light
to toggle the state of the
color mode. Light or dark.
:root { /** * color-scheme state * * Example: * color-mix(): Light mode is the first color value and dark mode the second. * color: color-mix(in oklab, black var(--system-cs-state), white); */ --system-cs-state: calc(var(--system-cs-is-light, 1 /* fallback to light mode */) * 100%); } @media (prefers-color-scheme: dark) { :root { --system-cs-is-light: 0; /* OFF */ } }
System Colors
Colour mixing
With color-mix()
we create light and dark mode overrides that are easy to maintain.
--system-canvas: color-mix(
in oklab,
var(--gray-0) var(--system-cs-state),
var(--gray-9)
);
Property | Initial value (default) |
---|---|
--system-accent-color | AccentColor |
--system-accent-color-text | AccentColorText |
--system-active-text | ActiveText |
--system-button-border | ButtonBorder |
--system-button-face | ButtonFace |
--system-button-text | ButtonText |
--system-canvas | Canvas |
--system-canvas-text | CanvasText |
--system-field | Field |
--system-field-text | FieldText |
--system-gray-text | GrayText |
--system-highlight | Highlight |
--system-highlight-text | HighlightText |
--system-link-text | LinkText |
--system-mark | Mark |
--system-mark-text | MarkText |
--system-selected-item | SelectedItem |
--system-selected-item-text | SelectedItemText |
--system-visited-text | VisitedText |
Browser Bugs
A number of system values don't work well in dark mode.
Custom colors
Property | color-mix properties (default) |
---|---|
--system-surface-color |
color-mix( in oklab, /* light mode */ color-mix( in oklab, var(--system-canvas) 95%, var(--system-canvas-text) ) var(--system-cs-state), /* toggle dark mode */ /* dark mode */ color-mix( in oklab, var(--system-canvas) 85%, var(--system-canvas-text) ) ) |
--system-stroke-color |
color-mix(in oklab, var(--system-canvas) 55%, var(--system-canvas-text))
|
--system-invalid-color |
color-mix(in oklab, var(--system-active-text) 90%, var(--system-canvas-text))
|
--system-interactive-color | var(--system-accent-color) |
--system-canvas-text-inverted | var(--system-canvas) |
--system-content-color-light |
color-mix( in oklab, var(--system-canvas) var(--system-cs-state),
var(--system-canvas-text) )
|
--system-content-color-dark |
color-mix( in oklab, var(--system-canvas-text) var(--system-cs-state),
var(--system-canvas) )
|
Typography
Property | Initial values (default) |
---|---|
--system-font-family-display | system-ui |
--system-font-family-data | system-ui |
--system-font-family-interactive | system-ui |
--system-font-family-body | Charter, ... , serif |
--system-font-family-code | ui-monospace |
--system-font-size | 112.5% => 18px |
--system-line-height | 1.5 |
--system-line-height-compact | 1.2 |
--system-line-height-display | 1.1 |
--system-font-size-xxxl | xxx-large |
--system-font-size-xxl | xx-large |
--system-font-size-xl | x-large |
--system-font-size-l | large |
--system-font-size-m | medium |
--system-font-size-s | small |
--system-font-size-xs | x-small |
--system-font-size-xxs | xx-small |
--system-font-weight-thin | 100 |
--system-font-weight-extralight | 200 |
--system-font-weight-light | 300 |
--system-font-weight-normal | 400 |
--system-font-weight-medium | 500 |
--system-font-weight-semibold | 600 |
--system-font-weight-bold | 700 |
--system-font-weight-extrabold | 800 |
--system-font-weight-black | 900 |
Stroke
Property | Initial values (default) |
---|---|
--system-stroke-thin | thin |
--system-stroke-medium | medium |
--system-stroke-thick | thick |
--system-stroke-offset | calc(1cap - 1ex) |
Spacing
Property | Initial values (default) |
---|---|
--system-spacing-single | clamp(8px, 1rem, 24px) |
--system-spacing-double | clamp(16px, 2rem, 48px) |
--system-spacing-page-block | 0 |
--system-spacing-page-inline | max(var(--system-spacing-single), 5vw) |
--system-spacing-heading-block-start | max(var(--system-spacing-double), 2.5ex) |
--system-spacing-heading-block-end | var(--system-spacing-main) |
--system-spacing-main | clamp(var(--system-spacing-single), 1ex, var(--system-spacing-double)) |
--system-spacing-main-block | clamp(var(--system-spacing-single), 1ex, var(--system-spacing-double)) |
--system-spacing-main-inline | clamp(var(--system-spacing-single), 1ex, var(--system-spacing-double)) |
--system-spacing-section-block | max(var(--system-spacing-double), 2.5ex) |
--system-spacing-section-inline | 0 |
--system-spacing-column-gap |
clamp(var(--system-spacing-single), 3cqw, var(--system-spacing-double))
|
--system-spacing-row-gap |
clamp(var(--system-spacing-single), 3cqw, var(--system-spacing-double))
|
--system-spacing-element-block | 0.5ex |
--system-spacing-element-inline | 0.5ch |
--system-spacing-element |
var(--system-spacing-element-block) var(--system-spacing-element-inline)
|
--system-interactive-block |
0.8ex
|
--system-interactive-inline |
1.5ch
|
--system-interactive |
var(--system-spacing-interactive-block)
var(--system-spacing-interactive-inline)
|
Dimensions
Property | Initial values (default) |
---|---|
--system-dimension-min-width | 320px |
--system-dimension-content-width | 85ch |
Radii
Property | Initial values (default) |
---|---|
--system-radius | clamp(3px, 0.6666ex, var(--system-spacing-single)) |