{
  "schemaVersion": "1.0",
  "id": "redeye-passport",
  "version": "1.1.0",
  "name": "Redeye Passport",
  "tier": "free",
  "summary": "Dark-first travel planning UI: deep teal-tinted night surfaces, a luminous aqua accent and cinematic display type for trips after dark.",
  "tags": {
    "industries": [
      "travel",
      "hospitality",
      "navigation"
    ],
    "moods": [
      "nocturnal",
      "cinematic",
      "luminous",
      "calm"
    ],
    "density": "comfortable",
    "contrast": "standard"
  },
  "rationale": {
    "overview": "Redeye Passport is for planning and tracking journeys on phones and laptops late at night, when the screen is the brightest thing in the room. Dark mode is the primary mode. Surfaces use the neutral ramp, a slate tinted toward the brand teal, and a single aqua accent (brand.400) marks the one main action per view. Light mode is supported and is built from the same ramps: background neutral.50, cards #ffffff, primary brand.700.",
    "color": "Brand is an aqua-teal ramp (OKLCH hue about 170–178). Chroma peaks at brand.400–500 and tapers evenly toward 50 and 950. Neutrals sit at hue about 205 with low chroma (about 0.01–0.02), shifted toward the brand so dark surfaces carry a faint teal cast. Destructive (danger, hue about 5) is a magenta-crimson far from the teal primary (ΔE2000 > 40 in both modes). Success is a leafy green at hue about 135 and warning a clean amber at hue about 75. Warning steps 300–500 were re-saturated to remove the muddy olive mid-tones. Checked pairs: primary-foreground on primary is 5.5:1 in light and 8.0:1 in dark. muted-foreground (neutral.600 light, neutral.300 dark) is ≥ 6:1 on both background and muted. ring is 3.5:1 in light and 9.8:1 in dark against the background.",
    "typography": "The scale is a major third (1.25) from 16px up to 24px, then a perfect fourth (1.333): 12, 14, 16, 18, 20, 24, 32, 42, 56. Familjen Grotesk sets heading-md (24px, 500) through display-lg (56px, 700). Tracking tightens with size: −0.008em at 24px, −0.015em at 32px, −0.022em at 42px, −0.03em at 56px. Rubik (400/500/600) sets heading-sm and all functional text: forms, tables, buttons, itinerary rows. Body line height is 1.5–1.6. JetBrains Mono (400/500) at code size 14px is reserved for booking references, flight numbers, coordinates and timestamps.",
    "layout": "Comfortable density on a 4px base grid. Itinerary and map-side cards use 24px padding (space.6). Gaps between sections are 16–24px (space.4–space.6). Content columns cap at 1120px so long destination guides keep a readable measure on wide monitors. Buttons and inputs share a 40px height so they align in a row.",
    "elevation": "Depth comes from tonal layering first. In dark mode, background is neutral.950, card and popover are neutral.900, and secondary and muted are neutral.800, each one step lighter. Borders are neutral.800, so they separate cards without adding glare. Shadows are dark and diffuse: sm for inputs, md for cards. Only shadow.lg adds a faint aqua glow, and it is limited to the hero destination card and the active map pin.",
    "shapes": "Rounding is soft and generous: 6px (radius.sm) on checkboxes and tags, 12px (radius.md) on buttons and inputs, 18px (radius.lg) on cards, 24px (radius.xl) on hero panels. radius.full is reserved for badges and map chips. No surface uses radius.none."
  },
  "primitives": {
    "color": {
      "brand": {
        "50": "#ecfdf9",
        "100": "#d1faf1",
        "200": "#a4f2e3",
        "300": "#6ee6d0",
        "400": "#36d2b8",
        "500": "#14b8a0",
        "600": "#0a9482",
        "700": "#09766a",
        "800": "#0a5c54",
        "900": "#0a4742",
        "950": "#042b28"
      },
      "neutral": {
        "50": "#f0f6f7",
        "100": "#e1eaec",
        "200": "#c3d2d6",
        "300": "#9db0b6",
        "400": "#788c93",
        "500": "#5b6f77",
        "600": "#455760",
        "700": "#34434b",
        "800": "#212d33",
        "900": "#151f25",
        "950": "#0b1418"
      },
      "success": {
        "50": "#eefbe8",
        "100": "#d9f5cc",
        "200": "#b8eba2",
        "300": "#98e07c",
        "400": "#7ccf5a",
        "500": "#5fb83c",
        "600": "#3f8a24",
        "700": "#2f6b1e",
        "800": "#22501a",
        "900": "#173a12",
        "950": "#0b2108"
      },
      "warning": {
        "50": "#fff7e6",
        "100": "#ffeac2",
        "200": "#fdd58c",
        "300": "#f5bc55",
        "400": "#e3a12a",
        "500": "#c4850f",
        "600": "#9e6a08",
        "700": "#7b5208",
        "800": "#5c3d09",
        "900": "#402a07",
        "950": "#261802"
      },
      "danger": {
        "50": "#fff4f5",
        "100": "#ffe3e6",
        "200": "#ffc6ce",
        "300": "#ff9dac",
        "400": "#f66e89",
        "500": "#e1436b",
        "600": "#c02d56",
        "700": "#9c2043",
        "800": "#791231",
        "900": "#580521",
        "950": "#390011"
      }
    },
    "font": {
      "display": {
        "family": "Familjen Grotesk",
        "fallback": "system-ui, sans-serif",
        "source": "google",
        "weights": [
          500,
          600,
          700
        ]
      },
      "sans": {
        "family": "Rubik",
        "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": 6,
      "md": 12,
      "lg": 18,
      "xl": 24,
      "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(4, 12, 16, 0.32)",
      "md": "0 8px 24px -6px rgba(4, 12, 16, 0.45)",
      "lg": "0 24px 60px -12px rgba(4, 12, 16, 0.55), 0 0 32px rgba(54, 210, 184, 0.16)"
    }
  },
  "typography": {
    "display-lg": {
      "font": "display",
      "size": 56,
      "lineHeight": 1.05,
      "weight": 700,
      "letterSpacing": -0.03
    },
    "display-md": {
      "font": "display",
      "size": 42,
      "lineHeight": 1.1,
      "weight": 600,
      "letterSpacing": -0.022
    },
    "heading-lg": {
      "font": "display",
      "size": 32,
      "lineHeight": 1.18,
      "weight": 600,
      "letterSpacing": -0.015
    },
    "heading-md": {
      "font": "display",
      "size": 24,
      "lineHeight": 1.28,
      "weight": 500,
      "letterSpacing": -0.008
    },
    "heading-sm": {
      "font": "sans",
      "size": 20,
      "lineHeight": 1.35,
      "weight": 600,
      "letterSpacing": -0.003
    },
    "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": 14,
      "lineHeight": 1.3,
      "weight": 500,
      "letterSpacing": 0.005
    },
    "caption": {
      "font": "sans",
      "size": 12,
      "lineHeight": 1.4,
      "weight": 500,
      "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.700}",
      "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.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": 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.md}",
      "borderWidth": 1
    },
    "badge": {
      "height": 22,
      "paddingX": "{space.2}",
      "radius": "{radius.full}",
      "typography": "{typography.caption}"
    }
  },
  "guidance": {
    "do": [
      "Design dark mode first: background {color.neutral.950}, card and popover {color.neutral.900}, secondary and muted {color.neutral.800}. Then check light mode.",
      "Use primary ({color.brand.400} dark, {color.brand.700} light) for one main button per view, such as Book or Save trip. Style other actions as secondary or ghost.",
      "Show focus as a 2px ring in the ring token, offset 2px, on every button, input, map chip and itinerary row.",
      "Set Familjen Grotesk only at heading-md (24px) and above, using the weight and negative letterSpacing defined for each style (e.g. display-lg 56px/700/−0.03em).",
      "Set flight numbers, booking references, coordinates and times in JetBrains Mono at code (14px, 400) with tabular figures, so columns align in itinerary tables.",
      "Apply shadow.lg (with the aqua glow) only to the hero destination card and the active map pin."
    ],
    "dont": [
      "Don't use brand teal for errors, cancellations or delays. Use destructive for errors and cancellations, and warning for delays and schedule changes.",
      "Don't use pure black (#000000) surfaces or pure white (#ffffff) text in dark mode. Use neutral.950 and neutral.50.",
      "Don't set more than one line of body-md or smaller on accent surfaces (brand.100 light, brand.900 dark). Keep accent for selected itinerary items and short labels.",
      "Don't use Familjen Grotesk below 24px or in all caps. Use Rubik heading-sm (20px, 600) for smaller headings.",
      "Don't use muted-foreground for text smaller than caption (12px) or for disabled-looking primary actions. Use the disabled state at 50% opacity instead.",
      "Don't combine shadow.md and shadow.lg on one surface. In dark mode, separate layers with neutral.950 → neutral.900 → neutral.800 first."
    ]
  }
}
