{
  "schemaVersion": "1.0",
  "id": "impulse-kiosk",
  "version": "1.1.0",
  "name": "Impulse Kiosk",
  "tier": "free",
  "summary": "Raw, high-contrast e-commerce UI: hard-edged violet actions, sharp corners, hard offset shadows and grotesk headlines.",
  "tags": {
    "industries": [
      "e-commerce",
      "retail",
      "direct-to-consumer"
    ],
    "moods": [
      "brutalist",
      "bold",
      "raw",
      "deliberate"
    ],
    "density": "comfortable",
    "contrast": "high"
  },
  "rationale": {
    "overview": "Impulse Kiosk is for online shops that want to look deliberate rather than polished. Product pages are built from 2px borders, 0px corners and heavy Epilogue headlines, so the product photo and the primary action carry the weight. Every surface is either a warm neutral slab (background, card, muted) or a single violet primary block. No gradients, blur or decorative fills are used.",
    "color": "One action color, Orchid (brand, hue about 288), is used for the primary button, selected states and the focus ring. In light mode, primary is brand.600 (#7340c9), which gives 6.4:1 with white text and 5.9:1 against the background. In dark mode, primary is brand.400 (#a67ef0), which gives 5.9:1 with brand.950 text. Neutrals are a warm grey-beige ramp that runs from #faf7f2 to #15130f, so high contrast does not feel clinical. Destructive uses a crimson danger ramp held at one hue from 50 to 950, so the mid-steps do not drift toward orange. The ramp is far from violet in hue: danger.600 is used in light mode (6.9:1 with white) and danger.400 in dark mode (5.7:1 with danger.950). Success is a mid green and warning is a mustard amber. Both share the warm undertone of the neutral ramp and are used only for stock and shipping status.",
    "typography": "The type scale uses a √2 ratio (about 1.414) from a 16px body: 16, 22, 32, 45 and 64. Epilogue sets display-lg (64/1.0, 800, -0.035em), display-md (45/1.05, 800, -0.03em) and heading-lg (32/1.1, 700, -0.02em). Karla 700 takes over from heading-md (22px) downward, and Karla 400 sets body text at 1.5 line height (1.55 for body-lg). Label (14px) and caption (12px) are set in Karla 700 with +0.04em and +0.05em tracking for short uppercase strings. IBM Plex Mono 400 and 500 are reserved for SKUs, order numbers, dimensions and spec tables.",
    "layout": "Comfortable density on a 4px base grid (space.1 = 4px). Product grids use 24px gutters (space.6) so each item reads as a separate block. Content columns cap at 1280px. Buttons and inputs are 44px tall to meet touch-target size on mobile checkout.",
    "elevation": "Shadows are hard and offset with zero blur, drawn in neutral.950: shadow.sm is 2px, shadow.md 4px and shadow.lg 8px. Cards use shadow.md together with a 2px border. Popovers and dialogs use shadow.lg so layering is obvious. In dark mode the neutral.950 shadow disappears into the background, so the neutral.600 border (3.3:1 against the background) and the card step from neutral.950 to neutral.900 carry the edge instead.",
    "shapes": "Buttons, inputs and cards use 0px radius (radius.none). Badges use radius.sm (2px). Nothing in the system uses radius.full, because pill shapes would soften the brutalist look."
  },
  "primitives": {
    "color": {
      "brand": {
        "50": "#f8f4ff",
        "100": "#eee6ff",
        "200": "#dccbff",
        "300": "#c4a5fb",
        "400": "#a67ef0",
        "500": "#8a57e0",
        "600": "#7340c9",
        "700": "#5d2fa6",
        "800": "#46237d",
        "900": "#301758",
        "950": "#1d0c38"
      },
      "neutral": {
        "50": "#faf7f2",
        "100": "#f1ece4",
        "200": "#e0d9cd",
        "300": "#c7bfb2",
        "400": "#a39b8e",
        "500": "#8a8275",
        "600": "#6f685d",
        "700": "#57514a",
        "800": "#3f3b35",
        "900": "#2b2823",
        "950": "#15130f"
      },
      "success": {
        "50": "#eefbf1",
        "100": "#d6f5de",
        "200": "#adebbd",
        "300": "#7fdb97",
        "400": "#4fc276",
        "500": "#2fa35a",
        "600": "#1f8449",
        "700": "#17663a",
        "800": "#0f4a2a",
        "900": "#0a321d",
        "950": "#051d10"
      },
      "warning": {
        "50": "#fff9e6",
        "100": "#ffefb8",
        "200": "#ffe27a",
        "300": "#ffd23f",
        "400": "#e8b923",
        "500": "#c99a0b",
        "600": "#a87c00",
        "700": "#856100",
        "800": "#634600",
        "900": "#432f00",
        "950": "#2a1d00"
      },
      "danger": {
        "50": "#fff1f1",
        "100": "#ffdfe0",
        "200": "#ffbfc3",
        "300": "#fd919a",
        "400": "#f05f6e",
        "500": "#d8344b",
        "600": "#b3172f",
        "700": "#8f1226",
        "800": "#6c0e1d",
        "900": "#4c0914",
        "950": "#30040c"
      }
    },
    "font": {
      "display": {
        "family": "Epilogue",
        "fallback": "Arial Black, Helvetica, sans-serif",
        "source": "google",
        "weights": [
          700,
          800
        ]
      },
      "sans": {
        "family": "Karla",
        "fallback": "Helvetica, Arial, sans-serif",
        "source": "google",
        "weights": [
          400,
          500,
          700
        ]
      },
      "mono": {
        "family": "IBM Plex Mono",
        "fallback": "ui-monospace, monospace",
        "source": "google",
        "weights": [
          400,
          500,
          600
        ]
      }
    },
    "radius": {
      "none": 0,
      "sm": 2,
      "md": 2,
      "lg": 4,
      "xl": 6,
      "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": "2px 2px 0 0 #15130f",
      "md": "4px 4px 0 0 #15130f",
      "lg": "8px 8px 0 0 #15130f"
    }
  },
  "typography": {
    "display-lg": {
      "font": "display",
      "size": 64,
      "lineHeight": 1,
      "weight": 800,
      "letterSpacing": -0.035
    },
    "display-md": {
      "font": "display",
      "size": 45,
      "lineHeight": 1.05,
      "weight": 800,
      "letterSpacing": -0.03
    },
    "heading-lg": {
      "font": "display",
      "size": 32,
      "lineHeight": 1.1,
      "weight": 700,
      "letterSpacing": -0.02
    },
    "heading-md": {
      "font": "sans",
      "size": 22,
      "lineHeight": 1.25,
      "weight": 700,
      "letterSpacing": -0.01
    },
    "heading-sm": {
      "font": "sans",
      "size": 16,
      "lineHeight": 1.3,
      "weight": 700,
      "letterSpacing": 0
    },
    "body-lg": {
      "font": "sans",
      "size": 18,
      "lineHeight": 1.55,
      "weight": 400,
      "letterSpacing": 0
    },
    "body-md": {
      "font": "sans",
      "size": 16,
      "lineHeight": 1.5,
      "weight": 400,
      "letterSpacing": 0
    },
    "body-sm": {
      "font": "sans",
      "size": 14,
      "lineHeight": 1.5,
      "weight": 400,
      "letterSpacing": 0
    },
    "label": {
      "font": "sans",
      "size": 14,
      "lineHeight": 1.2,
      "weight": 700,
      "letterSpacing": 0.04
    },
    "caption": {
      "font": "sans",
      "size": 12,
      "lineHeight": 1.35,
      "weight": 700,
      "letterSpacing": 0.05
    },
    "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.950}",
      "input": "{color.neutral.900}",
      "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.600}",
      "input": "{color.neutral.600}",
      "ring": "{color.brand.400}"
    }
  },
  "components": {
    "button": {
      "height": 44,
      "paddingX": "{space.5}",
      "radius": "{radius.none}",
      "typography": "{typography.label}",
      "fontWeight": 700
    },
    "input": {
      "height": 44,
      "paddingX": "{space.3}",
      "radius": "{radius.none}",
      "typography": "{typography.body-md}",
      "borderWidth": 2
    },
    "card": {
      "padding": "{space.6}",
      "radius": "{radius.none}",
      "shadow": "{shadow.md}",
      "borderWidth": 2
    },
    "badge": {
      "height": 24,
      "paddingX": "{space.2}",
      "radius": "{radius.sm}",
      "typography": "{typography.caption}"
    }
  },
  "guidance": {
    "do": [
      "Use the primary token for exactly one main action per view, such as Add to bag or Checkout. Render every other action as secondary or as an outline with a 2px border.",
      "Give every card and button a 2px border in the border token. Use shadow.md on cards and shadow.lg on popovers and dialogs.",
      "In dark mode, rely on the neutral.600 border and the step from background to card (neutral.950 to neutral.900) to show edges, because the neutral.950 shadow is not visible there.",
      "Set SKUs and order numbers in IBM Plex Mono 400 at the code style (14px). Set prices in Karla with tabular figures, right-aligned in cart tables.",
      "Use Epilogue only at heading-lg (32px) and larger, for product titles and section headers. Switch to Karla 700 at heading-md (22px) and below.",
      "Pair every status color with a text label, for example a success badge reading 'In stock' or a warning badge reading 'Low stock'.",
      "Keep interactive targets at least 44px tall, matching the button and input heights, and show focus as a 2px ring in the ring token."
    ],
    "dont": [
      "Don't use primary or brand colors for errors, out-of-stock states or removals. Use destructive (danger.600 in light, danger.400 in dark) for those.",
      "Don't apply any radius to buttons, inputs or cards; they stay at radius.none (0px). Only badges may use radius.sm (2px).",
      "Don't add blur to shadows. Use only shadow.sm, shadow.md and shadow.lg.",
      "Don't use pure #000000 or cool greys for text, borders or shadows. Pull them from the warm neutral ramp.",
      "Don't set product descriptions or other body copy in IBM Plex Mono. Reserve it for codes, SKUs and spec values.",
      "Don't place multi-line body text on the accent surface (brand.100 in light, brand.900 in dark). Use accent only for selected rows and short highlights."
    ]
  }
}
