--cs-ease-standardCroStream UI kit Foundations
Live catalogFoundations, tuned to the signal.
Color, type, space, shape, depth and motion: the decisions every CroStream screen inherits. Built in OKLCH, checked for contrast in every theme, and made to hold still when you ask it to.
Dark
Text 100% · Full motion · Comfortable · Effects on
- Themes
- 2
- Dark · High contrast
- Surfaces
- 6
- sunken → 4
- Type steps
- 11
- 11 → 64 px
- Curves
- 6
- 2 sampled springs
- Icons
- 109
- 24 px grid
- Text contrast
- 7:1
- AAA in High contrast
01Color
Color
Tinted graphite in OKLCH, one signal blue and five status signals. Every role is a token, and every pairing below is measured live against the theme you're looking at.
--cs-surface-sunken--cs-surface-0…4--cs-n-l-*
--cs-text-1…3--cs-*-text
Disabled text is exempt from WCAG contrast, but is still kept legible. High contrast raises the bar to 7:1 for every role.
| Text role | surface-sunken | surface-0 | surface-1 | surface-2 | surface-3 | surface-4 |
|---|---|---|---|---|---|---|
text-1 Primary | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring |
text-2 Secondary | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring |
text-3 Tertiary, placeholders | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring |
text-disabled Disabled · exempt | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring |
accent-text Links, selected labels | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring |
ok-text Success | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring |
warn-text Warning | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring |
err-text Error | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring |
info-text Information | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring |
live-text On air | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring | Aa Measuring |
--cs-accent-*--cs-focus
Your Hydrate! trigger fired 12 times last stream. 2
--cs-focus, outline plus halo- 1
accent-fgIcons, indicators, meter fills Measuring on surface-1 - 2
accent-textLinks and selected labels Measuring on surface-1 - 3
accent-softSelected row, active filter tint · no rule - 4
accent-soft-hoverHover on a soft fill tint · no rule - 5
accent-lineEdge of a selected item Measuring on surface-1 - 6
accent-solidPrimary button at rest Measuring on-solid - 7
accent-solid-hoverPrimary button, hover Measuring on-solid - 8
accent-solid-pressPrimary button, pressed Measuring on-solid - 9
accent-on-solidText and icons on solid Measuring on solid
--cs-{ok,warn,err,info,live}-*
--cs-ok-* Measuring OBS connected Measuring soft line Connected Measuring--cs-warn-* Measuring Twitch sign-in expires in 3 days Measuring soft line Expiring Measuring--cs-err-* Measuring Discord bot offline Measuring soft line Offline Measuring--cs-info-* Measuring Update ready Measuring soft line Update Measuring--cs-live-* Measuring You're live Measuring soft line Live Measuring--cs-line-1…3--cs-line-control--cs-bw-control
line-1 Dividers, hairlines Decorative · exempt- on S Measuring
- on 0 Measuring
- on 1 Measuring
- on 2 Measuring
- on 3 Measuring
line-2 Panel and card edges Decorative · exempt- on S Measuring
- on 0 Measuring
- on 1 Measuring
- on 2 Measuring
- on 3 Measuring
line-3 Strong decorative edges Decorative · exempt- on S Measuring
- on 0 Measuring
- on 1 Measuring
- on 2 Measuring
- on 3 Measuring
line-control Inputs, toggles, checkboxes Must reach 3:1- on S Measuring
- on 0 Measuring
- on 1 Measuring
- on 2 Measuring
- on 3 Measuring
line-control-hover The same, under the pointer Must reach 3:1- on S Measuring
- on 0 Measuring
- on 1 Measuring
- on 2 Measuring
- on 3 Measuring
--cs-brand-*--cs-x-*
- Twitch
--cs-brand-twitch - OBS Studio
--cs-brand-obs - Discord
--cs-brand-discord - Steam
--cs-brand-steam
-
--cs-x-cyan -
--cs-x-blue -
--cs-x-indigo -
--cs-x-amber
Never miss the moment.
02Typography
Typography
Inter for everything you read, JetBrains Mono for everything you type or copy. Size, line height and tracking are tuned per step, so nothing is just scaled up.
--cs-text-*--cs-lh-*--cs-track-*
-
Never miss the moment.
-
CroStream catches it for you.
-
Moments, captured live
-
Triggers and macros
-
Channel point reward redeemed
-
Every cheer, raid and redeem, handled while you play.
-
Chat triggers drive OBS scenes, alerts and sounds without a single plugin.
-
Alerts queue in order and never overlap, even during a raid.
-
Last raid 2 minutes ago · 48 viewers · 3 new followers
-
Updated 12:04:31 · synced with Twitch
-
Live now
--cs-weight-*
- Ag Regular
- Ag Medium
- Ag Semibold
- Ag Bold
- Ag Heading
- Ag Display
Never miss the moment.
opsz 14–32
Raid incoming
Raid incoming
--cs-font-features
Il1 O0 rn m
lIlI1_l0O
Il1 O0 rn m
lIlI1_l0O
--cs-font-mono
chat !lurk → {user.name} is lurking {counter.deaths} = 10 · 0O 1lI scene "Starting Soon" 0.250s.cs-label--cs-font-label
Moments are captured for you while you stream
Clips land in your library the second a raid, hype train or big redeem happens, ready to post.
Moments are captured for you while you stream
Clips land in your library the second a raid, hype train or big redeem happens, ready to post.
--cs-measure
CroStream sits next to OBS and listens to your channel. When chat types a command, a viewer redeems a reward or a raid arrives, it runs the macro you built: switch a scene, play a sound, show an alert, flash the screen. You stay in the game.
03Space & density
Space & density
A 4px grid in rem, so spacing grows with the text size setting. Two densities share it: comfortable for the site, compact for the app's working screens.
--cs-space-*
--cs-space-0-5--cs-space-1--cs-space-1-5--cs-space-2--cs-space-2-5--cs-space-3--cs-space-4--cs-space-5--cs-space-6--cs-space-8--cs-space-10--cs-space-12--cs-space-16--cs-space-20--cs-space-24--cs-space-32
--cs-control-h-*--cs-control-px-*--cs-control-font
--cs-target-min
04Shape
Shape
Seven radii and three line weights. Corners nest concentrically, and lines thicken where people with low vision need to find an edge.
--cs-radius-*
-
--cs-radius-xschips, tokens -
--cs-radius-smsmall controls -
--cs-radius-mdbuttons, fields -
--cs-radius-lgcards, panels -
--cs-radius-xldialogs -
--cs-radius-2xlhero tiles -
--cs-radius-fullpills, dots
--cs-radius-2xl--cs-space-3
--cs-bw--cs-bw-control--cs-focus-width
- Hairline dividers, panel edges
--cs-bw - Control fields, toggles, outlined buttons
--cs-bw-control - Focus ring keyboard focus
--cs-focus-width
05Elevation
Elevation
Depth comes from light, not from borders alone: every raised layer is a little lighter, catches a 1px highlight along its top edge, and casts a two-part shadow, a tight contact shadow plus a soft key light.
--cs-elev-0…4--cs-surface-0…4
- Level 0 Page The canvas everything sits on. Flat: no shadow, no edge.
--cs-elev-0 - Level 1 Panel Sidebars, section panels, table frames. A contact shadow and the lit top edge.
--cs-elev-1 - Level 2 Card Cards and raised controls inside panels. Adds a soft key shadow.
--cs-elev-2 - Level 3 Popover Menus, popovers, tooltips: things that float over content.
--cs-elev-3 - Level 4 Modal Dialogs and drawers over a scrim. The deepest shadow there is.
--cs-elev-4
--cs-surface-sunken--cs-edge-shade
Event log
- Raid from pixel_mage · 34 viewers
- Channel points: Hydrate!
- Trigger !lurk ran macro Lurk mode
--cs-edge-highlight--cs-line-1
--cs-elev-3--cs-elev-4--cs-scrim
Delete “Hydrate!”?
The trigger and its history go. Macros it used stay.
--cs-line-1--cs-line-2--cs-bw
- Shadows and highlights go. Every
--cs-elev-*resolves to nothing, so no layer relies on them. - Edges are drawn instead. Panels and cards get a 1px edge at 4:1 or better; popovers and modals get 2px.
- Surfaces barely step. Separation comes from the edge, so the backgrounds stay deep and the text stays at 7:1 or better.
Showing Dark
06Motion
Motion
Motion explains what just happened: where something came from, what you pressed, what changed. Entrances take their time, exits get out of the way, springs are kept for things you set moving by hand, and reduced motion keeps every bit of feedback while dropping the movement.
--cs-ease-*
--cs-ease-out--cs-ease-in--cs-ease-in-out--cs-ease-spring--cs-ease-pop--cs-dur-1…6--cs-exit-factor
dur-1Press feedback 0msdur-2Hover, colour, small state 0msdur-3Fades, small moves 0msdur-4Popovers, panels, menus 0msdur-5Large moves, page sections 0msdur-6Expressive, ambient 0msdur-springSprings (they need the tail) 0msexit of dur-4dur-4 × exit-factor 0ms
data-cs-motionprefers-reduced-motion
| Token | Full | Reduced | Now |
|---|---|---|---|
travel-1 | 2px | 0px | … |
travel-2 | 4px | 0px | … |
travel-3 | 8px | 0px | … |
travel-4 | 16px | 0px | … |
press-scale | 0.97 | 1 | … |
hover-lift | -1px | 0px | … |
ease-spring | spring | standard | … |
ease-pop | pop | standard | … |
dur-4 | 280ms | 160ms | … |
dur-5 | 420ms | 160ms | … |
dur-6 | 720ms | 160ms | … |
dur-spring | 560ms | 160ms | … |
Kept: fades, colour and border changes, and the short durations (dur-1 to dur-3), so a press, a hover and an arrival are all still visible. Dropped: travel, scale, springs, parallax and ambient loops.
--cs-travel-*--cs-press-scale--cs-hover-lift
Enter / exit
Press
Hover lift
Spring vs standard
Pop
07Focus & states
Focus & states
Every control speaks the same eight states. None of them relies on colour alone: focus adds a ring, selected adds a fill and a mark, invalid adds an icon and words, disabled changes the edge and stays readable.
--cs-state-hover--cs-state-press--cs-accent-soft--cs-err-line--cs-text-disabled
--cs-focus--cs-focus-width--cs-focus-offset--cs-focus-halo
- outline
- …
- offset
- …
- halo
- …
- colour
- signal blue
High contrast swaps this for a 3px yellow ring at 3px offset, a colour nothing else uses, so focus is never mistaken for "selected".
--cs-target-min--cs-control-h-*
- sm 0px < 24 ✕
- md 0px < 24 ✕
- lg 0px < 24 ✕
Control heights in the current density and text size. Compact's small control is exactly 24px at 100%.
08Icons
Icons
A set drawn for CroStream on a 24px grid: one stroke, round caps and joins, and stroke weights tuned per size so a 16px icon reads as firmly as a 32px one.
Iconnamesizelabel
- dashboard
- activity
- trigger
- macro
- event
- overlay
- widget
- media
- alert
- chat
- settings
- live
- plus
- minus
- x
- check
- search
- edit
- copy
- trash
- link
- external
- download
- refresh
- grip
- more
- menu
- chevron-up
- chevron-down
- chevron-left
- chevron-right
- user
- users
- clock
- play
- pause
- stop
- mic
- volume
- camera
- eye
- eye-off
- bell
- keyboard
- plug
- info
- success
- warning
- error
- heart
- star
- gift
- points
- sparkle
- folder
- folder-open
- folder-plus
- folder-move
- tag
- move
- panel
- file
- video
- music
- font
- archive
- code
- upload
- grid
- list
- undo
- redo
- unlock
- queue
- counter
- webhook
- flask
- calendar
- goal
- timer
- cooldown
- variable
- wheel
- image
- shield
- lock
- contrast
- text-size
- motion
- arrow-up
- arrow-down
- arrow-left
- arrow-right
- login
- key
- send
- broadcast
- dice
- shuffle
- trophy
- power
- branch
- fork
- repeat
- hourglass
- film
- message
- palette
- magnet
- Info
- Success
- Warning
- Error
09Expressive layer
Expressive layer
Gradients, light, texture and ambient motion, all optional. Every effect has a plain fallback that the Effects setting and the High contrast theme switch to, and none of them ever carries meaning on its own.
Moment captured
Chat spiked 6.2× in 8 seconds
- Viewers
- 1,284
- Chat / min
- 412 +6.2×
- On air
- Live
.cs-gradient-text--cs-x-gradient
Never miss the moment.
Never miss the moment.
Display sizes only. The darkest stop still clears 3:1, the bar for large text; the fallback is plain primary text.
.cs-gradient-border--cs-gradient-border
Featured widget
Installed by 2,140 streamers
Featured widget
Installed by 2,140 streamers
A 1px edge that catches the light. Falls back to the ordinary panel line, so the box keeps its shape.
.cs-aurora--cs-x-aurora-opacity
Slow drifting light behind a hero or empty state, one full cycle every 36s. Holds still under reduced motion; gone under High contrast.
.cs-grain--cs-x-grain-opacity
Film grain breaks up the 8-bit banding dark gradients show on cheap panels. Invisible as texture at normal viewing distance.
.cs-spotlightuse:spotlight
A soft light that follows the pointer across a surface. Mouse and pen only; touch has no hover to light.
.cs-glow.cs-glow-live
Reserved for focus, live and connected: light means something is on. Falls back to the solid colour and the label.
.cs-live-ring
A sweep around whoever is on air. Holds still under reduced motion, becomes a solid ring under High contrast, and always sits next to the word Live.
10Accessibility
Accessibility
WCAG 2.2 AA in every theme, AAA text under High contrast. Measured here, live, against whatever the tokens resolve to right now.
--cs-text-*--cs-*-text--cs-line-control--cs-focus
| Foreground | sunken | 0 | 1 | 2 | 3 | 4 |
|---|
- 1.4.1 APer component
Use of color
Every status role pairs its colour with a shape, icon or word. Links are underlined on hover and always under High contrast.
- 1.4.3 AABuilt in
Contrast (minimum)
All text tokens reach 4.5:1 on every surface, in every theme. Audited live above and in npm run check:themes.
- 1.4.4 AABuilt in
Resize text
Type, space, radii and controls are in rem, so the 100–200% text-size setting (and browser zoom) scales everything together.
- 1.4.6 AAABuilt in
Contrast (enhanced)
The High contrast theme lifts every text pairing to 7:1 or better.
- 1.4.10 AAPer component
Reflow
Layouts are built on container queries and previewed at 360px; nothing should need sideways scrolling except data tables, which WCAG exempts.
- 1.4.11 AABuilt in
Non-text contrast
line-control, focus and every -fg indicator reach 3:1 on all surfaces. Decorative hairlines (line-1…3) are exempt and kept out of that job.
- 1.4.12 AAPartly
Text spacing
Line height and tracking are tokens, never fixed heights on text boxes, so user spacing overrides do not clip.
- 2.3.1 ABuilt in
Three flashes
Nothing in the kit flashes. The live ring sweeps; it never blinks. App features that flash (screen flash, alerts) need their own guard.
- 2.3.3 AAABuilt in
Animation from interactions
Reduced motion zeroes travel, scale and springs and stops ambient loops, but keeps short fades. Honoured in CSS before any script runs.
- 2.4.7 AABuilt in
Focus visible
One :focus-visible outline everywhere. An outline, not a shadow, so it survives Windows High Contrast.
- 2.4.11 AAPer component
Focus not obscured (minimum)
Sections reserve scroll margin for the sticky header; components with sticky bars must do the same.
- 2.4.13 AAABuilt in
Focus appearance
2px ring with 2px offset at 3:1 or better; High contrast uses a 3px yellow ring that no other state shares.
- 2.5.8 AAPer component
Target size (minimum)
--cs-target-min is 24px and compact density still clears it.