Colour primitives
Teal scale
teal.50
#EFFCFD
teal.100
#D0F4F9
teal.200
#A2E8F4
teal.300
#65D5EB
teal.400
#2BBAD6
teal.500
#10A2BC
teal.600
#0C869D
teal.700
#0A6E83
teal.800
#095568
teal.900
#084454
Slate scale (neutrals)
slate.50
#F8FAFC
slate.100
#F1F5F9
slate.200
#E2E8F0
slate.300
#CBD5E1
slate.400
#94A3B8
slate.500
#64748B
slate.600
#475569
slate.700
#334155
slate.800
#1E293B
slate.900
#0F172A
Semantic aliases — use these in components, never the primitives
brand.default
teal.500 · #10A2BC — accents, icons
brand.emphasis AA
teal.600 · #0C869D — interactive
brand.strong AAA
teal.700 · #0A6E83 — brand text
brand.subtle
teal.50 · #EFFCFD — tinted surface
brand.muted
teal.100 · #D0F4F9 — hover tinted bg
text.primary AAA
slate.900 · #0F172A — body text
text.secondary AAA
slate.600 · #475569 — supporting
text.tertiary AA
slate.500 · #64748B — captions
text.disabled
slate.400 · #94A3B8 — non-text only
A
text.inverse
#FFFFFF (white) — on dark surfaces
text.brand
teal.700 · #0A6E83 — brand-coloured text
A
text.on-brand
#FFFFFF (white) — on teal buttons
surface.default
#FFFFFF — base
surface.subtle
slate.50 · #F8FAFC — page bg
surface.recessed
slate.100 · #F1F5F9 — inputs
surface.brand
teal.50 · #EFFCFD — tinted cards
surface.overlay
rgba(15,23,42,0.48) — modal dim
surface.inverse
slate.900 · #0F172A — nav drawer panel
surface.inverse-subtle
slate.800 · #1E293B — tiles on dark panel
border.default
slate.200 · #E2E8F0
border.strong
slate.300 · #CBD5E1 — prominent borders
border.brand
teal.300 · #65D5EB
border.focus
teal.500 · #10A2BC — focus ring
- - -
border.style-dashed
"dashed" (CSS keyword) — info boxes (Screen 3)
interactive.primary
teal.600 · #0C869D — CTA button
interactive.primary-hover
teal.700 · #0A6E83
interactive.primary-pressed
teal.800 · #095568
interactive.primary-disabled
slate.200 · #E2E8F0
interactive.secondary
teal.50 · #EFFCFD — ghost button bg
interactive.secondary-hover
teal.100 · #D0F4F9
Confidence states — designed once, reused across 4 surfaces
✓ Confirmed
Place verified via Google Places with full data. Pacing from real travel times, hours, and busy periods.
fg
bg
border
icon
◑ Confirmed – limited info
Place matched but missing hours or busy-times. Pacing shown as more estimated.
fg
bg
border
icon
~ Estimated
AI-inferred or defaulted value. Not an error — informative. Voice field mentioned but unclear.
fg
bg
border
icon
? Not sure – needs input
No match found or check unavailable. Shown calmly — never as an error state.
fg
bg
border
icon
Meal category colours — distinct from confidence (Screens 4 & 5)

Three semantically independent colour sets. Breakfast re-uses the amber primitive but is intentionally a separate token group — the label defines intent, not just colour.

☕ Breakfast
Used on meal badges, accommodation amenity pills, and reservation highlight cards.
fg
bg
border
icon
🥗 Lunch
Green distinguishes midday meals from morning breakfast on the itinerary cards.
fg
bg
border
icon
🍷 Dinner
Rose/pink makes evening meals immediately scannable in the day timeline.
fg
bg
border
icon
Diff states — Screen 9 Refine / Diff view

Applied as small inline badges ("+ Added", "− Removed", "Changed") in the itinerary diff view. The red introduced here is also the system's first error-state primitive.

+ Added
New place inserted into the itinerary after a swap or regeneration.
fg
bg
border
− Removed
Place removed. Also serves as the system's error / destructive primitive (the only red in the set).
fg
bg
border
Changed
Day-level section header badge when at least one stop was modified.
fg
bg
border
Unchanged
Day has no modifications. Text-only, no bg fill or badge needed.
fg only
Typography scale
Font: Poppins (Google Fonts). Loads via CDN — renders identically on every device and OS. Weights in use: 400 · 500 · 600 · 700.
display
32px · 700 · lh 1.2 · ls −0.01em
Plan your trip
h1
24px · 700 · lh 1.2 · ls −0.01em
3 days in Ksamil, Albania
h2
20px · 600 · lh 1.35
Day 1: Ksamil Village and Beaches
h3
17px · 600 · lh 1.35
Bora Bora Beach
body
15px · 400 · lh 1.5
Comfortable seafront hotel with sea-view rooms and a buffet breakfast included.
body-med
15px · 500 · lh 1.5
Packed & varied · 5–6 stops/day · Multiple neighbourhoods
small
13px · 400 · lh 1.5
Quieter than main beach, best in the afternoon
label
13px · 500 · lh 1.5 · ls 0.02em
Open hours verified · Always open
micro
11px · 500 · lh 1.5 · ls 0.02em
1 of 2 plans left · Tap to see more
caps-label
11px · 600 · uppercase · ls 0.08em
PLACE CONFIDENCE · STAYING AT · DESTINATION

Caps-label is the section heading pattern used across all 11 screens. Tokens: typography.text-transform.uppercase + typography.letter-spacing.caps (0.08em)

Spacing scale — 4px base
1
4px — xs gap
2
8px — badge pad
3
12px — list gaps
4
16px — card pad
5
20px — section gap
6
24px — card-to-card
8
32px — screen margin
10
40px — hero space
12
48px — safe area
16
64px — max breathing
Border radius
sm
8px · inputs, buttons, badges
lg
16px · cards, sheets, modals
full
9999px · pills, tags, chips
Elevation / shadows
shadow.sm
Cards at rest, badges
shadow.md
Floating elements, map pins
shadow.lg
Bottom sheets, swap overlays, nav menu
Motion — duration & easing

Based on IBM Carbon's duration scale and Google Material 3's easing curves. Applied to chip toggles, sheet entrances, segment transitions, and the loading animation.

Duration
motion.duration.instant
70 ms
Chip toggles, hover state switches, icon swaps
motion.duration.fast
150 ms
Button feedback, confidence badge appear
motion.duration.moderate
250 ms
Sheet entrance, segment control switch, map slide
motion.duration.slow
400 ms
Loading checklist steps, screen transitions
Easing — hover a card to preview
motion.easing.standard
cubic-bezier(0.4, 0, 0.2, 1)
Default for most UI transitions. Decelerates into rest. Use with duration.fast or duration.moderate.
motion.easing.decelerate
cubic-bezier(0, 0, 0.2, 1)
Elements entering the screen — sheets sliding up, overlays fading in. Starts fast, settles smoothly.
motion.easing.accelerate
cubic-bezier(0.4, 0, 1, 1)
Elements leaving the screen — nav drawer closing, modals dismissing. Starts slow, exits quickly.
Z-index stack

Six named layers from base content up to toast notifications. Prevents stacking order conflicts between the map pins, swap overlay sheet, and nav menu drawer.

zIndex.toast
Error messages, success toasts
500
zIndex.drawer
Nav menu (Screen 11) — slides over everything
400
zIndex.modal
Swap overlay sheet (Screen 8)
300
zIndex.overlay
surface.overlay backdrop behind modal
200
zIndex.raised
Map pins, sticky headers, day filter chips
100
zIndex.base
Normal document flow — cards, lists, content
0
Icon sizes

Three sizes cover all icon usage across the 11 screens. Use md (20px) as the default for action icons. sm (16px) for inline, badge, and detail-level icons.

⚠ Placeholder representations — Unicode glyphs and Lucide SVGs are used here to approximate the icon shapes visible in the prototype. Final icons will be defined in a separate icon library deliverable and referenced via icon.* tokens.

icon.sm
16px
Inline, badge, detail
icon.md
20px
Actions, nav, controls
icon.lg
24px
Feature-row icons
sm · 16px — inline & badge icons
●○ Confidence dots (green · amber · grey)
Star rating
Dropdown chevron
−/+ Stepper buttons
Checkmark (accommodation selected)
📶 WiFi amenity
🏊 Pool amenity
Breakfast — meal badge & amenity
🥗 Lunch — meal badge
🍷 Dinner — meal badge
Walking — short travel segments (5–20 min)
Drive — longer travel segments (25 min+)
Swap — stop swap button
Drag handle — stop reorder
External link — Book buttons
Chevron right — nav list rows
md · 20px — action & nav icons
Back arrow — navigation
× Close / dismiss — overlay & nav drawer
List icon — List/Map segment tab
📍 Map pin — segment tab & map legend
Swap — quota pill & nav tile
Generation — quota pill & nav tile
Tweaks/sliders — quota pill & nav tile
+ Plus — Plan a new trip
🗺 Map outline — Map view nav row
Settings gear — Settings & preferences
lg · 24px — feature-row icons
📅 Calendar — Add to Google Calendar
Download — Download as PDF

Note: ⇄ swap and ✦ generation appear at both sm (16px) inside compact stop-row buttons, and md (20px) in quota pills and nav tiles. Size follows context — compact actions use sm, standalone tiles use md.

Interactive components — token usage preview
✓ Confirmed ~ Estimated ? Needs input ☕ Breakfast 🥗 Lunch 🍷 Dinner + Added − Removed Changed
Interest chips — click to toggle
Teal = selected · White = default · Toggle with click. Tokens: interactive.primary bg · text.on-brand · motion.duration.instant (70ms)
Segment control (List / Map toggle)
Active = surface.inverse (slate.900) · Inactive = transparent · Wrap = surface.recessed (slate.100)