← Coverage map

Design inventory

Yesim Coverage — UI tokens and components (mirror of production styles)

This page lists colors, typography, radii, and reusable UI blocks used in public/index.html. Keep it in sync when tokens or classes change. Map data: Natural Earth 50m (countries-50m.json, Crimea split). New features: island dot markers (7 px circles for tiny nations, visible zoom ≥ 3), 6-tier country label reveal, search aliases (Cabo Verde, Ivory Coast, Burma, Czechia, Holland, DPRK/ROK), semi-transparent country fills, graticule grid, ocean gradient. There is no separate chat UI in this app; map tooltip and tap-toast are the closest to “bubbles.”

Colors — CSS variables

Brand orange --orange1000 #FF7A00
Primary button --brand--buttonPrimaryFillDefault
Brand emphasis --brand-emph#ec6b2d
Brand subtle bg --brand-subtle#fbe7d7
On-brand text tint --on-brand#fff7f2
Map covered --covered
Map covered hover --covered-h
Map selected --covered-sel
Map global tone --covered-g
Map global hover --covered-g-h
Not covered (gray) --yellow#b0b8c8
Not covered hover --yellow-h#9aa3b4
Surface --bg
Surface muted --bg-2
Text primary --text-1
Text secondary --text-2
Text tertiary --text-3
Border --border
Border strong --border-md
Map ocean --ocean--blue300
Ocean deep / gradient end --ocean-deep--blue400

Literals (not tokenized)

WhereValue
theme-color, active tab text on orange#FF7A00, #fff
.data-banner.errbg #fff3e0, text #8a4a00
Tooltips / toasts / shadowsrgba(26,26,26,.93), rgba(0,0,0,.1).28
Map stroke (SVG) .cpathrgba(255,255,255,.45) stroke, 0.35px width
Map fill-opacity (semi-transparent fills)covered 0.82, nocov 0.88; hover/sel go to 1
Ocean gradient (SVG #oceanGrad)--blue300--blue400 (top → bottom)
Graticule grid linesrgba(255,255,255,.18), 0.3px
Island dot strokergba(255,255,255,.75), 1px
Country label fill / strokergba(30,30,30,.9) / rgba(255,255,255,.92)
Spinner trackrgba(238,131,50,.2)
Map data source/countries-50m.json — Natural Earth 50m TopoJSON (Crimea split)

Typography

Font: Inter (Google Fonts) weights 400, 500, 600, 700, 800. Fallback: system-ui, sans-serif.

SizeWeights in useExamples in app
10px400, 600Trust row, tooltip subline, card meta, price tag
11px400, 600, 700Header subtitle, coverage pill, tabs, labels, hints
12px400, 500, 700Data banner, tooltip body, empty state, plan messages
13px400, 600, 700Search, list rows, sidebar title weight mix, CTA
14px500 (body), 700Base body
24px600Sidebar h3--f24-semiBold
32px.round-flag--32Country flags in sidebar / search (DS RoundFlag)
18–20px800Plan price, footer price
34pxEmpty state emoji

Radius tokens

--r-pill500px — pills, search, tabs, CTA
--r-card20px — cards, panels, legend
--r-sec24px — search dropdown

UI components

Header title (product chrome)

Coverage

eSIM · tap countries to explore

Data banner

Live pricing from API · Refresh
Could not load data. Try again later.

Search field + dropdown list

🇩🇪Germany
🇬🇪Georgia

Production: #search, #searchDrop, .checkbox — DS RadioButton variant="check" (24px, radius 6px, --borderSecondary / --fillRadiobuttonActive*, IconCheck white). Row .on + hover/press on box. Search matches canonical name and SEARCH_ALIASES.

Tag — orange subtle (coverage count)

192 countries available
countries available

Dark theme (all UI tokens)

Chrome uses [data-theme='dark'] from export colors.scss. Map country/ocean fills stay the same. On the live map: button in header, ?theme=dark, or system dark mode.

Coverage

eSIM · tap countries to explore

190 countries available
Covered Not covered Ocean
France
Tap to add · UDP

Your trip

🇫🇷
France
from $4.50/day

Map tooltip & tap toast (“bubble-like”)

Germany
Tap to add · UDP
Otherland
Not covered yet
Germany
Added to trip

Map chrome: legend, zoom, FAB legend

Covered
Selected
Not covered yet

Background: SVG #oceanGrad linear gradient --blue300 → --blue400. Graticule grid lines at rgba(255,255,255,.18). Map data: /countries-50m.json (Natural Earth 50m, Crimea split). Zoom extent: 1–24×.

Legend FAB (mobile) — IconButton light + IconInfo:

default · expanded

Loader (map blocking state)

Loading map…

Map fill states (reference)

covered hover selected not covered

Semi-transparent fills: covered fill-opacity: 0.82, not-covered fill-opacity: 0.88. Hover and selected states use fill-opacity: 1. Not-covered color changed from yellow (#ffda3d) to neutral gray (#b0b8c8).

Island dot markers (tiny island nations)

Circle markers are rendered on top of tiny country polygons (area < 0.002 steradians) that are too small to tap reliably at low zoom. Dots are always 7 px on-screen (radius scaled by 7/zoomK) and fade in at zoom ≥ 3.

covered
selected
not covered

CSS class .island-dot + .covered / .nocov / .sel. Shares the same click / hover / tooltip handlers as .cpath country polygons. Examples: Maldives, Nauru, Tuvalu, Seychelles, São Tomé & Príncipe.

Country name labels — 6-tier zoom reveal

TierArea thresholdReveal at zoomExamples
1≥ 0.18 sr1.0Russia, Canada, USA, China, Brazil, Australia
2≥ 0.04 sr1.5India, Kazakhstan, Algeria, Saudi Arabia
3≥ 0.012 sr2.5Sudan, Iran, France, Turkey, Ethiopia
4≥ 0.004 sr4.0Germany, Poland, Norway, Sweden, Ukraine
5≥ 0.002 sr6.0Smaller countries
6< 0.002 sr8.0Micro-islands: Maldives, Nauru, etc.

Labels render at a constant 11 px on-screen (SVG font-size = 11/zoomK px). White text-stroke (stroke-width: 0.12em, paint-order: stroke fill) ensures legibility over any fill. Countries smaller than 0.00005 sr are excluded entirely.

Trip panel: sheet handle, mode tabs (hidden in prod UI), badge, clear

On narrow viewports the same aside becomes a bottom sheet; spacing and chip-style cards are overridden in @media (max-width: 768px) in index.html.

Empty state

🌍
Tap an orange country on the map to plan your trip

Icons

Country flags: /flags/{iso}.svg in .round-flag (32px). Remove: .ccard-remove + .icClose (icon only). Inline SVG (search), symbols (legend ⓘ, zoom, empty 🌍).