first commit
This commit is contained in:
357
design-md/sanity/DESIGN.md
Normal file
357
design-md/sanity/DESIGN.md
Normal file
@@ -0,0 +1,357 @@
|
||||
# Design System: Sanity
|
||||
|
||||
## 1. Visual Theme & Atmosphere
|
||||
|
||||
Sanity's website is a developer-content platform rendered as a nocturnal command center -- dark, precise, and deeply structured. The entire experience sits on a near-black canvas (`#0b0b0b`) that reads less like a "dark mode toggle" and more like the natural state of a tool built for people who live in terminals. Where most CMS marketing pages reach for friendly pastels and soft illustration, Sanity leans into the gravity of its own product: structured content deserves a structured stage.
|
||||
|
||||
The signature typographic voice is waldenburgNormal -- a distinctive, slightly geometric sans-serif with tight negative letter-spacing (-0.32px to -4.48px at display sizes) that gives headlines a compressed, engineered quality. At 112px hero scale with -4.48px tracking, the type feels almost machined -- like precision-cut steel letterforms. This is paired with IBM Plex Mono for code and technical labels, creating a dual-register voice: editorial authority meets developer credibility.
|
||||
|
||||
What makes Sanity distinctive is the interplay between its monochromatic dark palette and vivid, saturated accent punctuation. The neutral scale runs from pure black through a tightly controlled gray ramp (`#0b0b0b` -> `#212121` -> `#353535` -> `#797979` -> `#b9b9b9` -> `#ededed` -> `#ffffff`) with no warm or cool bias -- just pure, achromatic precision. Against this disciplined backdrop, a neon green accent (display-p3 green) and electric blue (`#0052ef`) land with the impact of signal lights in a dark control room. The orange-red CTA (`#f36458`) provides the only warm touch in an otherwise cool system.
|
||||
|
||||
**Key Characteristics:**
|
||||
- Near-black canvas (`#0b0b0b`) as the default, natural environment -- not a dark "mode" but the primary identity
|
||||
- waldenburgNormal with extreme negative tracking at display sizes, creating a precision-engineered typographic voice
|
||||
- Pure achromatic gray scale -- no warm or cool undertones, pure neutral discipline
|
||||
- Vivid accent punctuation: neon green, electric blue (`#0052ef`), and coral-red (`#f36458`) against the dark field
|
||||
- Pill-shaped primary buttons (99999px radius) contrasting with subtle rounded rectangles (3-6px) for secondary actions
|
||||
- IBM Plex Mono as the technical counterweight to the editorial display face
|
||||
- Full-bleed dark sections with content contained in measured max-width containers
|
||||
- Hover states that shift to electric blue (`#0052ef`) across all interactive elements -- a consistent "activation" signal
|
||||
|
||||
## 2. Color Palette & Roles
|
||||
|
||||
### Primary Brand
|
||||
- **Sanity Black** (`#0b0b0b`): The primary canvas and dominant surface color. Not pure black but close enough to feel absolute. The foundation of the entire visual identity.
|
||||
- **Pure Black** (`#000000`): Used for maximum-contrast moments, deep overlays, and certain border accents.
|
||||
- **Sanity Red** (`#f36458`): The primary CTA and brand accent -- a warm coral-red that serves as the main call-to-action color. Used for "Get Started" buttons and primary conversion points.
|
||||
|
||||
### Accent & Interactive
|
||||
- **Electric Blue** (`#0052ef`): The universal hover/active state color across the entire system. Buttons, links, and interactive elements all shift to this blue on hover. Also used as `--color-blue-700` for focus rings and active states.
|
||||
- **Light Blue** (`#55beff` / `#afe3ff`): Secondary blue variants used for accent backgrounds, badges, and dimmed blue surfaces.
|
||||
- **Neon Green** (`color(display-p3 .270588 1 0)`): A vivid, wide-gamut green used as `--color-fg-accent-green` for success states and premium feature highlights. Falls back to `#19d600` in sRGB.
|
||||
- **Accent Magenta** (`color(display-p3 .960784 0 1)`): A vivid wide-gamut magenta for specialized accent moments.
|
||||
|
||||
### Surface & Background
|
||||
- **Near Black** (`#0b0b0b`): Default page background and primary surface.
|
||||
- **Dark Gray** (`#212121`): Elevated surface color for cards, secondary containers, input backgrounds, and subtle layering above the base canvas.
|
||||
- **Medium Dark** (`#353535`): Tertiary surface and border color for creating depth between dark layers.
|
||||
- **Pure White** (`#ffffff`): Used for inverted sections, light-on-dark text, and specific button surfaces.
|
||||
- **Light Gray** (`#ededed`): Light surface for inverted/light sections and subtle background tints.
|
||||
|
||||
### Neutrals & Text
|
||||
- **White** (`#ffffff`): Primary text color on dark surfaces, maximum legibility.
|
||||
- **Silver** (`#b9b9b9`): Secondary text, body copy on dark surfaces, muted descriptions, and placeholder text.
|
||||
- **Medium Gray** (`#797979`): Tertiary text, metadata, timestamps, and de-emphasized content.
|
||||
- **Charcoal** (`#212121`): Text on light/inverted surfaces.
|
||||
- **Near Black Text** (`#0b0b0b`): Primary text on white/light button surfaces.
|
||||
|
||||
### Semantic
|
||||
- **Error Red** (`#dd0000`): Destructive actions, validation errors, and critical warnings -- a pure, high-saturation red.
|
||||
- **GPC Green** (`#37cd84`): Privacy/compliance indicator green.
|
||||
- **Focus Ring Blue** (`#0052ef`): Focus ring color for accessibility, matching the interactive blue.
|
||||
|
||||
### Border System
|
||||
- **Dark Border** (`#0b0b0b`): Primary border on dark containers -- barely visible, maintaining minimal containment.
|
||||
- **Subtle Border** (`#212121`): Standard border for inputs, textareas, and card edges on dark surfaces.
|
||||
- **Medium Border** (`#353535`): More visible borders for emphasized containment and dividers.
|
||||
- **Light Border** (`#ffffff`): Border on inverted/light elements or buttons needing contrast separation.
|
||||
- **Orange Border** (`color(display-p3 1 0.3333 0)`): Special accent border for highlighted/featured elements.
|
||||
|
||||
## 3. Typography Rules
|
||||
|
||||
### Font Family
|
||||
- **Display / Headline**: `waldenburgNormal`, fallback: `waldenburgNormal Fallback, ui-sans-serif, system-ui`
|
||||
- **Body / UI**: `waldenburgNormal`, fallback: `waldenburgNormal Fallback, ui-sans-serif, system-ui`
|
||||
- **Code / Technical**: `IBM Plex Mono`, fallback: `ibmPlexMono Fallback, ui-monospace`
|
||||
- **Fallback / CJK**: `Helvetica`, fallback: `Arial, Hiragino Sans GB, STXihei, Microsoft YaHei, WenQuanYi Micro Hei`
|
||||
|
||||
*Note: waldenburgNormal is a custom typeface. For external implementations, use Inter or Space Grotesk as the sans substitute (geometric, slightly condensed feel). IBM Plex Mono is available on Google Fonts.*
|
||||
|
||||
### Hierarchy
|
||||
|
||||
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|
||||
|------|------|------|--------|-------------|----------------|-------|
|
||||
| Display / Hero | waldenburgNormal | 112px (7rem) | 400 | 1.00 (tight) | -4.48px | Maximum impact, compressed tracking |
|
||||
| Hero Secondary | waldenburgNormal | 72px (4.5rem) | 400 | 1.05 (tight) | -2.88px | Large section headers |
|
||||
| Section Heading | waldenburgNormal | 48px (3rem) | 400 | 1.08 (tight) | -1.68px | Primary section anchors |
|
||||
| Heading Large | waldenburgNormal | 38px (2.38rem) | 400 | 1.10 (tight) | -1.14px | Feature section titles |
|
||||
| Heading Medium | waldenburgNormal | 32px (2rem) | 425 | 1.24 (tight) | -0.32px | Card titles, subsection headers |
|
||||
| Heading Small | waldenburgNormal | 24px (1.5rem) | 425 | 1.24 (tight) | -0.24px | Smaller feature headings |
|
||||
| Subheading | waldenburgNormal | 20px (1.25rem) | 425 | 1.13 (tight) | -0.2px | Sub-section markers |
|
||||
| Body Large | waldenburgNormal | 18px (1.13rem) | 400 | 1.50 | -0.18px | Intro paragraphs, descriptions |
|
||||
| Body | waldenburgNormal | 16px (1rem) | 400 | 1.50 | normal | Standard body text |
|
||||
| Body Small | waldenburgNormal | 15px (0.94rem) | 400 | 1.50 | -0.15px | Compact body text |
|
||||
| Caption | waldenburgNormal | 13px (0.81rem) | 400-500 | 1.30-1.50 | -0.13px | Metadata, descriptions, tags |
|
||||
| Small Caption | waldenburgNormal | 12px (0.75rem) | 400 | 1.50 | -0.12px | Footnotes, timestamps |
|
||||
| Micro / Label | waldenburgNormal | 11px (0.69rem) | 500-600 | 1.00-1.50 | normal | Uppercase labels, tiny badges |
|
||||
| Code Body | IBM Plex Mono | 15px (0.94rem) | 400 | 1.50 | normal | Code blocks, technical content |
|
||||
| Code Caption | IBM Plex Mono | 13px (0.81rem) | 400-500 | 1.30-1.50 | normal | Inline code, small technical labels |
|
||||
| Code Micro | IBM Plex Mono | 10-12px | 400 | 1.30-1.50 | normal | Tiny code labels, uppercase tags |
|
||||
|
||||
### Principles
|
||||
- **Extreme negative tracking at scale**: Display headings at 72px+ use aggressive negative letter-spacing (-2.88px to -4.48px), creating a tight, engineered quality that distinguishes Sanity from looser editorial typography.
|
||||
- **Single font, multiple registers**: waldenburgNormal handles both editorial display and functional UI text. The weight range is narrow (400-425 for most, 500-600 only for tiny labels), keeping the voice consistent.
|
||||
- **OpenType feature control**: Typography uses deliberate feature settings including `"cv01", "cv11", "cv12", "cv13", "ss07"` for display sizes and `"calt" 0` for body text, fine-tuning character alternates for different contexts.
|
||||
- **Tight headings, relaxed body**: Headings use 1.00-1.24 line-height (extremely tight), while body text breathes at 1.50. This contrast creates clear visual hierarchy.
|
||||
- **Uppercase for technical labels**: IBM Plex Mono captions and small labels frequently use `text-transform: uppercase` with tight line-heights, creating a "system readout" aesthetic for technical metadata.
|
||||
|
||||
## 4. Component Stylings
|
||||
|
||||
### Buttons
|
||||
|
||||
**Primary CTA (Pill)**
|
||||
- Background: Sanity Red (`#f36458`)
|
||||
- Text: White (`#ffffff`)
|
||||
- Padding: 8px 16px
|
||||
- Border Radius: 99999px (full pill)
|
||||
- Border: none
|
||||
- Hover: Electric Blue (`#0052ef`) background, white text
|
||||
- Font: 16px waldenburgNormal, weight 400
|
||||
|
||||
**Secondary (Dark Pill)**
|
||||
- Background: Near Black (`#0b0b0b`)
|
||||
- Text: Silver (`#b9b9b9`)
|
||||
- Padding: 8px 12px
|
||||
- Border Radius: 99999px (full pill)
|
||||
- Border: none
|
||||
- Hover: Electric Blue (`#0052ef`) background, white text
|
||||
|
||||
**Outlined (Light Pill)**
|
||||
- Background: White (`#ffffff`)
|
||||
- Text: Near Black (`#0b0b0b`)
|
||||
- Padding: 8px
|
||||
- Border Radius: 99999px (full pill)
|
||||
- Border: 1px solid `#0b0b0b`
|
||||
- Hover: Electric Blue (`#0052ef`) background, white text
|
||||
|
||||
**Ghost / Subtle**
|
||||
- Background: Dark Gray (`#212121`)
|
||||
- Text: Silver (`#b9b9b9`)
|
||||
- Padding: 0px 12px
|
||||
- Border Radius: 5px
|
||||
- Border: 1px solid `#212121`
|
||||
- Hover: Electric Blue (`#0052ef`) background, white text
|
||||
|
||||
**Uppercase Label Button**
|
||||
- Font: 11px waldenburgNormal, weight 600, uppercase
|
||||
- Background: transparent or `#212121`
|
||||
- Text: Silver (`#b9b9b9`)
|
||||
- Letter-spacing: normal
|
||||
- Used for tab-like navigation and filter controls
|
||||
|
||||
### Cards
|
||||
|
||||
**Dark Content Card**
|
||||
- Background: `#212121`
|
||||
- Border: 1px solid `#353535` or `#212121`
|
||||
- Border Radius: 6px
|
||||
- Padding: 24px
|
||||
- Text: White (`#ffffff`) for titles, Silver (`#b9b9b9`) for body
|
||||
- Hover: subtle border color shift or elevation change
|
||||
|
||||
**Feature Card (Full-bleed)**
|
||||
- Background: `#0b0b0b` or full-bleed image/gradient
|
||||
- Border: none or 1px solid `#212121`
|
||||
- Border Radius: 12px
|
||||
- Padding: 32-48px
|
||||
- Contains large imagery with overlaid text
|
||||
|
||||
### Inputs
|
||||
|
||||
**Text Input / Textarea**
|
||||
- Background: Near Black (`#0b0b0b`)
|
||||
- Text: Silver (`#b9b9b9`)
|
||||
- Border: 1px solid `#212121`
|
||||
- Padding: 8px 12px
|
||||
- Border Radius: 3px
|
||||
- Focus: outline with `var(--focus-ring-color)` (blue), 2px solid
|
||||
- Focus background: shifts to deep cyan (`#072227`)
|
||||
|
||||
**Search Input**
|
||||
- Background: `#0b0b0b`
|
||||
- Text: Silver (`#b9b9b9`)
|
||||
- Padding: 0px 12px
|
||||
- Border Radius: 3px
|
||||
- Placeholder: Medium Gray (`#797979`)
|
||||
|
||||
### Navigation
|
||||
|
||||
**Top Navigation**
|
||||
- Background: Near Black (`#0b0b0b`) with backdrop blur
|
||||
- Height: auto, compact padding
|
||||
- Logo: left-aligned, Sanity wordmark
|
||||
- Links: waldenburgNormal 16px, Silver (`#b9b9b9`)
|
||||
- Link Hover: Electric Blue via `--color-fg-accent-blue`
|
||||
- CTA Button: Sanity Red pill button right-aligned
|
||||
- Separator: 1px border-bottom `#212121`
|
||||
|
||||
**Footer**
|
||||
- Background: Near Black (`#0b0b0b`)
|
||||
- Multi-column link layout
|
||||
- Links: Silver (`#b9b9b9`), hover to blue
|
||||
- Section headers: White (`#ffffff`), 13px uppercase IBM Plex Mono
|
||||
|
||||
### Badges / Pills
|
||||
|
||||
**Neutral Subtle**
|
||||
- Background: White (`#ffffff`)
|
||||
- Text: Near Black (`#0b0b0b`)
|
||||
- Padding: 8px
|
||||
- Font: 13px
|
||||
- Border Radius: 99999px
|
||||
|
||||
**Neutral Filled**
|
||||
- Background: Near Black (`#0b0b0b`)
|
||||
- Text: White (`#ffffff`)
|
||||
- Padding: 8px
|
||||
- Font: 13px
|
||||
- Border Radius: 99999px
|
||||
|
||||
## 5. Layout Principles
|
||||
|
||||
### Spacing System
|
||||
Base unit: **8px**
|
||||
|
||||
| Token | Value | Usage |
|
||||
|-------|-------|-------|
|
||||
| space-1 | 1px | Hairline gaps, border-like spacing |
|
||||
| space-2 | 2px | Minimal internal padding |
|
||||
| space-3 | 4px | Tight component internal spacing |
|
||||
| space-4 | 6px | Small element gaps |
|
||||
| space-5 | 8px | Base unit -- button padding, input padding, badge padding |
|
||||
| space-6 | 12px | Standard component gap, button horizontal padding |
|
||||
| space-7 | 16px | Section internal padding, card spacing |
|
||||
| space-8 | 24px | Large component padding, card internal spacing |
|
||||
| space-9 | 32px | Section padding, container gutters |
|
||||
| space-10 | 48px | Large section vertical spacing |
|
||||
| space-11 | 64px | Major section breaks |
|
||||
| space-12 | 96-120px | Hero vertical padding, maximum section spacing |
|
||||
|
||||
### Grid & Container
|
||||
- Max content width: ~1440px (inferred from breakpoints)
|
||||
- Page gutter: 32px on desktop, 16px on mobile
|
||||
- Content sections use full-bleed backgrounds with centered, max-width content
|
||||
- Multi-column layouts: 2-3 columns on desktop, single column on mobile
|
||||
- Card grids: CSS Grid with consistent gaps (16-24px)
|
||||
|
||||
### Whitespace Philosophy
|
||||
Sanity uses aggressive vertical spacing between sections (64-120px) to create breathing room on the dark canvas. Within sections, spacing is tighter (16-32px), creating dense information clusters separated by generous voids. This rhythm gives the page a "slides" quality -- each section feels like its own focused frame.
|
||||
|
||||
### Border Radius Scale
|
||||
|
||||
| Token | Value | Usage |
|
||||
|-------|-------|-------|
|
||||
| radius-xs | 3px | Inputs, textareas, subtle rounding |
|
||||
| radius-sm | 4-5px | Secondary buttons, small cards, tags |
|
||||
| radius-md | 6px | Standard cards, containers |
|
||||
| radius-lg | 12px | Large cards, feature containers, forms |
|
||||
| radius-pill | 99999px | Primary buttons, badges, nav pills |
|
||||
|
||||
## 6. Depth & Elevation
|
||||
|
||||
### Shadow System
|
||||
|
||||
| Level | Value | Usage |
|
||||
|-------|-------|-------|
|
||||
| Level 0 (Flat) | none | Default state for most elements -- dark surfaces create depth through color alone |
|
||||
| Level 1 (Subtle) | 0px 0px 0px 1px `#212121` | Border-like shadow for minimal containment without visible borders |
|
||||
| Level 2 (Focus) | 0 0 0 2px `var(--color-blue-500)` | Focus ring for inputs and interactive elements |
|
||||
| Level 3 (Overlay) | Backdrop blur + semi-transparent dark | Navigation overlay, modal backgrounds |
|
||||
|
||||
### Depth Philosophy
|
||||
Sanity's depth system is almost entirely **colorimetric** rather than shadow-based. Elevation is communicated through surface color shifts: `#0b0b0b` (ground) -> `#212121` (elevated) -> `#353535` (prominent) -> `#ffffff` (inverted/highest). This approach is native to dark interfaces where traditional drop shadows would be invisible. The few shadows that exist are ring-based (0px 0px 0px Npx) or blur-based (backdrop-filter) rather than offset shadows, maintaining the flat, precision-engineered aesthetic.
|
||||
|
||||
Border-based containment (1px solid `#212121` or `#353535`) serves as the primary spatial separator, with the border darkness calibrated to be visible but not dominant. The system avoids "floating card" aesthetics -- everything feels mounted to the surface rather than hovering above it.
|
||||
|
||||
## 7. Do's and Don'ts
|
||||
|
||||
### Do
|
||||
- Use the achromatic gray scale as the foundation -- maintain pure neutral discipline with no warm/cool tinting
|
||||
- Apply Electric Blue (`#0052ef`) consistently as the universal hover/active state across all interactive elements
|
||||
- Use extreme negative letter-spacing (-2px to -4.48px) on display headings 48px and above
|
||||
- Keep primary CTAs as full-pill shapes (99999px radius) with the coral-red (`#f36458`)
|
||||
- Use IBM Plex Mono uppercase for technical labels, tags, and system metadata
|
||||
- Communicate depth through surface color (dark-to-light) rather than shadows
|
||||
- Maintain generous vertical section spacing (64-120px) on the dark canvas
|
||||
- Use `"cv01", "cv11", "cv12", "cv13", "ss07"` OpenType features for display typography
|
||||
|
||||
### Don't
|
||||
- Don't introduce warm or cool color tints to the neutral scale -- Sanity's grays are pure achromatic
|
||||
- Don't use drop shadows for elevation -- dark interfaces demand colorimetric depth
|
||||
- Don't apply border-radius between 13px and 99998px -- the system jumps from 12px (large card) directly to pill (99999px)
|
||||
- Don't mix the coral-red CTA with the electric blue interactive color in the same element
|
||||
- Don't use heavy font weights (700+) -- the system maxes out at 600 and only for 11px uppercase labels
|
||||
- Don't place light text on light surfaces or dark text on dark surfaces without checking the gray-on-gray contrast ratio
|
||||
- Don't use traditional offset box-shadows -- ring shadows (0 0 0 Npx) or border-based containment only
|
||||
- Don't break the tight line-height on headings -- 1.00-1.24 is the range, never go to 1.5+ for display text
|
||||
|
||||
## 8. Responsive Behavior
|
||||
|
||||
### Breakpoints
|
||||
|
||||
| Name | Width | Behavior |
|
||||
|------|-------|----------|
|
||||
| Desktop XL | >= 1640px | Full layout, maximum content width |
|
||||
| Desktop | >= 1440px | Standard desktop layout |
|
||||
| Desktop Compact | >= 1200px | Slightly condensed desktop |
|
||||
| Laptop | >= 1100px | Reduced column widths |
|
||||
| Tablet Landscape | >= 960px | 2-column layouts begin collapsing |
|
||||
| Tablet | >= 768px | Transition zone, some elements stack |
|
||||
| Mobile Large | >= 720px | Near-tablet layout |
|
||||
| Mobile | >= 480px | Single-column, stacked layout |
|
||||
| Mobile Small | >= 376px | Minimum supported width |
|
||||
|
||||
### Collapsing Strategy
|
||||
- **Navigation**: Horizontal links collapse to hamburger menu below 768px
|
||||
- **Hero typography**: Scales from 112px -> 72px -> 48px -> 38px across breakpoints, maintaining tight letter-spacing ratios
|
||||
- **Grid layouts**: 3-column -> 2-column at ~960px, single-column below 768px
|
||||
- **Card grids**: Horizontal scrolling on mobile instead of wrapping (preserving card aspect ratios)
|
||||
- **Section spacing**: Vertical padding reduces by ~40% on mobile (120px -> 64px -> 48px)
|
||||
- **Button sizing**: CTA pills maintain padding but reduce font size; ghost buttons stay fixed
|
||||
- **Code blocks**: Horizontal scroll with preserved monospace formatting
|
||||
|
||||
### Mobile-Specific Adjustments
|
||||
- Full-bleed sections extend edge-to-edge with 16px internal gutters
|
||||
- Touch targets: minimum 44px for all interactive elements
|
||||
- Heading letter-spacing relaxes slightly at mobile sizes (less aggressive negative tracking)
|
||||
- Image containers switch from fixed aspect ratios to full-width with auto height
|
||||
|
||||
## 9. Agent Prompt Guide
|
||||
|
||||
### Quick Color Reference
|
||||
```
|
||||
Background: #0b0b0b (near-black canvas)
|
||||
Surface: #212121 (elevated cards/containers)
|
||||
Border: #353535 (visible) / #212121 (subtle)
|
||||
Text Primary: #ffffff (white on dark)
|
||||
Text Secondary: #b9b9b9 (silver on dark)
|
||||
Text Tertiary: #797979 (medium gray)
|
||||
CTA: #f36458 (coral-red)
|
||||
Interactive: #0052ef (electric blue, all hovers)
|
||||
Success: #19d600 (green, sRGB fallback)
|
||||
Error: #dd0000 (pure red)
|
||||
Light Surface: #ededed / #ffffff (inverted sections)
|
||||
```
|
||||
|
||||
### Example Prompts
|
||||
|
||||
**Landing page section:**
|
||||
"Create a feature section with a near-black (#0b0b0b) background. Use a 48px heading in Inter with -1.68px letter-spacing, white text. Below it, 16px body text in #b9b9b9 with 1.50 line-height. Include a coral-red (#f36458) pill button with white text and a secondary dark (#0b0b0b) pill button with #b9b9b9 text. Both buttons hover to #0052ef blue."
|
||||
|
||||
**Card grid:**
|
||||
"Build a 3-column card grid on a #0b0b0b background. Each card has a #212121 surface, 1px solid #353535 border, 6px border-radius, and 24px padding. Card titles are 24px white with -0.24px letter-spacing. Body text is 13px #b9b9b9. Add a 13px IBM Plex Mono uppercase tag in #797979 at the top of each card."
|
||||
|
||||
**Form section:**
|
||||
"Design a contact form on a #0b0b0b background. Inputs have #0b0b0b background, 1px solid #212121 border, 3px border-radius, 8px 12px padding, and #b9b9b9 placeholder text. Focus state shows a 2px blue (#0052ef) ring. Submit button is a full-width coral-red (#f36458) pill. Include a 13px #797979 helper text below each field."
|
||||
|
||||
**Navigation bar:**
|
||||
"Create a sticky top navigation on #0b0b0b with backdrop blur. Left: brand text in 15px white. Center/right: nav links in 16px #b9b9b9 that hover to blue. Far right: a coral-red (#f36458) pill CTA button. Bottom border: 1px solid #212121."
|
||||
|
||||
### Iteration Guide
|
||||
1. **Start dark**: Begin with `#0b0b0b` background, `#ffffff` primary text, `#b9b9b9` secondary text
|
||||
2. **Add structure**: Use `#212121` surfaces and `#353535` borders for containment -- no shadows
|
||||
3. **Apply typography**: Inter (or Space Grotesk) with tight letter-spacing on headings, 1.50 line-height on body
|
||||
4. **Color punctuation**: Add `#f36458` for CTAs and `#0052ef` for all hover/interactive states
|
||||
5. **Refine spacing**: 8px base unit, 24-32px within sections, 64-120px between sections
|
||||
6. **Technical details**: Add IBM Plex Mono uppercase labels for tags and metadata
|
||||
7. **Polish**: Ensure all interactive elements hover to `#0052ef`, all buttons are pills or subtle 5px radius, borders are hairline (1px)
|
||||
25
design-md/sanity/README.md
Normal file
25
design-md/sanity/README.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# Sanity — Design System
|
||||
|
||||
> Design.md extracted from the public [sanity](https://sanity.dev/) website. This is not the official design system. Colors, fonts, and spacing may not be 100% accurate. But it's a good starting point for building something similar.
|
||||
|
||||
## Files
|
||||
|
||||
| File | Description |
|
||||
|------|-------------|
|
||||
| `DESIGN.md` | Complete design system documentation (9 sections) |
|
||||
| `preview.html` | Interactive design token catalog (light) |
|
||||
| `preview-dark.html` | Interactive design token catalog (dark) |
|
||||
|
||||
## Usage
|
||||
|
||||
Open `DESIGN.md` to use as a reference for AI agents (Claude, Cursor, Stitch) to generate UI that matches the Sanity design language.
|
||||
|
||||
## Preview
|
||||
|
||||
A sample landing page built with DESIGN.md. It shows the actual colors, typography, buttons, cards, spacing, and elevation, all in one page.
|
||||
|
||||
### Dark Mode
|
||||

|
||||
|
||||
### Light Mode
|
||||

|
||||
995
design-md/sanity/preview-dark.html
Normal file
995
design-md/sanity/preview-dark.html
Normal file
@@ -0,0 +1,995 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Design System Preview: Sanity (Dark)</title>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500;600&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
:root {
|
||||
/* Primary dark surfaces */
|
||||
--bg-canvas: #0b0b0b;
|
||||
--bg-surface: #212121;
|
||||
--bg-elevated: #353535;
|
||||
--bg-prominent: #797979;
|
||||
/* Brand */
|
||||
--sanity-red: #f36458;
|
||||
--sanity-red-hover: #e0544a;
|
||||
--electric-blue: #0052ef;
|
||||
--blue-300: #55beff;
|
||||
--blue-dim: #afe3ff;
|
||||
--neon-green: #19d600;
|
||||
--error-red: #dd0000;
|
||||
--accent-magenta: #e600ff;
|
||||
/* Text */
|
||||
--text-primary: #ffffff;
|
||||
--text-secondary: #b9b9b9;
|
||||
--text-tertiary: #797979;
|
||||
/* Border */
|
||||
--border-subtle: #212121;
|
||||
--border-medium: #353535;
|
||||
--border-strong: #797979;
|
||||
/* Shadow */
|
||||
--shadow-ring: 0 0 0 1px #212121;
|
||||
/* Font */
|
||||
--font-display: 'Space Grotesk', ui-sans-serif, system-ui, sans-serif;
|
||||
--font-mono: 'IBM Plex Mono', ui-monospace, monospace;
|
||||
/* Radius */
|
||||
--radius-xs: 3px;
|
||||
--radius-sm: 5px;
|
||||
--radius-md: 6px;
|
||||
--radius-lg: 12px;
|
||||
--radius-pill: 99999px;
|
||||
}
|
||||
|
||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||
|
||||
body {
|
||||
background: var(--bg-canvas);
|
||||
color: var(--text-primary);
|
||||
font-family: var(--font-display);
|
||||
font-size: 16px;
|
||||
font-weight: 400;
|
||||
line-height: 1.50;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
|
||||
/* DARK MODE BADGE */
|
||||
.dark-badge {
|
||||
position: fixed;
|
||||
top: 16px;
|
||||
right: 16px;
|
||||
z-index: 200;
|
||||
background: var(--text-primary);
|
||||
color: var(--bg-canvas);
|
||||
font-family: var(--font-mono);
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.8px;
|
||||
padding: 6px 14px;
|
||||
border-radius: var(--radius-pill);
|
||||
}
|
||||
|
||||
/* NAV */
|
||||
.nav {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 100;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 14px 32px;
|
||||
background: rgba(11, 11, 11, 0.88);
|
||||
backdrop-filter: blur(16px) saturate(180%);
|
||||
-webkit-backdrop-filter: blur(16px) saturate(180%);
|
||||
border-bottom: 1px solid var(--border-subtle);
|
||||
}
|
||||
.nav-brand {
|
||||
font-size: 15px;
|
||||
font-weight: 600;
|
||||
color: var(--text-primary);
|
||||
text-decoration: none;
|
||||
letter-spacing: -0.3px;
|
||||
}
|
||||
.nav-links { display: flex; gap: 24px; align-items: center; }
|
||||
.nav-links a {
|
||||
font-size: 14px;
|
||||
color: var(--text-secondary);
|
||||
text-decoration: none;
|
||||
font-weight: 500;
|
||||
transition: color 0.15s;
|
||||
}
|
||||
.nav-links a:hover { color: var(--electric-blue); }
|
||||
|
||||
/* HERO */
|
||||
.hero {
|
||||
background: var(--bg-canvas);
|
||||
padding: 100px 32px 96px;
|
||||
text-align: center;
|
||||
border-bottom: 1px solid var(--border-subtle);
|
||||
}
|
||||
.hero h1 {
|
||||
font-size: 80px;
|
||||
font-weight: 700;
|
||||
line-height: 1.00;
|
||||
letter-spacing: -3.6px;
|
||||
color: var(--text-primary);
|
||||
margin-bottom: 20px;
|
||||
max-width: 900px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
.hero p {
|
||||
font-size: 18px;
|
||||
color: var(--text-secondary);
|
||||
line-height: 1.50;
|
||||
letter-spacing: -0.18px;
|
||||
max-width: 560px;
|
||||
margin: 0 auto 36px;
|
||||
}
|
||||
.hero-buttons { display: flex; gap: 12px; justify-content: center; flex-wrap: wrap; }
|
||||
|
||||
/* SECTIONS */
|
||||
.section {
|
||||
padding: 80px 32px;
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.section-title {
|
||||
font-size: 38px;
|
||||
font-weight: 600;
|
||||
line-height: 1.10;
|
||||
letter-spacing: -1.14px;
|
||||
margin-bottom: 12px;
|
||||
color: var(--text-primary);
|
||||
}
|
||||
.section-subtitle {
|
||||
font-size: 16px;
|
||||
color: var(--text-secondary);
|
||||
line-height: 1.50;
|
||||
margin-bottom: 48px;
|
||||
max-width: 600px;
|
||||
}
|
||||
|
||||
/* COLOR PALETTE */
|
||||
.color-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
|
||||
gap: 16px;
|
||||
}
|
||||
.color-card {
|
||||
border-radius: var(--radius-md);
|
||||
overflow: hidden;
|
||||
border: 1px solid var(--border-subtle);
|
||||
background: var(--bg-surface);
|
||||
}
|
||||
.color-swatch {
|
||||
height: 96px;
|
||||
width: 100%;
|
||||
}
|
||||
.color-info {
|
||||
padding: 12px 14px;
|
||||
}
|
||||
.color-name {
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
letter-spacing: -0.13px;
|
||||
margin-bottom: 2px;
|
||||
color: var(--text-primary);
|
||||
}
|
||||
.color-hex {
|
||||
font-size: 12px;
|
||||
font-family: var(--font-mono);
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
.color-role {
|
||||
font-size: 11px;
|
||||
color: var(--text-tertiary);
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
/* TYPOGRAPHY */
|
||||
.type-scale { display: flex; flex-direction: column; gap: 32px; }
|
||||
.type-row {
|
||||
display: grid;
|
||||
grid-template-columns: 180px 1fr;
|
||||
gap: 24px;
|
||||
align-items: baseline;
|
||||
padding-bottom: 24px;
|
||||
border-bottom: 1px solid var(--border-subtle);
|
||||
}
|
||||
.type-meta {
|
||||
font-size: 12px;
|
||||
font-family: var(--font-mono);
|
||||
color: var(--text-secondary);
|
||||
line-height: 1.60;
|
||||
}
|
||||
.type-meta span { display: block; }
|
||||
.type-meta .label {
|
||||
font-size: 10px;
|
||||
text-transform: uppercase;
|
||||
color: var(--text-tertiary);
|
||||
letter-spacing: 0.5px;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
/* BUTTONS */
|
||||
.button-grid {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 16px;
|
||||
align-items: center;
|
||||
}
|
||||
.btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 10px 20px;
|
||||
font-family: var(--font-display);
|
||||
font-size: 15px;
|
||||
font-weight: 500;
|
||||
line-height: 1.30;
|
||||
letter-spacing: -0.15px;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
transition: all 0.18s ease;
|
||||
border: none;
|
||||
outline: none;
|
||||
}
|
||||
.btn-primary {
|
||||
background: var(--sanity-red);
|
||||
color: #ffffff;
|
||||
border-radius: var(--radius-pill);
|
||||
padding: 12px 28px;
|
||||
}
|
||||
.btn-primary:hover { background: var(--electric-blue); }
|
||||
|
||||
.btn-secondary {
|
||||
background: var(--bg-surface);
|
||||
color: var(--text-secondary);
|
||||
border-radius: var(--radius-pill);
|
||||
padding: 12px 28px;
|
||||
}
|
||||
.btn-secondary:hover { background: var(--electric-blue); color: #fff; }
|
||||
|
||||
.btn-outline {
|
||||
background: transparent;
|
||||
color: var(--text-primary);
|
||||
border: 1px solid var(--text-primary);
|
||||
border-radius: var(--radius-pill);
|
||||
padding: 11px 27px;
|
||||
}
|
||||
.btn-outline:hover { background: var(--electric-blue); color: #fff; border-color: var(--electric-blue); }
|
||||
|
||||
.btn-ghost {
|
||||
background: var(--bg-surface);
|
||||
color: var(--text-secondary);
|
||||
border-radius: var(--radius-sm);
|
||||
padding: 8px 16px;
|
||||
font-size: 13px;
|
||||
}
|
||||
.btn-ghost:hover { background: var(--electric-blue); color: #fff; }
|
||||
|
||||
.btn-label {
|
||||
background: transparent;
|
||||
color: var(--text-tertiary);
|
||||
border-radius: var(--radius-sm);
|
||||
padding: 6px 12px;
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
font-family: var(--font-mono);
|
||||
}
|
||||
.btn-label:hover { color: var(--electric-blue); }
|
||||
|
||||
.btn-sm {
|
||||
font-size: 13px;
|
||||
padding: 8px 18px;
|
||||
}
|
||||
|
||||
/* CARDS */
|
||||
.card-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
|
||||
gap: 20px;
|
||||
}
|
||||
.card {
|
||||
background: var(--bg-surface);
|
||||
border: 1px solid var(--border-medium);
|
||||
border-radius: var(--radius-md);
|
||||
padding: 28px;
|
||||
transition: border-color 0.15s;
|
||||
}
|
||||
.card:hover { border-color: var(--border-strong); }
|
||||
.card-tag {
|
||||
font-size: 11px;
|
||||
font-family: var(--font-mono);
|
||||
text-transform: uppercase;
|
||||
color: var(--text-tertiary);
|
||||
letter-spacing: 0.5px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
.card-title {
|
||||
font-size: 20px;
|
||||
font-weight: 600;
|
||||
line-height: 1.20;
|
||||
letter-spacing: -0.2px;
|
||||
margin-bottom: 8px;
|
||||
color: var(--text-primary);
|
||||
}
|
||||
.card-body {
|
||||
font-size: 14px;
|
||||
line-height: 1.55;
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
.card-link {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
color: var(--blue-300);
|
||||
text-decoration: none;
|
||||
margin-top: 16px;
|
||||
}
|
||||
.card-link:hover { text-decoration: underline; }
|
||||
|
||||
/* FORMS */
|
||||
.form-grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 20px;
|
||||
max-width: 680px;
|
||||
}
|
||||
.form-group { display: flex; flex-direction: column; gap: 6px; }
|
||||
.form-group.full-width { grid-column: 1 / -1; }
|
||||
.form-label {
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
color: var(--text-secondary);
|
||||
letter-spacing: -0.13px;
|
||||
}
|
||||
.form-input {
|
||||
font-family: var(--font-display);
|
||||
font-size: 14px;
|
||||
color: var(--text-primary);
|
||||
background: var(--bg-canvas);
|
||||
border: 1px solid var(--border-subtle);
|
||||
border-radius: var(--radius-xs);
|
||||
padding: 10px 12px;
|
||||
outline: none;
|
||||
transition: border-color 0.15s, box-shadow 0.15s;
|
||||
}
|
||||
.form-input::placeholder { color: var(--text-tertiary); }
|
||||
.form-input:focus {
|
||||
border-color: var(--electric-blue);
|
||||
box-shadow: 0 0 0 2px rgba(0, 82, 239, 0.3);
|
||||
}
|
||||
.form-textarea {
|
||||
font-family: var(--font-display);
|
||||
font-size: 14px;
|
||||
color: var(--text-primary);
|
||||
background: var(--bg-canvas);
|
||||
border: 1px solid var(--border-subtle);
|
||||
border-radius: var(--radius-xs);
|
||||
padding: 10px 12px;
|
||||
outline: none;
|
||||
resize: vertical;
|
||||
min-height: 100px;
|
||||
transition: border-color 0.15s, box-shadow 0.15s;
|
||||
}
|
||||
.form-textarea:focus {
|
||||
border-color: var(--electric-blue);
|
||||
box-shadow: 0 0 0 2px rgba(0, 82, 239, 0.3);
|
||||
}
|
||||
.form-helper {
|
||||
font-size: 12px;
|
||||
color: var(--text-tertiary);
|
||||
}
|
||||
|
||||
/* SPACING SCALE */
|
||||
.spacing-grid {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
}
|
||||
.spacing-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 16px;
|
||||
}
|
||||
.spacing-label {
|
||||
width: 80px;
|
||||
font-size: 12px;
|
||||
font-family: var(--font-mono);
|
||||
color: var(--text-secondary);
|
||||
text-align: right;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.spacing-bar {
|
||||
height: 28px;
|
||||
background: var(--sanity-red);
|
||||
border-radius: var(--radius-xs);
|
||||
opacity: 0.8;
|
||||
transition: opacity 0.15s;
|
||||
}
|
||||
.spacing-bar:hover { opacity: 1; }
|
||||
|
||||
/* RADIUS SCALE */
|
||||
.radius-grid {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 24px;
|
||||
align-items: end;
|
||||
}
|
||||
.radius-item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
.radius-box {
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
background: var(--bg-surface);
|
||||
border: 2px solid var(--text-secondary);
|
||||
}
|
||||
.radius-label {
|
||||
font-size: 12px;
|
||||
font-family: var(--font-mono);
|
||||
color: var(--text-secondary);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* ELEVATION */
|
||||
.elevation-grid {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 20px;
|
||||
align-items: start;
|
||||
}
|
||||
.elevation-item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
.elevation-box {
|
||||
width: 140px;
|
||||
height: 90px;
|
||||
border-radius: var(--radius-md);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
.elevation-label {
|
||||
font-size: 11px;
|
||||
font-family: var(--font-mono);
|
||||
color: var(--text-tertiary);
|
||||
text-align: center;
|
||||
max-width: 140px;
|
||||
}
|
||||
|
||||
/* Utility */
|
||||
.badge {
|
||||
display: inline-block;
|
||||
font-size: 11px;
|
||||
font-family: var(--font-mono);
|
||||
font-weight: 500;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
padding: 4px 10px;
|
||||
border-radius: var(--radius-pill);
|
||||
}
|
||||
.badge-subtle { background: var(--bg-surface); color: var(--text-secondary); border: 1px solid var(--border-subtle); }
|
||||
.badge-filled { background: var(--text-primary); color: var(--bg-canvas); }
|
||||
.badge-red { background: var(--sanity-red); color: #fff; }
|
||||
.badge-blue { background: var(--electric-blue); color: #fff; }
|
||||
.badge-green { background: var(--neon-green); color: #0b0b0b; }
|
||||
|
||||
.divider {
|
||||
border: none;
|
||||
border-top: 1px solid var(--border-subtle);
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.hero h1 { font-size: 42px; letter-spacing: -1.6px; }
|
||||
.hero { padding: 64px 20px 60px; }
|
||||
.section { padding: 56px 20px; }
|
||||
.section-title { font-size: 28px; letter-spacing: -0.6px; }
|
||||
.type-row { grid-template-columns: 1fr; }
|
||||
.form-grid { grid-template-columns: 1fr; }
|
||||
.card-grid { grid-template-columns: 1fr; }
|
||||
.color-grid { grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); }
|
||||
.nav-links { display: none; }
|
||||
.dark-badge { top: 12px; right: 12px; font-size: 10px; padding: 4px 10px; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- DARK MODE BADGE -->
|
||||
<div class="dark-badge">Dark Mode</div>
|
||||
|
||||
<!-- NAV -->
|
||||
<nav class="nav">
|
||||
<a href="#" class="nav-brand">awesome-design-md</a>
|
||||
<div class="nav-links">
|
||||
<a href="#colors">Colors</a>
|
||||
<a href="#typography">Typography</a>
|
||||
<a href="#buttons">Buttons</a>
|
||||
<a href="#cards">Cards</a>
|
||||
<a href="#forms">Forms</a>
|
||||
<a href="#spacing">Spacing</a>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- HERO -->
|
||||
<section class="hero">
|
||||
<h1>Design System Inspired by Sanity</h1>
|
||||
<p>Structured content meets precise design. A dark-first, engineering-grade design language built on achromatic neutrals, tight typography, and vivid accent punctuation.</p>
|
||||
<div class="hero-buttons">
|
||||
<button class="btn btn-primary">Get Started</button>
|
||||
<button class="btn btn-outline">Contact Sales</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- COLOR PALETTE -->
|
||||
<section class="section" id="colors">
|
||||
<h2 class="section-title">Color Palette</h2>
|
||||
<p class="section-subtitle">Pure achromatic gray scale with vivid accent punctuation. No warm or cool bias in the neutral range.</p>
|
||||
<div class="color-grid">
|
||||
<div class="color-card">
|
||||
<div class="color-swatch" style="background:#0b0b0b"></div>
|
||||
<div class="color-info">
|
||||
<div class="color-name">Sanity Black</div>
|
||||
<div class="color-hex">#0b0b0b</div>
|
||||
<div class="color-role">Primary canvas</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="color-card">
|
||||
<div class="color-swatch" style="background:#212121"></div>
|
||||
<div class="color-info">
|
||||
<div class="color-name">Dark Surface</div>
|
||||
<div class="color-hex">#212121</div>
|
||||
<div class="color-role">Elevated cards, containers</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="color-card">
|
||||
<div class="color-swatch" style="background:#353535"></div>
|
||||
<div class="color-info">
|
||||
<div class="color-name">Medium Border</div>
|
||||
<div class="color-hex">#353535</div>
|
||||
<div class="color-role">Visible borders, dividers</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="color-card">
|
||||
<div class="color-swatch" style="background:#797979"></div>
|
||||
<div class="color-info">
|
||||
<div class="color-name">Medium Gray</div>
|
||||
<div class="color-hex">#797979</div>
|
||||
<div class="color-role">Tertiary text, metadata</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="color-card">
|
||||
<div class="color-swatch" style="background:#b9b9b9"></div>
|
||||
<div class="color-info">
|
||||
<div class="color-name">Silver</div>
|
||||
<div class="color-hex">#b9b9b9</div>
|
||||
<div class="color-role">Secondary text</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="color-card">
|
||||
<div class="color-swatch" style="background:#ededed"></div>
|
||||
<div class="color-info">
|
||||
<div class="color-name">Light Gray</div>
|
||||
<div class="color-hex">#ededed</div>
|
||||
<div class="color-role">Light surfaces</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="color-card">
|
||||
<div class="color-swatch" style="background:#ffffff; border-bottom: 1px solid #353535;"></div>
|
||||
<div class="color-info">
|
||||
<div class="color-name">White</div>
|
||||
<div class="color-hex">#ffffff</div>
|
||||
<div class="color-role">Primary text on dark</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="color-card">
|
||||
<div class="color-swatch" style="background:#f36458"></div>
|
||||
<div class="color-info">
|
||||
<div class="color-name">Sanity Red</div>
|
||||
<div class="color-hex">#f36458</div>
|
||||
<div class="color-role">Primary CTA</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="color-card">
|
||||
<div class="color-swatch" style="background:#0052ef"></div>
|
||||
<div class="color-info">
|
||||
<div class="color-name">Electric Blue</div>
|
||||
<div class="color-hex">#0052ef</div>
|
||||
<div class="color-role">Hover/active, focus rings</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="color-card">
|
||||
<div class="color-swatch" style="background:#55beff"></div>
|
||||
<div class="color-info">
|
||||
<div class="color-name">Blue 300</div>
|
||||
<div class="color-hex">#55beff</div>
|
||||
<div class="color-role">Light blue accent</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="color-card">
|
||||
<div class="color-swatch" style="background:#19d600"></div>
|
||||
<div class="color-info">
|
||||
<div class="color-name">Neon Green</div>
|
||||
<div class="color-hex">#19d600</div>
|
||||
<div class="color-role">Success, accent green</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="color-card">
|
||||
<div class="color-swatch" style="background:#dd0000"></div>
|
||||
<div class="color-info">
|
||||
<div class="color-name">Error Red</div>
|
||||
<div class="color-hex">#dd0000</div>
|
||||
<div class="color-role">Errors, destructive</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<hr class="divider">
|
||||
|
||||
<!-- TYPOGRAPHY -->
|
||||
<section class="section" id="typography">
|
||||
<h2 class="section-title">Typography Scale</h2>
|
||||
<p class="section-subtitle">Space Grotesk (substitute for waldenburgNormal) with tight negative tracking at display sizes. IBM Plex Mono for technical labels.</p>
|
||||
<div class="type-scale">
|
||||
|
||||
<div class="type-row">
|
||||
<div class="type-meta">
|
||||
<span class="label">Display</span>
|
||||
<span>80px / 700</span>
|
||||
<span>LH: 1.00</span>
|
||||
<span>LS: -3.6px</span>
|
||||
</div>
|
||||
<div style="font-size:80px; font-weight:700; line-height:1.00; letter-spacing:-3.6px;">Structure</div>
|
||||
</div>
|
||||
|
||||
<div class="type-row">
|
||||
<div class="type-meta">
|
||||
<span class="label">Heading 1</span>
|
||||
<span>48px / 600</span>
|
||||
<span>LH: 1.08</span>
|
||||
<span>LS: -1.68px</span>
|
||||
</div>
|
||||
<div style="font-size:48px; font-weight:600; line-height:1.08; letter-spacing:-1.68px;">Powers intelligence</div>
|
||||
</div>
|
||||
|
||||
<div class="type-row">
|
||||
<div class="type-meta">
|
||||
<span class="label">Heading 2</span>
|
||||
<span>38px / 600</span>
|
||||
<span>LH: 1.10</span>
|
||||
<span>LS: -1.14px</span>
|
||||
</div>
|
||||
<div style="font-size:38px; font-weight:600; line-height:1.10; letter-spacing:-1.14px;">Content operations</div>
|
||||
</div>
|
||||
|
||||
<div class="type-row">
|
||||
<div class="type-meta">
|
||||
<span class="label">Heading 3</span>
|
||||
<span>24px / 500</span>
|
||||
<span>LH: 1.24</span>
|
||||
<span>LS: -0.24px</span>
|
||||
</div>
|
||||
<div style="font-size:24px; font-weight:500; line-height:1.24; letter-spacing:-0.24px;">Composable content platform</div>
|
||||
</div>
|
||||
|
||||
<div class="type-row">
|
||||
<div class="type-meta">
|
||||
<span class="label">Subheading</span>
|
||||
<span>20px / 500</span>
|
||||
<span>LH: 1.13</span>
|
||||
<span>LS: -0.2px</span>
|
||||
</div>
|
||||
<div style="font-size:20px; font-weight:500; line-height:1.13; letter-spacing:-0.2px;">One API, every platform</div>
|
||||
</div>
|
||||
|
||||
<div class="type-row">
|
||||
<div class="type-meta">
|
||||
<span class="label">Body Large</span>
|
||||
<span>18px / 400</span>
|
||||
<span>LH: 1.50</span>
|
||||
<span>LS: -0.18px</span>
|
||||
</div>
|
||||
<div style="font-size:18px; font-weight:400; line-height:1.50; letter-spacing:-0.18px;">Mirror how your content operations team works. Treat content as data with a structured, API-first approach.</div>
|
||||
</div>
|
||||
|
||||
<div class="type-row">
|
||||
<div class="type-meta">
|
||||
<span class="label">Body</span>
|
||||
<span>16px / 400</span>
|
||||
<span>LH: 1.50</span>
|
||||
</div>
|
||||
<div style="font-size:16px; font-weight:400; line-height:1.50;">Power anything with one unified content platform. Connect to any frontend, any channel, any device.</div>
|
||||
</div>
|
||||
|
||||
<div class="type-row">
|
||||
<div class="type-meta">
|
||||
<span class="label">Caption</span>
|
||||
<span>13px / 400</span>
|
||||
<span>LH: 1.50</span>
|
||||
<span>LS: -0.13px</span>
|
||||
</div>
|
||||
<div style="font-size:13px; font-weight:400; line-height:1.50; letter-spacing:-0.13px; color: var(--text-secondary);">Loved by 1M+ users and 6K+ teams worldwide. Enterprise-grade content infrastructure.</div>
|
||||
</div>
|
||||
|
||||
<div class="type-row">
|
||||
<div class="type-meta">
|
||||
<span class="label">Mono Label</span>
|
||||
<span>12px / 500</span>
|
||||
<span>LH: 1.50</span>
|
||||
<span>UPPERCASE</span>
|
||||
</div>
|
||||
<div style="font-size:12px; font-weight:500; line-height:1.50; text-transform:uppercase; font-family:var(--font-mono); letter-spacing:0.5px; color: var(--text-tertiary);">CONTENT LAKE · GROQ · STUDIO · SCHEMAS</div>
|
||||
</div>
|
||||
|
||||
<div class="type-row">
|
||||
<div class="type-meta">
|
||||
<span class="label">Code</span>
|
||||
<span>15px / 400</span>
|
||||
<span>LH: 1.50</span>
|
||||
<span>IBM Plex Mono</span>
|
||||
</div>
|
||||
<div style="font-size:15px; font-weight:400; line-height:1.50; font-family:var(--font-mono); color: var(--neon-green);">sanity.fetch('*[_type == "post"]')</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<hr class="divider">
|
||||
|
||||
<!-- BUTTONS -->
|
||||
<section class="section" id="buttons">
|
||||
<h2 class="section-title">Button Variants</h2>
|
||||
<p class="section-subtitle">Pill-shaped CTAs with coral-red brand color. All interactive elements hover to electric blue.</p>
|
||||
|
||||
<div style="margin-bottom: 40px;">
|
||||
<h3 style="font-size:16px; font-weight:600; margin-bottom:16px; letter-spacing:-0.16px;">Standard Buttons</h3>
|
||||
<div class="button-grid">
|
||||
<button class="btn btn-primary">Get Started</button>
|
||||
<button class="btn btn-secondary">Contact Sales</button>
|
||||
<button class="btn btn-outline">Learn More</button>
|
||||
<button class="btn btn-ghost">Filter</button>
|
||||
<button class="btn btn-label">DOCUMENTATION</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="margin-bottom: 40px;">
|
||||
<h3 style="font-size:16px; font-weight:600; margin-bottom:16px; letter-spacing:-0.16px;">Small Variants</h3>
|
||||
<div class="button-grid">
|
||||
<button class="btn btn-primary btn-sm">Get Started</button>
|
||||
<button class="btn btn-outline btn-sm">Details</button>
|
||||
<button class="btn btn-ghost btn-sm">Tag</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="margin-top: 40px;">
|
||||
<h3 style="font-size:16px; font-weight:600; margin-bottom:16px; letter-spacing:-0.16px;">Badges</h3>
|
||||
<div style="display: flex; flex-wrap: wrap; gap: 10px;">
|
||||
<span class="badge badge-subtle">Neutral</span>
|
||||
<span class="badge badge-filled">Filled</span>
|
||||
<span class="badge badge-red">New</span>
|
||||
<span class="badge badge-blue">Featured</span>
|
||||
<span class="badge badge-green">Active</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<hr class="divider">
|
||||
|
||||
<!-- CARDS -->
|
||||
<section class="section" id="cards">
|
||||
<h2 class="section-title">Card Examples</h2>
|
||||
<p class="section-subtitle">Minimal containment with border-based separation. Depth communicated through surface color shifts.</p>
|
||||
|
||||
<div class="card-grid">
|
||||
<div class="card">
|
||||
<div class="card-tag">Content Lake</div>
|
||||
<div class="card-title">Structured content as data</div>
|
||||
<div class="card-body">Store, query, and distribute content across any channel using a single source of truth with real-time collaboration.</div>
|
||||
<a href="#" class="card-link">Learn more →</a>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-tag">GROQ</div>
|
||||
<div class="card-title">Query language for content</div>
|
||||
<div class="card-body">Purpose-built query language that lets you fetch exactly the content you need, in the shape you want it.</div>
|
||||
<a href="#" class="card-link">Explore GROQ →</a>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-tag">Studio</div>
|
||||
<div class="card-title">Customizable editing environment</div>
|
||||
<div class="card-body">A fully customizable, open-source editing environment that adapts to your team's workflow and content model.</div>
|
||||
<a href="#" class="card-link">Try Studio →</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="margin-top: 40px;">
|
||||
<h3 style="font-size:16px; font-weight:600; margin-bottom:20px; letter-spacing:-0.16px;">Elevated Cards</h3>
|
||||
<div class="card-grid">
|
||||
<div style="background: var(--bg-elevated); border: 1px solid var(--border-strong); border-radius: var(--radius-md); padding: 28px;">
|
||||
<div class="card-tag" style="color: var(--text-secondary);">Schemas</div>
|
||||
<div class="card-title">Define your content model</div>
|
||||
<div class="card-body" style="color: var(--text-secondary);">Use code-first schemas to define documents, objects, and fields with full TypeScript support.</div>
|
||||
<a href="#" class="card-link">View docs →</a>
|
||||
</div>
|
||||
<div style="background: var(--bg-elevated); border: 1px solid var(--border-strong); border-radius: var(--radius-md); padding: 28px;">
|
||||
<div class="card-tag" style="color: var(--text-secondary);">Plugins</div>
|
||||
<div class="card-title">Extend with the ecosystem</div>
|
||||
<div class="card-body" style="color: var(--text-secondary);">Community-driven plugin ecosystem with dashboards, custom inputs, and workflow tools.</div>
|
||||
<a href="#" class="card-link">Browse plugins →</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<hr class="divider">
|
||||
|
||||
<!-- FORMS -->
|
||||
<section class="section" id="forms">
|
||||
<h2 class="section-title">Form Elements</h2>
|
||||
<p class="section-subtitle">Minimal inputs with subtle borders on the dark canvas. Blue focus rings for accessibility.</p>
|
||||
|
||||
<div class="form-grid">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Project Name</label>
|
||||
<input type="text" class="form-input" placeholder="my-sanity-project">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label">Dataset</label>
|
||||
<input type="text" class="form-input" placeholder="production">
|
||||
</div>
|
||||
<div class="form-group full-width">
|
||||
<label class="form-label">API Token</label>
|
||||
<input type="text" class="form-input" placeholder="sk_xxxxxxxxxxxxxxxx">
|
||||
<span class="form-helper">Keep your API token secure. Never commit it to version control.</span>
|
||||
</div>
|
||||
<div class="form-group full-width">
|
||||
<label class="form-label">GROQ Query</label>
|
||||
<textarea class="form-textarea" placeholder='*[_type == "post"]{title, slug, body}'></textarea>
|
||||
<span class="form-helper">Write a GROQ query to test against your dataset.</span>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<button class="btn btn-primary" style="width:100%;">Run Query</button>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<hr class="divider">
|
||||
|
||||
<!-- SPACING -->
|
||||
<section class="section" id="spacing">
|
||||
<h2 class="section-title">Spacing Scale</h2>
|
||||
<p class="section-subtitle">8px base unit. Spacing follows a controlled progression for consistent rhythm.</p>
|
||||
<div class="spacing-grid">
|
||||
<div class="spacing-row">
|
||||
<div class="spacing-label">4px</div>
|
||||
<div class="spacing-bar" style="width: 4px;"></div>
|
||||
</div>
|
||||
<div class="spacing-row">
|
||||
<div class="spacing-label">8px</div>
|
||||
<div class="spacing-bar" style="width: 32px;"></div>
|
||||
</div>
|
||||
<div class="spacing-row">
|
||||
<div class="spacing-label">12px</div>
|
||||
<div class="spacing-bar" style="width: 64px;"></div>
|
||||
</div>
|
||||
<div class="spacing-row">
|
||||
<div class="spacing-label">16px</div>
|
||||
<div class="spacing-bar" style="width: 96px;"></div>
|
||||
</div>
|
||||
<div class="spacing-row">
|
||||
<div class="spacing-label">24px</div>
|
||||
<div class="spacing-bar" style="width: 160px;"></div>
|
||||
</div>
|
||||
<div class="spacing-row">
|
||||
<div class="spacing-label">32px</div>
|
||||
<div class="spacing-bar" style="width: 220px;"></div>
|
||||
</div>
|
||||
<div class="spacing-row">
|
||||
<div class="spacing-label">48px</div>
|
||||
<div class="spacing-bar" style="width: 320px;"></div>
|
||||
</div>
|
||||
<div class="spacing-row">
|
||||
<div class="spacing-label">64px</div>
|
||||
<div class="spacing-bar" style="width: 420px;"></div>
|
||||
</div>
|
||||
<div class="spacing-row">
|
||||
<div class="spacing-label">96px</div>
|
||||
<div class="spacing-bar" style="width: 560px;"></div>
|
||||
</div>
|
||||
<div class="spacing-row">
|
||||
<div class="spacing-label">120px</div>
|
||||
<div class="spacing-bar" style="width: 680px;"></div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<hr class="divider">
|
||||
|
||||
<!-- BORDER RADIUS -->
|
||||
<section class="section">
|
||||
<h2 class="section-title">Border Radius Scale</h2>
|
||||
<p class="section-subtitle">Sharp geometry for inputs, subtle rounding for cards, full pills for buttons and badges.</p>
|
||||
<div class="radius-grid">
|
||||
<div class="radius-item">
|
||||
<div class="radius-box" style="border-radius: 3px;"></div>
|
||||
<div class="radius-label">3px<br><span style="font-size:10px; color:var(--text-tertiary)">Inputs</span></div>
|
||||
</div>
|
||||
<div class="radius-item">
|
||||
<div class="radius-box" style="border-radius: 5px;"></div>
|
||||
<div class="radius-label">5px<br><span style="font-size:10px; color:var(--text-tertiary)">Ghost buttons</span></div>
|
||||
</div>
|
||||
<div class="radius-item">
|
||||
<div class="radius-box" style="border-radius: 6px;"></div>
|
||||
<div class="radius-label">6px<br><span style="font-size:10px; color:var(--text-tertiary)">Cards</span></div>
|
||||
</div>
|
||||
<div class="radius-item">
|
||||
<div class="radius-box" style="border-radius: 12px;"></div>
|
||||
<div class="radius-label">12px<br><span style="font-size:10px; color:var(--text-tertiary)">Large cards</span></div>
|
||||
</div>
|
||||
<div class="radius-item">
|
||||
<div class="radius-box" style="border-radius: 99999px;"></div>
|
||||
<div class="radius-label">99999px<br><span style="font-size:10px; color:var(--text-tertiary)">Pill / CTA</span></div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<hr class="divider">
|
||||
|
||||
<!-- ELEVATION / DEPTH -->
|
||||
<section class="section">
|
||||
<h2 class="section-title">Elevation & Depth</h2>
|
||||
<p class="section-subtitle">Colorimetric depth system. Elevation is communicated through surface color shifts rather than shadows.</p>
|
||||
<div class="elevation-grid">
|
||||
<div class="elevation-item">
|
||||
<div class="elevation-box" style="background: #000000; border: 1px solid #212121;">Ground</div>
|
||||
<div class="elevation-label">#000000</div>
|
||||
</div>
|
||||
<div class="elevation-item">
|
||||
<div class="elevation-box" style="background: #0b0b0b; border: 1px solid #212121;">Canvas</div>
|
||||
<div class="elevation-label">#0b0b0b</div>
|
||||
</div>
|
||||
<div class="elevation-item">
|
||||
<div class="elevation-box" style="background: #212121; border: 1px solid #353535;">Surface</div>
|
||||
<div class="elevation-label">#212121</div>
|
||||
</div>
|
||||
<div class="elevation-item">
|
||||
<div class="elevation-box" style="background: #353535; border: 1px solid #797979;">Prominent</div>
|
||||
<div class="elevation-label">#353535</div>
|
||||
</div>
|
||||
<div class="elevation-item">
|
||||
<div class="elevation-box" style="background: #ffffff; color: #0b0b0b; border: 1px solid #ededed;">Inverted</div>
|
||||
<div class="elevation-label">#ffffff</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- FOOTER -->
|
||||
<footer style="border-top: 1px solid var(--border-subtle); padding: 48px 32px;">
|
||||
<div style="max-width: 1200px; margin: 0 auto; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 16px;">
|
||||
<span style="font-size: 13px; color: var(--text-secondary); font-family: var(--font-mono);">Design tokens extracted from sanity.io</span>
|
||||
<span style="font-size: 12px; color: var(--text-tertiary); font-family: var(--font-mono); text-transform: uppercase;">awesome-design-md</span>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
1140
design-md/sanity/preview.html
Normal file
1140
design-md/sanity/preview.html
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user