{
  "schemaVersion": "1.0",
  "id": "gossamer-frond",
  "version": "1.1.0",
  "name": "Gossamer Frond",
  "tier": "free",
  "summary": "Restrained beauty UI: true-neutral greys, one deep moss-green accent (brand.600), regular-weight Literata headlines and generous whitespace.",
  "tags": {
    "industries": [
      "beauty",
      "skincare",
      "luxury-retail"
    ],
    "moods": [
      "restrained",
      "luxurious",
      "calm",
      "refined"
    ],
    "density": "spacious",
    "contrast": "standard"
  },
  "rationale": {
    "overview": "Gossamer Frond is for premium beauty and skincare storefronts that sell through restraint rather than promotion. The UI stays on the neutral ramp, and product photography supplies the color. One deep botanical green (primary) appears in only four roles: the main action per view, text links, the focus ring and selected states. Whitespace is part of the system. Sections use space.16 to space.24 gaps, and cards keep space.8 padding.",
    "color": "Neutrals are deliberately untinted (R=G=B) so packaging and swatches read accurately. The ramp steps in roughly even lightness increments. The 400 and 500 steps were smoothed to #a6a6a6 and #808080 to remove the mid-ramp gap. Brand green sits at OKLCH hue about 130, a moss and eucalyptus tone rather than emerald. Its chroma peaks at 400 to 600 and tapers toward 50 and 950. The same curve is used for success (cooler teal-green, hue about 160) and danger (crimson, hue about 10), so all status ramps read as one family. Warning is an ochre that shares the brand's yellow lean.\n\nLight-mode contrast:\n- primary brand.600 with white text: 5.4:1.\n- primary on background: 5.2:1.\n- destructive danger.600 with white: 6.1:1.\n- success.700 with white: 7.0:1.\n- muted-foreground neutral.600: 5.7:1 on background and 5.4:1 on muted.\n- ring brand.500 on background: 3.6:1.\n\nDark mode is built on near-black #121212. Cards and popovers lift to neutral.900, and secondary and muted surfaces sit at neutral.800. The accent is a soft sage, brand.400, with brand.950 text (6.5:1). It is luminous without turning neon. Destructive in dark mode is danger.400 with danger.950 text (6.1:1).",
    "typography": "The scale uses a 1.333 ratio (perfect fourth) above the 18px body-lg: 24, 32, 42, 56. Body steps run 12, 14, 16, 18. Literata carries display-lg through heading-md at weight 400, with heading-md at 500. Tracking tightens as size grows: -0.022em at 56px, -0.018em at 42px, -0.012em at 32px and -0.006em at 24px. Nunito Sans (400, 500, 600) handles navigation, forms, product detail and buttons. Body line height is 1.65 at 16px and 1.7 at 18px. Fira Code 400 is used only for SKUs, order numbers and code. Caption is 12px, weight 600, uppercase, with 0.08em tracking for eyebrows and category labels.",
    "layout": "Spacious density on a 4px base grid. Section gaps run space.16 (64px) to space.24 (96px) on desktop and space.12 (48px) on mobile. The content column is at most 1120px. Body text runs 60 to 72 characters per line. Prefer one idea per viewport, and let full-bleed imagery sit without overlaid UI.",
    "elevation": "Almost flat. Surfaces are separated by a 1px border token (neutral.200 light, neutral.800 dark) and by whitespace. Shadows are used as follows:\n- shadow.sm (4% opacity) is the only shadow allowed on cards.\n- shadow.md is for menus and popovers.\n- shadow.lg is for dialogs and drawers.\n- Never combine two shadow tokens on one element.",
    "shapes": "Corners are small for a tailored look:\n- radius.md (4px) on buttons, inputs and selects.\n- radius.lg (8px) on cards and dialogs.\n- radius.sm (2px) on checkboxes and tags.\n- radius.full only on badges (24px tall), avatars and color swatches."
  },
  "primitives": {
    "color": {
      "brand": {
        "50": "#f4f8ef",
        "100": "#e5efdc",
        "200": "#cbdfba",
        "300": "#a7c88f",
        "400": "#80ab67",
        "500": "#5f8f48",
        "600": "#487535",
        "700": "#385c2a",
        "800": "#2b4721",
        "900": "#1f3318",
        "950": "#111f0d"
      },
      "neutral": {
        "50": "#fafafa",
        "100": "#f2f2f2",
        "200": "#e3e3e3",
        "300": "#cccccc",
        "400": "#a6a6a6",
        "500": "#808080",
        "600": "#636363",
        "700": "#4d4d4d",
        "800": "#363636",
        "900": "#222222",
        "950": "#121212"
      },
      "success": {
        "50": "#eefaf4",
        "100": "#d5f2e2",
        "200": "#aee4c8",
        "300": "#7fd0aa",
        "400": "#52b98a",
        "500": "#2f9e6f",
        "600": "#1f8059",
        "700": "#176548",
        "800": "#114d37",
        "900": "#0b3626",
        "950": "#052016"
      },
      "warning": {
        "50": "#fff8e8",
        "100": "#ffeec6",
        "200": "#f8dc98",
        "300": "#e8c26a",
        "400": "#d1a43a",
        "500": "#b4861a",
        "600": "#946b0c",
        "700": "#765409",
        "800": "#5a4006",
        "900": "#402d03",
        "950": "#271b01"
      },
      "danger": {
        "50": "#fff5f6",
        "100": "#ffe3e6",
        "200": "#ffc7ce",
        "300": "#ff9ba9",
        "400": "#f26a82",
        "500": "#d9415f",
        "600": "#b82a49",
        "700": "#96203a",
        "800": "#73142c",
        "900": "#540a1e",
        "950": "#3a0012"
      }
    },
    "font": {
      "display": {
        "family": "Literata",
        "fallback": "Georgia, serif",
        "source": "google",
        "weights": [
          400,
          500
        ]
      },
      "sans": {
        "family": "Nunito Sans",
        "fallback": "system-ui, sans-serif",
        "source": "google",
        "weights": [
          400,
          500,
          600
        ]
      },
      "mono": {
        "family": "Fira Code",
        "fallback": "ui-monospace, monospace",
        "source": "google",
        "weights": [
          400,
          500
        ]
      }
    },
    "radius": {
      "none": 0,
      "sm": 2,
      "md": 4,
      "lg": 8,
      "xl": 12,
      "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(18, 18, 18, 0.04)",
      "md": "0 6px 20px -6px rgba(18, 18, 18, 0.10)",
      "lg": "0 24px 56px -12px rgba(18, 18, 18, 0.18)"
    }
  },
  "typography": {
    "display-lg": {
      "font": "display",
      "size": 56,
      "lineHeight": 1.07,
      "weight": 400,
      "letterSpacing": -0.022
    },
    "display-md": {
      "font": "display",
      "size": 42,
      "lineHeight": 1.12,
      "weight": 400,
      "letterSpacing": -0.018
    },
    "heading-lg": {
      "font": "display",
      "size": 32,
      "lineHeight": 1.2,
      "weight": 400,
      "letterSpacing": -0.012
    },
    "heading-md": {
      "font": "display",
      "size": 24,
      "lineHeight": 1.3,
      "weight": 500,
      "letterSpacing": -0.006
    },
    "heading-sm": {
      "font": "sans",
      "size": 18,
      "lineHeight": 1.4,
      "weight": 600,
      "letterSpacing": 0
    },
    "body-lg": {
      "font": "sans",
      "size": 18,
      "lineHeight": 1.7,
      "weight": 400,
      "letterSpacing": 0
    },
    "body-md": {
      "font": "sans",
      "size": 16,
      "lineHeight": 1.65,
      "weight": 400,
      "letterSpacing": 0
    },
    "body-sm": {
      "font": "sans",
      "size": 14,
      "lineHeight": 1.55,
      "weight": 400,
      "letterSpacing": 0.005
    },
    "label": {
      "font": "sans",
      "size": 14,
      "lineHeight": 1.3,
      "weight": 600,
      "letterSpacing": 0.02
    },
    "caption": {
      "font": "sans",
      "size": 12,
      "lineHeight": 1.4,
      "weight": 600,
      "letterSpacing": 0.08
    },
    "code": {
      "font": "mono",
      "size": 14,
      "lineHeight": 1.6,
      "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.6}",
      "radius": "{radius.md}",
      "typography": "{typography.label}",
      "fontWeight": 600
    },
    "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.3}",
      "radius": "{radius.full}",
      "typography": "{typography.caption}"
    }
  },
  "guidance": {
    "do": [
      "Use one primary button per view for the main action, such as 'Add to bag'. Render all other buttons as secondary or ghost.",
      "Keep desktop section gaps at space.16 (64px) or larger and card padding at space.8 (32px).",
      "Set Literata only at heading-md (24px) and above: weight 400 for display-lg through heading-lg, 500 for heading-md. Use Nunito Sans for all UI text.",
      "Set caption uppercase with its 0.08em tracking for eyebrows and category labels, limited to 1-3 words.",
      "Separate surfaces with a 1px border token (neutral.200 light, neutral.800 dark). Use shadow.md only on menus and popovers, and shadow.lg only on dialogs.",
      "Show focus as a 2px ring token (brand.500 light, brand.400 dark) offset 2px from the control, on every interactive element.",
      "Pair success, warning and destructive states with an icon or a text label, such as 'In stock' or 'Only 2 left', so meaning never relies on color alone."
    ],
    "dont": [
      "Don't fill large sections or decorative shapes with brand green. Primary is limited to actions, links, focus and selected states.",
      "Don't set Literata below 24px, above weight 500, or in all caps.",
      "Don't tint the neutral ramp warm or cool. Grey stays R=G=B so packaging colors stay true.",
      "Don't exceed radius.lg (8px) on cards or radius.md (4px) on buttons and inputs. radius.full is for badges, avatars and swatches only.",
      "Don't add shadow.md or shadow.lg to cards in a product grid. Cards use only the 1px border and shadow.sm.",
      "Don't use success green for primary actions. It is a status color, cooler in hue than brand green.",
      "Don't reduce card padding below space.6 (24px) or let body text lines exceed 72 characters."
    ]
  }
}
