{
  "schemaVersion": "1.0",
  "id": "boxwood-ballast",
  "version": "1.1.0",
  "name": "Boxwood Ballast",
  "tier": "free",
  "summary": "Institutional, high-readability UI for marketing agencies: one deep green action color on true-neutral surfaces, with Newsreader for headings.",
  "tags": {
    "industries": [
      "marketing-agency",
      "professional-services",
      "agency-operations"
    ],
    "moods": [
      "institutional",
      "stable",
      "precise",
      "calm"
    ],
    "density": "comfortable",
    "contrast": "high"
  },
  "rationale": {
    "overview": "Boxwood Ballast is for agency leadership, account managers and client-facing teams. They need tools that look as dependable as the work they sell. The system relies on restraint. One deep green (brand.600 in light mode, brand.400 in dark) marks every interactive element. Zero-chroma neutral surfaces leave client work unaltered. Comfortable spacing on a 4px grid keeps long briefs and reports readable.",
    "color": "Keel (the brand ramp, hue around 150) is the only action color. It is used for primary buttons, selected states and the focus ring (ring = brand.500 light / brand.400 dark, ≥3.6:1 against background). The neutral ramp has zero chroma by design, so client brand colors shown inside the product are never shifted by the chrome around them. This is the one deliberate exception to tinting. The status ramps share the brand's cool temperature and its chroma curve, which is low at 50–100, peaks at 400–600 and recedes at 900–950. Success sits in teal (hue around 175), so a success badge never reads as a Keel button. Warning is a muted amber. Destructive is a cool crimson with a magenta cast, far from Keel in hue in both modes. Light-mode pairs: primary/white 5.4:1, destructive/white 5.6:1, success/white 7.0:1, muted-foreground/muted 7.2:1. Dark-mode pairs: primary/brand.950 6.4:1, destructive/danger.950 5.4:1, success/success.950 6.3:1, muted-foreground/muted 6.0:1.",
    "typography": "The type scale uses a major third (1.25) on a 16px base, rounded to whole pixels: heading-sm 16, heading-md 20, heading-lg 25, display-md 39, display-lg 49. display-md sits two steps (1.25²) above heading-lg so page titles separate clearly from section titles. Newsreader (500/600) is used only for heading-lg and above, where letterSpacing tightens from -0.012em to -0.022em as size grows. Public Sans (400/500/600) handles navigation, tables, forms and buttons. Its body styles use line heights of 1.55–1.65. IBM Plex Mono (400/500) is reserved for campaign IDs, UTM parameters and code snippets.",
    "layout": "Comfortable density on a 4px base grid with half-steps at 2px and 6px for icon gaps. Content columns cap at 1200px, and long-form reading blocks cap at about 72ch of body-md. Table rows are at least 44px tall so budget and performance figures can be scanned without strain.",
    "elevation": "Mostly flat and structural. Cards separate from the page with a 1px border token and shadow.sm. shadow.md is reserved for popovers and menus, and shadow.lg for dialogs. In dark mode, depth comes from surface steps instead: background is neutral.950 and card/popover are neutral.900, one step lighter.",
    "shapes": "Rounding is measured. Buttons and inputs use radius.md (8px) and cards use radius.lg (12px). radius.full is reserved for status badges, so a pill shape always means status, never action."
  },
  "primitives": {
    "color": {
      "brand": {
        "50": "#f1f8f4",
        "100": "#dcefe4",
        "200": "#b9dfc9",
        "300": "#8ccaa6",
        "400": "#5fb085",
        "500": "#3f9268",
        "600": "#2d7752",
        "700": "#22603f",
        "800": "#1a4b31",
        "900": "#123721",
        "950": "#0a2215"
      },
      "neutral": {
        "50": "#fafafa",
        "100": "#f5f5f5",
        "200": "#e5e5e5",
        "300": "#d4d4d4",
        "400": "#a3a3a3",
        "500": "#737373",
        "600": "#525252",
        "700": "#404040",
        "800": "#262626",
        "900": "#171717",
        "950": "#0a0a0a"
      },
      "success": {
        "50": "#effaf8",
        "100": "#d5f2ec",
        "200": "#ace4d9",
        "300": "#77cfc0",
        "400": "#45b3a3",
        "500": "#2a9687",
        "600": "#1f7a6f",
        "700": "#1b635b",
        "800": "#174f49",
        "900": "#123b37",
        "950": "#0a2624"
      },
      "warning": {
        "50": "#fff8e6",
        "100": "#feefc4",
        "200": "#fbe08f",
        "300": "#f2c94c",
        "400": "#d9ac2c",
        "500": "#b98a12",
        "600": "#946d0c",
        "700": "#74550a",
        "800": "#56400a",
        "900": "#3b2c08",
        "950": "#241b04"
      },
      "danger": {
        "50": "#fff1f4",
        "100": "#ffe0e7",
        "200": "#fec2cf",
        "300": "#fd94aa",
        "400": "#f0607f",
        "500": "#d93f67",
        "600": "#bd2c55",
        "700": "#9e2146",
        "800": "#7c1a37",
        "900": "#5a1229",
        "950": "#3a0a1a"
      }
    },
    "font": {
      "display": {
        "family": "Newsreader",
        "fallback": "Georgia, serif",
        "source": "google",
        "weights": [
          500,
          600
        ]
      },
      "sans": {
        "family": "Public Sans",
        "fallback": "system-ui, sans-serif",
        "source": "google",
        "weights": [
          400,
          500,
          600
        ]
      },
      "mono": {
        "family": "IBM Plex 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(0, 0, 0, 0.06)",
      "md": "0 4px 12px -2px rgba(0, 0, 0, 0.12)",
      "lg": "0 16px 40px -8px rgba(0, 0, 0, 0.20)"
    }
  },
  "typography": {
    "display-lg": {
      "font": "display",
      "size": 49,
      "lineHeight": 1.08,
      "weight": 600,
      "letterSpacing": -0.022
    },
    "display-md": {
      "font": "display",
      "size": 39,
      "lineHeight": 1.12,
      "weight": 600,
      "letterSpacing": -0.018
    },
    "heading-lg": {
      "font": "display",
      "size": 25,
      "lineHeight": 1.24,
      "weight": 500,
      "letterSpacing": -0.012
    },
    "heading-md": {
      "font": "sans",
      "size": 20,
      "lineHeight": 1.3,
      "weight": 600,
      "letterSpacing": -0.008
    },
    "heading-sm": {
      "font": "sans",
      "size": 16,
      "lineHeight": 1.4,
      "weight": 600,
      "letterSpacing": -0.002
    },
    "body-lg": {
      "font": "sans",
      "size": 18,
      "lineHeight": 1.65,
      "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.55,
      "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.012
    },
    "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.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.100}",
      "card": "{color.neutral.900}",
      "card-foreground": "{color.neutral.100}",
      "popover": "{color.neutral.900}",
      "popover-foreground": "{color.neutral.100}",
      "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.400}",
      "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": 22,
      "paddingX": "{space.2}",
      "radius": "{radius.full}",
      "typography": "{typography.caption}"
    }
  },
  "guidance": {
    "do": [
      "Use one primary button (primary / primary-foreground, 40px, radius.md) per view. Render other actions as secondary or ghost buttons at the same 40px height.",
      "Set budget and metric figures in body-sm or body-md with font-feature-settings: 'tnum', and right-align them in table columns.",
      "Use Newsreader only for heading-lg (25px) and above. Use the Public Sans styles for heading-md, heading-sm, body, label and caption.",
      "Pair every success, warning and destructive badge or alert with an icon or text label, so meaning never relies on color alone.",
      "Keep table rows at least 44px tall. On tables longer than 10 rows, stripe alternate rows with the muted token and keep row text at foreground, not muted-foreground.",
      "Show keyboard focus as a 2px ring token outline with a 2px offset on buttons, inputs and selectable rows, in both modes."
    ],
    "dont": [
      "Don't use primary for errors, negative variances or destructive confirmations. Use destructive, and confirm in a dialog with shadow.lg.",
      "Don't use success where primary is meant. The teal success ramp is for completed or positive states, never for calls to action.",
      "Don't set body text longer than two lines on the accent surface. Accent is for highlighted and selected rows only.",
      "Don't use shadow.md or shadow.lg on cards. Card separation comes from the 1px border token and shadow.sm.",
      "Don't tint the neutral ramp or build custom grays. Use neutral.50–950 so client colors displayed in the product stay unaltered.",
      "Don't set Newsreader below 24px, in all caps, or at weights other than 500 and 600."
    ]
  }
}
