@unmap/themes 0.7.0 → 0.9.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/dist/index.js CHANGED
@@ -76,6 +76,17 @@ var verdant = {
76
76
  800: "#1E4128",
77
77
  900: "#0B2815"
78
78
  };
79
+ var fern = {
80
+ 100: "#D3F3C5",
81
+ 200: "#C3E6B3",
82
+ 300: "#AFD59E",
83
+ 400: "#96BF83",
84
+ 500: "#76A560",
85
+ 600: "#518535",
86
+ 700: "#37621E",
87
+ 800: "#1E4305",
88
+ 900: "#0F2900"
89
+ };
79
90
  var sandstone = {
80
91
  100: "#F5E8D0",
81
92
  200: "#E7D9BF",
@@ -187,22 +198,106 @@ var aqua = {
187
198
  950: "#081B1D",
188
199
  980: "#060E0F"
189
200
  };
201
+ var linen = {
202
+ 25: "#FCF6E6",
203
+ 50: "#F6F0E0",
204
+ 100: "#EDE7D7",
205
+ 200: "#E2DCCC",
206
+ 300: "#D5CFC0",
207
+ 400: "#C4BEAF",
208
+ 500: "#AAA495",
209
+ 600: "#8B8677",
210
+ 700: "#696457",
211
+ 800: "#4B4639",
212
+ 850: "#383427",
213
+ 900: "#272317",
214
+ 950: "#1B170B",
215
+ 1e3: "#0F0B03"
216
+ };
217
+ var coral = {
218
+ 25: "#FFF3F1",
219
+ 50: "#FFEBE8",
220
+ 100: "#FFDFDB",
221
+ 200: "#FFCFC8",
222
+ 300: "#FFBDB3",
223
+ 400: "#FFA195",
224
+ 500: "#F47C6E",
225
+ 600: "#C76559",
226
+ 700: "#974A42",
227
+ 800: "#6C332D",
228
+ 850: "#512520",
229
+ 900: "#391814",
230
+ 950: "#270F0C",
231
+ 1e3: "#170705"
232
+ };
233
+ var peach = {
234
+ 100: "#FFE2CC",
235
+ 200: "#FFCEAA",
236
+ 300: "#F4B98D",
237
+ 400: "#E0A171",
238
+ 500: "#CA8248",
239
+ 600: "#AC5E0D",
240
+ 700: "#804300",
241
+ 800: "#572B00",
242
+ 900: "#361900"
243
+ };
244
+ var indigo = {
245
+ 25: "#F7F6F9",
246
+ 50: "#F0EFF6",
247
+ 100: "#E8E6F1",
248
+ 200: "#DDD9EC",
249
+ 300: "#D0CBE6",
250
+ 400: "#C0B8DE",
251
+ 500: "#A89BD3",
252
+ 600: "#8B76C5",
253
+ 700: "#6D4BB5",
254
+ 800: "#4B3977",
255
+ 850: "#362C53",
256
+ 900: "#251F36",
257
+ 950: "#181422",
258
+ 1e3: "#0C0A11"
259
+ };
260
+ var azure = {
261
+ 100: "#D4EBFF",
262
+ 200: "#B6DDFF",
263
+ 300: "#92CBFB",
264
+ 400: "#74B3E8",
265
+ 500: "#5299D2",
266
+ 600: "#227AB9",
267
+ 700: "#005B91",
268
+ 800: "#003D64",
269
+ 900: "#002641",
270
+ 950: "#00192D",
271
+ 980: "#000E1C"
272
+ };
273
+ var amber = {
274
+ 200: "#FEEAC1",
275
+ 300: "#F3C96F",
276
+ 400: "#E7AF0E",
277
+ 500: "#C99700",
278
+ 600: "#C19100",
279
+ 700: "#916D00"
280
+ };
190
281
 
191
282
  // src/recipe.ts
192
283
  var THEME_BASES = [
193
284
  "base",
194
285
  "muted",
195
286
  "outdoor",
196
- "decimal",
197
287
  "blueprint",
198
288
  "blush",
199
289
  "orchid",
200
290
  "canopy",
201
- "lagoon"
291
+ "lagoon",
292
+ "tropic",
293
+ "sunset",
294
+ "bold",
295
+ "pastel"
202
296
  ];
203
297
  var RETIRED_BASES = {
204
298
  relief: "outdoor",
205
- street: "base"
299
+ street: "base",
300
+ decimal: "blueprint"
206
301
  };
207
302
  function normalizeThemeBase(base) {
208
303
  if (THEME_BASES.includes(base)) return base;
@@ -301,6 +396,7 @@ var STOCK_RAMPS = {
301
396
  wave,
302
397
  sky,
303
398
  verdant,
399
+ fern,
304
400
  sandstone,
305
401
  graphite,
306
402
  mist,
@@ -309,7 +405,13 @@ var STOCK_RAMPS = {
309
405
  rose,
310
406
  lilac,
311
407
  aqua,
312
- ember
408
+ ember,
409
+ linen,
410
+ coral,
411
+ peach,
412
+ indigo,
413
+ azure,
414
+ amber
313
415
  };
314
416
  function buildRecipes(r) {
315
417
  const BASE_LIGHT = {
@@ -610,14 +712,17 @@ function buildRecipes(r) {
610
712
  };
611
713
  const OUTDOOR_LIGHT = {
612
714
  background: r.ink[200],
613
- earth: r.ink[50],
715
+ // Warm paper, not the near-white ink the style launched on (2026-09-09): a green reads as
716
+ // vegetation against warm land and as a polygon against white, which is the difference
717
+ // between an outdoor map and a diagram. Mapbox Outdoors' land is hsl(60, 20%, 85%).
718
+ earth: r.paper[100],
614
719
  water: r.wave[300],
615
- parkA: r.verdant[300],
616
- parkB: r.verdant[400],
617
- woodA: r.verdant[300],
618
- woodB: r.verdant[400],
619
- scrubA: r.verdant[200],
620
- scrubB: r.verdant[300],
720
+ parkA: r.fern[300],
721
+ parkB: r.fern[400],
722
+ woodA: r.fern[300],
723
+ woodB: r.fern[400],
724
+ scrubA: r.fern[200],
725
+ scrubB: r.fern[300],
621
726
  sand: r.sandstone[300],
622
727
  beach: r.sandstone[300],
623
728
  glacier: r.ink[25],
@@ -667,7 +772,7 @@ function buildRecipes(r) {
667
772
  blue: "#2D6E8F",
668
773
  // Peaks, parks, forests and gardens all come through green. On this flavour they are the
669
774
  // POIs worth finding, so it carries a full step more weight than elsewhere.
670
- green: r.verdant[800],
775
+ green: r.fern[800],
671
776
  lapis: "#3F5C93",
672
777
  pink: "#8F4A6B",
673
778
  red: "#9B4340",
@@ -676,25 +781,25 @@ function buildRecipes(r) {
676
781
  turquoise: r.wave[700]
677
782
  },
678
783
  landcover: {
679
- grassland: r.verdant[200],
784
+ grassland: r.fern[200],
680
785
  barren: r.sandstone[300],
681
786
  urban_area: r.ink[100],
682
787
  farmland: r.sandstone[200],
683
788
  glacier: r.ink[25],
684
- scrub: r.verdant[300],
685
- forest: r.verdant[400]
789
+ scrub: r.fern[300],
790
+ forest: r.fern[400]
686
791
  }
687
792
  };
688
793
  const OUTDOOR_DARK = {
689
794
  background: r.ink[1e3],
690
795
  earth: r.ink[950],
691
796
  water: r.wave[980],
692
- parkA: r.verdant[700],
693
- parkB: r.verdant[600],
694
- woodA: r.verdant[700],
695
- woodB: r.verdant[600],
696
- scrubA: r.verdant[800],
697
- scrubB: r.verdant[700],
797
+ parkA: r.fern[700],
798
+ parkB: r.fern[600],
799
+ woodA: r.fern[700],
800
+ woodB: r.fern[600],
801
+ scrubA: r.fern[800],
802
+ scrubB: r.fern[700],
698
803
  sand: r.sandstone[500],
699
804
  beach: r.sandstone[500],
700
805
  glacier: r.ink[700],
@@ -743,7 +848,7 @@ function buildRecipes(r) {
743
848
  },
744
849
  pois: {
745
850
  blue: "#7FC4E8",
746
- green: r.verdant[300],
851
+ green: r.fern[300],
747
852
  lapis: "#8FB0EA",
748
853
  pink: "#E3A0C0",
749
854
  red: "#EE968F",
@@ -752,161 +857,13 @@ function buildRecipes(r) {
752
857
  turquoise: r.wave[400]
753
858
  },
754
859
  landcover: {
755
- grassland: r.verdant[700],
860
+ grassland: r.fern[700],
756
861
  barren: r.sandstone[500],
757
862
  urban_area: r.ink[950],
758
- farmland: r.verdant[900],
863
+ farmland: r.fern[900],
759
864
  glacier: r.ink[700],
760
- scrub: r.verdant[800],
761
- forest: r.verdant[600]
762
- }
763
- };
764
- const DECIMAL_LIGHT = {
765
- background: r.jade[100],
766
- earth: r.jade[25],
767
- water: r.jade[200],
768
- parkA: r.jade[50],
769
- parkB: r.jade[100],
770
- woodA: r.jade[50],
771
- woodB: r.jade[100],
772
- scrubA: r.jade[50],
773
- scrubB: r.jade[100],
774
- sand: r.jade[50],
775
- beach: r.jade[50],
776
- glacier: r.jade[25],
777
- institutional: r.jade[50],
778
- pedestrian: r.jade[50],
779
- aerodrome: r.jade[50],
780
- runway: r.jade[200],
781
- pier: r.jade[200],
782
- buildings: r.jade[100],
783
- railway: r.jade[500],
784
- boundaries: r.jade[600],
785
- roads: {
786
- other: r.jade[200],
787
- otherCasing: r.jade[25],
788
- minor: r.jade[300],
789
- minorCasing: r.jade[25],
790
- service: r.jade[200],
791
- serviceCasing: r.jade[25],
792
- major: r.jade[400],
793
- majorCasing: r.jade[25],
794
- highway: r.jade[500],
795
- highwayCasing: r.jade[25],
796
- link: r.jade[400],
797
- linkCasing: r.jade[25]
798
- },
799
- tunnelFill: r.jade[100],
800
- tunnelCasing: r.jade[200],
801
- bridgeCasing: r.jade[600],
802
- labels: {
803
- city: r.jade[1e3],
804
- cityHalo: r.jade[25],
805
- state: r.jade[700],
806
- stateHalo: r.jade[25],
807
- country: r.jade[700],
808
- subplace: r.jade[700],
809
- subplaceHalo: r.jade[25],
810
- address: r.jade[700],
811
- addressHalo: r.jade[25],
812
- roadMinor: r.jade[700],
813
- roadMinorHalo: r.jade[25],
814
- roadMajor: r.jade[800],
815
- roadMajorHalo: r.jade[25],
816
- ocean: r.jade[800]
817
- },
818
- pois: {
819
- blue: r.jade[700],
820
- green: r.jade[700],
821
- lapis: r.jade[700],
822
- pink: r.jade[700],
823
- red: r.jade[700],
824
- slategray: r.jade[700],
825
- tangerine: r.jade[700],
826
- turquoise: r.jade[700]
827
- },
828
- landcover: {
829
- grassland: r.jade[50],
830
- barren: r.jade[50],
831
- urban_area: r.jade[50],
832
- farmland: r.jade[50],
833
- glacier: r.jade[25],
834
- scrub: r.jade[50],
835
- forest: r.jade[100]
836
- }
837
- };
838
- const DECIMAL_DARK = {
839
- background: r.jade[1e3],
840
- earth: r.jade[1e3],
841
- water: r.jade[900],
842
- parkA: r.jade[950],
843
- parkB: r.jade[900],
844
- woodA: r.jade[950],
845
- woodB: r.jade[900],
846
- scrubA: r.jade[950],
847
- scrubB: r.jade[900],
848
- sand: r.jade[950],
849
- beach: r.jade[950],
850
- glacier: r.jade[900],
851
- institutional: r.jade[950],
852
- pedestrian: r.jade[950],
853
- aerodrome: r.jade[950],
854
- runway: r.jade[850],
855
- pier: r.jade[850],
856
- buildings: r.jade[900],
857
- railway: r.jade[800],
858
- boundaries: r.jade[700],
859
- roads: {
860
- other: r.jade[850],
861
- otherCasing: r.jade[1e3],
862
- minor: r.jade[800],
863
- minorCasing: r.jade[1e3],
864
- service: r.jade[850],
865
- serviceCasing: r.jade[1e3],
866
- major: r.jade[700],
867
- majorCasing: r.jade[1e3],
868
- highway: r.jade[600],
869
- highwayCasing: r.jade[1e3],
870
- link: r.jade[700],
871
- linkCasing: r.jade[1e3]
872
- },
873
- tunnelFill: r.jade[900],
874
- tunnelCasing: r.jade[1e3],
875
- bridgeCasing: r.jade[1e3],
876
- labels: {
877
- city: r.jade[500],
878
- cityHalo: r.jade[1e3],
879
- state: r.jade[600],
880
- stateHalo: r.jade[1e3],
881
- country: r.jade[600],
882
- subplace: r.jade[600],
883
- subplaceHalo: r.jade[1e3],
884
- address: r.jade[600],
885
- addressHalo: r.jade[1e3],
886
- roadMinor: r.jade[600],
887
- roadMinorHalo: r.jade[1e3],
888
- roadMajor: r.jade[500],
889
- roadMajorHalo: r.jade[1e3],
890
- ocean: r.jade[500]
891
- },
892
- pois: {
893
- blue: r.jade[600],
894
- green: r.jade[600],
895
- lapis: r.jade[600],
896
- pink: r.jade[600],
897
- red: r.jade[600],
898
- slategray: r.jade[600],
899
- tangerine: r.jade[600],
900
- turquoise: r.jade[600]
901
- },
902
- landcover: {
903
- grassland: r.jade[950],
904
- barren: r.jade[950],
905
- urban_area: r.jade[950],
906
- farmland: r.jade[950],
907
- glacier: r.jade[900],
908
- scrub: r.jade[950],
909
- forest: r.jade[900]
865
+ scrub: r.fern[800],
866
+ forest: r.fern[600]
910
867
  }
911
868
  };
912
869
  const BLUEPRINT_LIGHT = {
@@ -1428,8 +1385,11 @@ function buildRecipes(r) {
1428
1385
  }
1429
1386
  };
1430
1387
  const CANOPY_DARK = {
1431
- background: r.paper[950],
1432
- earth: r.paper[900],
1388
+ // `linen` rather than `paper` for the ground alone: paper is packed solid here (1000 casings,
1389
+ // 950 background, 900 earth, 850 scrub), so there is no free step to move to, and `base`
1390
+ // owns paper[900]. The straw tint also suits a style whose light half is sandstone.
1391
+ background: r.linen[950],
1392
+ earth: r.linen[900],
1433
1393
  water: r.cobalt[950],
1434
1394
  parkA: r.verdant[900],
1435
1395
  parkB: r.verdant[800],
@@ -1649,16 +1609,626 @@ function buildRecipes(r) {
1649
1609
  forest: r.wave[800]
1650
1610
  }
1651
1611
  };
1612
+ const TROPIC_LIGHT = {
1613
+ background: r.linen[100],
1614
+ // A step below `sunset`, whose warm duotone owns the lightest cream. Tropic's cream sitting
1615
+ // slightly deeper is also what lets its full-strength teal water carry the style.
1616
+ earth: r.linen[50],
1617
+ water: r.aqua[500],
1618
+ parkA: r.jade[300],
1619
+ parkB: r.jade[400],
1620
+ woodA: r.jade[400],
1621
+ woodB: r.jade[500],
1622
+ scrubA: r.fern[200],
1623
+ scrubB: r.fern[300],
1624
+ sand: r.sandstone[200],
1625
+ beach: r.sandstone[100],
1626
+ glacier: r.ink[25],
1627
+ institutional: r.linen[100],
1628
+ pedestrian: r.linen[50],
1629
+ aerodrome: r.linen[200],
1630
+ runway: r.linen[300],
1631
+ pier: r.aqua[300],
1632
+ buildings: r.linen[200],
1633
+ railway: r.linen[400],
1634
+ boundaries: r.coral[700],
1635
+ roads: {
1636
+ other: "#FFFFFF",
1637
+ otherCasing: r.linen[200],
1638
+ minor: "#FFFFFF",
1639
+ minorCasing: r.linen[200],
1640
+ service: "#FFFFFF",
1641
+ serviceCasing: r.linen[200],
1642
+ major: "#FFFFFF",
1643
+ majorCasing: r.linen[300],
1644
+ highway: r.coral[500],
1645
+ highwayCasing: r.coral[700],
1646
+ link: r.coral[400],
1647
+ linkCasing: r.coral[600]
1648
+ },
1649
+ tunnelFill: r.linen[100],
1650
+ tunnelCasing: r.linen[200],
1651
+ bridgeCasing: r.linen[500],
1652
+ labels: {
1653
+ city: r.aqua[950],
1654
+ cityHalo: r.linen[25],
1655
+ state: r.aqua[800],
1656
+ stateHalo: r.linen[25],
1657
+ country: r.aqua[800],
1658
+ subplace: r.aqua[800],
1659
+ subplaceHalo: r.linen[25],
1660
+ address: r.linen[700],
1661
+ addressHalo: r.linen[25],
1662
+ roadMinor: r.linen[700],
1663
+ roadMinorHalo: r.linen[25],
1664
+ roadMajor: r.aqua[900],
1665
+ roadMajorHalo: r.linen[25],
1666
+ ocean: r.aqua[980]
1667
+ },
1668
+ pois: {
1669
+ blue: r.wave[700],
1670
+ green: r.verdant[700],
1671
+ lapis: r.sky[700],
1672
+ pink: r.rose[600],
1673
+ red: r.rose[700],
1674
+ slategray: r.graphite[700],
1675
+ tangerine: r.sandstone[500],
1676
+ turquoise: r.aqua[700]
1677
+ },
1678
+ landcover: {
1679
+ grassland: r.fern[200],
1680
+ barren: r.sandstone[200],
1681
+ urban_area: r.linen[100],
1682
+ farmland: r.sandstone[100],
1683
+ glacier: r.ink[25],
1684
+ scrub: r.fern[300],
1685
+ forest: r.jade[400]
1686
+ }
1687
+ };
1688
+ const TROPIC_DARK = {
1689
+ background: r.aqua[980],
1690
+ earth: r.aqua[950],
1691
+ water: r.aqua[700],
1692
+ parkA: r.jade[850],
1693
+ parkB: r.jade[800],
1694
+ woodA: r.jade[800],
1695
+ woodB: r.jade[700],
1696
+ scrubA: r.ink[900],
1697
+ scrubB: r.ink[850],
1698
+ sand: r.sandstone[500],
1699
+ beach: r.ink[900],
1700
+ glacier: r.ink[800],
1701
+ institutional: r.ink[900],
1702
+ pedestrian: r.aqua[900],
1703
+ aerodrome: r.ink[900],
1704
+ runway: r.ink[850],
1705
+ pier: r.aqua[600],
1706
+ buildings: r.ink[900],
1707
+ railway: r.ink[700],
1708
+ boundaries: r.coral[400],
1709
+ roads: {
1710
+ other: r.ink[850],
1711
+ otherCasing: r.aqua[980],
1712
+ minor: r.ink[800],
1713
+ minorCasing: r.aqua[980],
1714
+ service: r.ink[850],
1715
+ serviceCasing: r.aqua[980],
1716
+ major: r.ink[700],
1717
+ majorCasing: r.aqua[980],
1718
+ highway: r.coral[500],
1719
+ highwayCasing: r.aqua[980],
1720
+ link: r.coral[600],
1721
+ linkCasing: r.aqua[980]
1722
+ },
1723
+ tunnelFill: r.ink[900],
1724
+ tunnelCasing: r.aqua[980],
1725
+ bridgeCasing: r.aqua[980],
1726
+ labels: {
1727
+ city: r.linen[25],
1728
+ cityHalo: r.aqua[950],
1729
+ state: r.aqua[300],
1730
+ stateHalo: r.aqua[950],
1731
+ country: r.aqua[300],
1732
+ subplace: r.aqua[300],
1733
+ subplaceHalo: r.aqua[950],
1734
+ address: r.ink[400],
1735
+ addressHalo: r.aqua[950],
1736
+ roadMinor: r.ink[400],
1737
+ roadMinorHalo: r.aqua[950],
1738
+ roadMajor: r.linen[100],
1739
+ roadMajorHalo: r.aqua[950],
1740
+ ocean: r.aqua[200]
1741
+ },
1742
+ pois: {
1743
+ blue: r.wave[400],
1744
+ green: r.verdant[400],
1745
+ lapis: r.sky[400],
1746
+ pink: r.rose[400],
1747
+ red: r.rose[400],
1748
+ slategray: r.graphite[400],
1749
+ tangerine: r.sandstone[400],
1750
+ turquoise: r.aqua[400]
1751
+ },
1752
+ landcover: {
1753
+ grassland: r.ink[900],
1754
+ barren: r.sandstone[500],
1755
+ urban_area: r.aqua[950],
1756
+ farmland: r.ink[900],
1757
+ glacier: r.ink[800],
1758
+ scrub: r.ink[850],
1759
+ forest: r.jade[800]
1760
+ }
1761
+ };
1762
+ const SUNSET_LIGHT = {
1763
+ background: r.linen[100],
1764
+ earth: r.linen[25],
1765
+ water: r.indigo[700],
1766
+ parkA: r.peach[100],
1767
+ parkB: r.peach[200],
1768
+ woodA: r.peach[200],
1769
+ woodB: r.peach[300],
1770
+ scrubA: r.linen[100],
1771
+ scrubB: r.peach[100],
1772
+ sand: r.peach[200],
1773
+ beach: r.peach[100],
1774
+ glacier: r.linen[25],
1775
+ institutional: r.linen[100],
1776
+ pedestrian: r.linen[50],
1777
+ aerodrome: r.linen[200],
1778
+ runway: r.linen[300],
1779
+ pier: r.indigo[300],
1780
+ buildings: r.linen[200],
1781
+ railway: r.linen[400],
1782
+ boundaries: r.indigo[600],
1783
+ roads: {
1784
+ other: "#FFFFFF",
1785
+ otherCasing: r.linen[200],
1786
+ minor: "#FFFFFF",
1787
+ minorCasing: r.linen[200],
1788
+ service: "#FFFFFF",
1789
+ serviceCasing: r.linen[200],
1790
+ major: "#FFFFFF",
1791
+ majorCasing: r.coral[300],
1792
+ highway: r.coral[500],
1793
+ highwayCasing: r.coral[700],
1794
+ link: r.coral[400],
1795
+ linkCasing: r.coral[600]
1796
+ },
1797
+ tunnelFill: r.linen[100],
1798
+ tunnelCasing: r.linen[200],
1799
+ bridgeCasing: r.linen[500],
1800
+ labels: {
1801
+ city: r.indigo[900],
1802
+ cityHalo: r.linen[25],
1803
+ state: r.indigo[800],
1804
+ stateHalo: r.linen[25],
1805
+ country: r.indigo[800],
1806
+ subplace: r.indigo[800],
1807
+ subplaceHalo: r.linen[25],
1808
+ address: r.linen[700],
1809
+ addressHalo: r.linen[25],
1810
+ roadMinor: r.linen[700],
1811
+ roadMinorHalo: r.linen[25],
1812
+ roadMajor: r.indigo[900],
1813
+ roadMajorHalo: r.linen[25],
1814
+ ocean: r.linen[25]
1815
+ },
1816
+ pois: {
1817
+ blue: r.wave[700],
1818
+ green: r.verdant[700],
1819
+ lapis: r.sky[700],
1820
+ pink: r.rose[600],
1821
+ red: r.rose[700],
1822
+ slategray: r.graphite[700],
1823
+ tangerine: r.sandstone[500],
1824
+ turquoise: r.aqua[700]
1825
+ },
1826
+ // A step lighter than the parks: the field tint sits under them at up to 0.6 opacity, and at
1827
+ // the parks' own steps it turned the whole city orange rather than cream with peach in it.
1828
+ landcover: {
1829
+ grassland: r.linen[100],
1830
+ barren: r.linen[200],
1831
+ urban_area: r.linen[50],
1832
+ farmland: r.peach[100],
1833
+ glacier: r.linen[25],
1834
+ scrub: r.linen[100],
1835
+ forest: r.peach[200]
1836
+ }
1837
+ };
1838
+ const SUNSET_DARK = {
1839
+ background: r.indigo[950],
1840
+ earth: r.indigo[900],
1841
+ water: r.indigo[1e3],
1842
+ parkA: r.indigo[850],
1843
+ parkB: r.indigo[800],
1844
+ woodA: r.indigo[850],
1845
+ woodB: r.indigo[800],
1846
+ scrubA: r.indigo[900],
1847
+ scrubB: r.indigo[850],
1848
+ sand: r.peach[800],
1849
+ beach: r.indigo[850],
1850
+ glacier: r.indigo[700],
1851
+ institutional: r.indigo[850],
1852
+ pedestrian: r.indigo[850],
1853
+ aerodrome: r.indigo[850],
1854
+ runway: r.indigo[800],
1855
+ pier: r.indigo[600],
1856
+ buildings: r.indigo[850],
1857
+ railway: r.indigo[700],
1858
+ boundaries: r.peach[300],
1859
+ roads: {
1860
+ other: r.indigo[800],
1861
+ otherCasing: r.indigo[950],
1862
+ minor: r.indigo[700],
1863
+ minorCasing: r.indigo[950],
1864
+ service: r.indigo[800],
1865
+ serviceCasing: r.indigo[950],
1866
+ major: r.indigo[600],
1867
+ majorCasing: r.indigo[950],
1868
+ highway: r.coral[500],
1869
+ highwayCasing: r.indigo[950],
1870
+ link: r.coral[600],
1871
+ linkCasing: r.indigo[950]
1872
+ },
1873
+ tunnelFill: r.indigo[850],
1874
+ tunnelCasing: r.indigo[950],
1875
+ bridgeCasing: r.indigo[950],
1876
+ labels: {
1877
+ city: r.peach[100],
1878
+ cityHalo: r.indigo[900],
1879
+ state: r.peach[300],
1880
+ stateHalo: r.indigo[900],
1881
+ country: r.peach[300],
1882
+ subplace: r.peach[300],
1883
+ subplaceHalo: r.indigo[900],
1884
+ address: r.indigo[400],
1885
+ addressHalo: r.indigo[900],
1886
+ roadMinor: r.indigo[400],
1887
+ roadMinorHalo: r.indigo[900],
1888
+ roadMajor: r.peach[100],
1889
+ roadMajorHalo: r.indigo[900],
1890
+ ocean: r.indigo[500]
1891
+ },
1892
+ pois: {
1893
+ blue: r.wave[400],
1894
+ green: r.verdant[400],
1895
+ lapis: r.sky[400],
1896
+ pink: r.rose[400],
1897
+ red: r.rose[400],
1898
+ slategray: r.graphite[400],
1899
+ tangerine: r.sandstone[400],
1900
+ turquoise: r.aqua[400]
1901
+ },
1902
+ landcover: {
1903
+ grassland: r.indigo[900],
1904
+ barren: r.peach[800],
1905
+ urban_area: r.indigo[900],
1906
+ farmland: r.indigo[850],
1907
+ glacier: r.indigo[700],
1908
+ scrub: r.indigo[850],
1909
+ forest: r.indigo[800]
1910
+ }
1911
+ };
1912
+ const BOLD_LIGHT = {
1913
+ background: r.paper[100],
1914
+ // A step below `base`, which owns the lightest paper: two styles cannot share a land colour
1915
+ // (the /styles suite asserts twelve distinct earths), and the saturated water, parks and
1916
+ // amber highway read better off a ground that is a shade warmer than the default map's.
1917
+ earth: r.paper[50],
1918
+ water: r.azure[500],
1919
+ parkA: r.fern[300],
1920
+ parkB: r.fern[400],
1921
+ woodA: r.jade[500],
1922
+ woodB: r.jade[600],
1923
+ scrubA: r.fern[200],
1924
+ scrubB: r.fern[300],
1925
+ sand: r.sandstone[200],
1926
+ beach: r.sandstone[100],
1927
+ glacier: r.ink[25],
1928
+ institutional: r.paper[100],
1929
+ pedestrian: r.paper[50],
1930
+ aerodrome: r.paper[200],
1931
+ runway: r.paper[300],
1932
+ pier: r.azure[300],
1933
+ buildings: r.paper[200],
1934
+ railway: r.paper[400],
1935
+ boundaries: r.indigo[600],
1936
+ roads: {
1937
+ other: "#FFFFFF",
1938
+ otherCasing: r.paper[200],
1939
+ minor: "#FFFFFF",
1940
+ minorCasing: r.paper[200],
1941
+ service: "#FFFFFF",
1942
+ serviceCasing: r.paper[200],
1943
+ major: "#FFFFFF",
1944
+ majorCasing: r.paper[300],
1945
+ highway: r.amber[400],
1946
+ highwayCasing: r.amber[600],
1947
+ link: r.amber[300],
1948
+ linkCasing: r.amber[500]
1949
+ },
1950
+ tunnelFill: r.paper[100],
1951
+ tunnelCasing: r.paper[200],
1952
+ bridgeCasing: r.paper[500],
1953
+ labels: {
1954
+ city: r.ink[1e3],
1955
+ cityHalo: r.paper[25],
1956
+ state: r.ink[700],
1957
+ stateHalo: r.paper[25],
1958
+ country: r.ink[700],
1959
+ subplace: r.ink[700],
1960
+ subplaceHalo: r.paper[25],
1961
+ address: r.ink[700],
1962
+ addressHalo: r.paper[25],
1963
+ roadMinor: r.ink[700],
1964
+ roadMinorHalo: r.paper[25],
1965
+ roadMajor: r.ink[800],
1966
+ roadMajorHalo: r.paper[25],
1967
+ ocean: r.azure[950]
1968
+ },
1969
+ pois: {
1970
+ blue: r.wave[700],
1971
+ green: r.verdant[700],
1972
+ lapis: r.sky[700],
1973
+ pink: r.rose[600],
1974
+ red: r.rose[700],
1975
+ slategray: r.graphite[700],
1976
+ tangerine: r.sandstone[500],
1977
+ turquoise: r.aqua[700]
1978
+ },
1979
+ landcover: {
1980
+ grassland: r.fern[200],
1981
+ barren: r.sandstone[200],
1982
+ urban_area: r.paper[100],
1983
+ farmland: r.sandstone[100],
1984
+ glacier: r.ink[25],
1985
+ scrub: r.fern[300],
1986
+ forest: r.jade[400]
1987
+ }
1988
+ };
1989
+ const BOLD_DARK = {
1990
+ // A warm ground under cool detail. `outdoor` owns ink[950] and ink is packed below it here
1991
+ // (900 scrub and buildings, 850 runway), so the ground moves to paper, which is where this
1992
+ // style's light half already sits.
1993
+ background: r.paper[1e3],
1994
+ earth: r.paper[950],
1995
+ water: r.azure[800],
1996
+ parkA: r.fern[800],
1997
+ parkB: r.fern[700],
1998
+ woodA: r.jade[850],
1999
+ woodB: r.jade[800],
2000
+ scrubA: r.ink[900],
2001
+ scrubB: r.ink[850],
2002
+ sand: r.sandstone[500],
2003
+ beach: r.ink[900],
2004
+ glacier: r.ink[800],
2005
+ institutional: r.ink[900],
2006
+ pedestrian: r.ink[900],
2007
+ aerodrome: r.ink[900],
2008
+ runway: r.ink[850],
2009
+ pier: r.azure[600],
2010
+ buildings: r.ink[900],
2011
+ railway: r.ink[700],
2012
+ boundaries: r.indigo[500],
2013
+ roads: {
2014
+ other: r.ink[850],
2015
+ otherCasing: r.ink[1e3],
2016
+ minor: r.ink[800],
2017
+ minorCasing: r.ink[1e3],
2018
+ service: r.ink[850],
2019
+ serviceCasing: r.ink[1e3],
2020
+ major: r.ink[700],
2021
+ majorCasing: r.ink[1e3],
2022
+ highway: r.amber[500],
2023
+ highwayCasing: r.ink[1e3],
2024
+ link: r.amber[600],
2025
+ linkCasing: r.ink[1e3]
2026
+ },
2027
+ tunnelFill: r.ink[900],
2028
+ tunnelCasing: r.ink[1e3],
2029
+ bridgeCasing: r.ink[1e3],
2030
+ labels: {
2031
+ city: r.ink[25],
2032
+ cityHalo: r.ink[950],
2033
+ state: r.ink[300],
2034
+ stateHalo: r.ink[950],
2035
+ country: r.ink[300],
2036
+ subplace: r.ink[300],
2037
+ subplaceHalo: r.ink[950],
2038
+ address: r.ink[400],
2039
+ addressHalo: r.ink[950],
2040
+ roadMinor: r.ink[400],
2041
+ roadMinorHalo: r.ink[950],
2042
+ roadMajor: r.ink[100],
2043
+ roadMajorHalo: r.ink[950],
2044
+ ocean: r.azure[300]
2045
+ },
2046
+ pois: {
2047
+ blue: r.wave[400],
2048
+ green: r.verdant[400],
2049
+ lapis: r.sky[400],
2050
+ pink: r.rose[400],
2051
+ red: r.rose[400],
2052
+ slategray: r.graphite[400],
2053
+ tangerine: r.sandstone[400],
2054
+ turquoise: r.aqua[400]
2055
+ },
2056
+ landcover: {
2057
+ grassland: r.ink[900],
2058
+ barren: r.sandstone[500],
2059
+ urban_area: r.ink[950],
2060
+ farmland: r.ink[900],
2061
+ glacier: r.ink[800],
2062
+ scrub: r.ink[850],
2063
+ forest: r.jade[850]
2064
+ }
2065
+ };
2066
+ const PASTEL_LIGHT = {
2067
+ background: r.lilac[50],
2068
+ earth: r.lilac[25],
2069
+ water: r.cobalt[400],
2070
+ parkA: r.jade[300],
2071
+ parkB: r.jade[400],
2072
+ woodA: r.fern[300],
2073
+ woodB: r.fern[400],
2074
+ scrubA: r.jade[200],
2075
+ scrubB: r.jade[300],
2076
+ sand: r.sandstone[200],
2077
+ beach: r.sandstone[100],
2078
+ glacier: r.ink[25],
2079
+ institutional: r.lilac[100],
2080
+ pedestrian: r.lilac[50],
2081
+ aerodrome: r.lilac[200],
2082
+ runway: r.lilac[300],
2083
+ pier: r.cobalt[300],
2084
+ buildings: r.lilac[200],
2085
+ railway: r.lilac[400],
2086
+ boundaries: r.indigo[500],
2087
+ roads: {
2088
+ other: "#FFFFFF",
2089
+ otherCasing: r.lilac[200],
2090
+ minor: "#FFFFFF",
2091
+ minorCasing: r.lilac[200],
2092
+ service: "#FFFFFF",
2093
+ serviceCasing: r.lilac[200],
2094
+ major: "#FFFFFF",
2095
+ majorCasing: r.lilac[300],
2096
+ highway: r.coral[400],
2097
+ highwayCasing: r.coral[500],
2098
+ link: r.coral[300],
2099
+ linkCasing: r.coral[400]
2100
+ },
2101
+ tunnelFill: r.lilac[100],
2102
+ tunnelCasing: r.lilac[200],
2103
+ bridgeCasing: r.lilac[500],
2104
+ labels: {
2105
+ city: r.lilac[1e3],
2106
+ cityHalo: r.lilac[25],
2107
+ state: r.lilac[700],
2108
+ stateHalo: r.lilac[25],
2109
+ country: r.lilac[700],
2110
+ subplace: r.lilac[700],
2111
+ subplaceHalo: r.lilac[25],
2112
+ address: r.lilac[700],
2113
+ addressHalo: r.lilac[25],
2114
+ roadMinor: r.lilac[700],
2115
+ roadMinorHalo: r.lilac[25],
2116
+ roadMajor: r.lilac[800],
2117
+ roadMajorHalo: r.lilac[25],
2118
+ ocean: r.cobalt[800]
2119
+ },
2120
+ pois: {
2121
+ blue: r.wave[700],
2122
+ green: r.verdant[700],
2123
+ lapis: r.sky[700],
2124
+ pink: r.rose[600],
2125
+ red: r.rose[700],
2126
+ slategray: r.graphite[700],
2127
+ tangerine: r.sandstone[500],
2128
+ turquoise: r.aqua[700]
2129
+ },
2130
+ landcover: {
2131
+ grassland: r.jade[200],
2132
+ barren: r.sandstone[200],
2133
+ urban_area: r.lilac[100],
2134
+ farmland: r.amber[200],
2135
+ glacier: r.ink[25],
2136
+ scrub: r.jade[300],
2137
+ forest: r.fern[400]
2138
+ }
2139
+ };
2140
+ const PASTEL_DARK = {
2141
+ background: r.lilac[1e3],
2142
+ earth: r.lilac[950],
2143
+ // Water lighter than land, which `blueprint`, `tropic` and `bold` already do: the three
2144
+ // styles whose water is the thing you remember about them. This one's is periwinkle, and at
2145
+ // cobalt[950] the dark half had turned it near-black, so the name stopped being true after
2146
+ // sundown. Lifting it also unpins the ground, which had to sit at `orchid`'s lilac[900]
2147
+ // because the only free step below was within 1.01:1 of that near-black water.
2148
+ water: r.cobalt[800],
2149
+ parkA: r.jade[850],
2150
+ parkB: r.jade[800],
2151
+ woodA: r.fern[800],
2152
+ woodB: r.fern[700],
2153
+ scrubA: r.lilac[850],
2154
+ scrubB: r.jade[850],
2155
+ sand: r.sandstone[500],
2156
+ beach: r.lilac[850],
2157
+ glacier: r.lilac[700],
2158
+ institutional: r.lilac[850],
2159
+ pedestrian: r.lilac[850],
2160
+ aerodrome: r.lilac[850],
2161
+ runway: r.lilac[800],
2162
+ pier: r.cobalt[600],
2163
+ buildings: r.lilac[850],
2164
+ railway: r.lilac[700],
2165
+ boundaries: r.indigo[400],
2166
+ roads: {
2167
+ other: r.lilac[800],
2168
+ otherCasing: r.lilac[1e3],
2169
+ minor: r.lilac[700],
2170
+ minorCasing: r.lilac[1e3],
2171
+ service: r.lilac[800],
2172
+ serviceCasing: r.lilac[1e3],
2173
+ major: r.lilac[600],
2174
+ majorCasing: r.lilac[1e3],
2175
+ highway: r.coral[400],
2176
+ highwayCasing: r.lilac[1e3],
2177
+ link: r.coral[500],
2178
+ linkCasing: r.lilac[1e3]
2179
+ },
2180
+ tunnelFill: r.lilac[850],
2181
+ tunnelCasing: r.lilac[1e3],
2182
+ bridgeCasing: r.lilac[1e3],
2183
+ labels: {
2184
+ city: r.lilac[25],
2185
+ cityHalo: r.lilac[950],
2186
+ state: r.lilac[300],
2187
+ stateHalo: r.lilac[950],
2188
+ country: r.lilac[300],
2189
+ subplace: r.lilac[300],
2190
+ subplaceHalo: r.lilac[950],
2191
+ address: r.lilac[400],
2192
+ addressHalo: r.lilac[950],
2193
+ roadMinor: r.lilac[400],
2194
+ roadMinorHalo: r.lilac[950],
2195
+ roadMajor: r.lilac[100],
2196
+ roadMajorHalo: r.lilac[950],
2197
+ ocean: r.cobalt[400]
2198
+ },
2199
+ pois: {
2200
+ blue: r.wave[400],
2201
+ green: r.verdant[400],
2202
+ lapis: r.sky[400],
2203
+ pink: r.rose[400],
2204
+ red: r.rose[400],
2205
+ slategray: r.graphite[400],
2206
+ tangerine: r.sandstone[400],
2207
+ turquoise: r.aqua[400]
2208
+ },
2209
+ landcover: {
2210
+ grassland: r.lilac[850],
2211
+ barren: r.sandstone[500],
2212
+ urban_area: r.lilac[900],
2213
+ farmland: r.lilac[850],
2214
+ glacier: r.lilac[700],
2215
+ scrub: r.lilac[850],
2216
+ forest: r.fern[800]
2217
+ }
2218
+ };
1652
2219
  return {
1653
2220
  base: { light: BASE_LIGHT, dark: BASE_DARK },
1654
2221
  muted: { light: MUTED_LIGHT, dark: MUTED_DARK },
1655
2222
  outdoor: { light: OUTDOOR_LIGHT, dark: OUTDOOR_DARK },
1656
- decimal: { light: DECIMAL_LIGHT, dark: DECIMAL_DARK },
1657
2223
  blueprint: { light: BLUEPRINT_LIGHT, dark: BLUEPRINT_DARK },
1658
2224
  blush: { light: BLUSH_LIGHT, dark: BLUSH_DARK },
1659
2225
  orchid: { light: ORCHID_LIGHT, dark: ORCHID_DARK },
1660
2226
  canopy: { light: CANOPY_LIGHT, dark: CANOPY_DARK },
1661
- lagoon: { light: LAGOON_LIGHT, dark: LAGOON_DARK }
2227
+ lagoon: { light: LAGOON_LIGHT, dark: LAGOON_DARK },
2228
+ tropic: { light: TROPIC_LIGHT, dark: TROPIC_DARK },
2229
+ sunset: { light: SUNSET_LIGHT, dark: SUNSET_DARK },
2230
+ bold: { light: BOLD_LIGHT, dark: BOLD_DARK },
2231
+ pastel: { light: PASTEL_LIGHT, dark: PASTEL_DARK }
1662
2232
  };
1663
2233
  }
1664
2234
  var RECIPES = buildRecipes(STOCK_RAMPS);
@@ -1833,12 +2403,15 @@ var STYLE_THEMES = {
1833
2403
  base: { v: 1, name: "base", base: "base" },
1834
2404
  muted: { v: 1, name: "muted", base: "muted" },
1835
2405
  outdoor: { v: 1, name: "outdoor", base: "outdoor" },
1836
- decimal: { v: 1, name: "decimal", base: "decimal" },
1837
2406
  blueprint: { v: 1, name: "blueprint", base: "blueprint" },
1838
2407
  blush: { v: 1, name: "blush", base: "blush" },
1839
2408
  orchid: { v: 1, name: "orchid", base: "orchid" },
1840
2409
  canopy: { v: 1, name: "canopy", base: "canopy" },
1841
- lagoon: { v: 1, name: "lagoon", base: "lagoon" }
2410
+ lagoon: { v: 1, name: "lagoon", base: "lagoon" },
2411
+ tropic: { v: 1, name: "tropic", base: "tropic" },
2412
+ sunset: { v: 1, name: "sunset", base: "sunset" },
2413
+ bold: { v: 1, name: "bold", base: "bold" },
2414
+ pastel: { v: 1, name: "pastel", base: "pastel" }
1842
2415
  };
1843
2416
 
1844
2417
  // src/oklch.ts
@@ -2088,11 +2661,15 @@ function generateTheme(base, seeds) {
2088
2661
  cobalt: reRamp(STOCK_RAMPS.cobalt, seeds.land, CHROMA_CAP),
2089
2662
  rose: reRamp(STOCK_RAMPS.rose, seeds.land, CHROMA_CAP),
2090
2663
  lilac: reRamp(STOCK_RAMPS.lilac, seeds.land, NEUTRAL_CHROMA_CAP),
2664
+ linen: reRamp(STOCK_RAMPS.linen, seeds.land, NEUTRAL_CHROMA_CAP),
2665
+ indigo: reRamp(STOCK_RAMPS.indigo, seeds.land, CHROMA_CAP),
2091
2666
  aqua: reRamp(STOCK_RAMPS.aqua, seeds.nature, CHROMA_CAP),
2092
2667
  wave: reRamp(STOCK_RAMPS.wave, seeds.water, CHROMA_CAP),
2093
2668
  sky: reRamp(STOCK_RAMPS.sky, seeds.water, CHROMA_CAP),
2094
2669
  mist: reRamp(STOCK_RAMPS.mist, seeds.water, CHROMA_CAP),
2095
- verdant: reRamp(STOCK_RAMPS.verdant, seeds.nature, CHROMA_CAP)
2670
+ azure: reRamp(STOCK_RAMPS.azure, seeds.water, CHROMA_CAP),
2671
+ verdant: reRamp(STOCK_RAMPS.verdant, seeds.nature, CHROMA_CAP),
2672
+ peach: reRamp(STOCK_RAMPS.peach, seeds.nature, CHROMA_CAP)
2096
2673
  };
2097
2674
  const generated = buildRecipes(ramps);
2098
2675
  const doc = { v: 1, base, seeds: { ...seeds } };
@@ -2140,6 +2717,48 @@ var THEME_PRESETS = [
2140
2717
  {
2141
2718
  name: "chinook",
2142
2719
  seeds: { land: "#9C8A5D", water: "#56789C", nature: "#8A9A5B", accent: "#D95D39" }
2720
+ },
2721
+ // The seven below (2026-09-09) are deliberately unlike one another and unlike the landscapes
2722
+ // above: each is one idea pushed to the edge of what the generator allows. Land is capped at a
2723
+ // cast, so the idea lives in the water and nature seeds, which can go to full chroma.
2724
+ //
2725
+ // Fifteen is the ceiling for a three-character code: the preset index sits above bit 8, and
2726
+ // index 15 pushes every style past 62² (`preset.ts`). A sixteenth preset still works, at four
2727
+ // characters, but `preset.test.ts` holds the curated set to three.
2728
+ {
2729
+ // Lava for water, scorched olive for nature, warm ash land, a sulphur accent.
2730
+ name: "magma",
2731
+ seeds: { land: "#8A7A72", water: "#D6461A", nature: "#5C5A32", accent: "#FFC61A" }
2732
+ },
2733
+ {
2734
+ // Electric cyan water, acid-green nature, a violet cast on the land, hot-pink accent.
2735
+ name: "neon",
2736
+ seeds: { land: "#7C78A0", water: "#00D5F2", nature: "#8CE800", accent: "#FF2E9E" }
2737
+ },
2738
+ {
2739
+ // Bubblegum water, turquoise nature, a pink cast, a lemon accent.
2740
+ name: "candy",
2741
+ seeds: { land: "#A3808E", water: "#FF6FB5", nature: "#2ED1C2", accent: "#FFD400" }
2742
+ },
2743
+ {
2744
+ // Deep violet water, plum nature, violet land, a lime accent.
2745
+ name: "ultraviolet",
2746
+ seeds: { land: "#7A6E9E", water: "#5A2ECC", nature: "#9B4DCA", accent: "#C8FF3A" }
2747
+ },
2748
+ {
2749
+ // No chroma anywhere but the accent: a greyscale map with one red.
2750
+ name: "noir",
2751
+ seeds: { land: "#808080", water: "#6E6E6E", nature: "#707070", accent: "#E10600" }
2752
+ },
2753
+ {
2754
+ // Brown everything: a walnut cast, tea-coloured water, ochre nature, oxblood accent.
2755
+ name: "sepia",
2756
+ seeds: { land: "#8B7355", water: "#8C6A42", nature: "#A48A4A", accent: "#7A1F1F" }
2757
+ },
2758
+ {
2759
+ // Ultramarine water, navy-teal nature, a blue cast on the land, a coral accent.
2760
+ name: "ultramarine",
2761
+ seeds: { land: "#6F7A9C", water: "#1F3BFF", nature: "#215E7A", accent: "#FF6A4D" }
2143
2762
  }
2144
2763
  ];
2145
2764
  var wrap = (h) => (h % 360 + 360) % 360;
@@ -2247,7 +2866,11 @@ var STYLE_SLOTS = [
2247
2866
  "blush",
2248
2867
  "orchid",
2249
2868
  "canopy",
2250
- "lagoon"
2869
+ "lagoon",
2870
+ "tropic",
2871
+ "sunset",
2872
+ "bold",
2873
+ "pastel"
2251
2874
  ];
2252
2875
  var STYLE_BITS = 5n;
2253
2876
  var KIND_BITS = 2n;
@@ -2421,7 +3044,8 @@ function decodePreset(code) {
2421
3044
  rest >>= bits;
2422
3045
  return value;
2423
3046
  };
2424
- const base = STYLE_SLOTS[Number(take(STYLE_BITS))];
3047
+ const slot = STYLE_SLOTS[Number(take(STYLE_BITS))];
3048
+ const base = slot ? normalizeThemeBase(slot) : null;
2425
3049
  if (!base) throw new ThemeError("invalid theme", ["preset style is out of range"]);
2426
3050
  const kind = take(KIND_BITS);
2427
3051
  const hasLayers = take(1n) === 1n;
@@ -2540,6 +3164,77 @@ async function decodeDeflate(code) {
2540
3164
  }
2541
3165
  return validateTheme(parsed);
2542
3166
  }
3167
+
3168
+ // src/seeds-from-palette.ts
3169
+ var CHROMATIC_FLOOR = 0.04;
3170
+ var HUE_DEDUP = 20;
3171
+ var WATER_HUE = { lo: 190, hi: 270 };
3172
+ var NATURE_HUE = { lo: 100, hi: 170 };
3173
+ var DISPLAY_L = { lo: 0.35, hi: 0.7 };
3174
+ var wrapHue = (h) => (h % 360 + 360) % 360;
3175
+ var hueDelta = (a, b) => {
3176
+ const d = Math.abs(wrapHue(a) - wrapHue(b));
3177
+ return Math.min(d, 360 - d);
3178
+ };
3179
+ var inBand = (h, band) => {
3180
+ const hue = wrapHue(h);
3181
+ return hue >= band.lo && hue <= band.hi;
3182
+ };
3183
+ var normalizeHex = (hex) => {
3184
+ const raw = hex.startsWith("#") ? hex.slice(1) : hex;
3185
+ return `#${raw.slice(0, 6).toUpperCase()}`;
3186
+ };
3187
+ var parse = (color) => {
3188
+ if (!/^#?[0-9a-fA-F]{6}/.test(color.hex)) return null;
3189
+ const hex = normalizeHex(color.hex);
3190
+ const { l, c, h } = hexToOklch(hex);
3191
+ if (!Number.isFinite(l) || !Number.isFinite(c) || !Number.isFinite(h)) return null;
3192
+ return { hex, proportion: Math.max(color.proportion, 0), l, c, h, score: 0 };
3193
+ };
3194
+ var displaySeed = (color) => oklchToHex({
3195
+ l: Math.min(DISPLAY_L.hi, Math.max(DISPLAY_L.lo, color.l)),
3196
+ c: color.c,
3197
+ h: color.h
3198
+ });
3199
+ var byScore = (a, b) => b.score - a.score || b.proportion - a.proportion || a.hex.localeCompare(b.hex);
3200
+ var distinctHues = (ranked) => {
3201
+ const out = [];
3202
+ for (const color of ranked) {
3203
+ if (out.some((kept) => hueDelta(kept.h, color.h) < HUE_DEDUP)) continue;
3204
+ out.push(color);
3205
+ }
3206
+ return out;
3207
+ };
3208
+ var pickInBand = (candidates, band) => candidates.find((color) => inBand(color.h, band));
3209
+ function fromNeutrals(neutrals) {
3210
+ const mid = neutrals.slice().sort((a, b) => Math.abs(a.l - 0.5) - Math.abs(b.l - 0.5))[0] ?? parse({ hex: "#808080", proportion: 1 });
3211
+ const grey = displaySeed(mid);
3212
+ return { land: grey, water: grey, nature: grey, accent: DEFAULT_SEEDS.accent };
3213
+ }
3214
+ function seedsFromPalette(colors) {
3215
+ const parsed = colors.map(parse).filter((c) => c !== null);
3216
+ if (parsed.length === 0) return { ...DEFAULT_SEEDS };
3217
+ const chromatic = parsed.filter((c) => c.c >= CHROMATIC_FLOOR);
3218
+ if (chromatic.length === 0) return fromNeutrals(parsed);
3219
+ const total = chromatic.reduce((sum, c) => sum + c.proportion, 0) || 1;
3220
+ for (const color of chromatic) {
3221
+ color.score = 0.7 * (color.proportion / total) + 0.3 * Math.min(color.c / 0.15, 1);
3222
+ }
3223
+ const ranked = chromatic.slice().sort(byScore);
3224
+ const distinct = distinctHues(ranked);
3225
+ const land = distinct[0];
3226
+ const rest = distinct.slice(1);
3227
+ const water = pickInBand(rest, WATER_HUE) ?? rest[0] ?? land;
3228
+ const afterWater = distinct.filter((c) => c !== land && c !== water);
3229
+ const nature = pickInBand(afterWater, NATURE_HUE) ?? afterWater[0] ?? land;
3230
+ const accent = ranked.slice().sort((a, b) => b.c - a.c || byScore(a, b))[0];
3231
+ return {
3232
+ land: displaySeed(land),
3233
+ water: displaySeed(water),
3234
+ nature: displaySeed(nature),
3235
+ accent: accent.hex
3236
+ };
3237
+ }
2543
3238
  export {
2544
3239
  BUILDINGS_3D_LAYER_ID,
2545
3240
  DEFAULT_LAYER_VISIBILITY,
@@ -2559,21 +3254,26 @@ export {
2559
3254
  THEME_CODE_PREFIX,
2560
3255
  THEME_PRESETS,
2561
3256
  ThemeError,
3257
+ amber,
2562
3258
  applyThemeLayers,
2563
3259
  aqua,
3260
+ azure,
2564
3261
  buildRecipes,
2565
3262
  cobalt,
2566
3263
  contrast,
2567
3264
  contrastWarnings,
3265
+ coral,
2568
3266
  decodePreset,
2569
3267
  decodeTheme,
2570
3268
  effectiveLayerOrder,
2571
3269
  ember,
2572
3270
  encodePreset,
2573
3271
  encodeTheme,
3272
+ fern,
2574
3273
  generateTheme,
2575
3274
  graphite,
2576
3275
  hexToOklch,
3276
+ indigo,
2577
3277
  ink,
2578
3278
  isLayerVisible,
2579
3279
  isStockLayerOrder,
@@ -2582,17 +3282,20 @@ export {
2582
3282
  jade,
2583
3283
  layerGroupOf,
2584
3284
  lilac,
3285
+ linen,
2585
3286
  makeFlavor,
2586
3287
  mergeRecipe,
2587
3288
  mist,
2588
3289
  normalizeThemeBase,
2589
3290
  oklchToHex,
2590
3291
  paper,
3292
+ peach,
2591
3293
  presetId,
2592
3294
  registryThemeKey,
2593
3295
  resolveTheme,
2594
3296
  rose,
2595
3297
  sandstone,
3298
+ seedsFromPalette,
2596
3299
  shuffleSeeds,
2597
3300
  sky,
2598
3301
  validateTheme,