Designers
Use the Figma library for components, variants, and theme modes. Prefer published public sets over internal .Base pieces.
Documentation site · interactive previews · Light/Dark theme · synced 2026-07-17
Fukurou Design System is a scalable component and token system for building consistent, accessible product experiences.
Use the Figma library for components, variants, and theme modes. Prefer published public sets over internal .Base pieces.
Map to the token tiers (Foundation → Theme → Component). Mirror Active vs Focus Visible on form controls. Do not invent missing components.
Track status, accessibility posture, and what is intentionally not in the system yet.
.Base / helper components stay nested.Live snapshot (2026-07-17): ~627 variables · 19 public component sets · WCAG audit 408 pairs · 0 non-exempt failures · brand #D33F55 / #231F20.
Foundations are the raw ingredients of the system: brand ramps, type, space, radius, elevation, density, and layout modes.
Foundation
Foundation colors are raw palette values in 1. Foundation. Ramps are generated from the brand colors: tints for 50–400, the brand value at 500, and shades for 600–900. Every swatch is a primitive variable.
Core brand anchors — do not change casually; Theme and Component tokens depend on them.
color/brand/primary/500
#D33F55
color/brand/secondary/500
#231F20
Brand · #D33F55
Brand · #231F20
UI grays · includes 0 and 1000
Warning / caution primitives
Danger / error primitives
Success primitives · 200 & 800 present
Info primitives · 200 & 800 present
Foundation ramps feed status meaning through Theme — prefer semantic tokens in product UI.
| Status | Foundation ramp | Typical base (500/600) | Use via |
|---|---|---|---|
| Success | color/green/* |
#2F9E60 |
color/status/success/* |
| Warning | color/amber/* |
#D97706 |
color/status/warning/* |
| Danger / Error | color/red/* |
#DC2626 |
color/status/danger/* |
| Info | color/blue/* |
#3F86E0 |
color/status/info/* |
Usage guidance
Theme note: In the live file, color/action/primary/* resolves to neutral black/white. Brand red accent is on color/action/tertiary/* and Progress Bar fill. Do not assume Action buttons are brand red without checking Theme.
Foundation
Lora (serif) for display and headings; Poppins (sans) for body, captions, and buttons. The library ships 18 local text styles.
Lora
Lora · SemiBold
Used for display/* and heading/* styles. Establishes brand voice and page hierarchy.
Poppins
Poppins · Regular / SemiBold
Used for body/*, caption/*, button/*, and text-button/*. Optimized for product UI readability.
Live previews using the same sample string as the Figma Foundations frame.
display/lgBuild once, theme anywhere
heading/xlBuild once, theme anywhere
heading/mdBuild once, theme anywhere
body/mdBuild once, theme anywhere
caption/mdBuild once, theme anywhere
button/mdAll 18 local text styles from the live file, grouped by role. Sizes and line heights are the published Figma values; letter spacing is 0% across the set.
Lora SemiBold — brand voice and page hierarchy.
Build once
Build once
Design with clarity
Design with clarity
Design with clarity
Design with clarity
Poppins Regular — product copy and supporting text.
Fukurou helps teams build consistent product experiences.
Fukurou helps teams build consistent product experiences.
Fukurou helps teams build consistent product experiences.
Helper text and metadata
Helper text and metadata
Poppins SemiBold — action labels; underline styles are the Text Button hover state.
Button label
Learn more
Learn more
Learn more
Learn more
Learn more
Learn more
Note: The Foundations frame labels caption/sm as “Poppins · 11 / 16”, but the published local text style resolves to 12 / 16 (same metrics as caption/md). Docs follow the published text style.
Usage guidance
Accessibility guidance
ORIGINAL case.Foundation
Inspired by the restrained depth of Vercel, the practical elevation hierarchy of Atlassian, and the tokenized component mapping approach of Polaris — adapted to Fukurou.
Use subtle shadows for everyday surfaces. Stronger shadows only for floating UI. In Dark mode, combine shadow with surface elevation color and border contrast.
Seven semantic levels in 2. Theme (elevation/*) alias the effect/shadow/* primitives in 1. Foundation; each has a matching Elevation / * effect style. Every layer is offset x 0, spread 0, colour #231F20 (brand/secondary/500).
Component tokens in 3. Component alias one semantic level each, so a component never picks a raw shadow.
| Component | Component token | Elevation |
|---|---|---|
| Card default | elevation/card/default | elevation/surface |
| Card hover | elevation/card/hover | elevation/raised |
| Card selected | elevation/card/selected | elevation/floating |
| Dropdown / Popover / Calendar | elevation/dropdown|popover|calendar/default | elevation/popover |
| Modal | elevation/modal/default | elevation/modal |
| Toast / Snackbar / Tooltip | elevation/toast|snackbar|tooltip/default | elevation/floating |
| Button / Text Field / Icon Button | elevation/button/* · elevation/text-field/* | elevation/none |
The elevation/* tokens resolve to the same shadows in Light and Dark — Figma defines no dark variants. Shadows alone are insufficient on dark surfaces, so pair them with these Theme colours.
color/surface/floating
#FFFFFF · #44403C — floating panels
color/surface/elevated
#FFFFFF · #292524 — raised surfaces
color/border/elevated
#E7E5E4 · #57534E — edge contrast
color/surface/overlay
#000 55% · #FFF 50% — scrim
Floating panel example: surface/floating fill + 1px border/elevated + elevation/floating. Toggle the theme to compare — in Dark the surface step and border carry the hierarchy while the shadow stays subtle.
Usage guidance
surface for resting cards and raised for their hover — low elevation separates surfaces without competing with content.floating for toasts, snackbars and tooltips; popover for dropdowns, popovers and the calendar.modal and overlay for temporary layers above a scrim; use them sparingly.effect/shadow/* value.surface/elevated, surface/floating and border/elevated; keep the shadow styles subtle.Accessibility: do not rely on shadow alone for interactivity or hierarchy — use focus rings, layout, and labels. Every preview above is labelled with its level name and token.
Needs verification: the docs-site chrome and several component examples still use the older --shadow-raised / --shadow-floating / --shadow-modal / --shadow-popover variables, whose values (and heavier Dark variants) predate this scale. Card already uses elevation/card/*; the rest should be reconciled component by component.
| Token family | Examples | Use |
|---|---|---|
spacing/* | 4, 8, 12, 16, 24… | Gaps, padding between layers |
radius/* | 8, 10, 12, full | Inputs, cards, pills |
border/width/* | sm, md | Control borders, focus rings |
shadow/* + elevation styles | Surface, Raised, Floating, Modal | Cards, snackbars, overlays |
2. Theme; component tokens alias through Theme.Fukurou uses a 3-tier token model so product teams can retheme without rewriting components.
Raw values: brand/neutral/status ramps, spacing, radius, shadow primitives. No product meaning.
Semantic decisions with Light/Dark: surface, text, border, action, status, elevation aliases.
Component-specific hooks such as color/button/*, color/text-field/*, color/progress-bar/*.
Supporting collections: 2. Density and 2. Layout. Collection names must stay as numbered in Figma — do not rename to Primitive/Semantic.
| Token | Light (approx.) | Role |
|---|---|---|
color/brand/primary/500 |
#D33F55 | Foundation brand primary |
color/surface/page |
#FAFAF9 | Page background |
color/text/default |
#231F20 | Primary text |
color/action/primary/default |
#000000 | Primary action fill (live Theme) |
color/action/tertiary/default |
#D33F55 | Brand accent action |
color/border/focus |
#D33F55 | Focus ring stroke |
color/progress-bar/fill/background/default |
#D33F55 | Progress fill |
Resolved export lives in scripts/tokens.json (510 colors as of last patch; live file reported 511). Prefer live Figma resolve when values matter for shipping.
Public components from the live Fukurou library. Previews below are sized and styled from live Figma measurements and Theme tokens, with simple interactions for docs exploration. Product implementations should still ship from Figma + tokens.
Not in the live Figma file: Textarea, Tabs, and Tag / Chip. Not current: Multi-Select Dropdown, Date Range Picker. Treat them as absent. Do not invent variants from older templates.
Triggers important actions. Types: Action · Secondary · Ghost. Sizes: Small (32) · Medium (40) · Large (48). Pill radius; Poppins SemiBold 14.
color/button/*. Action aliases color/action/primary/*; Secondary and Ghost alias color/action/secondary/*.:focus-visible) shows the Figma focus-ring wrapper — 2px gap (color/button/focus/gap = surface/page) plus a 2px ring (color/button/focus/ring = border/focus) outside the body. Tab any button to see it live; the “Focus (static)” examples pin it for reference.disabled attribute and 60% opacity per Figma. Exempt from contrast.Separate from Button — text-only action with no container. Sizes: Small (14/20) · Medium (16/20) · Large (18/28). Underline appears on hover only. Do not model as a Button type.
color/text-button/content/* (aliases color/action/tertiary/*). Backgrounds are transparent in every state.typography/text-button/sm|md|lg — Poppins SemiBold 600, 14/20 · 16/20 · 18/28, tracking 0. Weight never changes between states.text-button/underline/* — same SemiBold weight plus underline, colour content/hover.:focus-visible draws a 2px outside stroke (color/text-button/border/focus = border/focus) with square corners and no gap.disabled, content/disabled at 60% opacity. Exempt / Disabled state.<a> instead of <button> when the action navigates.Generic circular icon-only control — Small (32×32) only, 16px icon or 12px number. Content: Icon or Number. Always provide an accessible name.
color/icon-button/* — content action/tertiary/*, hover fill action/primary/subtle, pressed fill action/primary/default with text/inverse content.:focus-visible shows the offset ring — 2px gap (icon-button/focus/gap) plus a 2px ring (icon-button/focus/ring) outside the circle, not clipped.disabled at 60% opacity. Exempt / Disabled state.<button> with aria-label. Icons are aria-hidden.Specialized Icon Button for notifications — same 32px circle, states and focus ring, with a fixed 20px filled bell. Badge: None · Dot · Count (99+). Badge must not be the only signal of critical information.
color/icon-button/*.color/notification-button/badge/background, border, text and dot/background, dot/border. Fill is brand/primary/500 in both modes; border is surface/page.density/notification-button/dot-size 8 · badge-min-height 16 · badge-padding-x 6.caption/sm).disabled. Bell uses content/disabled; badge is unchanged; no opacity (per the Figma variant). Exempt / Disabled state.aria-label (“Notifications, 3 unread” · “Notifications, 99 plus unread”).aria-hidden.Flexible container for grouped content and actions. 340 wide, radius 12, 1px border, padding 0 on the root; content area padding 24, gap 16. Title heading/sm (Lora SemiBold 20/28), body body/md (Poppins Regular 16/24), footer holds a Small Text Button.
elevation/Surface) · Hover (elevation/Raised)Use this card to group related content and actions.
Use this card to group related content and actions.
Use this card to group related content and actions.
Use this card to group related content and actions.
color/card/background, border, title, body → surface/card, border/default, text/default, text/subtle.density/card/padding 24 · gap 16. Radius 12. Border border/width/sm.surface/subtle; icon container action/primary/subtle with a text/subtle glyph.elevation/Surface, hover elevation/Raised. Same values in Dark (Figma defines no dark alternative).<button> in the footer (keyboard focus shows the Text Button’s 2px stroke).aria-hidden.<img alt="…"> inside .fk-card__media for meaningful images, or alt="" when decorative.Single-line form input. Medium input 48 / padding 16, Small 40 / padding 12, radius 8, 1px inside stroke. Label Poppins Regular 14/20, value 16/24 (Medium) or 14/20 (Small), helper and error caption/md 12/16. Outer stack gap spacing/4; icon-to-text gap 8.
border/hover) · Active (2px border/hover + caret + 32px cancel) · Filled · Error (1px border/error, red label, warning icon + message) · Error Active (2px error + cancel) · Disabled (disabled tokens + 60% opacity)Focus Ring boolean — 2px color/border/focus ring, 2px page-coloured gap, radius 10 — not the same as Active. Use :focus-visible.Keep Active (editing chrome) separate from Focus Visible (keyboard ring). Associate error text in code.
Don’t rely on placeholder alone as a label. Don’t treat Active as sufficient keyboard focus indication.
color/text-field/background/*, border/*, text/*, label/*, helper/*, error/*, icon/*, focus/* — resolved for Light and Dark.spacing/4.:focus-visible draws one 2px ring (color/text-field/focus/ring = border/focus) outside a 2px page-coloured gap.border/hover edit state. It is not a focus substitute.aria-invalid, a warning icon, and an error message. It should not rely on colour alone.disabled, disabled tokens, and Figma 60% opacity. Exempt / Disabled state.for and id.aria-label.aria-describedby.aria-hidden); the input uses the native required attribute.Search-specific input aligned with Text Field’s Active + Focus Ring model. Always shows a search icon. Clear appears when text exists.
Select one specific calendar date (appointment, due date, birth date, start date, report date). Aligns with Text Field / Search Field / Dropdown form-control behavior. Not for date ranges — use a dedicated Date Range Picker pattern when it is available.
Focus Ring boolean (same model as Text Field)July 2026
Choose a date from the calendar.
radius/full). Hover and Selected are circular fills; Today is a 2px circular outline; Focus Visible is a 2px color/calendar/day/focus-ring outline.color/calendar/day/background/selected + inverse text (not color alone). Today keeps default text with a distinct border.Previous/Next month controls use the internal .Base / Calendar / Nav Button component (calendar-specific; visually inspired by Icon Button but not an Icon Button instance). In product code, give them accessible labels Previous month and Next month.
Use Date Picker when users need to select one specific date. Provide a visible label or accessible name. Keep the calendar popover separate from the closed trigger so layout does not reserve empty popover space.
Don’t use this for date ranges. Don’t rely on placeholder or the calendar icon as the only label. Don’t recreate Multi-Select Dropdown or Date Range Picker from older templates.
color/date-picker/*, color/calendar/*.elevation/calendar/default.density/calendar/*..Base / Calendar / Day Cell, .Base / Calendar / Nav Button.Calendar Popover.aria-hidden).Selector / Dropdown is single-select, aligned with Text Field states. Menu options use internal .Base/ Dropdown / Menu / Option. Multi-Select Dropdown is not a current component.
Mutually exclusive choices when all options should stay visible. Indicator 20×20; gap 12; label 16 / description 14.
Independent on/off selection with optional indeterminate. Indicator 20×20, radius 4.
Binary settings control. Track 44×24; thumb 20. On-track uses primary action color.
Large selectable option card. Selected styling uses success green indicator/border (#2F9E60) in live Figma.
Short temporary feedback. Tones: Neutral · Success · Warning · Danger · Info. Padding 12×16, radius 12.
Not for persistent or critical alerts — use Alert / Banner.
Persistent system messages. Meaning via text + icons (not color alone).
A new version is ready to install.
Short contextual help. Placement Top/Right/Bottom/Left with optional arrow. Keep copy short.
Blocking focused tasks. Medium default ~480 wide, padding 24, gap 16, radius 12. Escape and overlay click close in this demo.
Pagination Desktop with Size and optional jumper. Page items are 40×40 circles; prev/next use 32 Icon Buttons.
Completion across a known process. Always pair the bar with text such as Step 1 of 5 or 20% complete. Fill uses brand primary #D33F55.
color/progress-bar/*.459:2136) with Pagination.| Name | Status | Notes |
|---|---|---|
| Textarea | Not in live file | Do not recreate from old templates |
| Tabs | Not in live file | — |
| Tag / Chip | Not in live file | — |
| Multi-Select Dropdown | Removed / not current | Do not recreate |
| Date Range Picker | Not current | Separate future pattern — do not create from this Date Picker |
Fukurou targets WCAG 2.2 Level AA for token and component contrast. Latest tracked audit: 474 pairs · 0 non-exempt failures · 20 exempt disabled · 8 decorative (2026-07-26).
Keyboard focus must show a visible offset ring. Form controls that use an Active editing state still need a separate Focus Visible treatment (:focus-visible). Do not clip focus rings with parent overflow: hidden.
Details: ACCESSIBILITY_AUDIT.md · fix plan: SAFE_WCAG_FIX_PLAN.md. Do not claim a live WCAG pass unless the audit against current tokens passed.
| Kind | Examples | Guidance |
|---|---|---|
| Public sets | Button, Text Field, Progress Bar… | Publish for designers/engineers |
Internal .Base | Pagination Item, Dropdown Option, Star icon, Calendar Day Cell / Nav | Keep unpublished; nest inside public sets |
| Standalone helpers | Dropdown Menu, Modal Overlay, Cursor Line, Calendar Popover | Supporting pieces — prefer not to expose as primary library entries |
1. Foundation, 2. Theme, 2. Density, 2. Layout, 3. Component.color/{component}/…..Base.CURRENT_FIGMA_STATE.md before editing.459:2136).tokens.json may lag live color count by one.Are you sure you want to continue?