{
  "schemaVersion": "1.0",
  "id": "heliotrope-anthology",
  "version": "1.1.0",
  "name": "Heliotrope Anthology",
  "tier": "free",
  "summary": "Near-monochrome media UI with spacious layouts, a single violet accent and a violet-tinted neutral ramp for catalogue and reading screens.",
  "tags": {
    "industries": [
      "media",
      "streaming",
      "publishing"
    ],
    "moods": [
      "quiet",
      "luxurious",
      "restrained",
      "calm"
    ],
    "density": "spacious",
    "contrast": "standard"
  },
  "rationale": {
    "overview": "Heliotrope Anthology serves media products where the content leads: streaming catalogues, editorial magazines, and screening and listening apps. The system stays restrained. Roughly 90% of any screen is violet-tinted neutral (background, card, muted, border). The violet primary appears only on the one action or selection that matters in a view, such as Play, Subscribe or the active tab. Dark mode is the reference mode. Its surfaces are deep violet-black (neutral.950 #13121a, card neutral.900 #201f2b) rather than grey, so artwork and posters carry the colour.",
    "color": "brand is one violet-indigo ramp. Saturation peaks at 500–600, and both ends taper evenly, so 50–200 read as tints and 800–950 as shades with no muddy mid-steps. neutral uses the same hue at very low chroma: red sits 1–2 points above green in every step, which keeps greys from going cold blue. Status scales are shifted toward the cool brand temperature. success is a muted jade (700 #0c6c4e), not a neon emerald. warning is a dry ochre. danger is a rose-crimson about 70° away from the violet in hue, which keeps primary and destructive above ΔE 18 in both modes. Measured contrast: primary-foreground on primary is 6.8:1 light and 5.6:1 dark. primary on background is 6.2:1 light and 6.0:1 dark. muted-foreground on muted is 5.1:1 light and 7.8:1 dark. destructive-foreground on destructive is 5.3:1 light and 6.3:1 dark. ring on background is 4.4:1 light and 6.0:1 dark.",
    "typography": "Display and heading-lg use Space Grotesk at weight 500 on a 1.4 ratio (28 → 40 → 56px). Tracking tightens as size grows: -0.015em at 28px, -0.025em at 40px, -0.03em at 56px. Inter sets everything from heading-md (20px) down, on a minor-third-like body ladder (12, 14, 16, 18px). Body uses 1.6 line height at 16–18px and 1.55 at 14px. Inter's tabular figures keep runtimes, credits and prices aligned. Space Mono 400 is limited to typography.code (13px) for timecodes, catalogue IDs and technical specs.",
    "layout": "Spacious density on a 4px grid. Section gaps run from space.8 (32px) to space.24 (96px). Content columns max out at 1280px, and body copy at about 68 characters (body-md at 16px is roughly 640px). List rows are at least 56px tall, so title (heading-sm) and metadata (body-sm) sit on separate lines without crowding.",
    "elevation": "Near-flat. Cards separate from background through tonal lift: white on neutral.50 in light mode, neutral.900 on neutral.950 in dark mode. A 1px border token supports the lift. shadow.sm is for cards floating over imagery. shadow.lg is reserved for dialogs and playback overlays. All shadows are tinted rgb(24, 20, 56), so they read as violet depth, not grey smudge.",
    "shapes": "Controls use radius.md (6px) and cards use radius.lg (10px), so forms read as precise rather than playful. radius.xl (14px) is for dialogs and sheets. radius.full is limited to badges, avatars and the play button."
  },
  "primitives": {
    "color": {
      "brand": {
        "50": "#f5f4ff",
        "100": "#ebeafd",
        "200": "#d7d6fb",
        "300": "#b5b3f5",
        "400": "#8d8aee",
        "500": "#6762df",
        "600": "#4f48c5",
        "700": "#3e38a1",
        "800": "#302c7b",
        "900": "#24205a",
        "950": "#17143d"
      },
      "neutral": {
        "50": "#f8f7fc",
        "100": "#f0eff6",
        "200": "#e0dfea",
        "300": "#c6c5d4",
        "400": "#9e9db1",
        "500": "#7d7c93",
        "600": "#63627b",
        "700": "#4d4c63",
        "800": "#302f3f",
        "900": "#201f2b",
        "950": "#13121a"
      },
      "success": {
        "50": "#effbf6",
        "100": "#d6f5e8",
        "200": "#aeead2",
        "300": "#79d8b4",
        "400": "#45c193",
        "500": "#1fa577",
        "600": "#128660",
        "700": "#0c6c4e",
        "800": "#0d553f",
        "900": "#0c4534",
        "950": "#05271d"
      },
      "warning": {
        "50": "#fcf8eb",
        "100": "#f8eec9",
        "200": "#f1db90",
        "300": "#e6c259",
        "400": "#d6a82e",
        "500": "#b5860f",
        "600": "#916a0b",
        "700": "#72520c",
        "800": "#593f10",
        "900": "#41300e",
        "950": "#271d07"
      },
      "danger": {
        "50": "#fff3f5",
        "100": "#ffe4e9",
        "200": "#fecdd7",
        "300": "#fca3b5",
        "400": "#f5738e",
        "500": "#e2476a",
        "600": "#c82d50",
        "700": "#a2223e",
        "800": "#7e1b31",
        "900": "#5b1524",
        "950": "#3a0c16"
      }
    },
    "font": {
      "display": {
        "family": "Space Grotesk",
        "fallback": "system-ui, sans-serif",
        "source": "google",
        "weights": [
          500,
          600
        ]
      },
      "sans": {
        "family": "Inter",
        "fallback": "system-ui, sans-serif",
        "source": "google",
        "weights": [
          400,
          500,
          600
        ]
      },
      "mono": {
        "family": "Space Mono",
        "fallback": "ui-monospace, monospace",
        "source": "google",
        "weights": [
          400
        ]
      }
    },
    "radius": {
      "none": 0,
      "sm": 2,
      "md": 6,
      "lg": 10,
      "xl": 14,
      "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(24, 20, 56, 0.06)",
      "md": "0 6px 16px -4px rgba(24, 20, 56, 0.12)",
      "lg": "0 20px 48px -12px rgba(24, 20, 56, 0.28)"
    }
  },
  "typography": {
    "display-lg": {
      "font": "display",
      "size": 56,
      "lineHeight": 1.04,
      "weight": 500,
      "letterSpacing": -0.03
    },
    "display-md": {
      "font": "display",
      "size": 40,
      "lineHeight": 1.1,
      "weight": 500,
      "letterSpacing": -0.025
    },
    "heading-lg": {
      "font": "display",
      "size": 28,
      "lineHeight": 1.2,
      "weight": 500,
      "letterSpacing": -0.015
    },
    "heading-md": {
      "font": "sans",
      "size": 20,
      "lineHeight": 1.35,
      "weight": 600,
      "letterSpacing": -0.01
    },
    "heading-sm": {
      "font": "sans",
      "size": 16,
      "lineHeight": 1.4,
      "weight": 600,
      "letterSpacing": -0.005
    },
    "body-lg": {
      "font": "sans",
      "size": 18,
      "lineHeight": 1.6,
      "weight": 400,
      "letterSpacing": -0.005
    },
    "body-md": {
      "font": "sans",
      "size": 16,
      "lineHeight": 1.6,
      "weight": 400,
      "letterSpacing": 0
    },
    "body-sm": {
      "font": "sans",
      "size": 14,
      "lineHeight": 1.55,
      "weight": 400,
      "letterSpacing": 0
    },
    "label": {
      "font": "sans",
      "size": 14,
      "lineHeight": 1.3,
      "weight": 500,
      "letterSpacing": 0.005
    },
    "caption": {
      "font": "sans",
      "size": 12,
      "lineHeight": 1.4,
      "weight": 500,
      "letterSpacing": 0.02
    },
    "code": {
      "font": "mono",
      "size": 13,
      "lineHeight": 1.5,
      "weight": 400,
      "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.600}",
      "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": 500
    },
    "input": {
      "height": 44,
      "paddingX": "{space.4}",
      "radius": "{radius.md}",
      "typography": "{typography.body-md}",
      "borderWidth": 1
    },
    "card": {
      "padding": "{space.8}",
      "radius": "{radius.lg}",
      "shadow": "{shadow.sm}",
      "borderWidth": 1
    },
    "badge": {
      "height": 24,
      "paddingX": "{space.2}",
      "radius": "{radius.full}",
      "typography": "{typography.caption}"
    }
  },
  "guidance": {
    "do": [
      "Use the primary token (brand.600 light, brand.400 dark) for exactly one button per view, such as Play or Subscribe. Render other actions as secondary or ghost buttons.",
      "Set page titles in typography.display-lg (56px) or display-md (40px), using Space Grotesk 500 with the token's letterSpacing (-0.03em / -0.025em). Never use positive tracking on display sizes.",
      "Separate major desktop sections with space.24 (96px) or space.16 (64px). On mobile, step down to space.12 (48px).",
      "Set runtimes, prices and credit counts in Inter with font-feature-settings: 'tnum', and right-align them in list rows.",
      "Show focus as a 2px ring token with a 2px offset on every interactive element, including cards that act as links.",
      "Pair every success, warning and destructive badge or alert with an icon or text label, so status never relies on colour alone."
    ],
    "dont": [
      "Don't use primary, accent or any brand step for errors, deletions or negative states. Use destructive (danger.600 light, danger.400 dark).",
      "Don't place a second chromatic accent in a view. Poster and cover imagery is the only extra colour allowed.",
      "Don't give cards anything above shadow.sm. Separate them with card-on-background tonal lift and a 1px border instead.",
      "Don't set body text in #000000 or #ffffff. Use foreground (neutral.950 light, neutral.50 dark).",
      "Don't use Space Grotesk below 28px (heading-lg) or at weights other than 500 or 600. Use Inter from heading-md (20px) down.",
      "Don't shrink list rows below 56px, buttons and inputs below 44px, or desktop section gaps below space.12 (48px)."
    ]
  }
}
