{
  "schemaVersion": "1.0",
  "id": "polish-pitstop",
  "version": "1.1.0",
  "name": "Polish Pitstop",
  "tier": "free",
  "summary": "Friendly, bouncy automotive UI: teal actions on cool green-grey neutrals, pill controls, round cards and Epilogue headlines.",
  "tags": {
    "industries": [
      "automotive",
      "ev-charging",
      "car-sharing",
      "mobility"
    ],
    "moods": [
      "playful",
      "friendly",
      "energetic",
      "approachable"
    ],
    "density": "comfortable",
    "contrast": "standard"
  },
  "rationale": {
    "overview": "Polish Pitstop serves car sharing, EV charging, service booking and driver-companion apps. It avoids the black, chrome and red defaults of automotive UI. Instead it uses a teal action color (brand.600 light, brand.400 dark), green-grey neutrals at hue ~170, pill buttons and Epilogue headlines. Every text pair in both modes meets WCAG AA at 4.5:1 or higher, and most pairs exceed 5:1.",
    "color": "All scales share a single chroma curve. Chroma peaks at step 400–500, tapers toward 50 and 950, and drops evenly between 600 and 900 with no flat mid-steps. Brand teal sits at OKLCH hue ~170. Neutrals use the same hue at low chroma, so surfaces read as tinted on purpose rather than grey. Success sits at a yellow-green hue (~140) with the same chroma curve, so it relates to teal but never matches it. Warning is a warm amber and destructive is a raspberry crimson (~10). Both are far from teal in hue, with ΔE00 ≥ 18 in both modes. Light-mode contrast: white on primary (brand.600 #007d66) is 5.1:1, primary vs background is 4.8:1, and muted-foreground (neutral.700) on muted (neutral.100) is 6.4:1. Dark-mode contrast: primary brand.400 on background neutral.950 is 8.5:1, and muted-foreground neutral.300 on muted neutral.800 is 5.8:1.",
    "typography": "The type scale is a Major Third (1.25) built on 16px: 12, 14, 16, 20, 25, 31, 39, 49. Body-lg is 18 and label is 16, both off-scale for reading comfort. Epilogue at 700/800 sets display-lg (49), display-md (39) and heading-lg (31). Tracking tightens as size grows: -0.03em at 49px, -0.025em at 39px, -0.02em at 31px. Karla at 400–700 sets everything functional: headings md/sm, body, labels, captions, buttons, forms and tables. Body line heights are 1.5–1.6. IBM Plex Mono at 400/500 is reserved for plates, VINs, charger IDs and telemetry values.",
    "layout": "Comfortable density on a 4px grid. Buttons and inputs are 44px tall for gloved or one-handed use. Gaps between cards are space.4 (16px) to space.6 (24px), and card padding is space.6. Content columns max out at 1120px.",
    "elevation": "Shadows are tinted with deep teal (rgba 8,52,43), so lifted elements stay in the palette. Cards use shadow.sm plus a 1px border token, popovers use shadow.md, and dialogs and bottom sheets use shadow.lg. In dark mode, lift comes mainly from surface steps: card and popover use neutral.900 on a neutral.950 background, and borders use neutral.800.",
    "shapes": "Radii are large and round. Inputs use radius.md (14px), cards radius.lg (20px), and dialogs and sheets radius.xl (28px). Buttons and badges use radius.full. Only full-bleed images and dividers use radius.none."
  },
  "primitives": {
    "color": {
      "brand": {
        "50": "#e8fbf5",
        "100": "#c8f5e6",
        "200": "#95ead1",
        "300": "#5ad8b7",
        "400": "#2ec4a0",
        "500": "#10a586",
        "600": "#007d66",
        "700": "#006655",
        "800": "#075245",
        "900": "#0a3f36",
        "950": "#052a24"
      },
      "neutral": {
        "50": "#f3f8f6",
        "100": "#e4eeea",
        "200": "#cfdcd7",
        "300": "#b3c4be",
        "400": "#91a69f",
        "500": "#738882",
        "600": "#5a6e68",
        "700": "#465853",
        "800": "#33423e",
        "900": "#1f2a27",
        "950": "#111a18"
      },
      "success": {
        "50": "#effaea",
        "100": "#d8f4cc",
        "200": "#b3e89f",
        "300": "#87d56c",
        "400": "#5fbd45",
        "500": "#45a02e",
        "600": "#368522",
        "700": "#2a6b1a",
        "800": "#215416",
        "900": "#183d10",
        "950": "#0d2708"
      },
      "warning": {
        "50": "#fff8e1",
        "100": "#ffefb8",
        "200": "#ffe085",
        "300": "#ffcc4d",
        "400": "#f2b01c",
        "500": "#d69400",
        "600": "#ad7700",
        "700": "#885e00",
        "800": "#684700",
        "900": "#4b3200",
        "950": "#2d1d00"
      },
      "danger": {
        "50": "#fff3f4",
        "100": "#ffe2e5",
        "200": "#ffc5cc",
        "300": "#ff9aa8",
        "400": "#f76a85",
        "500": "#e2416a",
        "600": "#c2284f",
        "700": "#9f1c40",
        "800": "#7b1030",
        "900": "#5a0722",
        "950": "#3a0014"
      }
    },
    "font": {
      "display": {
        "family": "Epilogue",
        "fallback": "system-ui, sans-serif",
        "source": "google",
        "weights": [
          700,
          800
        ]
      },
      "sans": {
        "family": "Karla",
        "fallback": "system-ui, sans-serif",
        "source": "google",
        "weights": [
          400,
          500,
          600,
          700
        ]
      },
      "mono": {
        "family": "IBM Plex Mono",
        "fallback": "ui-monospace, monospace",
        "source": "google",
        "weights": [
          400,
          500
        ]
      }
    },
    "radius": {
      "none": 0,
      "sm": 8,
      "md": 14,
      "lg": 20,
      "xl": 28,
      "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 3px rgba(8, 52, 43, 0.10)",
      "md": "0 6px 16px -4px rgba(8, 52, 43, 0.16)",
      "lg": "0 20px 44px -10px rgba(8, 52, 43, 0.24)"
    }
  },
  "typography": {
    "display-lg": {
      "font": "display",
      "size": 49,
      "lineHeight": 1.04,
      "weight": 800,
      "letterSpacing": -0.03
    },
    "display-md": {
      "font": "display",
      "size": 39,
      "lineHeight": 1.08,
      "weight": 800,
      "letterSpacing": -0.025
    },
    "heading-lg": {
      "font": "display",
      "size": 31,
      "lineHeight": 1.15,
      "weight": 700,
      "letterSpacing": -0.02
    },
    "heading-md": {
      "font": "sans",
      "size": 25,
      "lineHeight": 1.25,
      "weight": 700,
      "letterSpacing": -0.01
    },
    "heading-sm": {
      "font": "sans",
      "size": 20,
      "lineHeight": 1.3,
      "weight": 700,
      "letterSpacing": -0.005
    },
    "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": 16,
      "lineHeight": 1.25,
      "weight": 700,
      "letterSpacing": 0.005
    },
    "caption": {
      "font": "sans",
      "size": 12,
      "lineHeight": 1.4,
      "weight": 600,
      "letterSpacing": 0.02
    },
    "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.200}",
      "input": "{color.neutral.300}",
      "ring": "{color.brand.600}"
    },
    "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.5}",
      "radius": "{radius.full}",
      "typography": "{typography.label}",
      "fontWeight": 700
    },
    "input": {
      "height": 44,
      "paddingX": "{space.4}",
      "radius": "{radius.md}",
      "typography": "{typography.body-md}",
      "borderWidth": 1
    },
    "card": {
      "padding": "{space.6}",
      "radius": "{radius.lg}",
      "shadow": "{shadow.sm}",
      "borderWidth": 1
    },
    "badge": {
      "height": 24,
      "paddingX": "{space.3}",
      "radius": "{radius.full}",
      "typography": "{typography.caption}"
    }
  },
  "guidance": {
    "do": [
      "Use the primary token for exactly one main action per view, such as Book, Start charging or Unlock. Primary is brand.600 #007d66 in light mode (white text, 5.1:1) and brand.400 in dark mode (brand.950 text). Render all other buttons as secondary or ghost.",
      "Use radius.full for buttons and badges, radius.md (14px) for inputs, radius.lg (20px) for cards, and radius.xl (28px) for dialogs and bottom sheets.",
      "Set display-lg (49px), display-md (39px) and heading-lg (31px) in Epilogue 700/800. Set heading-md (25px), heading-sm (20px) and all UI text in Karla.",
      "Set plates, VINs, charger IDs and telemetry values in typography.code (IBM Plex Mono 14px) with font-variant-numeric: tabular-nums.",
      "Keep buttons and inputs at 44px height and leave at least space.2 (8px) between adjacent tappable controls.",
      "Pair success, warning and destructive fills with an icon or text label so status never relies on color alone.",
      "Use the accent token for selected list rows, the chosen vehicle card and active filter chips, with accent-foreground for their text. Accent is brand.100 in light mode and brand.900 in dark mode.",
      "Show focus as a 2px ring token outline with a 2px offset on every interactive element, in both modes."
    ],
    "dont": [
      "Don't use brand teal for errors or confirmations; use the destructive (danger) and success (green) tokens.",
      "Don't use black or untinted grey shadows; use only shadow.sm, shadow.md and shadow.lg, which are teal-tinted.",
      "Don't use brand.500 or lighter for ring or text in light mode; it falls toward 3:1 against background.",
      "Don't set Epilogue below 31px (heading-lg) or for body paragraphs; use Karla heading-md or heading-sm instead.",
      "Don't apply radius.none or radius.sm to buttons, inputs or cards.",
      "Don't place muted-foreground text on primary or accent fills; use primary-foreground or accent-foreground.",
      "Don't use a card shadow above shadow.sm; reserve shadow.md for popovers and shadow.lg for dialogs and sheets.",
      "Don't use neutral.600 for muted text on muted surfaces; it drops to about 4.6:1. Use the muted-foreground token (neutral.700 light, neutral.300 dark)."
    ]
  }
}
