{
  "schemaVersion": "1.0",
  "id": "greenhouse-catalogue",
  "version": "1.1.0",
  "name": "Greenhouse Catalogue",
  "tier": "free",
  "summary": "Magazine-style storefront system: oversized Sora headlines, ink-on-paper neutrals and a single garden-green action color.",
  "tags": {
    "industries": [
      "e-commerce",
      "retail",
      "publishing"
    ],
    "moods": [
      "editorial",
      "refined",
      "calm",
      "spacious"
    ],
    "density": "spacious",
    "contrast": "standard"
  },
  "rationale": {
    "overview": "Greenhouse Catalogue is for online shops that should read like a printed magazine. Product pages are stories, collection pages are spreads, and checkout is the quiet last page. Hierarchy comes from a 64px display headline against 16px body text, wide margins and one green action color (primary). Every other surface is warm paper and ink, so photography and copy carry the page.",
    "color": "Neutrals are warm paper to ink (hue ~45, low chroma). neutral.50 #faf8f3 is the page and neutral.950 #181714 is the text, so nothing renders as cool grey. Brand green (hue ~150) is the only chromatic accent. Use it for primary, ring, links and accent fills. Success is a bluer teal (hue ~170) so confirmations never read as a call to action. Destructive is a crimson (hue ~345), far from green in both modes. The warning ramp was re-curved so chroma rises smoothly to 400–500 instead of jumping, which removes the muddy 300 step. Light contrast: primary-foreground on primary is 5.1:1, destructive-foreground on destructive 5.6:1, muted-foreground on muted 6.6:1, and primary on background 4.8:1. Dark contrast: primary-foreground on primary is 6.7:1, destructive 6.3:1, warning 6.9:1, and muted-foreground on muted 6.2:1.",
    "typography": "The scale is a major third (1.25) from a 16px base, rounded to the 4px grid: 16, 20, 24, 32, 48, 64. The 39px step is skipped on purpose, so the display sizes jump hard like a masthead. 18px (body-lg) is a half-step for lead paragraphs. Sora (600/700) is used only at 32px and above: display-lg, display-md and heading-lg. Its tracking tightens from -0.02em at 32px to -0.035em at 64px. Plus Jakarta Sans (400–700) sets heading-md and below, body, labels, forms and prices. Body line heights land on the grid: 16/26, 18/28 and 14/22. JetBrains Mono (400/500) is only for SKUs, order numbers and codes.",
    "layout": "Spacious density on a 4px grid. Section gaps are {space.16}–{space.24} (64–96px), and card padding is {space.8} (32px). Use a 12-column grid with a 1200px max content width. Long-form editorial copy sits in a 640px column. Hero headlines leave one empty column beside them.",
    "elevation": "Print is flat, so the system is too. Cards separate from the page with a 1px border and whitespace. Their shadow.sm is a 5% ink tint and is barely visible. shadow.md is for menus and popovers. shadow.lg is for dialogs and the sticky cart drawer. In dark mode, depth comes from surface steps rather than shadows: background #181714, card #211f1b, then popover and muted at neutral.900 and neutral.800.",
    "shapes": "Radii are small, like trimmed paper: {radius.md} 4px on buttons and inputs, {radius.lg} 6px on cards. {radius.full} is only for badges and avatars. Product imagery is never rounded beyond 6px."
  },
  "primitives": {
    "color": {
      "brand": {
        "50": "#effaf3",
        "100": "#d8f3e2",
        "200": "#b3e6c8",
        "300": "#82d3a8",
        "400": "#4fb983",
        "500": "#2a9d68",
        "600": "#1b7d52",
        "700": "#176343",
        "800": "#154f37",
        "900": "#123f2d",
        "950": "#07241a"
      },
      "neutral": {
        "50": "#faf8f3",
        "100": "#f1eee6",
        "200": "#e1ddd2",
        "300": "#c9c4b7",
        "400": "#a9a395",
        "500": "#8a8477",
        "600": "#6f695d",
        "700": "#58534a",
        "800": "#413d36",
        "900": "#2b2824",
        "950": "#181714"
      },
      "success": {
        "50": "#e6faf6",
        "100": "#c8f3ea",
        "200": "#9ae4d5",
        "300": "#65cdbb",
        "400": "#3cb2a0",
        "500": "#1f9585",
        "600": "#147868",
        "700": "#0f6054",
        "800": "#0c4a41",
        "900": "#09352f",
        "950": "#04201c"
      },
      "warning": {
        "50": "#fff6e6",
        "100": "#ffe8c2",
        "200": "#f8d396",
        "300": "#ebb862",
        "400": "#d39b2e",
        "500": "#b17e0e",
        "600": "#926709",
        "700": "#745206",
        "800": "#583e04",
        "900": "#3e2b02",
        "950": "#261900"
      },
      "danger": {
        "50": "#fff4f5",
        "100": "#ffe3e6",
        "200": "#ffc6ce",
        "300": "#ff9dac",
        "400": "#f66e89",
        "500": "#e1436b",
        "600": "#c02d56",
        "700": "#9c2043",
        "800": "#791231",
        "900": "#580521",
        "950": "#390011"
      }
    },
    "font": {
      "display": {
        "family": "Sora",
        "fallback": "system-ui, sans-serif",
        "source": "google",
        "weights": [
          600,
          700
        ]
      },
      "sans": {
        "family": "Plus Jakarta Sans",
        "fallback": "system-ui, sans-serif",
        "source": "google",
        "weights": [
          400,
          500,
          600,
          700
        ]
      },
      "mono": {
        "family": "JetBrains Mono",
        "fallback": "ui-monospace, monospace",
        "source": "google",
        "weights": [
          400,
          500
        ]
      }
    },
    "radius": {
      "none": 0,
      "sm": 2,
      "md": 4,
      "lg": 6,
      "xl": 10,
      "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, 23, 20, 0.05)",
      "md": "0 6px 16px -4px rgba(24, 23, 20, 0.12)",
      "lg": "0 20px 48px -12px rgba(24, 23, 20, 0.22)"
    }
  },
  "typography": {
    "display-lg": {
      "font": "display",
      "size": 64,
      "lineHeight": 1.0625,
      "weight": 700,
      "letterSpacing": -0.035
    },
    "display-md": {
      "font": "display",
      "size": 48,
      "lineHeight": 1.08,
      "weight": 700,
      "letterSpacing": -0.03
    },
    "heading-lg": {
      "font": "display",
      "size": 32,
      "lineHeight": 1.25,
      "weight": 600,
      "letterSpacing": -0.02
    },
    "heading-md": {
      "font": "sans",
      "size": 24,
      "lineHeight": 1.33,
      "weight": 700,
      "letterSpacing": -0.01
    },
    "heading-sm": {
      "font": "sans",
      "size": 20,
      "lineHeight": 1.4,
      "weight": 700,
      "letterSpacing": -0.005
    },
    "body-lg": {
      "font": "sans",
      "size": 18,
      "lineHeight": 1.56,
      "weight": 400,
      "letterSpacing": 0
    },
    "body-md": {
      "font": "sans",
      "size": 16,
      "lineHeight": 1.625,
      "weight": 400,
      "letterSpacing": 0
    },
    "body-sm": {
      "font": "sans",
      "size": 14,
      "lineHeight": 1.57,
      "weight": 400,
      "letterSpacing": 0
    },
    "label": {
      "font": "sans",
      "size": 14,
      "lineHeight": 1.43,
      "weight": 600,
      "letterSpacing": 0.01
    },
    "caption": {
      "font": "sans",
      "size": 12,
      "lineHeight": 1.33,
      "weight": 600,
      "letterSpacing": 0.05
    },
    "code": {
      "font": "mono",
      "size": 14,
      "lineHeight": 1.57,
      "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.600}"
    },
    "dark": {
      "background": "{color.neutral.950}",
      "foreground": "{color.neutral.50}",
      "card": "#211f1b",
      "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": 48,
      "paddingX": "{space.6}",
      "radius": "{radius.md}",
      "typography": "{typography.label}",
      "fontWeight": 600
    },
    "input": {
      "height": 48,
      "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": [
      "Set page and collection titles in display-lg (Sora 64/68, -0.035em) or display-md (Sora 48/52, -0.03em), and follow them directly with body-lg (18px) so the size jump is at least 2.6×.",
      "Give each view one primary button for the main action, such as Add to bag or Checkout. Use secondary (neutral.100 fill) or ghost buttons for every other action.",
      "Show a 2px ring (brand.600 light, brand.400 dark) at a 2px offset on every focused button, input, link and product card.",
      "Keep section gaps at {space.16}–{space.24} and card padding at {space.8}. Keep at least {space.4} between form fields.",
      "Cap editorial copy at 640px (65–75 characters) in body-md (16/26) or body-lg (18/28).",
      "Set prices and quantities in Plus Jakarta Sans with font-feature-settings 'tnum'. Use the code token (JetBrains Mono 14/22) only for SKUs and order IDs.",
      "Separate cards with a 1px border token. Use shadow.md for menus and popovers, and shadow.lg for dialogs and the cart drawer.",
      "Set category kickers above headlines in uppercase caption (12/16, 600, 0.05em) using muted-foreground."
    ],
    "dont": [
      "Don't set Sora below 32px (heading-lg). heading-md (24px) and anything smaller, including forms, tables, prices and buttons, use Plus Jakarta Sans.",
      "Don't put a second saturated color on a screen. Primary green is the only accent. Sale and error states use destructive or warning tokens, at most once per product card.",
      "Don't use primary or brand green for errors or out-of-stock states. Use destructive (danger.600 light, danger.400 dark).",
      "Don't use success teal for buttons or links. It only marks completed states such as 'Order placed' or 'In stock'.",
      "Don't round corners beyond {radius.lg} (6px) on cards or {radius.md} (4px) on buttons and inputs, and never round product imagery beyond 6px.",
      "Don't use #000000 or cool greys. Text uses neutral.950 (light) or neutral.50 (dark), and hairlines use border (neutral.200 light, neutral.800 dark).",
      "Don't place muted-foreground text on brand or accent fills. Use accent-foreground (brand.900 light, brand.100 dark) instead.",
      "Don't reduce button or input height below 48px, or badge height below 24px."
    ]
  }
}
