{
  "schemaVersion": "1.0",
  "id": "spring-doorstep",
  "version": "1.1.0",
  "name": "Spring Doorstep",
  "tier": "free",
  "summary": "Calm, botanical UI for home-service booking: spring-water blue actions on cool green-grey neutrals, soft serif headlines, steady contrast.",
  "tags": {
    "industries": [
      "home-services",
      "property-maintenance",
      "landscaping"
    ],
    "moods": [
      "calm",
      "natural",
      "trustworthy",
      "gentle"
    ],
    "density": "comfortable",
    "contrast": "standard"
  },
  "rationale": {
    "overview": "Spring Doorstep is for homeowners booking gardeners, cleaners, plumbers and handypeople, often while dealing with a problem in their house. Instead of urgent orange or red, the system uses one spring-water blue (brand, hue about 200) for action. Structure comes from cool green-grey neutrals (hue about 160). Fraunces is used only for titles of 30px and larger. Every text pair clears 4.5:1 in both modes, and most pairs clear 5:1.",
    "color": "Fernmark Blue carries every primary button, link and focus ring. Light mode uses primary brand.600 #1f7599 with white text (5.2:1) and ring brand.600 (4.8:1 on background). Dark mode uses brand.400 #55b1d2 with brand.950 text (6.5:1). Neutrals hold a steady green tint from 50 to 950. Neutral.950 is set to #141b19 so dark surfaces stay deep but tinted. Destructive is crimson (hue about 345), roughly 145° away from the blue, so cancellations can't be mistaken for primary actions. Success uses a cool teal-leaning green (hue about 155) to sit beside the blue. Warning uses a muted ochre fill (warning.200 with warning.900 text, 9.7:1) so it reads as caution, not alarm. Muted-foreground is neutral.700 in light mode (6.4:1 on background, 5.8:1 on muted) and neutral.300 in dark mode (7.2:1 on muted #26302e).",
    "typography": "The type scale is a major third (ratio of about 1.25) anchored at 16px: 12, 14, 16, 18, 20, 24, 30, 38 and 48. Fraunces covers display-lg 48/600, display-md 38/600 and heading-lg 30/500. Letter spacing tightens from -0.015em to -0.025em as size grows. Instrument Sans covers heading-md 24, heading-sm 20, all body styles, labels and captions at weights 400, 500 and 600. Body line height is 1.5 to 1.6 so instructions stay readable. JetBrains Mono at 14/400 is reserved for booking references, postcodes in tables and code in developer docs.",
    "layout": "Comfortable density on a 4px base grid. Content columns cap at 1152px. Buttons and inputs are 40px tall. Schedule and quote rows are at least 48px tall, with space.4 (16px) horizontal cell padding.",
    "elevation": "Mostly flat. Cards use a 1px border token plus shadow.sm. Shadow.md is for popovers and date pickers, and shadow.lg is for confirmation dialogs only. In dark mode, elevation comes from surface lift: background #141b19, then card #1c2523, then popover #212b29.",
    "shapes": "Soft but tidy rounding. Buttons and inputs use radius.md (8px), and cards and sheets use radius.lg (12px). Radius.full pills are used only for status badges such as 'Booked' or 'On the way' (22px tall, caption type)."
  },
  "primitives": {
    "color": {
      "brand": {
        "50": "#f0f8fb",
        "100": "#dcf0f7",
        "200": "#b8e1ef",
        "300": "#88cde3",
        "400": "#55b1d2",
        "500": "#2f93bb",
        "600": "#1f7599",
        "700": "#1b5f7c",
        "800": "#1a4d64",
        "900": "#173d51",
        "950": "#0c2633"
      },
      "neutral": {
        "50": "#f4f7f6",
        "100": "#e6ecea",
        "200": "#cfd9d5",
        "300": "#b1bfba",
        "400": "#919f9a",
        "500": "#7a8a85",
        "600": "#63726d",
        "700": "#505d59",
        "800": "#3d4845",
        "900": "#2a3431",
        "950": "#141b19"
      },
      "success": {
        "50": "#edfaf4",
        "100": "#d4f2e4",
        "200": "#ade5cc",
        "300": "#7bd2ac",
        "400": "#4fb88a",
        "500": "#2e9a71",
        "600": "#1f7e5c",
        "700": "#19684b",
        "800": "#13533d",
        "900": "#0e3f2f",
        "950": "#082a1f"
      },
      "warning": {
        "50": "#fdf9ec",
        "100": "#fbefcb",
        "200": "#f5dd95",
        "300": "#ebc769",
        "400": "#ddac42",
        "500": "#c48f22",
        "600": "#a17213",
        "700": "#80580d",
        "800": "#61420b",
        "900": "#452e08",
        "950": "#2a1b04"
      },
      "danger": {
        "50": "#fff4f5",
        "100": "#ffe3e7",
        "200": "#ffc6d0",
        "300": "#ff9aab",
        "400": "#f5677f",
        "500": "#dd3d5e",
        "600": "#b92a4c",
        "700": "#951e3b",
        "800": "#74152d",
        "900": "#55101f",
        "950": "#370a14"
      }
    },
    "font": {
      "display": {
        "family": "Fraunces",
        "fallback": "Georgia, serif",
        "source": "google",
        "weights": [
          500,
          600
        ]
      },
      "sans": {
        "family": "Instrument Sans",
        "fallback": "system-ui, sans-serif",
        "source": "google",
        "weights": [
          400,
          500,
          600
        ]
      },
      "mono": {
        "family": "JetBrains 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(20, 27, 25, 0.06)",
      "md": "0 4px 12px -2px rgba(20, 27, 25, 0.12)",
      "lg": "0 16px 40px -8px rgba(20, 27, 25, 0.20)"
    }
  },
  "typography": {
    "display-lg": {
      "font": "display",
      "size": 48,
      "lineHeight": 1.08,
      "weight": 600,
      "letterSpacing": -0.025
    },
    "display-md": {
      "font": "display",
      "size": 38,
      "lineHeight": 1.12,
      "weight": 600,
      "letterSpacing": -0.02
    },
    "heading-lg": {
      "font": "display",
      "size": 30,
      "lineHeight": 1.2,
      "weight": 500,
      "letterSpacing": -0.015
    },
    "heading-md": {
      "font": "sans",
      "size": 24,
      "lineHeight": 1.3,
      "weight": 600,
      "letterSpacing": -0.01
    },
    "heading-sm": {
      "font": "sans",
      "size": 20,
      "lineHeight": 1.35,
      "weight": 600,
      "letterSpacing": -0.005
    },
    "body-lg": {
      "font": "sans",
      "size": 18,
      "lineHeight": 1.6,
      "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.5,
      "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.01
    },
    "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": "#1c2523",
      "card-foreground": "{color.neutral.50}",
      "popover": "#212b29",
      "popover-foreground": "{color.neutral.50}",
      "primary": "{color.brand.400}",
      "primary-foreground": "{color.brand.950}",
      "secondary": "#2a3533",
      "secondary-foreground": "{color.neutral.100}",
      "muted": "#26302e",
      "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": 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 the primary token for exactly one main action per screen, such as 'Book visit'. Give other actions the secondary or ghost button variant.",
      "Show focus with a 2px ring token outline at a 2px offset on buttons, inputs, date-picker cells and time-slot chips, in both modes.",
      "Set prices and durations in Instrument Sans with font-feature-settings: 'tnum', right-aligned, in quote and schedule tables.",
      "Use Fraunces only for display-lg (48px), display-md (38px) and heading-lg (30px). Use weight 600 for display styles and 500 for heading-lg.",
      "Pair every status color with an icon or text label, such as 'Confirmed' with a check, so meaning never relies on hue alone.",
      "Keep schedule and quote rows at least 48px tall, and use the muted token as the alternate row fill in lists longer than 10 rows.",
      "Use the accent token only for selected rows, highlighted time slots and selected chips. Put accent-foreground text on it.",
      "In dark mode, layer surfaces as background, then card, then popover. Add shadow.md only to popovers and date pickers."
    ],
    "dont": [
      "Don't use the primary token for errors, cancellations or failed payments. Use destructive with destructive-foreground for those states.",
      "Don't put body text longer than three lines on the accent or warning surfaces. Keep it on background or card.",
      "Don't give cards a shadow above shadow.sm. Separation comes from the 1px border token.",
      "Don't use #000000 or untinted greys for text, borders or surfaces. Draw them from the neutral ramp or the dark surface tokens.",
      "Don't set Fraunces below heading-lg (30px) or in all caps, and don't use it for form labels, buttons or table content.",
      "Don't place muted-foreground text on the secondary or accent surfaces. Use secondary-foreground or accent-foreground there.",
      "Don't use destructive or warning fills as decoration behind non-status content."
    ]
  }
}
