{
  "schemaVersion": "1.0",
  "id": "sweatband-grape",
  "version": "1.1.0",
  "name": "Sweatband Grape",
  "tier": "free",
  "summary": "Retro-modern fitness UI: grape-violet actions on cream paper neutrals, with Playfair headlines that nod to 70s gym posters.",
  "tags": {
    "industries": [
      "fitness",
      "wellness",
      "sports-coaching"
    ],
    "moods": [
      "retro",
      "energetic",
      "confident",
      "warm"
    ],
    "density": "comfortable",
    "contrast": "standard"
  },
  "rationale": {
    "overview": "Sweatband Grape is for fitness apps, studio booking and workout trackers. It borrows from 70s and 80s gym posters and class schedules: cream paper (neutral.50), deep grape (brand.600) and high-contrast Playfair Display headlines. Spacing, contrast and sizing stay modern. Controls are 44px tall, body text is 16px at 1.55 line height, and every text pair clears 4.5:1 in both modes, so screens stay readable mid-workout.",
    "color": "Grape violet (brand, hue ~290) is the only action color. It is used for primary buttons, links, ring and selected states. Light primary is brand.600 (#7d3cc2) with white text, at about 6.4:1. Dark primary is brand.400 (#ae7df0) with brand.950 text, at about 5.9:1. Neutrals are tinted warm cream to espresso on purpose to set the print feel against the cool violet, and the 900/950 steps carry a faint plum undertone to tie them to the brand. Success is a slightly warm leaf green that sits next to the amber warning, so status colors share the cream palette's temperature. Destructive is a true red: danger.600 in light mode (white text, about 5.8:1) and danger.400 in dark mode. Its hue differs from the violet primary by well over ΔE 18 in both modes. Every scale darkens monotonically from 50 to 950. Dark mode is designed rather than inverted. The background is espresso neutral.950, card and popover are lifted one step to neutral.900, and muted-foreground is neutral.300 at about 9.9:1 on background.",
    "typography": "Heading sizes step by about ×1.4: 20, 28, 40, 56px (heading-md, heading-lg, display-md, display-lg). Text sizes step by 2px: 12, 14, 16, 18px. Playfair Display (600–800) carries display-lg, display-md and heading-lg only, never below 24px. Letter spacing tightens as size grows: -0.025em at 56px, -0.02em at 40px, -0.015em at 28px. Source Sans 3 (400–700) handles all UI: buttons (label, 14px/600, rendered at 700 in buttons), forms (body-md, 16px), tables (body-sm, 14px) and body copy (body-md, 1.55 line height). IBM Plex Mono (400/500) is for timers, reps, weights and IDs, set with typography.code at 14px/500, so its fixed-width figures do not shift as values change.",
    "layout": "Comfortable density on a 4px grid. Content max-width is 1120px. Buttons and inputs are 44px tall. Cards use 24px padding (space.6). Sections stack with 48px (space.12) or 64px (space.16) gaps so each block reads like a poster panel. Form fields sit 16px (space.4) apart.",
    "elevation": "Mostly flat. A 1px border token separates surfaces: neutral.200 in light mode, neutral.800 in dark mode. Cards use shadow.sm, a warm 8% shadow. shadow.md is a hard 4px offset violet-tinted shadow, a print-misregistration nod limited to one featured card or popover per screen. shadow.lg is a soft deep shadow reserved for dialogs. In dark mode, lift comes from surface steps (neutral.950 to neutral.900) rather than from shadows.",
    "shapes": "Medium radii: radius.md 8px on buttons and inputs, radius.lg 14px on cards, radius.xl 20px on dialogs and sheets, radius.full on badges and chips. Corners are rounded enough to feel friendly and retro without looking bubbly."
  },
  "primitives": {
    "color": {
      "brand": {
        "50": "#f8f3ff",
        "100": "#efe5ff",
        "200": "#dfcbff",
        "300": "#c8a6fb",
        "400": "#ae7df0",
        "500": "#9556dc",
        "600": "#7d3cc2",
        "700": "#652ea0",
        "800": "#4d2379",
        "900": "#371857",
        "950": "#220c3a"
      },
      "neutral": {
        "50": "#faf6ee",
        "100": "#f1ebe0",
        "200": "#e0d8ca",
        "300": "#c9bfaf",
        "400": "#aa9f8f",
        "500": "#8b8174",
        "600": "#706759",
        "700": "#585046",
        "800": "#403a33",
        "900": "#2c2623",
        "950": "#1b1614"
      },
      "success": {
        "50": "#f1faec",
        "100": "#ddf3d3",
        "200": "#bae6ab",
        "300": "#8fd27c",
        "400": "#62b952",
        "500": "#439d38",
        "600": "#31812a",
        "700": "#266723",
        "800": "#1c501c",
        "900": "#133914",
        "950": "#0a240b"
      },
      "warning": {
        "50": "#fff8e5",
        "100": "#ffedbd",
        "200": "#ffdb85",
        "300": "#f5c04a",
        "400": "#e0a21c",
        "500": "#bf8200",
        "600": "#9c6700",
        "700": "#7b5000",
        "800": "#5e3c00",
        "900": "#432a00",
        "950": "#281700"
      },
      "danger": {
        "50": "#fff3f2",
        "100": "#ffe2df",
        "200": "#ffc4be",
        "300": "#ff9b92",
        "400": "#f66b62",
        "500": "#e0443f",
        "600": "#c12a2c",
        "700": "#9f1f23",
        "800": "#7c1519",
        "900": "#5a0b10",
        "950": "#3a0408"
      }
    },
    "font": {
      "display": {
        "family": "Playfair Display",
        "fallback": "Georgia, serif",
        "source": "google",
        "weights": [
          600,
          700,
          800
        ]
      },
      "sans": {
        "family": "Source Sans 3",
        "fallback": "system-ui, sans-serif",
        "source": "google",
        "weights": [
          400,
          500,
          600,
          700
        ]
      },
      "mono": {
        "family": "IBM Plex Mono",
        "fallback": "ui-monospace, monospace",
        "source": "google",
        "weights": [
          400,
          500
        ]
      }
    },
    "radius": {
      "none": 0,
      "sm": 4,
      "md": 8,
      "lg": 14,
      "xl": 20,
      "full": 9999
    },
    "space": {
      "0": 0,
      "1": 4,
      "2": 8,
      "3": 12,
      "4": 16,
      "5": 20,
      "6": 24,
      "8": 32,
      "10": 40,
      "12": 48,
      "16": 64,
      "20": 80,
      "24": 96,
      "0.5": 2,
      "1.5": 6
    },
    "shadow": {
      "sm": "0 1px 2px rgba(44, 38, 35, 0.08)",
      "md": "4px 4px 0 rgba(55, 24, 87, 0.16)",
      "lg": "0 20px 44px -10px rgba(34, 12, 58, 0.32)"
    }
  },
  "typography": {
    "display-lg": {
      "font": "display",
      "size": 56,
      "lineHeight": 1.05,
      "weight": 800,
      "letterSpacing": -0.025
    },
    "display-md": {
      "font": "display",
      "size": 40,
      "lineHeight": 1.1,
      "weight": 700,
      "letterSpacing": -0.02
    },
    "heading-lg": {
      "font": "display",
      "size": 28,
      "lineHeight": 1.2,
      "weight": 700,
      "letterSpacing": -0.015
    },
    "heading-md": {
      "font": "sans",
      "size": 20,
      "lineHeight": 1.3,
      "weight": 700,
      "letterSpacing": -0.005
    },
    "heading-sm": {
      "font": "sans",
      "size": 16,
      "lineHeight": 1.4,
      "weight": 700,
      "letterSpacing": 0
    },
    "body-lg": {
      "font": "sans",
      "size": 18,
      "lineHeight": 1.6,
      "weight": 400,
      "letterSpacing": 0
    },
    "body-md": {
      "font": "sans",
      "size": 16,
      "lineHeight": 1.55,
      "weight": 400,
      "letterSpacing": 0
    },
    "body-sm": {
      "font": "sans",
      "size": 14,
      "lineHeight": 1.5,
      "weight": 400,
      "letterSpacing": 0
    },
    "label": {
      "font": "sans",
      "size": 14,
      "lineHeight": 1.25,
      "weight": 600,
      "letterSpacing": 0.01
    },
    "caption": {
      "font": "sans",
      "size": 12,
      "lineHeight": 1.4,
      "weight": 600,
      "letterSpacing": 0.04
    },
    "code": {
      "font": "mono",
      "size": 14,
      "lineHeight": 1.5,
      "weight": 500,
      "letterSpacing": 0
    }
  },
  "semantic": {
    "light": {
      "background": "{color.neutral.50}",
      "foreground": "{color.neutral.950}",
      "card": "#ffffff",
      "card-foreground": "{color.neutral.950}",
      "popover": "#ffffff",
      "popover-foreground": "{color.neutral.950}",
      "primary": "{color.brand.600}",
      "primary-foreground": "#ffffff",
      "secondary": "{color.neutral.100}",
      "secondary-foreground": "{color.neutral.900}",
      "muted": "{color.neutral.100}",
      "muted-foreground": "{color.neutral.700}",
      "accent": "{color.brand.100}",
      "accent-foreground": "{color.brand.900}",
      "destructive": "{color.danger.600}",
      "destructive-foreground": "#ffffff",
      "success": "{color.success.700}",
      "success-foreground": "#ffffff",
      "warning": "{color.warning.200}",
      "warning-foreground": "{color.warning.900}",
      "border": "{color.neutral.200}",
      "input": "{color.neutral.300}",
      "ring": "{color.brand.500}"
    },
    "dark": {
      "background": "{color.neutral.950}",
      "foreground": "{color.neutral.50}",
      "card": "{color.neutral.900}",
      "card-foreground": "{color.neutral.50}",
      "popover": "{color.neutral.900}",
      "popover-foreground": "{color.neutral.50}",
      "primary": "{color.brand.400}",
      "primary-foreground": "{color.brand.950}",
      "secondary": "{color.neutral.800}",
      "secondary-foreground": "{color.neutral.100}",
      "muted": "{color.neutral.800}",
      "muted-foreground": "{color.neutral.300}",
      "accent": "{color.brand.900}",
      "accent-foreground": "{color.brand.100}",
      "destructive": "{color.danger.400}",
      "destructive-foreground": "{color.danger.950}",
      "success": "{color.success.400}",
      "success-foreground": "{color.success.950}",
      "warning": "{color.warning.400}",
      "warning-foreground": "{color.warning.950}",
      "border": "{color.neutral.800}",
      "input": "{color.neutral.700}",
      "ring": "{color.brand.400}"
    }
  },
  "components": {
    "button": {
      "height": 44,
      "paddingX": "{space.5}",
      "radius": "{radius.md}",
      "typography": "{typography.label}",
      "fontWeight": 700
    },
    "input": {
      "height": 44,
      "paddingX": "{space.3}",
      "radius": "{radius.md}",
      "typography": "{typography.body-md}",
      "borderWidth": 1
    },
    "card": {
      "padding": "{space.6}",
      "radius": "{radius.lg}",
      "shadow": "{shadow.sm}",
      "borderWidth": 1
    },
    "badge": {
      "height": 24,
      "paddingX": "{space.2}",
      "radius": "{radius.full}",
      "typography": "{typography.caption}"
    }
  },
  "guidance": {
    "do": [
      "Use one primary button per view for the main action, such as 'Start workout' or 'Book class'. Render every other button as secondary (neutral.100 fill in light mode, neutral.800 in dark mode) or ghost.",
      "Set Playfair Display only at heading-lg (28px), display-md (40px) and display-lg (56px). Use Source Sans 3 for buttons, inputs, tables and body copy.",
      "Show timers, reps, weights and heart-rate values in IBM Plex Mono at typography.code (14px/500) or larger so digits do not shift as values update.",
      "Keep buttons and inputs at their 44px height. Give icon-only buttons a 44×44px hit area.",
      "Pair success, warning and destructive with an icon or text label in badges, alerts and form errors so status never depends on color alone.",
      "Apply shadow.md (4px hard offset) to at most one featured card or popover per screen.",
      "In light mode, place white cards on the neutral.50 background and separate them with the 1px border token (neutral.200). In dark mode, separate them by placing neutral.900 cards on the neutral.950 background.",
      "Show focus with a 2px ring token outline at a 2px offset on every interactive element. Use brand.500 in light mode and brand.400 in dark mode."
    ],
    "dont": [
      "Don't use destructive red for calls to action, streaks or energy highlights. Reserve it for delete, cancel and error states.",
      "Don't use pure black (#000), pure white text in dark mode, or cool greys. Take text, borders and surfaces from the warm neutral ramp.",
      "Don't set Playfair Display below 24px, in all caps, or in button labels, badges or table cells.",
      "Don't place more than one shadow.md element in the same viewport.",
      "Don't use brand.300 or lighter as text on neutral.50 or white. It falls below 4.5:1.",
      "Don't use neutral.500 or lighter for body or helper text on light surfaces. Use muted-foreground (neutral.700), which reaches about 6.6:1 on muted.",
      "Don't apply gradients or neon glows. The retro feel comes from flat color, serif headlines and warm paper tones."
    ]
  }
}
