@sqlrooms/deck 0.29.0-rc.10 → 0.29.0-rc.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.
Files changed (173) hide show
  1. package/README.md +88 -16
  2. package/dist/BlockMapSettings.d.ts.map +1 -1
  3. package/dist/BlockMapSettings.js +4 -16
  4. package/dist/BlockMapSettings.js.map +1 -1
  5. package/dist/DashboardMapSettings.d.ts.map +1 -1
  6. package/dist/DashboardMapSettings.js +7 -10
  7. package/dist/DashboardMapSettings.js.map +1 -1
  8. package/dist/DeckJsonMap.d.ts.map +1 -1
  9. package/dist/DeckJsonMap.js +20 -18
  10. package/dist/DeckJsonMap.js.map +1 -1
  11. package/dist/DeckJsonMapSpec.d.ts +916 -53
  12. package/dist/DeckJsonMapSpec.d.ts.map +1 -1
  13. package/dist/DeckJsonMapSpec.js +9 -0
  14. package/dist/DeckJsonMapSpec.js.map +1 -1
  15. package/dist/DeckMapDefaultStylesProvider.d.ts +3 -4
  16. package/dist/DeckMapDefaultStylesProvider.d.ts.map +1 -1
  17. package/dist/DeckMapDefaultStylesProvider.js +13 -7
  18. package/dist/DeckMapDefaultStylesProvider.js.map +1 -1
  19. package/dist/DeckMapSurface.d.ts +1 -1
  20. package/dist/DeckMapSurface.js +1 -1
  21. package/dist/DeckMapSurface.js.map +1 -1
  22. package/dist/MapSettings.d.ts +14 -0
  23. package/dist/MapSettings.d.ts.map +1 -1
  24. package/dist/MapSettings.js +555 -186
  25. package/dist/MapSettings.js.map +1 -1
  26. package/dist/MapSettingsControls.d.ts +8 -1
  27. package/dist/MapSettingsControls.d.ts.map +1 -1
  28. package/dist/MapSettingsControls.js +24 -2
  29. package/dist/MapSettingsControls.js.map +1 -1
  30. package/dist/ai.d.ts +19 -5
  31. package/dist/ai.d.ts.map +1 -1
  32. package/dist/ai.js +63 -112
  33. package/dist/ai.js.map +1 -1
  34. package/dist/aiNormalize.d.ts +31 -0
  35. package/dist/aiNormalize.d.ts.map +1 -0
  36. package/dist/aiNormalize.js +630 -0
  37. package/dist/aiNormalize.js.map +1 -0
  38. package/dist/block.d.ts +1 -1
  39. package/dist/block.d.ts.map +1 -1
  40. package/dist/block.js +1 -1
  41. package/dist/block.js.map +1 -1
  42. package/dist/createOrUpdateDeckMapResource.d.ts +6 -2
  43. package/dist/createOrUpdateDeckMapResource.d.ts.map +1 -1
  44. package/dist/createOrUpdateDeckMapResource.js +57 -4
  45. package/dist/createOrUpdateDeckMapResource.js.map +1 -1
  46. package/dist/dashboard.d.ts.map +1 -1
  47. package/dist/dashboard.js +72 -8
  48. package/dist/dashboard.js.map +1 -1
  49. package/dist/dashboardConfig.d.ts +10 -1
  50. package/dist/dashboardConfig.d.ts.map +1 -1
  51. package/dist/dashboardConfig.js +55 -22
  52. package/dist/dashboardConfig.js.map +1 -1
  53. package/dist/datasets/PreparedDatasetStore.d.ts +3 -4
  54. package/dist/datasets/PreparedDatasetStore.d.ts.map +1 -1
  55. package/dist/datasets/PreparedDatasetStore.js +35 -10
  56. package/dist/datasets/PreparedDatasetStore.js.map +1 -1
  57. package/dist/datasets/helpers.d.ts +39 -2
  58. package/dist/datasets/helpers.d.ts.map +1 -1
  59. package/dist/datasets/helpers.js +86 -3
  60. package/dist/datasets/helpers.js.map +1 -1
  61. package/dist/datasets/usePreparedDatasetStates.d.ts.map +1 -1
  62. package/dist/datasets/usePreparedDatasetStates.js +12 -8
  63. package/dist/datasets/usePreparedDatasetStates.js.map +1 -1
  64. package/dist/datasets/wrapGeometryAsWkb.d.ts +20 -0
  65. package/dist/datasets/wrapGeometryAsWkb.d.ts.map +1 -0
  66. package/dist/datasets/wrapGeometryAsWkb.js +65 -0
  67. package/dist/datasets/wrapGeometryAsWkb.js.map +1 -0
  68. package/dist/index.d.ts +3 -2
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +2 -1
  71. package/dist/index.js.map +1 -1
  72. package/dist/json/colorScaleFunction.d.ts +12 -4
  73. package/dist/json/colorScaleFunction.d.ts.map +1 -1
  74. package/dist/json/colorScaleFunction.js.map +1 -1
  75. package/dist/json/compileColorScale.d.ts +3 -2
  76. package/dist/json/compileColorScale.d.ts.map +1 -1
  77. package/dist/json/compileColorScale.js +16 -1
  78. package/dist/json/compileColorScale.js.map +1 -1
  79. package/dist/json/compileGeoArrowAccessor.d.ts +5 -0
  80. package/dist/json/compileGeoArrowAccessor.d.ts.map +1 -1
  81. package/dist/json/compileGeoArrowAccessor.js +17 -3
  82. package/dist/json/compileGeoArrowAccessor.js.map +1 -1
  83. package/dist/json/createDeckJsonConfiguration.d.ts.map +1 -1
  84. package/dist/json/createDeckJsonConfiguration.js +278 -151
  85. package/dist/json/createDeckJsonConfiguration.js.map +1 -1
  86. package/dist/json/defaultClasses.d.ts.map +1 -1
  87. package/dist/json/defaultClasses.js +3 -3
  88. package/dist/json/defaultClasses.js.map +1 -1
  89. package/dist/json/extractColorScaleLegends.d.ts.map +1 -1
  90. package/dist/json/extractColorScaleLegends.js +43 -14
  91. package/dist/json/extractColorScaleLegends.js.map +1 -1
  92. package/dist/json/heatmapDefaults.d.ts +17 -7
  93. package/dist/json/heatmapDefaults.d.ts.map +1 -1
  94. package/dist/json/heatmapDefaults.js +54 -12
  95. package/dist/json/heatmapDefaults.js.map +1 -1
  96. package/dist/json/layers/DeckH3HexagonLayer.d.ts.map +1 -1
  97. package/dist/json/layers/DeckH3HexagonLayer.js +9 -14
  98. package/dist/json/layers/DeckH3HexagonLayer.js.map +1 -1
  99. package/dist/json/layers/DeckHeatmapLayer.d.ts +32 -0
  100. package/dist/json/layers/DeckHeatmapLayer.d.ts.map +1 -0
  101. package/dist/json/layers/DeckHeatmapLayer.js +69 -0
  102. package/dist/json/layers/DeckHeatmapLayer.js.map +1 -0
  103. package/dist/json/layers/h3IndexFormat.d.ts +6 -0
  104. package/dist/json/layers/h3IndexFormat.d.ts.map +1 -0
  105. package/dist/json/layers/h3IndexFormat.js +17 -0
  106. package/dist/json/layers/h3IndexFormat.js.map +1 -0
  107. package/dist/json/layers/index.d.ts +2 -0
  108. package/dist/json/layers/index.d.ts.map +1 -1
  109. package/dist/json/layers/index.js +2 -0
  110. package/dist/json/layers/index.js.map +1 -1
  111. package/dist/json/rewriteGeoArrowAccessors.d.ts.map +1 -1
  112. package/dist/json/rewriteGeoArrowAccessors.js +22 -5
  113. package/dist/json/rewriteGeoArrowAccessors.js.map +1 -1
  114. package/dist/json/scaleFunction.d.ts +27 -0
  115. package/dist/json/scaleFunction.d.ts.map +1 -0
  116. package/dist/json/scaleFunction.js +151 -0
  117. package/dist/json/scaleFunction.js.map +1 -0
  118. package/dist/mapAiConfig.d.ts +8 -0
  119. package/dist/mapAiConfig.d.ts.map +1 -1
  120. package/dist/mapAiConfig.js +9 -1
  121. package/dist/mapAiConfig.js.map +1 -1
  122. package/dist/mapAiSharedInstructions.d.ts +3 -0
  123. package/dist/mapAiSharedInstructions.d.ts.map +1 -0
  124. package/dist/mapAiSharedInstructions.js +16 -0
  125. package/dist/mapAiSharedInstructions.js.map +1 -0
  126. package/dist/mapConfig.d.ts +7 -1
  127. package/dist/mapConfig.d.ts.map +1 -1
  128. package/dist/mapConfig.js.map +1 -1
  129. package/dist/mapConfigUtils.d.ts +22 -0
  130. package/dist/mapConfigUtils.d.ts.map +1 -1
  131. package/dist/mapConfigUtils.js +147 -3
  132. package/dist/mapConfigUtils.js.map +1 -1
  133. package/dist/mapFit.d.ts +16 -0
  134. package/dist/mapFit.d.ts.map +1 -1
  135. package/dist/mapFit.js +208 -30
  136. package/dist/mapFit.js.map +1 -1
  137. package/dist/mapLayerConfigUtils.d.ts +64 -1
  138. package/dist/mapLayerConfigUtils.d.ts.map +1 -1
  139. package/dist/mapLayerConfigUtils.js +277 -16
  140. package/dist/mapLayerConfigUtils.js.map +1 -1
  141. package/dist/mapResourceAuthoring.d.ts +3 -1
  142. package/dist/mapResourceAuthoring.d.ts.map +1 -1
  143. package/dist/mapResourceAuthoring.js +413 -20
  144. package/dist/mapResourceAuthoring.js.map +1 -1
  145. package/dist/mosaic.d.ts +1 -1
  146. package/dist/mosaic.d.ts.map +1 -1
  147. package/dist/mosaic.js.map +1 -1
  148. package/dist/prepare/geoarrow.js.map +1 -1
  149. package/dist/prepare/prepareDeckDataset.d.ts.map +1 -1
  150. package/dist/prepare/prepareDeckDataset.js +1 -0
  151. package/dist/prepare/prepareDeckDataset.js.map +1 -1
  152. package/dist/prepare/types.d.ts +3 -0
  153. package/dist/prepare/types.d.ts.map +1 -1
  154. package/dist/prepare/types.js.map +1 -1
  155. package/dist/prepare/wkbDecoder.d.ts +10 -0
  156. package/dist/prepare/wkbDecoder.d.ts.map +1 -1
  157. package/dist/prepare/wkbDecoder.js +141 -20
  158. package/dist/prepare/wkbDecoder.js.map +1 -1
  159. package/dist/prepare/wkbParser.d.ts +9 -0
  160. package/dist/prepare/wkbParser.d.ts.map +1 -1
  161. package/dist/prepare/wkbParser.js +22 -0
  162. package/dist/prepare/wkbParser.js.map +1 -1
  163. package/dist/selectStarAsWkbCollision.d.ts +3 -0
  164. package/dist/selectStarAsWkbCollision.d.ts.map +1 -0
  165. package/dist/selectStarAsWkbCollision.js +78 -0
  166. package/dist/selectStarAsWkbCollision.js.map +1 -0
  167. package/dist/types.d.ts +1 -1
  168. package/dist/types.d.ts.map +1 -1
  169. package/dist/types.js.map +1 -1
  170. package/dist/useDeckMapFitToBounds.d.ts.map +1 -1
  171. package/dist/useDeckMapFitToBounds.js +1 -1
  172. package/dist/useDeckMapFitToBounds.js.map +1 -1
  173. package/package.json +15 -15
@@ -1,3 +1,4 @@
1
+ import { DEFAULT_HEATMAP_COLOR_RANGE } from './json/heatmapDefaults';
1
2
  import { isColorScaleFunction } from './json/layerConfig';
2
3
  export const DECK_MAP_LAYER_TYPE_OPTIONS = [
3
4
  { value: 'GeoArrowScatterplotLayer', label: 'Point' },
@@ -5,7 +6,6 @@ export const DECK_MAP_LAYER_TYPE_OPTIONS = [
5
6
  { value: 'GeoArrowColumnLayer', label: 'Column' },
6
7
  { value: 'GeoArrowPathLayer', label: 'Path' },
7
8
  { value: 'GeoArrowPolygonLayer', label: 'Polygon' },
8
- { value: 'GeoArrowSolidPolygonLayer', label: 'Solid polygon' },
9
9
  { value: 'GeoArrowArcLayer', label: 'Arc' },
10
10
  { value: 'GeoArrowTripsLayer', label: 'Trips' },
11
11
  { value: 'GeoArrowH3HexagonLayer', label: 'H3 hexagon' },
@@ -47,6 +47,7 @@ const TRIPS_LAYER_TYPES = new Set([
47
47
  const RADIUS_LAYER_TYPES = new Set([
48
48
  'geoarrowscatterplotlayer',
49
49
  'scatterplotlayer',
50
+ 'geojsonlayer',
50
51
  ]);
51
52
  const COLUMN_RADIUS_LAYER_TYPES = new Set([
52
53
  'geoarrowcolumnlayer',
@@ -61,6 +62,7 @@ const EXTRUDABLE_LAYER_TYPES = new Set([
61
62
  'polygonlayer',
62
63
  'geoarrowsolidpolygonlayer',
63
64
  'solidpolygonlayer',
65
+ 'geojsonlayer',
64
66
  ]);
65
67
  function isRecord(value) {
66
68
  return Boolean(value && typeof value === 'object' && !Array.isArray(value));
@@ -105,6 +107,168 @@ export function usesExtrusionSettings(layerType) {
105
107
  return (typeof layerType === 'string' &&
106
108
  EXTRUDABLE_LAYER_TYPES.has(layerType.toLowerCase()));
107
109
  }
110
+ const STROKE_LAYER_TYPES = new Set([
111
+ 'geoarrowscatterplotlayer',
112
+ 'scatterplotlayer',
113
+ 'geoarrowh3hexagonlayer',
114
+ 'h3hexagonlayer',
115
+ 'geoarrowpolygonlayer',
116
+ 'polygonlayer',
117
+ // SolidPolygon: no stroked outlines (wireframe only).
118
+ 'geojsonlayer',
119
+ ]);
120
+ export function usesStrokeSetting(layerType) {
121
+ return (typeof layerType === 'string' &&
122
+ STROKE_LAYER_TYPES.has(layerType.toLowerCase()));
123
+ }
124
+ /** Polygon, GeoJSON, and H3 do not draw strokes while extruded. */
125
+ export function usesStrokeExtrusionWarning(layerType) {
126
+ if (typeof layerType !== 'string')
127
+ return false;
128
+ const type = layerType.toLowerCase();
129
+ return (type === 'geojsonlayer' ||
130
+ type === 'geoarrowpolygonlayer' ||
131
+ type === 'polygonlayer' ||
132
+ H3_LAYER_TYPES.has(type));
133
+ }
134
+ /** True for GeoArrow / deck H3 hexagon layer class names. */
135
+ export function isDeckMapH3HexagonLayer(layerType) {
136
+ return (typeof layerType === 'string' && H3_LAYER_TYPES.has(layerType.toLowerCase()));
137
+ }
138
+ /** Effective `extruded`; H3 and Column default to true when omitted. */
139
+ export function getDeckMapLayerExtruded(layer) {
140
+ if (typeof layer?.extruded === 'boolean')
141
+ return layer.extruded;
142
+ const layerType = layer?.['@@type'];
143
+ return (isDeckMapH3HexagonLayer(layerType) || usesColumnRadiusSetting(layerType));
144
+ }
145
+ /** Default `stroked` when omitted. H3 strokes only when not extruded. */
146
+ export function getDeckMapLayerStrokeDefault(layerType, options) {
147
+ if (typeof layerType !== 'string')
148
+ return false;
149
+ const type = layerType.toLowerCase();
150
+ if (type.includes('scatterplot') ||
151
+ type.includes('solidpolygon') ||
152
+ type === 'solid polygon') {
153
+ return false;
154
+ }
155
+ if (isDeckMapH3HexagonLayer(layerType)) {
156
+ const extruded = options?.extruded ?? true;
157
+ return !extruded;
158
+ }
159
+ return true;
160
+ }
161
+ function deckMapLayerHasActiveStroke(layer) {
162
+ if (typeof layer.stroked === 'boolean')
163
+ return layer.stroked;
164
+ return getDeckMapLayerStrokeDefault(layer['@@type'], {
165
+ extruded: getDeckMapLayerExtruded(layer),
166
+ });
167
+ }
168
+ /** Bake `layer.opacity` into flat alphas / colorScale.opacity, then drop it. */
169
+ export function detachDeckMapLayerOpacity(layer) {
170
+ const opacity = layer.opacity;
171
+ if (typeof opacity !== 'number' || !Number.isFinite(opacity)) {
172
+ return layer;
173
+ }
174
+ const factor = Math.max(0, Math.min(1, opacity));
175
+ const next = { ...layer };
176
+ const accessors = getDeckMapColorAccessorOptions(next['@@type']);
177
+ // Implicit Deck defaults are still dimmed by layer.opacity — materialize
178
+ // them so dropping opacity does not leave a sibling channel fully opaque.
179
+ const implicitColor = [0, 0, 0, 255];
180
+ if (accessors.some((option) => option.value === 'getFillColor') &&
181
+ next.getFillColor === undefined &&
182
+ next.filled !== false) {
183
+ next.getFillColor = [...implicitColor];
184
+ }
185
+ if (accessors.some((option) => option.value === 'getLineColor') &&
186
+ next.getLineColor === undefined &&
187
+ deckMapLayerHasActiveStroke(next)) {
188
+ next.getLineColor = [...implicitColor];
189
+ }
190
+ for (const { value } of DECK_MAP_COLOR_ACCESSOR_OPTIONS) {
191
+ const color = next[value];
192
+ if (isDeckMapLayerFlatRgbaColor(color)) {
193
+ const channelAlpha = color[3] ?? 255;
194
+ next[value] = [
195
+ color[0],
196
+ color[1],
197
+ color[2],
198
+ Math.round(Math.max(0, Math.min(255, channelAlpha * factor))),
199
+ ];
200
+ continue;
201
+ }
202
+ const scale = getDeckMapLayerColorScale(next, value);
203
+ if (scale) {
204
+ next[value] = {
205
+ ...scale,
206
+ opacity: getDeckMapColorScaleOpacity(scale) * factor,
207
+ };
208
+ }
209
+ }
210
+ const { opacity: _droppedOpacity, ...rest } = next;
211
+ void _droppedOpacity;
212
+ return rest;
213
+ }
214
+ /** Opacity 0–1 on a color-scale accessor (default 1). */
215
+ export function getDeckMapColorScaleOpacity(colorScale) {
216
+ const opacity = colorScale?.opacity;
217
+ if (typeof opacity === 'number' && Number.isFinite(opacity)) {
218
+ return Math.max(0, Math.min(1, opacity));
219
+ }
220
+ return 1;
221
+ }
222
+ /** Layer-level opacity factor 0–1 (1 when omitted). */
223
+ export function getDeckMapLayerOpacityFactor(layer) {
224
+ const opacity = layer?.opacity;
225
+ if (typeof opacity === 'number' && Number.isFinite(opacity)) {
226
+ return Math.max(0, Math.min(1, opacity));
227
+ }
228
+ return 1;
229
+ }
230
+ /**
231
+ * Effective 0–100 opacity for a color accessor, including legacy `layer.opacity`.
232
+ * Matches the value the Appearance slider should show before detaching.
233
+ */
234
+ export function getDeckMapLayerChannelOpacityPercent(layer, accessor, fallbackFlatAlpha = 255) {
235
+ const factor = getDeckMapLayerOpacityFactor(layer);
236
+ const scale = getDeckMapLayerColorScale(layer, accessor);
237
+ if (scale) {
238
+ return Math.round(getDeckMapColorScaleOpacity(scale) * factor * 100);
239
+ }
240
+ const flat = getDeckMapLayerFlatColor(layer, accessor);
241
+ const alpha = flat?.[3] ?? fallbackFlatAlpha;
242
+ return Math.round((Math.max(0, Math.min(255, alpha * factor)) / 255) * 100);
243
+ }
244
+ function flatColorWithScaleOpacity(color, scale) {
245
+ const opacity = getDeckMapColorScaleOpacity(scale);
246
+ const hasExplicitOpacity = typeof scale?.opacity === 'number' && Number.isFinite(scale.opacity);
247
+ const alpha = hasExplicitOpacity
248
+ ? Math.round(Math.max(0, Math.min(255, opacity * 255)))
249
+ : (color[3] ?? 255);
250
+ return [color[0], color[1], color[2], alpha];
251
+ }
252
+ /** Replace a color scale with flat RGBA (bakes scale opacity into alpha). */
253
+ export function replaceDeckMapLayerColorScaleWithFlat(layer, accessor, flatColor) {
254
+ const scale = getDeckMapLayerColorScale(layer, accessor);
255
+ return detachDeckMapLayerOpacity({
256
+ ...layer,
257
+ [accessor]: flatColorWithScaleOpacity(flatColor, scale),
258
+ });
259
+ }
260
+ /** Replace multiple color scales with flat RGBA (e.g. arc source+target). */
261
+ export function replaceDeckMapLayerColorScalesWithFlat(layer, replacements) {
262
+ const next = { ...layer };
263
+ for (const accessor of Object.keys(replacements)) {
264
+ const color = replacements[accessor];
265
+ if (!color)
266
+ continue;
267
+ const scale = getDeckMapLayerColorScale(layer, accessor);
268
+ next[accessor] = flatColorWithScaleOpacity(color, scale);
269
+ }
270
+ return detachDeckMapLayerOpacity(next);
271
+ }
108
272
  export function getDeckMapColorAccessorOptions(layerType) {
109
273
  if (layerType === 'GeoArrowPathLayer' || layerType === 'GeoArrowTripsLayer') {
110
274
  return DECK_MAP_COLOR_ACCESSOR_OPTIONS.filter((option) => option.value === 'getColor');
@@ -115,6 +279,9 @@ export function getDeckMapColorAccessorOptions(layerType) {
115
279
  if (layerType === 'GeoArrowHeatmapLayer') {
116
280
  return [];
117
281
  }
282
+ if (layerType === 'GeoArrowColumnLayer') {
283
+ return DECK_MAP_COLOR_ACCESSOR_OPTIONS.filter((option) => option.value === 'getFillColor');
284
+ }
118
285
  return DECK_MAP_COLOR_ACCESSOR_OPTIONS.filter((option) => option.value === 'getFillColor' || option.value === 'getLineColor');
119
286
  }
120
287
  export function updateDeckMapLayer(config, layerIndex, updater) {
@@ -141,15 +308,70 @@ export function setDeckMapLayerType(config, layerIndex, layerType) {
141
308
  '@@type': layerType,
142
309
  };
143
310
  const lt = layerType.toLowerCase();
144
- if (lt === 'geoarrowcolumnlayer' ||
145
- lt === 'columnlayer' ||
146
- lt === 'deckcolumnlayer') {
147
- nextLayer.radius ??= 3;
148
- nextLayer.elevationScale ??= 1;
311
+ if (lt === 'geoarrowheatmaplayer') {
312
+ if (!Array.isArray(nextLayer.colorRange) ||
313
+ nextLayer.colorRange.length === 0) {
314
+ nextLayer.colorRange = DEFAULT_HEATMAP_COLOR_RANGE;
315
+ }
316
+ return nextLayer;
317
+ }
318
+ const colorAccessors = getDeckMapColorAccessorOptions(layerType);
319
+ if (colorAccessors.some((option) => option.value === 'getFillColor') &&
320
+ nextLayer.getFillColor === undefined &&
321
+ nextLayer.filled !== false) {
322
+ nextLayer.getFillColor = [...DECK_MAP_DEFAULT_LAYER_COLOR];
323
+ }
324
+ if (lt === 'geoarrowcolumnlayer') {
325
+ const radius = typeof nextLayer.radius === 'number' &&
326
+ Number.isFinite(nextLayer.radius) &&
327
+ nextLayer.radius > 0
328
+ ? nextLayer.radius
329
+ : 50;
330
+ const withRadius = applyDeckMapColumnRadiusMeters(nextLayer, radius);
331
+ if (typeof withRadius.elevationScale !== 'number') {
332
+ withRadius.elevationScale = 1;
333
+ }
334
+ return withRadius;
149
335
  }
150
336
  return nextLayer;
151
337
  });
152
338
  }
339
+ // Point/heatmap radius leftovers (`getRadius`, pixel units) break ColumnLayer meters UI.
340
+ const COLUMN_LAYER_RADIUS_CONFLICT_KEYS = [
341
+ 'getRadius',
342
+ 'radiusMinPixels',
343
+ 'radiusMaxPixels',
344
+ 'radiusPixels',
345
+ ];
346
+ /** Force meters and strip point/heatmap radius leftovers (does not set `radius`). */
347
+ export function stripDeckMapColumnLayerRadiusConflicts(layer) {
348
+ const next = {
349
+ ...layer,
350
+ radiusUnits: 'meters',
351
+ };
352
+ for (const key of COLUMN_LAYER_RADIUS_CONFLICT_KEYS) {
353
+ delete next[key];
354
+ }
355
+ return next;
356
+ }
357
+ /** True when ColumnLayer still carries point/heatmap radius props or pixel units. */
358
+ export function deckMapColumnLayerHasRadiusConflicts(layer) {
359
+ if (layer.radiusUnits === 'pixels')
360
+ return true;
361
+ return COLUMN_LAYER_RADIUS_CONFLICT_KEYS.some((key) => layer[key] !== undefined);
362
+ }
363
+ /** Apply a column radius in meters and strip conflicting point/heatmap radius props. */
364
+ export function applyDeckMapColumnRadiusMeters(layer, radiusMeters) {
365
+ return {
366
+ ...stripDeckMapColumnLayerRadiusConflicts(layer),
367
+ radius: radiusMeters,
368
+ radiusUnits: 'meters',
369
+ };
370
+ }
371
+ /** Set GeoArrowColumnLayer disk radius in meters. */
372
+ export function setDeckMapLayerColumnRadius(config, layerIndex, radiusMeters) {
373
+ return updateDeckMapLayer(config, layerIndex, (layer) => applyDeckMapColumnRadiusMeters(layer, radiusMeters));
374
+ }
153
375
  export function setDeckMapLayerGeometryColumn(config, layerIndex, geometryColumn) {
154
376
  const layer = getDeckMapLayerRecords(config)[layerIndex];
155
377
  const datasetId = getDeckMapLayerDatasetId(layer);
@@ -225,17 +447,52 @@ export function setDeckMapLayerColorScale(config, layerIndex, accessor, colorSca
225
447
  const DEFAULT_LAYER_FILL_COLOR = [
226
448
  56, 189, 248, 180,
227
449
  ];
450
+ const DEFAULT_LAYER_STROKE_COLOR = [
451
+ 0, 0, 0, 255,
452
+ ];
453
+ /** Default flat fill RGBA. */
454
+ export const DECK_MAP_DEFAULT_LAYER_COLOR = DEFAULT_LAYER_FILL_COLOR;
455
+ /** Default stroke RGBA. */
456
+ export const DECK_MAP_DEFAULT_STROKE_COLOR = DEFAULT_LAYER_STROKE_COLOR;
457
+ /** True when `value` is a 3- or 4-channel numeric RGB(A) array. */
458
+ export function isDeckMapLayerFlatRgbaColor(value) {
459
+ return (Array.isArray(value) &&
460
+ value.length >= 3 &&
461
+ value.length <= 4 &&
462
+ value.every((channel) => typeof channel === 'number' && Number.isFinite(channel)));
463
+ }
464
+ /** Flat RGBA for an accessor, or undefined if scaled/missing. */
465
+ export function getDeckMapLayerFlatColor(layer, accessor) {
466
+ const value = layer?.[accessor];
467
+ if (!isDeckMapLayerFlatRgbaColor(value))
468
+ return undefined;
469
+ return [value[0], value[1], value[2], value[3] ?? 255];
470
+ }
471
+ /** Set a color accessor to a constant RGB(A); alpha defaults to 255. */
472
+ export function setDeckMapLayerFlatColor(config, layerIndex, accessor, color) {
473
+ const rgba = [
474
+ color[0],
475
+ color[1],
476
+ color[2],
477
+ color[3] ?? 255,
478
+ ];
479
+ return updateDeckMapLayer(config, layerIndex, (layer) => ({
480
+ ...layer,
481
+ [accessor]: rgba,
482
+ }));
483
+ }
484
+ /** RGBA → `#rrggbb` for `<input type="color">`. */
485
+ export function deckMapRgbaToHex(color) {
486
+ const toHex = (channel) => Math.max(0, Math.min(255, Math.round(channel)))
487
+ .toString(16)
488
+ .padStart(2, '0');
489
+ return `#${toHex(color[0])}${toHex(color[1])}${toHex(color[2])}`;
490
+ }
228
491
  export function clearDeckMapLayerColorScale(config, layerIndex, accessor) {
229
- return updateDeckMapLayer(config, layerIndex, (layer) => {
230
- const nextLayer = { ...layer };
231
- if (accessor === 'getFillColor') {
232
- nextLayer[accessor] = [...DEFAULT_LAYER_FILL_COLOR];
233
- }
234
- else {
235
- delete nextLayer[accessor];
236
- }
237
- return nextLayer;
238
- });
492
+ const defaultColor = accessor === 'getLineColor'
493
+ ? DECK_MAP_DEFAULT_STROKE_COLOR
494
+ : DECK_MAP_DEFAULT_LAYER_COLOR;
495
+ return updateDeckMapLayer(config, layerIndex, (layer) => replaceDeckMapLayerColorScaleWithFlat(layer, accessor, defaultColor));
239
496
  }
240
497
  export function createDeckMapLayerColorScale(options) {
241
498
  const type = options.type ?? 'sequential';
@@ -243,10 +500,14 @@ export function createDeckMapLayerColorScale(options) {
243
500
  DECK_MAP_COLOR_SCALE_TYPE_OPTIONS.find((option) => option.value === type)
244
501
  ?.defaultScheme ??
245
502
  'Viridis';
503
+ const opacity = typeof options.opacity === 'number' && Number.isFinite(options.opacity)
504
+ ? Math.max(0, Math.min(1, options.opacity))
505
+ : undefined;
246
506
  const base = {
247
507
  '@@function': 'colorScale',
248
508
  field: options.field,
249
509
  legend: { title: options.title ?? options.field },
510
+ ...(opacity !== undefined ? { opacity } : {}),
250
511
  };
251
512
  if (type === 'categorical') {
252
513
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"mapLayerConfigUtils.js","sourceRoot":"","sources":["../src/mapLayerConfigUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ColorScaleConfig, ColorScaleScheme} from '@sqlrooms/color-scales';\nimport type {DeckMapConfig} from './mapConfig';\nimport type {DeckAutoLayerType} from './types';\nimport {isColorScaleFunction} from './json/layerConfig';\n\nexport type DeckMapLayerRecord = Record<string, unknown>;\n\nexport type DeckMapLayerColorScaleFunction = ColorScaleConfig & {\n '@@function': 'colorScale';\n};\n\nexport type DeckMapLayerColorAccessor =\n | 'getFillColor'\n | 'getLineColor'\n | 'getColor'\n | 'getSourceColor'\n | 'getTargetColor';\n\nexport const DECK_MAP_LAYER_TYPE_OPTIONS: ReadonlyArray<{\n value: DeckAutoLayerType | 'GeoArrowSolidPolygonLayer';\n label: string;\n}> = [\n {value: 'GeoArrowScatterplotLayer', label: 'Point'},\n {value: 'GeoArrowHeatmapLayer', label: 'Heatmap'},\n {value: 'GeoArrowColumnLayer', label: 'Column'},\n {value: 'GeoArrowPathLayer', label: 'Path'},\n {value: 'GeoArrowPolygonLayer', label: 'Polygon'},\n {value: 'GeoArrowSolidPolygonLayer', label: 'Solid polygon'},\n {value: 'GeoArrowArcLayer', label: 'Arc'},\n {value: 'GeoArrowTripsLayer', label: 'Trips'},\n {value: 'GeoArrowH3HexagonLayer', label: 'H3 hexagon'},\n {value: 'GeoJsonLayer', label: 'GeoJSON'},\n];\n\nexport const DECK_MAP_COLOR_ACCESSOR_OPTIONS: ReadonlyArray<{\n value: DeckMapLayerColorAccessor;\n label: string;\n}> = [\n {value: 'getFillColor', label: 'Fill color'},\n {value: 'getLineColor', label: 'Line color'},\n {value: 'getColor', label: 'Color'},\n {value: 'getSourceColor', label: 'Source color'},\n {value: 'getTargetColor', label: 'Target color'},\n];\n\nexport const DECK_MAP_COLOR_SCALE_TYPE_OPTIONS: ReadonlyArray<{\n value: ColorScaleConfig['type'];\n label: string;\n defaultScheme: ColorScaleScheme;\n}> = [\n {value: 'sequential', label: 'Sequential', defaultScheme: 'Viridis'},\n {value: 'diverging', label: 'Diverging', defaultScheme: 'RdBu'},\n {value: 'quantize', label: 'Quantize', defaultScheme: 'YlOrRd'},\n {value: 'quantile', label: 'Quantile', defaultScheme: 'YlOrRd'},\n {value: 'categorical', label: 'Categorical', defaultScheme: 'Tableau10'},\n];\n\nconst GEOMETRY_COLUMN_LAYER_TYPES = new Set([\n 'geoarrowpolygonlayer',\n 'geoarrowsolidpolygonlayer',\n 'geoarrowpathlayer',\n 'geoarrowtripslayer',\n 'geojsonlayer',\n 'polygonlayer',\n 'solidpolygonlayer',\n 'geojson',\n 'polygon',\n 'solid polygon',\n]);\n\nconst H3_LAYER_TYPES = new Set(['geoarrowh3hexagonlayer', 'h3hexagonlayer']);\n\nconst ARC_LAYER_TYPES = new Set(['geoarrowarclayer', 'arclayer']);\n\nconst TRIPS_LAYER_TYPES = new Set([\n 'geoarrowtripslayer',\n 'decktripslayer',\n 'tripslayer',\n]);\n\nconst RADIUS_LAYER_TYPES = new Set([\n 'geoarrowscatterplotlayer',\n 'scatterplotlayer',\n]);\n\nconst COLUMN_RADIUS_LAYER_TYPES = new Set([\n 'geoarrowcolumnlayer',\n 'columnlayer',\n]);\n\nconst EXTRUDABLE_LAYER_TYPES = new Set([\n 'geoarrowh3hexagonlayer',\n 'h3hexagonlayer',\n 'geoarrowcolumnlayer',\n 'columnlayer',\n 'geoarrowpolygonlayer',\n 'polygonlayer',\n 'geoarrowsolidpolygonlayer',\n 'solidpolygonlayer',\n]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction getObjectSpec(\n config: DeckMapConfig,\n): Record<string, unknown> | undefined {\n return isRecord(config.spec) ? config.spec : undefined;\n}\n\nexport function getDeckMapLayerRecords(\n config: DeckMapConfig,\n): DeckMapLayerRecord[] {\n const layers = getObjectSpec(config)?.layers;\n return Array.isArray(layers) ? layers.filter(isRecord) : [];\n}\n\nexport function getDeckMapLayerDatasetId(\n layer: DeckMapLayerRecord | undefined,\n): string | undefined {\n const binding = layer?._sqlroomsBinding;\n if (!isRecord(binding)) return undefined;\n return typeof binding.dataset === 'string' ? binding.dataset : undefined;\n}\n\nexport function usesGeometryColumnSetting(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n GEOMETRY_COLUMN_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesH3ColumnSetting(layerType: unknown) {\n return (\n typeof layerType === 'string' && H3_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesArcColumnSetting(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n ARC_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesRadiusSetting(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n RADIUS_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesColumnRadiusSetting(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n COLUMN_RADIUS_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesTripsSettings(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n TRIPS_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesExtrusionSettings(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n EXTRUDABLE_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function getDeckMapColorAccessorOptions(\n layerType: unknown,\n): typeof DECK_MAP_COLOR_ACCESSOR_OPTIONS {\n if (layerType === 'GeoArrowPathLayer' || layerType === 'GeoArrowTripsLayer') {\n return DECK_MAP_COLOR_ACCESSOR_OPTIONS.filter(\n (option) => option.value === 'getColor',\n );\n }\n\n if (layerType === 'GeoArrowArcLayer') {\n return DECK_MAP_COLOR_ACCESSOR_OPTIONS.filter(\n (option) =>\n option.value === 'getSourceColor' || option.value === 'getTargetColor',\n );\n }\n\n if (layerType === 'GeoArrowHeatmapLayer') {\n return [];\n }\n\n return DECK_MAP_COLOR_ACCESSOR_OPTIONS.filter(\n (option) =>\n option.value === 'getFillColor' || option.value === 'getLineColor',\n );\n}\n\nexport function updateDeckMapLayer(\n config: DeckMapConfig,\n layerIndex: number,\n updater: (layer: DeckMapLayerRecord) => DeckMapLayerRecord,\n): DeckMapConfig {\n const spec = getObjectSpec(config);\n if (!spec || !Array.isArray(spec.layers)) {\n return config;\n }\n\n const layer = spec.layers[layerIndex];\n if (!isRecord(layer)) {\n return config;\n }\n\n return {\n ...config,\n spec: {\n ...spec,\n layers: spec.layers.map((candidate, index) =>\n index === layerIndex ? updater({...layer}) : candidate,\n ),\n },\n };\n}\n\nexport function setDeckMapLayerType(\n config: DeckMapConfig,\n layerIndex: number,\n layerType: string,\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) => {\n const nextLayer: DeckMapLayerRecord = {\n ...layer,\n '@@type': layerType,\n };\n const lt = layerType.toLowerCase();\n if (\n lt === 'geoarrowcolumnlayer' ||\n lt === 'columnlayer' ||\n lt === 'deckcolumnlayer'\n ) {\n nextLayer.radius ??= 3;\n nextLayer.elevationScale ??= 1;\n }\n return nextLayer;\n });\n}\n\nexport function setDeckMapLayerGeometryColumn(\n config: DeckMapConfig,\n layerIndex: number,\n geometryColumn: string,\n): DeckMapConfig {\n const layer = getDeckMapLayerRecords(config)[layerIndex];\n const datasetId = getDeckMapLayerDatasetId(layer);\n if (!datasetId || !config.datasets?.[datasetId]) {\n return config;\n }\n\n const updatedConfig = {\n ...config,\n datasets: {\n ...config.datasets,\n [datasetId]: {\n ...config.datasets[datasetId],\n geometryColumn,\n },\n },\n fitToData:\n config.fitToData &&\n config.fitToData.dataset === datasetId &&\n 'geometryColumn' in config.fitToData\n ? {\n ...config.fitToData,\n geometryColumn,\n }\n : config.fitToData,\n };\n\n return updateDeckMapLayer(updatedConfig, layerIndex, (l) => ({\n ...l,\n _sqlroomsBinding: {\n ...(l._sqlroomsBinding as Record<string, unknown>),\n geometryColumn,\n },\n }));\n}\n\nexport function setDeckMapLayerHexagonColumn(\n config: DeckMapConfig,\n layerIndex: number,\n hexagonColumn: string,\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) => ({\n ...layer,\n getHexagon: `@@=${hexagonColumn}`,\n _sqlroomsBinding: {\n ...(isRecord(layer._sqlroomsBinding) ? layer._sqlroomsBinding : {}),\n hexagonColumn,\n },\n }));\n}\n\nexport function setDeckMapLayerArcColumns(\n config: DeckMapConfig,\n layerIndex: number,\n columns: {\n sourceGeometryColumn?: string;\n targetGeometryColumn?: string;\n sourceLatitudeColumn?: string;\n sourceLongitudeColumn?: string;\n targetLatitudeColumn?: string;\n targetLongitudeColumn?: string;\n },\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) => ({\n ...layer,\n _sqlroomsBinding: {\n ...(isRecord(layer._sqlroomsBinding) ? layer._sqlroomsBinding : {}),\n ...columns,\n },\n }));\n}\n\nexport function setDeckMapLayerTimestampColumn(\n config: DeckMapConfig,\n layerIndex: number,\n timestampColumn: string,\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) => ({\n ...layer,\n _sqlroomsBinding: {\n ...(isRecord(layer._sqlroomsBinding) ? layer._sqlroomsBinding : {}),\n timestampColumn,\n },\n }));\n}\n\nexport function getDeckMapLayerColorScale(\n layer: DeckMapLayerRecord | undefined,\n accessor: DeckMapLayerColorAccessor,\n): DeckMapLayerColorScaleFunction | undefined {\n const value = layer?.[accessor];\n return isColorScaleFunction(value)\n ? (value as DeckMapLayerColorScaleFunction)\n : undefined;\n}\n\nexport function setDeckMapLayerColorScale(\n config: DeckMapConfig,\n layerIndex: number,\n accessor: DeckMapLayerColorAccessor,\n colorScale: DeckMapLayerColorScaleFunction,\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) => ({\n ...layer,\n [accessor]: colorScale,\n }));\n}\n\nconst DEFAULT_LAYER_FILL_COLOR: [number, number, number, number] = [\n 56, 189, 248, 180,\n];\n\nexport function clearDeckMapLayerColorScale(\n config: DeckMapConfig,\n layerIndex: number,\n accessor: DeckMapLayerColorAccessor,\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) => {\n const nextLayer = {...layer};\n if (accessor === 'getFillColor') {\n nextLayer[accessor] = [...DEFAULT_LAYER_FILL_COLOR];\n } else {\n delete nextLayer[accessor];\n }\n return nextLayer;\n });\n}\n\nexport function createDeckMapLayerColorScale(options: {\n field: string;\n type?: ColorScaleConfig['type'];\n scheme?: ColorScaleScheme;\n title?: string;\n}): DeckMapLayerColorScaleFunction {\n const type = options.type ?? 'sequential';\n const scheme =\n options.scheme ??\n DECK_MAP_COLOR_SCALE_TYPE_OPTIONS.find((option) => option.value === type)\n ?.defaultScheme ??\n 'Viridis';\n const base = {\n '@@function': 'colorScale' as const,\n field: options.field,\n legend: {title: options.title ?? options.field},\n };\n\n if (type === 'categorical') {\n return {\n ...base,\n type,\n scheme: scheme as Extract<\n ColorScaleConfig,\n {type: 'categorical'}\n >['scheme'],\n };\n }\n\n if (type === 'diverging') {\n return {\n ...base,\n type,\n scheme: scheme as Extract<\n ColorScaleConfig,\n {type: 'diverging'}\n >['scheme'],\n domain: 'auto',\n };\n }\n\n if (type === 'quantize') {\n return {\n ...base,\n type,\n scheme: scheme as Extract<ColorScaleConfig, {type: 'quantize'}>['scheme'],\n domain: 'auto',\n };\n }\n\n if (type === 'quantile') {\n return {\n ...base,\n type,\n scheme: scheme as Extract<ColorScaleConfig, {type: 'quantile'}>['scheme'],\n };\n }\n\n if (type === 'threshold') {\n return {\n ...base,\n type,\n scheme: scheme as Extract<\n ColorScaleConfig,\n {type: 'threshold'}\n >['scheme'],\n thresholds: [],\n };\n }\n\n return {\n ...base,\n type: 'sequential',\n scheme: scheme as Extract<ColorScaleConfig, {type: 'sequential'}>['scheme'],\n domain: 'auto',\n };\n}\n"]}
1
+ {"version":3,"file":"mapLayerConfigUtils.js","sourceRoot":"","sources":["../src/mapLayerConfigUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ColorScaleConfig, ColorScaleScheme} from '@sqlrooms/color-scales';\nimport type {DeckMapConfig} from './mapConfig';\nimport type {DeckAutoLayerType} from './types';\nimport {DEFAULT_HEATMAP_COLOR_RANGE} from './json/heatmapDefaults';\nimport {isColorScaleFunction} from './json/layerConfig';\n\nexport type DeckMapLayerRecord = Record<string, unknown>;\n\nexport type DeckMapLayerColorScaleFunction = ColorScaleConfig & {\n '@@function': 'colorScale';\n /**\n * Per-accessor opacity (0–1). Preferred over layer-level `opacity` so fill and\n * stroke (or arc endpoints) can be dimmed independently.\n */\n opacity?: number;\n};\n\nexport type DeckMapLayerColorAccessor =\n | 'getFillColor'\n | 'getLineColor'\n | 'getColor'\n | 'getSourceColor'\n | 'getTargetColor';\n\nexport const DECK_MAP_LAYER_TYPE_OPTIONS: ReadonlyArray<{\n value: DeckAutoLayerType;\n label: string;\n}> = [\n {value: 'GeoArrowScatterplotLayer', label: 'Point'},\n {value: 'GeoArrowHeatmapLayer', label: 'Heatmap'},\n {value: 'GeoArrowColumnLayer', label: 'Column'},\n {value: 'GeoArrowPathLayer', label: 'Path'},\n {value: 'GeoArrowPolygonLayer', label: 'Polygon'},\n {value: 'GeoArrowArcLayer', label: 'Arc'},\n {value: 'GeoArrowTripsLayer', label: 'Trips'},\n {value: 'GeoArrowH3HexagonLayer', label: 'H3 hexagon'},\n {value: 'GeoJsonLayer', label: 'GeoJSON'},\n];\n\nexport const DECK_MAP_COLOR_ACCESSOR_OPTIONS: ReadonlyArray<{\n value: DeckMapLayerColorAccessor;\n label: string;\n}> = [\n {value: 'getFillColor', label: 'Fill color'},\n {value: 'getLineColor', label: 'Line color'},\n {value: 'getColor', label: 'Color'},\n {value: 'getSourceColor', label: 'Source color'},\n {value: 'getTargetColor', label: 'Target color'},\n];\n\nexport const DECK_MAP_COLOR_SCALE_TYPE_OPTIONS: ReadonlyArray<{\n value: ColorScaleConfig['type'];\n label: string;\n defaultScheme: ColorScaleScheme;\n}> = [\n {value: 'sequential', label: 'Sequential', defaultScheme: 'Viridis'},\n {value: 'diverging', label: 'Diverging', defaultScheme: 'RdBu'},\n {value: 'quantize', label: 'Quantize', defaultScheme: 'YlOrRd'},\n {value: 'quantile', label: 'Quantile', defaultScheme: 'YlOrRd'},\n {value: 'categorical', label: 'Categorical', defaultScheme: 'Tableau10'},\n];\n\nconst GEOMETRY_COLUMN_LAYER_TYPES = new Set([\n 'geoarrowpolygonlayer',\n 'geoarrowsolidpolygonlayer',\n 'geoarrowpathlayer',\n 'geoarrowtripslayer',\n 'geojsonlayer',\n 'polygonlayer',\n 'solidpolygonlayer',\n 'geojson',\n 'polygon',\n 'solid polygon',\n]);\n\nconst H3_LAYER_TYPES = new Set(['geoarrowh3hexagonlayer', 'h3hexagonlayer']);\n\nconst ARC_LAYER_TYPES = new Set(['geoarrowarclayer', 'arclayer']);\n\nconst TRIPS_LAYER_TYPES = new Set([\n 'geoarrowtripslayer',\n 'decktripslayer',\n 'tripslayer',\n]);\n\nconst RADIUS_LAYER_TYPES = new Set([\n 'geoarrowscatterplotlayer',\n 'scatterplotlayer',\n 'geojsonlayer',\n]);\n\nconst COLUMN_RADIUS_LAYER_TYPES = new Set([\n 'geoarrowcolumnlayer',\n 'columnlayer',\n]);\n\nconst EXTRUDABLE_LAYER_TYPES = new Set([\n 'geoarrowh3hexagonlayer',\n 'h3hexagonlayer',\n 'geoarrowcolumnlayer',\n 'columnlayer',\n 'geoarrowpolygonlayer',\n 'polygonlayer',\n 'geoarrowsolidpolygonlayer',\n 'solidpolygonlayer',\n 'geojsonlayer',\n]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction getObjectSpec(\n config: DeckMapConfig,\n): Record<string, unknown> | undefined {\n return isRecord(config.spec) ? config.spec : undefined;\n}\n\nexport function getDeckMapLayerRecords(\n config: DeckMapConfig,\n): DeckMapLayerRecord[] {\n const layers = getObjectSpec(config)?.layers;\n return Array.isArray(layers) ? layers.filter(isRecord) : [];\n}\n\nexport function getDeckMapLayerDatasetId(\n layer: DeckMapLayerRecord | undefined,\n): string | undefined {\n const binding = layer?._sqlroomsBinding;\n if (!isRecord(binding)) return undefined;\n return typeof binding.dataset === 'string' ? binding.dataset : undefined;\n}\n\nexport function usesGeometryColumnSetting(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n GEOMETRY_COLUMN_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesH3ColumnSetting(layerType: unknown) {\n return (\n typeof layerType === 'string' && H3_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesArcColumnSetting(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n ARC_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesRadiusSetting(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n RADIUS_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesColumnRadiusSetting(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n COLUMN_RADIUS_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesTripsSettings(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n TRIPS_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nexport function usesExtrusionSettings(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n EXTRUDABLE_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\nconst STROKE_LAYER_TYPES = new Set([\n 'geoarrowscatterplotlayer',\n 'scatterplotlayer',\n 'geoarrowh3hexagonlayer',\n 'h3hexagonlayer',\n 'geoarrowpolygonlayer',\n 'polygonlayer',\n // SolidPolygon: no stroked outlines (wireframe only).\n 'geojsonlayer',\n]);\n\nexport function usesStrokeSetting(layerType: unknown) {\n return (\n typeof layerType === 'string' &&\n STROKE_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\n/** Polygon, GeoJSON, and H3 do not draw strokes while extruded. */\nexport function usesStrokeExtrusionWarning(layerType: unknown) {\n if (typeof layerType !== 'string') return false;\n const type = layerType.toLowerCase();\n return (\n type === 'geojsonlayer' ||\n type === 'geoarrowpolygonlayer' ||\n type === 'polygonlayer' ||\n H3_LAYER_TYPES.has(type)\n );\n}\n\n/** True for GeoArrow / deck H3 hexagon layer class names. */\nexport function isDeckMapH3HexagonLayer(layerType: unknown): boolean {\n return (\n typeof layerType === 'string' && H3_LAYER_TYPES.has(layerType.toLowerCase())\n );\n}\n\n/** Effective `extruded`; H3 and Column default to true when omitted. */\nexport function getDeckMapLayerExtruded(\n layer: DeckMapLayerRecord | undefined,\n): boolean {\n if (typeof layer?.extruded === 'boolean') return layer.extruded;\n const layerType = layer?.['@@type'];\n return (\n isDeckMapH3HexagonLayer(layerType) || usesColumnRadiusSetting(layerType)\n );\n}\n\n/** Default `stroked` when omitted. H3 strokes only when not extruded. */\nexport function getDeckMapLayerStrokeDefault(\n layerType: unknown,\n options?: {extruded?: boolean},\n): boolean {\n if (typeof layerType !== 'string') return false;\n const type = layerType.toLowerCase();\n if (\n type.includes('scatterplot') ||\n type.includes('solidpolygon') ||\n type === 'solid polygon'\n ) {\n return false;\n }\n if (isDeckMapH3HexagonLayer(layerType)) {\n const extruded = options?.extruded ?? true;\n return !extruded;\n }\n return true;\n}\n\nfunction deckMapLayerHasActiveStroke(layer: DeckMapLayerRecord): boolean {\n if (typeof layer.stroked === 'boolean') return layer.stroked;\n return getDeckMapLayerStrokeDefault(layer['@@type'], {\n extruded: getDeckMapLayerExtruded(layer),\n });\n}\n\n/** Bake `layer.opacity` into flat alphas / colorScale.opacity, then drop it. */\nexport function detachDeckMapLayerOpacity(\n layer: DeckMapLayerRecord,\n): DeckMapLayerRecord {\n const opacity = layer.opacity;\n if (typeof opacity !== 'number' || !Number.isFinite(opacity)) {\n return layer;\n }\n const factor = Math.max(0, Math.min(1, opacity));\n const next: DeckMapLayerRecord = {...layer};\n const accessors = getDeckMapColorAccessorOptions(next['@@type']);\n // Implicit Deck defaults are still dimmed by layer.opacity — materialize\n // them so dropping opacity does not leave a sibling channel fully opaque.\n const implicitColor: [number, number, number, number] = [0, 0, 0, 255];\n if (\n accessors.some((option) => option.value === 'getFillColor') &&\n next.getFillColor === undefined &&\n next.filled !== false\n ) {\n next.getFillColor = [...implicitColor];\n }\n if (\n accessors.some((option) => option.value === 'getLineColor') &&\n next.getLineColor === undefined &&\n deckMapLayerHasActiveStroke(next)\n ) {\n next.getLineColor = [...implicitColor];\n }\n for (const {value} of DECK_MAP_COLOR_ACCESSOR_OPTIONS) {\n const color = next[value];\n if (isDeckMapLayerFlatRgbaColor(color)) {\n const channelAlpha = color[3] ?? 255;\n next[value] = [\n color[0]!,\n color[1]!,\n color[2]!,\n Math.round(Math.max(0, Math.min(255, channelAlpha * factor))),\n ];\n continue;\n }\n const scale = getDeckMapLayerColorScale(next, value);\n if (scale) {\n next[value] = {\n ...scale,\n opacity: getDeckMapColorScaleOpacity(scale) * factor,\n };\n }\n }\n const {opacity: _droppedOpacity, ...rest} = next;\n void _droppedOpacity;\n return rest;\n}\n\n/** Opacity 0–1 on a color-scale accessor (default 1). */\nexport function getDeckMapColorScaleOpacity(\n colorScale: DeckMapLayerColorScaleFunction | undefined,\n): number {\n const opacity = colorScale?.opacity;\n if (typeof opacity === 'number' && Number.isFinite(opacity)) {\n return Math.max(0, Math.min(1, opacity));\n }\n return 1;\n}\n\n/** Layer-level opacity factor 0–1 (1 when omitted). */\nexport function getDeckMapLayerOpacityFactor(\n layer: DeckMapLayerRecord | undefined,\n): number {\n const opacity = layer?.opacity;\n if (typeof opacity === 'number' && Number.isFinite(opacity)) {\n return Math.max(0, Math.min(1, opacity));\n }\n return 1;\n}\n\n/**\n * Effective 0–100 opacity for a color accessor, including legacy `layer.opacity`.\n * Matches the value the Appearance slider should show before detaching.\n */\nexport function getDeckMapLayerChannelOpacityPercent(\n layer: DeckMapLayerRecord | undefined,\n accessor: DeckMapLayerColorAccessor,\n fallbackFlatAlpha = 255,\n): number {\n const factor = getDeckMapLayerOpacityFactor(layer);\n const scale = getDeckMapLayerColorScale(layer, accessor);\n if (scale) {\n return Math.round(getDeckMapColorScaleOpacity(scale) * factor * 100);\n }\n const flat = getDeckMapLayerFlatColor(layer, accessor);\n const alpha = flat?.[3] ?? fallbackFlatAlpha;\n return Math.round((Math.max(0, Math.min(255, alpha * factor)) / 255) * 100);\n}\n\nfunction flatColorWithScaleOpacity(\n color: readonly [number, number, number, number],\n scale: DeckMapLayerColorScaleFunction | undefined,\n): [number, number, number, number] {\n const opacity = getDeckMapColorScaleOpacity(scale);\n const hasExplicitOpacity =\n typeof scale?.opacity === 'number' && Number.isFinite(scale.opacity);\n const alpha = hasExplicitOpacity\n ? Math.round(Math.max(0, Math.min(255, opacity * 255)))\n : (color[3] ?? 255);\n return [color[0], color[1], color[2], alpha];\n}\n\n/** Replace a color scale with flat RGBA (bakes scale opacity into alpha). */\nexport function replaceDeckMapLayerColorScaleWithFlat(\n layer: DeckMapLayerRecord,\n accessor: DeckMapLayerColorAccessor,\n flatColor: readonly [number, number, number, number],\n): DeckMapLayerRecord {\n const scale = getDeckMapLayerColorScale(layer, accessor);\n return detachDeckMapLayerOpacity({\n ...layer,\n [accessor]: flatColorWithScaleOpacity(flatColor, scale),\n });\n}\n\n/** Replace multiple color scales with flat RGBA (e.g. arc source+target). */\nexport function replaceDeckMapLayerColorScalesWithFlat(\n layer: DeckMapLayerRecord,\n replacements: Partial<\n Record<DeckMapLayerColorAccessor, readonly [number, number, number, number]>\n >,\n): DeckMapLayerRecord {\n const next: DeckMapLayerRecord = {...layer};\n for (const accessor of Object.keys(\n replacements,\n ) as DeckMapLayerColorAccessor[]) {\n const color = replacements[accessor];\n if (!color) continue;\n const scale = getDeckMapLayerColorScale(layer, accessor);\n next[accessor] = flatColorWithScaleOpacity(color, scale);\n }\n return detachDeckMapLayerOpacity(next);\n}\n\nexport function getDeckMapColorAccessorOptions(\n layerType: unknown,\n): typeof DECK_MAP_COLOR_ACCESSOR_OPTIONS {\n if (layerType === 'GeoArrowPathLayer' || layerType === 'GeoArrowTripsLayer') {\n return DECK_MAP_COLOR_ACCESSOR_OPTIONS.filter(\n (option) => option.value === 'getColor',\n );\n }\n\n if (layerType === 'GeoArrowArcLayer') {\n return DECK_MAP_COLOR_ACCESSOR_OPTIONS.filter(\n (option) =>\n option.value === 'getSourceColor' || option.value === 'getTargetColor',\n );\n }\n\n if (layerType === 'GeoArrowHeatmapLayer') {\n return [];\n }\n\n if (layerType === 'GeoArrowColumnLayer') {\n return DECK_MAP_COLOR_ACCESSOR_OPTIONS.filter(\n (option) => option.value === 'getFillColor',\n );\n }\n\n return DECK_MAP_COLOR_ACCESSOR_OPTIONS.filter(\n (option) =>\n option.value === 'getFillColor' || option.value === 'getLineColor',\n );\n}\n\nexport function updateDeckMapLayer(\n config: DeckMapConfig,\n layerIndex: number,\n updater: (layer: DeckMapLayerRecord) => DeckMapLayerRecord,\n): DeckMapConfig {\n const spec = getObjectSpec(config);\n if (!spec || !Array.isArray(spec.layers)) {\n return config;\n }\n\n const layer = spec.layers[layerIndex];\n if (!isRecord(layer)) {\n return config;\n }\n\n return {\n ...config,\n spec: {\n ...spec,\n layers: spec.layers.map((candidate, index) =>\n index === layerIndex ? updater({...layer}) : candidate,\n ),\n },\n };\n}\n\nexport function setDeckMapLayerType(\n config: DeckMapConfig,\n layerIndex: number,\n layerType: string,\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) => {\n const nextLayer: DeckMapLayerRecord = {\n ...layer,\n '@@type': layerType,\n };\n const lt = layerType.toLowerCase();\n if (lt === 'geoarrowheatmaplayer') {\n if (\n !Array.isArray(nextLayer.colorRange) ||\n nextLayer.colorRange.length === 0\n ) {\n nextLayer.colorRange = DEFAULT_HEATMAP_COLOR_RANGE;\n }\n return nextLayer;\n }\n\n const colorAccessors = getDeckMapColorAccessorOptions(layerType);\n if (\n colorAccessors.some((option) => option.value === 'getFillColor') &&\n nextLayer.getFillColor === undefined &&\n nextLayer.filled !== false\n ) {\n nextLayer.getFillColor = [...DECK_MAP_DEFAULT_LAYER_COLOR];\n }\n if (lt === 'geoarrowcolumnlayer') {\n const radius =\n typeof nextLayer.radius === 'number' &&\n Number.isFinite(nextLayer.radius) &&\n nextLayer.radius > 0\n ? nextLayer.radius\n : 50;\n const withRadius = applyDeckMapColumnRadiusMeters(nextLayer, radius);\n if (typeof withRadius.elevationScale !== 'number') {\n withRadius.elevationScale = 1;\n }\n return withRadius;\n }\n return nextLayer;\n });\n}\n\n// Point/heatmap radius leftovers (`getRadius`, pixel units) break ColumnLayer meters UI.\nconst COLUMN_LAYER_RADIUS_CONFLICT_KEYS = [\n 'getRadius',\n 'radiusMinPixels',\n 'radiusMaxPixels',\n 'radiusPixels',\n] as const;\n\n/** Force meters and strip point/heatmap radius leftovers (does not set `radius`). */\nexport function stripDeckMapColumnLayerRadiusConflicts(\n layer: DeckMapLayerRecord,\n): DeckMapLayerRecord {\n const next: DeckMapLayerRecord = {\n ...layer,\n radiusUnits: 'meters',\n };\n for (const key of COLUMN_LAYER_RADIUS_CONFLICT_KEYS) {\n delete next[key];\n }\n return next;\n}\n\n/** True when ColumnLayer still carries point/heatmap radius props or pixel units. */\nexport function deckMapColumnLayerHasRadiusConflicts(\n layer: DeckMapLayerRecord,\n): boolean {\n if (layer.radiusUnits === 'pixels') return true;\n return COLUMN_LAYER_RADIUS_CONFLICT_KEYS.some(\n (key) => layer[key] !== undefined,\n );\n}\n\n/** Apply a column radius in meters and strip conflicting point/heatmap radius props. */\nexport function applyDeckMapColumnRadiusMeters(\n layer: DeckMapLayerRecord,\n radiusMeters: number,\n): DeckMapLayerRecord {\n return {\n ...stripDeckMapColumnLayerRadiusConflicts(layer),\n radius: radiusMeters,\n radiusUnits: 'meters',\n };\n}\n\n/** Set GeoArrowColumnLayer disk radius in meters. */\nexport function setDeckMapLayerColumnRadius(\n config: DeckMapConfig,\n layerIndex: number,\n radiusMeters: number,\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) =>\n applyDeckMapColumnRadiusMeters(layer, radiusMeters),\n );\n}\n\nexport function setDeckMapLayerGeometryColumn(\n config: DeckMapConfig,\n layerIndex: number,\n geometryColumn: string,\n): DeckMapConfig {\n const layer = getDeckMapLayerRecords(config)[layerIndex];\n const datasetId = getDeckMapLayerDatasetId(layer);\n if (!datasetId || !config.datasets?.[datasetId]) {\n return config;\n }\n\n const updatedConfig = {\n ...config,\n datasets: {\n ...config.datasets,\n [datasetId]: {\n ...config.datasets[datasetId],\n geometryColumn,\n },\n },\n fitToData:\n config.fitToData &&\n config.fitToData.dataset === datasetId &&\n 'geometryColumn' in config.fitToData\n ? {\n ...config.fitToData,\n geometryColumn,\n }\n : config.fitToData,\n };\n\n return updateDeckMapLayer(updatedConfig, layerIndex, (l) => ({\n ...l,\n _sqlroomsBinding: {\n ...(l._sqlroomsBinding as Record<string, unknown>),\n geometryColumn,\n },\n }));\n}\n\nexport function setDeckMapLayerHexagonColumn(\n config: DeckMapConfig,\n layerIndex: number,\n hexagonColumn: string,\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) => ({\n ...layer,\n getHexagon: `@@=${hexagonColumn}`,\n _sqlroomsBinding: {\n ...(isRecord(layer._sqlroomsBinding) ? layer._sqlroomsBinding : {}),\n hexagonColumn,\n },\n }));\n}\n\nexport function setDeckMapLayerArcColumns(\n config: DeckMapConfig,\n layerIndex: number,\n columns: {\n sourceGeometryColumn?: string;\n targetGeometryColumn?: string;\n sourceLatitudeColumn?: string;\n sourceLongitudeColumn?: string;\n targetLatitudeColumn?: string;\n targetLongitudeColumn?: string;\n },\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) => ({\n ...layer,\n _sqlroomsBinding: {\n ...(isRecord(layer._sqlroomsBinding) ? layer._sqlroomsBinding : {}),\n ...columns,\n },\n }));\n}\n\nexport function setDeckMapLayerTimestampColumn(\n config: DeckMapConfig,\n layerIndex: number,\n timestampColumn: string,\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) => ({\n ...layer,\n _sqlroomsBinding: {\n ...(isRecord(layer._sqlroomsBinding) ? layer._sqlroomsBinding : {}),\n timestampColumn,\n },\n }));\n}\n\nexport function getDeckMapLayerColorScale(\n layer: DeckMapLayerRecord | undefined,\n accessor: DeckMapLayerColorAccessor,\n): DeckMapLayerColorScaleFunction | undefined {\n const value = layer?.[accessor];\n return isColorScaleFunction(value)\n ? (value as DeckMapLayerColorScaleFunction)\n : undefined;\n}\n\nexport function setDeckMapLayerColorScale(\n config: DeckMapConfig,\n layerIndex: number,\n accessor: DeckMapLayerColorAccessor,\n colorScale: DeckMapLayerColorScaleFunction,\n): DeckMapConfig {\n return updateDeckMapLayer(config, layerIndex, (layer) => ({\n ...layer,\n [accessor]: colorScale,\n }));\n}\n\nconst DEFAULT_LAYER_FILL_COLOR: [number, number, number, number] = [\n 56, 189, 248, 180,\n];\n\nconst DEFAULT_LAYER_STROKE_COLOR: [number, number, number, number] = [\n 0, 0, 0, 255,\n];\n\n/** Default flat fill RGBA. */\nexport const DECK_MAP_DEFAULT_LAYER_COLOR: readonly [\n number,\n number,\n number,\n number,\n] = DEFAULT_LAYER_FILL_COLOR;\n\n/** Default stroke RGBA. */\nexport const DECK_MAP_DEFAULT_STROKE_COLOR: readonly [\n number,\n number,\n number,\n number,\n] = DEFAULT_LAYER_STROKE_COLOR;\n\n/** True when `value` is a 3- or 4-channel numeric RGB(A) array. */\nexport function isDeckMapLayerFlatRgbaColor(\n value: unknown,\n): value is [number, number, number, number?] {\n return (\n Array.isArray(value) &&\n value.length >= 3 &&\n value.length <= 4 &&\n value.every(\n (channel) => typeof channel === 'number' && Number.isFinite(channel),\n )\n );\n}\n\n/** Flat RGBA for an accessor, or undefined if scaled/missing. */\nexport function getDeckMapLayerFlatColor(\n layer: DeckMapLayerRecord | undefined,\n accessor: DeckMapLayerColorAccessor,\n): [number, number, number, number] | undefined {\n const value = layer?.[accessor];\n if (!isDeckMapLayerFlatRgbaColor(value)) return undefined;\n return [value[0]!, value[1]!, value[2]!, value[3] ?? 255];\n}\n\n/** Set a color accessor to a constant RGB(A); alpha defaults to 255. */\nexport function setDeckMapLayerFlatColor(\n config: DeckMapConfig,\n layerIndex: number,\n accessor: DeckMapLayerColorAccessor,\n color: readonly [number, number, number, number?],\n): DeckMapConfig {\n const rgba: [number, number, number, number] = [\n color[0],\n color[1],\n color[2],\n color[3] ?? 255,\n ];\n return updateDeckMapLayer(config, layerIndex, (layer) => ({\n ...layer,\n [accessor]: rgba,\n }));\n}\n\n/** RGBA → `#rrggbb` for `<input type=\"color\">`. */\nexport function deckMapRgbaToHex(\n color: readonly [number, number, number, number?],\n): string {\n const toHex = (channel: number) =>\n Math.max(0, Math.min(255, Math.round(channel)))\n .toString(16)\n .padStart(2, '0');\n return `#${toHex(color[0])}${toHex(color[1])}${toHex(color[2])}`;\n}\n\nexport function clearDeckMapLayerColorScale(\n config: DeckMapConfig,\n layerIndex: number,\n accessor: DeckMapLayerColorAccessor,\n): DeckMapConfig {\n const defaultColor =\n accessor === 'getLineColor'\n ? DECK_MAP_DEFAULT_STROKE_COLOR\n : DECK_MAP_DEFAULT_LAYER_COLOR;\n return updateDeckMapLayer(config, layerIndex, (layer) =>\n replaceDeckMapLayerColorScaleWithFlat(layer, accessor, defaultColor),\n );\n}\n\nexport function createDeckMapLayerColorScale(options: {\n field: string;\n type?: ColorScaleConfig['type'];\n scheme?: ColorScaleScheme;\n title?: string;\n /** Per-accessor opacity 0–1. */\n opacity?: number;\n}): DeckMapLayerColorScaleFunction {\n const type = options.type ?? 'sequential';\n const scheme =\n options.scheme ??\n DECK_MAP_COLOR_SCALE_TYPE_OPTIONS.find((option) => option.value === type)\n ?.defaultScheme ??\n 'Viridis';\n const opacity =\n typeof options.opacity === 'number' && Number.isFinite(options.opacity)\n ? Math.max(0, Math.min(1, options.opacity))\n : undefined;\n const base = {\n '@@function': 'colorScale' as const,\n field: options.field,\n legend: {title: options.title ?? options.field},\n ...(opacity !== undefined ? {opacity} : {}),\n };\n\n if (type === 'categorical') {\n return {\n ...base,\n type,\n scheme: scheme as Extract<\n ColorScaleConfig,\n {type: 'categorical'}\n >['scheme'],\n };\n }\n\n if (type === 'diverging') {\n return {\n ...base,\n type,\n scheme: scheme as Extract<\n ColorScaleConfig,\n {type: 'diverging'}\n >['scheme'],\n domain: 'auto',\n };\n }\n\n if (type === 'quantize') {\n return {\n ...base,\n type,\n scheme: scheme as Extract<ColorScaleConfig, {type: 'quantize'}>['scheme'],\n domain: 'auto',\n };\n }\n\n if (type === 'quantile') {\n return {\n ...base,\n type,\n scheme: scheme as Extract<ColorScaleConfig, {type: 'quantile'}>['scheme'],\n };\n }\n\n if (type === 'threshold') {\n return {\n ...base,\n type,\n scheme: scheme as Extract<\n ColorScaleConfig,\n {type: 'threshold'}\n >['scheme'],\n thresholds: [],\n };\n }\n\n return {\n ...base,\n type: 'sequential',\n scheme: scheme as Extract<ColorScaleConfig, {type: 'sequential'}>['scheme'],\n domain: 'auto',\n };\n}\n"]}
@@ -19,6 +19,8 @@ export declare class DeckMapResourceConfigError extends Error {
19
19
  readonly issues: DeckMapResourceConfigIssue[];
20
20
  constructor(issues: DeckMapResourceConfigIssue[]);
21
21
  }
22
+ /** Issue when colorScale `type` and `scheme` disagree or are incomplete. */
23
+ export declare function getColorScaleTypeSchemeIssue(type: unknown, scheme: unknown): string | undefined;
22
24
  /**
23
25
  * Merges a sparse map-tool patch with durable state. Empty dataset registries
24
26
  * and layer arrays mean "preserve" only when an existing resource is present.
@@ -33,7 +35,7 @@ export declare function getDeckMapResourceConfigIssues(config: DeckMapConfig, op
33
35
  /** Rejects invalid durable map writes after sparse patches have been merged. */
34
36
  export declare function assertDeckMapResourceConfig(config: DeckMapConfig): void;
35
37
  /**
36
- * Returns the package-owned authoring contract for hosts with direct worksheet
38
+ * Returns the package-owned authoring contract for hosts with direct document
37
39
  * map capability. Host adapters opt into it; they do not maintain prompt copies.
38
40
  */
39
41
  export declare function getDeckMapResourceAiInstructions(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"mapResourceAuthoring.d.ts","sourceRoot":"","sources":["../src/mapResourceAuthoring.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,aAAa,CAAC;AAM/C,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,sCAAsC,GAAG;IACnD,yEAAyE;IACzE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,8EAA8E;AAC9E,MAAM,MAAM,iCAAiC,GAAG;IAC9C,8EAA8E;IAC9E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sEAAsE;IACtE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,0EAA0E;AAC1E,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,QAAQ,CAAC,MAAM,EAAE,0BAA0B,EAAE,CAAC;gBAElC,MAAM,EAAE,0BAA0B,EAAE;CASjD;AAkHD;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,cAAc,EAAE,aAAa,GAAG,SAAS,EACzC,cAAc,EAAE,aAAa,EAC7B,OAAO,GAAE,iCAAsC,GAC9C,aAAa,CAoBf;AAmCD;;;;GAIG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE,sCAA2C,GACnD,0BAA0B,EAAE,CAqG9B;AAED,gFAAgF;AAChF,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAGvE;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,IAAI,MAAM,CAkBzD"}
1
+ {"version":3,"file":"mapResourceAuthoring.d.ts","sourceRoot":"","sources":["../src/mapResourceAuthoring.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAC,aAAa,EAAuB,MAAM,aAAa,CAAC;AASrE,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,sCAAsC,GAAG;IACnD,yEAAyE;IACzE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,8EAA8E;AAC9E,MAAM,MAAM,iCAAiC,GAAG;IAC9C,8EAA8E;IAC9E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sEAAsE;IACtE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,0EAA0E;AAC1E,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,QAAQ,CAAC,MAAM,EAAE,0BAA0B,EAAE,CAAC;gBAElC,MAAM,EAAE,0BAA0B,EAAE;CASjD;AAOD,4EAA4E;AAC5E,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,OAAO,GACd,MAAM,GAAG,SAAS,CAyDpB;AA8LD;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,cAAc,EAAE,aAAa,GAAG,SAAS,EACzC,cAAc,EAAE,aAAa,EAC7B,OAAO,GAAE,iCAAsC,GAC9C,aAAa,CAoBf;AA8DD;;;;GAIG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE,sCAA2C,GACnD,0BAA0B,EAAE,CA6a9B;AAED,gFAAgF;AAChF,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAGvE;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,IAAI,MAAM,CAqBzD"}