Styling Tokens
Three colors plus five preset families drive every control in the hosted login. All together they represent about ten decisions per theme — enough room to sit anywhere on the design spectrum without writing CSS. For the visual foundation these presets target, see the design tokens reference.
Colors
| Field | What it drives |
|---|---|
| Primary Color | Buttons, focus rings, active states, accent gradients, aurora blob tinting, glass chip highlights. |
| Background Color | The page canvas behind all panels. On aurora, a base haze is mixed from this. On cinematic-split without an image, this is blended into the hero mesh. |
| Surface Color (optional) | The card / form panel fill. Only applied when Apply custom surface tint (useSurfaceColor) is on. |
Hex input format
Colors accept hex only. The studio provides a native color picker alongside a text input. Acceptable formats for the text input:
#RRGGBB— six-digit hex (most common).#006B2Cis valid.#RRGGBBAA— eight-digit hex with alpha. Accepted but rarely useful; prefer controlling opacity via surface style.- Shorthand
#RGBis not accepted — type the full six digits. - The
#is optional on input; it's normalized in automatically.006B2C→#006B2C.
Invalid hex input silently resets the field. Check the picker if you see colors not updating — it means your input was rejected.
The surface color toggle
Flip Apply custom surface tint (useSurfaceColor) on when you want a specific card color that isn't a shade of the background. When it's off, BluAuth derives a subtle surface fill from color-mix(in srgb, var(--auth-background) 80%, black 20%) — a slightly darker version of the background. This is usually fine, and it's the default.
Turn it on when:
- Your brand has a specific card color in the design spec (e.g. a lighter neutral over a deep canvas).
- You're using a light theme and need the card to sit above the canvas tonally.
- Your background is an image and you need the card to have a solid, predictable fill.
How surface color interacts with full-bleed backgrounds
When a Full Bleed background image is set, the background canvas behind the card is the image, not the background color. The card still renders with its surface fill on top. If the surface is transparent or low-opacity (glass style), the image shows through. If the surface is solid, the card blocks the image behind it — which is often what you want for text legibility.
Plan accordingly: dark image + glass surface + dark primary = unreadable text. Test with your real image, not a placeholder.
Contrast responsibility
The studio does not enforce WCAG contrast ratios. If you set a primary that can't be seen against your background, or body text that fails 4.5:1 against your surface, no warning fires — the form just renders unreadable. Treat contrast as your job. If you're unsure, validate against WebAIM's contrast checker using your resolved colors.
A rule of thumb: primary vs surface should reach at least 4.5:1 for interactive controls, and body text vs surface should reach 7:1 for small copy. See the design tokens reference for the Precision Curator palette, which is pre-tuned to these ratios.
Font Family Preset
Five presets. Underlying field: fontFamilyPreset.
| Preset | Stack | Network cost |
|---|---|---|
system | system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif | None |
inter | Inter, "Segoe UI", system-ui, sans-serif | Google Fonts (one request) |
roboto | Roboto, "Helvetica Neue", Arial, sans-serif | None (OS-resolved) |
humanist | "Avenir Next", "Segoe UI", system-ui, sans-serif | None (OS-resolved) |
editorial | "Iowan Old Style", "Palatino Linotype", "Book Antiqua", Georgia, serif | None (OS-resolved) |
system— fastest. The most native feel. Pick this if you don't have a reason not to.inter— the neo-grotesque baseline of the Precision Curator system (see design tokens). Loaded from Google Fonts.roboto— Android-native feel.humanist— softer grotesque, reads warmer than Inter.editorial— a serif. Distinct; best paired witheditorial/cinematic-splitlayouts when the brand leans heritage.
Surface Style Preset
Controls the card / form panel finish. Underlying field: surfaceStylePreset.
| Style | Effect | Best for |
|---|---|---|
elevated | Tonally layered surface — sits on a slightly different tone than the background. Slight inset highlight. No hard border. | Editorial / Precision Curator looks. |
solid | Flat fill with no ambient elevation. The card looks "printed" on the canvas. | Minimal / utility designs. |
glass | Semi-transparent fill with a 20px backdrop-blur. | Layouts with a strong background image or aurora. |
Matches the "No-Line Rule" in the design tokens reference — boundaries come from tonal shifts, not 1px borders.
Field Style Preset
Controls how inputs look. Underlying field: fieldStylePreset.
| Style | Effect |
|---|---|
default | Standard outline — a subtle ghost border at rest, primary on focus. |
quiet | Tinted fill, no resting border, primary ring on focus. Feels "printed in" rather than "sitting on." |
outline | Heavier visible outline for brand-forward themes where inputs should pop. |
high-contrast | Outline with increased border opacity and darker fill. Accessibility-first. |
quietis the best match for editorial aesthetics (split-heroorcinematic-splitwithelevatedsurface).high-contrastis the right call when your primary has low contrast against the background — the extra border opacity keeps inputs findable.
Button Style Preset
Controls primary CTAs. Underlying field: buttonStylePreset.
| Style | Effect |
|---|---|
solid | Primary color fill with on-primary text — standard solid button. |
soft | Tinted fill (primary at low opacity), primary text. Softer click target. |
outline | Transparent fill with a primary-colored border. |
solidis the most clickable. It's the right default for every layout.softreads as gentler and pairs well withminimal.outlineis the right call for sparse layouts where you want the form to feel less heavy — especiallyaurorawith a dark background where a solid button can look like a hole.
Density Preset
Controls vertical rhythm. Underlying field: densityPreset.
| Density | Effect |
|---|---|
comfortable | Standard spacing — 1.5rem between sections, 1rem between fields. |
compact | Tighter — 1rem between sections, 0.75rem between fields. |
Use compact when:
- You have a lot of supporting copy and the form pushes below the fold.
- You're targeting short viewports (laptops in dock, below-fold-sensitive landing pages).
- You're using
cinematic-split --height-containedand want the form to breathe less.
A safe default combo
If you're not sure where to start:
- Layout:
split-hero - Primary: your brand color (not blue — see design tokens)
- Background:
#0F172A(deep slate) or your brand dark - Surface Color: leave off (let BluAuth derive)
- Font:
system(orinterif you want the Precision Curator baseline) - Surface Style:
elevated - Field Style:
quiet - Button Style:
solid - Density:
comfortable
That combination lands cleanly for almost every tenant. Iterate from there.
Next
- Concept copy — what the headings, subheadings, and hero fields control.
- Assets and backgrounds — how logo and background image interact with these presets.
- Advanced CSS — when the presets aren't enough.