🦄 Unicorn.Land ▸ docs/plans/2026-03-01-design-system-components.md
updated 2026-03-01

Unicorn.Land Component Specifications

Prompt: 1 — The Design System Architect Date: 2026-03-01 Personality: MINIMALIST x BOLD Primary emotion: Calm (with wry confidence)


Design Principles

1. Show, Don’t Decorate

Every visual element earns its place. If it doesn’t communicate information or aid navigation, remove it. Borders are used sparingly — spacing and background shifts do the work. Icons accompany text, never replace it without clear universal meaning.

2. Confident Restraint

Bold doesn’t mean loud. A single opal accent against warm stone says more than a rainbow of colors. Use weight (font-weight, shadow depth, spacing) to create hierarchy — not size alone. Let whitespace carry confidence.

3. Craft Is Felt, Not Seen

The quality is in the transitions (150ms ease-out, not 300ms linear), the focus rings (opal, not browser-default blue), the consistent 8px rhythm, the way hover states feel inevitable rather than decorated. Users feel the care without naming it.


Layout Grid

12-Column Responsive Grid

Breakpoint Min Width Columns Gutter Margin Container Max
xs 0 4 16px 16px 100%
sm 640px 4 16px 24px 640px
md 768px 8 24px 24px 768px
lg 1024px 12 24px 32px 1024px
xl 1280px 12 24px 40px 1280px
2xl 1440px 12 24px auto 1440px

Column Spans (Common Patterns)

Grid Usage Rules


Component Specifications

1. Button

The primary interactive element. Four variants, three sizes, five states.

Variants: | Variant | Background | Text | Border | Use | |---------|-----------|------|--------|-----| | Primary | --ul-accent | white | none | Primary actions (1 per view) | | Secondary | transparent | --ul-text | --ul-border | Secondary actions | | Tertiary | transparent | --ul-accent-functional | none | Inline/text actions | | Destructive | --ul-error | white | none | Delete, remove, cancel |

Sizes: | Size | Height | Padding (h) | Font | Radius | |------|--------|------------|------|--------| | Small | 32px | 12px | subhead (14px/500) | --ul-radius-md | | Default | 40px | 16px | callout (16px/500) | --ul-radius-lg | | Large | 48px | 20px | body-lg (18px/400) | --ul-radius-lg |

States: - Default: As specified - Hover: Primary darkens to --ul-accent-hover. Secondary gets --ul-bg-surface background. Transition: var(--ul-duration-fast) var(--ul-ease-default) - Active/Pressed: Scale 0.98, shadow drops to xs - Focused: --ul-focus-ring (2px gap ring in opal-600) - Disabled: Opacity 0.4, cursor not-allowed, no hover/active states

Icon support: Leading icon (left), trailing icon (right), or icon-only (square aspect ratio). Icons at 16px for small, 20px for default/large.


2. Card

Content container with consistent structure. Three variants.

Base card: - Background: --ul-bg - Border: 1px --ul-border - Radius: --ul-radius-xl (12px) - Shadow: --ul-shadow-sm - Padding: --ul-space-6 (24px)

Variants: | Variant | Differences | |---------|------------| | Default | As base. For content sections, settings panels. | | Elevated | Shadow --ul-shadow-md, no border. For primary content, featured items. | | Interactive | Hover: shadow lifts to --ul-shadow-md, translateY(-1px). Cursor pointer. For clickable cards (product cards, nav cards). Transition: var(--ul-duration-fast) var(--ul-ease-default) |

Slots: - Header (optional): title + subtitle + action area. Title in title type (22px/500), subtitle in subhead type, secondary color. - Body: any content - Footer (optional): separated by 1px border-top --ul-border, padding-top --ul-space-4


3. Input (Text Field)

Structure: - Label: subhead type (14px/500), --ul-text, margin-bottom --ul-space-1-5 - Input: height 40px, padding 12px horizontal, body type (16px/400) - Helper text: caption type (12px/400), --ul-text-muted, margin-top --ul-space-1

States: | State | Border | Background | |-------|--------|-----------| | Default | --ul-border | --ul-bg | | Hover | --ul-stone-300 | --ul-bg | | Focused | --ul-accent-functional (2px) | --ul-bg | | Error | --ul-error | --ul-bg | | Disabled | --ul-border (0.5 opacity) | --ul-bg-surface |

Variants: Text input, Textarea (min-height 96px, resize vertical), Select (with chevron-down icon right-aligned)


4. Badge

Small status indicators and labels.

Sizes: | Size | Height | Padding (h) | Font | |------|--------|------------|------| | Small | 20px | 6px | caption (12px/400) | | Default | 24px | 8px | footnote (13px/500) |

Variants: | Variant | Background | Text | |---------|-----------|------| | Default | --ul-stone-100 | --ul-text-secondary | | Accent | --ul-opal-50 | --ul-opal-700 | | Success | #f0fdf4 | #15803d | | Warning | #fefce8 | #a16207 | | Error | #fef2f2 | #b91c1c |


5. Navigation (Header)

Top navigation bar for portfolio site and sub-products.

Structure: - Height: 64px - Background: --ul-bg with backdrop-filter: blur(12px) and 80% opacity for scroll-sticky - Border-bottom: 1px --ul-border - Padding: 0 --ul-grid-margin - Z-index: --ul-z-sticky - Position: sticky, top 0

Slots: - Left: Logo (wordmark or dot, height 24px) - Center: Nav links (desktop) — subhead type, --ul-text-secondary, hover --ul-text, active --ul-text with 2px bottom border in --ul-accent - Right: Action area (CTA button, theme toggle, etc.)

Mobile (< md): Hamburger menu icon (right), nav links in dropdown panel (full-width, slides down). Panel: --ul-bg, shadow --ul-shadow-lg, padding --ul-space-4.


6. Alert / Toast

Feedback messages. Four semantic variants.

Alert (inline): - Padding: --ul-space-4 - Radius: --ul-radius-lg - Left border: 3px in semantic color - Icon: 20px, semantic color, left-aligned - Title (optional): callout type - Message: body type

Variant Left Border Icon Color Background
Info --ul-info --ul-info --ul-opal-50
Success --ul-success --ul-success #f0fdf4
Warning --ul-warning --ul-warning #fefce8
Error --ul-error --ul-error #fef2f2

Toast (floating): - Position: fixed, bottom-right (bottom --ul-space-6, right --ul-space-6) - Max-width: 400px - Shadow: --ul-shadow-lg - Radius: --ul-radius-xl - Enter: slide up + fade in, var(--ul-duration-normal) var(--ul-ease-out) - Exit: fade out, var(--ul-duration-fast) var(--ul-ease-in) - Auto-dismiss: 5 seconds (configurable) - Z-index: --ul-z-toast


7. Modal / Dialog

Overlay content container for focused interactions.

Overlay: Background rgba(28, 25, 23, 0.5), z-index --ul-z-overlay Dialog: z-index --ul-z-modal

Structure: - Max-width: 480px (small), 640px (default), 800px (large) - Background: --ul-bg - Shadow: --ul-shadow-xl - Radius: --ul-radius-xl - Padding: --ul-space-6

Slots: - Header: Title (title type) + optional close button (icon-only, top-right) - Body: scrollable content area - Footer: right-aligned button group (secondary + primary pattern)

Animation: - Enter: scale from 0.95 + fade in, var(--ul-duration-normal) var(--ul-ease-out) - Exit: fade out, var(--ul-duration-fast) var(--ul-ease-in) - Overlay: fade in var(--ul-duration-normal)

Accessibility: Focus trap. Escape to close. role="dialog", aria-modal="true", aria-labelledby points to title.


8. Toggle / Switch

Binary on/off control.

Dimensions: - Track: 44px wide x 24px tall, radius full - Thumb: 20px circle, 2px inset from track edge

States: | State | Track | Thumb | |-------|-------|-------| | Off | --ul-stone-300 | white | | On | --ul-accent | white | | Hover (off) | --ul-stone-400 | white | | Hover (on) | --ul-accent-hover | white | | Focused | + --ul-focus-ring | — | | Disabled | opacity 0.4 | — |


9. Divider

Horizontal or vertical separator.


10. Avatar

User or product representation.

Sizes: | Size | Dimensions | Font | |------|-----------|------| | XS | 24px | caption | | SM | 32px | footnote | | MD | 40px | body | | LG | 56px | title | | XL | 80px | headline |


11. Tooltip

Contextual information on hover/focus.


12. Skeleton / Loading

Placeholder while content loads.


13. Tab Group

Horizontal tab navigation for sectioned content.

Tab bar: - Border-bottom: 1px --ul-border - Gap: --ul-space-1 between tabs

Tab item: - Padding: --ul-space-2 --ul-space-4 - Font: callout type (16px/500) - Default: --ul-text-secondary - Hover: --ul-text - Active: --ul-text, 2px bottom border --ul-accent - Focused: --ul-focus-ring - Transition: color and border var(--ul-duration-fast) var(--ul-ease-default)

Tab panel: padding-top --ul-space-6

role="tablist", role="tab", role="tabpanel". Arrow keys navigate between tabs.


14. Dropdown Menu

Triggered menu with action items.

Trigger: any element (button, avatar, icon-button)

Menu panel: - Background: --ul-bg - Border: 1px --ul-border - Shadow: --ul-shadow-lg - Radius: --ul-radius-xl - Padding: --ul-space-1 vertical - Min-width: 180px - Z-index: --ul-z-dropdown - Enter: scale from 0.95 + fade in from trigger direction, var(--ul-duration-fast) var(--ul-ease-out)

Menu item: - Padding: --ul-space-2 --ul-space-3 - Font: body type - Default: --ul-text - Hover: --ul-bg-surface background - Focused: --ul-bg-surface background + --ul-focus-ring-inset - Destructive: --ul-error text color - Disabled: --ul-text-muted, no hover

Separator: 1px --ul-border, margin --ul-space-1 vertical

Arrow keys navigate. Enter/Space selects. Escape closes.


15. Checkbox

Selection control for multiple options.

Box: 18px square, radius --ul-radius-sm, border 1.5px

States: | State | Border | Background | Check | |-------|--------|-----------|-------| | Unchecked | --ul-stone-300 | --ul-bg | none | | Checked | --ul-accent | --ul-accent | white checkmark (2px stroke) | | Indeterminate | --ul-accent | --ul-accent | white dash | | Hover (unchecked) | --ul-stone-400 | --ul-bg | none | | Focused | + --ul-focus-ring | — | — | | Disabled | --ul-stone-200 | --ul-bg-surface | --ul-stone-300 |


16. Radio

Selection control for single choice from a group.

Circle: 18px, border 1.5px, radius full

States: Same pattern as Checkbox, but: - Selected: inner filled circle (8px) in white on --ul-accent background - Animation: inner circle scales in with var(--ul-duration-instant) var(--ul-ease-spring)


17. Progress Bar

Determinate progress indicator.

Track: height 6px (small) or 8px (default), --ul-stone-200, radius full Fill: --ul-accent, radius full, min-width 4px - Transition: width var(--ul-duration-normal) var(--ul-ease-default) - Optional label: percentage or fraction, footnote type, above or right

Indeterminate variant: Fill is 30% width, animates left-to-right continuously, 1.5s infinite

role="progressbar", aria-valuenow, aria-valuemin, aria-valuemax


18. Code Block

Monospace content display.


Page Templates

Landing Page

Dashboard

Settings

Profile


Do’s and Don’ts

1. Color

2. Typography

3. Spacing

4. Buttons

5. Cards

6. Focus States

7. Motion

8. Dark Mode

9. Icons

10. Accessibility