{
  "schemaVersion": "1.0",
  "id": "evensong-statehouse",
  "version": "1.1.0",
  "name": "Evensong Statehouse",
  "tier": "free",
  "summary": "Dark-first civic UI for government services: deep violet-tinted surfaces, one luminous rose accent and a cinematic serif voice.",
  "tags": {
    "industries": [
      "government",
      "civic-tech",
      "public-services"
    ],
    "moods": [
      "nocturnal",
      "cinematic",
      "authoritative",
      "calm"
    ],
    "density": "comfortable",
    "contrast": "high"
  },
  "rationale": {
    "overview": "Evensong Statehouse serves public-sector tasks people often do after work, on a phone, in a dark room: permit renewals, benefit portals, council dashboards. Dark mode is the reference design. Pages sit on neutral.950, raised surfaces on neutral.900, and a single Rose accent marks the one primary action per view. Light mode uses the same tokens on neutral.50 and meets the same contrast targets: 4.5:1 minimum for text, 5:1 or more where practical, and 3:1 for primary and ring against background.",
    "color": "Neutrals are tinted violet at every step. Saturation is highest in the 800–950 range so dark surfaces read as midnight violet, not grey. Rose (brand) peaks in chroma at steps 400–600. Dark mode uses brand.400 (#fb6590) for primary and ring: 6.6:1 against neutral.950, with brand.950 text on top at 6.1:1. Light mode uses brand.600 (#cc2259): white text on it at 5.3:1, and 4.9:1 against neutral.50. Destructive is an orange-leaning vermilion, danger.600 #c2410c in light and danger.400 #f97a3e in dark. That puts it about 36° of hue away from Rose (ΔE2000 ≈ 24 in light, higher in dark), so a delete button cannot be mistaken for the brand action. Success (emerald) and warning (amber) follow the same warm, high-chroma curve as Rose. Success, warning and destructive always appear with an icon and a text label.",
    "typography": "Sizes follow a 1.25 (major third) ratio from a 16px base: 12 / 14 / 16 / 20 / 32 / 40 / 60. Body-lg at 18 is the one off-ratio size, kept for long-form reading. Gloock is a high-contrast display serif that ships only weight 400. It is used at display-lg (60), display-md (40) and heading-lg (32), with letterSpacing tightening from -0.015 to -0.025em as size grows. Albert Sans (400/500/600/700) sets every functional element: body-md at 16px with 1.6 line height, labels at 14/600, captions at 12/500 with +0.015em tracking. DM Mono (400/500) is reserved for typography.code: case IDs, reference numbers, table dates and code.",
    "layout": "Comfortable density on a 4px grid using space tokens 1–24. Page content is max 1120px wide and form columns max 640px. Buttons and inputs are 44px high to meet touch-target needs. Major sections are separated by space.12 (48px) to space.16 (64px). Cards use space.6 (24px) padding.",
    "elevation": "Dark-mode elevation comes from surface tint, not shadow. The page uses background (neutral.950), and card and popover use neutral.900 plus a 1px border (neutral.800). shadow.sm sits under cards. shadow.md is for menus and popovers, shadow.lg for dialogs. All three shadows are violet-black (rgba 8,4,18). Focus uses a 2px ring in the ring token (brand.400 dark, brand.500 light) with a 2px offset.",
    "shapes": "Rounding is restrained: radius.sm (2px) for tags and table cells, radius.md (6px) for buttons and inputs, radius.lg (10px) for cards, radius.xl (14px) for dialogs. radius.full is used only for status badges."
  },
  "primitives": {
    "color": {
      "brand": {
        "50": "#fff1f4",
        "100": "#ffe0e8",
        "200": "#ffc2d3",
        "300": "#ff94b2",
        "400": "#fb6590",
        "500": "#ec3a73",
        "600": "#cc2259",
        "700": "#a8174a",
        "800": "#82103a",
        "900": "#5c0a29",
        "950": "#3a0318"
      },
      "neutral": {
        "50": "#f6f4fa",
        "100": "#ebe8f2",
        "200": "#d7d3e2",
        "300": "#b9b4c9",
        "400": "#9690aa",
        "500": "#77708d",
        "600": "#5d5773",
        "700": "#474159",
        "800": "#312c42",
        "900": "#211d30",
        "950": "#130f1f"
      },
      "success": {
        "50": "#e9fcf1",
        "100": "#c9f6dc",
        "200": "#9deac0",
        "300": "#69d9a1",
        "400": "#3ec183",
        "500": "#23a269",
        "600": "#148455",
        "700": "#0f6845",
        "800": "#0c5037",
        "900": "#083a28",
        "950": "#04231a"
      },
      "warning": {
        "50": "#fff8e6",
        "100": "#ffedbd",
        "200": "#ffdb85",
        "300": "#f8c24a",
        "400": "#e5a50f",
        "500": "#c18600",
        "600": "#9d6b00",
        "700": "#7b5300",
        "800": "#5d3f00",
        "900": "#432d00",
        "950": "#2a1b00"
      },
      "danger": {
        "50": "#fff5ed",
        "100": "#ffe6d5",
        "200": "#ffc8a8",
        "300": "#ffa070",
        "400": "#f97a3e",
        "500": "#e85a1c",
        "600": "#c2410c",
        "700": "#9d330a",
        "800": "#78270a",
        "900": "#571a08",
        "950": "#3a0d02"
      }
    },
    "font": {
      "display": {
        "family": "Gloock",
        "fallback": "Georgia, serif",
        "source": "google",
        "weights": [
          400
        ]
      },
      "sans": {
        "family": "Albert Sans",
        "fallback": "system-ui, sans-serif",
        "source": "google",
        "weights": [
          400,
          500,
          600,
          700
        ]
      },
      "mono": {
        "family": "DM Mono",
        "fallback": "ui-monospace, monospace",
        "source": "google",
        "weights": [
          400,
          500
        ]
      }
    },
    "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(8, 4, 18, 0.30)",
      "md": "0 6px 18px -4px rgba(8, 4, 18, 0.45)",
      "lg": "0 24px 56px -12px rgba(8, 4, 18, 0.65)"
    }
  },
  "typography": {
    "display-lg": {
      "font": "display",
      "size": 60,
      "lineHeight": 1.05,
      "weight": 400,
      "letterSpacing": -0.025
    },
    "display-md": {
      "font": "display",
      "size": 40,
      "lineHeight": 1.1,
      "weight": 400,
      "letterSpacing": -0.02
    },
    "heading-lg": {
      "font": "display",
      "size": 32,
      "lineHeight": 1.15,
      "weight": 400,
      "letterSpacing": -0.015
    },
    "heading-md": {
      "font": "sans",
      "size": 20,
      "lineHeight": 1.3,
      "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
    },
    "body-md": {
      "font": "sans",
      "size": 16,
      "lineHeight": 1.6,
      "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.005
    },
    "caption": {
      "font": "sans",
      "size": 12,
      "lineHeight": 1.4,
      "weight": 500,
      "letterSpacing": 0.015
    },
    "code": {
      "font": "mono",
      "size": 14,
      "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.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": 600
    },
    "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": [
      "Design dark mode first. Use background (neutral.950) for the page and card/popover (neutral.900) with a 1px border (neutral.800) for raised surfaces, then verify light mode.",
      "Give exactly one button per view the primary token (for example 'Submit application'); make all other buttons secondary or ghost.",
      "Set Gloock only at display-lg (60px), display-md (40px) and heading-lg (32px), always weight 400. Set heading-md and smaller in Albert Sans.",
      "Set case numbers, reference IDs and table dates in DM Mono (typography.code, 14px) so characters align in columns.",
      "Keep buttons and inputs at 44px height and body text at body-md (16px / 1.6) or larger.",
      "Pair every success, warning and destructive color with an icon and a text label, such as a badge reading 'Approved' or 'Action needed'.",
      "Show keyboard focus as a 2px ring in the ring token with a 2px offset on every interactive element, including table row links.",
      "Reserve shadow.md for menus and popovers and shadow.lg for dialogs; cards use only shadow.sm."
    ],
    "dont": [
      "Don't use primary (Rose) for errors, deletions or destructive confirmations; use the destructive token (danger.600 light, danger.400 dark).",
      "Don't use pure black (#000000) or untinted grey for any surface; take all surfaces from the neutral ramp.",
      "Don't set Gloock below 24px, in bold, faux-italic or all caps.",
      "Don't place body text on brand.400 or lighter; luminous Rose is for buttons, links and the focus ring only.",
      "Don't apply more than one Rose glow or accent-tinted highlight per card or section.",
      "Don't set essential instructions, error messages or legal text in muted-foreground; use foreground at body-md.",
      "Don't use radius above radius.xl (14px); only badges use radius.full."
    ]
  }
}
