{
  "schemaVersion": "1.0",
  "id": "vermilion-concierge",
  "version": "1.1.0",
  "name": "Vermilion Concierge",
  "tier": "free",
  "summary": "Dense, data-first UI for hotel and restaurant operators: crisp borders, tabular figures and a single vermilion action color.",
  "tags": {
    "industries": [
      "hospitality",
      "hotel-operations",
      "restaurant-tech"
    ],
    "moods": [
      "precise",
      "efficient",
      "calm"
    ],
    "density": "compact",
    "contrast": "standard"
  },
  "rationale": {
    "overview": "Vermilion Concierge serves operators who run rooms, covers and inventory from one screen: front-desk leads, kitchen managers and revenue analysts. Care is shown through order rather than decoration: 32px rows and controls, tabular numerals, 1px borders and radii of 6px or less. Only one color, Hearth vermilion, means 'act here'. Everything else is neutral structure or labelled status.",
    "color": "Hearth (brand, HSL hue ~12) is used only for primary, ring and accent. Light primary is brand.600 #bd3f1e: 5.4:1 against white text and 5.2:1 against background. Dark primary is brand.400 #f2704f: 6.4:1 against background and 6.0:1 against its brand.950 foreground. The neutral ramp carries a very low warm tint (R ≥ G ≥ B by 1–6 steps) so greys sit with Hearth without reading as beige in dense grids. Destructive is a raspberry crimson (danger, HSL hue ~338), not a red-orange. danger.600 vs brand.600 is ΔE2000 ≈ 21 in light mode, and danger.400 vs brand.400 is ≈ 20 in dark mode, so cancellations and overbookings never look like a primary action. Success uses a warm leaf green (HSL hue ~108) and warning uses amber (hue ~40), both on the same warm side of the wheel as Hearth. In light mode, muted-foreground is neutral.600: 6.1:1 on muted and 6.5:1 on background. In dark mode it is neutral.400: 5.2:1 on muted and 7.4:1 on background. Dark surfaces step from neutral.950 (background) to neutral.900 (card, popover) to neutral.800 (muted, secondary, border).",
    "typography": "The scale steps by about 1.2 from body-md 14px, rounded to the 2px grid: 11 / 12 / 13 / 14 / 16 / 20 / 24 / 28 / 36. Sora (600, 700) is used only at heading-lg 24px and above, for page titles and headline figures such as occupancy and RevPAR. Letter-spacing tightens with size: -0.005em at 16px, -0.025em at 36px. Plus Jakarta Sans (400–700) sets all functional text. Body line height is 1.5, and 1.45 at 13px. Numeric columns use 'tnum'. JetBrains Mono (400, 500) is used only through the code token, for reservation IDs, room and rate codes, and logs.",
    "layout": "Compact density on a 4px base grid with 2px half-steps (space.0.5, space.1.5, space.2.5). Table rows and controls are 32px. Badges are 20px. Card padding is space.4 (16px). Operations views may span the full viewport width. Reporting pages cap at 1440px.",
    "elevation": "Flat by default. Cards and table panels separate from the page with a 1px border token and shadow.sm (a 1px hairline). shadow.md is for menus and popovers. shadow.lg is for dialogs and sheets only. In dark mode, depth comes from the surface step (neutral.950 to neutral.900), not from shadow.",
    "shapes": "Low rounding: radius.sm 2px on badges, radius.md 4px on buttons and inputs, radius.lg 6px on cards and popovers, radius.xl 8px on dialogs only. Pills (radius.full) are not used. Status is shown with rectangular 20px badges aligned to the grid."
  },
  "primitives": {
    "color": {
      "brand": {
        "50": "#fff4f0",
        "100": "#ffe5dc",
        "200": "#ffc8b6",
        "300": "#ff9e82",
        "400": "#f2704f",
        "500": "#de5230",
        "600": "#bd3f1e",
        "700": "#983012",
        "800": "#73230c",
        "900": "#511706",
        "950": "#360c02"
      },
      "neutral": {
        "50": "#fafaf9",
        "100": "#f4f4f3",
        "200": "#e6e5e3",
        "300": "#d5d3d1",
        "400": "#a5a2a0",
        "500": "#76726f",
        "600": "#5e5b58",
        "700": "#484542",
        "800": "#322f2d",
        "900": "#1e1b1a",
        "950": "#141211"
      },
      "success": {
        "50": "#f2f8ee",
        "100": "#e1f0d8",
        "200": "#c3e1b2",
        "300": "#9acc84",
        "400": "#6fb257",
        "500": "#4e963a",
        "600": "#3c7a2c",
        "700": "#2f6223",
        "800": "#264d1d",
        "900": "#1e3b18",
        "950": "#10220c"
      },
      "warning": {
        "50": "#fffaeb",
        "100": "#fef0c7",
        "200": "#fde08a",
        "300": "#fbcb4f",
        "400": "#f5b12a",
        "500": "#e69512",
        "600": "#c7760a",
        "700": "#a0580c",
        "800": "#814511",
        "900": "#6a3912",
        "950": "#3d1d05"
      },
      "danger": {
        "50": "#fff1f4",
        "100": "#ffe0e8",
        "200": "#ffc1d1",
        "300": "#fc90ac",
        "400": "#f25a85",
        "500": "#dc3366",
        "600": "#b8104e",
        "700": "#960d41",
        "800": "#740a34",
        "900": "#540727",
        "950": "#33051a"
      }
    },
    "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": 8,
      "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,
      "0.5": 2,
      "1.5": 6,
      "2.5": 10
    },
    "shadow": {
      "sm": "0 1px 0 rgba(20, 18, 17, 0.06)",
      "md": "0 2px 6px -1px rgba(20, 18, 17, 0.10)",
      "lg": "0 8px 24px -6px rgba(20, 18, 17, 0.18)"
    }
  },
  "typography": {
    "display-lg": {
      "font": "display",
      "size": 36,
      "lineHeight": 1.1,
      "weight": 700,
      "letterSpacing": -0.025
    },
    "display-md": {
      "font": "display",
      "size": 28,
      "lineHeight": 1.15,
      "weight": 600,
      "letterSpacing": -0.02
    },
    "heading-lg": {
      "font": "display",
      "size": 24,
      "lineHeight": 1.25,
      "weight": 600,
      "letterSpacing": -0.015
    },
    "heading-md": {
      "font": "sans",
      "size": 20,
      "lineHeight": 1.3,
      "weight": 600,
      "letterSpacing": -0.01
    },
    "heading-sm": {
      "font": "sans",
      "size": 16,
      "lineHeight": 1.375,
      "weight": 600,
      "letterSpacing": -0.005
    },
    "body-lg": {
      "font": "sans",
      "size": 16,
      "lineHeight": 1.5,
      "weight": 400,
      "letterSpacing": 0
    },
    "body-md": {
      "font": "sans",
      "size": 14,
      "lineHeight": 1.5,
      "weight": 400,
      "letterSpacing": 0
    },
    "body-sm": {
      "font": "sans",
      "size": 13,
      "lineHeight": 1.45,
      "weight": 400,
      "letterSpacing": 0
    },
    "label": {
      "font": "sans",
      "size": 12,
      "lineHeight": 1.33,
      "weight": 600,
      "letterSpacing": 0.01
    },
    "caption": {
      "font": "sans",
      "size": 11,
      "lineHeight": 1.45,
      "weight": 500,
      "letterSpacing": 0.02
    },
    "code": {
      "font": "mono",
      "size": 13,
      "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.600}",
      "accent": "{color.brand.100}",
      "accent-foreground": "{color.brand.900}",
      "destructive": "{color.danger.600}",
      "destructive-foreground": "#ffffff",
      "success": "{color.success.600}",
      "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.400}",
      "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": 32,
      "paddingX": "{space.3}",
      "radius": "{radius.md}",
      "typography": "{typography.label}",
      "fontWeight": 600
    },
    "input": {
      "height": 32,
      "paddingX": "{space.2}",
      "radius": "{radius.md}",
      "typography": "{typography.body-sm}",
      "borderWidth": 1
    },
    "card": {
      "padding": "{space.4}",
      "radius": "{radius.lg}",
      "shadow": "{shadow.sm}",
      "borderWidth": 1
    },
    "badge": {
      "height": 20,
      "paddingX": "{space.1.5}",
      "radius": "{radius.sm}",
      "typography": "{typography.caption}"
    }
  },
  "guidance": {
    "do": [
      "Use one primary button per view (brand.600 light, brand.400 dark, height 32, label 12/600). Set every other button to secondary or ghost.",
      "Set numeric table columns in Plus Jakarta Sans body-sm or body-md with font-feature-settings 'tnum', right-aligned.",
      "Use Sora only at heading-lg (24px), display-md (28px) and display-lg (36px), for page titles and headline figures such as occupancy or RevPAR.",
      "Pair every success, warning and destructive badge or banner with an icon or text label, so status never depends on color alone.",
      "Keep table rows and controls at 32px, badges at 20px and card padding at space.4. Keep all card and input borders at 1px.",
      "Set reservation IDs, room numbers and rate codes with the code token (JetBrains Mono 13/400).",
      "Show focus on buttons, inputs and table rows with a 2px ring token outline (brand.500 light, brand.400 dark) at a 2px offset."
    ],
    "dont": [
      "Don't use primary or accent for errors, cancellations or overbooking. Use destructive (danger.600 light, danger.400 dark).",
      "Don't put shadow.md or shadow.lg on cards or table panels. shadow.md is for menus and popovers, and shadow.lg is for dialogs.",
      "Don't set body, label or table text in Sora, or use Sora below 24px.",
      "Don't exceed radius.lg (6px) on cards and popovers or radius.md (4px) on buttons and inputs. Don't use radius.full.",
      "Don't use greys outside the neutral ramp. Don't use neutral.500 or lighter for text on background in light mode.",
      "Don't set text in all caps. Use label (12/600) or caption (11/500) in sentence case for metadata."
    ]
  }
}
