@unmap/themes 0.22.0 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +158 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/palette.ts","../src/recipe.ts","../src/recipes.ts","../src/doc.ts","../src/validate.ts","../src/presets.ts","../src/oklch.ts","../src/compose.ts","../src/contrast.ts","../src/generate.ts","../src/palettes.ts","../src/layers.ts","../src/preset.ts","../src/codec.ts","../src/seeds-from-palette.ts"],"sourcesContent":["/**\n * Named colour ramps: the single source of colour truth for unmap cartography.\n *\n * Moved here from apps/gateway/src/palette.ts (which now re-exports these) so themes, the\n * gateway, and the builder all draw from one vocabulary. Flavors and theme recipes reference\n * these by name and never inline a hex literal.\n *\n * Ramps run light to dark by ascending key.\n */\n\n/**\n * Ember. Pre-rebrand brand accent; survives only as the `street` motorway orange, which is\n * cartographic convention (orange motorways) rather than brand. Never the interface accent —\n * that is magenta, which stays out of every basemap.\n */\nexport const ember = {\n 200: \"#ffe9c9\",\n 300: \"#ffc08c\",\n 400: \"#f7a35c\",\n 500: \"#f97316\",\n 600: \"#e07b2e\",\n 700: \"#b45309\",\n} as const;\n\n/* ── Process Ink ramps ─────────────────────────────────────────────────────────────────────\n *\n *\n * Generated in OKLCH rather than picked by eye, from three hues the brand already implies:\n * cool neutrals at 212, water at 200, vegetation at 152, with one warm family at 82 for sand\n * and farmland. OKLCH matters here because a ramp picked in sRGB has uneven perceived steps —\n * two adjacent greens can look identical while two adjacent greys look like a seam.\n *\n * Lightness is chosen so the label contrast the cartography tests enforce is a property of the\n * ramp rather than something rescued per flavour afterwards. `ink.700` on `ink.25` clears 4.5:1,\n * `ink.500` on `ink.1000` clears it inverted, and every flavour's labels are drawn from those\n * steps. That is the whole reason the generator solves for lightness instead of guessing.\n *\n * Magenta is deliberately absent. It is the interface accent — markers, selection, overlays —\n * and keeping it out of the basemap is what lets a customer's data always win the colour fight.\n *\n * Regenerate rather than hand-edit: the ramp is the source, the hex is the output.\n */\n\n/** Cool neutrals, hue 212. The spine of every Process Ink flavour except `base`. */\nexport const ink = {\n 25: \"#F1F8FA\",\n 50: \"#EAF2F3\",\n 100: \"#E2E9EB\",\n 200: \"#D6DEE0\",\n 300: \"#C9D1D3\",\n 400: \"#B7C0C2\",\n 500: \"#9DA7A9\",\n 600: \"#7E888B\",\n 700: \"#5C6769\",\n 800: \"#3D494B\",\n 850: \"#2B3639\",\n 900: \"#1A2628\",\n 950: \"#0E191C\",\n 1000: \"#030E10\",\n} as const;\n\n/**\n * Warm off-white neutrals, hue 50, chroma 0.008. The `base` pair only.\n *\n * Same lightness ladder as `ink`, re-hued to the conventional street-map land tone `base`\n * follows (`hsl(20, 20%, 95%)`): a faint warm tint rather than the cream it had, so parks,\n * water and the motorway orange read as colour against it instead of competing with it.\n */\nexport const paper = {\n 25: \"#FBF5F2\",\n 50: \"#F5EFEC\",\n 100: \"#ECE6E3\",\n 200: \"#E1DBD8\",\n 300: \"#D4CECB\",\n 400: \"#C3BDBA\",\n 500: \"#A9A3A0\",\n 600: \"#8A8582\",\n 700: \"#696361\",\n 800: \"#4A4543\",\n 850: \"#373330\",\n 900: \"#272220\",\n 950: \"#1A1614\",\n 1000: \"#0E0B09\",\n} as const;\n\n/** Water, hue 200. Cooler and more chromatic than the land it meets. */\nexport const wave = {\n 100: \"#C7F1F3\",\n 200: \"#B3E2E4\",\n 300: \"#9CCFD2\",\n 400: \"#7FB8BB\",\n 500: \"#5F9FA2\",\n 600: \"#368286\",\n 700: \"#1C6265\",\n 800: \"#024347\",\n 900: \"#002A2C\",\n 950: \"#001C1E\",\n 980: \"#001012\",\n} as const;\n\n/**\n * Sky water, hue 230. The `base` pair only.\n *\n * Same lightness ladder as `wave`, re-hued and brightened to the Streets reference's water\n * (`hsl(200, 100%, 80%)`). `sky.200` is that colour; the rest of the ladder is the dark-mode\n * inversion and the ocean-label step.\n */\nexport const sky = {\n 100: \"#CCEEFF\",\n 200: \"#A7E2FF\",\n 300: \"#8ACFF0\",\n 400: \"#73B7D7\",\n 500: \"#5A9CBC\",\n 600: \"#387D9C\",\n 700: \"#155F7C\",\n 800: \"#004057\",\n 900: \"#002837\",\n 950: \"#001B27\",\n 980: \"#000F17\",\n} as const;\n\n/** Vegetation, hue 152: park, wood, scrub. */\nexport const verdant = {\n 100: \"#D3F1DA\",\n 200: \"#C3E3CA\",\n 300: \"#AFD2B7\",\n 400: \"#96BC9F\",\n 500: \"#76A281\",\n 600: \"#50825E\",\n 700: \"#366042\",\n 800: \"#1E4128\",\n 900: \"#0B2815\",\n} as const;\n\n/**\n * Leaf green, hue 136: `outdoor`'s vegetation (2026-09-09). `verdant` is a mint that reads cool\n * and flat once it has to stand for a forest rather than a city park; the outdoor maps people\n * already read use a yellower, fuller green. Generated from verdant's own lightness step for\n * step (chroma ×1.6, capped at 0.14 to stay in gamut), so every contrast property the ramps were\n * solved for carries over and only the hue and chroma move. Outdoor alone; the street styles\n * keep verdant, where a park is a tint and a mint is right.\n */\nexport const fern = {\n 100: \"#D3F3C5\",\n 200: \"#C3E6B3\",\n 300: \"#AFD59E\",\n 400: \"#96BF83\",\n 500: \"#76A560\",\n 600: \"#518535\",\n 700: \"#37621E\",\n 800: \"#1E4305\",\n 900: \"#0F2900\",\n} as const;\n\n/** Warm landcover, hue 82: sand, beach, farmland. */\nexport const sandstone = {\n 100: \"#F5E8D0\",\n 200: \"#E7D9BF\",\n 300: \"#D6C7AC\",\n 400: \"#BFAF92\",\n 500: \"#A19070\",\n} as const;\n\n/**\n * Pure neutrals, zero chroma. Everything on `muted` except its water (see `mist`), plus the\n * road casings on `base`. Kept R=G=B so `muted` is greyscale in fact rather than in name.\n */\nexport const graphite = {\n 25: \"#FAFAFA\",\n 50: \"#F2F2F2\",\n 100: \"#E9E9E9\",\n 200: \"#DEDEDE\",\n 300: \"#D1D1D1\",\n 400: \"#BEBEBE\",\n 500: \"#A4A4A4\",\n 600: \"#868686\",\n 700: \"#656565\",\n 800: \"#464646\",\n 900: \"#232323\",\n 1000: \"#0B0B0B\",\n} as const;\n\n/**\n * Muted water: the `wave` lightness ladder at zero chroma. `muted` is greyscale end to end,\n * water included, so this ramp exists for one reason — it is the ramp the *water* seed\n * recolours when a theme is applied to `muted`, which the land ramp (`graphite`) is not.\n * `mist.200` is the light-mode fill; `mist.980` the dark-mode inversion so water stays darker\n * than land.\n */\nexport const mist = {\n 100: \"#E7E7E7\",\n 200: \"#D7D7D7\",\n 300: \"#C4C4C4\",\n 400: \"#ACACAC\",\n 500: \"#929292\",\n 600: \"#757575\",\n 700: \"#575757\",\n 800: \"#3A3A3A\",\n 900: \"#242424\",\n 950: \"#171717\",\n 980: \"#0D0D0D\",\n} as const;\n\n/**\n * Jade, hue 163. The emerald and mint greens of `orchid`'s woods and landcover, the parks and woods of\n * `tropic`, the woods of `bold` and the parks and scrub of `pastel`. Same lightness ladder as `ink`, so every label step the other\n * styles rely on clears the floors here too. Chroma rises with lightness up to the mid steps\n * (`0.16·L`) and eases off toward white (`0.42·(1−L)`), which is the profile of the\n * reference's own four greens (`#142a21` → `#50a882`).\n */\nexport const jade = {\n 25: \"#F1F9F4\",\n 50: \"#E6F4ED\",\n 100: \"#D7EEE2\",\n 200: \"#C3E6D4\",\n 300: \"#ACDDC4\",\n 400: \"#8BCFAF\",\n 500: \"#56BB90\",\n 600: \"#459975\",\n 700: \"#327357\",\n 800: \"#21513D\",\n 850: \"#173C2C\",\n 900: \"#0E2A1E\",\n 950: \"#071C13\",\n 1000: \"#030F09\",\n} as const;\n\n/**\n * Cobalt, hue 267. The `blueprint` pair: royal blue field with navy roads and pale blue water\n * in dark, blue lines on blue-white paper in light. Same lightness ladder as `ink`. Chroma\n * peaks at the field step (`700`, `0.23` — the reference's `#1c44dc`) and falls away on both\n * sides, so the pale steps stay paper-like and the navy steps stay ink-like.\n */\nexport const cobalt = {\n 25: \"#F4F7FB\",\n 50: \"#ECF0F9\",\n 100: \"#E1E8F7\",\n 200: \"#D2DCF5\",\n 300: \"#C0CFF3\",\n 400: \"#A8BDF1\",\n 500: \"#84A2EE\",\n 600: \"#587EEA\",\n 700: \"#2C4EE5\",\n 800: \"#243D93\",\n 850: \"#1D2F65\",\n 900: \"#162241\",\n 950: \"#0F1629\",\n 1000: \"#080B15\",\n} as const;\n\n/**\n * Rose, hue 20. The `blush` pair's land, buildings and labels: a pink that stays a field at the\n * light steps and becomes a wine at the dark ones. Same lightness ladder as `ink`; chroma rises\n * with lightness to the mid steps and eases off toward white.\n */\nexport const rose = {\n 25: \"#FFF3F3\",\n 50: \"#FFEBEA\",\n 100: \"#FFDFDE\",\n 200: \"#FECFCE\",\n 300: \"#FCBDBC\",\n 400: \"#F8A4A4\",\n 500: \"#E48687\",\n 600: \"#BA6D6D\",\n 700: \"#8D5151\",\n 800: \"#643838\",\n 850: \"#4B2929\",\n 900: \"#351B1B\",\n 950: \"#241111\",\n 1000: \"#150808\",\n} as const;\n\n/**\n * Lilac, hue 300, low chroma. The `orchid` pair's land, buildings and labels — a lavender grey\n * rather than a purple, so the vivid teal parks and sky water are what carry the colour. Chroma\n * grows a little toward the dark steps so the labels read as violet rather than as grey.\n */\nexport const lilac = {\n 25: \"#F8F5FF\",\n 50: \"#F2EDFF\",\n 100: \"#EAE4F9\",\n 200: \"#DFD8EE\",\n 300: \"#D2CBE1\",\n 400: \"#C1BACF\",\n 500: \"#A7A1B5\",\n 600: \"#888296\",\n 700: \"#676174\",\n 800: \"#4A415A\",\n 850: \"#382E4A\",\n 900: \"#281C3C\",\n 950: \"#1C0E30\",\n 1000: \"#110225\",\n} as const;\n\n/**\n * Aqua, hue 205. Vivid teal on the `wave` ladder for `orchid`'s and `lagoon`'s parks — the\n * only park colour on the map that is not a green. Chroma peaks at the mid steps.\n */\nexport const aqua = {\n 100: \"#C7F1F5\",\n 200: \"#ACE3E9\",\n 300: \"#89D2DB\",\n 400: \"#57BEC9\",\n 500: \"#00A6B3\",\n 600: \"#00858F\",\n 700: \"#00636B\",\n 800: \"#004349\",\n 900: \"#05292D\",\n 950: \"#081B1D\",\n 980: \"#060E0F\",\n} as const;\n\n/* ── The vivid four (2026-09-09) ────────────────────────────────────────────────────────────\n *\n * `tropic`, `sunset`, `bold` and `pastel` were sketched from CARTOColors (Tropic and Temps,\n * Sunset, Bold and Vivid, Pastel). CARTO's are data palettes built to sit on a muted basemap,\n * so these styles spend the colour where overlays rarely go — water, vegetation, the highway —\n * and keep land and labels quiet. Every ramp below is an existing lightness ladder re-hued, so\n * the label floors the ladders were solved for carry over; only hue and chroma move.\n */\n\n/** Cream neutrals, hue 90, chroma 0.022: `tropic`'s and `sunset`'s land and labels. `paper`'s ladder. */\nexport const linen = {\n 25: \"#FCF6E6\",\n 50: \"#F6F0E0\",\n 100: \"#EDE7D7\",\n 200: \"#E2DCCC\",\n 300: \"#D5CFC0\",\n 400: \"#C4BEAF\",\n 500: \"#AAA495\",\n 600: \"#8B8677\",\n 700: \"#696457\",\n 800: \"#4B4639\",\n 850: \"#383427\",\n 900: \"#272317\",\n 950: \"#1B170B\",\n 1000: \"#0F0B03\",\n} as const;\n\n/** Coral, hue 28, on `rose`'s ladder at 1.3× its chroma: the highway on `tropic`, `sunset` and `pastel`. */\nexport const coral = {\n 25: \"#FFF3F1\",\n 50: \"#FFEBE8\",\n 100: \"#FFDFDB\",\n 200: \"#FFCFC8\",\n 300: \"#FFBDB3\",\n 400: \"#FFA195\",\n 500: \"#F47C6E\",\n 600: \"#C76559\",\n 700: \"#974A42\",\n 800: \"#6C332D\",\n 850: \"#512520\",\n 900: \"#391814\",\n 950: \"#270F0C\",\n 1000: \"#170705\",\n} as const;\n\n/** Peach, hue 58, on `verdant`'s ladder: `sunset`'s vegetation, which is not green on purpose. */\nexport const peach = {\n 100: \"#FFE2CC\",\n 200: \"#FFCEAA\",\n 300: \"#F4B98D\",\n 400: \"#E0A171\",\n 500: \"#CA8248\",\n 600: \"#AC5E0D\",\n 700: \"#804300\",\n 800: \"#572B00\",\n 900: \"#361900\",\n} as const;\n\n/** Indigo, hue 295, on `cobalt`'s ladder at 0.7× its chroma: `sunset`'s water and night, and the boundary purple elsewhere. */\nexport const indigo = {\n 25: \"#F7F6F9\",\n 50: \"#F0EFF6\",\n 100: \"#E8E6F1\",\n 200: \"#DDD9EC\",\n 300: \"#D0CBE6\",\n 400: \"#C0B8DE\",\n 500: \"#A89BD3\",\n 600: \"#8B76C5\",\n 700: \"#6D4BB5\",\n 800: \"#4B3977\",\n 850: \"#362C53\",\n 900: \"#251F36\",\n 950: \"#181422\",\n 1000: \"#0C0A11\",\n} as const;\n\n/** Azure, hue 245, on `wave`'s ladder at 1.7× its chroma: `bold`'s clear blue water. */\nexport const azure = {\n 100: \"#D4EBFF\",\n 200: \"#B6DDFF\",\n 300: \"#92CBFB\",\n 400: \"#74B3E8\",\n 500: \"#5299D2\",\n 600: \"#227AB9\",\n 700: \"#005B91\",\n 800: \"#003D64\",\n 900: \"#002641\",\n 950: \"#00192D\",\n 980: \"#000E1C\",\n} as const;\n\n/** Amber, hue 85, on `ember`'s ladder: `bold`'s highway. */\nexport const amber = {\n 200: \"#FEEAC1\",\n 300: \"#F3C96F\",\n 400: \"#E7AF0E\",\n 500: \"#C99700\",\n 600: \"#C19100\",\n 700: \"#916D00\",\n} as const;\n\n/** Bay Atlas reference colours, re-authored as light/dark ramps for Canada's basemap. */\nexport const atlasPaper = {\n 25: \"#F6F3EA\", 100: \"#EDE7DC\", 200: \"#DDD4C4\", 500: \"#A08A70\",\n 700: \"#786B5E\", 800: \"#57504A\", 900: \"#2A2521\", 950: \"#211C17\", 1000: \"#15110D\",\n} as const;\nexport const atlasWater = {\n 200: \"#B3D2E6\", 400: \"#86B3D4\", 700: \"#3E6D96\", 800: \"#274F73\", 950: \"#142B3D\", 980: \"#0B1C29\",\n} as const;\nexport const atlasGreen = {\n 100: \"#E9EFD4\", 200: \"#DCE8CB\", 300: \"#CFE4B8\", 700: \"#3B6B2B\", 800: \"#2A4822\", 900: \"#1B3018\",\n} as const;\nexport const atlasRoad = {\n 300: \"#F7D686\", 400: \"#E67F50\", 500: \"#C8412A\", 600: \"#A8231C\", 800: \"#5E1712\",\n} as const;\n/** Swiss national-map conventions: white ground, blue water, leaf greens, yellow roads. */\nexport const swissPaper = {\n 25: \"#FDFDFE\", 100: \"#F2F2F2\", 200: \"#E6E4E2\", 500: \"#96938E\",\n 700: \"#686660\", 800: \"#3C3C3C\", 900: \"#252525\", 950: \"#191919\", 1000: \"#101010\",\n} as const;\nexport const swissWater = {\n 200: \"#D2EEFF\", 400: \"#4DA4DA\", 700: \"#2D78A4\", 800: \"#205674\", 950: \"#152F40\", 980: \"#0A1B28\",\n} as const;\nexport const swissGreen = {\n 100: \"#D3EBC7\", 200: \"#C3DDB4\", 300: \"#8AC66C\", 700: \"#48792C\", 800: \"#2C4E22\", 900: \"#1B3317\",\n} as const;\nexport const swissRoad = {\n 300: \"#FAF39E\", 400: \"#F8C444\", 500: \"#FAB69E\", 600: \"#CB4D4D\", 800: \"#46371E\",\n} as const;\n\n/** Relief inks from the references; neutral shadows avoid colouring every ridge blue. */\nexport const atlasRelief = { shadow: \"#5B4A3B\", highlight: \"#FFFDF5\", accent: \"#7C6A58\", contour: \"#A8875F\" } as const;\nexport const swissRelief = { shadow: \"#4E6276\", highlight: \"#FFF8CD\", accent: \"#606C7A\", contour: \"#B46E0D\" } as const;\n","import type { Flavor } from \"@protomaps/basemaps\";\n\n/**\n * The unmap cartography authoring surface, moved here from apps/gateway/src/flavors.ts so the\n * gateway, the theme system, and the unmap.dev builder share one definition.\n *\n * A `Recipe` is what a theme can override: every colour a Flavor controls, expressed at the\n * level we author at. Expanding through `makeFlavor` keeps the consistency guarantees a raw\n * Flavor cannot: a casing is always derived beside its fill, and the tunnel and bridge families\n * cannot drift out of step with the surface roads they mirror.\n */\n\n/**\n * The shipped styles. Appended, never inserted: this array's order drives the style picker in\n * the unmap.dev builder, so inserting a style mid-array silently reorders a control people have\n * already learned.\n */\nexport const THEME_BASES = [\n \"base\",\n \"muted\",\n \"outdoor\",\n \"blueprint\",\n \"blush\",\n \"orchid\",\n \"canopy\",\n \"lagoon\",\n \"tropic\",\n \"sunset\",\n \"bold\",\n \"pastel\",\n \"atlas\",\n \"swiss\",\n] as const;\nexport type ThemeBase = (typeof THEME_BASES)[number];\n\n/** Whether `base` names a shipped style. */\nexport function isThemeBase(base: unknown): base is ThemeBase {\n return typeof base === \"string\" && (THEME_BASES as readonly string[]).includes(base);\n}\n\nexport const MODES = [\"light\", \"dark\"] as const;\nexport type ThemeMode = (typeof MODES)[number];\n\nexport interface RoadRamp {\n /** Unclassified / track. The bottom of the hierarchy. */\n other: string;\n otherCasing: string;\n /** Residential and service. */\n minor: string;\n minorCasing: string;\n service: string;\n serviceCasing: string;\n /** Primary / secondary. */\n major: string;\n majorCasing: string;\n /** Motorway. */\n highway: string;\n highwayCasing: string;\n /** Slip roads. */\n link: string;\n linkCasing: string;\n}\n\nexport interface LabelRamp {\n city: string;\n cityHalo: string;\n state: string;\n stateHalo: string;\n country: string;\n subplace: string;\n subplaceHalo: string;\n address: string;\n addressHalo: string;\n roadMinor: string;\n roadMinorHalo: string;\n roadMajor: string;\n roadMajorHalo: string;\n ocean: string;\n}\n\nexport interface Recipe {\n background: string;\n earth: string;\n water: string;\n /** Park, wood and scrub each take two tones; `b` is the slightly deeper of the pair. */\n parkA: string;\n parkB: string;\n woodA: string;\n woodB: string;\n scrubA: string;\n scrubB: string;\n sand: string;\n beach: string;\n glacier: string;\n /** Institutional land: hospital, school, industrial, military, zoo, aerodrome. */\n institutional: string;\n pedestrian: string;\n aerodrome: string;\n runway: string;\n pier: string;\n buildings: string;\n railway: string;\n boundaries: string;\n roads: RoadRamp;\n labels: LabelRamp;\n /**\n * Tunnels read one step recessive against the surface road, bridges one step assertive.\n * Expressed as the colours to substitute rather than a computed shift, so a style can opt\n * out of the convention where it does not suit the palette.\n */\n tunnelFill: string;\n tunnelCasing: string;\n bridgeCasing: string;\n pois: Flavor[\"pois\"];\n landcover: Flavor[\"landcover\"];\n}\n\n/**\n * Expand a recipe into the full Flavor. Every one of the interface's required slots is written\n * here exactly once, so a missing slot is a compile error rather than a silently black layer.\n */\nexport function makeFlavor(r: Recipe): Flavor {\n return {\n background: r.background,\n earth: r.earth,\n water: r.water,\n\n park_a: r.parkA,\n park_b: r.parkB,\n wood_a: r.woodA,\n wood_b: r.woodB,\n scrub_a: r.scrubA,\n scrub_b: r.scrubB,\n sand: r.sand,\n beach: r.beach,\n glacier: r.glacier,\n\n hospital: r.institutional,\n industrial: r.institutional,\n school: r.institutional,\n zoo: r.institutional,\n military: r.institutional,\n pedestrian: r.pedestrian,\n aerodrome: r.aerodrome,\n runway: r.runway,\n pier: r.pier,\n buildings: r.buildings,\n\n // Surface roads.\n other: r.roads.other,\n minor_service: r.roads.service,\n minor_a: r.roads.minor,\n minor_b: r.roads.minor,\n link: r.roads.link,\n major: r.roads.major,\n highway: r.roads.highway,\n\n minor_service_casing: r.roads.serviceCasing,\n minor_casing: r.roads.minorCasing,\n link_casing: r.roads.linkCasing,\n // early/late are the same colour: they exist so Protomaps can fade casings in at\n // different zooms, not to differentiate hue.\n major_casing_early: r.roads.majorCasing,\n major_casing_late: r.roads.majorCasing,\n highway_casing_early: r.roads.highwayCasing,\n highway_casing_late: r.roads.highwayCasing,\n\n // Tunnels: recessive, one flat fill so the network reads as \"beneath\".\n tunnel_other: r.tunnelFill,\n tunnel_minor: r.tunnelFill,\n tunnel_link: r.tunnelFill,\n tunnel_major: r.tunnelFill,\n tunnel_highway: r.tunnelFill,\n tunnel_other_casing: r.tunnelCasing,\n tunnel_minor_casing: r.tunnelCasing,\n tunnel_link_casing: r.tunnelCasing,\n tunnel_major_casing: r.tunnelCasing,\n tunnel_highway_casing: r.tunnelCasing,\n\n // Bridges: same fills as the surface road so the ribbon stays continuous, with a\n // stronger casing that lifts it off whatever it crosses.\n bridges_other: r.roads.other,\n bridges_minor: r.roads.minor,\n bridges_link: r.roads.link,\n bridges_major: r.roads.major,\n bridges_highway: r.roads.highway,\n bridges_other_casing: r.bridgeCasing,\n bridges_minor_casing: r.bridgeCasing,\n bridges_link_casing: r.bridgeCasing,\n bridges_major_casing: r.bridgeCasing,\n bridges_highway_casing: r.bridgeCasing,\n\n railway: r.railway,\n boundaries: r.boundaries,\n\n roads_label_minor: r.labels.roadMinor,\n roads_label_minor_halo: r.labels.roadMinorHalo,\n roads_label_major: r.labels.roadMajor,\n roads_label_major_halo: r.labels.roadMajorHalo,\n ocean_label: r.labels.ocean,\n subplace_label: r.labels.subplace,\n subplace_label_halo: r.labels.subplaceHalo,\n city_label: r.labels.city,\n city_label_halo: r.labels.cityHalo,\n state_label: r.labels.state,\n state_label_halo: r.labels.stateHalo,\n country_label: r.labels.country,\n address_label: r.labels.address,\n address_label_halo: r.labels.addressHalo,\n\n pois: r.pois,\n landcover: r.landcover,\n };\n}\n","import type { Recipe, ThemeBase, ThemeMode } from \"./recipe\";\nimport {\n atlasPaper,\n atlasWater,\n atlasGreen,\n atlasRoad,\n swissPaper,\n swissWater,\n swissGreen,\n swissRoad,\n amber,\n aqua,\n azure,\n cobalt,\n coral,\n ember,\n fern,\n indigo,\n linen,\n graphite,\n ink,\n jade,\n lilac,\n mist,\n paper,\n peach,\n rose,\n sandstone,\n sky,\n verdant,\n wave,\n} from \"./palette\";\n\n/**\n * The ramp families (plus ember) a recipe draws from. `buildRecipes` is parameterized on\n * this so the theme generator can re-emit the same recipes from *generated* ramps — same\n * lightness ladders, a customer's hues — while the stock `RECIPES` stay byte-identical to the\n * hand-tuned originals (they are `buildRecipes(STOCK_RAMPS)`).\n */\nexport interface RampSet {\n atlasPaper: typeof atlasPaper;\n atlasWater: typeof atlasWater;\n atlasGreen: typeof atlasGreen;\n atlasRoad: typeof atlasRoad;\n swissPaper: typeof swissPaper;\n swissWater: typeof swissWater;\n swissGreen: typeof swissGreen;\n swissRoad: typeof swissRoad;\n\n ink: typeof ink;\n paper: typeof paper;\n wave: typeof wave;\n sky: typeof sky;\n verdant: typeof verdant;\n fern: typeof fern;\n sandstone: typeof sandstone;\n graphite: typeof graphite;\n mist: typeof mist;\n jade: typeof jade;\n cobalt: typeof cobalt;\n rose: typeof rose;\n lilac: typeof lilac;\n aqua: typeof aqua;\n ember: typeof ember;\n linen: typeof linen;\n coral: typeof coral;\n peach: typeof peach;\n indigo: typeof indigo;\n azure: typeof azure;\n amber: typeof amber;\n}\n\nexport const STOCK_RAMPS: RampSet = {\n atlasPaper,\n atlasWater,\n atlasGreen,\n atlasRoad,\n swissPaper,\n swissWater,\n swissGreen,\n swissRoad,\n\n ink,\n paper,\n wave,\n sky,\n verdant,\n fern,\n sandstone,\n graphite,\n mist,\n jade,\n cobalt,\n rose,\n lilac,\n aqua,\n ember,\n linen,\n coral,\n peach,\n indigo,\n azure,\n amber,\n};\n\n/*\n * The shipped Process Ink recipes as data, moved from apps/gateway/src/flavors.ts.\n * These are the styles a ThemeDoc's sparse overrides merge onto. Colour comes from the\n * ramps in ./palette and never a hex literal here, except pure white road fills.\n */\n\n/** Build the shipped recipes from a ramp set. Stock ramps in → the shipped cartography out. */\nexport function buildRecipes(\n r: RampSet,\n): Record<ThemeBase, Record<ThemeMode, Recipe>> {\n /**\n * `base` / `light`. The general-purpose map, following the conventions of a street map\n * rather than any one product: a faintly warm off-white land (`paper`, hue 50), parks and woods in a\n * light green that still reads as green, sky-blue water, white roads with cool grey casings, and the\n * motorway drawn in orange — the one cartographic convention allowed to carry warmth.\n * Boundaries and aerodromes take a lavender from `cobalt` the way street maps give them a\n * purple, so they never read as roads. Full road hierarchy and visible buildings stay; this\n * is the map someone gets when they have not chosen one, so it errs towards legible over\n * quiet.\n *\n * Streets' blue-grey neighbourhood labels and its blue water labels both miss the contrast\n * floors on their backgrounds, so labels keep the contrast-safe `paper` and `sky` steps.\n */\n const BASE_LIGHT: Recipe = {\n background: r.paper[100],\n earth: r.paper[25],\n water: r.sky[200],\n parkA: r.verdant[200],\n parkB: r.verdant[300],\n woodA: r.verdant[200],\n woodB: r.verdant[300],\n scrubA: r.verdant[200],\n scrubB: r.verdant[300],\n sand: r.sandstone[200],\n beach: r.sandstone[200],\n glacier: r.paper[25],\n institutional: r.paper[100],\n pedestrian: r.paper[100],\n aerodrome: r.cobalt[200],\n runway: r.cobalt[300],\n pier: r.paper[300],\n buildings: r.paper[200],\n railway: r.graphite[400],\n boundaries: r.cobalt[600],\n roads: {\n other: r.paper[100],\n otherCasing: r.graphite[200],\n minor: \"#FFFFFF\",\n minorCasing: r.graphite[200],\n service: r.paper[100],\n serviceCasing: r.graphite[200],\n major: \"#FFFFFF\",\n majorCasing: r.graphite[300],\n highway: r.ember[400],\n highwayCasing: r.ember[600],\n link: r.ember[300],\n linkCasing: r.ember[500],\n },\n tunnelFill: r.paper[200],\n tunnelCasing: r.graphite[200],\n bridgeCasing: r.graphite[400],\n labels: {\n city: r.paper[1000],\n cityHalo: r.paper[25],\n state: r.paper[700],\n stateHalo: r.paper[25],\n country: r.paper[700],\n subplace: r.paper[700],\n subplaceHalo: r.paper[25],\n address: r.paper[700],\n addressHalo: r.paper[25],\n roadMinor: r.paper[800],\n roadMinorHalo: r.paper[25],\n roadMajor: r.paper[900],\n roadMajorHalo: r.paper[25],\n ocean: r.sky[800],\n },\n\n pois: {\n blue: \"#2D6E8F\",\n green: r.verdant[700],\n lapis: \"#3F5C93\",\n pink: \"#8F4A6B\",\n red: \"#9B4340\",\n slategray: r.paper[700],\n tangerine: \"#8F5322\",\n turquoise: r.sky[700],\n },\n landcover: {\n grassland: r.verdant[200],\n barren: r.sandstone[200],\n urban_area: r.paper[50],\n farmland: r.verdant[100],\n glacier: r.paper[25],\n scrub: r.verdant[200],\n forest: r.verdant[300],\n },\n };\n\n /**\n * `base` / `dark`. The same map inverted, with the inversion that matters: water is drawn\n * *darker* than land. Two mid-tones meeting at a coastline is how a dark basemap turns to\n * mud, so the figure/ground edge is bought with lightness rather than hue. The motorway keeps\n * its orange, one step deeper.\n */\n const BASE_DARK: Recipe = {\n background: r.paper[950],\n earth: r.paper[900],\n water: r.sky[980],\n parkA: r.verdant[800],\n parkB: r.verdant[700],\n woodA: r.verdant[800],\n woodB: r.verdant[700],\n scrubA: r.verdant[900],\n scrubB: r.verdant[800],\n sand: r.sandstone[500],\n beach: r.sandstone[500],\n glacier: r.paper[700],\n institutional: r.paper[950],\n pedestrian: r.paper[950],\n aerodrome: r.cobalt[900],\n runway: r.cobalt[850],\n pier: r.paper[850],\n buildings: r.paper[850],\n railway: r.paper[700],\n boundaries: r.cobalt[500],\n roads: {\n other: r.paper[850],\n otherCasing: r.paper[1000],\n minor: r.paper[800],\n minorCasing: r.paper[1000],\n service: r.paper[850],\n serviceCasing: r.paper[1000],\n major: r.paper[700],\n majorCasing: r.paper[1000],\n highway: r.ember[600],\n highwayCasing: r.paper[1000],\n link: r.ember[700],\n linkCasing: r.paper[1000],\n },\n tunnelFill: r.paper[900],\n tunnelCasing: r.paper[1000],\n bridgeCasing: r.paper[1000],\n labels: {\n city: r.paper[100],\n cityHalo: r.paper[1000],\n state: r.paper[500],\n stateHalo: r.paper[1000],\n country: r.paper[500],\n subplace: r.paper[500],\n subplaceHalo: r.paper[1000],\n address: r.paper[500],\n addressHalo: r.paper[1000],\n roadMinor: r.paper[500],\n roadMinorHalo: r.paper[1000],\n roadMajor: r.paper[400],\n roadMajorHalo: r.paper[1000],\n ocean: r.sky[400],\n },\n\n pois: {\n blue: \"#7FC4E8\",\n green: r.verdant[400],\n lapis: \"#8FB0EA\",\n pink: \"#E3A0C0\",\n red: \"#EE968F\",\n slategray: r.paper[500],\n tangerine: \"#E8AC7C\",\n turquoise: r.sky[400],\n },\n landcover: {\n grassland: r.verdant[800],\n barren: r.sandstone[500],\n urban_area: r.paper[950],\n farmland: r.verdant[900],\n glacier: r.paper[700],\n scrub: r.verdant[900],\n forest: r.verdant[700],\n },\n };\n\n /**\n * `muted` / `light`. Greyscale end to end, after Mapbox Standard's monochrome theme: a\n * near-white field, parks and buildings a step or two down the same grey, white roads with\n * grey casings, grey water, grey labels, grey icons (its own sprite sheet). The style exists\n * so external data can be drawn over it without an arms race: nothing on the map carries a\n * hue, so an overlay in any colour is the only colour there is.\n *\n * Water is drawn from `mist`, a zero-chroma twin of the water ladder, rather than from\n * `graphite`: same greys, but it is the ramp the water seed recolours when someone applies\n * a theme to `muted`.\n */\n const MUTED_LIGHT: Recipe = {\n background: r.graphite[100],\n earth: r.graphite[25],\n water: r.mist[200],\n parkA: r.graphite[50],\n parkB: r.graphite[100],\n woodA: r.graphite[50],\n woodB: r.graphite[100],\n scrubA: r.graphite[50],\n scrubB: r.graphite[100],\n sand: r.graphite[100],\n beach: r.graphite[100],\n glacier: r.graphite[25],\n institutional: r.graphite[100],\n pedestrian: r.graphite[50],\n aerodrome: r.graphite[100],\n runway: r.graphite[200],\n pier: r.graphite[200],\n buildings: r.graphite[100],\n railway: r.graphite[400],\n boundaries: r.graphite[500],\n roads: {\n other: r.graphite[25],\n otherCasing: r.graphite[200],\n minor: \"#FFFFFF\",\n minorCasing: r.graphite[200],\n service: r.graphite[25],\n serviceCasing: r.graphite[200],\n major: \"#FFFFFF\",\n majorCasing: r.graphite[300],\n highway: r.graphite[200],\n highwayCasing: r.graphite[300],\n link: \"#FFFFFF\",\n linkCasing: r.graphite[300],\n },\n tunnelFill: r.graphite[100],\n tunnelCasing: r.graphite[200],\n bridgeCasing: r.graphite[400],\n labels: {\n city: r.graphite[1000],\n cityHalo: r.graphite[25],\n state: r.graphite[700],\n stateHalo: r.graphite[25],\n country: r.graphite[700],\n subplace: r.graphite[700],\n subplaceHalo: r.graphite[25],\n address: r.graphite[700],\n addressHalo: r.graphite[25],\n roadMinor: r.graphite[700],\n roadMinorHalo: r.graphite[25],\n roadMajor: r.graphite[800],\n roadMajorHalo: r.graphite[25],\n ocean: r.graphite[800],\n },\n\n pois: {\n blue: r.graphite[600],\n green: r.graphite[600],\n lapis: r.graphite[700],\n pink: r.graphite[600],\n red: r.graphite[700],\n slategray: r.graphite[700],\n tangerine: r.graphite[600],\n turquoise: r.graphite[600],\n },\n landcover: {\n grassland: r.graphite[50],\n barren: r.graphite[100],\n urban_area: r.graphite[50],\n farmland: r.graphite[50],\n glacier: r.graphite[25],\n scrub: r.graphite[50],\n forest: r.graphite[100],\n },\n };\n\n /**\n * `muted` / `dark`. The greyscale pair inverted: water sits below the land, roads stay the\n * brightest thing on the map, same hierarchy as light.\n */\n const MUTED_DARK: Recipe = {\n background: r.graphite[1000],\n earth: r.graphite[900],\n water: r.mist[980],\n parkA: r.graphite[900],\n parkB: r.graphite[800],\n woodA: r.graphite[900],\n woodB: r.graphite[800],\n scrubA: r.graphite[900],\n scrubB: r.graphite[800],\n sand: r.graphite[800],\n beach: r.graphite[800],\n glacier: r.graphite[700],\n institutional: r.graphite[900],\n pedestrian: r.graphite[900],\n aerodrome: r.graphite[900],\n runway: r.graphite[800],\n pier: r.graphite[800],\n buildings: r.graphite[800],\n railway: r.graphite[700],\n boundaries: r.graphite[600],\n roads: {\n other: r.graphite[800],\n otherCasing: r.graphite[1000],\n minor: r.graphite[700],\n minorCasing: r.graphite[1000],\n service: r.graphite[800],\n serviceCasing: r.graphite[1000],\n major: r.graphite[600],\n majorCasing: r.graphite[1000],\n highway: r.graphite[500],\n highwayCasing: r.graphite[1000],\n link: r.graphite[600],\n linkCasing: r.graphite[1000],\n },\n tunnelFill: r.graphite[900],\n tunnelCasing: r.graphite[1000],\n bridgeCasing: r.graphite[1000],\n labels: {\n city: r.graphite[100],\n cityHalo: r.graphite[1000],\n state: r.graphite[500],\n stateHalo: r.graphite[1000],\n country: r.graphite[500],\n subplace: r.graphite[500],\n subplaceHalo: r.graphite[1000],\n address: r.graphite[500],\n addressHalo: r.graphite[1000],\n roadMinor: r.graphite[500],\n roadMinorHalo: r.graphite[1000],\n roadMajor: r.graphite[400],\n roadMajorHalo: r.graphite[1000],\n ocean: r.graphite[400],\n },\n\n pois: {\n blue: r.graphite[400],\n green: r.graphite[400],\n lapis: r.graphite[500],\n pink: r.graphite[400],\n red: r.graphite[500],\n slategray: r.graphite[500],\n tangerine: r.graphite[400],\n turquoise: r.graphite[400],\n },\n landcover: {\n grassland: r.graphite[900],\n barren: r.graphite[800],\n urban_area: r.graphite[900],\n farmland: r.graphite[900],\n glacier: r.graphite[700],\n scrub: r.graphite[900],\n forest: r.graphite[800],\n },\n };\n\n /**\n * `outdoor` / `light`. Terrain-first scenic: the map you use to look at ground rather than to\n * find an address.\n *\n * Land sits a step lighter than `base` on purpose: a hillshade is composited beneath the roads\n * with a multiply blend, which only ever darkens, so the lift is the headroom that shading\n * spends. Rendered without a DEM it will look flat and slightly washed — that is the tell that\n * the terrain source is missing, not a palette bug. See `terrain.ts`.\n *\n * **Landcover stops receding.** Every other flavour keeps ground cover near-neutral so a\n * customer's data wins. Here the ground cover *is* the content, so forest, scrub and grassland\n * separate across `verdant` instead of collapsing into one field.\n *\n * **Protected land reads as protected.** `park` steps a tone deeper than generic vegetation, so a\n * national park is distinguishable from the golf course that `landuse_park` files beside it.\n *\n * **Roads recede one step**, via their casings rather than their fills: a lighter casing on a\n * white road keeps the shape legible while surrendering the contrast fight to the terrain.\n * Labels and halos keep the same contrast-safe `ink` steps as `base`, which is what keeps the\n * enforced contrast floors satisfied — the ramps are solved against those, and re-deriving them\n * for one flavour would be re-solving a problem that is already solved.\n */\n const OUTDOOR_LIGHT: Recipe = {\n background: r.ink[200],\n // Warm paper, not the near-white ink the style launched on (2026-09-09): a green reads as\n // vegetation against warm land and as a polygon against white, which is the difference\n // between an outdoor map and a diagram. Mapbox Outdoors' land is hsl(60, 20%, 85%).\n earth: r.paper[100],\n water: r.wave[300],\n parkA: r.fern[300],\n parkB: r.fern[400],\n woodA: r.fern[300],\n woodB: r.fern[400],\n scrubA: r.fern[200],\n scrubB: r.fern[300],\n sand: r.sandstone[300],\n beach: r.sandstone[300],\n glacier: r.ink[25],\n institutional: r.ink[25],\n pedestrian: r.ink[50],\n aerodrome: r.ink[50],\n runway: r.ink[200],\n pier: r.ink[300],\n // A step lighter than `base`: outdoors, the building footprint is context, not content.\n buildings: r.ink[200],\n railway: r.ink[500],\n boundaries: r.ink[600],\n roads: {\n other: r.ink[50],\n otherCasing: r.ink[200],\n minor: r.ink[25],\n minorCasing: r.ink[200],\n service: r.ink[50],\n serviceCasing: r.ink[200],\n major: \"#FFFFFF\",\n majorCasing: r.ink[300],\n highway: \"#FFFFFF\",\n highwayCasing: r.ink[400],\n link: \"#FFFFFF\",\n linkCasing: r.ink[300],\n },\n tunnelFill: r.ink[200],\n tunnelCasing: r.ink[300],\n bridgeCasing: r.ink[400],\n labels: {\n city: r.ink[1000],\n cityHalo: r.ink[25],\n state: r.ink[700],\n stateHalo: r.ink[25],\n country: r.ink[700],\n subplace: r.ink[700],\n subplaceHalo: r.ink[25],\n address: r.ink[700],\n addressHalo: r.ink[25],\n roadMinor: r.ink[700],\n roadMinorHalo: r.ink[25],\n roadMajor: r.ink[800],\n roadMajorHalo: r.ink[25],\n ocean: r.wave[800],\n },\n\n pois: {\n blue: \"#2D6E8F\",\n // Peaks, parks, forests and gardens all come through green. On this flavour they are the\n // POIs worth finding, so it carries a full step more weight than elsewhere.\n green: r.fern[800],\n lapis: \"#3F5C93\",\n pink: \"#8F4A6B\",\n red: \"#9B4340\",\n slategray: r.ink[700],\n tangerine: \"#8F5322\",\n turquoise: r.wave[700],\n },\n landcover: {\n grassland: r.fern[200],\n barren: r.sandstone[300],\n urban_area: r.ink[100],\n farmland: r.sandstone[200],\n glacier: r.ink[25],\n scrub: r.fern[300],\n forest: r.fern[400],\n },\n };\n\n /**\n * `outdoor` / `dark`. The same three divergences, inverted: the land sits darker to leave room\n * *above* it for a hillshade highlight to do the modelling.\n *\n * Vegetation lifts rather than deepens here. On a dark basemap a deeper green is indistinguishable\n * from the land it sits on, so the separation that `light` gets by going darker, `dark` gets by\n * going lighter — the same intent through the opposite move.\n */\n const OUTDOOR_DARK: Recipe = {\n background: r.ink[1000],\n earth: r.ink[950],\n water: r.wave[980],\n parkA: r.fern[700],\n parkB: r.fern[600],\n woodA: r.fern[700],\n woodB: r.fern[600],\n scrubA: r.fern[800],\n scrubB: r.fern[700],\n sand: r.sandstone[500],\n beach: r.sandstone[500],\n glacier: r.ink[700],\n institutional: r.ink[1000],\n pedestrian: r.ink[950],\n aerodrome: r.ink[950],\n runway: r.ink[850],\n pier: r.ink[850],\n buildings: r.ink[900],\n railway: r.ink[700],\n boundaries: r.ink[600],\n roads: {\n // The minor tier recedes toward `earth`; majors and highways hold their contrast,\n // because a road you cannot see is a different failure from a road that is merely quiet.\n other: r.ink[900],\n otherCasing: r.ink[1000],\n minor: r.ink[850],\n minorCasing: r.ink[1000],\n service: r.ink[900],\n serviceCasing: r.ink[1000],\n major: r.ink[700],\n majorCasing: r.ink[1000],\n highway: r.ink[600],\n highwayCasing: r.ink[1000],\n link: r.ink[700],\n linkCasing: r.ink[1000],\n },\n tunnelFill: r.ink[900],\n tunnelCasing: r.ink[1000],\n bridgeCasing: r.ink[1000],\n labels: {\n city: r.ink[100],\n cityHalo: r.ink[1000],\n state: r.ink[500],\n stateHalo: r.ink[1000],\n country: r.ink[500],\n subplace: r.ink[500],\n subplaceHalo: r.ink[1000],\n address: r.ink[500],\n addressHalo: r.ink[1000],\n roadMinor: r.ink[500],\n roadMinorHalo: r.ink[1000],\n roadMajor: r.ink[400],\n roadMajorHalo: r.ink[1000],\n ocean: r.wave[400],\n },\n\n pois: {\n blue: \"#7FC4E8\",\n green: r.fern[300],\n lapis: \"#8FB0EA\",\n pink: \"#E3A0C0\",\n red: \"#EE968F\",\n slategray: r.ink[500],\n tangerine: \"#E8AC7C\",\n turquoise: r.wave[400],\n },\n landcover: {\n grassland: r.fern[700],\n barren: r.sandstone[500],\n urban_area: r.ink[950],\n farmland: r.fern[900],\n glacier: r.ink[700],\n scrub: r.fern[800],\n forest: r.fern[600],\n },\n };\n\n /**\n * `blueprint` / `light`. The print, not the plate: blue-white paper, pale blue water, roads\n * as blue lines with a white casing that darken up the hierarchy, labels in the deep blues.\n */\n const BLUEPRINT_LIGHT: Recipe = {\n background: r.cobalt[100],\n earth: r.cobalt[25],\n water: r.cobalt[200],\n parkA: r.cobalt[50],\n parkB: r.cobalt[100],\n woodA: r.cobalt[50],\n woodB: r.cobalt[100],\n scrubA: r.cobalt[50],\n scrubB: r.cobalt[100],\n sand: r.cobalt[50],\n beach: r.cobalt[50],\n glacier: r.cobalt[25],\n institutional: r.cobalt[50],\n pedestrian: r.cobalt[50],\n aerodrome: r.cobalt[50],\n runway: r.cobalt[200],\n pier: r.cobalt[200],\n buildings: r.cobalt[100],\n railway: r.cobalt[500],\n boundaries: r.cobalt[600],\n roads: {\n other: r.cobalt[200],\n otherCasing: r.cobalt[25],\n minor: r.cobalt[300],\n minorCasing: r.cobalt[25],\n service: r.cobalt[200],\n serviceCasing: r.cobalt[25],\n major: r.cobalt[400],\n majorCasing: r.cobalt[25],\n highway: r.cobalt[500],\n highwayCasing: r.cobalt[25],\n link: r.cobalt[400],\n linkCasing: r.cobalt[25],\n },\n tunnelFill: r.cobalt[100],\n tunnelCasing: r.cobalt[200],\n bridgeCasing: r.cobalt[600],\n labels: {\n city: r.cobalt[1000],\n cityHalo: r.cobalt[25],\n state: r.cobalt[700],\n stateHalo: r.cobalt[25],\n country: r.cobalt[700],\n subplace: r.cobalt[700],\n subplaceHalo: r.cobalt[25],\n address: r.cobalt[700],\n addressHalo: r.cobalt[25],\n roadMinor: r.cobalt[700],\n roadMinorHalo: r.cobalt[25],\n roadMajor: r.cobalt[800],\n roadMajorHalo: r.cobalt[25],\n ocean: r.cobalt[800],\n },\n\n pois: {\n blue: r.cobalt[700],\n green: r.cobalt[700],\n lapis: r.cobalt[700],\n pink: r.cobalt[700],\n red: r.cobalt[700],\n slategray: r.cobalt[700],\n tangerine: r.cobalt[700],\n turquoise: r.cobalt[700],\n },\n landcover: {\n grassland: r.cobalt[50],\n barren: r.cobalt[50],\n urban_area: r.cobalt[50],\n farmland: r.cobalt[50],\n glacier: r.cobalt[25],\n scrub: r.cobalt[50],\n forest: r.cobalt[100],\n },\n };\n\n /**\n * `blueprint` / `dark`. The native mode, modelled on the \"Cartogram\" look: a royal blue\n * field (`cobalt.700`), parks and buildings one lighter blue, water lighter still, and roads\n * as navy lines with a pale casing — ink on a blueprint. This is the one dark mode where\n * water is *lighter* than land, on purpose: the reference draws it that way, and a blueprint\n * with dark water would just be a night map. Labels are the palest steps; `state` sits one\n * step lighter than the reference's `#b9c6f5` because that grey-blue misses 4.5:1 on the\n * field.\n */\n const BLUEPRINT_DARK: Recipe = {\n background: r.cobalt[700],\n earth: r.cobalt[700],\n water: r.cobalt[400],\n parkA: r.cobalt[600],\n parkB: r.cobalt[600],\n woodA: r.cobalt[600],\n woodB: r.cobalt[600],\n scrubA: r.cobalt[600],\n scrubB: r.cobalt[600],\n sand: r.cobalt[600],\n beach: r.cobalt[600],\n glacier: r.cobalt[500],\n institutional: r.cobalt[600],\n pedestrian: r.cobalt[700],\n aerodrome: r.cobalt[600],\n runway: r.cobalt[800],\n pier: r.cobalt[800],\n buildings: r.cobalt[600],\n railway: r.cobalt[400],\n boundaries: r.cobalt[300],\n roads: {\n other: r.cobalt[800],\n otherCasing: r.cobalt[700],\n minor: r.cobalt[850],\n minorCasing: r.cobalt[600],\n service: r.cobalt[800],\n serviceCasing: r.cobalt[700],\n major: r.cobalt[900],\n majorCasing: r.cobalt[600],\n highway: r.cobalt[950],\n highwayCasing: r.cobalt[500],\n link: r.cobalt[900],\n linkCasing: r.cobalt[600],\n },\n tunnelFill: r.cobalt[800],\n tunnelCasing: r.cobalt[700],\n bridgeCasing: r.cobalt[500],\n labels: {\n city: r.cobalt[25],\n cityHalo: r.cobalt[700],\n state: r.cobalt[200],\n stateHalo: r.cobalt[700],\n country: r.cobalt[200],\n subplace: r.cobalt[300],\n subplaceHalo: r.cobalt[700],\n address: r.cobalt[300],\n addressHalo: r.cobalt[700],\n roadMinor: r.cobalt[300],\n roadMinorHalo: r.cobalt[700],\n roadMajor: r.cobalt[100],\n roadMajorHalo: r.cobalt[700],\n ocean: r.cobalt[900],\n },\n\n pois: {\n blue: r.cobalt[200],\n green: r.cobalt[200],\n lapis: r.cobalt[200],\n pink: r.cobalt[200],\n red: r.cobalt[200],\n slategray: r.cobalt[200],\n tangerine: r.cobalt[200],\n turquoise: r.cobalt[200],\n },\n landcover: {\n grassland: r.cobalt[600],\n barren: r.cobalt[600],\n urban_area: r.cobalt[700],\n farmland: r.cobalt[600],\n glacier: r.cobalt[500],\n scrub: r.cobalt[600],\n forest: r.cobalt[600],\n },\n };\n\n /**\n * `blush` / `light`. After Protomaps' *dusk rose*: a pink land on a peach ground, peach\n * roads that read as gaps in the pink rather than as lines, and buildings in the deepest\n * rose on the map. Parks and woods keep a soft green so the whole thing does not turn into\n * a single wash. Labels take the dark rose steps because the reference's grey-browns miss\n * the floors.\n */\n const BLUSH_LIGHT: Recipe = {\n background: r.ember[200],\n earth: r.rose[300],\n water: r.ember[200],\n parkA: r.verdant[300],\n parkB: r.verdant[400],\n woodA: r.verdant[300],\n woodB: r.verdant[400],\n scrubA: r.sandstone[200],\n scrubB: r.sandstone[300],\n sand: r.sandstone[200],\n beach: r.sandstone[100],\n glacier: r.rose[100],\n institutional: r.rose[200],\n pedestrian: r.lilac[200],\n aerodrome: r.rose[200],\n runway: r.ember[200],\n pier: r.sandstone[300],\n buildings: r.rose[500],\n railway: r.sandstone[100],\n boundaries: r.rose[700],\n roads: {\n other: r.ember[200],\n otherCasing: r.rose[300],\n minor: r.ember[200],\n minorCasing: r.rose[300],\n service: r.ember[200],\n serviceCasing: r.rose[300],\n major: r.ember[200],\n majorCasing: r.rose[400],\n highway: \"#FFFFFF\",\n highwayCasing: r.rose[400],\n link: r.ember[200],\n linkCasing: r.rose[400],\n },\n tunnelFill: r.rose[200],\n tunnelCasing: r.rose[300],\n bridgeCasing: r.rose[500],\n labels: {\n city: r.paper[1000],\n cityHalo: r.rose[25],\n state: r.rose[800],\n stateHalo: r.rose[25],\n country: r.rose[800],\n subplace: r.rose[700],\n subplaceHalo: r.rose[25],\n address: r.rose[800],\n addressHalo: r.rose[25],\n roadMinor: r.rose[800],\n roadMinorHalo: r.rose[25],\n roadMajor: r.rose[850],\n roadMajorHalo: r.rose[25],\n ocean: r.ember[700],\n },\n\n pois: {\n blue: r.cobalt[700],\n green: r.verdant[700],\n lapis: r.cobalt[700],\n pink: r.rose[700],\n red: r.rose[700],\n slategray: r.rose[700],\n tangerine: r.ember[700],\n turquoise: r.sky[700],\n },\n landcover: {\n grassland: r.verdant[300],\n barren: r.sandstone[200],\n urban_area: r.rose[400],\n farmland: r.verdant[200],\n glacier: r.rose[100],\n scrub: r.verdant[200],\n forest: r.verdant[400],\n },\n };\n\n /**\n * `blush` / `dark`. Wine instead of pink: the same rose family at its dark steps, water a\n * shade below the land, roads brightening up the hierarchy, buildings one step lighter than\n * the field.\n */\n const BLUSH_DARK: Recipe = {\n background: r.rose[1000],\n earth: r.rose[900],\n water: r.rose[1000],\n parkA: r.verdant[800],\n parkB: r.verdant[700],\n woodA: r.verdant[800],\n woodB: r.verdant[700],\n scrubA: r.verdant[900],\n scrubB: r.verdant[800],\n sand: r.sandstone[500],\n beach: r.sandstone[400],\n glacier: r.rose[700],\n institutional: r.rose[850],\n pedestrian: r.lilac[900],\n aerodrome: r.rose[850],\n runway: r.rose[800],\n pier: r.sandstone[500],\n buildings: r.rose[700],\n railway: r.rose[700],\n boundaries: r.rose[500],\n roads: {\n other: r.rose[850],\n otherCasing: r.rose[1000],\n minor: r.rose[800],\n minorCasing: r.rose[1000],\n service: r.rose[850],\n serviceCasing: r.rose[1000],\n major: r.rose[700],\n majorCasing: r.rose[1000],\n highway: r.rose[600],\n highwayCasing: r.rose[1000],\n link: r.rose[700],\n linkCasing: r.rose[1000],\n },\n tunnelFill: r.rose[900],\n tunnelCasing: r.rose[1000],\n bridgeCasing: r.rose[1000],\n labels: {\n city: r.rose[100],\n cityHalo: r.rose[1000],\n state: r.rose[500],\n stateHalo: r.rose[1000],\n country: r.rose[500],\n subplace: r.rose[500],\n subplaceHalo: r.rose[1000],\n address: r.rose[500],\n addressHalo: r.rose[1000],\n roadMinor: r.rose[500],\n roadMinorHalo: r.rose[1000],\n roadMajor: r.rose[400],\n roadMajorHalo: r.rose[1000],\n ocean: r.ember[400],\n },\n\n pois: {\n blue: r.cobalt[400],\n green: r.verdant[400],\n lapis: r.cobalt[400],\n pink: r.rose[400],\n red: r.rose[400],\n slategray: r.rose[500],\n tangerine: r.ember[400],\n turquoise: r.sky[400],\n },\n landcover: {\n grassland: r.verdant[800],\n barren: r.sandstone[500],\n urban_area: r.rose[900],\n farmland: r.verdant[900],\n glacier: r.rose[700],\n scrub: r.verdant[900],\n forest: r.verdant[700],\n },\n };\n\n /**\n * `orchid` / `light`. After Protomaps' *iris bloom*: a lavender-grey land on white, white\n * roads, and the colour concentrated where the reference puts it — vivid teal parks (`aqua`),\n * mint woods (`jade`), sky water, navy boundaries and a navy city label. The land ramp is\n * kept quiet so those pops stay pops.\n */\n const ORCHID_LIGHT: Recipe = {\n background: r.lilac[25],\n earth: r.lilac[200],\n water: r.sky[300],\n parkA: r.aqua[300],\n parkB: r.aqua[400],\n woodA: r.jade[500],\n woodB: r.jade[600],\n scrubA: r.sandstone[300],\n scrubB: r.sandstone[400],\n sand: r.sandstone[300],\n beach: r.sandstone[200],\n glacier: r.lilac[100],\n institutional: r.lilac[300],\n pedestrian: r.lilac[300],\n aerodrome: r.sandstone[100],\n runway: r.lilac[25],\n pier: r.cobalt[500],\n buildings: r.lilac[300],\n railway: r.lilac[400],\n boundaries: r.cobalt[900],\n roads: {\n other: \"#FFFFFF\",\n otherCasing: r.lilac[200],\n minor: \"#FFFFFF\",\n minorCasing: r.lilac[200],\n service: \"#FFFFFF\",\n serviceCasing: r.lilac[200],\n major: \"#FFFFFF\",\n majorCasing: r.lilac[300],\n highway: \"#FFFFFF\",\n highwayCasing: r.lilac[400],\n link: \"#FFFFFF\",\n linkCasing: r.lilac[300],\n },\n tunnelFill: r.lilac[100],\n tunnelCasing: r.lilac[200],\n bridgeCasing: r.lilac[500],\n labels: {\n city: r.cobalt[950],\n cityHalo: r.lilac[25],\n state: r.lilac[700],\n stateHalo: r.lilac[25],\n country: r.lilac[850],\n subplace: r.lilac[700],\n subplaceHalo: r.lilac[25],\n address: r.lilac[700],\n addressHalo: r.lilac[25],\n roadMinor: r.lilac[800],\n roadMinorHalo: r.lilac[25],\n roadMajor: r.lilac[850],\n roadMajorHalo: r.lilac[25],\n ocean: r.cobalt[800],\n },\n\n pois: {\n blue: r.cobalt[700],\n green: r.jade[700],\n lapis: r.cobalt[700],\n pink: r.rose[600],\n red: r.rose[700],\n slategray: r.lilac[700],\n tangerine: r.ember[700],\n turquoise: r.aqua[700],\n },\n landcover: {\n grassland: r.jade[400],\n barren: r.sandstone[300],\n urban_area: r.lilac[200],\n farmland: r.jade[500],\n glacier: r.lilac[100],\n scrub: r.verdant[400],\n forest: r.jade[500],\n },\n };\n\n /**\n * `orchid` / `dark`. Deep violet field, the teal and mint kept for parks and woods, water\n * darker than land as every dark mode requires.\n */\n const ORCHID_DARK: Recipe = {\n background: r.lilac[1000],\n earth: r.lilac[900],\n water: r.sky[980],\n parkA: r.aqua[800],\n parkB: r.aqua[700],\n woodA: r.jade[800],\n woodB: r.jade[700],\n scrubA: r.sandstone[500],\n scrubB: r.sandstone[500],\n sand: r.sandstone[500],\n beach: r.sandstone[400],\n glacier: r.lilac[700],\n institutional: r.lilac[850],\n pedestrian: r.lilac[850],\n aerodrome: r.lilac[850],\n runway: r.lilac[800],\n pier: r.cobalt[600],\n buildings: r.lilac[800],\n railway: r.lilac[700],\n boundaries: r.cobalt[400],\n roads: {\n other: r.lilac[850],\n otherCasing: r.lilac[1000],\n minor: r.lilac[800],\n minorCasing: r.lilac[1000],\n service: r.lilac[850],\n serviceCasing: r.lilac[1000],\n major: r.lilac[700],\n majorCasing: r.lilac[1000],\n highway: r.lilac[600],\n highwayCasing: r.lilac[1000],\n link: r.lilac[700],\n linkCasing: r.lilac[1000],\n },\n tunnelFill: r.lilac[900],\n tunnelCasing: r.lilac[1000],\n bridgeCasing: r.lilac[1000],\n labels: {\n city: r.lilac[100],\n cityHalo: r.lilac[1000],\n state: r.lilac[500],\n stateHalo: r.lilac[1000],\n country: r.lilac[500],\n subplace: r.lilac[500],\n subplaceHalo: r.lilac[1000],\n address: r.lilac[500],\n addressHalo: r.lilac[1000],\n roadMinor: r.lilac[500],\n roadMinorHalo: r.lilac[1000],\n roadMajor: r.lilac[400],\n roadMajorHalo: r.lilac[1000],\n ocean: r.sky[400],\n },\n\n pois: {\n blue: r.cobalt[400],\n green: r.jade[400],\n lapis: r.cobalt[400],\n pink: r.rose[400],\n red: r.rose[400],\n slategray: r.lilac[500],\n tangerine: r.ember[400],\n turquoise: r.aqua[400],\n },\n landcover: {\n grassland: r.jade[800],\n barren: r.sandstone[500],\n urban_area: r.lilac[900],\n farmland: r.jade[900],\n glacier: r.lilac[700],\n scrub: r.verdant[800],\n forest: r.jade[800],\n },\n };\n\n /**\n * `canopy` / `light`. After Protomaps' *rainforest*: a tan earth under dark teal-green parks\n * and forest, near-black roads with the earth as their casing, clay-orange buildings, and\n * strong blue water. The reference sets its labels in white on tan, which misses every\n * floor; here they are dark on a sand halo instead.\n */\n const CANOPY_LIGHT: Recipe = {\n background: r.verdant[100],\n earth: r.sandstone[200],\n water: r.cobalt[600],\n parkA: r.verdant[800],\n parkB: r.verdant[700],\n woodA: r.verdant[600],\n woodB: r.verdant[700],\n scrubA: r.sandstone[500],\n scrubB: r.sandstone[400],\n sand: r.sandstone[200],\n beach: r.sandstone[100],\n glacier: r.paper[25],\n institutional: r.rose[200],\n pedestrian: r.rose[100],\n aerodrome: r.lilac[500],\n runway: r.paper[1000],\n pier: r.sky[300],\n buildings: r.ember[700],\n railway: r.paper[950],\n boundaries: r.graphite[300],\n roads: {\n other: r.rose[1000],\n otherCasing: r.sandstone[200],\n minor: r.rose[1000],\n minorCasing: r.sandstone[200],\n service: r.rose[1000],\n serviceCasing: r.sandstone[200],\n major: r.rose[1000],\n majorCasing: r.sandstone[100],\n highway: r.rose[1000],\n highwayCasing: r.sandstone[100],\n link: r.rose[1000],\n linkCasing: r.sandstone[100],\n },\n tunnelFill: r.rose[900],\n tunnelCasing: r.sandstone[200],\n bridgeCasing: r.sandstone[100],\n labels: {\n city: r.paper[1000],\n cityHalo: r.sandstone[100],\n state: r.paper[800],\n stateHalo: r.sandstone[100],\n country: r.paper[800],\n subplace: r.paper[700],\n subplaceHalo: r.sandstone[100],\n address: r.paper[800],\n addressHalo: r.sandstone[100],\n roadMinor: r.paper[800],\n roadMinorHalo: r.sandstone[100],\n roadMajor: r.paper[900],\n roadMajorHalo: r.sandstone[100],\n ocean: r.cobalt[25],\n },\n\n pois: {\n blue: r.cobalt[700],\n green: r.verdant[700],\n lapis: r.cobalt[700],\n pink: r.rose[600],\n red: r.rose[700],\n slategray: r.paper[700],\n tangerine: r.ember[700],\n turquoise: r.sky[700],\n },\n landcover: {\n grassland: r.verdant[500],\n barren: r.sandstone[400],\n urban_area: r.rose[600],\n farmland: r.verdant[600],\n glacier: r.paper[25],\n scrub: r.sandstone[500],\n forest: r.verdant[800],\n },\n };\n\n /**\n * `canopy` / `dark`. The forest floor at night: warm brown land, the greens kept deep,\n * roads turned into sand-coloured lines, buildings still clay.\n */\n const CANOPY_DARK: Recipe = {\n // `linen` rather than `paper` for the ground alone: paper is packed solid here (1000 casings,\n // 950 background, 900 earth, 850 scrub), so there is no free step to move to, and `base`\n // owns paper[900]. The straw tint also suits a style whose light half is sandstone.\n background: r.linen[950],\n earth: r.linen[900],\n water: r.cobalt[950],\n parkA: r.verdant[900],\n parkB: r.verdant[800],\n woodA: r.verdant[800],\n woodB: r.verdant[800],\n scrubA: r.paper[850],\n scrubB: r.paper[850],\n sand: r.sandstone[500],\n beach: r.sandstone[400],\n glacier: r.paper[700],\n institutional: r.paper[850],\n pedestrian: r.rose[900],\n aerodrome: r.lilac[850],\n runway: r.paper[800],\n pier: r.sky[700],\n buildings: r.ember[700],\n railway: r.paper[700],\n boundaries: r.graphite[600],\n roads: {\n other: r.sandstone[500],\n otherCasing: r.paper[1000],\n minor: r.sandstone[400],\n minorCasing: r.paper[1000],\n service: r.sandstone[500],\n serviceCasing: r.paper[1000],\n major: r.sandstone[300],\n majorCasing: r.paper[1000],\n highway: r.sandstone[200],\n highwayCasing: r.paper[1000],\n link: r.sandstone[300],\n linkCasing: r.paper[1000],\n },\n tunnelFill: r.paper[900],\n tunnelCasing: r.paper[1000],\n bridgeCasing: r.paper[1000],\n labels: {\n city: r.sandstone[100],\n cityHalo: r.paper[1000],\n state: r.sandstone[300],\n stateHalo: r.paper[1000],\n country: r.sandstone[300],\n subplace: r.sandstone[300],\n subplaceHalo: r.paper[1000],\n address: r.sandstone[300],\n addressHalo: r.paper[1000],\n roadMinor: r.sandstone[300],\n roadMinorHalo: r.paper[1000],\n roadMajor: r.sandstone[200],\n roadMajorHalo: r.paper[1000],\n ocean: r.cobalt[300],\n },\n\n pois: {\n blue: r.cobalt[400],\n green: r.verdant[400],\n lapis: r.cobalt[400],\n pink: r.rose[400],\n red: r.rose[400],\n slategray: r.sandstone[300],\n tangerine: r.ember[400],\n turquoise: r.sky[400],\n },\n landcover: {\n grassland: r.verdant[900],\n barren: r.sandstone[500],\n urban_area: r.rose[900],\n farmland: r.verdant[900],\n glacier: r.paper[700],\n scrub: r.paper[850],\n forest: r.verdant[900],\n },\n };\n\n /**\n * `lagoon` / `light`. After Protomaps' *seafoam*: pale green land, aqua water, teal parks\n * and woods, white roads, grey buildings and grey labels — a cool, low-contrast map that\n * still keeps its greens and teals apart.\n */\n const LAGOON_LIGHT: Recipe = {\n background: r.verdant[100],\n earth: r.verdant[100],\n water: r.wave[200],\n parkA: r.aqua[300],\n parkB: r.aqua[400],\n woodA: r.wave[300],\n woodB: r.wave[400],\n scrubA: r.verdant[300],\n scrubB: r.verdant[400],\n sand: r.sandstone[200],\n beach: r.verdant[100],\n glacier: r.graphite[50],\n institutional: r.verdant[200],\n pedestrian: r.wave[100],\n aerodrome: r.paper[200],\n runway: r.verdant[100],\n pier: r.sky[300],\n buildings: r.graphite[100],\n railway: r.graphite[25],\n boundaries: r.graphite[500],\n roads: {\n other: \"#FFFFFF\",\n otherCasing: r.verdant[200],\n minor: \"#FFFFFF\",\n minorCasing: r.verdant[200],\n service: \"#FFFFFF\",\n serviceCasing: r.verdant[200],\n major: \"#FFFFFF\",\n majorCasing: r.verdant[300],\n highway: \"#FFFFFF\",\n highwayCasing: r.verdant[300],\n link: \"#FFFFFF\",\n linkCasing: r.verdant[300],\n },\n tunnelFill: r.graphite[50],\n tunnelCasing: r.verdant[200],\n bridgeCasing: r.graphite[400],\n labels: {\n city: r.graphite[800],\n cityHalo: r.verdant[100],\n state: r.graphite[700],\n stateHalo: r.verdant[100],\n country: r.graphite[700],\n subplace: r.graphite[700],\n subplaceHalo: r.verdant[100],\n address: r.graphite[700],\n addressHalo: r.verdant[100],\n roadMinor: r.graphite[700],\n roadMinorHalo: r.verdant[100],\n roadMajor: r.graphite[800],\n roadMajorHalo: r.verdant[100],\n ocean: r.wave[800],\n },\n\n pois: {\n blue: r.wave[700],\n green: r.verdant[700],\n lapis: r.sky[700],\n pink: r.rose[600],\n red: r.rose[700],\n slategray: r.graphite[700],\n tangerine: r.sandstone[500],\n turquoise: r.aqua[700],\n },\n landcover: {\n grassland: r.verdant[400],\n barren: r.sandstone[200],\n urban_area: r.verdant[100],\n farmland: r.verdant[300],\n glacier: r.graphite[50],\n scrub: r.verdant[300],\n forest: r.wave[300],\n },\n };\n\n /**\n * `lagoon` / `dark`. Deep green land, water darker still, roads brightening up the\n * hierarchy in the same green family, parks and woods holding their teal.\n */\n const LAGOON_DARK: Recipe = {\n background: r.verdant[900],\n earth: r.verdant[900],\n water: r.wave[980],\n parkA: r.aqua[800],\n parkB: r.aqua[700],\n woodA: r.wave[800],\n woodB: r.wave[700],\n scrubA: r.verdant[800],\n scrubB: r.verdant[800],\n sand: r.sandstone[500],\n beach: r.verdant[800],\n glacier: r.graphite[700],\n institutional: r.verdant[800],\n pedestrian: r.wave[900],\n aerodrome: r.graphite[800],\n runway: r.verdant[800],\n pier: r.sky[600],\n buildings: r.verdant[800],\n railway: r.graphite[700],\n boundaries: r.graphite[600],\n roads: {\n other: r.verdant[700],\n otherCasing: r.verdant[900],\n minor: r.verdant[600],\n minorCasing: r.verdant[900],\n service: r.verdant[700],\n serviceCasing: r.verdant[900],\n major: r.verdant[500],\n majorCasing: r.verdant[900],\n highway: r.verdant[400],\n highwayCasing: r.verdant[900],\n link: r.verdant[500],\n linkCasing: r.verdant[900],\n },\n tunnelFill: r.verdant[800],\n tunnelCasing: r.verdant[900],\n bridgeCasing: r.verdant[900],\n labels: {\n city: r.verdant[100],\n cityHalo: r.verdant[900],\n state: r.verdant[300],\n stateHalo: r.verdant[900],\n country: r.verdant[300],\n subplace: r.verdant[300],\n subplaceHalo: r.verdant[900],\n address: r.verdant[300],\n addressHalo: r.verdant[900],\n roadMinor: r.verdant[300],\n roadMinorHalo: r.verdant[900],\n roadMajor: r.verdant[200],\n roadMajorHalo: r.verdant[900],\n ocean: r.wave[400],\n },\n\n pois: {\n blue: r.wave[400],\n green: r.verdant[400],\n lapis: r.sky[400],\n pink: r.rose[400],\n red: r.rose[400],\n slategray: r.graphite[400],\n tangerine: r.sandstone[400],\n turquoise: r.aqua[400],\n },\n landcover: {\n grassland: r.verdant[800],\n barren: r.sandstone[500],\n urban_area: r.verdant[900],\n farmland: r.verdant[800],\n glacier: r.graphite[700],\n scrub: r.verdant[800],\n forest: r.wave[800],\n },\n };\n\n /**\n * `tropic` / `light`. After CARTO's *Tropic* and *Temps*: teal water at full strength (`aqua`), spring-green\n * parks and woods (`jade`), cream land (`linen`), a coral highway with a deeper coral casing, coral\n * boundaries, and labels in the deep teals. The most Canadian of the vivid four: it reads as a lake map.\n */\n const TROPIC_LIGHT: Recipe = {\n background: r.linen[100],\n // A step below `sunset`, whose warm duotone owns the lightest cream. Tropic's cream sitting\n // slightly deeper is also what lets its full-strength teal water carry the style.\n earth: r.linen[50],\n water: r.aqua[500],\n parkA: r.jade[300],\n parkB: r.jade[400],\n woodA: r.jade[400],\n woodB: r.jade[500],\n scrubA: r.fern[200],\n scrubB: r.fern[300],\n sand: r.sandstone[200],\n beach: r.sandstone[100],\n glacier: r.ink[25],\n institutional: r.linen[100],\n pedestrian: r.linen[50],\n aerodrome: r.linen[200],\n runway: r.linen[300],\n pier: r.aqua[300],\n buildings: r.linen[200],\n railway: r.linen[400],\n boundaries: r.coral[700],\n roads: {\n other: \"#FFFFFF\",\n otherCasing: r.linen[200],\n minor: \"#FFFFFF\",\n minorCasing: r.linen[200],\n service: \"#FFFFFF\",\n serviceCasing: r.linen[200],\n major: \"#FFFFFF\",\n majorCasing: r.linen[300],\n highway: r.coral[500],\n highwayCasing: r.coral[700],\n link: r.coral[400],\n linkCasing: r.coral[600],\n },\n tunnelFill: r.linen[100],\n tunnelCasing: r.linen[200],\n bridgeCasing: r.linen[500],\n labels: {\n city: r.aqua[950],\n cityHalo: r.linen[25],\n state: r.aqua[800],\n stateHalo: r.linen[25],\n country: r.aqua[800],\n subplace: r.aqua[800],\n subplaceHalo: r.linen[25],\n address: r.linen[700],\n addressHalo: r.linen[25],\n roadMinor: r.linen[700],\n roadMinorHalo: r.linen[25],\n roadMajor: r.aqua[900],\n roadMajorHalo: r.linen[25],\n ocean: r.aqua[980],\n },\n\n pois: {\n blue: r.wave[700],\n green: r.verdant[700],\n lapis: r.sky[700],\n pink: r.rose[600],\n red: r.rose[700],\n slategray: r.graphite[700],\n tangerine: r.sandstone[500],\n turquoise: r.aqua[700],\n },\n landcover: {\n grassland: r.fern[200],\n barren: r.sandstone[200],\n urban_area: r.linen[100],\n farmland: r.sandstone[100],\n glacier: r.ink[25],\n scrub: r.fern[300],\n forest: r.jade[400],\n },\n };\n\n /**\n * `tropic` / `dark`. Teal-black land, the water a deep teal that still reads as colour against it, parks and\n * woods holding their green at the dark steps, coral highway and boundaries, cream labels.\n */\n const TROPIC_DARK: Recipe = {\n background: r.aqua[980],\n earth: r.aqua[950],\n water: r.aqua[700],\n parkA: r.jade[850],\n parkB: r.jade[800],\n woodA: r.jade[800],\n woodB: r.jade[700],\n scrubA: r.ink[900],\n scrubB: r.ink[850],\n sand: r.sandstone[500],\n beach: r.ink[900],\n glacier: r.ink[800],\n institutional: r.ink[900],\n pedestrian: r.aqua[900],\n aerodrome: r.ink[900],\n runway: r.ink[850],\n pier: r.aqua[600],\n buildings: r.ink[900],\n railway: r.ink[700],\n boundaries: r.coral[400],\n roads: {\n other: r.ink[850],\n otherCasing: r.aqua[980],\n minor: r.ink[800],\n minorCasing: r.aqua[980],\n service: r.ink[850],\n serviceCasing: r.aqua[980],\n major: r.ink[700],\n majorCasing: r.aqua[980],\n highway: r.coral[500],\n highwayCasing: r.aqua[980],\n link: r.coral[600],\n linkCasing: r.aqua[980],\n },\n tunnelFill: r.ink[900],\n tunnelCasing: r.aqua[980],\n bridgeCasing: r.aqua[980],\n labels: {\n city: r.linen[25],\n cityHalo: r.aqua[950],\n state: r.aqua[300],\n stateHalo: r.aqua[950],\n country: r.aqua[300],\n subplace: r.aqua[300],\n subplaceHalo: r.aqua[950],\n address: r.ink[400],\n addressHalo: r.aqua[950],\n roadMinor: r.ink[400],\n roadMinorHalo: r.aqua[950],\n roadMajor: r.linen[100],\n roadMajorHalo: r.aqua[950],\n ocean: r.aqua[200],\n },\n\n pois: {\n blue: r.wave[400],\n green: r.verdant[400],\n lapis: r.sky[400],\n pink: r.rose[400],\n red: r.rose[400],\n slategray: r.graphite[400],\n tangerine: r.sandstone[400],\n turquoise: r.aqua[400],\n },\n landcover: {\n grassland: r.ink[900],\n barren: r.sandstone[500],\n urban_area: r.aqua[950],\n farmland: r.ink[900],\n glacier: r.ink[800],\n scrub: r.ink[850],\n forest: r.jade[800],\n },\n };\n\n /**\n * `sunset` / `light`. After CARTO's *Sunset*: a warm duotone. Cream land (`linen`), peach vegetation\n * (`peach`, not green, on purpose), coral roads up the hierarchy, indigo water and indigo labels — the\n * one cool thing on the page, which is what makes the water read as water.\n */\n const SUNSET_LIGHT: Recipe = {\n background: r.linen[100],\n earth: r.linen[25],\n water: r.indigo[700],\n parkA: r.peach[100],\n parkB: r.peach[200],\n woodA: r.peach[200],\n woodB: r.peach[300],\n scrubA: r.linen[100],\n scrubB: r.peach[100],\n sand: r.peach[200],\n beach: r.peach[100],\n glacier: r.linen[25],\n institutional: r.linen[100],\n pedestrian: r.linen[50],\n aerodrome: r.linen[200],\n runway: r.linen[300],\n pier: r.indigo[300],\n buildings: r.linen[200],\n railway: r.linen[400],\n boundaries: r.indigo[600],\n roads: {\n other: \"#FFFFFF\",\n otherCasing: r.linen[200],\n minor: \"#FFFFFF\",\n minorCasing: r.linen[200],\n service: \"#FFFFFF\",\n serviceCasing: r.linen[200],\n major: \"#FFFFFF\",\n majorCasing: r.coral[300],\n highway: r.coral[500],\n highwayCasing: r.coral[700],\n link: r.coral[400],\n linkCasing: r.coral[600],\n },\n tunnelFill: r.linen[100],\n tunnelCasing: r.linen[200],\n bridgeCasing: r.linen[500],\n labels: {\n city: r.indigo[900],\n cityHalo: r.linen[25],\n state: r.indigo[800],\n stateHalo: r.linen[25],\n country: r.indigo[800],\n subplace: r.indigo[800],\n subplaceHalo: r.linen[25],\n address: r.linen[700],\n addressHalo: r.linen[25],\n roadMinor: r.linen[700],\n roadMinorHalo: r.linen[25],\n roadMajor: r.indigo[900],\n roadMajorHalo: r.linen[25],\n ocean: r.linen[25],\n },\n\n pois: {\n blue: r.wave[700],\n green: r.verdant[700],\n lapis: r.sky[700],\n pink: r.rose[600],\n red: r.rose[700],\n slategray: r.graphite[700],\n tangerine: r.sandstone[500],\n turquoise: r.aqua[700],\n },\n // A step lighter than the parks: the field tint sits under them at up to 0.6 opacity, and at\n // the parks' own steps it turned the whole city orange rather than cream with peach in it.\n landcover: {\n grassland: r.linen[100],\n barren: r.linen[200],\n urban_area: r.linen[50],\n farmland: r.peach[100],\n glacier: r.linen[25],\n scrub: r.linen[100],\n forest: r.peach[200],\n },\n };\n\n /**\n * `sunset` / `dark`. Dusk: an indigo field, water darker still, parks and woods a step lighter in the same\n * indigo, coral highway, peach boundaries and peach labels.\n */\n const SUNSET_DARK: Recipe = {\n background: r.indigo[950],\n earth: r.indigo[900],\n water: r.indigo[1000],\n parkA: r.indigo[850],\n parkB: r.indigo[800],\n woodA: r.indigo[850],\n woodB: r.indigo[800],\n scrubA: r.indigo[900],\n scrubB: r.indigo[850],\n sand: r.peach[800],\n beach: r.indigo[850],\n glacier: r.indigo[700],\n institutional: r.indigo[850],\n pedestrian: r.indigo[850],\n aerodrome: r.indigo[850],\n runway: r.indigo[800],\n pier: r.indigo[600],\n buildings: r.indigo[850],\n railway: r.indigo[700],\n boundaries: r.peach[300],\n roads: {\n other: r.indigo[800],\n otherCasing: r.indigo[950],\n minor: r.indigo[700],\n minorCasing: r.indigo[950],\n service: r.indigo[800],\n serviceCasing: r.indigo[950],\n major: r.indigo[600],\n majorCasing: r.indigo[950],\n highway: r.coral[500],\n highwayCasing: r.indigo[950],\n link: r.coral[600],\n linkCasing: r.indigo[950],\n },\n tunnelFill: r.indigo[850],\n tunnelCasing: r.indigo[950],\n bridgeCasing: r.indigo[950],\n labels: {\n city: r.peach[100],\n cityHalo: r.indigo[900],\n state: r.peach[300],\n stateHalo: r.indigo[900],\n country: r.peach[300],\n subplace: r.peach[300],\n subplaceHalo: r.indigo[900],\n address: r.indigo[400],\n addressHalo: r.indigo[900],\n roadMinor: r.indigo[400],\n roadMinorHalo: r.indigo[900],\n roadMajor: r.peach[100],\n roadMajorHalo: r.indigo[900],\n ocean: r.indigo[500],\n },\n\n pois: {\n blue: r.wave[400],\n green: r.verdant[400],\n lapis: r.sky[400],\n pink: r.rose[400],\n red: r.rose[400],\n slategray: r.graphite[400],\n tangerine: r.sandstone[400],\n turquoise: r.aqua[400],\n },\n landcover: {\n grassland: r.indigo[900],\n barren: r.peach[800],\n urban_area: r.indigo[900],\n farmland: r.indigo[850],\n glacier: r.indigo[700],\n scrub: r.indigo[850],\n forest: r.indigo[800],\n },\n };\n\n /**\n * `bold` / `light`. After CARTO's *Bold* and *Vivid*: the saturated street map. Warm paper land, a clear\n * blue water (`azure`), leaf-green parks (`fern`) and emerald woods (`jade`), an amber highway with an\n * orange casing, indigo boundaries, ink labels.\n */\n const BOLD_LIGHT: Recipe = {\n background: r.paper[100],\n // A step below `base`, which owns the lightest paper: two styles cannot share a land colour\n // (the /styles suite asserts twelve distinct earths), and the saturated water, parks and\n // amber highway read better off a ground that is a shade warmer than the default map's.\n earth: r.paper[50],\n water: r.azure[500],\n parkA: r.fern[300],\n parkB: r.fern[400],\n woodA: r.jade[500],\n woodB: r.jade[600],\n scrubA: r.fern[200],\n scrubB: r.fern[300],\n sand: r.sandstone[200],\n beach: r.sandstone[100],\n glacier: r.ink[25],\n institutional: r.paper[100],\n pedestrian: r.paper[50],\n aerodrome: r.paper[200],\n runway: r.paper[300],\n pier: r.azure[300],\n buildings: r.paper[200],\n railway: r.paper[400],\n boundaries: r.indigo[600],\n roads: {\n other: \"#FFFFFF\",\n otherCasing: r.paper[200],\n minor: \"#FFFFFF\",\n minorCasing: r.paper[200],\n service: \"#FFFFFF\",\n serviceCasing: r.paper[200],\n major: \"#FFFFFF\",\n majorCasing: r.paper[300],\n highway: r.amber[400],\n highwayCasing: r.amber[600],\n link: r.amber[300],\n linkCasing: r.amber[500],\n },\n tunnelFill: r.paper[100],\n tunnelCasing: r.paper[200],\n bridgeCasing: r.paper[500],\n labels: {\n city: r.ink[1000],\n cityHalo: r.paper[25],\n state: r.ink[700],\n stateHalo: r.paper[25],\n country: r.ink[700],\n subplace: r.ink[700],\n subplaceHalo: r.paper[25],\n address: r.ink[700],\n addressHalo: r.paper[25],\n roadMinor: r.ink[700],\n roadMinorHalo: r.paper[25],\n roadMajor: r.ink[800],\n roadMajorHalo: r.paper[25],\n ocean: r.azure[950],\n },\n\n pois: {\n blue: r.wave[700],\n green: r.verdant[700],\n lapis: r.sky[700],\n pink: r.rose[600],\n red: r.rose[700],\n slategray: r.graphite[700],\n tangerine: r.sandstone[500],\n turquoise: r.aqua[700],\n },\n landcover: {\n grassland: r.fern[200],\n barren: r.sandstone[200],\n urban_area: r.paper[100],\n farmland: r.sandstone[100],\n glacier: r.ink[25],\n scrub: r.fern[300],\n forest: r.jade[400],\n },\n };\n\n /**\n * `bold` / `dark`. Ink-black land, a deep blue water that keeps its hue, the greens at their dark steps,\n * amber highway, indigo boundaries, ink labels.\n */\n const BOLD_DARK: Recipe = {\n // A warm ground under cool detail. `outdoor` owns ink[950] and ink is packed below it here\n // (900 scrub and buildings, 850 runway), so the ground moves to paper, which is where this\n // style's light half already sits.\n background: r.paper[1000],\n earth: r.paper[950],\n water: r.azure[800],\n parkA: r.fern[800],\n parkB: r.fern[700],\n woodA: r.jade[850],\n woodB: r.jade[800],\n scrubA: r.ink[900],\n scrubB: r.ink[850],\n sand: r.sandstone[500],\n beach: r.ink[900],\n glacier: r.ink[800],\n institutional: r.ink[900],\n pedestrian: r.ink[900],\n aerodrome: r.ink[900],\n runway: r.ink[850],\n pier: r.azure[600],\n buildings: r.ink[900],\n railway: r.ink[700],\n boundaries: r.indigo[500],\n roads: {\n other: r.ink[850],\n otherCasing: r.ink[1000],\n minor: r.ink[800],\n minorCasing: r.ink[1000],\n service: r.ink[850],\n serviceCasing: r.ink[1000],\n major: r.ink[700],\n majorCasing: r.ink[1000],\n highway: r.amber[500],\n highwayCasing: r.ink[1000],\n link: r.amber[600],\n linkCasing: r.ink[1000],\n },\n tunnelFill: r.ink[900],\n tunnelCasing: r.ink[1000],\n bridgeCasing: r.ink[1000],\n labels: {\n city: r.ink[25],\n cityHalo: r.ink[950],\n state: r.ink[300],\n stateHalo: r.ink[950],\n country: r.ink[300],\n subplace: r.ink[300],\n subplaceHalo: r.ink[950],\n address: r.ink[400],\n addressHalo: r.ink[950],\n roadMinor: r.ink[400],\n roadMinorHalo: r.ink[950],\n roadMajor: r.ink[100],\n roadMajorHalo: r.ink[950],\n ocean: r.azure[300],\n },\n\n pois: {\n blue: r.wave[400],\n green: r.verdant[400],\n lapis: r.sky[400],\n pink: r.rose[400],\n red: r.rose[400],\n slategray: r.graphite[400],\n tangerine: r.sandstone[400],\n turquoise: r.aqua[400],\n },\n landcover: {\n grassland: r.ink[900],\n barren: r.sandstone[500],\n urban_area: r.ink[950],\n farmland: r.ink[900],\n glacier: r.ink[800],\n scrub: r.ink[850],\n forest: r.jade[850],\n },\n };\n\n /**\n * `pastel` / `light`. After CARTO's *Pastel*: lavender-white land (`lilac`), periwinkle water (`cobalt`),\n * mint parks (`jade`), soft leaf woods (`fern`), a salmon highway (`coral`), pale-yellow farmland\n * (`amber`), lavender buildings and boundaries, violet-grey labels.\n */\n const PASTEL_LIGHT: Recipe = {\n background: r.lilac[50],\n earth: r.lilac[25],\n water: r.cobalt[400],\n parkA: r.jade[300],\n parkB: r.jade[400],\n woodA: r.fern[300],\n woodB: r.fern[400],\n scrubA: r.jade[200],\n scrubB: r.jade[300],\n sand: r.sandstone[200],\n beach: r.sandstone[100],\n glacier: r.ink[25],\n institutional: r.lilac[100],\n pedestrian: r.lilac[50],\n aerodrome: r.lilac[200],\n runway: r.lilac[300],\n pier: r.cobalt[300],\n buildings: r.lilac[200],\n railway: r.lilac[400],\n boundaries: r.indigo[500],\n roads: {\n other: \"#FFFFFF\",\n otherCasing: r.lilac[200],\n minor: \"#FFFFFF\",\n minorCasing: r.lilac[200],\n service: \"#FFFFFF\",\n serviceCasing: r.lilac[200],\n major: \"#FFFFFF\",\n majorCasing: r.lilac[300],\n highway: r.coral[400],\n highwayCasing: r.coral[500],\n link: r.coral[300],\n linkCasing: r.coral[400],\n },\n tunnelFill: r.lilac[100],\n tunnelCasing: r.lilac[200],\n bridgeCasing: r.lilac[500],\n labels: {\n city: r.lilac[1000],\n cityHalo: r.lilac[25],\n state: r.lilac[700],\n stateHalo: r.lilac[25],\n country: r.lilac[700],\n subplace: r.lilac[700],\n subplaceHalo: r.lilac[25],\n address: r.lilac[700],\n addressHalo: r.lilac[25],\n roadMinor: r.lilac[700],\n roadMinorHalo: r.lilac[25],\n roadMajor: r.lilac[800],\n roadMajorHalo: r.lilac[25],\n ocean: r.cobalt[800],\n },\n\n pois: {\n blue: r.wave[700],\n green: r.verdant[700],\n lapis: r.sky[700],\n pink: r.rose[600],\n red: r.rose[700],\n slategray: r.graphite[700],\n tangerine: r.sandstone[500],\n turquoise: r.aqua[700],\n },\n landcover: {\n grassland: r.jade[200],\n barren: r.sandstone[200],\n urban_area: r.lilac[100],\n farmland: r.amber[200],\n glacier: r.ink[25],\n scrub: r.jade[300],\n forest: r.fern[400],\n },\n };\n\n /**\n * `pastel` / `dark`. The same pastels dimmed to dusk: deep lilac land, navy water, the greens at their\n * dark steps, the salmon highway kept, lavender labels.\n */\n const PASTEL_DARK: Recipe = {\n background: r.lilac[1000],\n earth: r.lilac[950],\n // Water lighter than land, which `blueprint`, `tropic` and `bold` already do: the three\n // styles whose water is the thing you remember about them. This one's is periwinkle, and at\n // cobalt[950] the dark half had turned it near-black, so the name stopped being true after\n // sundown. Lifting it also unpins the ground, which had to sit at `orchid`'s lilac[900]\n // because the only free step below was within 1.01:1 of that near-black water.\n water: r.cobalt[800],\n parkA: r.jade[850],\n parkB: r.jade[800],\n woodA: r.fern[800],\n woodB: r.fern[700],\n scrubA: r.lilac[850],\n scrubB: r.jade[850],\n sand: r.sandstone[500],\n beach: r.lilac[850],\n glacier: r.lilac[700],\n institutional: r.lilac[850],\n pedestrian: r.lilac[850],\n aerodrome: r.lilac[850],\n runway: r.lilac[800],\n pier: r.cobalt[600],\n buildings: r.lilac[850],\n railway: r.lilac[700],\n boundaries: r.indigo[400],\n roads: {\n other: r.lilac[800],\n otherCasing: r.lilac[1000],\n minor: r.lilac[700],\n minorCasing: r.lilac[1000],\n service: r.lilac[800],\n serviceCasing: r.lilac[1000],\n major: r.lilac[600],\n majorCasing: r.lilac[1000],\n highway: r.coral[400],\n highwayCasing: r.lilac[1000],\n link: r.coral[500],\n linkCasing: r.lilac[1000],\n },\n tunnelFill: r.lilac[850],\n tunnelCasing: r.lilac[1000],\n bridgeCasing: r.lilac[1000],\n labels: {\n city: r.lilac[25],\n cityHalo: r.lilac[950],\n state: r.lilac[300],\n stateHalo: r.lilac[950],\n country: r.lilac[300],\n subplace: r.lilac[300],\n subplaceHalo: r.lilac[950],\n address: r.lilac[400],\n addressHalo: r.lilac[950],\n roadMinor: r.lilac[400],\n roadMinorHalo: r.lilac[950],\n roadMajor: r.lilac[100],\n roadMajorHalo: r.lilac[950],\n ocean: r.cobalt[400],\n },\n\n pois: {\n blue: r.wave[400],\n green: r.verdant[400],\n lapis: r.sky[400],\n pink: r.rose[400],\n red: r.rose[400],\n slategray: r.graphite[400],\n tangerine: r.sandstone[400],\n turquoise: r.aqua[400],\n },\n landcover: {\n grassland: r.lilac[850],\n barren: r.sandstone[500],\n urban_area: r.lilac[900],\n farmland: r.lilac[850],\n glacier: r.lilac[700],\n scrub: r.lilac[850],\n forest: r.fern[800],\n },\n };\n\n // Adapt Bay Atlas's two traditional maps to the Protomaps schema. Shared recipes keep\n // custom themes working; the gateway supplies their typography and relief treatments.\n const traditional = (swiss: boolean, mode: ThemeMode): Recipe => {\n const light = mode === \"light\";\n const land = swiss ? r.swissPaper : r.atlasPaper;\n const water = swiss ? r.swissWater : r.atlasWater;\n const green = swiss ? r.swissGreen : r.atlasGreen;\n const stock = light ? BASE_LIGHT : BASE_DARK;\n const halo = light ? land[25] : land[1000];\n const highway = swiss ? r.swissRoad[400] : (light ? r.atlasRoad[600] : r.atlasRoad[400]);\n const casing = light ? (swiss ? r.swissRoad[800] : r.atlasRoad[800]) : land[1000];\n return {\n ...stock,\n background: light ? land[25] : land[1000],\n earth: light ? land[25] : land[900],\n water: light ? water[200] : water[980],\n parkA: light ? green[100] : green[800],\n parkB: light ? green[200] : green[700],\n woodA: light ? green[200] : green[800],\n woodB: light ? green[300] : green[700],\n scrubA: light ? green[100] : green[900],\n scrubB: light ? green[200] : green[800],\n institutional: light ? land[100] : land[950],\n pedestrian: light ? land[25] : land[950],\n buildings: light ? land[200] : land[700],\n railway: swiss ? r.swissRoad[600] : land[700],\n boundaries: light ? r.lilac[600] : r.lilac[400],\n roads: {\n other: light ? land[500] : land[700],\n otherCasing: light ? land[700] : land[1000],\n minor: light ? \"#FFFFFF\" : land[500],\n minorCasing: light ? land[700] : land[1000],\n service: light ? land[25] : land[700],\n serviceCasing: light ? land[500] : land[1000],\n major: swiss ? r.swissRoad[500] : (light ? r.atlasRoad[500] : r.atlasRoad[300]),\n majorCasing: casing,\n highway,\n highwayCasing: casing,\n link: highway,\n linkCasing: casing,\n },\n tunnelFill: light ? land[100] : land[950],\n tunnelCasing: light ? land[500] : land[1000],\n bridgeCasing: casing,\n labels: {\n city: light ? land[900] : land[25], cityHalo: halo,\n state: light ? land[700] : land[500], stateHalo: halo,\n country: light ? land[700] : land[500],\n subplace: light ? land[700] : land[500], subplaceHalo: halo,\n address: light ? land[700] : land[500], addressHalo: halo,\n roadMinor: light ? land[800] : land[500], roadMinorHalo: halo,\n roadMajor: light ? land[900] : land[200], roadMajorHalo: halo,\n ocean: light ? water[700] : water[400],\n },\n pois: { ...stock.pois!, green: light ? green[700] : green[300], blue: light ? water[700] : water[400] },\n landcover: {\n grassland: light ? green[100] : green[900],\n barren: light ? land[200] : land[700],\n urban_area: light ? land[100] : land[950],\n farmland: light ? land[25] : land[950],\n glacier: light ? water[200] : water[950],\n scrub: light ? green[100] : green[900],\n forest: light ? green[200] : green[800],\n },\n };\n };\n\n return {\n base: { light: BASE_LIGHT, dark: BASE_DARK },\n muted: { light: MUTED_LIGHT, dark: MUTED_DARK },\n outdoor: { light: OUTDOOR_LIGHT, dark: OUTDOOR_DARK },\n blueprint: { light: BLUEPRINT_LIGHT, dark: BLUEPRINT_DARK },\n blush: { light: BLUSH_LIGHT, dark: BLUSH_DARK },\n orchid: { light: ORCHID_LIGHT, dark: ORCHID_DARK },\n canopy: { light: CANOPY_LIGHT, dark: CANOPY_DARK },\n lagoon: { light: LAGOON_LIGHT, dark: LAGOON_DARK },\n tropic: { light: TROPIC_LIGHT, dark: TROPIC_DARK },\n sunset: { light: SUNSET_LIGHT, dark: SUNSET_DARK },\n bold: { light: BOLD_LIGHT, dark: BOLD_DARK },\n pastel: { light: PASTEL_LIGHT, dark: PASTEL_DARK },\n atlas: { light: traditional(false, \"light\"), dark: traditional(false, \"dark\") },\n swiss: { light: traditional(true, \"light\"), dark: traditional(true, \"dark\") },\n };\n}\n\nexport const RECIPES: Record<\n ThemeBase,\n Record<ThemeMode, Recipe>\n> = buildRecipes(STOCK_RAMPS);\n","import type { Recipe, ThemeBase } from \"./recipe\";\n\n/**\n * The unmap theme document: one theme, both modes, data only.\n *\n * A theme is colours, bounded numbers and one enum — never URLs, never expressions, never\n * arbitrary style JSON. That is a security boundary, not a modelling choice: theme documents\n * arrive on public query strings and are composed into style JSON the gateway signs its own\n * asset URLs into. `validateTheme` is the only door in.\n *\n * `base` names the style (one of the shipped styles); each half carries only sparse overrides\n * on that style, so presets are near-empty documents and codes stay short.\n */\n\n// NonNullable before the object test: optional Recipe fields (pois, landcover on the upstream\n// Flavor type) are `X | undefined`, and a union never `extends object`, so without it those\n// two would demand complete objects instead of partial ones.\nexport type DeepPartial<T> = {\n [K in keyof T]?: NonNullable<T[K]> extends object ? DeepPartial<NonNullable<T[K]>> : T[K];\n};\n\nexport type BasemapOverrides = DeepPartial<Recipe>;\n\nexport interface MarkerTheme {\n /** Pin colour, #RRGGBB or #RRGGBBAA. */\n color?: string;\n /** Pin scale, 0.5–2. */\n scale?: number;\n}\n\nexport interface RouteTheme {\n /** Main stroke colour. */\n color?: string;\n /** Main stroke width in px, 1–12. */\n width?: number;\n /** Main stroke opacity, 0–1. */\n opacity?: number;\n /** Under-stroke (casing) colour. */\n casingColor?: string;\n /** Casing width in px, 0–24. 0 disables the casing. */\n casingWidth?: number;\n /** Casing opacity, 0–1. */\n casingOpacity?: number;\n}\n\nexport interface ThemeHalf {\n basemap?: BasemapOverrides;\n marker?: MarkerTheme;\n route?: RouteTheme;\n}\n\n/**\n * The simple-mode seed colours a generated theme was built from. Carried on the document so a\n * shared code reopens the builder in simple mode with the seeds intact; the gateway validates\n * them like any other field and otherwise ignores them — composition reads only the halves.\n */\nexport interface ThemeSeeds {\n /** Neutral cast: land, buildings, roads, labels. */\n land: string;\n water: string;\n /** Vegetation: parks, wood, scrub, forest landcover. */\n nature: string;\n /** Marker + route accent. Defaults to the interface magenta. */\n accent?: string;\n}\n\n/**\n * The major layer groups a theme can hide or reorder, in their stock bottom-to-top draw order.\n * Every layer the cartography draws belongs to exactly one of these (see `layerGroupOf`) except\n * the background, which always stays underneath. `buildings3d` is the one group that is off by\n * default: it draws building extrusions from the tiles' `height` property on top of the roads.\n *\n * Append only, like `THEME_BASES`: the names are on the wire in every `ut1.` code.\n */\nexport const LAYER_GROUPS = [\n \"land\",\n \"water\",\n \"buildings\",\n \"roads\",\n \"boundaries\",\n \"buildings3d\",\n \"labels\",\n] as const;\nexport type LayerGroup = (typeof LAYER_GROUPS)[number];\n\n/**\n * Structural overrides on the layer groups. Doc-level, not per half: which layers draw, and in\n * what order, is one decision for both modes — colour is the only thing that differs between\n * light and dark. Sparse like the halves: an absent field means stock.\n */\nexport interface ThemeLayers {\n /**\n * Per-group visibility; a missing key means the group's default (every group on except\n * `buildings3d`). Hidden groups are dropped from the style entirely.\n */\n visible?: Partial<Record<LayerGroup, boolean>>;\n /**\n * Bottom-to-top draw order, always the full set of groups exactly once. Absent means the\n * stock cartography order, in which the groups interleave (tunnels under buildings, bridges\n * over boundaries); an explicit order regroups every layer under its group.\n */\n order?: LayerGroup[];\n}\n\nexport interface ThemeDoc {\n v: 1;\n /** Display name, ≤ 40 chars. */\n name?: string;\n base: ThemeBase;\n seeds?: ThemeSeeds;\n layers?: ThemeLayers;\n light?: ThemeHalf;\n dark?: ThemeHalf;\n}\n","import { THEME_BASES, isThemeBase } from \"./recipe\";\nimport { RECIPES } from \"./recipes\";\nimport { LAYER_GROUPS, type LayerGroup, type ThemeDoc } from \"./doc\";\n\n/**\n * Validation failure. `detail` lists every bad path in one throw — collect-then-throw, so a\n * builder user fixing a hand-edited document sees all of it at once rather than one field per\n * round trip (the same reporting philosophy as the cartography contrast tests).\n */\nexport class ThemeError extends Error {\n readonly detail: string[];\n constructor(message: string, detail: string[]) {\n super(message);\n this.name = \"ThemeError\";\n this.detail = detail;\n }\n}\n\n/** 6- or 8-digit hex only. Hex-by-grammar is what makes \"no URLs, no expressions\" a property. */\nconst HEX = /^#[0-9a-fA-F]{6}([0-9a-fA-F]{2})?$/;\n\nconst MAX_NAME_LENGTH = 40;\n\n/** [min, max] bounds per numeric field. */\nconst MARKER_BOUNDS: Record<string, readonly [number, number]> = {\n scale: [0.5, 2],\n};\nconst ROUTE_BOUNDS: Record<string, readonly [number, number]> = {\n width: [1, 12],\n opacity: [0, 1],\n casingWidth: [0, 24],\n casingOpacity: [0, 1],\n};\n\nconst isRecord = (v: unknown): v is Record<string, unknown> =>\n typeof v === \"object\" && v !== null && !Array.isArray(v);\n\n/**\n * Validate a basemap override object against the Recipe shape, using a real recipe as the\n * schema: a key is legal iff it exists on the reference, objects recurse, strings must be hex.\n * The data is the schema, so the validator can never drift from what `mergeRecipe` accepts.\n */\nfunction walkBasemap(value: unknown, reference: unknown, path: string, errors: string[]): void {\n if (!isRecord(value)) {\n errors.push(`${path}: must be an object`);\n return;\n }\n const ref = reference as Record<string, unknown>;\n for (const [key, v] of Object.entries(value)) {\n const target = ref[key];\n const p = `${path}.${key}`;\n if (target === undefined) {\n errors.push(`${p}: unknown field`);\n } else if (typeof target === \"string\") {\n if (typeof v !== \"string\" || !HEX.test(v)) {\n errors.push(`${p}: must be a hex colour (#RRGGBB or #RRGGBBAA)`);\n }\n } else {\n walkBasemap(v, target, p, errors);\n }\n }\n}\n\n/** Validate a flat colour+number leaf object (marker/route) against a bounds table. */\nfunction walkLeaf(\n value: unknown,\n colorKeys: readonly string[],\n bounds: Record<string, readonly [number, number]>,\n path: string,\n errors: string[],\n): void {\n if (!isRecord(value)) {\n errors.push(`${path}: must be an object`);\n return;\n }\n for (const [key, v] of Object.entries(value)) {\n const p = `${path}.${key}`;\n if (colorKeys.includes(key)) {\n if (typeof v !== \"string\" || !HEX.test(v)) {\n errors.push(`${p}: must be a hex colour (#RRGGBB or #RRGGBBAA)`);\n }\n } else if (key in bounds) {\n const [lo, hi] = bounds[key]!;\n if (typeof v !== \"number\" || !Number.isFinite(v) || v < lo || v > hi) {\n errors.push(`${p}: out of bounds (${lo}–${hi})`);\n }\n } else {\n errors.push(`${p}: unknown field`);\n }\n }\n}\n\nconst HALF_KEYS = [\"basemap\", \"marker\", \"route\"] as const;\nconst DOC_KEYS = [\"v\", \"name\", \"base\", \"seeds\", \"layers\", \"light\", \"dark\"] as const;\nconst LAYERS_KEYS = [\"visible\", \"order\"] as const;\n\nconst isLayerGroup = (v: unknown): v is LayerGroup =>\n typeof v === \"string\" && (LAYER_GROUPS as readonly string[]).includes(v);\n\n/**\n * Validate the structural `layers` field: `visible` maps known groups to booleans, `order` is\n * the full set of groups exactly once. Both are enums by grammar, so like the colours they can\n * never carry a layer id, a filter, or anything else the style would execute.\n */\nfunction walkLayers(value: unknown, errors: string[]): void {\n if (!isRecord(value)) {\n errors.push(\"layers: must be an object\");\n return;\n }\n for (const key of Object.keys(value)) {\n if (!(LAYERS_KEYS as readonly string[]).includes(key)) errors.push(`layers.${key}: unknown field`);\n }\n if (value.visible !== undefined) {\n if (!isRecord(value.visible)) {\n errors.push(\"layers.visible: must be an object\");\n } else {\n for (const [group, v] of Object.entries(value.visible)) {\n if (!isLayerGroup(group)) errors.push(`layers.visible.${group}: unknown layer group`);\n else if (typeof v !== \"boolean\") errors.push(`layers.visible.${group}: must be a boolean`);\n }\n }\n }\n if (value.order !== undefined) {\n const order = value.order;\n if (!Array.isArray(order)) {\n errors.push(\"layers.order: must be an array\");\n } else {\n order.forEach((g, i) => {\n if (!isLayerGroup(g)) errors.push(`layers.order[${i}]: unknown layer group`);\n });\n const known = order.filter(isLayerGroup);\n if (new Set(known).size !== known.length || known.length !== LAYER_GROUPS.length) {\n errors.push(`layers.order: must list each of ${LAYER_GROUPS.join(\", \")} exactly once`);\n }\n }\n }\n}\nconst SEED_COLOR_KEYS = [\"land\", \"water\", \"nature\", \"accent\"] as const;\nconst REQUIRED_SEED_KEYS = [\"land\", \"water\", \"nature\"] as const;\n\n/**\n * Validate an untrusted value as a ThemeDoc. Returns the (unchanged) document on success;\n * throws a `ThemeError` naming every invalid path otherwise. Unknown fields anywhere are\n * errors — a theme is data only, and the reject-unknown posture is what keeps it that way.\n */\nexport function validateTheme(input: unknown): ThemeDoc {\n const errors: string[] = [];\n if (!isRecord(input)) {\n throw new ThemeError(\"invalid theme\", [\"theme must be a JSON object\"]);\n }\n\n for (const key of Object.keys(input)) {\n if (!(DOC_KEYS as readonly string[]).includes(key)) errors.push(`${key}: unknown field`);\n }\n\n if (input.v !== 1) errors.push(\"v: must be 1\");\n if (!isThemeBase(input.base)) {\n errors.push(`base: must be one of ${THEME_BASES.join(\", \")}`);\n }\n if (input.name !== undefined) {\n if (typeof input.name !== \"string\" || input.name.length > MAX_NAME_LENGTH) {\n errors.push(`name: must be a string of at most ${MAX_NAME_LENGTH} characters`);\n }\n }\n\n if (input.seeds !== undefined) {\n walkLeaf(input.seeds, SEED_COLOR_KEYS, {}, \"seeds\", errors);\n if (isRecord(input.seeds)) {\n for (const key of REQUIRED_SEED_KEYS) {\n if (input.seeds[key] === undefined) errors.push(`seeds.${key}: required`);\n }\n }\n }\n\n if (input.layers !== undefined) walkLayers(input.layers, errors);\n\n // Any complete recipe works as the schema reference; base.light is as good as any.\n const reference = RECIPES.base.light;\n\n for (const mode of [\"light\", \"dark\"] as const) {\n const half = input[mode];\n if (half === undefined) continue;\n if (!isRecord(half)) {\n errors.push(`${mode}: must be an object`);\n continue;\n }\n for (const key of Object.keys(half)) {\n if (!(HALF_KEYS as readonly string[]).includes(key)) {\n errors.push(`${mode}.${key}: unknown field`);\n }\n }\n if (half.basemap !== undefined) walkBasemap(half.basemap, reference, `${mode}.basemap`, errors);\n if (half.marker !== undefined) {\n walkLeaf(half.marker, [\"color\"], MARKER_BOUNDS, `${mode}.marker`, errors);\n }\n if (half.route !== undefined) {\n walkLeaf(half.route, [\"color\", \"casingColor\"], ROUTE_BOUNDS, `${mode}.route`, errors);\n }\n }\n\n if (errors.length > 0) throw new ThemeError(\"invalid theme\", errors);\n return input as unknown as ThemeDoc;\n}\n","import type { ThemeDoc } from \"./doc\";\nimport type { ThemeBase } from \"./recipe\";\n\n/**\n * The shipped styles as starting-point themes: zero overrides, so each is guaranteed identical\n * to the style it names, served at `/styles/<style>.json` (asserted in the gateway theme tests).\n * The builder opens on these.\n *\n * Named after the style itself — `base`, `muted`, `outdoor`, `blueprint`, `blush`, … — the same word the homepage, the\n * SDK's `style` option and the gateway URL use. The theme presets (`process ink`, `boreal`, …)\n * are a separate set layered on a style; a style never borrows one's name.\n */\nexport const STYLE_THEMES: Record<ThemeBase, ThemeDoc> = {\n base: { v: 1, name: \"base\", base: \"base\" },\n muted: { v: 1, name: \"muted\", base: \"muted\" },\n outdoor: { v: 1, name: \"outdoor\", base: \"outdoor\" },\n blueprint: { v: 1, name: \"blueprint\", base: \"blueprint\" },\n blush: { v: 1, name: \"blush\", base: \"blush\" },\n orchid: { v: 1, name: \"orchid\", base: \"orchid\" },\n canopy: { v: 1, name: \"canopy\", base: \"canopy\" },\n lagoon: { v: 1, name: \"lagoon\", base: \"lagoon\" },\n tropic: { v: 1, name: \"tropic\", base: \"tropic\" },\n sunset: { v: 1, name: \"sunset\", base: \"sunset\" },\n bold: { v: 1, name: \"bold\", base: \"bold\" },\n pastel: { v: 1, name: \"pastel\", base: \"pastel\" },\n atlas: { v: 1, name: \"atlas\", base: \"atlas\" },\n swiss: { v: 1, name: \"swiss\", base: \"swiss\" },\n};\n","/**\n * Minimal sRGB ↔ OKLCH conversion (Björn Ottosson's OKLab constants), plus a chroma-reducing\n * gamut map. Zero dependencies — the generator is the only consumer and needs exactly this.\n *\n * OKLCH is the working space for the same reason the hand-built ramps in `palette.ts` were\n * generated in it: perceived lightness is carried almost entirely by L, so a generator can swap\n * hue and chroma while *preserving a ramp's lightness ladder* — which is where the label\n * contrast the cartography tests enforce actually lives.\n */\n\nexport interface Oklch {\n /** Perceptual lightness, 0–1. */\n l: number;\n /** Chroma, 0 upward (~0.37 max for sRGB). */\n c: number;\n /** Hue in degrees, 0–360. */\n h: number;\n}\n\nconst srgbToLinear = (v: number) => (v <= 0.04045 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4);\nconst linearToSrgb = (v: number) =>\n v <= 0.0031308 ? 12.92 * v : 1.055 * v ** (1 / 2.4) - 0.055;\n\nfunction hexToRgb(hex: string): [number, number, number] {\n const h = hex.replace(\"#\", \"\");\n return [\n parseInt(h.slice(0, 2), 16) / 255,\n parseInt(h.slice(2, 4), 16) / 255,\n parseInt(h.slice(4, 6), 16) / 255,\n ];\n}\n\n/** Parse #RRGGBB (or #RRGGBBAA — alpha ignored) into OKLCH. */\nexport function hexToOklch(hex: string): Oklch {\n const [r, g, b] = hexToRgb(hex).map(srgbToLinear) as [number, number, number];\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\n const L = 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s;\n const a = 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s;\n const bb = 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s;\n const c = Math.hypot(a, bb);\n let h = (Math.atan2(bb, a) * 180) / Math.PI;\n if (h < 0) h += 360;\n return { l: L, c, h };\n}\n\n/** OKLCH → linear sRGB triple (possibly out of gamut). */\nfunction oklchToLinear({ l: L, c, h }: Oklch): [number, number, number] {\n const hr = (h * Math.PI) / 180;\n const a = c * Math.cos(hr);\n const bb = c * Math.sin(hr);\n const l = (L + 0.3963377774 * a + 0.2158037573 * bb) ** 3;\n const m = (L - 0.1055613458 * a - 0.0638541728 * bb) ** 3;\n const s = (L - 0.0894841775 * a - 1.291485548 * bb) ** 3;\n return [\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,\n ];\n}\n\nconst inGamut = (rgb: [number, number, number]) =>\n rgb.every((v) => v >= -1e-6 && v <= 1 + 1e-6);\n\n/**\n * OKLCH → #RRGGBB. Out-of-gamut colours are mapped by *reducing chroma* at constant L and h\n * (bisection), never by clipping channels — clipping shifts perceived lightness, and the whole\n * generator contract is that L is preserved.\n */\nexport function oklchToHex(color: Oklch): string {\n let { c } = color;\n let rgb = oklchToLinear({ ...color, c });\n if (!inGamut(rgb)) {\n let lo = 0;\n let hi = c;\n for (let i = 0; i < 24; i++) {\n c = (lo + hi) / 2;\n rgb = oklchToLinear({ ...color, c });\n if (inGamut(rgb)) lo = c;\n else hi = c;\n }\n rgb = oklchToLinear({ ...color, c: lo });\n }\n const to255 = (v: number) => Math.round(Math.min(1, Math.max(0, linearToSrgb(v))) * 255);\n return (\n \"#\" +\n rgb\n .map((v) => to255(v).toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toUpperCase()\n );\n}\n","import type { Flavor } from \"@protomaps/basemaps\";\nimport { makeFlavor, type Recipe, type ThemeBase, type ThemeMode } from \"./recipe\";\nimport { RECIPES } from \"./recipes\";\nimport type { BasemapOverrides, MarkerTheme, RouteTheme, ThemeDoc } from \"./doc\";\n\n/**\n * Platform drawing defaults for the two client-side overlays a theme styles. These are exactly\n * the convention the unmap.dev hero has always drawn: a magenta pin, and a route as a solid\n * line over a wide translucent casing so it stays legible on light and dark cartography alike.\n */\nexport const DEFAULT_MARKER: Required<MarkerTheme> = { color: \"#FF3E9A\", scale: 1 };\nexport const DEFAULT_ROUTE: Required<RouteTheme> = {\n color: \"#FF3E9A\",\n width: 3,\n opacity: 1,\n casingColor: \"#FF3E9A\",\n casingWidth: 10,\n casingOpacity: 0.2,\n};\n\nexport interface ResolvedTheme {\n /** `<base>-<mode>`, the flavour name — what selects sprites and terrain behaviour. */\n flavorName: `${ThemeBase}-${ThemeMode}`;\n flavor: Flavor;\n marker: Required<MarkerTheme>;\n route: Required<RouteTheme>;\n}\n\n/**\n * Merge sparse overrides onto a base recipe, walking the base's own shape. Composing from the\n * base's keys (never spreading the override object) means an unexpected key cannot ride along\n * even if a caller skipped validation — defence in depth behind `validateTheme`.\n */\nexport function mergeRecipe(base: Recipe, overrides?: BasemapOverrides): Recipe {\n if (!overrides) return structuredClone(base);\n const walk = (ref: Record<string, unknown>, over: Record<string, unknown>) => {\n const out: Record<string, unknown> = {};\n for (const [key, refValue] of Object.entries(ref)) {\n const o = over[key];\n if (refValue !== null && typeof refValue === \"object\") {\n out[key] =\n o !== null && typeof o === \"object\" && !Array.isArray(o)\n ? walk(refValue as Record<string, unknown>, o as Record<string, unknown>)\n : structuredClone(refValue);\n } else {\n out[key] = typeof o === \"string\" ? o : refValue;\n }\n }\n return out;\n };\n return walk(\n base as unknown as Record<string, unknown>,\n overrides as Record<string, unknown>,\n ) as unknown as Recipe;\n}\n\n/**\n * Resolve one half of a theme into everything a renderer needs: the expanded Flavor, the\n * flavour name, and marker/route styles with defaults filled in.\n */\nexport function resolveTheme(doc: ThemeDoc, mode: ThemeMode): ResolvedTheme {\n const half = doc[mode] ?? {};\n const recipe = mergeRecipe(RECIPES[doc.base][mode], half.basemap);\n return {\n flavorName: `${doc.base}-${mode}`,\n flavor: makeFlavor(recipe),\n marker: { ...DEFAULT_MARKER, ...half.marker },\n route: { ...DEFAULT_ROUTE, ...half.route },\n };\n}\n","import type { Flavor } from \"@protomaps/basemaps\";\nimport { MODES, type ThemeMode } from \"./recipe\";\nimport type { ThemeDoc } from \"./doc\";\nimport { resolveTheme } from \"./compose\";\n\n/**\n * Label-contrast checks for theme documents — the same WCAG maths and label/background pairs\n * `apps/gateway/test/cartography.test.ts` enforces on unmap's own flavors, exported as a\n * library so the builder can warn live.\n *\n * Warn, not reject: the gateway holds its own flavors to these floors, but a custom theme is\n * the customer's canvas. The builder surfaces every breach; shipping one anyway is a choice.\n */\n\nfunction parseHex(hex: string): [number, number, number] {\n const h = hex.replace(\"#\", \"\");\n return [\n parseInt(h.slice(0, 2), 16),\n parseInt(h.slice(2, 4), 16),\n parseInt(h.slice(4, 6), 16),\n ];\n}\n\nfunction luminance(hex: string): number {\n const toLinear = (v: number) => {\n const c = v / 255;\n return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n };\n const [r, g, b] = parseHex(hex);\n return 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n}\n\n/** WCAG contrast ratio between two hex colours (1–21). */\nexport function contrast(a: string, b: string): number {\n const la = luminance(a);\n const lb = luminance(b);\n const [hi, lo] = la > lb ? [la, lb] : [lb, la];\n return (hi + 0.05) / (lo + 0.05);\n}\n\n/**\n * Halo colour is the effective background wherever a halo is set, because that is what the\n * glyph actually sits on. Where there is no halo slot (country labels), the label sits on the\n * land; ocean labels sit on water.\n */\nconst PRIMARY: Array<[keyof Flavor, keyof Flavor]> = [\n [\"city_label\", \"city_label_halo\"],\n [\"state_label\", \"state_label_halo\"],\n [\"country_label\", \"earth\"],\n [\"roads_label_major\", \"roads_label_major_halo\"],\n];\n\nconst SECONDARY: Array<[keyof Flavor, keyof Flavor]> = [\n [\"subplace_label\", \"subplace_label_halo\"],\n [\"address_label\", \"address_label_halo\"],\n [\"roads_label_minor\", \"roads_label_minor_halo\"],\n [\"ocean_label\", \"water\"],\n];\n\n/** Every enforced pair with its floor — the generator's contrast-clamp iterates these. */\nexport const LABEL_PAIRS: Array<[keyof Flavor, keyof Flavor, number]> = [\n ...PRIMARY.map(([l, b]) => [l, b, 4.5] as [keyof Flavor, keyof Flavor, number]),\n ...SECONDARY.map(([l, b]) => [l, b, 3] as [keyof Flavor, keyof Flavor, number]),\n];\n\nexport interface ContrastWarning {\n mode: ThemeMode;\n /** The Flavor label slot that breaches, e.g. \"city_label\". */\n label: string;\n /** The Flavor slot it was checked against, e.g. \"city_label_halo\". */\n background: string;\n ratio: number;\n /** 4.5 for primary labels, 3 for secondary. */\n floor: number;\n}\n\n/** Every label-contrast breach in the theme, across both modes. Empty means clean. */\nexport function contrastWarnings(doc: ThemeDoc): ContrastWarning[] {\n const warnings: ContrastWarning[] = [];\n for (const mode of MODES) {\n const flavor = resolveTheme(doc, mode).flavor as unknown as Record<string, string>;\n const check = (pairs: Array<[keyof Flavor, keyof Flavor]>, floor: number) => {\n for (const [label, background] of pairs) {\n const ratio = contrast(flavor[label as string]!, flavor[background as string]!);\n if (ratio < floor) {\n warnings.push({ mode, label: String(label), background: String(background), ratio, floor });\n }\n }\n };\n check(PRIMARY, 4.5);\n check(SECONDARY, 3);\n }\n return warnings;\n}\n","import { hexToOklch, oklchToHex } from \"./oklch\";\nimport { buildRecipes, RECIPES, STOCK_RAMPS, type RampSet } from \"./recipes\";\nimport { makeFlavor, MODES, type Recipe, type ThemeBase } from \"./recipe\";\nimport type { BasemapOverrides, ThemeDoc, ThemeSeeds } from \"./doc\";\nimport { contrast, LABEL_PAIRS } from \"./contrast\";\n\n/**\n * The simple-mode generator: three seed colours in, a full light + dark theme out.\n *\n * The trick is the one the hand-built ramps were made with. Each stock ramp is a *lightness\n * ladder* — its steps were solved so the label-contrast floors hold — and hue/chroma merely\n * carry identity. So the generator keeps every step's OKLCH lightness exactly, swaps in the\n * seed's hue, scales chroma to the seed's vividness, and rebuilds the recipes through the same\n * `buildRecipes` factory the shipped cartography uses. Casing/tunnel/bridge coherence and the\n * figure/ground relationships come along for free; the seeds only ever recolour.\n *\n * The output is a plain, valid ThemeDoc (sparse overrides + the seeds themselves), so nothing\n * downstream — codec, gateway, SDK — knows generation exists.\n */\n\n/** Neutrals must stay a cast, not a colour, or the whole map shouts. */\nconst NEUTRAL_CHROMA_CAP = 0.045;\n/** `muted` exists to vanish under data; its cast cap is a whisper of the normal one. */\nconst MUTED_CHROMA_CAP = 0.012;\n/** Ceiling for chromatic families (water, vegetation) before gamut mapping. */\nconst CHROMA_CAP = 0.32;\n/** Below this mid-step chroma a ramp is greyscale and is re-hued from the seed directly. */\nconst NEUTRAL_RAMP_CHROMA = 0.005;\n\n/** The seeds that reproduce (approximately) the stock cartography. Simple mode opens on these. */\nexport const DEFAULT_SEEDS: Required<ThemeSeeds> = {\n land: STOCK_RAMPS.ink[500],\n water: STOCK_RAMPS.wave[500],\n nature: STOCK_RAMPS.verdant[500],\n accent: \"#FF3E9A\",\n};\n\ntype Ramp = Record<string | number, string>;\n\n/**\n * Re-emit a ramp in the seed's hue: every step keeps its stock lightness, chroma scales by the\n * seed's vividness relative to the ramp's own mid-step, clamped to `cap`.\n */\nfunction reRamp<T extends Ramp>(ref: T, seedHex: string, cap: number): T {\n const seed = hexToOklch(seedHex);\n const steps = Object.keys(ref);\n const midStep = steps[Math.floor(steps.length / 2)]!;\n const midChroma = hexToOklch(ref[midStep]!).c;\n // A greyscale ramp (`graphite`, `mist`) has no chroma to scale, so it takes the seed's\n // chroma outright at every step; the cap still decides how much of it survives.\n const neutral = midChroma < NEUTRAL_RAMP_CHROMA;\n const factor = Math.min(Math.max(seed.c / Math.max(midChroma, 0.005), 0.15), 3);\n const out: Ramp = {};\n for (const step of steps) {\n const refColor = hexToOklch(ref[step]!);\n out[step] = oklchToHex({\n l: refColor.l,\n c: Math.min(neutral ? seed.c : refColor.c * factor, cap),\n h: seed.h,\n });\n }\n return out as T;\n}\n\n/**\n * Enforce the label floors on a generated flavor's recipe. Lightness is preserved from the\n * stock ladders, which pass with margin, but WCAG contrast is computed in sRGB luminance and a\n * strong hue shift can erode that margin — so each breaching label slot has its OKLCH lightness\n * nudged away from its background until the pair clears. Bounded and deterministic.\n */\nfunction enforceLabelContrast(recipe: Recipe): Recipe {\n const fixed = structuredClone(recipe);\n for (const [labelSlot, bgSlot, floor] of LABEL_PAIRS) {\n for (let i = 0; i < 40; i++) {\n const flavor = makeFlavor(fixed) as unknown as Record<string, string>;\n const label = flavor[labelSlot as string]!;\n const bg = flavor[bgSlot as string]!;\n if (contrast(label, bg) >= floor) break;\n const l = hexToOklch(label);\n const direction = hexToOklch(bg).l > l.l ? -1 : 1;\n const nudged = oklchToHex({\n ...l,\n l: Math.min(1, Math.max(0, l.l + direction * 0.015)),\n });\n setLabelSlot(fixed, labelSlot as string, nudged);\n }\n }\n return fixed;\n}\n\n/** Map a Flavor label slot back to its Recipe field. Only slots LABEL_PAIRS can name. */\nconst LABEL_SLOT_TO_RECIPE: Record<string, (r: Recipe, hex: string) => void> = {\n city_label: (r, v) => (r.labels.city = v),\n state_label: (r, v) => (r.labels.state = v),\n country_label: (r, v) => (r.labels.country = v),\n roads_label_major: (r, v) => (r.labels.roadMajor = v),\n subplace_label: (r, v) => (r.labels.subplace = v),\n address_label: (r, v) => (r.labels.address = v),\n roads_label_minor: (r, v) => (r.labels.roadMinor = v),\n ocean_label: (r, v) => (r.labels.ocean = v),\n};\n\nfunction setLabelSlot(recipe: Recipe, slot: string, hex: string): void {\n LABEL_SLOT_TO_RECIPE[slot]?.(recipe, hex);\n}\n\n/** Diff a generated recipe against the stock one into sparse overrides. */\nfunction diffRecipe(\n stock: Recipe,\n generated: Recipe,\n): BasemapOverrides | undefined {\n const walk = (a: Record<string, unknown>, b: Record<string, unknown>) => {\n const out: Record<string, unknown> = {};\n for (const [key, stockValue] of Object.entries(a)) {\n const genValue = b[key];\n if (stockValue !== null && typeof stockValue === \"object\") {\n const nested = walk(\n stockValue as Record<string, unknown>,\n (genValue ?? {}) as Record<string, unknown>,\n );\n if (Object.keys(nested).length > 0) out[key] = nested;\n } else if (typeof genValue === \"string\" && genValue !== stockValue) {\n out[key] = genValue;\n }\n }\n return out;\n };\n const diff = walk(\n stock as unknown as Record<string, unknown>,\n generated as unknown as Record<string, unknown>,\n );\n return Object.keys(diff).length > 0 ? (diff as BasemapOverrides) : undefined;\n}\n\n/**\n * Generate a full theme from seed colours. Deterministic; the result always clears the label\n * floors in both modes (enforced, and asserted by the hue-sweep test).\n *\n * Family mapping: `land` recolours the land spines — `ink`, `base`'s `paper`, `muted`'s\n * `graphite` at a whisper of chroma (that style exists to vanish under data), and the\n * single-hue family of `blueprint` (`cobalt`) at full chroma (and `jade`, which `orchid`, `tropic`, `bold` and `pastel` draw their greens from), so a\n * seed can carry them to any hue, plus `blush`'s `rose`, `orchid`'s `lilac`, the cream `linen` of\n * `tropic` and `sunset`, and `sunset`'s `indigo`. `nature` recolours `verdant`, `sunset`'s `peach`\n * and the teal `aqua` of `orchid` and `lagoon`. `water` recolours the wave, sky, azure and mist ramps (`mist` is\n * greyscale in stock `muted` and takes the water seed's hue outright), and the water fill of\n * every style whatever ramp it is drawn from, `nature` the verdant ramp. Warm landcover (sandstone), the highway ramps (ember, coral, amber), POI accents and white road fills stay stock: they\n * are tuned relationships, not identity. `accent` styles the marker and route overlays only —\n * it never enters the basemap, same rule as the brand magenta.\n */\nexport function generateTheme(base: ThemeBase, seeds: ThemeSeeds): ThemeDoc {\n const ramps: RampSet = {\n ...STOCK_RAMPS,\n atlasPaper: reRamp(STOCK_RAMPS.atlasPaper, seeds.land, NEUTRAL_CHROMA_CAP),\n atlasWater: reRamp(STOCK_RAMPS.atlasWater, seeds.water, CHROMA_CAP),\n atlasGreen: reRamp(STOCK_RAMPS.atlasGreen, seeds.nature, CHROMA_CAP),\n swissPaper: reRamp(STOCK_RAMPS.swissPaper, seeds.land, NEUTRAL_CHROMA_CAP),\n swissWater: reRamp(STOCK_RAMPS.swissWater, seeds.water, CHROMA_CAP),\n swissGreen: reRamp(STOCK_RAMPS.swissGreen, seeds.nature, CHROMA_CAP),\n\n ink: reRamp(STOCK_RAMPS.ink, seeds.land, NEUTRAL_CHROMA_CAP),\n paper: reRamp(STOCK_RAMPS.paper, seeds.land, NEUTRAL_CHROMA_CAP),\n graphite: reRamp(STOCK_RAMPS.graphite, seeds.land, MUTED_CHROMA_CAP),\n jade: reRamp(STOCK_RAMPS.jade, seeds.land, CHROMA_CAP),\n cobalt: reRamp(STOCK_RAMPS.cobalt, seeds.land, CHROMA_CAP),\n rose: reRamp(STOCK_RAMPS.rose, seeds.land, CHROMA_CAP),\n lilac: reRamp(STOCK_RAMPS.lilac, seeds.land, NEUTRAL_CHROMA_CAP),\n linen: reRamp(STOCK_RAMPS.linen, seeds.land, NEUTRAL_CHROMA_CAP),\n indigo: reRamp(STOCK_RAMPS.indigo, seeds.land, CHROMA_CAP),\n aqua: reRamp(STOCK_RAMPS.aqua, seeds.nature, CHROMA_CAP),\n wave: reRamp(STOCK_RAMPS.wave, seeds.water, CHROMA_CAP),\n sky: reRamp(STOCK_RAMPS.sky, seeds.water, CHROMA_CAP),\n mist: reRamp(STOCK_RAMPS.mist, seeds.water, CHROMA_CAP),\n azure: reRamp(STOCK_RAMPS.azure, seeds.water, CHROMA_CAP),\n verdant: reRamp(STOCK_RAMPS.verdant, seeds.nature, CHROMA_CAP),\n peach: reRamp(STOCK_RAMPS.peach, seeds.nature, CHROMA_CAP),\n };\n const generated = buildRecipes(ramps);\n // Several styles draw their water from a land, nature or highway ramp (`blueprint`, `canopy`\n // and `pastel` from `cobalt`, `blush` from `ember` and `rose`, `sunset` from `indigo`, `tropic`\n // from `aqua`), which the mapping above recolours with the wrong seed or not at all. So build\n // once more with every ramp in the water seed's hue and take only the water fill from it: each\n // style keeps the step it chose, and the water seed reaches every style's water. Styles already\n // on a water ramp get exactly what they got before.\n const watered = buildRecipes(\n Object.fromEntries(\n Object.entries(STOCK_RAMPS).map(([name, ramp]) => [name, reRamp(ramp, seeds.water, CHROMA_CAP)]),\n ) as unknown as RampSet,\n );\n\n const doc: ThemeDoc = { v: 1, base, seeds: { ...seeds } };\n for (const mode of MODES) {\n const recipe = enforceLabelContrast({ ...generated[base][mode], water: watered[base][mode].water });\n const basemap = diffRecipe(RECIPES[base][mode], recipe);\n const half: NonNullable<ThemeDoc[\"light\"]> = {};\n if (basemap) half.basemap = basemap;\n if (seeds.accent) {\n half.marker = { color: seeds.accent };\n half.route = { color: seeds.accent, casingColor: seeds.accent };\n }\n if (Object.keys(half).length > 0) doc[mode] = half;\n }\n return doc;\n}\n","import { oklchToHex } from \"./oklch\";\nimport type { ThemeSeeds } from \"./doc\";\nimport { DEFAULT_SEEDS } from \"./generate\";\n\n/**\n * The named theme presets of the builder's simple mode — the hand-picked starting points, named\n * for Canadian landscapes. Each is just a seed trio + accent; `generateTheme` does the rest,\n * and its contrast guarantee holds for these like any other seeds (asserted in tests).\n */\nexport interface ThemePreset {\n /** Display name, lowercase like the style names. Not translated — these are names. */\n name: string;\n seeds: Required<ThemeSeeds>;\n}\n\nexport const THEME_PRESETS: ThemePreset[] = [\n { name: \"process ink\", seeds: DEFAULT_SEEDS },\n {\n name: \"boreal\",\n seeds: { land: \"#7D8B87\", water: \"#33606B\", nature: \"#3F6B4F\", accent: \"#E4572E\" },\n },\n {\n name: \"prairie\",\n seeds: { land: \"#A08D6B\", water: \"#4E7E99\", nature: \"#7C8A4D\", accent: \"#C33149\" },\n },\n {\n name: \"tundra\",\n seeds: { land: \"#8B9AA6\", water: \"#4A7BA6\", nature: \"#6E8B74\", accent: \"#FF3E9A\" },\n },\n {\n name: \"badlands\",\n seeds: { land: \"#A67B5B\", water: \"#3E7C8F\", nature: \"#6B7F53\", accent: \"#22577A\" },\n },\n {\n name: \"aurora\",\n seeds: { land: \"#8C86A3\", water: \"#4F6D9E\", nature: \"#56828A\", accent: \"#58E1C1\" },\n },\n {\n name: \"pacific\",\n seeds: { land: \"#7F9089\", water: \"#2E7D74\", nature: \"#38755B\", accent: \"#F25F5C\" },\n },\n {\n name: \"chinook\",\n seeds: { land: \"#9C8A5D\", water: \"#56789C\", nature: \"#8A9A5B\", accent: \"#D95D39\" },\n },\n // The seven below (2026-09-09) are deliberately unlike one another and unlike the landscapes\n // above: each is one idea pushed to the edge of what the generator allows. Land is capped at a\n // cast, so the idea lives in the water and nature seeds, which can go to full chroma.\n //\n // Fifteen is the ceiling for a three-character code: the preset index sits above bit 8, and\n // index 15 pushes every style past 62² (`preset.ts`). A sixteenth preset still works, at four\n // characters, but `preset.test.ts` holds the curated set to three.\n {\n // Lava for water, scorched olive for nature, warm ash land, a sulphur accent.\n name: \"magma\",\n seeds: { land: \"#8A7A72\", water: \"#D6461A\", nature: \"#5C5A32\", accent: \"#FFC61A\" },\n },\n {\n // Electric cyan water, acid-green nature, a violet cast on the land, hot-pink accent.\n name: \"neon\",\n seeds: { land: \"#7C78A0\", water: \"#00D5F2\", nature: \"#8CE800\", accent: \"#FF2E9E\" },\n },\n {\n // Bubblegum water, turquoise nature, a pink cast, a lemon accent.\n name: \"candy\",\n seeds: { land: \"#A3808E\", water: \"#FF6FB5\", nature: \"#2ED1C2\", accent: \"#FFD400\" },\n },\n {\n // Deep violet water, plum nature, violet land, a lime accent.\n name: \"ultraviolet\",\n seeds: { land: \"#7A6E9E\", water: \"#5A2ECC\", nature: \"#9B4DCA\", accent: \"#C8FF3A\" },\n },\n {\n // No chroma anywhere but the accent: a greyscale map with one red.\n name: \"noir\",\n seeds: { land: \"#808080\", water: \"#6E6E6E\", nature: \"#707070\", accent: \"#E10600\" },\n },\n {\n // Brown everything: a walnut cast, tea-coloured water, ochre nature, oxblood accent.\n name: \"sepia\",\n seeds: { land: \"#8B7355\", water: \"#8C6A42\", nature: \"#A48A4A\", accent: \"#7A1F1F\" },\n },\n {\n // Ultramarine water, navy-teal nature, a blue cast on the land, a coral accent.\n name: \"ultramarine\",\n seeds: { land: \"#6F7A9C\", water: \"#1F3BFF\", nature: \"#215E7A\", accent: \"#FF6A4D\" },\n },\n {\n // The larch that turns gold across the boreal every autumn, and the one Canadian landscape\n // colour the set was missing: `nature` is a green in all fifteen before it (hues 74 to 199),\n // so foliage had only ever meant summer. The cold violet accent is the complement of that\n // gold and the only occupant of the 210-to-320 band.\n //\n // Sixteenth, and the first to cost four characters: a preset code packs its index above the\n // style slot, and index 15 clears what two base62 digits hold. See `preset.ts`.\n name: \"tamarack\",\n seeds: { land: \"#A59A8A\", water: \"#4C6A78\", nature: \"#C4881F\", accent: \"#6D4AFF\" },\n },\n];\n\n/** Wrap a hue into [0, 360). */\nconst wrap = (h: number) => ((h % 360) + 360) % 360;\n\n/**\n * A random but *harmonic* seed trio — the shuffle button. Hues are related (water lands\n * cool-of-complementary, nature analogous-of-triadic, the accent opposes the land) and chroma\n * stays inside a tasteful band, so shuffles read as designed rather than random; the\n * generator's contrast guarantee makes every one of them legible regardless.\n *\n * `rng` is injectable (returns [0,1)) so tests can drive it deterministically.\n */\nexport function shuffleSeeds(rng: () => number = Math.random): Required<ThemeSeeds> {\n const h = rng() * 360;\n return {\n land: oklchToHex({ l: 0.55, c: 0.03 + rng() * 0.05, h }),\n water: oklchToHex({ l: 0.5, c: 0.08 + rng() * 0.1, h: wrap(h + 150 + rng() * 60) }),\n nature: oklchToHex({ l: 0.5, c: 0.06 + rng() * 0.08, h: wrap(h + 60 + rng() * 80) }),\n accent: oklchToHex({ l: 0.65, c: 0.22 + rng() * 0.08, h: wrap(h + 170 + rng() * 40) }),\n };\n}\n","import { LAYER_GROUPS, type LayerGroup, type ThemeLayers } from \"./doc\";\n\n/**\n * Layer groups: the structural half of a theme. A theme can hide any of the seven major groups\n * and redraw them in another order, the way kepler.gl's base-map panel does. This module owns\n * the mapping from the expanded Protomaps layer list onto those groups and applies a document's\n * `layers` field to a style's layer array.\n *\n * It works on the expanded layers rather than the Flavor because the groups are about what\n * draws, not what colour it draws in — the Recipe stays the colour surface, this is the only\n * structural one, and both are still data (booleans and one enum list on the wire).\n */\n\n/** Stock visibility: every group draws except the extrusions, which are opt-in. */\nexport const DEFAULT_LAYER_VISIBILITY: Readonly<Record<LayerGroup, boolean>> = {\n land: true,\n water: true,\n buildings: true,\n roads: true,\n boundaries: true,\n buildings3d: false,\n labels: true,\n};\n\n/** The id of the synthetic extrusion layer `buildings3d` draws. */\nexport const BUILDINGS_3D_LAYER_ID = \"buildings_3d\";\n\n/** Airport surfaces are lines in the roads source-layer but read as ground, not as roads. */\nconst LAND_LINES = new Set([\"roads_runway\", \"roads_taxiway\"]);\n\n/**\n * Which group an expanded Protomaps layer belongs to, or `null` for the background, which is\n * never hidden or moved: with land off it is what you see. Symbol layers are labels regardless\n * of their source, so the POI icons, shields and one-way arrows hide with the text.\n *\n * The contract test asserts every stock layer lands in a group, so an upstream layer this\n * cannot place fails loudly rather than becoming an unmovable, unhideable stray.\n */\nexport function layerGroupOf(layer: { id: string; type: string }): LayerGroup | null {\n const { id, type } = layer;\n if (type === \"symbol\") return \"labels\";\n if (id === \"background\") return null;\n if (id === BUILDINGS_3D_LAYER_ID) return \"buildings3d\";\n if (id === \"buildings\") return \"buildings\";\n if (id.startsWith(\"water\")) return \"water\";\n if (id.startsWith(\"boundaries\")) return \"boundaries\";\n if (LAND_LINES.has(id)) return \"land\";\n if (id.startsWith(\"roads\")) return \"roads\";\n if (id === \"earth\" || id === \"landcover\" || id.startsWith(\"landuse\")) return \"land\";\n return null;\n}\n\n/** Whether a group draws under this `layers` field (absent field means stock). */\nexport function isLayerVisible(layers: ThemeLayers | undefined, group: LayerGroup): boolean {\n return layers?.visible?.[group] ?? DEFAULT_LAYER_VISIBILITY[group];\n}\n\n/** The bottom-to-top group order this `layers` field asks for; stock when it names none. */\nexport function effectiveLayerOrder(layers: ThemeLayers | undefined): readonly LayerGroup[] {\n return layers?.order ?? LAYER_GROUPS;\n}\n\n/** True when `order` is the stock order (or absent), so nothing needs regrouping. */\nexport function isStockLayerOrder(order: readonly LayerGroup[] | undefined): boolean {\n return !order || (order.length === LAYER_GROUPS.length && order.every((g, i) => g === LAYER_GROUPS[i]));\n}\n\n/** True when the field changes nothing — the builder strips such a field back to absent. */\nexport function isStockLayers(layers: ThemeLayers | undefined): boolean {\n if (!layers) return true;\n if (!isStockLayerOrder(layers.order)) return false;\n return LAYER_GROUPS.every((g) => isLayerVisible(layers, g) === DEFAULT_LAYER_VISIBILITY[g]);\n}\n\n/**\n * The extrusion layer `buildings3d` draws: every building from the tiles' `height` (metres,\n * from OSM `height` / `building:levels`) and `min_height`, with a two-storey stand-in for the\n * ones that carry neither so a downtown does not come up as a field of flat slabs beside\n * towers. Colour is the theme's `buildings` slot; opacity stays a touch under solid so the\n * roads under an overhang still read.\n */\nfunction buildings3dLayer(source: string, color: string) {\n return {\n id: BUILDINGS_3D_LAYER_ID,\n type: \"fill-extrusion\",\n source,\n \"source-layer\": \"buildings\",\n minzoom: 13,\n filter: [\"in\", \"kind\", \"building\", \"building_part\"],\n paint: {\n \"fill-extrusion-color\": color,\n \"fill-extrusion-height\": [\"coalesce\", [\"get\", \"height\"], 6],\n \"fill-extrusion-base\": [\"coalesce\", [\"get\", \"min_height\"], 0],\n \"fill-extrusion-opacity\": 0.85,\n },\n };\n}\n\n/**\n * Apply a theme's `layers` field to an expanded style layer array. Returns the input untouched\n * when the field changes nothing, so a zero-override theme stays byte-identical to its flavor.\n *\n * Hidden groups are removed outright rather than set to `visibility: none` — a smaller style,\n * and nothing left for a client to accidentally switch back on. With the stock order the\n * remaining layers keep their stock positions (and the extrusions, if on, slot in just under\n * the labels). With a custom order every group's layers are gathered under it, in stock\n * relative order within the group; the background and any layer outside every group stay\n * first, in their stock order.\n *\n * `buildingsColor` paints the extrusions: the resolved theme's `buildings` slot.\n */\nexport function applyThemeLayers<T extends { id: string; type: string }>(\n styleLayers: T[],\n layers: ThemeLayers | undefined,\n buildingsColor: string,\n): T[] {\n if (isStockLayers(layers)) return styleLayers;\n\n const visible = (g: LayerGroup) => isLayerVisible(layers, g);\n const tagged = styleLayers.map((layer) => ({ layer, group: layerGroupOf(layer) }));\n const source =\n (styleLayers.find((l) => l.id === \"buildings\") as { source?: string } | undefined)?.source ??\n \"unmap\";\n const extrusion = visible(\"buildings3d\")\n ? (buildings3dLayer(source, buildingsColor) as unknown as T)\n : null;\n\n if (isStockLayerOrder(layers?.order)) {\n const kept = tagged.filter(({ group }) => group === null || visible(group)).map((t) => t.layer);\n if (!extrusion) return kept;\n const firstLabel = kept.findIndex((l) => layerGroupOf(l) === \"labels\");\n const at = firstLabel === -1 ? kept.length : firstLabel;\n return [...kept.slice(0, at), extrusion, ...kept.slice(at)];\n }\n\n const out: T[] = tagged.filter(({ group }) => group === null).map((t) => t.layer);\n for (const group of effectiveLayerOrder(layers)) {\n if (!visible(group)) continue;\n if (group === \"buildings3d\") {\n if (extrusion) out.push(extrusion);\n continue;\n }\n for (const t of tagged) if (t.group === group) out.push(t.layer);\n }\n return out;\n}\n","import { ThemeError } from \"./validate\";\nimport { isThemeBase, type ThemeBase } from \"./recipe\";\nimport { STYLE_THEMES } from \"./presets\";\nimport { THEME_PRESETS } from \"./palettes\";\nimport { DEFAULT_SEEDS, generateTheme } from \"./generate\";\nimport { LAYER_GROUPS, type LayerGroup, type ThemeDoc, type ThemeLayers, type ThemeSeeds } from \"./doc\";\nimport { DEFAULT_LAYER_VISIBILITY, isStockLayerOrder, isStockLayers } from \"./layers\";\n\n/**\n * Short preset codes, the same idea as shadcn's `b0` / `a2r6bw`: a base62 packing of\n * enumerated choices that starts at three characters and grows only when the theme leaves the\n * curated set.\n *\n * u00 … u0E the style slots, in lineup order (`u03` is a tombstone and does not decode)\n * u0W, u4e, … a named theme preset on a style (three characters for the first fifteen\n * presets; `tamarack`, the sixteenth, is the first to take four)\n * six to eight a style or preset with layer groups hidden or reordered\n * up to 23 custom seed colours (4× RGB) on any style, layers included\n *\n * Advanced overrides — anything `generateTheme` would not emit — still use the `ut1.` deflate\n * document. `ut1.` is checked first on decode so the two forms never collide.\n *\n * Layout, low bits first, of the number the base62 digits spell:\n *\n * bits 0–4 style slot (`STYLE_SLOTS`; 32 styles)\n * bits 5–6 kind: 0 bare style, 1 named preset, 2 custom seeds (3 unassigned)\n * bit 7 layers flag\n * bits 8… kind payload: preset → 8-bit preset index; custom → 4 × 24-bit RGB seeds\n * then if the flag is set, 7 visibility bits (one per `LAYER_GROUPS` entry) followed\n * by a 13-bit Lehmer index of the draw order (0 = stock order)\n *\n * Anything left above the last field is an error, so a truncated or padded code fails rather\n * than decoding to a theme nobody asked for. Both lookup tables only grow at the end and never\n * reuse a position: the index is bit-packed into every code, so removing an entry would\n * renumber every code after it. A retired entry stays as a `null` tombstone that fails to\n * decode. (The layout itself was re-cut on 2026-09-07.)\n */\n\nexport const PRESET_CODE_PREFIX = \"u\";\nexport const PRESET_CODE_RE = /^u[0-9A-Za-z]{2,24}$/;\n\nconst BASE62 = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\nconst SEED_KEYS = [\"land\", \"water\", \"nature\", \"accent\"] as const;\n\n/** Style per slot. Grow at the end only; a retired style is a `null` tombstone, never removed. */\nconst STYLE_SLOTS: readonly (ThemeBase | null)[] = [\n \"base\",\n \"muted\",\n \"outdoor\",\n null, // u03, retired 2026-09-09\n \"blueprint\",\n \"blush\",\n \"orchid\",\n \"canopy\",\n \"lagoon\",\n \"tropic\",\n \"sunset\",\n \"bold\",\n \"pastel\",\n \"atlas\",\n \"swiss\",\n];\n\nconst STYLE_BITS = 5n;\nconst KIND_BITS = 2n;\nconst KIND_BARE = 0n;\nconst KIND_PRESET = 1n;\nconst KIND_CUSTOM = 2n;\nconst PRESET_INDEX_BITS = 8n;\nconst RGB_BITS = 24n;\nconst VISIBILITY_BITS = BigInt(LAYER_GROUPS.length); // 7\nconst ORDER_BITS = 13n; // 7! = 5040 < 2^13\nconst ORDER_COUNT = factorial(LAYER_GROUPS.length);\n\nconst mask = (bits: bigint) => (1n << bits) - 1n;\nconst sameHex = (a: string, b: string) => a.toLowerCase() === b.toLowerCase();\n\nfunction factorial(n: number): bigint {\n let f = 1n;\n for (let i = 2n; i <= BigInt(n); i++) f *= i;\n return f;\n}\n\nexport function isThemePresetCode(code: string): boolean {\n return PRESET_CODE_RE.test(code);\n}\n\n/** Registry key for a preset name: `process ink` → `processInk`. */\nexport function presetId(name: string): string {\n return name.replace(/\\s+([a-zA-Z])/g, (_, c: string) => c.toUpperCase()).replace(/\\s/g, \"\");\n}\n\nfunction toBase62(n: bigint, min = 2): string {\n if (n === 0n) return \"0\".repeat(min);\n let s = \"\";\n let x = n;\n while (x > 0n) {\n s = BASE62[Number(x % 62n)] + s;\n x /= 62n;\n }\n return s.padStart(min, \"0\");\n}\n\nfunction fromBase62(s: string): bigint {\n let n = 0n;\n for (const ch of s) {\n const i = BASE62.indexOf(ch);\n if (i < 0) {\n throw new ThemeError(\"invalid theme\", [\"code is not a valid preset\"]);\n }\n n = n * 62n + BigInt(i);\n }\n return n;\n}\n\nfunction rgb24(hex: string): bigint {\n return BigInt(parseInt(hex.replace(\"#\", \"\").slice(0, 6), 16));\n}\n\nfunction fromRgb24(n: bigint): string {\n return `#${n.toString(16).toUpperCase().padStart(6, \"0\")}`;\n}\n\n/** A bare style: no seeds, no overrides in either half. */\nfunction isBareStyle(doc: ThemeDoc): boolean {\n return doc.seeds === undefined && doc.light === undefined && doc.dark === undefined;\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (a && b && typeof a === \"object\") {\n const ak = Object.keys(a as object).sort();\n const bk = Object.keys(b as object).sort();\n return ak.length === bk.length && ak.every((k, i) => k === bk[i] && deepEqual((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]));\n }\n return false;\n}\n\nfunction seedsMatch(a: ThemeSeeds, b: ThemeSeeds): boolean {\n return SEED_KEYS.every((k) => {\n const left = a[k];\n const right = b[k];\n if (left === undefined && right === undefined) return true;\n if (typeof left !== \"string\" || typeof right !== \"string\") return left === right;\n return sameHex(left, right);\n });\n}\n\nfunction generatedMatch(doc: ThemeDoc): boolean {\n if (!doc.seeds) return false;\n const generated = generateTheme(doc.base, doc.seeds);\n return (\n generated.base === doc.base &&\n seedsMatch(generated.seeds!, doc.seeds) &&\n deepEqual(generated.light, doc.light) &&\n deepEqual(generated.dark, doc.dark)\n );\n}\n\nfunction findPresetIndex(seeds: ThemeSeeds): number {\n return THEME_PRESETS.findIndex((p) => seedsMatch(p.seeds, { ...DEFAULT_SEEDS, ...seeds }));\n}\n\n/* ---- layers: 7 visibility bits + a Lehmer index of the order ---- */\n\n/** Lehmer index of a permutation of `LAYER_GROUPS` (0 for the stock order). */\nfunction orderIndex(order: readonly LayerGroup[]): bigint {\n const remaining: LayerGroup[] = [...LAYER_GROUPS];\n let index = 0n;\n let radix = factorial(remaining.length);\n for (const group of order) {\n const at = remaining.indexOf(group);\n radix /= BigInt(remaining.length);\n index += BigInt(at) * radix;\n remaining.splice(at, 1);\n }\n return index;\n}\n\n/** The permutation of `LAYER_GROUPS` with this Lehmer index. */\nfunction orderAt(index: bigint): LayerGroup[] {\n const remaining: LayerGroup[] = [...LAYER_GROUPS];\n const order: LayerGroup[] = [];\n let rest = index;\n let radix = factorial(remaining.length);\n while (remaining.length > 0) {\n radix /= BigInt(remaining.length);\n const at = Number(rest / radix);\n rest %= radix;\n order.push(remaining.splice(at, 1)[0]!);\n }\n return order;\n}\n\nfunction packLayers(layers: ThemeLayers): bigint {\n let bits = 0n;\n LAYER_GROUPS.forEach((group, i) => {\n const visible = layers.visible?.[group] ?? DEFAULT_LAYER_VISIBILITY[group];\n if (visible) bits |= 1n << BigInt(i);\n });\n const order = isStockLayerOrder(layers.order) ? 0n : orderIndex(layers.order!);\n return bits | (order << VISIBILITY_BITS);\n}\n\n/** Expand packed layer bits to the sparse field the builder would have written. */\nfunction unpackLayers(bits: bigint): ThemeLayers {\n const layers: ThemeLayers = {};\n const visible: NonNullable<ThemeLayers[\"visible\"]> = {};\n LAYER_GROUPS.forEach((group, i) => {\n const on = ((bits >> BigInt(i)) & 1n) === 1n;\n if (on !== DEFAULT_LAYER_VISIBILITY[group]) visible[group] = on;\n });\n if (Object.keys(visible).length > 0) layers.visible = visible;\n const order = bits >> VISIBILITY_BITS;\n if (order >= ORDER_COUNT) {\n throw new ThemeError(\"invalid theme\", [\"preset layer order is out of range\"]);\n }\n if (order !== 0n) layers.order = orderAt(order);\n return layers;\n}\n\n/* ---- encode ---- */\n\n/**\n * Pack a theme into a short preset code, or `null` when the document is not one of the\n * representable shapes (caller falls back to `ut1.`).\n */\nexport function encodePreset(doc: ThemeDoc): string | null {\n const slot = isThemeBase(doc.base) ? STYLE_SLOTS.indexOf(doc.base) : -1;\n if (slot < 0) return null;\n\n let kind: bigint;\n let payload = 0n;\n let payloadBits = 0n;\n if (isBareStyle(doc)) {\n kind = KIND_BARE;\n } else {\n if (!doc.seeds || !generatedMatch(doc)) return null;\n const presetIndex = findPresetIndex(doc.seeds);\n if (presetIndex >= 0 && presetIndex < Number(mask(PRESET_INDEX_BITS))) {\n kind = KIND_PRESET;\n payload = BigInt(presetIndex);\n payloadBits = PRESET_INDEX_BITS;\n } else {\n if (!doc.seeds.accent) return null;\n kind = KIND_CUSTOM;\n const filled: Required<ThemeSeeds> = { ...DEFAULT_SEEDS, ...doc.seeds };\n for (const key of SEED_KEYS) {\n payload |= rgb24(filled[key]) << payloadBits;\n payloadBits += RGB_BITS;\n }\n }\n }\n\n const hasLayers = !isStockLayers(doc.layers);\n let bits = BigInt(slot) | (kind << STYLE_BITS) | ((hasLayers ? 1n : 0n) << (STYLE_BITS + KIND_BITS));\n let shift = STYLE_BITS + KIND_BITS + 1n;\n bits |= payload << shift;\n shift += payloadBits;\n if (hasLayers) bits |= packLayers(doc.layers!) << shift;\n return PRESET_CODE_PREFIX + toBase62(bits);\n}\n\n/* ---- decode ---- */\n\n/** Expand a short preset code to a validated ThemeDoc. Throws `ThemeError`. */\nexport function decodePreset(code: string): ThemeDoc {\n if (!isThemePresetCode(code)) {\n throw new ThemeError(\"invalid theme\", [\"code is not a valid preset\"]);\n }\n let rest = fromBase62(code.slice(PRESET_CODE_PREFIX.length));\n const take = (bits: bigint): bigint => {\n const value = rest & mask(bits);\n rest >>= bits;\n return value;\n };\n\n const slot = Number(take(STYLE_BITS));\n const base = STYLE_SLOTS[slot];\n if (base === undefined) throw new ThemeError(\"invalid theme\", [\"preset style is out of range\"]);\n if (base === null) throw new ThemeError(\"invalid theme\", [`preset style slot ${slot} is retired`]);\n const kind = take(KIND_BITS);\n const hasLayers = take(1n) === 1n;\n\n let doc: ThemeDoc;\n if (kind === KIND_BARE) {\n doc = structuredClone(STYLE_THEMES[base]);\n } else if (kind === KIND_PRESET) {\n const preset = THEME_PRESETS[Number(take(PRESET_INDEX_BITS))];\n if (!preset) throw new ThemeError(\"invalid theme\", [\"preset is out of range\"]);\n doc = generateTheme(base, preset.seeds);\n } else if (kind === KIND_CUSTOM) {\n const seeds: Required<ThemeSeeds> = { ...DEFAULT_SEEDS };\n for (const key of SEED_KEYS) seeds[key] = fromRgb24(take(RGB_BITS));\n doc = generateTheme(base, seeds);\n } else {\n throw new ThemeError(\"invalid theme\", [\"preset kind is unassigned\"]);\n }\n\n if (hasLayers) doc.layers = unpackLayers(take(VISIBILITY_BITS + ORDER_BITS));\n if (rest !== 0n) {\n throw new ThemeError(\"invalid theme\", [\"preset payload has unused bits\"]);\n }\n return doc;\n}\n\n/**\n * Registry key for a curated preset (`base`, `processInk`, `boreal`, …), or `undefined` when\n * the theme is a custom code that is not one of the named `MAP_THEMES` entries (named presets\n * are published on the `base` style only).\n */\nexport function registryThemeKey(doc: ThemeDoc): string | undefined {\n if (isBareStyle(doc)) return STYLE_THEMES[doc.base]?.name;\n if (!doc.seeds || doc.base !== \"base\" || !generatedMatch(doc)) return undefined;\n const presetIndex = findPresetIndex(doc.seeds);\n if (presetIndex < 0) return undefined;\n return presetId(THEME_PRESETS[presetIndex]!.name);\n}\n","import { ThemeError, validateTheme } from \"./validate\";\nimport type { ThemeDoc } from \"./doc\";\nimport { decodePreset, encodePreset, isThemePresetCode } from \"./preset\";\n\n/**\n * The compact theme code: `ut1.` + base64url(deflate(minified JSON)).\n *\n * Web-standard streams only (CompressionStream/DecompressionStream, Blob, btoa/atob) so the\n * same module runs in Workers, browsers and Node 18+. `deflate` (zlib) rather than\n * `deflate-raw`, which Node 20 — the repo floor — does not implement; the wrapper costs six\n * bytes and buys a checksum.\n *\n * `ut1` is the wire version. A breaking change to the document format bumps it, and the decoder\n * reads the current prefix only.\n */\n\nexport const THEME_CODE_PREFIX = \"ut1.\";\nexport const MAX_CODE_LENGTH = 4096;\nconst MAX_JSON_BYTES = 16 * 1024;\n\n/** Drain a stream into one buffer, refusing to grow past `cap` (the zip-bomb guard). */\nasync function pump(stream: ReadableStream<Uint8Array>, cap: number): Promise<Uint8Array> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let size = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n size += value.byteLength;\n if (size > cap) {\n // Cancelling releases the underlying decompressor before we throw.\n await reader.cancel().catch(() => {});\n throw new ThemeError(\"invalid theme\", [\"theme document too large\"]);\n }\n chunks.push(value);\n }\n const out = new Uint8Array(size);\n let off = 0;\n for (const c of chunks) {\n out.set(c, off);\n off += c.byteLength;\n }\n return out;\n}\n\nconst toB64url = (b: Uint8Array): string => {\n let bin = \"\";\n // Chunked: String.fromCharCode(...whole) overflows the argument limit on large arrays.\n for (let i = 0; i < b.length; i += 0x8000) {\n bin += String.fromCharCode(...b.subarray(i, i + 0x8000));\n }\n return btoa(bin).replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\").replace(/=+$/, \"\");\n};\n\nconst fromB64url = (s: string): Uint8Array => {\n const bin = atob(s.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\"));\n return Uint8Array.from(bin, (c) => c.charCodeAt(0));\n};\n\nasync function through(\n bytes: Uint8Array,\n transform: CompressionStream | DecompressionStream,\n cap: number,\n): Promise<Uint8Array> {\n const stream = new Blob([bytes as BlobPart]).stream().pipeThrough(transform);\n return pump(stream, cap);\n}\n\n/**\n * Validate and encode a theme document. Curated/simple themes — a style, a named preset or\n * custom seeds, with or without layer groups hidden or reordered — become a short `u…` preset;\n * anything with hand-edited colours is `ut1.` + deflate. Throws `ThemeError`.\n */\nexport async function encodeTheme(doc: ThemeDoc): Promise<string> {\n const valid = validateTheme(doc);\n const preset = encodePreset(valid);\n if (preset) return preset;\n const json = new TextEncoder().encode(JSON.stringify(valid));\n const packed = await through(json, new CompressionStream(\"deflate\"), Number.POSITIVE_INFINITY);\n const code = THEME_CODE_PREFIX + toB64url(packed);\n if (code.length > MAX_CODE_LENGTH) {\n throw new ThemeError(\"invalid theme\", [\n `encoded theme exceeds ${MAX_CODE_LENGTH} characters`,\n ]);\n }\n return code;\n}\n\n/** Decode and validate a compact theme code (`u…` preset or `ut1.` document). Every failure lands as `ThemeError`. */\nexport async function decodeTheme(code: string): Promise<ThemeDoc> {\n if (code.length > MAX_CODE_LENGTH) {\n throw new ThemeError(\"invalid theme\", [`code exceeds ${MAX_CODE_LENGTH} characters`]);\n }\n if (code.startsWith(THEME_CODE_PREFIX)) {\n return decodeDeflate(code);\n }\n if (isThemePresetCode(code)) {\n return validateTheme(decodePreset(code));\n }\n throw new ThemeError(\"invalid theme\", [\n `code must start with \"${THEME_CODE_PREFIX}\" or be a short preset`,\n ]);\n}\n\nasync function decodeDeflate(code: string): Promise<ThemeDoc> {\n let bytes: Uint8Array;\n try {\n const packed = fromB64url(code.slice(THEME_CODE_PREFIX.length));\n bytes = await through(packed, new DecompressionStream(\"deflate\"), MAX_JSON_BYTES);\n } catch (e) {\n if (e instanceof ThemeError) throw e;\n throw new ThemeError(\"invalid theme\", [\"code is not valid base64url deflate data\"]);\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(new TextDecoder().decode(bytes));\n } catch {\n throw new ThemeError(\"invalid theme\", [\"decoded payload is not JSON\"]);\n }\n return validateTheme(parsed);\n}\n","import { hexToOklch, oklchToHex } from \"./oklch\";\nimport type { ThemeSeeds } from \"./doc\";\nimport { DEFAULT_SEEDS } from \"./generate\";\n\n/**\n * Map an extracted image palette onto the four simple-mode seeds. Deterministic: the same\n * colours always produce the same seeds, and `generateTheme` then carries the contrast\n * guarantee. Lightness on land/water/nature is display-only (the generator re-hues stock\n * ladders); accent is used verbatim for the marker and route.\n */\n\nexport interface PaletteColor {\n hex: string;\n proportion: number;\n}\n\nconst CHROMATIC_FLOOR = 0.04;\nconst HUE_DEDUP = 20;\nconst WATER_HUE = { lo: 190, hi: 270 };\nconst NATURE_HUE = { lo: 100, hi: 170 };\nconst DISPLAY_L = { lo: 0.35, hi: 0.7 };\n\ninterface Ranked {\n hex: string;\n proportion: number;\n l: number;\n c: number;\n h: number;\n score: number;\n}\n\nconst wrapHue = (h: number) => ((h % 360) + 360) % 360;\n\nconst hueDelta = (a: number, b: number) => {\n const d = Math.abs(wrapHue(a) - wrapHue(b));\n return Math.min(d, 360 - d);\n};\n\nconst inBand = (h: number, band: { lo: number; hi: number }) => {\n const hue = wrapHue(h);\n return hue >= band.lo && hue <= band.hi;\n};\n\nconst normalizeHex = (hex: string) => {\n const raw = hex.startsWith(\"#\") ? hex.slice(1) : hex;\n return `#${raw.slice(0, 6).toUpperCase()}`;\n};\n\nconst parse = (color: PaletteColor): Ranked | null => {\n if (!/^#?[0-9a-fA-F]{6}/.test(color.hex)) return null;\n const hex = normalizeHex(color.hex);\n const { l, c, h } = hexToOklch(hex);\n if (!Number.isFinite(l) || !Number.isFinite(c) || !Number.isFinite(h)) return null;\n return { hex, proportion: Math.max(color.proportion, 0), l, c, h, score: 0 };\n};\n\n/** Clamp land/water/nature into a mid range so a pale or near-black brand colour still reads. */\nconst displaySeed = (color: Ranked): string =>\n oklchToHex({\n l: Math.min(DISPLAY_L.hi, Math.max(DISPLAY_L.lo, color.l)),\n c: color.c,\n h: color.h,\n });\n\nconst byScore = (a: Ranked, b: Ranked) =>\n b.score - a.score || b.proportion - a.proportion || a.hex.localeCompare(b.hex);\n\n/** Distinct hues in score order: skip a candidate within 20° of one already kept. */\nconst distinctHues = (ranked: Ranked[]): Ranked[] => {\n const out: Ranked[] = [];\n for (const color of ranked) {\n if (out.some((kept) => hueDelta(kept.h, color.h) < HUE_DEDUP)) continue;\n out.push(color);\n }\n return out;\n};\n\nconst pickInBand = (candidates: Ranked[], band: { lo: number; hi: number }): Ranked | undefined =>\n candidates.find((color) => inBand(color.h, band));\n\nfunction fromNeutrals(neutrals: Ranked[]): Required<ThemeSeeds> {\n const mid =\n neutrals.slice().sort((a, b) => Math.abs(a.l - 0.5) - Math.abs(b.l - 0.5))[0] ??\n parse({ hex: \"#808080\", proportion: 1 })!;\n const grey = displaySeed(mid);\n return { land: grey, water: grey, nature: grey, accent: DEFAULT_SEEDS.accent };\n}\n\n/**\n * Brand colours in, the four simple-mode seeds out. Empty input falls back to the stock seeds.\n */\nexport function seedsFromPalette(colors: PaletteColor[]): Required<ThemeSeeds> {\n const parsed = colors.map(parse).filter((c): c is Ranked => c !== null);\n if (parsed.length === 0) return { ...DEFAULT_SEEDS };\n\n const chromatic = parsed.filter((c) => c.c >= CHROMATIC_FLOOR);\n if (chromatic.length === 0) return fromNeutrals(parsed);\n\n const total = chromatic.reduce((sum, c) => sum + c.proportion, 0) || 1;\n for (const color of chromatic) {\n color.score = 0.7 * (color.proportion / total) + 0.3 * Math.min(color.c / 0.15, 1);\n }\n const ranked = chromatic.slice().sort(byScore);\n const distinct = distinctHues(ranked);\n const land = distinct[0]!;\n const rest = distinct.slice(1);\n const water = pickInBand(rest, WATER_HUE) ?? rest[0] ?? land;\n const afterWater = distinct.filter((c) => c !== land && c !== water);\n const nature = pickInBand(afterWater, NATURE_HUE) ?? afterWater[0] ?? land;\n const accent = ranked.slice().sort((a, b) => b.c - a.c || byScore(a, b))[0]!;\n\n return {\n land: displaySeed(land),\n water: displaySeed(water),\n nature: displaySeed(nature),\n accent: accent.hex,\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/palette.ts","../src/recipe.ts","../src/recipes.ts","../src/doc.ts","../src/validate.ts","../src/presets.ts","../src/oklch.ts","../src/compose.ts","../src/contrast.ts","../src/generate.ts","../src/palettes.ts","../src/layers.ts","../src/preset.ts","../src/codec.ts","../src/seeds-from-palette.ts"],"sourcesContent":["/**\n * Named colour ramps: the single source of colour truth for unmap cartography.\n *\n * Moved here from apps/gateway/src/palette.ts (which now re-exports these) so themes, the\n * gateway, and the builder all draw from one vocabulary. Flavors and theme recipes reference\n * these by name and never inline a hex literal.\n *\n * Ramps run light to dark by ascending key.\n */\n\n/**\n * Ember. Pre-rebrand brand accent; survives only as the `street` motorway orange, which is\n * cartographic convention (orange motorways) rather than brand. Never the interface accent —\n * that is magenta, which stays out of every basemap.\n */\nexport const ember = {\n 200: \"#ffe9c9\",\n 300: \"#ffc08c\",\n 400: \"#f7a35c\",\n 500: \"#f97316\",\n 600: \"#e07b2e\",\n 700: \"#b45309\",\n} as const;\n\n/* ── Process Ink ramps ─────────────────────────────────────────────────────────────────────\n *\n *\n * Generated in OKLCH rather than picked by eye, from three hues the brand already implies:\n * cool neutrals at 212, water at 200, vegetation at 152, with one warm family at 82 for sand\n * and farmland. OKLCH matters here because a ramp picked in sRGB has uneven perceived steps —\n * two adjacent greens can look identical while two adjacent greys look like a seam.\n *\n * Lightness is chosen so the label contrast the cartography tests enforce is a property of the\n * ramp rather than something rescued per flavour afterwards. `ink.700` on `ink.25` clears 4.5:1,\n * `ink.500` on `ink.1000` clears it inverted, and every flavour's labels are drawn from those\n * steps. That is the whole reason the generator solves for lightness instead of guessing.\n *\n * Magenta is deliberately absent. It is the interface accent — markers, selection, overlays —\n * and keeping it out of the basemap is what lets a customer's data always win the colour fight.\n *\n * Regenerate rather than hand-edit: the ramp is the source, the hex is the output.\n */\n\n/** Cool neutrals, hue 212. The spine of every Process Ink flavour except `base`. */\nexport const ink = {\n 25: \"#F1F8FA\",\n 50: \"#EAF2F3\",\n 100: \"#E2E9EB\",\n 200: \"#D6DEE0\",\n 300: \"#C9D1D3\",\n 400: \"#B7C0C2\",\n 500: \"#9DA7A9\",\n 600: \"#7E888B\",\n 700: \"#5C6769\",\n 800: \"#3D494B\",\n 850: \"#2B3639\",\n 900: \"#1A2628\",\n 950: \"#0E191C\",\n 1000: \"#030E10\",\n} as const;\n\n/**\n * Warm off-white neutrals, hue 50, chroma 0.008. The `base` pair only.\n *\n * Same lightness ladder as `ink`, re-hued to the conventional street-map land tone `base`\n * follows (`hsl(20, 20%, 95%)`): a faint warm tint rather than the cream it had, so parks,\n * water and the motorway orange read as colour against it instead of competing with it.\n */\nexport const paper = {\n 25: \"#FBF5F2\",\n 50: \"#F5EFEC\",\n 100: \"#ECE6E3\",\n 200: \"#E1DBD8\",\n 300: \"#D4CECB\",\n 400: \"#C3BDBA\",\n 500: \"#A9A3A0\",\n 600: \"#8A8582\",\n 700: \"#696361\",\n 800: \"#4A4543\",\n 850: \"#373330\",\n 900: \"#272220\",\n 950: \"#1A1614\",\n 1000: \"#0E0B09\",\n} as const;\n\n/** Water, hue 200. Cooler and more chromatic than the land it meets. */\nexport const wave = {\n 100: \"#C7F1F3\",\n 200: \"#B3E2E4\",\n 300: \"#9CCFD2\",\n 400: \"#7FB8BB\",\n 500: \"#5F9FA2\",\n 600: \"#368286\",\n 700: \"#1C6265\",\n 800: \"#024347\",\n 900: \"#002A2C\",\n 950: \"#001C1E\",\n 980: \"#001012\",\n} as const;\n\n/**\n * Sky water, hue 230. The `base` pair only.\n *\n * Same lightness ladder as `wave`, re-hued and brightened to the Streets reference's water\n * (`hsl(200, 100%, 80%)`). `sky.200` is that colour; the rest of the ladder is the dark-mode\n * inversion and the ocean-label step.\n */\nexport const sky = {\n 100: \"#CCEEFF\",\n 200: \"#A7E2FF\",\n 300: \"#8ACFF0\",\n 400: \"#73B7D7\",\n 500: \"#5A9CBC\",\n 600: \"#387D9C\",\n 700: \"#155F7C\",\n 800: \"#004057\",\n 900: \"#002837\",\n 950: \"#001B27\",\n 980: \"#000F17\",\n} as const;\n\n/** Vegetation, hue 152: park, wood, scrub. */\nexport const verdant = {\n 100: \"#D3F1DA\",\n 200: \"#C3E3CA\",\n 300: \"#AFD2B7\",\n 400: \"#96BC9F\",\n 500: \"#76A281\",\n 600: \"#50825E\",\n 700: \"#366042\",\n 800: \"#1E4128\",\n 900: \"#0B2815\",\n} as const;\n\n/**\n * Leaf green, hue 136: `outdoor`'s vegetation (2026-09-09). `verdant` is a mint that reads cool\n * and flat once it has to stand for a forest rather than a city park; the outdoor maps people\n * already read use a yellower, fuller green. Generated from verdant's own lightness step for\n * step (chroma ×1.6, capped at 0.14 to stay in gamut), so every contrast property the ramps were\n * solved for carries over and only the hue and chroma move. Outdoor alone; the street styles\n * keep verdant, where a park is a tint and a mint is right.\n */\nexport const fern = {\n 100: \"#D3F3C5\",\n 200: \"#C3E6B3\",\n 300: \"#AFD59E\",\n 400: \"#96BF83\",\n 500: \"#76A560\",\n 600: \"#518535\",\n 700: \"#37621E\",\n 800: \"#1E4305\",\n 900: \"#0F2900\",\n} as const;\n\n/** Warm landcover, hue 82: sand, beach, farmland. */\nexport const sandstone = {\n 100: \"#F5E8D0\",\n 200: \"#E7D9BF\",\n 300: \"#D6C7AC\",\n 400: \"#BFAF92\",\n 500: \"#A19070\",\n} as const;\n\n/**\n * Pure neutrals, zero chroma. Everything on `muted` except its water (see `mist`), plus the\n * road casings on `base`. Kept R=G=B so `muted` is greyscale in fact rather than in name.\n */\nexport const graphite = {\n 25: \"#FAFAFA\",\n 50: \"#F2F2F2\",\n 100: \"#E9E9E9\",\n 200: \"#DEDEDE\",\n 300: \"#D1D1D1\",\n 400: \"#BEBEBE\",\n 500: \"#A4A4A4\",\n 600: \"#868686\",\n 700: \"#656565\",\n 800: \"#464646\",\n 900: \"#232323\",\n 1000: \"#0B0B0B\",\n} as const;\n\n/**\n * Muted water: the `wave` lightness ladder at zero chroma. `muted` is greyscale end to end,\n * water included, so this ramp exists for one reason — it is the ramp the *water* seed\n * recolours when a theme is applied to `muted`, which the land ramp (`graphite`) is not.\n * `mist.200` is the light-mode fill; `mist.980` the dark-mode inversion so water stays darker\n * than land.\n */\nexport const mist = {\n 100: \"#E7E7E7\",\n 200: \"#D7D7D7\",\n 300: \"#C4C4C4\",\n 400: \"#ACACAC\",\n 500: \"#929292\",\n 600: \"#757575\",\n 700: \"#575757\",\n 800: \"#3A3A3A\",\n 900: \"#242424\",\n 950: \"#171717\",\n 980: \"#0D0D0D\",\n} as const;\n\n/**\n * Jade, hue 163. The emerald and mint greens of `orchid`'s woods and landcover, the parks and woods of\n * `tropic`, the woods of `bold` and the parks and scrub of `pastel`. Same lightness ladder as `ink`, so every label step the other\n * styles rely on clears the floors here too. Chroma rises with lightness up to the mid steps\n * (`0.16·L`) and eases off toward white (`0.42·(1−L)`), which is the profile of the\n * reference's own four greens (`#142a21` → `#50a882`).\n */\nexport const jade = {\n 25: \"#F1F9F4\",\n 50: \"#E6F4ED\",\n 100: \"#D7EEE2\",\n 200: \"#C3E6D4\",\n 300: \"#ACDDC4\",\n 400: \"#8BCFAF\",\n 500: \"#56BB90\",\n 600: \"#459975\",\n 700: \"#327357\",\n 800: \"#21513D\",\n 850: \"#173C2C\",\n 900: \"#0E2A1E\",\n 950: \"#071C13\",\n 1000: \"#030F09\",\n} as const;\n\n/**\n * Cobalt, hue 267. The `blueprint` pair: royal blue field with navy roads and pale blue water\n * in dark, blue lines on blue-white paper in light. Same lightness ladder as `ink`. Chroma\n * peaks at the field step (`700`, `0.23` — the reference's `#1c44dc`) and falls away on both\n * sides, so the pale steps stay paper-like and the navy steps stay ink-like.\n */\nexport const cobalt = {\n 25: \"#F4F7FB\",\n 50: \"#ECF0F9\",\n 100: \"#E1E8F7\",\n 200: \"#D2DCF5\",\n 300: \"#C0CFF3\",\n 400: \"#A8BDF1\",\n 500: \"#84A2EE\",\n 600: \"#587EEA\",\n 700: \"#2C4EE5\",\n 800: \"#243D93\",\n 850: \"#1D2F65\",\n 900: \"#162241\",\n 950: \"#0F1629\",\n 1000: \"#080B15\",\n} as const;\n\n/**\n * Rose, hue 20. The `blush` pair's land, buildings and labels: a pink that stays a field at the\n * light steps and becomes a wine at the dark ones. Same lightness ladder as `ink`; chroma rises\n * with lightness to the mid steps and eases off toward white.\n */\nexport const rose = {\n 25: \"#FFF3F3\",\n 50: \"#FFEBEA\",\n 100: \"#FFDFDE\",\n 200: \"#FECFCE\",\n 300: \"#FCBDBC\",\n 400: \"#F8A4A4\",\n 500: \"#E48687\",\n 600: \"#BA6D6D\",\n 700: \"#8D5151\",\n 800: \"#643838\",\n 850: \"#4B2929\",\n 900: \"#351B1B\",\n 950: \"#241111\",\n 1000: \"#150808\",\n} as const;\n\n/**\n * Lilac, hue 300, low chroma. The `orchid` pair's land, buildings and labels — a lavender grey\n * rather than a purple, so the vivid teal parks and sky water are what carry the colour. Chroma\n * grows a little toward the dark steps so the labels read as violet rather than as grey.\n */\nexport const lilac = {\n 25: \"#F8F5FF\",\n 50: \"#F2EDFF\",\n 100: \"#EAE4F9\",\n 200: \"#DFD8EE\",\n 300: \"#D2CBE1\",\n 400: \"#C1BACF\",\n 500: \"#A7A1B5\",\n 600: \"#888296\",\n 700: \"#676174\",\n 800: \"#4A415A\",\n 850: \"#382E4A\",\n 900: \"#281C3C\",\n 950: \"#1C0E30\",\n 1000: \"#110225\",\n} as const;\n\n/**\n * Aqua, hue 205. Vivid teal on the `wave` ladder for `orchid`'s and `lagoon`'s parks — the\n * only park colour on the map that is not a green. Chroma peaks at the mid steps.\n */\nexport const aqua = {\n 100: \"#C7F1F5\",\n 200: \"#ACE3E9\",\n 300: \"#89D2DB\",\n 400: \"#57BEC9\",\n 500: \"#00A6B3\",\n 600: \"#00858F\",\n 700: \"#00636B\",\n 800: \"#004349\",\n 900: \"#05292D\",\n 950: \"#081B1D\",\n 980: \"#060E0F\",\n} as const;\n\n/* ── The vivid four (2026-09-09) ────────────────────────────────────────────────────────────\n *\n * `tropic`, `sunset`, `bold` and `pastel` were sketched from CARTOColors (Tropic and Temps,\n * Sunset, Bold and Vivid, Pastel). CARTO's are data palettes built to sit on a muted basemap,\n * so these styles spend the colour where overlays rarely go — water, vegetation, the highway —\n * and keep land and labels quiet. Every ramp below is an existing lightness ladder re-hued, so\n * the label floors the ladders were solved for carry over; only hue and chroma move.\n */\n\n/** Cream neutrals, hue 90, chroma 0.022: `tropic`'s and `sunset`'s land and labels. `paper`'s ladder. */\nexport const linen = {\n 25: \"#FCF6E6\",\n 50: \"#F6F0E0\",\n 100: \"#EDE7D7\",\n 200: \"#E2DCCC\",\n 300: \"#D5CFC0\",\n 400: \"#C4BEAF\",\n 500: \"#AAA495\",\n 600: \"#8B8677\",\n 700: \"#696457\",\n 800: \"#4B4639\",\n 850: \"#383427\",\n 900: \"#272317\",\n 950: \"#1B170B\",\n 1000: \"#0F0B03\",\n} as const;\n\n/** Coral, hue 28, on `rose`'s ladder at 1.3× its chroma: the highway on `tropic`, `sunset` and `pastel`. */\nexport const coral = {\n 25: \"#FFF3F1\",\n 50: \"#FFEBE8\",\n 100: \"#FFDFDB\",\n 200: \"#FFCFC8\",\n 300: \"#FFBDB3\",\n 400: \"#FFA195\",\n 500: \"#F47C6E\",\n 600: \"#C76559\",\n 700: \"#974A42\",\n 800: \"#6C332D\",\n 850: \"#512520\",\n 900: \"#391814\",\n 950: \"#270F0C\",\n 1000: \"#170705\",\n} as const;\n\n/** Peach, hue 58, on `verdant`'s ladder: `sunset`'s vegetation, which is not green on purpose. */\nexport const peach = {\n 100: \"#FFE2CC\",\n 200: \"#FFCEAA\",\n 300: \"#F4B98D\",\n 400: \"#E0A171\",\n 500: \"#CA8248\",\n 600: \"#AC5E0D\",\n 700: \"#804300\",\n 800: \"#572B00\",\n 900: \"#361900\",\n} as const;\n\n/** Indigo, hue 295, on `cobalt`'s ladder at 0.7× its chroma: `sunset`'s water and night, and the boundary purple elsewhere. */\nexport const indigo = {\n 25: \"#F7F6F9\",\n 50: \"#F0EFF6\",\n 100: \"#E8E6F1\",\n 200: \"#DDD9EC\",\n 300: \"#D0CBE6\",\n 400: \"#C0B8DE\",\n 500: \"#A89BD3\",\n 600: \"#8B76C5\",\n 700: \"#6D4BB5\",\n 800: \"#4B3977\",\n 850: \"#362C53\",\n 900: \"#251F36\",\n 950: \"#181422\",\n 1000: \"#0C0A11\",\n} as const;\n\n/** Azure, hue 245, on `wave`'s ladder at 1.7× its chroma: `bold`'s clear blue water. */\nexport const azure = {\n 100: \"#D4EBFF\",\n 200: \"#B6DDFF\",\n 300: \"#92CBFB\",\n 400: \"#74B3E8\",\n 500: \"#5299D2\",\n 600: \"#227AB9\",\n 700: \"#005B91\",\n 800: \"#003D64\",\n 900: \"#002641\",\n 950: \"#00192D\",\n 980: \"#000E1C\",\n} as const;\n\n/** Amber, hue 85, on `ember`'s ladder: `bold`'s highway. */\nexport const amber = {\n 200: \"#FEEAC1\",\n 300: \"#F3C96F\",\n 400: \"#E7AF0E\",\n 500: \"#C99700\",\n 600: \"#C19100\",\n 700: \"#916D00\",\n} as const;\n\n/** Bay Atlas reference colours, re-authored as light/dark ramps for Canada's basemap. */\nexport const atlasPaper = {\n 25: \"#F6F3EA\", 100: \"#EDE7DC\", 200: \"#DDD4C4\", 500: \"#A08A70\",\n 700: \"#786B5E\", 800: \"#57504A\", 900: \"#2A2521\", 950: \"#211C17\", 1000: \"#15110D\",\n} as const;\nexport const atlasWater = {\n 200: \"#B3D2E6\", 400: \"#86B3D4\", 700: \"#3E6D96\", 800: \"#274F73\", 950: \"#142B3D\", 980: \"#0B1C29\",\n} as const;\nexport const atlasGreen = {\n 100: \"#E9EFD4\", 200: \"#DCE8CB\", 300: \"#CFE4B8\", 700: \"#3B6B2B\", 800: \"#2A4822\", 900: \"#1B3018\",\n} as const;\nexport const atlasRoad = {\n 300: \"#F7D686\", 400: \"#E67F50\", 500: \"#C8412A\", 600: \"#A8231C\", 800: \"#5E1712\",\n} as const;\n/** Swiss national-map conventions: white ground, blue water, leaf greens, yellow roads. */\nexport const swissPaper = {\n 25: \"#FDFDFE\", 100: \"#F2F2F2\", 200: \"#E6E4E2\", 500: \"#96938E\",\n 700: \"#686660\", 800: \"#3C3C3C\", 900: \"#252525\", 950: \"#191919\", 1000: \"#101010\",\n} as const;\nexport const swissWater = {\n 200: \"#D2EEFF\", 400: \"#4DA4DA\", 700: \"#2D78A4\", 800: \"#205674\", 950: \"#152F40\", 980: \"#0A1B28\",\n} as const;\nexport const swissGreen = {\n 100: \"#D3EBC7\", 200: \"#C3DDB4\", 300: \"#8AC66C\", 700: \"#48792C\", 800: \"#2C4E22\", 900: \"#1B3317\",\n} as const;\nexport const swissRoad = {\n 300: \"#FAF39E\", 400: \"#F8C444\", 500: \"#FAB69E\", 600: \"#CB4D4D\", 800: \"#46371E\",\n} as const;\n\n/** Relief inks from the references; neutral shadows avoid colouring every ridge blue. */\nexport const atlasRelief = { shadow: \"#5B4A3B\", highlight: \"#FFFDF5\", accent: \"#7C6A58\", contour: \"#A8875F\" } as const;\nexport const swissRelief = { shadow: \"#4E6276\", highlight: \"#FFF8CD\", accent: \"#606C7A\", contour: \"#B46E0D\" } as const;\n","import type { Flavor } from \"@protomaps/basemaps\";\n\n/**\n * The unmap cartography authoring surface, moved here from apps/gateway/src/flavors.ts so the\n * gateway, the theme system, and the unmap.dev builder share one definition.\n *\n * A `Recipe` is what a theme can override: every colour a Flavor controls, expressed at the\n * level we author at. Expanding through `makeFlavor` keeps the consistency guarantees a raw\n * Flavor cannot: a casing is always derived beside its fill, and the tunnel and bridge families\n * cannot drift out of step with the surface roads they mirror.\n */\n\n/**\n * The shipped styles. Appended, never inserted: this array's order drives the style picker in\n * the unmap.dev builder, so inserting a style mid-array silently reorders a control people have\n * already learned.\n */\nexport const THEME_BASES = [\n \"base\",\n \"muted\",\n \"outdoor\",\n \"blueprint\",\n \"blush\",\n \"orchid\",\n \"canopy\",\n \"lagoon\",\n \"tropic\",\n \"sunset\",\n \"bold\",\n \"pastel\",\n \"atlas\",\n \"swiss\",\n \"winter\",\n] as const;\nexport type ThemeBase = (typeof THEME_BASES)[number];\n\n/** Whether `base` names a shipped style. */\nexport function isThemeBase(base: unknown): base is ThemeBase {\n return typeof base === \"string\" && (THEME_BASES as readonly string[]).includes(base);\n}\n\nexport const MODES = [\"light\", \"dark\"] as const;\nexport type ThemeMode = (typeof MODES)[number];\n\nexport interface RoadRamp {\n /** Unclassified / track. The bottom of the hierarchy. */\n other: string;\n otherCasing: string;\n /** Residential and service. */\n minor: string;\n minorCasing: string;\n service: string;\n serviceCasing: string;\n /** Primary / secondary. */\n major: string;\n majorCasing: string;\n /** Motorway. */\n highway: string;\n highwayCasing: string;\n /** Slip roads. */\n link: string;\n linkCasing: string;\n}\n\nexport interface LabelRamp {\n city: string;\n cityHalo: string;\n state: string;\n stateHalo: string;\n country: string;\n subplace: string;\n subplaceHalo: string;\n address: string;\n addressHalo: string;\n roadMinor: string;\n roadMinorHalo: string;\n roadMajor: string;\n roadMajorHalo: string;\n ocean: string;\n}\n\nexport interface Recipe {\n background: string;\n earth: string;\n water: string;\n /** Park, wood and scrub each take two tones; `b` is the slightly deeper of the pair. */\n parkA: string;\n parkB: string;\n woodA: string;\n woodB: string;\n scrubA: string;\n scrubB: string;\n sand: string;\n beach: string;\n glacier: string;\n /** Institutional land: hospital, school, industrial, military, zoo, aerodrome. */\n institutional: string;\n pedestrian: string;\n aerodrome: string;\n runway: string;\n pier: string;\n buildings: string;\n railway: string;\n boundaries: string;\n roads: RoadRamp;\n labels: LabelRamp;\n /**\n * Tunnels read one step recessive against the surface road, bridges one step assertive.\n * Expressed as the colours to substitute rather than a computed shift, so a style can opt\n * out of the convention where it does not suit the palette.\n */\n tunnelFill: string;\n tunnelCasing: string;\n bridgeCasing: string;\n pois: Flavor[\"pois\"];\n landcover: Flavor[\"landcover\"];\n}\n\n/**\n * Expand a recipe into the full Flavor. Every one of the interface's required slots is written\n * here exactly once, so a missing slot is a compile error rather than a silently black layer.\n */\nexport function makeFlavor(r: Recipe): Flavor {\n return {\n background: r.background,\n earth: r.earth,\n water: r.water,\n\n park_a: r.parkA,\n park_b: r.parkB,\n wood_a: r.woodA,\n wood_b: r.woodB,\n scrub_a: r.scrubA,\n scrub_b: r.scrubB,\n sand: r.sand,\n beach: r.beach,\n glacier: r.glacier,\n\n hospital: r.institutional,\n industrial: r.institutional,\n school: r.institutional,\n zoo: r.institutional,\n military: r.institutional,\n pedestrian: r.pedestrian,\n aerodrome: r.aerodrome,\n runway: r.runway,\n pier: r.pier,\n buildings: r.buildings,\n\n // Surface roads.\n other: r.roads.other,\n minor_service: r.roads.service,\n minor_a: r.roads.minor,\n minor_b: r.roads.minor,\n link: r.roads.link,\n major: r.roads.major,\n highway: r.roads.highway,\n\n minor_service_casing: r.roads.serviceCasing,\n minor_casing: r.roads.minorCasing,\n link_casing: r.roads.linkCasing,\n // early/late are the same colour: they exist so Protomaps can fade casings in at\n // different zooms, not to differentiate hue.\n major_casing_early: r.roads.majorCasing,\n major_casing_late: r.roads.majorCasing,\n highway_casing_early: r.roads.highwayCasing,\n highway_casing_late: r.roads.highwayCasing,\n\n // Tunnels: recessive, one flat fill so the network reads as \"beneath\".\n tunnel_other: r.tunnelFill,\n tunnel_minor: r.tunnelFill,\n tunnel_link: r.tunnelFill,\n tunnel_major: r.tunnelFill,\n tunnel_highway: r.tunnelFill,\n tunnel_other_casing: r.tunnelCasing,\n tunnel_minor_casing: r.tunnelCasing,\n tunnel_link_casing: r.tunnelCasing,\n tunnel_major_casing: r.tunnelCasing,\n tunnel_highway_casing: r.tunnelCasing,\n\n // Bridges: same fills as the surface road so the ribbon stays continuous, with a\n // stronger casing that lifts it off whatever it crosses.\n bridges_other: r.roads.other,\n bridges_minor: r.roads.minor,\n bridges_link: r.roads.link,\n bridges_major: r.roads.major,\n bridges_highway: r.roads.highway,\n bridges_other_casing: r.bridgeCasing,\n bridges_minor_casing: r.bridgeCasing,\n bridges_link_casing: r.bridgeCasing,\n bridges_major_casing: r.bridgeCasing,\n bridges_highway_casing: r.bridgeCasing,\n\n railway: r.railway,\n boundaries: r.boundaries,\n\n roads_label_minor: r.labels.roadMinor,\n roads_label_minor_halo: r.labels.roadMinorHalo,\n roads_label_major: r.labels.roadMajor,\n roads_label_major_halo: r.labels.roadMajorHalo,\n ocean_label: r.labels.ocean,\n subplace_label: r.labels.subplace,\n subplace_label_halo: r.labels.subplaceHalo,\n city_label: r.labels.city,\n city_label_halo: r.labels.cityHalo,\n state_label: r.labels.state,\n state_label_halo: r.labels.stateHalo,\n country_label: r.labels.country,\n address_label: r.labels.address,\n address_label_halo: r.labels.addressHalo,\n\n pois: r.pois,\n landcover: r.landcover,\n };\n}\n","import type { Recipe, ThemeBase, ThemeMode } from \"./recipe\";\nimport {\n atlasPaper,\n atlasWater,\n atlasGreen,\n atlasRoad,\n swissPaper,\n swissWater,\n swissGreen,\n swissRoad,\n amber,\n aqua,\n azure,\n cobalt,\n coral,\n ember,\n fern,\n indigo,\n linen,\n graphite,\n ink,\n jade,\n lilac,\n mist,\n paper,\n peach,\n rose,\n sandstone,\n sky,\n verdant,\n wave,\n} from \"./palette\";\n\n/**\n * The ramp families (plus ember) a recipe draws from. `buildRecipes` is parameterized on\n * this so the theme generator can re-emit the same recipes from *generated* ramps — same\n * lightness ladders, a customer's hues — while the stock `RECIPES` stay byte-identical to the\n * hand-tuned originals (they are `buildRecipes(STOCK_RAMPS)`).\n */\nexport interface RampSet {\n atlasPaper: typeof atlasPaper;\n atlasWater: typeof atlasWater;\n atlasGreen: typeof atlasGreen;\n atlasRoad: typeof atlasRoad;\n swissPaper: typeof swissPaper;\n swissWater: typeof swissWater;\n swissGreen: typeof swissGreen;\n swissRoad: typeof swissRoad;\n\n ink: typeof ink;\n paper: typeof paper;\n wave: typeof wave;\n sky: typeof sky;\n verdant: typeof verdant;\n fern: typeof fern;\n sandstone: typeof sandstone;\n graphite: typeof graphite;\n mist: typeof mist;\n jade: typeof jade;\n cobalt: typeof cobalt;\n rose: typeof rose;\n lilac: typeof lilac;\n aqua: typeof aqua;\n ember: typeof ember;\n linen: typeof linen;\n coral: typeof coral;\n peach: typeof peach;\n indigo: typeof indigo;\n azure: typeof azure;\n amber: typeof amber;\n}\n\nexport const STOCK_RAMPS: RampSet = {\n atlasPaper,\n atlasWater,\n atlasGreen,\n atlasRoad,\n swissPaper,\n swissWater,\n swissGreen,\n swissRoad,\n\n ink,\n paper,\n wave,\n sky,\n verdant,\n fern,\n sandstone,\n graphite,\n mist,\n jade,\n cobalt,\n rose,\n lilac,\n aqua,\n ember,\n linen,\n coral,\n peach,\n indigo,\n azure,\n amber,\n};\n\n/*\n * The shipped Process Ink recipes as data, moved from apps/gateway/src/flavors.ts.\n * These are the styles a ThemeDoc's sparse overrides merge onto. Colour comes from the\n * ramps in ./palette and never a hex literal here, except pure white road fills.\n */\n\n/** Build the shipped recipes from a ramp set. Stock ramps in → the shipped cartography out. */\nexport function buildRecipes(\n r: RampSet,\n): Record<ThemeBase, Record<ThemeMode, Recipe>> {\n /**\n * `base` / `light`. The general-purpose map, following the conventions of a street map\n * rather than any one product: a faintly warm off-white land (`paper`, hue 50), parks and woods in a\n * light green that still reads as green, sky-blue water, white roads with cool grey casings, and the\n * motorway drawn in orange — the one cartographic convention allowed to carry warmth.\n * Boundaries and aerodromes take a lavender from `cobalt` the way street maps give them a\n * purple, so they never read as roads. Full road hierarchy and visible buildings stay; this\n * is the map someone gets when they have not chosen one, so it errs towards legible over\n * quiet.\n *\n * Streets' blue-grey neighbourhood labels and its blue water labels both miss the contrast\n * floors on their backgrounds, so labels keep the contrast-safe `paper` and `sky` steps.\n */\n const BASE_LIGHT: Recipe = {\n background: r.paper[100],\n earth: r.paper[25],\n water: r.sky[200],\n parkA: r.verdant[200],\n parkB: r.verdant[300],\n woodA: r.verdant[200],\n woodB: r.verdant[300],\n scrubA: r.verdant[200],\n scrubB: r.verdant[300],\n sand: r.sandstone[200],\n beach: r.sandstone[200],\n glacier: r.paper[25],\n institutional: r.paper[100],\n pedestrian: r.paper[100],\n aerodrome: r.cobalt[200],\n runway: r.cobalt[300],\n pier: r.paper[300],\n buildings: r.paper[200],\n railway: r.graphite[400],\n boundaries: r.cobalt[600],\n roads: {\n other: r.paper[100],\n otherCasing: r.graphite[200],\n minor: \"#FFFFFF\",\n minorCasing: r.graphite[200],\n service: r.paper[100],\n serviceCasing: r.graphite[200],\n major: \"#FFFFFF\",\n majorCasing: r.graphite[300],\n highway: r.ember[400],\n highwayCasing: r.ember[600],\n link: r.ember[300],\n linkCasing: r.ember[500],\n },\n tunnelFill: r.paper[200],\n tunnelCasing: r.graphite[200],\n bridgeCasing: r.graphite[400],\n labels: {\n city: r.paper[1000],\n cityHalo: r.paper[25],\n state: r.paper[700],\n stateHalo: r.paper[25],\n country: r.paper[700],\n subplace: r.paper[700],\n subplaceHalo: r.paper[25],\n address: r.paper[700],\n addressHalo: r.paper[25],\n roadMinor: r.paper[800],\n roadMinorHalo: r.paper[25],\n roadMajor: r.paper[900],\n roadMajorHalo: r.paper[25],\n ocean: r.sky[800],\n },\n\n pois: {\n blue: \"#2D6E8F\",\n green: r.verdant[700],\n lapis: \"#3F5C93\",\n pink: \"#8F4A6B\",\n red: \"#9B4340\",\n slategray: r.paper[700],\n tangerine: \"#8F5322\",\n turquoise: r.sky[700],\n },\n landcover: {\n grassland: r.verdant[200],\n barren: r.sandstone[200],\n urban_area: r.paper[50],\n farmland: r.verdant[100],\n glacier: r.paper[25],\n scrub: r.verdant[200],\n forest: r.verdant[300],\n },\n };\n\n /**\n * `base` / `dark`. The same map inverted, with the inversion that matters: water is drawn\n * *darker* than land. Two mid-tones meeting at a coastline is how a dark basemap turns to\n * mud, so the figure/ground edge is bought with lightness rather than hue. The motorway keeps\n * its orange, one step deeper.\n */\n const BASE_DARK: Recipe = {\n background: r.paper[950],\n earth: r.paper[900],\n water: r.sky[980],\n parkA: r.verdant[800],\n parkB: r.verdant[700],\n woodA: r.verdant[800],\n woodB: r.verdant[700],\n scrubA: r.verdant[900],\n scrubB: r.verdant[800],\n sand: r.sandstone[500],\n beach: r.sandstone[500],\n glacier: r.paper[700],\n institutional: r.paper[950],\n pedestrian: r.paper[950],\n aerodrome: r.cobalt[900],\n runway: r.cobalt[850],\n pier: r.paper[850],\n buildings: r.paper[850],\n railway: r.paper[700],\n boundaries: r.cobalt[500],\n roads: {\n other: r.paper[850],\n otherCasing: r.paper[1000],\n minor: r.paper[800],\n minorCasing: r.paper[1000],\n service: r.paper[850],\n serviceCasing: r.paper[1000],\n major: r.paper[700],\n majorCasing: r.paper[1000],\n highway: r.ember[600],\n highwayCasing: r.paper[1000],\n link: r.ember[700],\n linkCasing: r.paper[1000],\n },\n tunnelFill: r.paper[900],\n tunnelCasing: r.paper[1000],\n bridgeCasing: r.paper[1000],\n labels: {\n city: r.paper[100],\n cityHalo: r.paper[1000],\n state: r.paper[500],\n stateHalo: r.paper[1000],\n country: r.paper[500],\n subplace: r.paper[500],\n subplaceHalo: r.paper[1000],\n address: r.paper[500],\n addressHalo: r.paper[1000],\n roadMinor: r.paper[500],\n roadMinorHalo: r.paper[1000],\n roadMajor: r.paper[400],\n roadMajorHalo: r.paper[1000],\n ocean: r.sky[400],\n },\n\n pois: {\n blue: \"#7FC4E8\",\n green: r.verdant[400],\n lapis: \"#8FB0EA\",\n pink: \"#E3A0C0\",\n red: \"#EE968F\",\n slategray: r.paper[500],\n tangerine: \"#E8AC7C\",\n turquoise: r.sky[400],\n },\n landcover: {\n grassland: r.verdant[800],\n barren: r.sandstone[500],\n urban_area: r.paper[950],\n farmland: r.verdant[900],\n glacier: r.paper[700],\n scrub: r.verdant[900],\n forest: r.verdant[700],\n },\n };\n\n /**\n * `muted` / `light`. Greyscale end to end, after Mapbox Standard's monochrome theme: a\n * near-white field, parks and buildings a step or two down the same grey, white roads with\n * grey casings, grey water, grey labels, grey icons (its own sprite sheet). The style exists\n * so external data can be drawn over it without an arms race: nothing on the map carries a\n * hue, so an overlay in any colour is the only colour there is.\n *\n * Water is drawn from `mist`, a zero-chroma twin of the water ladder, rather than from\n * `graphite`: same greys, but it is the ramp the water seed recolours when someone applies\n * a theme to `muted`.\n */\n const MUTED_LIGHT: Recipe = {\n background: r.graphite[100],\n earth: r.graphite[25],\n water: r.mist[200],\n parkA: r.graphite[50],\n parkB: r.graphite[100],\n woodA: r.graphite[50],\n woodB: r.graphite[100],\n scrubA: r.graphite[50],\n scrubB: r.graphite[100],\n sand: r.graphite[100],\n beach: r.graphite[100],\n glacier: r.graphite[25],\n institutional: r.graphite[100],\n pedestrian: r.graphite[50],\n aerodrome: r.graphite[100],\n runway: r.graphite[200],\n pier: r.graphite[200],\n buildings: r.graphite[100],\n railway: r.graphite[400],\n boundaries: r.graphite[500],\n roads: {\n other: r.graphite[25],\n otherCasing: r.graphite[200],\n minor: \"#FFFFFF\",\n minorCasing: r.graphite[200],\n service: r.graphite[25],\n serviceCasing: r.graphite[200],\n major: \"#FFFFFF\",\n majorCasing: r.graphite[300],\n highway: r.graphite[200],\n highwayCasing: r.graphite[300],\n link: \"#FFFFFF\",\n linkCasing: r.graphite[300],\n },\n tunnelFill: r.graphite[100],\n tunnelCasing: r.graphite[200],\n bridgeCasing: r.graphite[400],\n labels: {\n city: r.graphite[1000],\n cityHalo: r.graphite[25],\n state: r.graphite[700],\n stateHalo: r.graphite[25],\n country: r.graphite[700],\n subplace: r.graphite[700],\n subplaceHalo: r.graphite[25],\n address: r.graphite[700],\n addressHalo: r.graphite[25],\n roadMinor: r.graphite[700],\n roadMinorHalo: r.graphite[25],\n roadMajor: r.graphite[800],\n roadMajorHalo: r.graphite[25],\n ocean: r.graphite[800],\n },\n\n pois: {\n blue: r.graphite[600],\n green: r.graphite[600],\n lapis: r.graphite[700],\n pink: r.graphite[600],\n red: r.graphite[700],\n slategray: r.graphite[700],\n tangerine: r.graphite[600],\n turquoise: r.graphite[600],\n },\n landcover: {\n grassland: r.graphite[50],\n barren: r.graphite[100],\n urban_area: r.graphite[50],\n farmland: r.graphite[50],\n glacier: r.graphite[25],\n scrub: r.graphite[50],\n forest: r.graphite[100],\n },\n };\n\n /**\n * `muted` / `dark`. The greyscale pair inverted: water sits below the land, roads stay the\n * brightest thing on the map, same hierarchy as light.\n */\n const MUTED_DARK: Recipe = {\n background: r.graphite[1000],\n earth: r.graphite[900],\n water: r.mist[980],\n parkA: r.graphite[900],\n parkB: r.graphite[800],\n woodA: r.graphite[900],\n woodB: r.graphite[800],\n scrubA: r.graphite[900],\n scrubB: r.graphite[800],\n sand: r.graphite[800],\n beach: r.graphite[800],\n glacier: r.graphite[700],\n institutional: r.graphite[900],\n pedestrian: r.graphite[900],\n aerodrome: r.graphite[900],\n runway: r.graphite[800],\n pier: r.graphite[800],\n buildings: r.graphite[800],\n railway: r.graphite[700],\n boundaries: r.graphite[600],\n roads: {\n other: r.graphite[800],\n otherCasing: r.graphite[1000],\n minor: r.graphite[700],\n minorCasing: r.graphite[1000],\n service: r.graphite[800],\n serviceCasing: r.graphite[1000],\n major: r.graphite[600],\n majorCasing: r.graphite[1000],\n highway: r.graphite[500],\n highwayCasing: r.graphite[1000],\n link: r.graphite[600],\n linkCasing: r.graphite[1000],\n },\n tunnelFill: r.graphite[900],\n tunnelCasing: r.graphite[1000],\n bridgeCasing: r.graphite[1000],\n labels: {\n city: r.graphite[100],\n cityHalo: r.graphite[1000],\n state: r.graphite[500],\n stateHalo: r.graphite[1000],\n country: r.graphite[500],\n subplace: r.graphite[500],\n subplaceHalo: r.graphite[1000],\n address: r.graphite[500],\n addressHalo: r.graphite[1000],\n roadMinor: r.graphite[500],\n roadMinorHalo: r.graphite[1000],\n roadMajor: r.graphite[400],\n roadMajorHalo: r.graphite[1000],\n ocean: r.graphite[400],\n },\n\n pois: {\n blue: r.graphite[400],\n green: r.graphite[400],\n lapis: r.graphite[500],\n pink: r.graphite[400],\n red: r.graphite[500],\n slategray: r.graphite[500],\n tangerine: r.graphite[400],\n turquoise: r.graphite[400],\n },\n landcover: {\n grassland: r.graphite[900],\n barren: r.graphite[800],\n urban_area: r.graphite[900],\n farmland: r.graphite[900],\n glacier: r.graphite[700],\n scrub: r.graphite[900],\n forest: r.graphite[800],\n },\n };\n\n /**\n * `outdoor` / `light`. Terrain-first scenic: the map you use to look at ground rather than to\n * find an address.\n *\n * Land sits a step lighter than `base` on purpose: a hillshade is composited beneath the roads\n * with a multiply blend, which only ever darkens, so the lift is the headroom that shading\n * spends. Rendered without a DEM it will look flat and slightly washed — that is the tell that\n * the terrain source is missing, not a palette bug. See `terrain.ts`.\n *\n * **Landcover stops receding.** Every other flavour keeps ground cover near-neutral so a\n * customer's data wins. Here the ground cover *is* the content, so forest, scrub and grassland\n * separate across `verdant` instead of collapsing into one field.\n *\n * **Protected land reads as protected.** `park` steps a tone deeper than generic vegetation, so a\n * national park is distinguishable from the golf course that `landuse_park` files beside it.\n *\n * **Roads recede one step**, via their casings rather than their fills: a lighter casing on a\n * white road keeps the shape legible while surrendering the contrast fight to the terrain.\n * Labels and halos keep the same contrast-safe `ink` steps as `base`, which is what keeps the\n * enforced contrast floors satisfied — the ramps are solved against those, and re-deriving them\n * for one flavour would be re-solving a problem that is already solved.\n */\n const OUTDOOR_LIGHT: Recipe = {\n background: r.ink[200],\n // Warm paper, not the near-white ink the style launched on (2026-09-09): a green reads as\n // vegetation against warm land and as a polygon against white, which is the difference\n // between an outdoor map and a diagram. Mapbox Outdoors' land is hsl(60, 20%, 85%).\n earth: r.paper[100],\n water: r.wave[300],\n parkA: r.fern[300],\n parkB: r.fern[400],\n woodA: r.fern[300],\n woodB: r.fern[400],\n scrubA: r.fern[200],\n scrubB: r.fern[300],\n sand: r.sandstone[300],\n beach: r.sandstone[300],\n glacier: r.ink[25],\n institutional: r.ink[25],\n pedestrian: r.ink[50],\n aerodrome: r.ink[50],\n runway: r.ink[200],\n pier: r.ink[300],\n // A step lighter than `base`: outdoors, the building footprint is context, not content.\n buildings: r.ink[200],\n railway: r.ink[500],\n boundaries: r.ink[600],\n roads: {\n other: r.ink[50],\n otherCasing: r.ink[200],\n minor: r.ink[25],\n minorCasing: r.ink[200],\n service: r.ink[50],\n serviceCasing: r.ink[200],\n major: \"#FFFFFF\",\n majorCasing: r.ink[300],\n highway: \"#FFFFFF\",\n highwayCasing: r.ink[400],\n link: \"#FFFFFF\",\n linkCasing: r.ink[300],\n },\n tunnelFill: r.ink[200],\n tunnelCasing: r.ink[300],\n bridgeCasing: r.ink[400],\n labels: {\n city: r.ink[1000],\n cityHalo: r.ink[25],\n state: r.ink[700],\n stateHalo: r.ink[25],\n country: r.ink[700],\n subplace: r.ink[700],\n subplaceHalo: r.ink[25],\n address: r.ink[700],\n addressHalo: r.ink[25],\n roadMinor: r.ink[700],\n roadMinorHalo: r.ink[25],\n roadMajor: r.ink[800],\n roadMajorHalo: r.ink[25],\n ocean: r.wave[800],\n },\n\n pois: {\n blue: \"#2D6E8F\",\n // Peaks, parks, forests and gardens all come through green. On this flavour they are the\n // POIs worth finding, so it carries a full step more weight than elsewhere.\n green: r.fern[800],\n lapis: \"#3F5C93\",\n pink: \"#8F4A6B\",\n red: \"#9B4340\",\n slategray: r.ink[700],\n tangerine: \"#8F5322\",\n turquoise: r.wave[700],\n },\n landcover: {\n grassland: r.fern[200],\n barren: r.sandstone[300],\n urban_area: r.ink[100],\n farmland: r.sandstone[200],\n glacier: r.ink[25],\n scrub: r.fern[300],\n forest: r.fern[400],\n },\n };\n\n /**\n * `outdoor` / `dark`. The same three divergences, inverted: the land sits darker to leave room\n * *above* it for a hillshade highlight to do the modelling.\n *\n * Vegetation lifts rather than deepens here. On a dark basemap a deeper green is indistinguishable\n * from the land it sits on, so the separation that `light` gets by going darker, `dark` gets by\n * going lighter — the same intent through the opposite move.\n */\n const OUTDOOR_DARK: Recipe = {\n background: r.ink[1000],\n earth: r.ink[950],\n water: r.wave[980],\n parkA: r.fern[700],\n parkB: r.fern[600],\n woodA: r.fern[700],\n woodB: r.fern[600],\n scrubA: r.fern[800],\n scrubB: r.fern[700],\n sand: r.sandstone[500],\n beach: r.sandstone[500],\n glacier: r.ink[700],\n institutional: r.ink[1000],\n pedestrian: r.ink[950],\n aerodrome: r.ink[950],\n runway: r.ink[850],\n pier: r.ink[850],\n buildings: r.ink[900],\n railway: r.ink[700],\n boundaries: r.ink[600],\n roads: {\n // The minor tier recedes toward `earth`; majors and highways hold their contrast,\n // because a road you cannot see is a different failure from a road that is merely quiet.\n other: r.ink[900],\n otherCasing: r.ink[1000],\n minor: r.ink[850],\n minorCasing: r.ink[1000],\n service: r.ink[900],\n serviceCasing: r.ink[1000],\n major: r.ink[700],\n majorCasing: r.ink[1000],\n highway: r.ink[600],\n highwayCasing: r.ink[1000],\n link: r.ink[700],\n linkCasing: r.ink[1000],\n },\n tunnelFill: r.ink[900],\n tunnelCasing: r.ink[1000],\n bridgeCasing: r.ink[1000],\n labels: {\n city: r.ink[100],\n cityHalo: r.ink[1000],\n state: r.ink[500],\n stateHalo: r.ink[1000],\n country: r.ink[500],\n subplace: r.ink[500],\n subplaceHalo: r.ink[1000],\n address: r.ink[500],\n addressHalo: r.ink[1000],\n roadMinor: r.ink[500],\n roadMinorHalo: r.ink[1000],\n roadMajor: r.ink[400],\n roadMajorHalo: r.ink[1000],\n ocean: r.wave[400],\n },\n\n pois: {\n blue: \"#7FC4E8\",\n green: r.fern[300],\n lapis: \"#8FB0EA\",\n pink: \"#E3A0C0\",\n red: \"#EE968F\",\n slategray: r.ink[500],\n tangerine: \"#E8AC7C\",\n turquoise: r.wave[400],\n },\n landcover: {\n grassland: r.fern[700],\n barren: r.sandstone[500],\n urban_area: r.ink[950],\n farmland: r.fern[900],\n glacier: r.ink[700],\n scrub: r.fern[800],\n forest: r.fern[600],\n },\n };\n\n /**\n * `blueprint` / `light`. The print, not the plate: blue-white paper, pale blue water, roads\n * as blue lines with a white casing that darken up the hierarchy, labels in the deep blues.\n */\n const BLUEPRINT_LIGHT: Recipe = {\n background: r.cobalt[100],\n earth: r.cobalt[25],\n water: r.cobalt[200],\n parkA: r.cobalt[50],\n parkB: r.cobalt[100],\n woodA: r.cobalt[50],\n woodB: r.cobalt[100],\n scrubA: r.cobalt[50],\n scrubB: r.cobalt[100],\n sand: r.cobalt[50],\n beach: r.cobalt[50],\n glacier: r.cobalt[25],\n institutional: r.cobalt[50],\n pedestrian: r.cobalt[50],\n aerodrome: r.cobalt[50],\n runway: r.cobalt[200],\n pier: r.cobalt[200],\n buildings: r.cobalt[100],\n railway: r.cobalt[500],\n boundaries: r.cobalt[600],\n roads: {\n other: r.cobalt[200],\n otherCasing: r.cobalt[25],\n minor: r.cobalt[300],\n minorCasing: r.cobalt[25],\n service: r.cobalt[200],\n serviceCasing: r.cobalt[25],\n major: r.cobalt[400],\n majorCasing: r.cobalt[25],\n highway: r.cobalt[500],\n highwayCasing: r.cobalt[25],\n link: r.cobalt[400],\n linkCasing: r.cobalt[25],\n },\n tunnelFill: r.cobalt[100],\n tunnelCasing: r.cobalt[200],\n bridgeCasing: r.cobalt[600],\n labels: {\n city: r.cobalt[1000],\n cityHalo: r.cobalt[25],\n state: r.cobalt[700],\n stateHalo: r.cobalt[25],\n country: r.cobalt[700],\n subplace: r.cobalt[700],\n subplaceHalo: r.cobalt[25],\n address: r.cobalt[700],\n addressHalo: r.cobalt[25],\n roadMinor: r.cobalt[700],\n roadMinorHalo: r.cobalt[25],\n roadMajor: r.cobalt[800],\n roadMajorHalo: r.cobalt[25],\n ocean: r.cobalt[800],\n },\n\n pois: {\n blue: r.cobalt[700],\n green: r.cobalt[700],\n lapis: r.cobalt[700],\n pink: r.cobalt[700],\n red: r.cobalt[700],\n slategray: r.cobalt[700],\n tangerine: r.cobalt[700],\n turquoise: r.cobalt[700],\n },\n landcover: {\n grassland: r.cobalt[50],\n barren: r.cobalt[50],\n urban_area: r.cobalt[50],\n farmland: r.cobalt[50],\n glacier: r.cobalt[25],\n scrub: r.cobalt[50],\n forest: r.cobalt[100],\n },\n };\n\n /**\n * `blueprint` / `dark`. The native mode, modelled on the \"Cartogram\" look: a royal blue\n * field (`cobalt.700`), parks and buildings one lighter blue, water lighter still, and roads\n * as navy lines with a pale casing — ink on a blueprint. This is the one dark mode where\n * water is *lighter* than land, on purpose: the reference draws it that way, and a blueprint\n * with dark water would just be a night map. Labels are the palest steps; `state` sits one\n * step lighter than the reference's `#b9c6f5` because that grey-blue misses 4.5:1 on the\n * field.\n */\n const BLUEPRINT_DARK: Recipe = {\n background: r.cobalt[700],\n earth: r.cobalt[700],\n water: r.cobalt[400],\n parkA: r.cobalt[600],\n parkB: r.cobalt[600],\n woodA: r.cobalt[600],\n woodB: r.cobalt[600],\n scrubA: r.cobalt[600],\n scrubB: r.cobalt[600],\n sand: r.cobalt[600],\n beach: r.cobalt[600],\n glacier: r.cobalt[500],\n institutional: r.cobalt[600],\n pedestrian: r.cobalt[700],\n aerodrome: r.cobalt[600],\n runway: r.cobalt[800],\n pier: r.cobalt[800],\n buildings: r.cobalt[600],\n railway: r.cobalt[400],\n boundaries: r.cobalt[300],\n roads: {\n other: r.cobalt[800],\n otherCasing: r.cobalt[700],\n minor: r.cobalt[850],\n minorCasing: r.cobalt[600],\n service: r.cobalt[800],\n serviceCasing: r.cobalt[700],\n major: r.cobalt[900],\n majorCasing: r.cobalt[600],\n highway: r.cobalt[950],\n highwayCasing: r.cobalt[500],\n link: r.cobalt[900],\n linkCasing: r.cobalt[600],\n },\n tunnelFill: r.cobalt[800],\n tunnelCasing: r.cobalt[700],\n bridgeCasing: r.cobalt[500],\n labels: {\n city: r.cobalt[25],\n cityHalo: r.cobalt[700],\n state: r.cobalt[200],\n stateHalo: r.cobalt[700],\n country: r.cobalt[200],\n subplace: r.cobalt[300],\n subplaceHalo: r.cobalt[700],\n address: r.cobalt[300],\n addressHalo: r.cobalt[700],\n roadMinor: r.cobalt[300],\n roadMinorHalo: r.cobalt[700],\n roadMajor: r.cobalt[100],\n roadMajorHalo: r.cobalt[700],\n ocean: r.cobalt[900],\n },\n\n pois: {\n blue: r.cobalt[200],\n green: r.cobalt[200],\n lapis: r.cobalt[200],\n pink: r.cobalt[200],\n red: r.cobalt[200],\n slategray: r.cobalt[200],\n tangerine: r.cobalt[200],\n turquoise: r.cobalt[200],\n },\n landcover: {\n grassland: r.cobalt[600],\n barren: r.cobalt[600],\n urban_area: r.cobalt[700],\n farmland: r.cobalt[600],\n glacier: r.cobalt[500],\n scrub: r.cobalt[600],\n forest: r.cobalt[600],\n },\n };\n\n /**\n * `blush` / `light`. After Protomaps' *dusk rose*: a pink land on a peach ground, peach\n * roads that read as gaps in the pink rather than as lines, and buildings in the deepest\n * rose on the map. Parks and woods keep a soft green so the whole thing does not turn into\n * a single wash. Labels take the dark rose steps because the reference's grey-browns miss\n * the floors.\n */\n const BLUSH_LIGHT: Recipe = {\n background: r.ember[200],\n earth: r.rose[300],\n water: r.ember[200],\n parkA: r.verdant[300],\n parkB: r.verdant[400],\n woodA: r.verdant[300],\n woodB: r.verdant[400],\n scrubA: r.sandstone[200],\n scrubB: r.sandstone[300],\n sand: r.sandstone[200],\n beach: r.sandstone[100],\n glacier: r.rose[100],\n institutional: r.rose[200],\n pedestrian: r.lilac[200],\n aerodrome: r.rose[200],\n runway: r.ember[200],\n pier: r.sandstone[300],\n buildings: r.rose[500],\n railway: r.sandstone[100],\n boundaries: r.rose[700],\n roads: {\n other: r.ember[200],\n otherCasing: r.rose[300],\n minor: r.ember[200],\n minorCasing: r.rose[300],\n service: r.ember[200],\n serviceCasing: r.rose[300],\n major: r.ember[200],\n majorCasing: r.rose[400],\n highway: \"#FFFFFF\",\n highwayCasing: r.rose[400],\n link: r.ember[200],\n linkCasing: r.rose[400],\n },\n tunnelFill: r.rose[200],\n tunnelCasing: r.rose[300],\n bridgeCasing: r.rose[500],\n labels: {\n city: r.paper[1000],\n cityHalo: r.rose[25],\n state: r.rose[800],\n stateHalo: r.rose[25],\n country: r.rose[800],\n subplace: r.rose[700],\n subplaceHalo: r.rose[25],\n address: r.rose[800],\n addressHalo: r.rose[25],\n roadMinor: r.rose[800],\n roadMinorHalo: r.rose[25],\n roadMajor: r.rose[850],\n roadMajorHalo: r.rose[25],\n ocean: r.ember[700],\n },\n\n pois: {\n blue: r.cobalt[700],\n green: r.verdant[700],\n lapis: r.cobalt[700],\n pink: r.rose[700],\n red: r.rose[700],\n slategray: r.rose[700],\n tangerine: r.ember[700],\n turquoise: r.sky[700],\n },\n landcover: {\n grassland: r.verdant[300],\n barren: r.sandstone[200],\n urban_area: r.rose[400],\n farmland: r.verdant[200],\n glacier: r.rose[100],\n scrub: r.verdant[200],\n forest: r.verdant[400],\n },\n };\n\n /**\n * `blush` / `dark`. Wine instead of pink: the same rose family at its dark steps, water a\n * shade below the land, roads brightening up the hierarchy, buildings one step lighter than\n * the field.\n */\n const BLUSH_DARK: Recipe = {\n background: r.rose[1000],\n earth: r.rose[900],\n water: r.rose[1000],\n parkA: r.verdant[800],\n parkB: r.verdant[700],\n woodA: r.verdant[800],\n woodB: r.verdant[700],\n scrubA: r.verdant[900],\n scrubB: r.verdant[800],\n sand: r.sandstone[500],\n beach: r.sandstone[400],\n glacier: r.rose[700],\n institutional: r.rose[850],\n pedestrian: r.lilac[900],\n aerodrome: r.rose[850],\n runway: r.rose[800],\n pier: r.sandstone[500],\n buildings: r.rose[700],\n railway: r.rose[700],\n boundaries: r.rose[500],\n roads: {\n other: r.rose[850],\n otherCasing: r.rose[1000],\n minor: r.rose[800],\n minorCasing: r.rose[1000],\n service: r.rose[850],\n serviceCasing: r.rose[1000],\n major: r.rose[700],\n majorCasing: r.rose[1000],\n highway: r.rose[600],\n highwayCasing: r.rose[1000],\n link: r.rose[700],\n linkCasing: r.rose[1000],\n },\n tunnelFill: r.rose[900],\n tunnelCasing: r.rose[1000],\n bridgeCasing: r.rose[1000],\n labels: {\n city: r.rose[100],\n cityHalo: r.rose[1000],\n state: r.rose[500],\n stateHalo: r.rose[1000],\n country: r.rose[500],\n subplace: r.rose[500],\n subplaceHalo: r.rose[1000],\n address: r.rose[500],\n addressHalo: r.rose[1000],\n roadMinor: r.rose[500],\n roadMinorHalo: r.rose[1000],\n roadMajor: r.rose[400],\n roadMajorHalo: r.rose[1000],\n ocean: r.ember[400],\n },\n\n pois: {\n blue: r.cobalt[400],\n green: r.verdant[400],\n lapis: r.cobalt[400],\n pink: r.rose[400],\n red: r.rose[400],\n slategray: r.rose[500],\n tangerine: r.ember[400],\n turquoise: r.sky[400],\n },\n landcover: {\n grassland: r.verdant[800],\n barren: r.sandstone[500],\n urban_area: r.rose[900],\n farmland: r.verdant[900],\n glacier: r.rose[700],\n scrub: r.verdant[900],\n forest: r.verdant[700],\n },\n };\n\n /**\n * `orchid` / `light`. After Protomaps' *iris bloom*: a lavender-grey land on white, white\n * roads, and the colour concentrated where the reference puts it — vivid teal parks (`aqua`),\n * mint woods (`jade`), sky water, navy boundaries and a navy city label. The land ramp is\n * kept quiet so those pops stay pops.\n */\n const ORCHID_LIGHT: Recipe = {\n background: r.lilac[25],\n earth: r.lilac[200],\n water: r.sky[300],\n parkA: r.aqua[300],\n parkB: r.aqua[400],\n woodA: r.jade[500],\n woodB: r.jade[600],\n scrubA: r.sandstone[300],\n scrubB: r.sandstone[400],\n sand: r.sandstone[300],\n beach: r.sandstone[200],\n glacier: r.lilac[100],\n institutional: r.lilac[300],\n pedestrian: r.lilac[300],\n aerodrome: r.sandstone[100],\n runway: r.lilac[25],\n pier: r.cobalt[500],\n buildings: r.lilac[300],\n railway: r.lilac[400],\n boundaries: r.cobalt[900],\n roads: {\n other: \"#FFFFFF\",\n otherCasing: r.lilac[200],\n minor: \"#FFFFFF\",\n minorCasing: r.lilac[200],\n service: \"#FFFFFF\",\n serviceCasing: r.lilac[200],\n major: \"#FFFFFF\",\n majorCasing: r.lilac[300],\n highway: \"#FFFFFF\",\n highwayCasing: r.lilac[400],\n link: \"#FFFFFF\",\n linkCasing: r.lilac[300],\n },\n tunnelFill: r.lilac[100],\n tunnelCasing: r.lilac[200],\n bridgeCasing: r.lilac[500],\n labels: {\n city: r.cobalt[950],\n cityHalo: r.lilac[25],\n state: r.lilac[700],\n stateHalo: r.lilac[25],\n country: r.lilac[850],\n subplace: r.lilac[700],\n subplaceHalo: r.lilac[25],\n address: r.lilac[700],\n addressHalo: r.lilac[25],\n roadMinor: r.lilac[800],\n roadMinorHalo: r.lilac[25],\n roadMajor: r.lilac[850],\n roadMajorHalo: r.lilac[25],\n ocean: r.cobalt[800],\n },\n\n pois: {\n blue: r.cobalt[700],\n green: r.jade[700],\n lapis: r.cobalt[700],\n pink: r.rose[600],\n red: r.rose[700],\n slategray: r.lilac[700],\n tangerine: r.ember[700],\n turquoise: r.aqua[700],\n },\n landcover: {\n grassland: r.jade[400],\n barren: r.sandstone[300],\n urban_area: r.lilac[200],\n farmland: r.jade[500],\n glacier: r.lilac[100],\n scrub: r.verdant[400],\n forest: r.jade[500],\n },\n };\n\n /**\n * `orchid` / `dark`. Deep violet field, the teal and mint kept for parks and woods, water\n * darker than land as every dark mode requires.\n */\n const ORCHID_DARK: Recipe = {\n background: r.lilac[1000],\n earth: r.lilac[900],\n water: r.sky[980],\n parkA: r.aqua[800],\n parkB: r.aqua[700],\n woodA: r.jade[800],\n woodB: r.jade[700],\n scrubA: r.sandstone[500],\n scrubB: r.sandstone[500],\n sand: r.sandstone[500],\n beach: r.sandstone[400],\n glacier: r.lilac[700],\n institutional: r.lilac[850],\n pedestrian: r.lilac[850],\n aerodrome: r.lilac[850],\n runway: r.lilac[800],\n pier: r.cobalt[600],\n buildings: r.lilac[800],\n railway: r.lilac[700],\n boundaries: r.cobalt[400],\n roads: {\n other: r.lilac[850],\n otherCasing: r.lilac[1000],\n minor: r.lilac[800],\n minorCasing: r.lilac[1000],\n service: r.lilac[850],\n serviceCasing: r.lilac[1000],\n major: r.lilac[700],\n majorCasing: r.lilac[1000],\n highway: r.lilac[600],\n highwayCasing: r.lilac[1000],\n link: r.lilac[700],\n linkCasing: r.lilac[1000],\n },\n tunnelFill: r.lilac[900],\n tunnelCasing: r.lilac[1000],\n bridgeCasing: r.lilac[1000],\n labels: {\n city: r.lilac[100],\n cityHalo: r.lilac[1000],\n state: r.lilac[500],\n stateHalo: r.lilac[1000],\n country: r.lilac[500],\n subplace: r.lilac[500],\n subplaceHalo: r.lilac[1000],\n address: r.lilac[500],\n addressHalo: r.lilac[1000],\n roadMinor: r.lilac[500],\n roadMinorHalo: r.lilac[1000],\n roadMajor: r.lilac[400],\n roadMajorHalo: r.lilac[1000],\n ocean: r.sky[400],\n },\n\n pois: {\n blue: r.cobalt[400],\n green: r.jade[400],\n lapis: r.cobalt[400],\n pink: r.rose[400],\n red: r.rose[400],\n slategray: r.lilac[500],\n tangerine: r.ember[400],\n turquoise: r.aqua[400],\n },\n landcover: {\n grassland: r.jade[800],\n barren: r.sandstone[500],\n urban_area: r.lilac[900],\n farmland: r.jade[900],\n glacier: r.lilac[700],\n scrub: r.verdant[800],\n forest: r.jade[800],\n },\n };\n\n /**\n * `canopy` / `light`. After Protomaps' *rainforest*: a tan earth under dark teal-green parks\n * and forest, near-black roads with the earth as their casing, clay-orange buildings, and\n * strong blue water. The reference sets its labels in white on tan, which misses every\n * floor; here they are dark on a sand halo instead.\n */\n const CANOPY_LIGHT: Recipe = {\n background: r.verdant[100],\n earth: r.sandstone[200],\n water: r.cobalt[600],\n parkA: r.verdant[800],\n parkB: r.verdant[700],\n woodA: r.verdant[600],\n woodB: r.verdant[700],\n scrubA: r.sandstone[500],\n scrubB: r.sandstone[400],\n sand: r.sandstone[200],\n beach: r.sandstone[100],\n glacier: r.paper[25],\n institutional: r.rose[200],\n pedestrian: r.rose[100],\n aerodrome: r.lilac[500],\n runway: r.paper[1000],\n pier: r.sky[300],\n buildings: r.ember[700],\n railway: r.paper[950],\n boundaries: r.graphite[300],\n roads: {\n other: r.rose[1000],\n otherCasing: r.sandstone[200],\n minor: r.rose[1000],\n minorCasing: r.sandstone[200],\n service: r.rose[1000],\n serviceCasing: r.sandstone[200],\n major: r.rose[1000],\n majorCasing: r.sandstone[100],\n highway: r.rose[1000],\n highwayCasing: r.sandstone[100],\n link: r.rose[1000],\n linkCasing: r.sandstone[100],\n },\n tunnelFill: r.rose[900],\n tunnelCasing: r.sandstone[200],\n bridgeCasing: r.sandstone[100],\n labels: {\n city: r.paper[1000],\n cityHalo: r.sandstone[100],\n state: r.paper[800],\n stateHalo: r.sandstone[100],\n country: r.paper[800],\n subplace: r.paper[700],\n subplaceHalo: r.sandstone[100],\n address: r.paper[800],\n addressHalo: r.sandstone[100],\n roadMinor: r.paper[800],\n roadMinorHalo: r.sandstone[100],\n roadMajor: r.paper[900],\n roadMajorHalo: r.sandstone[100],\n ocean: r.cobalt[25],\n },\n\n pois: {\n blue: r.cobalt[700],\n green: r.verdant[700],\n lapis: r.cobalt[700],\n pink: r.rose[600],\n red: r.rose[700],\n slategray: r.paper[700],\n tangerine: r.ember[700],\n turquoise: r.sky[700],\n },\n landcover: {\n grassland: r.verdant[500],\n barren: r.sandstone[400],\n urban_area: r.rose[600],\n farmland: r.verdant[600],\n glacier: r.paper[25],\n scrub: r.sandstone[500],\n forest: r.verdant[800],\n },\n };\n\n /**\n * `canopy` / `dark`. The forest floor at night: warm brown land, the greens kept deep,\n * roads turned into sand-coloured lines, buildings still clay.\n */\n const CANOPY_DARK: Recipe = {\n // `linen` rather than `paper` for the ground alone: paper is packed solid here (1000 casings,\n // 950 background, 900 earth, 850 scrub), so there is no free step to move to, and `base`\n // owns paper[900]. The straw tint also suits a style whose light half is sandstone.\n background: r.linen[950],\n earth: r.linen[900],\n water: r.cobalt[950],\n parkA: r.verdant[900],\n parkB: r.verdant[800],\n woodA: r.verdant[800],\n woodB: r.verdant[800],\n scrubA: r.paper[850],\n scrubB: r.paper[850],\n sand: r.sandstone[500],\n beach: r.sandstone[400],\n glacier: r.paper[700],\n institutional: r.paper[850],\n pedestrian: r.rose[900],\n aerodrome: r.lilac[850],\n runway: r.paper[800],\n pier: r.sky[700],\n buildings: r.ember[700],\n railway: r.paper[700],\n boundaries: r.graphite[600],\n roads: {\n other: r.sandstone[500],\n otherCasing: r.paper[1000],\n minor: r.sandstone[400],\n minorCasing: r.paper[1000],\n service: r.sandstone[500],\n serviceCasing: r.paper[1000],\n major: r.sandstone[300],\n majorCasing: r.paper[1000],\n highway: r.sandstone[200],\n highwayCasing: r.paper[1000],\n link: r.sandstone[300],\n linkCasing: r.paper[1000],\n },\n tunnelFill: r.paper[900],\n tunnelCasing: r.paper[1000],\n bridgeCasing: r.paper[1000],\n labels: {\n city: r.sandstone[100],\n cityHalo: r.paper[1000],\n state: r.sandstone[300],\n stateHalo: r.paper[1000],\n country: r.sandstone[300],\n subplace: r.sandstone[300],\n subplaceHalo: r.paper[1000],\n address: r.sandstone[300],\n addressHalo: r.paper[1000],\n roadMinor: r.sandstone[300],\n roadMinorHalo: r.paper[1000],\n roadMajor: r.sandstone[200],\n roadMajorHalo: r.paper[1000],\n ocean: r.cobalt[300],\n },\n\n pois: {\n blue: r.cobalt[400],\n green: r.verdant[400],\n lapis: r.cobalt[400],\n pink: r.rose[400],\n red: r.rose[400],\n slategray: r.sandstone[300],\n tangerine: r.ember[400],\n turquoise: r.sky[400],\n },\n landcover: {\n grassland: r.verdant[900],\n barren: r.sandstone[500],\n urban_area: r.rose[900],\n farmland: r.verdant[900],\n glacier: r.paper[700],\n scrub: r.paper[850],\n forest: r.verdant[900],\n },\n };\n\n /**\n * `lagoon` / `light`. After Protomaps' *seafoam*: pale green land, aqua water, teal parks\n * and woods, white roads, grey buildings and grey labels — a cool, low-contrast map that\n * still keeps its greens and teals apart.\n */\n const LAGOON_LIGHT: Recipe = {\n background: r.verdant[100],\n earth: r.verdant[100],\n water: r.wave[200],\n parkA: r.aqua[300],\n parkB: r.aqua[400],\n woodA: r.wave[300],\n woodB: r.wave[400],\n scrubA: r.verdant[300],\n scrubB: r.verdant[400],\n sand: r.sandstone[200],\n beach: r.verdant[100],\n glacier: r.graphite[50],\n institutional: r.verdant[200],\n pedestrian: r.wave[100],\n aerodrome: r.paper[200],\n runway: r.verdant[100],\n pier: r.sky[300],\n buildings: r.graphite[100],\n railway: r.graphite[25],\n boundaries: r.graphite[500],\n roads: {\n other: \"#FFFFFF\",\n otherCasing: r.verdant[200],\n minor: \"#FFFFFF\",\n minorCasing: r.verdant[200],\n service: \"#FFFFFF\",\n serviceCasing: r.verdant[200],\n major: \"#FFFFFF\",\n majorCasing: r.verdant[300],\n highway: \"#FFFFFF\",\n highwayCasing: r.verdant[300],\n link: \"#FFFFFF\",\n linkCasing: r.verdant[300],\n },\n tunnelFill: r.graphite[50],\n tunnelCasing: r.verdant[200],\n bridgeCasing: r.graphite[400],\n labels: {\n city: r.graphite[800],\n cityHalo: r.verdant[100],\n state: r.graphite[700],\n stateHalo: r.verdant[100],\n country: r.graphite[700],\n subplace: r.graphite[700],\n subplaceHalo: r.verdant[100],\n address: r.graphite[700],\n addressHalo: r.verdant[100],\n roadMinor: r.graphite[700],\n roadMinorHalo: r.verdant[100],\n roadMajor: r.graphite[800],\n roadMajorHalo: r.verdant[100],\n ocean: r.wave[800],\n },\n\n pois: {\n blue: r.wave[700],\n green: r.verdant[700],\n lapis: r.sky[700],\n pink: r.rose[600],\n red: r.rose[700],\n slategray: r.graphite[700],\n tangerine: r.sandstone[500],\n turquoise: r.aqua[700],\n },\n landcover: {\n grassland: r.verdant[400],\n barren: r.sandstone[200],\n urban_area: r.verdant[100],\n farmland: r.verdant[300],\n glacier: r.graphite[50],\n scrub: r.verdant[300],\n forest: r.wave[300],\n },\n };\n\n /**\n * `lagoon` / `dark`. Deep green land, water darker still, roads brightening up the\n * hierarchy in the same green family, parks and woods holding their teal.\n */\n const LAGOON_DARK: Recipe = {\n background: r.verdant[900],\n earth: r.verdant[900],\n water: r.wave[980],\n parkA: r.aqua[800],\n parkB: r.aqua[700],\n woodA: r.wave[800],\n woodB: r.wave[700],\n scrubA: r.verdant[800],\n scrubB: r.verdant[800],\n sand: r.sandstone[500],\n beach: r.verdant[800],\n glacier: r.graphite[700],\n institutional: r.verdant[800],\n pedestrian: r.wave[900],\n aerodrome: r.graphite[800],\n runway: r.verdant[800],\n pier: r.sky[600],\n buildings: r.verdant[800],\n railway: r.graphite[700],\n boundaries: r.graphite[600],\n roads: {\n other: r.verdant[700],\n otherCasing: r.verdant[900],\n minor: r.verdant[600],\n minorCasing: r.verdant[900],\n service: r.verdant[700],\n serviceCasing: r.verdant[900],\n major: r.verdant[500],\n majorCasing: r.verdant[900],\n highway: r.verdant[400],\n highwayCasing: r.verdant[900],\n link: r.verdant[500],\n linkCasing: r.verdant[900],\n },\n tunnelFill: r.verdant[800],\n tunnelCasing: r.verdant[900],\n bridgeCasing: r.verdant[900],\n labels: {\n city: r.verdant[100],\n cityHalo: r.verdant[900],\n state: r.verdant[300],\n stateHalo: r.verdant[900],\n country: r.verdant[300],\n subplace: r.verdant[300],\n subplaceHalo: r.verdant[900],\n address: r.verdant[300],\n addressHalo: r.verdant[900],\n roadMinor: r.verdant[300],\n roadMinorHalo: r.verdant[900],\n roadMajor: r.verdant[200],\n roadMajorHalo: r.verdant[900],\n ocean: r.wave[400],\n },\n\n pois: {\n blue: r.wave[400],\n green: r.verdant[400],\n lapis: r.sky[400],\n pink: r.rose[400],\n red: r.rose[400],\n slategray: r.graphite[400],\n tangerine: r.sandstone[400],\n turquoise: r.aqua[400],\n },\n landcover: {\n grassland: r.verdant[800],\n barren: r.sandstone[500],\n urban_area: r.verdant[900],\n farmland: r.verdant[800],\n glacier: r.graphite[700],\n scrub: r.verdant[800],\n forest: r.wave[800],\n },\n };\n\n /**\n * `tropic` / `light`. After CARTO's *Tropic* and *Temps*: teal water at full strength (`aqua`), spring-green\n * parks and woods (`jade`), cream land (`linen`), a coral highway with a deeper coral casing, coral\n * boundaries, and labels in the deep teals. The most Canadian of the vivid four: it reads as a lake map.\n */\n const TROPIC_LIGHT: Recipe = {\n background: r.linen[100],\n // A step below `sunset`, whose warm duotone owns the lightest cream. Tropic's cream sitting\n // slightly deeper is also what lets its full-strength teal water carry the style.\n earth: r.linen[50],\n water: r.aqua[500],\n parkA: r.jade[300],\n parkB: r.jade[400],\n woodA: r.jade[400],\n woodB: r.jade[500],\n scrubA: r.fern[200],\n scrubB: r.fern[300],\n sand: r.sandstone[200],\n beach: r.sandstone[100],\n glacier: r.ink[25],\n institutional: r.linen[100],\n pedestrian: r.linen[50],\n aerodrome: r.linen[200],\n runway: r.linen[300],\n pier: r.aqua[300],\n buildings: r.linen[200],\n railway: r.linen[400],\n boundaries: r.coral[700],\n roads: {\n other: \"#FFFFFF\",\n otherCasing: r.linen[200],\n minor: \"#FFFFFF\",\n minorCasing: r.linen[200],\n service: \"#FFFFFF\",\n serviceCasing: r.linen[200],\n major: \"#FFFFFF\",\n majorCasing: r.linen[300],\n highway: r.coral[500],\n highwayCasing: r.coral[700],\n link: r.coral[400],\n linkCasing: r.coral[600],\n },\n tunnelFill: r.linen[100],\n tunnelCasing: r.linen[200],\n bridgeCasing: r.linen[500],\n labels: {\n city: r.aqua[950],\n cityHalo: r.linen[25],\n state: r.aqua[800],\n stateHalo: r.linen[25],\n country: r.aqua[800],\n subplace: r.aqua[800],\n subplaceHalo: r.linen[25],\n address: r.linen[700],\n addressHalo: r.linen[25],\n roadMinor: r.linen[700],\n roadMinorHalo: r.linen[25],\n roadMajor: r.aqua[900],\n roadMajorHalo: r.linen[25],\n ocean: r.aqua[980],\n },\n\n pois: {\n blue: r.wave[700],\n green: r.verdant[700],\n lapis: r.sky[700],\n pink: r.rose[600],\n red: r.rose[700],\n slategray: r.graphite[700],\n tangerine: r.sandstone[500],\n turquoise: r.aqua[700],\n },\n landcover: {\n grassland: r.fern[200],\n barren: r.sandstone[200],\n urban_area: r.linen[100],\n farmland: r.sandstone[100],\n glacier: r.ink[25],\n scrub: r.fern[300],\n forest: r.jade[400],\n },\n };\n\n /**\n * `tropic` / `dark`. Teal-black land, the water a deep teal that still reads as colour against it, parks and\n * woods holding their green at the dark steps, coral highway and boundaries, cream labels.\n */\n const TROPIC_DARK: Recipe = {\n background: r.aqua[980],\n earth: r.aqua[950],\n water: r.aqua[700],\n parkA: r.jade[850],\n parkB: r.jade[800],\n woodA: r.jade[800],\n woodB: r.jade[700],\n scrubA: r.ink[900],\n scrubB: r.ink[850],\n sand: r.sandstone[500],\n beach: r.ink[900],\n glacier: r.ink[800],\n institutional: r.ink[900],\n pedestrian: r.aqua[900],\n aerodrome: r.ink[900],\n runway: r.ink[850],\n pier: r.aqua[600],\n buildings: r.ink[900],\n railway: r.ink[700],\n boundaries: r.coral[400],\n roads: {\n other: r.ink[850],\n otherCasing: r.aqua[980],\n minor: r.ink[800],\n minorCasing: r.aqua[980],\n service: r.ink[850],\n serviceCasing: r.aqua[980],\n major: r.ink[700],\n majorCasing: r.aqua[980],\n highway: r.coral[500],\n highwayCasing: r.aqua[980],\n link: r.coral[600],\n linkCasing: r.aqua[980],\n },\n tunnelFill: r.ink[900],\n tunnelCasing: r.aqua[980],\n bridgeCasing: r.aqua[980],\n labels: {\n city: r.linen[25],\n cityHalo: r.aqua[950],\n state: r.aqua[300],\n stateHalo: r.aqua[950],\n country: r.aqua[300],\n subplace: r.aqua[300],\n subplaceHalo: r.aqua[950],\n address: r.ink[400],\n addressHalo: r.aqua[950],\n roadMinor: r.ink[400],\n roadMinorHalo: r.aqua[950],\n roadMajor: r.linen[100],\n roadMajorHalo: r.aqua[950],\n ocean: r.aqua[200],\n },\n\n pois: {\n blue: r.wave[400],\n green: r.verdant[400],\n lapis: r.sky[400],\n pink: r.rose[400],\n red: r.rose[400],\n slategray: r.graphite[400],\n tangerine: r.sandstone[400],\n turquoise: r.aqua[400],\n },\n landcover: {\n grassland: r.ink[900],\n barren: r.sandstone[500],\n urban_area: r.aqua[950],\n farmland: r.ink[900],\n glacier: r.ink[800],\n scrub: r.ink[850],\n forest: r.jade[800],\n },\n };\n\n /**\n * `sunset` / `light`. After CARTO's *Sunset*: a warm duotone. Cream land (`linen`), peach vegetation\n * (`peach`, not green, on purpose), coral roads up the hierarchy, indigo water and indigo labels — the\n * one cool thing on the page, which is what makes the water read as water.\n */\n const SUNSET_LIGHT: Recipe = {\n background: r.linen[100],\n earth: r.linen[25],\n water: r.indigo[700],\n parkA: r.peach[100],\n parkB: r.peach[200],\n woodA: r.peach[200],\n woodB: r.peach[300],\n scrubA: r.linen[100],\n scrubB: r.peach[100],\n sand: r.peach[200],\n beach: r.peach[100],\n glacier: r.linen[25],\n institutional: r.linen[100],\n pedestrian: r.linen[50],\n aerodrome: r.linen[200],\n runway: r.linen[300],\n pier: r.indigo[300],\n buildings: r.linen[200],\n railway: r.linen[400],\n boundaries: r.indigo[600],\n roads: {\n other: \"#FFFFFF\",\n otherCasing: r.linen[200],\n minor: \"#FFFFFF\",\n minorCasing: r.linen[200],\n service: \"#FFFFFF\",\n serviceCasing: r.linen[200],\n major: \"#FFFFFF\",\n majorCasing: r.coral[300],\n highway: r.coral[500],\n highwayCasing: r.coral[700],\n link: r.coral[400],\n linkCasing: r.coral[600],\n },\n tunnelFill: r.linen[100],\n tunnelCasing: r.linen[200],\n bridgeCasing: r.linen[500],\n labels: {\n city: r.indigo[900],\n cityHalo: r.linen[25],\n state: r.indigo[800],\n stateHalo: r.linen[25],\n country: r.indigo[800],\n subplace: r.indigo[800],\n subplaceHalo: r.linen[25],\n address: r.linen[700],\n addressHalo: r.linen[25],\n roadMinor: r.linen[700],\n roadMinorHalo: r.linen[25],\n roadMajor: r.indigo[900],\n roadMajorHalo: r.linen[25],\n ocean: r.linen[25],\n },\n\n pois: {\n blue: r.wave[700],\n green: r.verdant[700],\n lapis: r.sky[700],\n pink: r.rose[600],\n red: r.rose[700],\n slategray: r.graphite[700],\n tangerine: r.sandstone[500],\n turquoise: r.aqua[700],\n },\n // A step lighter than the parks: the field tint sits under them at up to 0.6 opacity, and at\n // the parks' own steps it turned the whole city orange rather than cream with peach in it.\n landcover: {\n grassland: r.linen[100],\n barren: r.linen[200],\n urban_area: r.linen[50],\n farmland: r.peach[100],\n glacier: r.linen[25],\n scrub: r.linen[100],\n forest: r.peach[200],\n },\n };\n\n /**\n * `sunset` / `dark`. Dusk: an indigo field, water darker still, parks and woods a step lighter in the same\n * indigo, coral highway, peach boundaries and peach labels.\n */\n const SUNSET_DARK: Recipe = {\n background: r.indigo[950],\n earth: r.indigo[900],\n water: r.indigo[1000],\n parkA: r.indigo[850],\n parkB: r.indigo[800],\n woodA: r.indigo[850],\n woodB: r.indigo[800],\n scrubA: r.indigo[900],\n scrubB: r.indigo[850],\n sand: r.peach[800],\n beach: r.indigo[850],\n glacier: r.indigo[700],\n institutional: r.indigo[850],\n pedestrian: r.indigo[850],\n aerodrome: r.indigo[850],\n runway: r.indigo[800],\n pier: r.indigo[600],\n buildings: r.indigo[850],\n railway: r.indigo[700],\n boundaries: r.peach[300],\n roads: {\n other: r.indigo[800],\n otherCasing: r.indigo[950],\n minor: r.indigo[700],\n minorCasing: r.indigo[950],\n service: r.indigo[800],\n serviceCasing: r.indigo[950],\n major: r.indigo[600],\n majorCasing: r.indigo[950],\n highway: r.coral[500],\n highwayCasing: r.indigo[950],\n link: r.coral[600],\n linkCasing: r.indigo[950],\n },\n tunnelFill: r.indigo[850],\n tunnelCasing: r.indigo[950],\n bridgeCasing: r.indigo[950],\n labels: {\n city: r.peach[100],\n cityHalo: r.indigo[900],\n state: r.peach[300],\n stateHalo: r.indigo[900],\n country: r.peach[300],\n subplace: r.peach[300],\n subplaceHalo: r.indigo[900],\n address: r.indigo[400],\n addressHalo: r.indigo[900],\n roadMinor: r.indigo[400],\n roadMinorHalo: r.indigo[900],\n roadMajor: r.peach[100],\n roadMajorHalo: r.indigo[900],\n ocean: r.indigo[500],\n },\n\n pois: {\n blue: r.wave[400],\n green: r.verdant[400],\n lapis: r.sky[400],\n pink: r.rose[400],\n red: r.rose[400],\n slategray: r.graphite[400],\n tangerine: r.sandstone[400],\n turquoise: r.aqua[400],\n },\n landcover: {\n grassland: r.indigo[900],\n barren: r.peach[800],\n urban_area: r.indigo[900],\n farmland: r.indigo[850],\n glacier: r.indigo[700],\n scrub: r.indigo[850],\n forest: r.indigo[800],\n },\n };\n\n /**\n * `bold` / `light`. After CARTO's *Bold* and *Vivid*: the saturated street map. Warm paper land, a clear\n * blue water (`azure`), leaf-green parks (`fern`) and emerald woods (`jade`), an amber highway with an\n * orange casing, indigo boundaries, ink labels.\n */\n const BOLD_LIGHT: Recipe = {\n background: r.paper[100],\n // A step below `base`, which owns the lightest paper: two styles cannot share a land colour\n // (the /styles suite asserts twelve distinct earths), and the saturated water, parks and\n // amber highway read better off a ground that is a shade warmer than the default map's.\n earth: r.paper[50],\n water: r.azure[500],\n parkA: r.fern[300],\n parkB: r.fern[400],\n woodA: r.jade[500],\n woodB: r.jade[600],\n scrubA: r.fern[200],\n scrubB: r.fern[300],\n sand: r.sandstone[200],\n beach: r.sandstone[100],\n glacier: r.ink[25],\n institutional: r.paper[100],\n pedestrian: r.paper[50],\n aerodrome: r.paper[200],\n runway: r.paper[300],\n pier: r.azure[300],\n buildings: r.paper[200],\n railway: r.paper[400],\n boundaries: r.indigo[600],\n roads: {\n other: \"#FFFFFF\",\n otherCasing: r.paper[200],\n minor: \"#FFFFFF\",\n minorCasing: r.paper[200],\n service: \"#FFFFFF\",\n serviceCasing: r.paper[200],\n major: \"#FFFFFF\",\n majorCasing: r.paper[300],\n highway: r.amber[400],\n highwayCasing: r.amber[600],\n link: r.amber[300],\n linkCasing: r.amber[500],\n },\n tunnelFill: r.paper[100],\n tunnelCasing: r.paper[200],\n bridgeCasing: r.paper[500],\n labels: {\n city: r.ink[1000],\n cityHalo: r.paper[25],\n state: r.ink[700],\n stateHalo: r.paper[25],\n country: r.ink[700],\n subplace: r.ink[700],\n subplaceHalo: r.paper[25],\n address: r.ink[700],\n addressHalo: r.paper[25],\n roadMinor: r.ink[700],\n roadMinorHalo: r.paper[25],\n roadMajor: r.ink[800],\n roadMajorHalo: r.paper[25],\n ocean: r.azure[950],\n },\n\n pois: {\n blue: r.wave[700],\n green: r.verdant[700],\n lapis: r.sky[700],\n pink: r.rose[600],\n red: r.rose[700],\n slategray: r.graphite[700],\n tangerine: r.sandstone[500],\n turquoise: r.aqua[700],\n },\n landcover: {\n grassland: r.fern[200],\n barren: r.sandstone[200],\n urban_area: r.paper[100],\n farmland: r.sandstone[100],\n glacier: r.ink[25],\n scrub: r.fern[300],\n forest: r.jade[400],\n },\n };\n\n /**\n * `bold` / `dark`. Ink-black land, a deep blue water that keeps its hue, the greens at their dark steps,\n * amber highway, indigo boundaries, ink labels.\n */\n const BOLD_DARK: Recipe = {\n // A warm ground under cool detail. `outdoor` owns ink[950] and ink is packed below it here\n // (900 scrub and buildings, 850 runway), so the ground moves to paper, which is where this\n // style's light half already sits.\n background: r.paper[1000],\n earth: r.paper[950],\n water: r.azure[800],\n parkA: r.fern[800],\n parkB: r.fern[700],\n woodA: r.jade[850],\n woodB: r.jade[800],\n scrubA: r.ink[900],\n scrubB: r.ink[850],\n sand: r.sandstone[500],\n beach: r.ink[900],\n glacier: r.ink[800],\n institutional: r.ink[900],\n pedestrian: r.ink[900],\n aerodrome: r.ink[900],\n runway: r.ink[850],\n pier: r.azure[600],\n buildings: r.ink[900],\n railway: r.ink[700],\n boundaries: r.indigo[500],\n roads: {\n other: r.ink[850],\n otherCasing: r.ink[1000],\n minor: r.ink[800],\n minorCasing: r.ink[1000],\n service: r.ink[850],\n serviceCasing: r.ink[1000],\n major: r.ink[700],\n majorCasing: r.ink[1000],\n highway: r.amber[500],\n highwayCasing: r.ink[1000],\n link: r.amber[600],\n linkCasing: r.ink[1000],\n },\n tunnelFill: r.ink[900],\n tunnelCasing: r.ink[1000],\n bridgeCasing: r.ink[1000],\n labels: {\n city: r.ink[25],\n cityHalo: r.ink[950],\n state: r.ink[300],\n stateHalo: r.ink[950],\n country: r.ink[300],\n subplace: r.ink[300],\n subplaceHalo: r.ink[950],\n address: r.ink[400],\n addressHalo: r.ink[950],\n roadMinor: r.ink[400],\n roadMinorHalo: r.ink[950],\n roadMajor: r.ink[100],\n roadMajorHalo: r.ink[950],\n ocean: r.azure[300],\n },\n\n pois: {\n blue: r.wave[400],\n green: r.verdant[400],\n lapis: r.sky[400],\n pink: r.rose[400],\n red: r.rose[400],\n slategray: r.graphite[400],\n tangerine: r.sandstone[400],\n turquoise: r.aqua[400],\n },\n landcover: {\n grassland: r.ink[900],\n barren: r.sandstone[500],\n urban_area: r.ink[950],\n farmland: r.ink[900],\n glacier: r.ink[800],\n scrub: r.ink[850],\n forest: r.jade[850],\n },\n };\n\n /**\n * `pastel` / `light`. After CARTO's *Pastel*: lavender-white land (`lilac`), periwinkle water (`cobalt`),\n * mint parks (`jade`), soft leaf woods (`fern`), a salmon highway (`coral`), pale-yellow farmland\n * (`amber`), lavender buildings and boundaries, violet-grey labels.\n */\n const PASTEL_LIGHT: Recipe = {\n background: r.lilac[50],\n earth: r.lilac[25],\n water: r.cobalt[400],\n parkA: r.jade[300],\n parkB: r.jade[400],\n woodA: r.fern[300],\n woodB: r.fern[400],\n scrubA: r.jade[200],\n scrubB: r.jade[300],\n sand: r.sandstone[200],\n beach: r.sandstone[100],\n glacier: r.ink[25],\n institutional: r.lilac[100],\n pedestrian: r.lilac[50],\n aerodrome: r.lilac[200],\n runway: r.lilac[300],\n pier: r.cobalt[300],\n buildings: r.lilac[200],\n railway: r.lilac[400],\n boundaries: r.indigo[500],\n roads: {\n other: \"#FFFFFF\",\n otherCasing: r.lilac[200],\n minor: \"#FFFFFF\",\n minorCasing: r.lilac[200],\n service: \"#FFFFFF\",\n serviceCasing: r.lilac[200],\n major: \"#FFFFFF\",\n majorCasing: r.lilac[300],\n highway: r.coral[400],\n highwayCasing: r.coral[500],\n link: r.coral[300],\n linkCasing: r.coral[400],\n },\n tunnelFill: r.lilac[100],\n tunnelCasing: r.lilac[200],\n bridgeCasing: r.lilac[500],\n labels: {\n city: r.lilac[1000],\n cityHalo: r.lilac[25],\n state: r.lilac[700],\n stateHalo: r.lilac[25],\n country: r.lilac[700],\n subplace: r.lilac[700],\n subplaceHalo: r.lilac[25],\n address: r.lilac[700],\n addressHalo: r.lilac[25],\n roadMinor: r.lilac[700],\n roadMinorHalo: r.lilac[25],\n roadMajor: r.lilac[800],\n roadMajorHalo: r.lilac[25],\n ocean: r.cobalt[800],\n },\n\n pois: {\n blue: r.wave[700],\n green: r.verdant[700],\n lapis: r.sky[700],\n pink: r.rose[600],\n red: r.rose[700],\n slategray: r.graphite[700],\n tangerine: r.sandstone[500],\n turquoise: r.aqua[700],\n },\n landcover: {\n grassland: r.jade[200],\n barren: r.sandstone[200],\n urban_area: r.lilac[100],\n farmland: r.amber[200],\n glacier: r.ink[25],\n scrub: r.jade[300],\n forest: r.fern[400],\n },\n };\n\n /**\n * `pastel` / `dark`. The same pastels dimmed to dusk: deep lilac land, navy water, the greens at their\n * dark steps, the salmon highway kept, lavender labels.\n */\n const PASTEL_DARK: Recipe = {\n background: r.lilac[1000],\n earth: r.lilac[950],\n // Water lighter than land, which `blueprint`, `tropic` and `bold` already do: the three\n // styles whose water is the thing you remember about them. This one's is periwinkle, and at\n // cobalt[950] the dark half had turned it near-black, so the name stopped being true after\n // sundown. Lifting it also unpins the ground, which had to sit at `orchid`'s lilac[900]\n // because the only free step below was within 1.01:1 of that near-black water.\n water: r.cobalt[800],\n parkA: r.jade[850],\n parkB: r.jade[800],\n woodA: r.fern[800],\n woodB: r.fern[700],\n scrubA: r.lilac[850],\n scrubB: r.jade[850],\n sand: r.sandstone[500],\n beach: r.lilac[850],\n glacier: r.lilac[700],\n institutional: r.lilac[850],\n pedestrian: r.lilac[850],\n aerodrome: r.lilac[850],\n runway: r.lilac[800],\n pier: r.cobalt[600],\n buildings: r.lilac[850],\n railway: r.lilac[700],\n boundaries: r.indigo[400],\n roads: {\n other: r.lilac[800],\n otherCasing: r.lilac[1000],\n minor: r.lilac[700],\n minorCasing: r.lilac[1000],\n service: r.lilac[800],\n serviceCasing: r.lilac[1000],\n major: r.lilac[600],\n majorCasing: r.lilac[1000],\n highway: r.coral[400],\n highwayCasing: r.lilac[1000],\n link: r.coral[500],\n linkCasing: r.lilac[1000],\n },\n tunnelFill: r.lilac[850],\n tunnelCasing: r.lilac[1000],\n bridgeCasing: r.lilac[1000],\n labels: {\n city: r.lilac[25],\n cityHalo: r.lilac[950],\n state: r.lilac[300],\n stateHalo: r.lilac[950],\n country: r.lilac[300],\n subplace: r.lilac[300],\n subplaceHalo: r.lilac[950],\n address: r.lilac[400],\n addressHalo: r.lilac[950],\n roadMinor: r.lilac[400],\n roadMinorHalo: r.lilac[950],\n roadMajor: r.lilac[100],\n roadMajorHalo: r.lilac[950],\n ocean: r.cobalt[400],\n },\n\n pois: {\n blue: r.wave[400],\n green: r.verdant[400],\n lapis: r.sky[400],\n pink: r.rose[400],\n red: r.rose[400],\n slategray: r.graphite[400],\n tangerine: r.sandstone[400],\n turquoise: r.aqua[400],\n },\n landcover: {\n grassland: r.lilac[850],\n barren: r.sandstone[500],\n urban_area: r.lilac[900],\n farmland: r.lilac[850],\n glacier: r.lilac[700],\n scrub: r.lilac[850],\n forest: r.fern[800],\n },\n };\n\n /**\n * `winter` / `light`. Snow country: the land is near-white `ink`, so the winter landscape reads\n * as snow rather than as the absence of data, water is icy `azure`, and woods are a spruce\n * `jade` that stands dark against the snow the way a forest does from a chairlift. Roads are\n * white with cool casings and the highway is a cold `cobalt`, so nothing warm competes with the\n * ski overlay, whose difficulty colours (green, blue, black, orange) are the content here.\n * Labels keep `outdoor`'s contrast-safe `ink` steps.\n */\n const WINTER_LIGHT: Recipe = {\n background: r.ink[50],\n earth: r.ink[25],\n water: r.azure[300],\n parkA: r.jade[200],\n parkB: r.jade[300],\n woodA: r.jade[400],\n woodB: r.jade[500],\n scrubA: r.ink[100],\n scrubB: r.ink[200],\n sand: r.ink[100],\n beach: r.ink[100],\n glacier: r.ink[25],\n institutional: r.ink[50],\n pedestrian: r.ink[50],\n aerodrome: r.ink[100],\n runway: r.ink[300],\n pier: r.ink[300],\n buildings: r.ink[200],\n railway: r.ink[500],\n boundaries: r.cobalt[500],\n roads: {\n other: \"#FFFFFF\",\n otherCasing: r.ink[200],\n minor: \"#FFFFFF\",\n minorCasing: r.ink[200],\n service: \"#FFFFFF\",\n serviceCasing: r.ink[200],\n major: \"#FFFFFF\",\n majorCasing: r.ink[300],\n highway: r.cobalt[400],\n highwayCasing: r.cobalt[600],\n link: r.cobalt[300],\n linkCasing: r.cobalt[500],\n },\n tunnelFill: r.ink[100],\n tunnelCasing: r.ink[200],\n bridgeCasing: r.ink[400],\n labels: {\n city: r.ink[1000],\n cityHalo: r.ink[25],\n state: r.ink[700],\n stateHalo: r.ink[25],\n country: r.ink[700],\n subplace: r.ink[700],\n subplaceHalo: r.ink[25],\n address: r.ink[700],\n addressHalo: r.ink[25],\n roadMinor: r.ink[700],\n roadMinorHalo: r.ink[25],\n roadMajor: r.ink[800],\n roadMajorHalo: r.ink[25],\n ocean: r.azure[800],\n },\n\n pois: {\n blue: r.azure[700],\n green: r.jade[800],\n lapis: r.cobalt[700],\n pink: r.rose[700],\n red: r.rose[800],\n slategray: r.ink[700],\n tangerine: r.sandstone[500],\n turquoise: r.wave[700],\n },\n landcover: {\n // Snow covers the open ground, so grass, barren land and fields all go to the snow tones\n // and only the forest keeps colour.\n grassland: r.ink[100],\n barren: r.ink[100],\n urban_area: r.ink[100],\n farmland: r.ink[50],\n glacier: r.ink[25],\n scrub: r.ink[200],\n forest: r.jade[500],\n },\n };\n\n /**\n * `winter` / `dark`. Night skiing: `outdoor`'s dark `ink` ground, water a step darker still,\n * spruce lifted to the mid `jade` steps so the forest stays visible against the dark snow, and\n * the cobalt highway kept.\n */\n const WINTER_DARK: Recipe = {\n background: r.ink[1000],\n earth: r.ink[950],\n water: r.azure[980],\n parkA: r.jade[850],\n parkB: r.jade[800],\n woodA: r.jade[800],\n woodB: r.jade[700],\n scrubA: r.ink[900],\n scrubB: r.ink[850],\n sand: r.ink[850],\n beach: r.ink[850],\n glacier: r.ink[800],\n institutional: r.ink[1000],\n pedestrian: r.ink[950],\n aerodrome: r.ink[950],\n runway: r.ink[850],\n pier: r.ink[850],\n buildings: r.ink[900],\n railway: r.ink[700],\n boundaries: r.cobalt[400],\n roads: {\n other: r.ink[900],\n otherCasing: r.ink[1000],\n minor: r.ink[850],\n minorCasing: r.ink[1000],\n service: r.ink[900],\n serviceCasing: r.ink[1000],\n major: r.ink[700],\n majorCasing: r.ink[1000],\n highway: r.cobalt[600],\n highwayCasing: r.ink[1000],\n link: r.cobalt[700],\n linkCasing: r.ink[1000],\n },\n tunnelFill: r.ink[900],\n tunnelCasing: r.ink[1000],\n bridgeCasing: r.ink[1000],\n labels: {\n city: r.ink[100],\n cityHalo: r.ink[1000],\n state: r.ink[500],\n stateHalo: r.ink[1000],\n country: r.ink[500],\n subplace: r.ink[500],\n subplaceHalo: r.ink[1000],\n address: r.ink[500],\n addressHalo: r.ink[1000],\n roadMinor: r.ink[500],\n roadMinorHalo: r.ink[1000],\n roadMajor: r.ink[400],\n roadMajorHalo: r.ink[1000],\n ocean: r.azure[400],\n },\n\n pois: {\n blue: r.azure[300],\n green: r.jade[300],\n lapis: r.cobalt[300],\n pink: r.rose[300],\n red: r.rose[400],\n slategray: r.ink[500],\n tangerine: r.sandstone[300],\n turquoise: r.wave[400],\n },\n landcover: {\n grassland: r.ink[900],\n barren: r.ink[900],\n urban_area: r.ink[950],\n farmland: r.ink[900],\n glacier: r.ink[800],\n scrub: r.ink[850],\n forest: r.jade[700],\n },\n };\n\n // Adapt Bay Atlas's two traditional maps to the Protomaps schema. Shared recipes keep\n // custom themes working; the gateway supplies their typography and relief treatments.\n const traditional = (swiss: boolean, mode: ThemeMode): Recipe => {\n const light = mode === \"light\";\n const land = swiss ? r.swissPaper : r.atlasPaper;\n const water = swiss ? r.swissWater : r.atlasWater;\n const green = swiss ? r.swissGreen : r.atlasGreen;\n const stock = light ? BASE_LIGHT : BASE_DARK;\n const halo = light ? land[25] : land[1000];\n const highway = swiss ? r.swissRoad[400] : (light ? r.atlasRoad[600] : r.atlasRoad[400]);\n const casing = light ? (swiss ? r.swissRoad[800] : r.atlasRoad[800]) : land[1000];\n return {\n ...stock,\n background: light ? land[25] : land[1000],\n earth: light ? land[25] : land[900],\n water: light ? water[200] : water[980],\n parkA: light ? green[100] : green[800],\n parkB: light ? green[200] : green[700],\n woodA: light ? green[200] : green[800],\n woodB: light ? green[300] : green[700],\n scrubA: light ? green[100] : green[900],\n scrubB: light ? green[200] : green[800],\n institutional: light ? land[100] : land[950],\n pedestrian: light ? land[25] : land[950],\n buildings: light ? land[200] : land[700],\n railway: swiss ? r.swissRoad[600] : land[700],\n boundaries: light ? r.lilac[600] : r.lilac[400],\n roads: {\n other: light ? land[500] : land[700],\n otherCasing: light ? land[700] : land[1000],\n minor: light ? \"#FFFFFF\" : land[500],\n minorCasing: light ? land[700] : land[1000],\n service: light ? land[25] : land[700],\n serviceCasing: light ? land[500] : land[1000],\n major: swiss ? r.swissRoad[500] : (light ? r.atlasRoad[500] : r.atlasRoad[300]),\n majorCasing: casing,\n highway,\n highwayCasing: casing,\n link: highway,\n linkCasing: casing,\n },\n tunnelFill: light ? land[100] : land[950],\n tunnelCasing: light ? land[500] : land[1000],\n bridgeCasing: casing,\n labels: {\n city: light ? land[900] : land[25], cityHalo: halo,\n state: light ? land[700] : land[500], stateHalo: halo,\n country: light ? land[700] : land[500],\n subplace: light ? land[700] : land[500], subplaceHalo: halo,\n address: light ? land[700] : land[500], addressHalo: halo,\n roadMinor: light ? land[800] : land[500], roadMinorHalo: halo,\n roadMajor: light ? land[900] : land[200], roadMajorHalo: halo,\n ocean: light ? water[700] : water[400],\n },\n pois: { ...stock.pois!, green: light ? green[700] : green[300], blue: light ? water[700] : water[400] },\n landcover: {\n grassland: light ? green[100] : green[900],\n barren: light ? land[200] : land[700],\n urban_area: light ? land[100] : land[950],\n farmland: light ? land[25] : land[950],\n glacier: light ? water[200] : water[950],\n scrub: light ? green[100] : green[900],\n forest: light ? green[200] : green[800],\n },\n };\n };\n\n return {\n base: { light: BASE_LIGHT, dark: BASE_DARK },\n muted: { light: MUTED_LIGHT, dark: MUTED_DARK },\n outdoor: { light: OUTDOOR_LIGHT, dark: OUTDOOR_DARK },\n blueprint: { light: BLUEPRINT_LIGHT, dark: BLUEPRINT_DARK },\n blush: { light: BLUSH_LIGHT, dark: BLUSH_DARK },\n orchid: { light: ORCHID_LIGHT, dark: ORCHID_DARK },\n canopy: { light: CANOPY_LIGHT, dark: CANOPY_DARK },\n lagoon: { light: LAGOON_LIGHT, dark: LAGOON_DARK },\n tropic: { light: TROPIC_LIGHT, dark: TROPIC_DARK },\n sunset: { light: SUNSET_LIGHT, dark: SUNSET_DARK },\n bold: { light: BOLD_LIGHT, dark: BOLD_DARK },\n pastel: { light: PASTEL_LIGHT, dark: PASTEL_DARK },\n atlas: { light: traditional(false, \"light\"), dark: traditional(false, \"dark\") },\n swiss: { light: traditional(true, \"light\"), dark: traditional(true, \"dark\") },\n winter: { light: WINTER_LIGHT, dark: WINTER_DARK },\n };\n}\n\nexport const RECIPES: Record<\n ThemeBase,\n Record<ThemeMode, Recipe>\n> = buildRecipes(STOCK_RAMPS);\n","import type { Recipe, ThemeBase } from \"./recipe\";\n\n/**\n * The unmap theme document: one theme, both modes, data only.\n *\n * A theme is colours, bounded numbers and one enum — never URLs, never expressions, never\n * arbitrary style JSON. That is a security boundary, not a modelling choice: theme documents\n * arrive on public query strings and are composed into style JSON the gateway signs its own\n * asset URLs into. `validateTheme` is the only door in.\n *\n * `base` names the style (one of the shipped styles); each half carries only sparse overrides\n * on that style, so presets are near-empty documents and codes stay short.\n */\n\n// NonNullable before the object test: optional Recipe fields (pois, landcover on the upstream\n// Flavor type) are `X | undefined`, and a union never `extends object`, so without it those\n// two would demand complete objects instead of partial ones.\nexport type DeepPartial<T> = {\n [K in keyof T]?: NonNullable<T[K]> extends object ? DeepPartial<NonNullable<T[K]>> : T[K];\n};\n\nexport type BasemapOverrides = DeepPartial<Recipe>;\n\nexport interface MarkerTheme {\n /** Pin colour, #RRGGBB or #RRGGBBAA. */\n color?: string;\n /** Pin scale, 0.5–2. */\n scale?: number;\n}\n\nexport interface RouteTheme {\n /** Main stroke colour. */\n color?: string;\n /** Main stroke width in px, 1–12. */\n width?: number;\n /** Main stroke opacity, 0–1. */\n opacity?: number;\n /** Under-stroke (casing) colour. */\n casingColor?: string;\n /** Casing width in px, 0–24. 0 disables the casing. */\n casingWidth?: number;\n /** Casing opacity, 0–1. */\n casingOpacity?: number;\n}\n\nexport interface ThemeHalf {\n basemap?: BasemapOverrides;\n marker?: MarkerTheme;\n route?: RouteTheme;\n}\n\n/**\n * The simple-mode seed colours a generated theme was built from. Carried on the document so a\n * shared code reopens the builder in simple mode with the seeds intact; the gateway validates\n * them like any other field and otherwise ignores them — composition reads only the halves.\n */\nexport interface ThemeSeeds {\n /** Neutral cast: land, buildings, roads, labels. */\n land: string;\n water: string;\n /** Vegetation: parks, wood, scrub, forest landcover. */\n nature: string;\n /** Marker + route accent. Defaults to the interface magenta. */\n accent?: string;\n}\n\n/**\n * The major layer groups a theme can hide or reorder, in their stock bottom-to-top draw order.\n * Every layer the cartography draws belongs to exactly one of these (see `layerGroupOf`) except\n * the background, which always stays underneath. `buildings3d` is the one group that is off by\n * default: it draws building extrusions from the tiles' `height` property on top of the roads.\n *\n * Append only, like `THEME_BASES`: the names are on the wire in every `ut1.` code.\n */\nexport const LAYER_GROUPS = [\n \"land\",\n \"water\",\n \"buildings\",\n \"roads\",\n \"boundaries\",\n \"buildings3d\",\n \"labels\",\n] as const;\nexport type LayerGroup = (typeof LAYER_GROUPS)[number];\n\n/**\n * Structural overrides on the layer groups. Doc-level, not per half: which layers draw, and in\n * what order, is one decision for both modes — colour is the only thing that differs between\n * light and dark. Sparse like the halves: an absent field means stock.\n */\nexport interface ThemeLayers {\n /**\n * Per-group visibility; a missing key means the group's default (every group on except\n * `buildings3d`). Hidden groups are dropped from the style entirely.\n */\n visible?: Partial<Record<LayerGroup, boolean>>;\n /**\n * Bottom-to-top draw order, always the full set of groups exactly once. Absent means the\n * stock cartography order, in which the groups interleave (tunnels under buildings, bridges\n * over boundaries); an explicit order regroups every layer under its group.\n */\n order?: LayerGroup[];\n}\n\nexport interface ThemeDoc {\n v: 1;\n /** Display name, ≤ 40 chars. */\n name?: string;\n base: ThemeBase;\n seeds?: ThemeSeeds;\n layers?: ThemeLayers;\n light?: ThemeHalf;\n dark?: ThemeHalf;\n}\n","import { THEME_BASES, isThemeBase } from \"./recipe\";\nimport { RECIPES } from \"./recipes\";\nimport { LAYER_GROUPS, type LayerGroup, type ThemeDoc } from \"./doc\";\n\n/**\n * Validation failure. `detail` lists every bad path in one throw — collect-then-throw, so a\n * builder user fixing a hand-edited document sees all of it at once rather than one field per\n * round trip (the same reporting philosophy as the cartography contrast tests).\n */\nexport class ThemeError extends Error {\n readonly detail: string[];\n constructor(message: string, detail: string[]) {\n super(message);\n this.name = \"ThemeError\";\n this.detail = detail;\n }\n}\n\n/** 6- or 8-digit hex only. Hex-by-grammar is what makes \"no URLs, no expressions\" a property. */\nconst HEX = /^#[0-9a-fA-F]{6}([0-9a-fA-F]{2})?$/;\n\nconst MAX_NAME_LENGTH = 40;\n\n/** [min, max] bounds per numeric field. */\nconst MARKER_BOUNDS: Record<string, readonly [number, number]> = {\n scale: [0.5, 2],\n};\nconst ROUTE_BOUNDS: Record<string, readonly [number, number]> = {\n width: [1, 12],\n opacity: [0, 1],\n casingWidth: [0, 24],\n casingOpacity: [0, 1],\n};\n\nconst isRecord = (v: unknown): v is Record<string, unknown> =>\n typeof v === \"object\" && v !== null && !Array.isArray(v);\n\n/**\n * Validate a basemap override object against the Recipe shape, using a real recipe as the\n * schema: a key is legal iff it exists on the reference, objects recurse, strings must be hex.\n * The data is the schema, so the validator can never drift from what `mergeRecipe` accepts.\n */\nfunction walkBasemap(value: unknown, reference: unknown, path: string, errors: string[]): void {\n if (!isRecord(value)) {\n errors.push(`${path}: must be an object`);\n return;\n }\n const ref = reference as Record<string, unknown>;\n for (const [key, v] of Object.entries(value)) {\n const target = ref[key];\n const p = `${path}.${key}`;\n if (target === undefined) {\n errors.push(`${p}: unknown field`);\n } else if (typeof target === \"string\") {\n if (typeof v !== \"string\" || !HEX.test(v)) {\n errors.push(`${p}: must be a hex colour (#RRGGBB or #RRGGBBAA)`);\n }\n } else {\n walkBasemap(v, target, p, errors);\n }\n }\n}\n\n/** Validate a flat colour+number leaf object (marker/route) against a bounds table. */\nfunction walkLeaf(\n value: unknown,\n colorKeys: readonly string[],\n bounds: Record<string, readonly [number, number]>,\n path: string,\n errors: string[],\n): void {\n if (!isRecord(value)) {\n errors.push(`${path}: must be an object`);\n return;\n }\n for (const [key, v] of Object.entries(value)) {\n const p = `${path}.${key}`;\n if (colorKeys.includes(key)) {\n if (typeof v !== \"string\" || !HEX.test(v)) {\n errors.push(`${p}: must be a hex colour (#RRGGBB or #RRGGBBAA)`);\n }\n } else if (key in bounds) {\n const [lo, hi] = bounds[key]!;\n if (typeof v !== \"number\" || !Number.isFinite(v) || v < lo || v > hi) {\n errors.push(`${p}: out of bounds (${lo}–${hi})`);\n }\n } else {\n errors.push(`${p}: unknown field`);\n }\n }\n}\n\nconst HALF_KEYS = [\"basemap\", \"marker\", \"route\"] as const;\nconst DOC_KEYS = [\"v\", \"name\", \"base\", \"seeds\", \"layers\", \"light\", \"dark\"] as const;\nconst LAYERS_KEYS = [\"visible\", \"order\"] as const;\n\nconst isLayerGroup = (v: unknown): v is LayerGroup =>\n typeof v === \"string\" && (LAYER_GROUPS as readonly string[]).includes(v);\n\n/**\n * Validate the structural `layers` field: `visible` maps known groups to booleans, `order` is\n * the full set of groups exactly once. Both are enums by grammar, so like the colours they can\n * never carry a layer id, a filter, or anything else the style would execute.\n */\nfunction walkLayers(value: unknown, errors: string[]): void {\n if (!isRecord(value)) {\n errors.push(\"layers: must be an object\");\n return;\n }\n for (const key of Object.keys(value)) {\n if (!(LAYERS_KEYS as readonly string[]).includes(key)) errors.push(`layers.${key}: unknown field`);\n }\n if (value.visible !== undefined) {\n if (!isRecord(value.visible)) {\n errors.push(\"layers.visible: must be an object\");\n } else {\n for (const [group, v] of Object.entries(value.visible)) {\n if (!isLayerGroup(group)) errors.push(`layers.visible.${group}: unknown layer group`);\n else if (typeof v !== \"boolean\") errors.push(`layers.visible.${group}: must be a boolean`);\n }\n }\n }\n if (value.order !== undefined) {\n const order = value.order;\n if (!Array.isArray(order)) {\n errors.push(\"layers.order: must be an array\");\n } else {\n order.forEach((g, i) => {\n if (!isLayerGroup(g)) errors.push(`layers.order[${i}]: unknown layer group`);\n });\n const known = order.filter(isLayerGroup);\n if (new Set(known).size !== known.length || known.length !== LAYER_GROUPS.length) {\n errors.push(`layers.order: must list each of ${LAYER_GROUPS.join(\", \")} exactly once`);\n }\n }\n }\n}\nconst SEED_COLOR_KEYS = [\"land\", \"water\", \"nature\", \"accent\"] as const;\nconst REQUIRED_SEED_KEYS = [\"land\", \"water\", \"nature\"] as const;\n\n/**\n * Validate an untrusted value as a ThemeDoc. Returns the (unchanged) document on success;\n * throws a `ThemeError` naming every invalid path otherwise. Unknown fields anywhere are\n * errors — a theme is data only, and the reject-unknown posture is what keeps it that way.\n */\nexport function validateTheme(input: unknown): ThemeDoc {\n const errors: string[] = [];\n if (!isRecord(input)) {\n throw new ThemeError(\"invalid theme\", [\"theme must be a JSON object\"]);\n }\n\n for (const key of Object.keys(input)) {\n if (!(DOC_KEYS as readonly string[]).includes(key)) errors.push(`${key}: unknown field`);\n }\n\n if (input.v !== 1) errors.push(\"v: must be 1\");\n if (!isThemeBase(input.base)) {\n errors.push(`base: must be one of ${THEME_BASES.join(\", \")}`);\n }\n if (input.name !== undefined) {\n if (typeof input.name !== \"string\" || input.name.length > MAX_NAME_LENGTH) {\n errors.push(`name: must be a string of at most ${MAX_NAME_LENGTH} characters`);\n }\n }\n\n if (input.seeds !== undefined) {\n walkLeaf(input.seeds, SEED_COLOR_KEYS, {}, \"seeds\", errors);\n if (isRecord(input.seeds)) {\n for (const key of REQUIRED_SEED_KEYS) {\n if (input.seeds[key] === undefined) errors.push(`seeds.${key}: required`);\n }\n }\n }\n\n if (input.layers !== undefined) walkLayers(input.layers, errors);\n\n // Any complete recipe works as the schema reference; base.light is as good as any.\n const reference = RECIPES.base.light;\n\n for (const mode of [\"light\", \"dark\"] as const) {\n const half = input[mode];\n if (half === undefined) continue;\n if (!isRecord(half)) {\n errors.push(`${mode}: must be an object`);\n continue;\n }\n for (const key of Object.keys(half)) {\n if (!(HALF_KEYS as readonly string[]).includes(key)) {\n errors.push(`${mode}.${key}: unknown field`);\n }\n }\n if (half.basemap !== undefined) walkBasemap(half.basemap, reference, `${mode}.basemap`, errors);\n if (half.marker !== undefined) {\n walkLeaf(half.marker, [\"color\"], MARKER_BOUNDS, `${mode}.marker`, errors);\n }\n if (half.route !== undefined) {\n walkLeaf(half.route, [\"color\", \"casingColor\"], ROUTE_BOUNDS, `${mode}.route`, errors);\n }\n }\n\n if (errors.length > 0) throw new ThemeError(\"invalid theme\", errors);\n return input as unknown as ThemeDoc;\n}\n","import type { ThemeDoc } from \"./doc\";\nimport type { ThemeBase } from \"./recipe\";\n\n/**\n * The shipped styles as starting-point themes: zero overrides, so each is guaranteed identical\n * to the style it names, served at `/styles/<style>.json` (asserted in the gateway theme tests).\n * The builder opens on these.\n *\n * Named after the style itself — `base`, `muted`, `outdoor`, `blueprint`, `blush`, … — the same word the homepage, the\n * SDK's `style` option and the gateway URL use. The theme presets (`process ink`, `boreal`, …)\n * are a separate set layered on a style; a style never borrows one's name.\n */\nexport const STYLE_THEMES: Record<ThemeBase, ThemeDoc> = {\n base: { v: 1, name: \"base\", base: \"base\" },\n muted: { v: 1, name: \"muted\", base: \"muted\" },\n outdoor: { v: 1, name: \"outdoor\", base: \"outdoor\" },\n blueprint: { v: 1, name: \"blueprint\", base: \"blueprint\" },\n blush: { v: 1, name: \"blush\", base: \"blush\" },\n orchid: { v: 1, name: \"orchid\", base: \"orchid\" },\n canopy: { v: 1, name: \"canopy\", base: \"canopy\" },\n lagoon: { v: 1, name: \"lagoon\", base: \"lagoon\" },\n tropic: { v: 1, name: \"tropic\", base: \"tropic\" },\n sunset: { v: 1, name: \"sunset\", base: \"sunset\" },\n bold: { v: 1, name: \"bold\", base: \"bold\" },\n pastel: { v: 1, name: \"pastel\", base: \"pastel\" },\n atlas: { v: 1, name: \"atlas\", base: \"atlas\" },\n swiss: { v: 1, name: \"swiss\", base: \"swiss\" },\n winter: { v: 1, name: \"winter\", base: \"winter\" },\n};\n","/**\n * Minimal sRGB ↔ OKLCH conversion (Björn Ottosson's OKLab constants), plus a chroma-reducing\n * gamut map. Zero dependencies — the generator is the only consumer and needs exactly this.\n *\n * OKLCH is the working space for the same reason the hand-built ramps in `palette.ts` were\n * generated in it: perceived lightness is carried almost entirely by L, so a generator can swap\n * hue and chroma while *preserving a ramp's lightness ladder* — which is where the label\n * contrast the cartography tests enforce actually lives.\n */\n\nexport interface Oklch {\n /** Perceptual lightness, 0–1. */\n l: number;\n /** Chroma, 0 upward (~0.37 max for sRGB). */\n c: number;\n /** Hue in degrees, 0–360. */\n h: number;\n}\n\nconst srgbToLinear = (v: number) => (v <= 0.04045 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4);\nconst linearToSrgb = (v: number) =>\n v <= 0.0031308 ? 12.92 * v : 1.055 * v ** (1 / 2.4) - 0.055;\n\nfunction hexToRgb(hex: string): [number, number, number] {\n const h = hex.replace(\"#\", \"\");\n return [\n parseInt(h.slice(0, 2), 16) / 255,\n parseInt(h.slice(2, 4), 16) / 255,\n parseInt(h.slice(4, 6), 16) / 255,\n ];\n}\n\n/** Parse #RRGGBB (or #RRGGBBAA — alpha ignored) into OKLCH. */\nexport function hexToOklch(hex: string): Oklch {\n const [r, g, b] = hexToRgb(hex).map(srgbToLinear) as [number, number, number];\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\n const L = 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s;\n const a = 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s;\n const bb = 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s;\n const c = Math.hypot(a, bb);\n let h = (Math.atan2(bb, a) * 180) / Math.PI;\n if (h < 0) h += 360;\n return { l: L, c, h };\n}\n\n/** OKLCH → linear sRGB triple (possibly out of gamut). */\nfunction oklchToLinear({ l: L, c, h }: Oklch): [number, number, number] {\n const hr = (h * Math.PI) / 180;\n const a = c * Math.cos(hr);\n const bb = c * Math.sin(hr);\n const l = (L + 0.3963377774 * a + 0.2158037573 * bb) ** 3;\n const m = (L - 0.1055613458 * a - 0.0638541728 * bb) ** 3;\n const s = (L - 0.0894841775 * a - 1.291485548 * bb) ** 3;\n return [\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,\n ];\n}\n\nconst inGamut = (rgb: [number, number, number]) =>\n rgb.every((v) => v >= -1e-6 && v <= 1 + 1e-6);\n\n/**\n * OKLCH → #RRGGBB. Out-of-gamut colours are mapped by *reducing chroma* at constant L and h\n * (bisection), never by clipping channels — clipping shifts perceived lightness, and the whole\n * generator contract is that L is preserved.\n */\nexport function oklchToHex(color: Oklch): string {\n let { c } = color;\n let rgb = oklchToLinear({ ...color, c });\n if (!inGamut(rgb)) {\n let lo = 0;\n let hi = c;\n for (let i = 0; i < 24; i++) {\n c = (lo + hi) / 2;\n rgb = oklchToLinear({ ...color, c });\n if (inGamut(rgb)) lo = c;\n else hi = c;\n }\n rgb = oklchToLinear({ ...color, c: lo });\n }\n const to255 = (v: number) => Math.round(Math.min(1, Math.max(0, linearToSrgb(v))) * 255);\n return (\n \"#\" +\n rgb\n .map((v) => to255(v).toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toUpperCase()\n );\n}\n","import type { Flavor } from \"@protomaps/basemaps\";\nimport { makeFlavor, type Recipe, type ThemeBase, type ThemeMode } from \"./recipe\";\nimport { RECIPES } from \"./recipes\";\nimport type { BasemapOverrides, MarkerTheme, RouteTheme, ThemeDoc } from \"./doc\";\n\n/**\n * Platform drawing defaults for the two client-side overlays a theme styles. These are exactly\n * the convention the unmap.dev hero has always drawn: a magenta pin, and a route as a solid\n * line over a wide translucent casing so it stays legible on light and dark cartography alike.\n */\nexport const DEFAULT_MARKER: Required<MarkerTheme> = { color: \"#FF3E9A\", scale: 1 };\nexport const DEFAULT_ROUTE: Required<RouteTheme> = {\n color: \"#FF3E9A\",\n width: 3,\n opacity: 1,\n casingColor: \"#FF3E9A\",\n casingWidth: 10,\n casingOpacity: 0.2,\n};\n\nexport interface ResolvedTheme {\n /** `<base>-<mode>`, the flavour name — what selects sprites and terrain behaviour. */\n flavorName: `${ThemeBase}-${ThemeMode}`;\n flavor: Flavor;\n marker: Required<MarkerTheme>;\n route: Required<RouteTheme>;\n}\n\n/**\n * Merge sparse overrides onto a base recipe, walking the base's own shape. Composing from the\n * base's keys (never spreading the override object) means an unexpected key cannot ride along\n * even if a caller skipped validation — defence in depth behind `validateTheme`.\n */\nexport function mergeRecipe(base: Recipe, overrides?: BasemapOverrides): Recipe {\n if (!overrides) return structuredClone(base);\n const walk = (ref: Record<string, unknown>, over: Record<string, unknown>) => {\n const out: Record<string, unknown> = {};\n for (const [key, refValue] of Object.entries(ref)) {\n const o = over[key];\n if (refValue !== null && typeof refValue === \"object\") {\n out[key] =\n o !== null && typeof o === \"object\" && !Array.isArray(o)\n ? walk(refValue as Record<string, unknown>, o as Record<string, unknown>)\n : structuredClone(refValue);\n } else {\n out[key] = typeof o === \"string\" ? o : refValue;\n }\n }\n return out;\n };\n return walk(\n base as unknown as Record<string, unknown>,\n overrides as Record<string, unknown>,\n ) as unknown as Recipe;\n}\n\n/**\n * Resolve one half of a theme into everything a renderer needs: the expanded Flavor, the\n * flavour name, and marker/route styles with defaults filled in.\n */\nexport function resolveTheme(doc: ThemeDoc, mode: ThemeMode): ResolvedTheme {\n const half = doc[mode] ?? {};\n const recipe = mergeRecipe(RECIPES[doc.base][mode], half.basemap);\n return {\n flavorName: `${doc.base}-${mode}`,\n flavor: makeFlavor(recipe),\n marker: { ...DEFAULT_MARKER, ...half.marker },\n route: { ...DEFAULT_ROUTE, ...half.route },\n };\n}\n","import type { Flavor } from \"@protomaps/basemaps\";\nimport { MODES, type ThemeMode } from \"./recipe\";\nimport type { ThemeDoc } from \"./doc\";\nimport { resolveTheme } from \"./compose\";\n\n/**\n * Label-contrast checks for theme documents — the same WCAG maths and label/background pairs\n * `apps/gateway/test/cartography.test.ts` enforces on unmap's own flavors, exported as a\n * library so the builder can warn live.\n *\n * Warn, not reject: the gateway holds its own flavors to these floors, but a custom theme is\n * the customer's canvas. The builder surfaces every breach; shipping one anyway is a choice.\n */\n\nfunction parseHex(hex: string): [number, number, number] {\n const h = hex.replace(\"#\", \"\");\n return [\n parseInt(h.slice(0, 2), 16),\n parseInt(h.slice(2, 4), 16),\n parseInt(h.slice(4, 6), 16),\n ];\n}\n\nfunction luminance(hex: string): number {\n const toLinear = (v: number) => {\n const c = v / 255;\n return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n };\n const [r, g, b] = parseHex(hex);\n return 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n}\n\n/** WCAG contrast ratio between two hex colours (1–21). */\nexport function contrast(a: string, b: string): number {\n const la = luminance(a);\n const lb = luminance(b);\n const [hi, lo] = la > lb ? [la, lb] : [lb, la];\n return (hi + 0.05) / (lo + 0.05);\n}\n\n/**\n * Halo colour is the effective background wherever a halo is set, because that is what the\n * glyph actually sits on. Where there is no halo slot (country labels), the label sits on the\n * land; ocean labels sit on water.\n */\nconst PRIMARY: Array<[keyof Flavor, keyof Flavor]> = [\n [\"city_label\", \"city_label_halo\"],\n [\"state_label\", \"state_label_halo\"],\n [\"country_label\", \"earth\"],\n [\"roads_label_major\", \"roads_label_major_halo\"],\n];\n\nconst SECONDARY: Array<[keyof Flavor, keyof Flavor]> = [\n [\"subplace_label\", \"subplace_label_halo\"],\n [\"address_label\", \"address_label_halo\"],\n [\"roads_label_minor\", \"roads_label_minor_halo\"],\n [\"ocean_label\", \"water\"],\n];\n\n/** Every enforced pair with its floor — the generator's contrast-clamp iterates these. */\nexport const LABEL_PAIRS: Array<[keyof Flavor, keyof Flavor, number]> = [\n ...PRIMARY.map(([l, b]) => [l, b, 4.5] as [keyof Flavor, keyof Flavor, number]),\n ...SECONDARY.map(([l, b]) => [l, b, 3] as [keyof Flavor, keyof Flavor, number]),\n];\n\nexport interface ContrastWarning {\n mode: ThemeMode;\n /** The Flavor label slot that breaches, e.g. \"city_label\". */\n label: string;\n /** The Flavor slot it was checked against, e.g. \"city_label_halo\". */\n background: string;\n ratio: number;\n /** 4.5 for primary labels, 3 for secondary. */\n floor: number;\n}\n\n/** Every label-contrast breach in the theme, across both modes. Empty means clean. */\nexport function contrastWarnings(doc: ThemeDoc): ContrastWarning[] {\n const warnings: ContrastWarning[] = [];\n for (const mode of MODES) {\n const flavor = resolveTheme(doc, mode).flavor as unknown as Record<string, string>;\n const check = (pairs: Array<[keyof Flavor, keyof Flavor]>, floor: number) => {\n for (const [label, background] of pairs) {\n const ratio = contrast(flavor[label as string]!, flavor[background as string]!);\n if (ratio < floor) {\n warnings.push({ mode, label: String(label), background: String(background), ratio, floor });\n }\n }\n };\n check(PRIMARY, 4.5);\n check(SECONDARY, 3);\n }\n return warnings;\n}\n","import { hexToOklch, oklchToHex } from \"./oklch\";\nimport { buildRecipes, RECIPES, STOCK_RAMPS, type RampSet } from \"./recipes\";\nimport { makeFlavor, MODES, type Recipe, type ThemeBase } from \"./recipe\";\nimport type { BasemapOverrides, ThemeDoc, ThemeSeeds } from \"./doc\";\nimport { contrast, LABEL_PAIRS } from \"./contrast\";\n\n/**\n * The simple-mode generator: three seed colours in, a full light + dark theme out.\n *\n * The trick is the one the hand-built ramps were made with. Each stock ramp is a *lightness\n * ladder* — its steps were solved so the label-contrast floors hold — and hue/chroma merely\n * carry identity. So the generator keeps every step's OKLCH lightness exactly, swaps in the\n * seed's hue, scales chroma to the seed's vividness, and rebuilds the recipes through the same\n * `buildRecipes` factory the shipped cartography uses. Casing/tunnel/bridge coherence and the\n * figure/ground relationships come along for free; the seeds only ever recolour.\n *\n * The output is a plain, valid ThemeDoc (sparse overrides + the seeds themselves), so nothing\n * downstream — codec, gateway, SDK — knows generation exists.\n */\n\n/** Neutrals must stay a cast, not a colour, or the whole map shouts. */\nconst NEUTRAL_CHROMA_CAP = 0.045;\n/** `muted` exists to vanish under data; its cast cap is a whisper of the normal one. */\nconst MUTED_CHROMA_CAP = 0.012;\n/** Ceiling for chromatic families (water, vegetation) before gamut mapping. */\nconst CHROMA_CAP = 0.32;\n/** Below this mid-step chroma a ramp is greyscale and is re-hued from the seed directly. */\nconst NEUTRAL_RAMP_CHROMA = 0.005;\n\n/** The seeds that reproduce (approximately) the stock cartography. Simple mode opens on these. */\nexport const DEFAULT_SEEDS: Required<ThemeSeeds> = {\n land: STOCK_RAMPS.ink[500],\n water: STOCK_RAMPS.wave[500],\n nature: STOCK_RAMPS.verdant[500],\n accent: \"#FF3E9A\",\n};\n\ntype Ramp = Record<string | number, string>;\n\n/**\n * Re-emit a ramp in the seed's hue: every step keeps its stock lightness, chroma scales by the\n * seed's vividness relative to the ramp's own mid-step, clamped to `cap`.\n */\nfunction reRamp<T extends Ramp>(ref: T, seedHex: string, cap: number): T {\n const seed = hexToOklch(seedHex);\n const steps = Object.keys(ref);\n const midStep = steps[Math.floor(steps.length / 2)]!;\n const midChroma = hexToOklch(ref[midStep]!).c;\n // A greyscale ramp (`graphite`, `mist`) has no chroma to scale, so it takes the seed's\n // chroma outright at every step; the cap still decides how much of it survives.\n const neutral = midChroma < NEUTRAL_RAMP_CHROMA;\n const factor = Math.min(Math.max(seed.c / Math.max(midChroma, 0.005), 0.15), 3);\n const out: Ramp = {};\n for (const step of steps) {\n const refColor = hexToOklch(ref[step]!);\n out[step] = oklchToHex({\n l: refColor.l,\n c: Math.min(neutral ? seed.c : refColor.c * factor, cap),\n h: seed.h,\n });\n }\n return out as T;\n}\n\n/**\n * Enforce the label floors on a generated flavor's recipe. Lightness is preserved from the\n * stock ladders, which pass with margin, but WCAG contrast is computed in sRGB luminance and a\n * strong hue shift can erode that margin — so each breaching label slot has its OKLCH lightness\n * nudged away from its background until the pair clears. Bounded and deterministic.\n */\nfunction enforceLabelContrast(recipe: Recipe): Recipe {\n const fixed = structuredClone(recipe);\n for (const [labelSlot, bgSlot, floor] of LABEL_PAIRS) {\n for (let i = 0; i < 40; i++) {\n const flavor = makeFlavor(fixed) as unknown as Record<string, string>;\n const label = flavor[labelSlot as string]!;\n const bg = flavor[bgSlot as string]!;\n if (contrast(label, bg) >= floor) break;\n const l = hexToOklch(label);\n const direction = hexToOklch(bg).l > l.l ? -1 : 1;\n const nudged = oklchToHex({\n ...l,\n l: Math.min(1, Math.max(0, l.l + direction * 0.015)),\n });\n setLabelSlot(fixed, labelSlot as string, nudged);\n }\n }\n return fixed;\n}\n\n/** Map a Flavor label slot back to its Recipe field. Only slots LABEL_PAIRS can name. */\nconst LABEL_SLOT_TO_RECIPE: Record<string, (r: Recipe, hex: string) => void> = {\n city_label: (r, v) => (r.labels.city = v),\n state_label: (r, v) => (r.labels.state = v),\n country_label: (r, v) => (r.labels.country = v),\n roads_label_major: (r, v) => (r.labels.roadMajor = v),\n subplace_label: (r, v) => (r.labels.subplace = v),\n address_label: (r, v) => (r.labels.address = v),\n roads_label_minor: (r, v) => (r.labels.roadMinor = v),\n ocean_label: (r, v) => (r.labels.ocean = v),\n};\n\nfunction setLabelSlot(recipe: Recipe, slot: string, hex: string): void {\n LABEL_SLOT_TO_RECIPE[slot]?.(recipe, hex);\n}\n\n/** Diff a generated recipe against the stock one into sparse overrides. */\nfunction diffRecipe(\n stock: Recipe,\n generated: Recipe,\n): BasemapOverrides | undefined {\n const walk = (a: Record<string, unknown>, b: Record<string, unknown>) => {\n const out: Record<string, unknown> = {};\n for (const [key, stockValue] of Object.entries(a)) {\n const genValue = b[key];\n if (stockValue !== null && typeof stockValue === \"object\") {\n const nested = walk(\n stockValue as Record<string, unknown>,\n (genValue ?? {}) as Record<string, unknown>,\n );\n if (Object.keys(nested).length > 0) out[key] = nested;\n } else if (typeof genValue === \"string\" && genValue !== stockValue) {\n out[key] = genValue;\n }\n }\n return out;\n };\n const diff = walk(\n stock as unknown as Record<string, unknown>,\n generated as unknown as Record<string, unknown>,\n );\n return Object.keys(diff).length > 0 ? (diff as BasemapOverrides) : undefined;\n}\n\n/**\n * Generate a full theme from seed colours. Deterministic; the result always clears the label\n * floors in both modes (enforced, and asserted by the hue-sweep test).\n *\n * Family mapping: `land` recolours the land spines — `ink`, `base`'s `paper`, `muted`'s\n * `graphite` at a whisper of chroma (that style exists to vanish under data), and the\n * single-hue family of `blueprint` (`cobalt`) at full chroma (and `jade`, which `orchid`, `tropic`, `bold` and `pastel` draw their greens from), so a\n * seed can carry them to any hue, plus `blush`'s `rose`, `orchid`'s `lilac`, the cream `linen` of\n * `tropic` and `sunset`, and `sunset`'s `indigo`. `nature` recolours `verdant`, `sunset`'s `peach`\n * and the teal `aqua` of `orchid` and `lagoon`. `water` recolours the wave, sky, azure and mist ramps (`mist` is\n * greyscale in stock `muted` and takes the water seed's hue outright), and the water fill of\n * every style whatever ramp it is drawn from, `nature` the verdant ramp. Warm landcover (sandstone), the highway ramps (ember, coral, amber), POI accents and white road fills stay stock: they\n * are tuned relationships, not identity. `accent` styles the marker and route overlays only —\n * it never enters the basemap, same rule as the brand magenta.\n */\nexport function generateTheme(base: ThemeBase, seeds: ThemeSeeds): ThemeDoc {\n const ramps: RampSet = {\n ...STOCK_RAMPS,\n atlasPaper: reRamp(STOCK_RAMPS.atlasPaper, seeds.land, NEUTRAL_CHROMA_CAP),\n atlasWater: reRamp(STOCK_RAMPS.atlasWater, seeds.water, CHROMA_CAP),\n atlasGreen: reRamp(STOCK_RAMPS.atlasGreen, seeds.nature, CHROMA_CAP),\n swissPaper: reRamp(STOCK_RAMPS.swissPaper, seeds.land, NEUTRAL_CHROMA_CAP),\n swissWater: reRamp(STOCK_RAMPS.swissWater, seeds.water, CHROMA_CAP),\n swissGreen: reRamp(STOCK_RAMPS.swissGreen, seeds.nature, CHROMA_CAP),\n\n ink: reRamp(STOCK_RAMPS.ink, seeds.land, NEUTRAL_CHROMA_CAP),\n paper: reRamp(STOCK_RAMPS.paper, seeds.land, NEUTRAL_CHROMA_CAP),\n graphite: reRamp(STOCK_RAMPS.graphite, seeds.land, MUTED_CHROMA_CAP),\n jade: reRamp(STOCK_RAMPS.jade, seeds.land, CHROMA_CAP),\n cobalt: reRamp(STOCK_RAMPS.cobalt, seeds.land, CHROMA_CAP),\n rose: reRamp(STOCK_RAMPS.rose, seeds.land, CHROMA_CAP),\n lilac: reRamp(STOCK_RAMPS.lilac, seeds.land, NEUTRAL_CHROMA_CAP),\n linen: reRamp(STOCK_RAMPS.linen, seeds.land, NEUTRAL_CHROMA_CAP),\n indigo: reRamp(STOCK_RAMPS.indigo, seeds.land, CHROMA_CAP),\n aqua: reRamp(STOCK_RAMPS.aqua, seeds.nature, CHROMA_CAP),\n wave: reRamp(STOCK_RAMPS.wave, seeds.water, CHROMA_CAP),\n sky: reRamp(STOCK_RAMPS.sky, seeds.water, CHROMA_CAP),\n mist: reRamp(STOCK_RAMPS.mist, seeds.water, CHROMA_CAP),\n azure: reRamp(STOCK_RAMPS.azure, seeds.water, CHROMA_CAP),\n verdant: reRamp(STOCK_RAMPS.verdant, seeds.nature, CHROMA_CAP),\n peach: reRamp(STOCK_RAMPS.peach, seeds.nature, CHROMA_CAP),\n };\n const generated = buildRecipes(ramps);\n // Several styles draw their water from a land, nature or highway ramp (`blueprint`, `canopy`\n // and `pastel` from `cobalt`, `blush` from `ember` and `rose`, `sunset` from `indigo`, `tropic`\n // from `aqua`), which the mapping above recolours with the wrong seed or not at all. So build\n // once more with every ramp in the water seed's hue and take only the water fill from it: each\n // style keeps the step it chose, and the water seed reaches every style's water. Styles already\n // on a water ramp get exactly what they got before.\n const watered = buildRecipes(\n Object.fromEntries(\n Object.entries(STOCK_RAMPS).map(([name, ramp]) => [name, reRamp(ramp, seeds.water, CHROMA_CAP)]),\n ) as unknown as RampSet,\n );\n\n const doc: ThemeDoc = { v: 1, base, seeds: { ...seeds } };\n for (const mode of MODES) {\n const recipe = enforceLabelContrast({ ...generated[base][mode], water: watered[base][mode].water });\n const basemap = diffRecipe(RECIPES[base][mode], recipe);\n const half: NonNullable<ThemeDoc[\"light\"]> = {};\n if (basemap) half.basemap = basemap;\n if (seeds.accent) {\n half.marker = { color: seeds.accent };\n half.route = { color: seeds.accent, casingColor: seeds.accent };\n }\n if (Object.keys(half).length > 0) doc[mode] = half;\n }\n return doc;\n}\n","import { oklchToHex } from \"./oklch\";\nimport type { ThemeSeeds } from \"./doc\";\nimport { DEFAULT_SEEDS } from \"./generate\";\n\n/**\n * The named theme presets of the builder's simple mode — the hand-picked starting points, named\n * for Canadian landscapes. Each is just a seed trio + accent; `generateTheme` does the rest,\n * and its contrast guarantee holds for these like any other seeds (asserted in tests).\n */\nexport interface ThemePreset {\n /** Display name, lowercase like the style names. Not translated — these are names. */\n name: string;\n seeds: Required<ThemeSeeds>;\n}\n\nexport const THEME_PRESETS: ThemePreset[] = [\n { name: \"process ink\", seeds: DEFAULT_SEEDS },\n {\n name: \"boreal\",\n seeds: { land: \"#7D8B87\", water: \"#33606B\", nature: \"#3F6B4F\", accent: \"#E4572E\" },\n },\n {\n name: \"prairie\",\n seeds: { land: \"#A08D6B\", water: \"#4E7E99\", nature: \"#7C8A4D\", accent: \"#C33149\" },\n },\n {\n name: \"tundra\",\n seeds: { land: \"#8B9AA6\", water: \"#4A7BA6\", nature: \"#6E8B74\", accent: \"#FF3E9A\" },\n },\n {\n name: \"badlands\",\n seeds: { land: \"#A67B5B\", water: \"#3E7C8F\", nature: \"#6B7F53\", accent: \"#22577A\" },\n },\n {\n name: \"aurora\",\n seeds: { land: \"#8C86A3\", water: \"#4F6D9E\", nature: \"#56828A\", accent: \"#58E1C1\" },\n },\n {\n name: \"pacific\",\n seeds: { land: \"#7F9089\", water: \"#2E7D74\", nature: \"#38755B\", accent: \"#F25F5C\" },\n },\n {\n name: \"chinook\",\n seeds: { land: \"#9C8A5D\", water: \"#56789C\", nature: \"#8A9A5B\", accent: \"#D95D39\" },\n },\n // The seven below (2026-09-09) are deliberately unlike one another and unlike the landscapes\n // above: each is one idea pushed to the edge of what the generator allows. Land is capped at a\n // cast, so the idea lives in the water and nature seeds, which can go to full chroma.\n //\n // Fifteen is the ceiling for a three-character code: the preset index sits above bit 8, and\n // index 15 pushes every style past 62² (`preset.ts`). A sixteenth preset still works, at four\n // characters, but `preset.test.ts` holds the curated set to three.\n {\n // Lava for water, scorched olive for nature, warm ash land, a sulphur accent.\n name: \"magma\",\n seeds: { land: \"#8A7A72\", water: \"#D6461A\", nature: \"#5C5A32\", accent: \"#FFC61A\" },\n },\n {\n // Electric cyan water, acid-green nature, a violet cast on the land, hot-pink accent.\n name: \"neon\",\n seeds: { land: \"#7C78A0\", water: \"#00D5F2\", nature: \"#8CE800\", accent: \"#FF2E9E\" },\n },\n {\n // Bubblegum water, turquoise nature, a pink cast, a lemon accent.\n name: \"candy\",\n seeds: { land: \"#A3808E\", water: \"#FF6FB5\", nature: \"#2ED1C2\", accent: \"#FFD400\" },\n },\n {\n // Deep violet water, plum nature, violet land, a lime accent.\n name: \"ultraviolet\",\n seeds: { land: \"#7A6E9E\", water: \"#5A2ECC\", nature: \"#9B4DCA\", accent: \"#C8FF3A\" },\n },\n {\n // No chroma anywhere but the accent: a greyscale map with one red.\n name: \"noir\",\n seeds: { land: \"#808080\", water: \"#6E6E6E\", nature: \"#707070\", accent: \"#E10600\" },\n },\n {\n // Brown everything: a walnut cast, tea-coloured water, ochre nature, oxblood accent.\n name: \"sepia\",\n seeds: { land: \"#8B7355\", water: \"#8C6A42\", nature: \"#A48A4A\", accent: \"#7A1F1F\" },\n },\n {\n // Ultramarine water, navy-teal nature, a blue cast on the land, a coral accent.\n name: \"ultramarine\",\n seeds: { land: \"#6F7A9C\", water: \"#1F3BFF\", nature: \"#215E7A\", accent: \"#FF6A4D\" },\n },\n {\n // The larch that turns gold across the boreal every autumn, and the one Canadian landscape\n // colour the set was missing: `nature` is a green in all fifteen before it (hues 74 to 199),\n // so foliage had only ever meant summer. The cold violet accent is the complement of that\n // gold and the only occupant of the 210-to-320 band.\n //\n // Sixteenth, and the first to cost four characters: a preset code packs its index above the\n // style slot, and index 15 clears what two base62 digits hold. See `preset.ts`.\n name: \"tamarack\",\n seeds: { land: \"#A59A8A\", water: \"#4C6A78\", nature: \"#C4881F\", accent: \"#6D4AFF\" },\n },\n];\n\n/** Wrap a hue into [0, 360). */\nconst wrap = (h: number) => ((h % 360) + 360) % 360;\n\n/**\n * A random but *harmonic* seed trio — the shuffle button. Hues are related (water lands\n * cool-of-complementary, nature analogous-of-triadic, the accent opposes the land) and chroma\n * stays inside a tasteful band, so shuffles read as designed rather than random; the\n * generator's contrast guarantee makes every one of them legible regardless.\n *\n * `rng` is injectable (returns [0,1)) so tests can drive it deterministically.\n */\nexport function shuffleSeeds(rng: () => number = Math.random): Required<ThemeSeeds> {\n const h = rng() * 360;\n return {\n land: oklchToHex({ l: 0.55, c: 0.03 + rng() * 0.05, h }),\n water: oklchToHex({ l: 0.5, c: 0.08 + rng() * 0.1, h: wrap(h + 150 + rng() * 60) }),\n nature: oklchToHex({ l: 0.5, c: 0.06 + rng() * 0.08, h: wrap(h + 60 + rng() * 80) }),\n accent: oklchToHex({ l: 0.65, c: 0.22 + rng() * 0.08, h: wrap(h + 170 + rng() * 40) }),\n };\n}\n","import { LAYER_GROUPS, type LayerGroup, type ThemeLayers } from \"./doc\";\n\n/**\n * Layer groups: the structural half of a theme. A theme can hide any of the seven major groups\n * and redraw them in another order, the way kepler.gl's base-map panel does. This module owns\n * the mapping from the expanded Protomaps layer list onto those groups and applies a document's\n * `layers` field to a style's layer array.\n *\n * It works on the expanded layers rather than the Flavor because the groups are about what\n * draws, not what colour it draws in — the Recipe stays the colour surface, this is the only\n * structural one, and both are still data (booleans and one enum list on the wire).\n */\n\n/** Stock visibility: every group draws except the extrusions, which are opt-in. */\nexport const DEFAULT_LAYER_VISIBILITY: Readonly<Record<LayerGroup, boolean>> = {\n land: true,\n water: true,\n buildings: true,\n roads: true,\n boundaries: true,\n buildings3d: false,\n labels: true,\n};\n\n/** The id of the synthetic extrusion layer `buildings3d` draws. */\nexport const BUILDINGS_3D_LAYER_ID = \"buildings_3d\";\n\n/** Airport surfaces are lines in the roads source-layer but read as ground, not as roads. */\nconst LAND_LINES = new Set([\"roads_runway\", \"roads_taxiway\"]);\n\n/**\n * Which group an expanded Protomaps layer belongs to, or `null` for the background, which is\n * never hidden or moved: with land off it is what you see. Symbol layers are labels regardless\n * of their source, so the POI icons, shields and one-way arrows hide with the text.\n *\n * The contract test asserts every stock layer lands in a group, so an upstream layer this\n * cannot place fails loudly rather than becoming an unmovable, unhideable stray.\n */\nexport function layerGroupOf(layer: { id: string; type: string }): LayerGroup | null {\n const { id, type } = layer;\n if (type === \"symbol\") return \"labels\";\n if (id === \"background\") return null;\n if (id === BUILDINGS_3D_LAYER_ID) return \"buildings3d\";\n if (id === \"buildings\") return \"buildings\";\n if (id.startsWith(\"water\")) return \"water\";\n if (id.startsWith(\"boundaries\")) return \"boundaries\";\n if (LAND_LINES.has(id)) return \"land\";\n if (id.startsWith(\"roads\")) return \"roads\";\n if (id === \"earth\" || id === \"landcover\" || id.startsWith(\"landuse\")) return \"land\";\n return null;\n}\n\n/** Whether a group draws under this `layers` field (absent field means stock). */\nexport function isLayerVisible(layers: ThemeLayers | undefined, group: LayerGroup): boolean {\n return layers?.visible?.[group] ?? DEFAULT_LAYER_VISIBILITY[group];\n}\n\n/** The bottom-to-top group order this `layers` field asks for; stock when it names none. */\nexport function effectiveLayerOrder(layers: ThemeLayers | undefined): readonly LayerGroup[] {\n return layers?.order ?? LAYER_GROUPS;\n}\n\n/** True when `order` is the stock order (or absent), so nothing needs regrouping. */\nexport function isStockLayerOrder(order: readonly LayerGroup[] | undefined): boolean {\n return !order || (order.length === LAYER_GROUPS.length && order.every((g, i) => g === LAYER_GROUPS[i]));\n}\n\n/** True when the field changes nothing — the builder strips such a field back to absent. */\nexport function isStockLayers(layers: ThemeLayers | undefined): boolean {\n if (!layers) return true;\n if (!isStockLayerOrder(layers.order)) return false;\n return LAYER_GROUPS.every((g) => isLayerVisible(layers, g) === DEFAULT_LAYER_VISIBILITY[g]);\n}\n\n/**\n * The extrusion layer `buildings3d` draws: every building from the tiles' `height` (metres,\n * from OSM `height` / `building:levels`) and `min_height`, with a two-storey stand-in for the\n * ones that carry neither so a downtown does not come up as a field of flat slabs beside\n * towers. Colour is the theme's `buildings` slot; opacity stays a touch under solid so the\n * roads under an overhang still read.\n */\nfunction buildings3dLayer(source: string, color: string) {\n return {\n id: BUILDINGS_3D_LAYER_ID,\n type: \"fill-extrusion\",\n source,\n \"source-layer\": \"buildings\",\n minzoom: 13,\n filter: [\"in\", \"kind\", \"building\", \"building_part\"],\n paint: {\n \"fill-extrusion-color\": color,\n \"fill-extrusion-height\": [\"coalesce\", [\"get\", \"height\"], 6],\n \"fill-extrusion-base\": [\"coalesce\", [\"get\", \"min_height\"], 0],\n \"fill-extrusion-opacity\": 0.85,\n },\n };\n}\n\n/**\n * Apply a theme's `layers` field to an expanded style layer array. Returns the input untouched\n * when the field changes nothing, so a zero-override theme stays byte-identical to its flavor.\n *\n * Hidden groups are removed outright rather than set to `visibility: none` — a smaller style,\n * and nothing left for a client to accidentally switch back on. With the stock order the\n * remaining layers keep their stock positions (and the extrusions, if on, slot in just under\n * the labels). With a custom order every group's layers are gathered under it, in stock\n * relative order within the group; the background and any layer outside every group stay\n * first, in their stock order.\n *\n * `buildingsColor` paints the extrusions: the resolved theme's `buildings` slot.\n */\nexport function applyThemeLayers<T extends { id: string; type: string }>(\n styleLayers: T[],\n layers: ThemeLayers | undefined,\n buildingsColor: string,\n): T[] {\n if (isStockLayers(layers)) return styleLayers;\n\n const visible = (g: LayerGroup) => isLayerVisible(layers, g);\n const tagged = styleLayers.map((layer) => ({ layer, group: layerGroupOf(layer) }));\n const source =\n (styleLayers.find((l) => l.id === \"buildings\") as { source?: string } | undefined)?.source ??\n \"unmap\";\n const extrusion = visible(\"buildings3d\")\n ? (buildings3dLayer(source, buildingsColor) as unknown as T)\n : null;\n\n if (isStockLayerOrder(layers?.order)) {\n const kept = tagged.filter(({ group }) => group === null || visible(group)).map((t) => t.layer);\n if (!extrusion) return kept;\n const firstLabel = kept.findIndex((l) => layerGroupOf(l) === \"labels\");\n const at = firstLabel === -1 ? kept.length : firstLabel;\n return [...kept.slice(0, at), extrusion, ...kept.slice(at)];\n }\n\n const out: T[] = tagged.filter(({ group }) => group === null).map((t) => t.layer);\n for (const group of effectiveLayerOrder(layers)) {\n if (!visible(group)) continue;\n if (group === \"buildings3d\") {\n if (extrusion) out.push(extrusion);\n continue;\n }\n for (const t of tagged) if (t.group === group) out.push(t.layer);\n }\n return out;\n}\n","import { ThemeError } from \"./validate\";\nimport { isThemeBase, type ThemeBase } from \"./recipe\";\nimport { STYLE_THEMES } from \"./presets\";\nimport { THEME_PRESETS } from \"./palettes\";\nimport { DEFAULT_SEEDS, generateTheme } from \"./generate\";\nimport { LAYER_GROUPS, type LayerGroup, type ThemeDoc, type ThemeLayers, type ThemeSeeds } from \"./doc\";\nimport { DEFAULT_LAYER_VISIBILITY, isStockLayerOrder, isStockLayers } from \"./layers\";\n\n/**\n * Short preset codes, the same idea as shadcn's `b0` / `a2r6bw`: a base62 packing of\n * enumerated choices that starts at three characters and grows only when the theme leaves the\n * curated set.\n *\n * u00 … u0E the style slots, in lineup order (`u03` is a tombstone and does not decode)\n * u0W, u4e, … a named theme preset on a style (three characters for the first fifteen\n * presets; `tamarack`, the sixteenth, is the first to take four)\n * six to eight a style or preset with layer groups hidden or reordered\n * up to 23 custom seed colours (4× RGB) on any style, layers included\n *\n * Advanced overrides — anything `generateTheme` would not emit — still use the `ut1.` deflate\n * document. `ut1.` is checked first on decode so the two forms never collide.\n *\n * Layout, low bits first, of the number the base62 digits spell:\n *\n * bits 0–4 style slot (`STYLE_SLOTS`; 32 styles)\n * bits 5–6 kind: 0 bare style, 1 named preset, 2 custom seeds (3 unassigned)\n * bit 7 layers flag\n * bits 8… kind payload: preset → 8-bit preset index; custom → 4 × 24-bit RGB seeds\n * then if the flag is set, 7 visibility bits (one per `LAYER_GROUPS` entry) followed\n * by a 13-bit Lehmer index of the draw order (0 = stock order)\n *\n * Anything left above the last field is an error, so a truncated or padded code fails rather\n * than decoding to a theme nobody asked for. Both lookup tables only grow at the end and never\n * reuse a position: the index is bit-packed into every code, so removing an entry would\n * renumber every code after it. A retired entry stays as a `null` tombstone that fails to\n * decode. (The layout itself was re-cut on 2026-09-07.)\n */\n\nexport const PRESET_CODE_PREFIX = \"u\";\nexport const PRESET_CODE_RE = /^u[0-9A-Za-z]{2,24}$/;\n\nconst BASE62 = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\nconst SEED_KEYS = [\"land\", \"water\", \"nature\", \"accent\"] as const;\n\n/** Style per slot. Grow at the end only; a retired style is a `null` tombstone, never removed. */\nconst STYLE_SLOTS: readonly (ThemeBase | null)[] = [\n \"base\",\n \"muted\",\n \"outdoor\",\n null, // u03, retired 2026-09-09\n \"blueprint\",\n \"blush\",\n \"orchid\",\n \"canopy\",\n \"lagoon\",\n \"tropic\",\n \"sunset\",\n \"bold\",\n \"pastel\",\n \"atlas\",\n \"swiss\",\n \"winter\",\n];\n\nconst STYLE_BITS = 5n;\nconst KIND_BITS = 2n;\nconst KIND_BARE = 0n;\nconst KIND_PRESET = 1n;\nconst KIND_CUSTOM = 2n;\nconst PRESET_INDEX_BITS = 8n;\nconst RGB_BITS = 24n;\nconst VISIBILITY_BITS = BigInt(LAYER_GROUPS.length); // 7\nconst ORDER_BITS = 13n; // 7! = 5040 < 2^13\nconst ORDER_COUNT = factorial(LAYER_GROUPS.length);\n\nconst mask = (bits: bigint) => (1n << bits) - 1n;\nconst sameHex = (a: string, b: string) => a.toLowerCase() === b.toLowerCase();\n\nfunction factorial(n: number): bigint {\n let f = 1n;\n for (let i = 2n; i <= BigInt(n); i++) f *= i;\n return f;\n}\n\nexport function isThemePresetCode(code: string): boolean {\n return PRESET_CODE_RE.test(code);\n}\n\n/** Registry key for a preset name: `process ink` → `processInk`. */\nexport function presetId(name: string): string {\n return name.replace(/\\s+([a-zA-Z])/g, (_, c: string) => c.toUpperCase()).replace(/\\s/g, \"\");\n}\n\nfunction toBase62(n: bigint, min = 2): string {\n if (n === 0n) return \"0\".repeat(min);\n let s = \"\";\n let x = n;\n while (x > 0n) {\n s = BASE62[Number(x % 62n)] + s;\n x /= 62n;\n }\n return s.padStart(min, \"0\");\n}\n\nfunction fromBase62(s: string): bigint {\n let n = 0n;\n for (const ch of s) {\n const i = BASE62.indexOf(ch);\n if (i < 0) {\n throw new ThemeError(\"invalid theme\", [\"code is not a valid preset\"]);\n }\n n = n * 62n + BigInt(i);\n }\n return n;\n}\n\nfunction rgb24(hex: string): bigint {\n return BigInt(parseInt(hex.replace(\"#\", \"\").slice(0, 6), 16));\n}\n\nfunction fromRgb24(n: bigint): string {\n return `#${n.toString(16).toUpperCase().padStart(6, \"0\")}`;\n}\n\n/** A bare style: no seeds, no overrides in either half. */\nfunction isBareStyle(doc: ThemeDoc): boolean {\n return doc.seeds === undefined && doc.light === undefined && doc.dark === undefined;\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (a && b && typeof a === \"object\") {\n const ak = Object.keys(a as object).sort();\n const bk = Object.keys(b as object).sort();\n return ak.length === bk.length && ak.every((k, i) => k === bk[i] && deepEqual((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]));\n }\n return false;\n}\n\nfunction seedsMatch(a: ThemeSeeds, b: ThemeSeeds): boolean {\n return SEED_KEYS.every((k) => {\n const left = a[k];\n const right = b[k];\n if (left === undefined && right === undefined) return true;\n if (typeof left !== \"string\" || typeof right !== \"string\") return left === right;\n return sameHex(left, right);\n });\n}\n\nfunction generatedMatch(doc: ThemeDoc): boolean {\n if (!doc.seeds) return false;\n const generated = generateTheme(doc.base, doc.seeds);\n return (\n generated.base === doc.base &&\n seedsMatch(generated.seeds!, doc.seeds) &&\n deepEqual(generated.light, doc.light) &&\n deepEqual(generated.dark, doc.dark)\n );\n}\n\nfunction findPresetIndex(seeds: ThemeSeeds): number {\n return THEME_PRESETS.findIndex((p) => seedsMatch(p.seeds, { ...DEFAULT_SEEDS, ...seeds }));\n}\n\n/* ---- layers: 7 visibility bits + a Lehmer index of the order ---- */\n\n/** Lehmer index of a permutation of `LAYER_GROUPS` (0 for the stock order). */\nfunction orderIndex(order: readonly LayerGroup[]): bigint {\n const remaining: LayerGroup[] = [...LAYER_GROUPS];\n let index = 0n;\n let radix = factorial(remaining.length);\n for (const group of order) {\n const at = remaining.indexOf(group);\n radix /= BigInt(remaining.length);\n index += BigInt(at) * radix;\n remaining.splice(at, 1);\n }\n return index;\n}\n\n/** The permutation of `LAYER_GROUPS` with this Lehmer index. */\nfunction orderAt(index: bigint): LayerGroup[] {\n const remaining: LayerGroup[] = [...LAYER_GROUPS];\n const order: LayerGroup[] = [];\n let rest = index;\n let radix = factorial(remaining.length);\n while (remaining.length > 0) {\n radix /= BigInt(remaining.length);\n const at = Number(rest / radix);\n rest %= radix;\n order.push(remaining.splice(at, 1)[0]!);\n }\n return order;\n}\n\nfunction packLayers(layers: ThemeLayers): bigint {\n let bits = 0n;\n LAYER_GROUPS.forEach((group, i) => {\n const visible = layers.visible?.[group] ?? DEFAULT_LAYER_VISIBILITY[group];\n if (visible) bits |= 1n << BigInt(i);\n });\n const order = isStockLayerOrder(layers.order) ? 0n : orderIndex(layers.order!);\n return bits | (order << VISIBILITY_BITS);\n}\n\n/** Expand packed layer bits to the sparse field the builder would have written. */\nfunction unpackLayers(bits: bigint): ThemeLayers {\n const layers: ThemeLayers = {};\n const visible: NonNullable<ThemeLayers[\"visible\"]> = {};\n LAYER_GROUPS.forEach((group, i) => {\n const on = ((bits >> BigInt(i)) & 1n) === 1n;\n if (on !== DEFAULT_LAYER_VISIBILITY[group]) visible[group] = on;\n });\n if (Object.keys(visible).length > 0) layers.visible = visible;\n const order = bits >> VISIBILITY_BITS;\n if (order >= ORDER_COUNT) {\n throw new ThemeError(\"invalid theme\", [\"preset layer order is out of range\"]);\n }\n if (order !== 0n) layers.order = orderAt(order);\n return layers;\n}\n\n/* ---- encode ---- */\n\n/**\n * Pack a theme into a short preset code, or `null` when the document is not one of the\n * representable shapes (caller falls back to `ut1.`).\n */\nexport function encodePreset(doc: ThemeDoc): string | null {\n const slot = isThemeBase(doc.base) ? STYLE_SLOTS.indexOf(doc.base) : -1;\n if (slot < 0) return null;\n\n let kind: bigint;\n let payload = 0n;\n let payloadBits = 0n;\n if (isBareStyle(doc)) {\n kind = KIND_BARE;\n } else {\n if (!doc.seeds || !generatedMatch(doc)) return null;\n const presetIndex = findPresetIndex(doc.seeds);\n if (presetIndex >= 0 && presetIndex < Number(mask(PRESET_INDEX_BITS))) {\n kind = KIND_PRESET;\n payload = BigInt(presetIndex);\n payloadBits = PRESET_INDEX_BITS;\n } else {\n if (!doc.seeds.accent) return null;\n kind = KIND_CUSTOM;\n const filled: Required<ThemeSeeds> = { ...DEFAULT_SEEDS, ...doc.seeds };\n for (const key of SEED_KEYS) {\n payload |= rgb24(filled[key]) << payloadBits;\n payloadBits += RGB_BITS;\n }\n }\n }\n\n const hasLayers = !isStockLayers(doc.layers);\n let bits = BigInt(slot) | (kind << STYLE_BITS) | ((hasLayers ? 1n : 0n) << (STYLE_BITS + KIND_BITS));\n let shift = STYLE_BITS + KIND_BITS + 1n;\n bits |= payload << shift;\n shift += payloadBits;\n if (hasLayers) bits |= packLayers(doc.layers!) << shift;\n return PRESET_CODE_PREFIX + toBase62(bits);\n}\n\n/* ---- decode ---- */\n\n/** Expand a short preset code to a validated ThemeDoc. Throws `ThemeError`. */\nexport function decodePreset(code: string): ThemeDoc {\n if (!isThemePresetCode(code)) {\n throw new ThemeError(\"invalid theme\", [\"code is not a valid preset\"]);\n }\n let rest = fromBase62(code.slice(PRESET_CODE_PREFIX.length));\n const take = (bits: bigint): bigint => {\n const value = rest & mask(bits);\n rest >>= bits;\n return value;\n };\n\n const slot = Number(take(STYLE_BITS));\n const base = STYLE_SLOTS[slot];\n if (base === undefined) throw new ThemeError(\"invalid theme\", [\"preset style is out of range\"]);\n if (base === null) throw new ThemeError(\"invalid theme\", [`preset style slot ${slot} is retired`]);\n const kind = take(KIND_BITS);\n const hasLayers = take(1n) === 1n;\n\n let doc: ThemeDoc;\n if (kind === KIND_BARE) {\n doc = structuredClone(STYLE_THEMES[base]);\n } else if (kind === KIND_PRESET) {\n const preset = THEME_PRESETS[Number(take(PRESET_INDEX_BITS))];\n if (!preset) throw new ThemeError(\"invalid theme\", [\"preset is out of range\"]);\n doc = generateTheme(base, preset.seeds);\n } else if (kind === KIND_CUSTOM) {\n const seeds: Required<ThemeSeeds> = { ...DEFAULT_SEEDS };\n for (const key of SEED_KEYS) seeds[key] = fromRgb24(take(RGB_BITS));\n doc = generateTheme(base, seeds);\n } else {\n throw new ThemeError(\"invalid theme\", [\"preset kind is unassigned\"]);\n }\n\n if (hasLayers) doc.layers = unpackLayers(take(VISIBILITY_BITS + ORDER_BITS));\n if (rest !== 0n) {\n throw new ThemeError(\"invalid theme\", [\"preset payload has unused bits\"]);\n }\n return doc;\n}\n\n/**\n * Registry key for a curated preset (`base`, `processInk`, `boreal`, …), or `undefined` when\n * the theme is a custom code that is not one of the named `MAP_THEMES` entries (named presets\n * are published on the `base` style only).\n */\nexport function registryThemeKey(doc: ThemeDoc): string | undefined {\n if (isBareStyle(doc)) return STYLE_THEMES[doc.base]?.name;\n if (!doc.seeds || doc.base !== \"base\" || !generatedMatch(doc)) return undefined;\n const presetIndex = findPresetIndex(doc.seeds);\n if (presetIndex < 0) return undefined;\n return presetId(THEME_PRESETS[presetIndex]!.name);\n}\n","import { ThemeError, validateTheme } from \"./validate\";\nimport type { ThemeDoc } from \"./doc\";\nimport { decodePreset, encodePreset, isThemePresetCode } from \"./preset\";\n\n/**\n * The compact theme code: `ut1.` + base64url(deflate(minified JSON)).\n *\n * Web-standard streams only (CompressionStream/DecompressionStream, Blob, btoa/atob) so the\n * same module runs in Workers, browsers and Node 18+. `deflate` (zlib) rather than\n * `deflate-raw`, which Node 20 — the repo floor — does not implement; the wrapper costs six\n * bytes and buys a checksum.\n *\n * `ut1` is the wire version. A breaking change to the document format bumps it, and the decoder\n * reads the current prefix only.\n */\n\nexport const THEME_CODE_PREFIX = \"ut1.\";\nexport const MAX_CODE_LENGTH = 4096;\nconst MAX_JSON_BYTES = 16 * 1024;\n\n/** Drain a stream into one buffer, refusing to grow past `cap` (the zip-bomb guard). */\nasync function pump(stream: ReadableStream<Uint8Array>, cap: number): Promise<Uint8Array> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let size = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n size += value.byteLength;\n if (size > cap) {\n // Cancelling releases the underlying decompressor before we throw.\n await reader.cancel().catch(() => {});\n throw new ThemeError(\"invalid theme\", [\"theme document too large\"]);\n }\n chunks.push(value);\n }\n const out = new Uint8Array(size);\n let off = 0;\n for (const c of chunks) {\n out.set(c, off);\n off += c.byteLength;\n }\n return out;\n}\n\nconst toB64url = (b: Uint8Array): string => {\n let bin = \"\";\n // Chunked: String.fromCharCode(...whole) overflows the argument limit on large arrays.\n for (let i = 0; i < b.length; i += 0x8000) {\n bin += String.fromCharCode(...b.subarray(i, i + 0x8000));\n }\n return btoa(bin).replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\").replace(/=+$/, \"\");\n};\n\nconst fromB64url = (s: string): Uint8Array => {\n const bin = atob(s.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\"));\n return Uint8Array.from(bin, (c) => c.charCodeAt(0));\n};\n\nasync function through(\n bytes: Uint8Array,\n transform: CompressionStream | DecompressionStream,\n cap: number,\n): Promise<Uint8Array> {\n const stream = new Blob([bytes as BlobPart]).stream().pipeThrough(transform);\n return pump(stream, cap);\n}\n\n/**\n * Validate and encode a theme document. Curated/simple themes — a style, a named preset or\n * custom seeds, with or without layer groups hidden or reordered — become a short `u…` preset;\n * anything with hand-edited colours is `ut1.` + deflate. Throws `ThemeError`.\n */\nexport async function encodeTheme(doc: ThemeDoc): Promise<string> {\n const valid = validateTheme(doc);\n const preset = encodePreset(valid);\n if (preset) return preset;\n const json = new TextEncoder().encode(JSON.stringify(valid));\n const packed = await through(json, new CompressionStream(\"deflate\"), Number.POSITIVE_INFINITY);\n const code = THEME_CODE_PREFIX + toB64url(packed);\n if (code.length > MAX_CODE_LENGTH) {\n throw new ThemeError(\"invalid theme\", [\n `encoded theme exceeds ${MAX_CODE_LENGTH} characters`,\n ]);\n }\n return code;\n}\n\n/** Decode and validate a compact theme code (`u…` preset or `ut1.` document). Every failure lands as `ThemeError`. */\nexport async function decodeTheme(code: string): Promise<ThemeDoc> {\n if (code.length > MAX_CODE_LENGTH) {\n throw new ThemeError(\"invalid theme\", [`code exceeds ${MAX_CODE_LENGTH} characters`]);\n }\n if (code.startsWith(THEME_CODE_PREFIX)) {\n return decodeDeflate(code);\n }\n if (isThemePresetCode(code)) {\n return validateTheme(decodePreset(code));\n }\n throw new ThemeError(\"invalid theme\", [\n `code must start with \"${THEME_CODE_PREFIX}\" or be a short preset`,\n ]);\n}\n\nasync function decodeDeflate(code: string): Promise<ThemeDoc> {\n let bytes: Uint8Array;\n try {\n const packed = fromB64url(code.slice(THEME_CODE_PREFIX.length));\n bytes = await through(packed, new DecompressionStream(\"deflate\"), MAX_JSON_BYTES);\n } catch (e) {\n if (e instanceof ThemeError) throw e;\n throw new ThemeError(\"invalid theme\", [\"code is not valid base64url deflate data\"]);\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(new TextDecoder().decode(bytes));\n } catch {\n throw new ThemeError(\"invalid theme\", [\"decoded payload is not JSON\"]);\n }\n return validateTheme(parsed);\n}\n","import { hexToOklch, oklchToHex } from \"./oklch\";\nimport type { ThemeSeeds } from \"./doc\";\nimport { DEFAULT_SEEDS } from \"./generate\";\n\n/**\n * Map an extracted image palette onto the four simple-mode seeds. Deterministic: the same\n * colours always produce the same seeds, and `generateTheme` then carries the contrast\n * guarantee. Lightness on land/water/nature is display-only (the generator re-hues stock\n * ladders); accent is used verbatim for the marker and route.\n */\n\nexport interface PaletteColor {\n hex: string;\n proportion: number;\n}\n\nconst CHROMATIC_FLOOR = 0.04;\nconst HUE_DEDUP = 20;\nconst WATER_HUE = { lo: 190, hi: 270 };\nconst NATURE_HUE = { lo: 100, hi: 170 };\nconst DISPLAY_L = { lo: 0.35, hi: 0.7 };\n\ninterface Ranked {\n hex: string;\n proportion: number;\n l: number;\n c: number;\n h: number;\n score: number;\n}\n\nconst wrapHue = (h: number) => ((h % 360) + 360) % 360;\n\nconst hueDelta = (a: number, b: number) => {\n const d = Math.abs(wrapHue(a) - wrapHue(b));\n return Math.min(d, 360 - d);\n};\n\nconst inBand = (h: number, band: { lo: number; hi: number }) => {\n const hue = wrapHue(h);\n return hue >= band.lo && hue <= band.hi;\n};\n\nconst normalizeHex = (hex: string) => {\n const raw = hex.startsWith(\"#\") ? hex.slice(1) : hex;\n return `#${raw.slice(0, 6).toUpperCase()}`;\n};\n\nconst parse = (color: PaletteColor): Ranked | null => {\n if (!/^#?[0-9a-fA-F]{6}/.test(color.hex)) return null;\n const hex = normalizeHex(color.hex);\n const { l, c, h } = hexToOklch(hex);\n if (!Number.isFinite(l) || !Number.isFinite(c) || !Number.isFinite(h)) return null;\n return { hex, proportion: Math.max(color.proportion, 0), l, c, h, score: 0 };\n};\n\n/** Clamp land/water/nature into a mid range so a pale or near-black brand colour still reads. */\nconst displaySeed = (color: Ranked): string =>\n oklchToHex({\n l: Math.min(DISPLAY_L.hi, Math.max(DISPLAY_L.lo, color.l)),\n c: color.c,\n h: color.h,\n });\n\nconst byScore = (a: Ranked, b: Ranked) =>\n b.score - a.score || b.proportion - a.proportion || a.hex.localeCompare(b.hex);\n\n/** Distinct hues in score order: skip a candidate within 20° of one already kept. */\nconst distinctHues = (ranked: Ranked[]): Ranked[] => {\n const out: Ranked[] = [];\n for (const color of ranked) {\n if (out.some((kept) => hueDelta(kept.h, color.h) < HUE_DEDUP)) continue;\n out.push(color);\n }\n return out;\n};\n\nconst pickInBand = (candidates: Ranked[], band: { lo: number; hi: number }): Ranked | undefined =>\n candidates.find((color) => inBand(color.h, band));\n\nfunction fromNeutrals(neutrals: Ranked[]): Required<ThemeSeeds> {\n const mid =\n neutrals.slice().sort((a, b) => Math.abs(a.l - 0.5) - Math.abs(b.l - 0.5))[0] ??\n parse({ hex: \"#808080\", proportion: 1 })!;\n const grey = displaySeed(mid);\n return { land: grey, water: grey, nature: grey, accent: DEFAULT_SEEDS.accent };\n}\n\n/**\n * Brand colours in, the four simple-mode seeds out. Empty input falls back to the stock seeds.\n */\nexport function seedsFromPalette(colors: PaletteColor[]): Required<ThemeSeeds> {\n const parsed = colors.map(parse).filter((c): c is Ranked => c !== null);\n if (parsed.length === 0) return { ...DEFAULT_SEEDS };\n\n const chromatic = parsed.filter((c) => c.c >= CHROMATIC_FLOOR);\n if (chromatic.length === 0) return fromNeutrals(parsed);\n\n const total = chromatic.reduce((sum, c) => sum + c.proportion, 0) || 1;\n for (const color of chromatic) {\n color.score = 0.7 * (color.proportion / total) + 0.3 * Math.min(color.c / 0.15, 1);\n }\n const ranked = chromatic.slice().sort(byScore);\n const distinct = distinctHues(ranked);\n const land = distinct[0]!;\n const rest = distinct.slice(1);\n const water = pickInBand(rest, WATER_HUE) ?? rest[0] ?? land;\n const afterWater = distinct.filter((c) => c !== land && c !== water);\n const nature = pickInBand(afterWater, NATURE_HUE) ?? afterWater[0] ?? land;\n const accent = ranked.slice().sort((a, b) => b.c - a.c || byScore(a, b))[0]!;\n\n return {\n land: displaySeed(land),\n water: displaySeed(water),\n nature: displaySeed(nature),\n accent: accent.hex,\n };\n}\n"],"mappings":"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","names":[]}
|