@tileflow/maps 0.1.0-alpha.10 → 0.1.0-alpha.12

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 CHANGED
@@ -157,15 +157,13 @@ own colors.
157
157
  southeast at dawn, southwest at dusk and western moonlight at night. Monochrome has distinct
158
158
  directions and strengths. Tileflow holds zoom 14+ values; Standard varies intensity below z14.
159
159
  Shading differs; `controller.setSun({date, location})` uses the real sun instead of presets.
160
+ Landmark material profiles and subtle dusk/night illumination are covered in
161
+ [3D buildings](https://github.com/tileflow/tileflow-sdk/blob/main/packages/core/docs/buildings-3d.md).
160
162
  The buildings' `threeDimensional.lighting` and `shadows` options control the effect, and each
161
163
  theme's `lighting.sun.shadowIntensity` and `lighting.ambient` control its strength.
162
164
  Street lights are opt-in: set `roads.streetLights.enabled: true`.
163
- Core's 3D renderer
164
- adds a soft ten-percent shade at the foot of the facades, fading within the lowest three metres
165
- (less on low buildings). Exterior corners have a 0.8 m radius and the roof/wall junction has a narrow
166
- lighting transition; roofs keep their authored colour. Streets enables soft three-metre contact
167
- shadows without dark overlaps; `buildings.threeDimensional.occlusion: false` disables them.
168
- Core replaces the extrusion fallback's blurred bands, styled by `buildings.contactShadow`.
165
+ Core adds contact shade and rounded exterior corners. `buildings.threeDimensional.occlusion: false`
166
+ disables contact shade and model ambient occlusion; `buildings.contactShadow` styles the flat fallback.
169
167
  Streets selects Core's `labels.roadPlacement: 'ground'`: street names follow the road plane below
170
168
  buildings; POIs, transit names and shields remain above. Disabling roads omits their names.
171
169
  Road rings, ramp and surface ordering use [Core's replaceable defaults](../core/docs/cartographic-defaults.md).
@@ -256,9 +254,9 @@ The GitHub-distributed `@tileflow/community-maps` package exports `cyberpunk`, `
256
254
  `superTileWorld`, plus each map's font and icon descriptors. Install an exact Git commit using
257
255
  the instructions and compatible Core version in that repository.
258
256
 
259
- Soundings is not a navigation product. Its depth-band edges are approximate reference geometry,
260
- not surveyed isolines or vessel-specific safety contours. Experimental nautical aids and hazards
261
- are not enabled by that official map.
257
+ Soundings is not a navigation product; its depth-band edges are approximate. It draws Nautical
258
+ marks with its chart symbols and a "Not for navigation" notice; other maps opt in with
259
+ `marine: 'nautical'` (see Core's Nautical marks guide).
262
260
 
263
261
  ## Themes and assets
264
262
 
@@ -105,16 +105,17 @@ attribution.
105
105
 
106
106
  ## Nautical-chart references
107
107
 
108
- The `soundings` map and its ten SVG symbols and patterns are original Tileflow code and artwork.
108
+ The `soundings` map and its eleven SVG symbols and patterns are original Tileflow code and artwork.
109
109
  Its visual grammar was informed by NOAA's
110
110
  [Historical Map & Chart Collection](https://historicalcharts.noaa.gov/) and the IHO
111
111
  [S-4 and INT 1 standards index](https://iho.int/standards-and-specifications) as cartographic
112
112
  references. This package does not include or redistribute NOAA chart images, IHO publication
113
113
  artwork, official symbol sheets, fonts, hydrographic surveys, or navigation data.
114
114
 
115
- The map can visualize broad GEBCO-derived bathymetric bands exposed by the selected Tileflow data
116
- source. Those bands are not packaged here and are not navigation-grade soundings. Soundings is a
117
- general-purpose visual map, not a nautical chart for navigation.
115
+ The map can visualize broad GEBCO-derived bathymetric bands and `nautical-v1` navigation marks
116
+ exposed by the selected data sources. Neither is packaged here; the bands are not navigation-grade
117
+ soundings, and the marks keep the attribution of their own source. Soundings is a general-purpose
118
+ visual map, not a nautical chart for navigation.
118
119
 
119
120
  ## Siegfried Map reference and terrain data
120
121
 
package/assets/README.md CHANGED
@@ -66,15 +66,18 @@ wetland. The 18 runtime IDs use `siegfried-<motif>` for the historical light tre
66
66
  packaged Cormorant Garamond faces selected by both themes. See `siegfried/README.md` and the
67
67
  package-level `THIRD_PARTY_NOTICES.md` for provenance and licensing.
68
68
 
69
- The Soundings directory contains ten original nautical symbols and intrinsic-size patterns:
69
+ The Soundings directory contains eleven original nautical symbols and intrinsic-size patterns:
70
70
  `soundings-harbor`, `soundings-lighthouse`, `soundings-light-flare`, `soundings-buoy-port`,
71
- `soundings-buoy-starboard`, `soundings-buoy-cardinal`, `soundings-wreck`,
72
- `soundings-rock-awash`, `soundings-paper-grain`, and `soundings-water-dots`. They express familiar
73
- paper-chart concepts without bundling a historical chart, specification artwork, or navigation
74
- data. Official Soundings references only `soundings-paper-grain` and `soundings-water-dots`;
75
- the eight point symbols remain available to the separate experimental Nautical canary. A generic
76
- World POI is deliberately not relabelled as a harbour. Soundings uses GEBCO-derived depth bands only
77
- as broad cartographic context and is not a navigation product.
71
+ `soundings-buoy-starboard`, `soundings-buoy-cardinal`, `soundings-buoy-pillar`,
72
+ `soundings-wreck`, `soundings-rock-awash`, `soundings-paper-grain`, and `soundings-water-dots`.
73
+ They express familiar paper-chart concepts without bundling a historical chart, specification
74
+ artwork, or navigation data. Official Soundings draws its paper and water patterns and, through
75
+ theme `nautical.*` image tokens, the buoy, light, lighthouse, wreck, and harbor symbols for its
76
+ Nautical marks. `tileflow.icons.json` declares those eight point symbols as SDF icons, drawn in the
77
+ central 12 of 24 pixels, so each mark takes its own colour; `soundings-rock-awash` remains
78
+ fixed-colour artwork and is unused because rocks are drawn as chart crosses. A generic World POI is
79
+ deliberately not relabelled as a harbour. Soundings uses GEBCO-derived depth bands only as broad
80
+ cartographic context, and neither it nor its Nautical marks is a navigation product.
78
81
 
79
82
  The Blueprint directory contains four original intrinsic-size patterns and one original
80
83
  technical symbol: `blueprint-grid`, `blueprint-building-hatch`,
@@ -1,4 +1,4 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="-16 -16 64 64">
2
2
  <title>Cardinal buoy</title>
3
3
  <desc>Original Tileflow double-cone cardinal buoy pictogram.</desc>
4
4
  <g fill="#000000">
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="-16 -16 64 64">
2
+ <title>Pillar buoy</title>
3
+ <desc>Original Tileflow pillar buoy pictogram for buoys without a lateral or cardinal shape.</desc>
4
+ <g fill="#000000">
5
+ <circle cx="16" cy="4.4" r="2.6"/>
6
+ <rect x="14.7" y="5.6" width="2.6" height="8"/>
7
+ <path d="M11.4 12.4h9.2l2.7 14.3H8.7l2.7-14.3Z"/>
8
+ <path d="M5.5 28.1h21a1.3 1.3 0 0 1 0 2.6h-21a1.3 1.3 0 0 1 0-2.6Z"/>
9
+ </g>
10
+ </svg>
@@ -1,4 +1,4 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="-16 -16 64 64">
2
2
  <title>Port-hand buoy</title>
3
3
  <desc>Original Tileflow can-shaped lateral buoy pictogram.</desc>
4
4
  <g fill="#000000">
@@ -1,4 +1,4 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="-16 -16 64 64">
2
2
  <title>Starboard-hand buoy</title>
3
3
  <desc>Original Tileflow conical lateral buoy pictogram.</desc>
4
4
  <g fill="#000000">
@@ -1,4 +1,4 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="-16 -16 64 64">
2
2
  <title>Harbor</title>
3
3
  <desc>Original Tileflow anchor pictogram.</desc>
4
4
  <g fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.4">
@@ -1,4 +1,4 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="-16 -16 64 64">
2
2
  <title>Navigational light flare</title>
3
3
  <desc>Original Tileflow radial light pictogram.</desc>
4
4
  <g fill="none" stroke="#000000" stroke-linecap="round" stroke-width="2.2">
@@ -1,4 +1,4 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="-16 -16 64 64">
2
2
  <title>Lighthouse</title>
3
3
  <desc>Original Tileflow lighthouse silhouette.</desc>
4
4
  <g fill="#000000">
@@ -1,4 +1,4 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="-16 -16 64 64">
2
2
  <title>Wreck</title>
3
3
  <desc>Original Tileflow broken-hull wreck pictogram.</desc>
4
4
  <path d="M6.2 18.2h7.3l2.5 3.2 2.5-3.2h7.3l-3.4 8.3H9.6l-3.4-8.3Z" fill="#000000"/>
@@ -0,0 +1,37 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "icons": {
4
+ "soundings-buoy-cardinal": {
5
+ "representation": "sdf",
6
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
7
+ },
8
+ "soundings-buoy-pillar": {
9
+ "representation": "sdf",
10
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
11
+ },
12
+ "soundings-buoy-port": {
13
+ "representation": "sdf",
14
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
15
+ },
16
+ "soundings-buoy-starboard": {
17
+ "representation": "sdf",
18
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
19
+ },
20
+ "soundings-harbor": {
21
+ "representation": "sdf",
22
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
23
+ },
24
+ "soundings-light-flare": {
25
+ "representation": "sdf",
26
+ "defaults": {"color": "#B12A73", "haloColor": "#F7FBF8", "haloWidth": 0.5, "haloBlur": 0}
27
+ },
28
+ "soundings-lighthouse": {
29
+ "representation": "sdf",
30
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
31
+ },
32
+ "soundings-wreck": {
33
+ "representation": "sdf",
34
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
35
+ }
36
+ }
37
+ }
package/dist/index.d.ts CHANGED
@@ -769,7 +769,7 @@ declare const soundings: {
769
769
  readonly projection: "mercator";
770
770
  readonly marine: {
771
771
  readonly bathymetry: _tileflow_core.TileflowBathymetryConfig;
772
- readonly nautical: false;
772
+ readonly nautical: {};
773
773
  };
774
774
  readonly terrain: "none";
775
775
  readonly modules: {
@@ -786,6 +786,7 @@ declare const soundings: {
786
786
  readonly labels: _tileflow_core.TileflowLabelsModuleConfig;
787
787
  readonly land: _tileflow_core.TileflowLandModuleConfig;
788
788
  readonly landforms: _tileflow_core.TileflowLandformsModuleConfig;
789
+ readonly nautical: _tileflow_core.TileflowNauticalModuleConfig;
789
790
  readonly poi: Readonly<{
790
791
  readonly op: "disable";
791
792
  }>;
package/dist/index.js CHANGED
@@ -103,6 +103,7 @@ var ownerTokenGroups = {
103
103
  labels: ["labels", "poi", "transit"],
104
104
  land: ["land", "landcover", "landuse", "surface"],
105
105
  landforms: ["landforms", "labels", "surface"],
106
+ nautical: ["hydro", "labels", "poi", "surface"],
106
107
  poi: ["poi", "labels", "transit"],
107
108
  roads: ["roads"],
108
109
  terrain: ["terrain", "landcover", "surface", "labels"],
@@ -230,6 +231,10 @@ function bindOfficialMapTheme(map) {
230
231
  }
231
232
  const bind = (value, path, owner, semanticPath, insideExpression = false, property) => {
232
233
  if (property !== void 0 && classifyTileflowVisualProperty(property, value) === "number") {
234
+ if (Array.isArray(value) && path.includes(".modelLighting.") && ["emissiveHeight", "hue", "saturation", "lightness"].includes(property))
235
+ return value.map(
236
+ (entry, index) => bindNumericOutput(entry, `${path}[${index}]`, `${semanticPath}.${index}`)
237
+ );
233
238
  return bindNumericOutput(value, path, semanticPath);
234
239
  }
235
240
  if (typeof value === "string") {
@@ -7405,6 +7410,7 @@ import {
7405
7410
  labels as labels6,
7406
7411
  land as land6,
7407
7412
  landforms as landforms6,
7413
+ nautical,
7408
7414
  renderPass as renderPass7,
7409
7415
  transit as transit6,
7410
7416
  water as water6,
@@ -7515,6 +7521,19 @@ var soundingsTheme = defineOfficialTheme({
7515
7521
  rail: soundingsPalette.inkMuted
7516
7522
  }
7517
7523
  },
7524
+ // Nautical marks use the chart symbols of this directory. They are single-colour silhouettes:
7525
+ // buoys and light flares take each mark's own colour from the data, the others print in ink.
7526
+ images: {
7527
+ "nautical.buoy": "soundings-buoy-pillar",
7528
+ "nautical.buoy.cardinal": "soundings-buoy-cardinal",
7529
+ "nautical.buoy.port": "soundings-buoy-port",
7530
+ "nautical.buoy.starboard": "soundings-buoy-starboard",
7531
+ "nautical.harbour": "soundings-harbor",
7532
+ "nautical.light": "soundings-light-flare",
7533
+ "nautical.lighthouse": "soundings-lighthouse",
7534
+ "nautical.port": "soundings-harbor",
7535
+ "nautical.wreck": "soundings-wreck"
7536
+ },
7518
7537
  typography: {
7519
7538
  font: "Noto Sans Regular",
7520
7539
  letterSpacing: 0.025,
@@ -7530,6 +7549,7 @@ var soundingsTheme = defineOfficialTheme({
7530
7549
  position: [1.15, 210, 28]
7531
7550
  }
7532
7551
  });
7552
+ var chartInk = { color: soundingsPalette.ink, haloColor: soundingsPalette.water };
7533
7553
  var soundings = bindOfficialMapTheme(
7534
7554
  defineMap6({
7535
7555
  id: "soundings",
@@ -7562,7 +7582,7 @@ var soundings = bindOfficialMapTheme(
7562
7582
  })
7563
7583
  }
7564
7584
  }),
7565
- nautical: false
7585
+ nautical: {}
7566
7586
  },
7567
7587
  terrain: "none",
7568
7588
  modules: {
@@ -7834,9 +7854,21 @@ var soundings = bindOfficialMapTheme(
7834
7854
  }
7835
7855
  }
7836
7856
  }),
7857
+ // Marks keep the module's data-driven colours and placement; Soundings only sets its
7858
+ // printed ink. Technical magenta stays on operational areas, traffic separation and cables.
7859
+ nautical: nautical({
7860
+ beacons: { marker: { strokeColor: soundingsPalette.ink } },
7861
+ buoys: { icon: { haloColor: soundingsPalette.ink }, text: chartInk },
7862
+ harbours: { icon: chartInk, text: { ...chartInk, color: soundingsPalette.inkMuted } },
7863
+ hazards: { marker: { strokeColor: soundingsPalette.ink }, text: chartInk },
7864
+ lighthouses: { icon: chartInk, text: chartInk },
7865
+ lights: { text: { ...chartInk, color: soundingsPalette.inkMuted } },
7866
+ ports: { icon: chartInk, text: chartInk },
7867
+ wrecks: { icon: chartInk, text: chartInk }
7868
+ }),
7837
7869
  // A broad transport category also contains airports, bus terminals and rail stations.
7838
- // Painting all of them with a harbor glyph would be semantically false; Soundings waits
7839
- // for its dedicated nautical harbor layer instead of reinterpreting the World POI contract.
7870
+ // Painting all of them with a harbor glyph would be semantically false; harbours and ports
7871
+ // come from the dedicated Nautical layer instead of reinterpreting the World POI contract.
7840
7872
  poi: disable4(),
7841
7873
  roads: disable4(),
7842
7874
  transit: withRenderStack7(
@@ -8165,6 +8197,7 @@ import {
8165
8197
  refineRenderTarget as refineRenderTarget5,
8166
8198
  renderPass as renderPass10,
8167
8199
  roads as roads6,
8200
+ token as token9,
8168
8201
  transit as transit7,
8169
8202
  water as water7,
8170
8203
  withRenderStack as withRenderStack10,
@@ -9969,6 +10002,46 @@ var streetsLighting = {
9969
10002
  monochrome: monochromeLighting
9970
10003
  };
9971
10004
 
10005
+ // src/official/streets-model-lighting.ts
10006
+ function streetsModelLighting(preset, family) {
10007
+ const mono = family === "monochrome";
10008
+ const dark = preset === "dusk" || preset === "night";
10009
+ const brightness = mono ? { day: 0.5027777777777778, dawn: 0.41869713699376476, dusk: 0.01331186036230345, night: 0 }[preset] : {
10010
+ day: 0.4777777777777778,
10011
+ dawn: 0.3964860412365071,
10012
+ dusk: 0.026970197755280183,
10013
+ night: 0.013517295842482737
10014
+ }[preset];
10015
+ const share = (low, high) => Math.min(1, Math.max(0, (brightness - low) / (high - low)));
10016
+ const day = share(0.2, 0.4), window = share(0, 0.15), neutral = share(0.16, 0.4);
10017
+ const wall = !dark ? "#FFFFFF" : mono ? preset === "dusk" ? "#F1F1F1" : "#F0F0F0" : family === "faded" ? preset === "dusk" ? "#FDF0DD" : "#FDEFD9" : preset === "dusk" ? "#FDE6CD" : "#FDE4C8";
10018
+ return {
10019
+ colors: {
10020
+ "buildings.modelEmission": wall,
10021
+ "buildings.modelRoof": mono ? "#F3F3F3" : family === "faded" ? "#FDF5EF" : "#FDF1E9"
10022
+ },
10023
+ numbers: {
10024
+ "buildings.modelEmission.strength": (0.1 + 0.7 * share(0.45, 0.5)) * (mono && dark ? 0.5 : 1),
10025
+ "buildings.modelEmission.start": 0.5 * (1 - day),
10026
+ "buildings.modelEmission.end": day,
10027
+ "buildings.modelEmission.curve": 0.8 - 0.2 * day,
10028
+ "buildings.modelDoor.strength": (mono ? 0.2 : 1.5) * (1 - day) + 2.5 * day,
10029
+ "buildings.modelLogo.mix": 0.3 * day,
10030
+ "buildings.modelWindow.strength": (mono ? 0.1 : 0.5) * (1 - day) + 0.4 * day,
10031
+ "buildings.modelWindow.variation": 0.3 * (1 - day),
10032
+ "buildings.modelWindow.hueLow": 200 * window,
10033
+ "buildings.modelWindow.hueHigh": 90 + 125 * window,
10034
+ "buildings.modelWindow.saturationLow": mono ? 0 : 20 + 80 * window,
10035
+ "buildings.modelWindow.saturationHigh": mono ? 0 : 100,
10036
+ "buildings.modelWindow.lightnessLow": 87 - 17 * window,
10037
+ "buildings.modelWindow.lightnessHigh": 87 - 7 * window,
10038
+ "buildings.modelOther.saturation": mono ? 0 : 55 * (1 - neutral),
10039
+ "buildings.modelOther.lightnessLow": 80 + 20 * neutral,
10040
+ "buildings.modelOther.lightnessHigh": 90 + 10 * neutral
10041
+ }
10042
+ };
10043
+ }
10044
+
9972
10045
  // src/official/streets-road-colors.ts
9973
10046
  var standardRoadCasingProfiles = {
9974
10047
  "default-dawn": {
@@ -10657,7 +10730,19 @@ function calibratedStreetsColors(preset, theme) {
10657
10730
  function streetsPaletteColors(preset, colorTheme) {
10658
10731
  return {
10659
10732
  ...calibratedStreetsColors(preset, colorTheme),
10660
- ...streetsCartographyColors(colorTheme, preset)
10733
+ ...streetsCartographyColors(colorTheme, preset),
10734
+ "buildings.floodLight": !isDarkStreetsPreset(preset) ? "#FFFFFF" : colorTheme === "monochrome" ? "#E5E5E5" : colorTheme === "faded" ? "#F8E4C4" : "#F5CFA8",
10735
+ ...streetsModelLighting(preset, colorTheme).colors
10736
+ };
10737
+ }
10738
+ function streetsLightingNumbers(preset, colorTheme) {
10739
+ const dark = isDarkStreetsPreset(preset);
10740
+ return {
10741
+ "buildings.floodLight.intensity": dark && colorTheme !== "monochrome" ? 0.3 : 0,
10742
+ // Light colours already include the Faded lookup table; lamp activation uses the
10743
+ // corresponding untransformed brightness, independently of that appearance change.
10744
+ "buildings.floodLight.brightnessScale": colorTheme === "faded" ? { day: 1, dawn: 0.9203658119566795, dusk: 0.47333738050439994, night: 0.42688225390661877 }[preset] : 1,
10745
+ ...streetsModelLighting(preset, colorTheme).numbers
10661
10746
  };
10662
10747
  }
10663
10748
  var streetsFonts = {
@@ -10692,7 +10777,7 @@ var streetsLightTheme = defineTheme3({
10692
10777
  colorScheme: "light",
10693
10778
  tokens: {
10694
10779
  color: streetsPaletteColors("day", "default"),
10695
- number: {},
10780
+ number: streetsLightingNumbers("day", "default"),
10696
10781
  font: streetsFonts,
10697
10782
  image: { ...streetsImages, ...streetsPoiImageTokens("light") }
10698
10783
  },
@@ -10718,7 +10803,7 @@ var streetsDarkTheme = defineTheme3({
10718
10803
  colorScheme: "dark",
10719
10804
  tokens: {
10720
10805
  color: streetsPaletteColors("night", "default"),
10721
- number: {},
10806
+ number: streetsLightingNumbers("night", "default"),
10722
10807
  font: streetsFonts,
10723
10808
  image: {
10724
10809
  ...streetsImages,
@@ -10756,6 +10841,7 @@ function defineStreetsPaletteTheme(name, preset, colorTheme) {
10756
10841
  lighting: streetsLighting[colorTheme][preset],
10757
10842
  tokens: {
10758
10843
  color: streetsPaletteColors(preset, colorTheme),
10844
+ number: streetsLightingNumbers(preset, colorTheme),
10759
10845
  ...imageVariant ? { image: streetsPoiImageTokens(imageVariant) } : {}
10760
10846
  }
10761
10847
  });
@@ -13202,8 +13288,78 @@ var streets = bindOfficialMapTheme(
13202
13288
  }),
13203
13289
  buildings: withRenderStack10(
13204
13290
  buildings6({
13291
+ // Footprints; the render stack's extrusion pass raises them from z15, and its shadows
13292
+ // stand beside the flat fill, so they require this mode.
13205
13293
  mode: "flat",
13206
- // 'flat' | '3d'.
13294
+ threeDimensional: {
13295
+ floodLight: {
13296
+ intensity: token9.number("buildings.floodLight.intensity"),
13297
+ brightnessScale: token9.number("buildings.floodLight.brightnessScale"),
13298
+ color: token9.color("buildings.floodLight")
13299
+ },
13300
+ modelLighting: {
13301
+ wall: {
13302
+ emissiveStrength: token9.number("buildings.modelEmission.strength"),
13303
+ emissiveColor: token9.color("buildings.modelEmission"),
13304
+ emissiveHeight: [
13305
+ token9.number("buildings.modelEmission.start"),
13306
+ token9.number("buildings.modelEmission.end"),
13307
+ 0,
13308
+ 1,
13309
+ token9.number("buildings.modelEmission.curve")
13310
+ ],
13311
+ color: token9.color("buildings.modelEmission"),
13312
+ roughness: 1,
13313
+ metallic: 0
13314
+ },
13315
+ roof: { color: token9.color("buildings.modelRoof"), roughness: 1, metallic: 0 },
13316
+ window: {
13317
+ roughness: 0,
13318
+ metallic: 1,
13319
+ emissiveStrength: token9.number("buildings.modelWindow.strength"),
13320
+ emissiveVariation: token9.number("buildings.modelWindow.variation"),
13321
+ emissiveHeight: [0, 0.9, 0, 1, 0.5],
13322
+ colorVariation: {
13323
+ hue: [
13324
+ token9.number("buildings.modelWindow.hueLow"),
13325
+ token9.number("buildings.modelWindow.hueHigh")
13326
+ ],
13327
+ saturation: [
13328
+ token9.number("buildings.modelWindow.saturationLow"),
13329
+ token9.number("buildings.modelWindow.saturationHigh")
13330
+ ],
13331
+ lightness: [
13332
+ token9.number("buildings.modelWindow.lightnessLow"),
13333
+ token9.number("buildings.modelWindow.lightnessHigh")
13334
+ ],
13335
+ space: "linear"
13336
+ }
13337
+ },
13338
+ ...Object.fromEntries(
13339
+ ["unclassified", "door", "lamp", "logo"].map((role) => [
13340
+ role,
13341
+ {
13342
+ roughness: 1,
13343
+ metallic: 0,
13344
+ emissiveStrength: role === "door" ? token9.number("buildings.modelDoor.strength") : role === "logo" ? 0.6 : 0,
13345
+ colorMix: role === "logo" ? token9.number("buildings.modelLogo.mix") : 1,
13346
+ colorVariation: {
13347
+ hue: [10, 70],
13348
+ saturation: [
13349
+ token9.number("buildings.modelOther.saturation"),
13350
+ token9.number("buildings.modelOther.saturation")
13351
+ ],
13352
+ lightness: [
13353
+ token9.number("buildings.modelOther.lightnessLow"),
13354
+ token9.number("buildings.modelOther.lightnessHigh")
13355
+ ],
13356
+ space: "linear"
13357
+ }
13358
+ }
13359
+ ])
13360
+ )
13361
+ }
13362
+ },
13207
13363
  businessCorridor: {
13208
13364
  // This compatibility layer contains selected building footprints,
13209
13365
  // not ground. Streets renders the derived business_area class through
@@ -99,18 +99,23 @@ depth-graded water, labelled band edges, continuous colour relief, multidirectio
99
99
  port context, named ferry routes, and restrained technical magenta. Its initial camera faces the
100
100
  Strait of Gibraltar, allowing an Iberian GEBCO pilot to exercise both Atlantic and Mediterranean
101
101
  relief. It selects the public semantic compiler contract without importing or extending `streets`
102
- and explicitly composes World with `bathymetry({display: 'hybrid'})` while setting Nautical to
103
- `false`.
102
+ and explicitly composes World with `bathymetry({display: 'hybrid'})` and the `nautical-v1`
103
+ navigation marks.
104
104
 
105
105
  Vector bands come from `tileflow-bathymetry`; continuous colour relief and hillshade come from
106
- `tileflow-bathymetry-dem`. The stronger DEM treatment is balanced against the vector wash and depth
107
- labels rather than against experimental navigation symbols. Dashed outlines remain an honest
106
+ `tileflow-bathymetry-dem`. The DEM treatment is balanced against the vector wash, depth labels, and
107
+ the navigation marks. Dashed outlines remain an honest
108
108
  fallback traced from broad GEBCO band polygons until native contour geometry is released. Labels
109
109
  show the absolute `min_depth` value, not an inferred range or vessel-specific safety contour.
110
- Harbours and ferries are ordinary World context. Experimental `nautical-v1` tiles, aids, lights,
111
- soundings, hazards, reefs, and wrecks are deliberately absent from the official map and remain
112
- available only to explicitly configured laboratory maps. Soundings is reference cartography and is
113
- not a navigation product.
110
+ Ferries are ordinary World context. Navigation marks come from `tileflow-nautical`: the theme's
111
+ `nautical.*` image tokens select the Soundings chart symbols for buoys (port can, starboard cone,
112
+ cardinal double cone, and a pillar for other buoys), lights, lighthouses, wrecks, harbours, and
113
+ ports. Buoys and light flares take each mark's own colour from the data; beacons stay small coloured
114
+ dots, rocks are chart crosses and stars, and lighthouse, wreck, harbour, and port symbols are
115
+ printed in the chart ink. Technical magenta remains reserved for operational overlays: restricted,
116
+ military, anchorage, and traffic-separation areas, traffic-separation lines, and cables. Coverage is
117
+ a faint tint before marks appear. The map shows a "Not for navigation" notice wherever it is
118
+ displayed. Soundings is reference cartography and is not a navigation product.
114
119
 
115
120
  ## siegfried
116
121
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tileflow/maps",
3
- "version": "0.1.0-alpha.10",
3
+ "version": "0.1.0-alpha.12",
4
4
  "license": "Apache-2.0",
5
5
  "description": "Official themed Streets, Baedeker, Cívica, 1777, Siegfried, Soundings, and Blueprint maps for Tileflow.",
6
6
  "type": "module",
@@ -52,12 +52,12 @@
52
52
  "access": "public"
53
53
  },
54
54
  "peerDependencies": {
55
- "@tileflow/core": ">=0.1.0-alpha.36 <0.1.0-beta.0"
55
+ "@tileflow/core": ">=0.1.0-alpha.38 <0.1.0-beta.0"
56
56
  },
57
57
  "devDependencies": {
58
58
  "@maplibre/maplibre-gl-style-spec": "24.8.5",
59
59
  "@maplibre/maplibre-gl-style-spec-v6": "npm:@maplibre/maplibre-gl-style-spec@26.4.4",
60
- "@tileflow/core": "0.1.0-alpha.36"
60
+ "@tileflow/core": "0.1.0-alpha.38"
61
61
  },
62
62
  "scripts": {
63
63
  "build": "tsup src/index.ts --format esm --dts --clean --no-splitting",