Foundation
Poyraz Soft Glass
Minimal, soft and lightly rounded surfaces with an optional glass enhancement. Brand red remains the primary identity; status colors are independent semantic signals.
Primitive palettes
Primitive colors are stable ingredients. Components consume semantic roles below, never a primitive step directly.
Brand red
#fef2f2#fee2e2#fecaca#fca5a5#f87171#ef4444#dc2626#b91c1c#991b1b#7f1d1d#450a0aNeutral light
#ffffff#fbfbfc#f7f7f9#ededf1#dddde4#b7b8c2#888a96#656773#484a54#2e3038#1c1e24#111217Neutral dark
#ffffff#f7f8fa#eceef2#d8dbe2#b8bdc8#9299a6#6f7785#545b68#3b414b#262b33#171b21#0b0e12Semantic surfaces
These roles automatically switch with .dark or data-poyraz-theme. Surface is the default card plane; raised and elevated are reserved for increasing hierarchy.
Canvas
--poyraz-backgroundSurface
--poyraz-surfaceSubtle
--poyraz-surface-subtleRaised
--poyraz-surface-raisedElevated
--poyraz-surface-elevatedPrimary
--poyraz-primarySecondary
--poyraz-secondaryMuted
--poyraz-mutedAccent
--poyraz-accentDisabled
--poyraz-disabledInvalid
--poyraz-invalidStatus roles
Information, success, warning and destructive palettes stay separate from brand red so product meaning does not change when the brand is customized.
Information
Semantic feedback surface with theme-aware contrast.
Success
Semantic feedback surface with theme-aware contrast.
Warning
Semantic feedback surface with theme-aware contrast.
Destructive
Semantic feedback surface with theme-aware contrast.
Glass recipe
Glass is an opt-in enhancement, not the default surface. Unsupported, reduced-transparency and low-power modes receive an opaque fallback with the same readable foreground.
One blur layer
Optional depth, stable readability
The outer panel owns the backdrop pass. A nested glass surface keeps its tint and border but automatically disables another blur operation.
data-poyraz-transparency="reduced" or data-poyraz-performance="low" on an ancestor to force the opaque fallback. Native prefers-reduced-transparency is progressively enhanced when the browser supports it.Radius and elevation
The default 8px radius stays soft without becoming pill-shaped. Larger radii are reserved for grouped panels and glass canvases.
none
0pxxs
0.375remsm
0.5remmd
0.75remlg
1remxl
1.25rem2xl
1.5remfull
9999pxTypography
A compact interface scale with explicit line-height and tracking. The scale is opt-in and does not restyle consumer headings.
caption
0.75rem / 1remModern interfaces should feel calm and precise.
bodySmall
0.875rem / 1.25remModern interfaces should feel calm and precise.
body
1rem / 1.5remModern interfaces should feel calm and precise.
title
1.25rem / 1.75remModern interfaces should feel calm and precise.
heading
1.75rem / 2.125remModern interfaces should feel calm and precise.
display
2.5rem / 2.75remModern interfaces should feel calm and precise.
Density and interaction
Default density targets desktop product interfaces while the 44px touch target remains the minimum for icon-only mobile controls. Density tokens change component geometry, never document spacing globally.
Compact
- Control
- 2rem
- Gap
- 0.375rem
Default
- Control
- 2.5rem
- Gap
- 0.625rem
Spacious
- Control
- 2.75rem
- Gap
- 0.875rem
Motion and layer policy
Motion communicates state with short enter/exit timings. Reduced-motion collapses token durations to 1ms. Named z-index layers prevent arbitrary stacking escalation.
Durations
80ms120ms180ms260ms420ms700ms1800msZ-index layers
02040506080Customization contract
Override semantic variables for product themes. Keep component source independent from raw hex values and regenerate preset.css only when changing the library's canonical source.
:root {
--poyraz-primary: oklch(58% 0.22 25);
--poyraz-surface: oklch(99% 0.01 25);
--poyraz-radius-sm: 0.625rem;
}
/* Low-power dashboards */
<main data-poyraz-performance="low">...</main>Canonical source: src/theme-tokens.json. Generated CSS guard: node scripts/generate-theme-tokens.mjs --check. Contrast guard: node scripts/check-theme-contrast.mjs.