{
  "schemaVersion": "1.0",
  "id": "ember-ledger",
  "version": "1.1.0",
  "name": "Ember Ledger",
  "tier": "free",
  "summary": "Warm finance UI for small-business owners: terracotta actions on paper-toned neutrals, editorial serif headlines.",
  "tags": {
    "industries": [
      "fintech",
      "accounting",
      "small-business"
    ],
    "moods": [
      "warm",
      "trustworthy",
      "editorial",
      "calm"
    ],
    "density": "comfortable",
    "contrast": "standard"
  },
  "rationale": {
    "overview": "Ember Ledger is for money tools used by non-specialists: shop owners, freelancers, family businesses. Instead of the usual cold fintech blue, it signals safety through warm, legible surfaces and one unambiguous action color. The reference is a well-kept paper ledger: ink on warm paper, one red pencil for what matters.",
    "color": "All five ramps share one structure: chroma peaks at steps 400–600 and tapers toward 50 and 950, so no mid-step turns muddy. Neutrals are tinted toward Ember's hue (warm paper to ink) at low chroma. Ember (brand) is terracotta at roughly Lab hue 45°. Danger is shifted to a raspberry crimson at about 6°, giving CIEDE2000 ΔE ≈ 22 against primary in light mode (brand.600 vs danger.600) and ≈ 21 in dark mode (brand.400 vs danger.400), so errors are never read as actions. Success is a warm olive-leaning green and warning a toasted amber, both biased toward yellow to match Ember's temperature. Light mode: white on primary (brand.600) is 5.4:1, white on destructive (danger.600) 6.1:1, white on success (success.600) 5.4:1, and muted-foreground (neutral.700) is 6.4:1 on muted. Dark mode: background is neutral.950 (#1a1613), a deep ink brown rather than black. Card (neutral.900) sits one subtle step above it. Primary is brand.400, a luminous clay that stays below neon saturation, with brand.950 text at 6.4:1.",
    "typography": "Fraunces (display, weights 500/600) carries the human voice at heading-lg (30px) and above. Instrument Sans (400/500/600) handles every functional surface: tables, forms, buttons. JetBrains Mono (400/500) is limited to IDs, account numbers and code. The scale follows a 1.25 major-third ratio from a 16px body: 20 (heading-md), 30 (heading-lg, two steps up so the sans-to-serif switch reads as a deliberate jump), 38 (display-md), 48 (display-lg). Tracking tightens with size: -0.022em at 48px, -0.018em at 38px, -0.012em at 30px. Body copy stays at 0 tracking with 1.55–1.6 line height for long reading.",
    "layout": "Comfortable density on a 4px base grid (space.1 = 4px). Content columns cap at 1200px. Controls are 40px tall, badges 24px. Table rows are at least 44px tall with space.4 (16px) horizontal cell padding, because people scan money line by line.",
    "elevation": "Mostly flat. Cards separate from the page with a 1px border token and shadow.sm only. shadow.md is for popovers, menus and toasts. shadow.lg is for dialogs and sheets. In dark mode, elevation comes from surface steps (neutral.950 for the page, neutral.900 for cards and popovers) rather than heavier shadows.",
    "shapes": "radius.md (8px) on buttons, inputs and selects. radius.lg (12px) on cards and dialogs. radius.sm (4px) on checkboxes and table selection highlights. radius.full is used only by badge."
  },
  "primitives": {
    "color": {
      "brand": {
        "50": "#fdf4f0",
        "100": "#fbe4da",
        "200": "#f6c7b5",
        "300": "#eea486",
        "400": "#e5805d",
        "500": "#cf6039",
        "600": "#b34926",
        "700": "#92391b",
        "800": "#712a11",
        "900": "#521c09",
        "950": "#351004"
      },
      "neutral": {
        "50": "#faf6f1",
        "100": "#f2ece5",
        "200": "#e2dad1",
        "300": "#c9c0b6",
        "400": "#aaa197",
        "500": "#8c8379",
        "600": "#72695f",
        "700": "#5b534a",
        "800": "#423c35",
        "900": "#2b2622",
        "950": "#1a1613"
      },
      "success": {
        "50": "#f0f8ee",
        "100": "#dcf0d7",
        "200": "#bde0b4",
        "300": "#93c98a",
        "400": "#69ad62",
        "500": "#4a9145",
        "600": "#377734",
        "700": "#2a5f29",
        "800": "#1f4a20",
        "900": "#153517",
        "950": "#0b210d"
      },
      "warning": {
        "50": "#fdf6e7",
        "100": "#fbe9c3",
        "200": "#f5d48f",
        "300": "#e8b95e",
        "400": "#d29b33",
        "500": "#b37f12",
        "600": "#936608",
        "700": "#755005",
        "800": "#583c04",
        "900": "#3d2903",
        "950": "#261902"
      },
      "danger": {
        "50": "#fdf2f5",
        "100": "#fbe1e8",
        "200": "#f6c2d0",
        "300": "#f29ab2",
        "400": "#ee6a90",
        "500": "#d94573",
        "600": "#b8235a",
        "700": "#961a49",
        "800": "#741238",
        "900": "#540a28",
        "950": "#360418"
      }
    },
    "font": {
      "display": {
        "family": "Fraunces",
        "fallback": "Georgia, serif",
        "source": "google",
        "weights": [
          500,
          600
        ]
      },
      "sans": {
        "family": "Instrument Sans",
        "fallback": "system-ui, sans-serif",
        "source": "google",
        "weights": [
          400,
          500,
          600
        ]
      },
      "mono": {
        "family": "JetBrains Mono",
        "fallback": "ui-monospace, monospace",
        "source": "google",
        "weights": [
          400,
          500
        ]
      }
    },
    "radius": {
      "none": 0,
      "sm": 4,
      "md": 8,
      "lg": 12,
      "xl": 16,
      "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(43, 38, 34, 0.06)",
      "md": "0 4px 12px -2px rgba(43, 38, 34, 0.12)",
      "lg": "0 16px 40px -8px rgba(43, 38, 34, 0.20)"
    }
  },
  "typography": {
    "display-lg": {
      "font": "display",
      "size": 48,
      "lineHeight": 1.08,
      "weight": 600,
      "letterSpacing": -0.022
    },
    "display-md": {
      "font": "display",
      "size": 38,
      "lineHeight": 1.1,
      "weight": 600,
      "letterSpacing": -0.018
    },
    "heading-lg": {
      "font": "display",
      "size": 30,
      "lineHeight": 1.2,
      "weight": 500,
      "letterSpacing": -0.012
    },
    "heading-md": {
      "font": "sans",
      "size": 20,
      "lineHeight": 1.3,
      "weight": 600,
      "letterSpacing": -0.006
    },
    "heading-sm": {
      "font": "sans",
      "size": 16,
      "lineHeight": 1.4,
      "weight": 600,
      "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": 500,
      "letterSpacing": 0.005
    },
    "caption": {
      "font": "sans",
      "size": 12,
      "lineHeight": 1.4,
      "weight": 500,
      "letterSpacing": 0.01
    },
    "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.600}",
      "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": 40,
      "paddingX": "{space.4}",
      "radius": "{radius.md}",
      "typography": "{typography.label}",
      "fontWeight": 600
    },
    "input": {
      "height": 40,
      "paddingX": "{space.3}",
      "radius": "{radius.md}",
      "typography": "{typography.body-sm}",
      "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. Render other actions as secondary (secondary / secondary-foreground) or ghost buttons.",
      "Set money values in Instrument Sans with font-feature-settings: 'tnum', and right-align them in table cells.",
      "Use Fraunces only through display-lg (48px), display-md (38px) and heading-lg (30px). Section headers use heading-md (20px Instrument Sans 600).",
      "Show focus with a 2px ring token outline and a 2px offset on every interactive element, including table rows that open a detail view.",
      "Pair every success, warning and destructive badge or alert with an icon and a text label.",
      "Keep table rows at least 44px tall. Zebra-stripe long ledgers with the muted token, and mark the selected row with accent plus accent-foreground text."
    ],
    "dont": [
      "Don't use primary (Ember) for errors, overdue states or negative balances. Use destructive, and prefix negative amounts with a minus sign, not color alone.",
      "Don't place body-md text longer than two lines on the accent surface. Accent is for selected rows and highlights.",
      "Don't apply shadow.md or shadow.lg to cards. Cards use shadow.sm plus a 1px border token.",
      "Don't use #000000 or untinted greys. Take every neutral from the neutral ramp.",
      "Don't set Fraunces below 24px, in all caps, or at weight 400.",
      "Don't place warning-foreground text on white. Warning text always sits on the warning surface (warning.200 light, warning.400 dark)."
    ]
  }
}
