@sqlrooms/deck 0.29.0-rc.10

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 (251) hide show
  1. package/LICENSE.md +10 -0
  2. package/README.md +654 -0
  3. package/dist/BlockMapSettings.d.ts +3 -0
  4. package/dist/BlockMapSettings.d.ts.map +1 -0
  5. package/dist/BlockMapSettings.js +57 -0
  6. package/dist/BlockMapSettings.js.map +1 -0
  7. package/dist/DashboardMapSettings.d.ts +7 -0
  8. package/dist/DashboardMapSettings.d.ts.map +1 -0
  9. package/dist/DashboardMapSettings.js +52 -0
  10. package/dist/DashboardMapSettings.js.map +1 -0
  11. package/dist/DeckJsonMap.d.ts +4 -0
  12. package/dist/DeckJsonMap.d.ts.map +1 -0
  13. package/dist/DeckJsonMap.js +370 -0
  14. package/dist/DeckJsonMap.js.map +1 -0
  15. package/dist/DeckJsonMapSpec.d.ts +7617 -0
  16. package/dist/DeckJsonMapSpec.d.ts.map +1 -0
  17. package/dist/DeckJsonMapSpec.js +82 -0
  18. package/dist/DeckJsonMapSpec.js.map +1 -0
  19. package/dist/DeckMapDefaultStylesProvider.d.ts +28 -0
  20. package/dist/DeckMapDefaultStylesProvider.d.ts.map +1 -0
  21. package/dist/DeckMapDefaultStylesProvider.js +23 -0
  22. package/dist/DeckMapDefaultStylesProvider.js.map +1 -0
  23. package/dist/DeckMapSurface.d.ts +39 -0
  24. package/dist/DeckMapSurface.d.ts.map +1 -0
  25. package/dist/DeckMapSurface.js +137 -0
  26. package/dist/DeckMapSurface.js.map +1 -0
  27. package/dist/DeckMapsSlice.d.ts +99 -0
  28. package/dist/DeckMapsSlice.d.ts.map +1 -0
  29. package/dist/DeckMapsSlice.js +89 -0
  30. package/dist/DeckMapsSlice.js.map +1 -0
  31. package/dist/MapSettings.d.ts +16 -0
  32. package/dist/MapSettings.d.ts.map +1 -0
  33. package/dist/MapSettings.js +292 -0
  34. package/dist/MapSettings.js.map +1 -0
  35. package/dist/MapSettingsControls.d.ts +40 -0
  36. package/dist/MapSettingsControls.d.ts.map +1 -0
  37. package/dist/MapSettingsControls.js +54 -0
  38. package/dist/MapSettingsControls.js.map +1 -0
  39. package/dist/ai.d.ts +261 -0
  40. package/dist/ai.d.ts.map +1 -0
  41. package/dist/ai.js +392 -0
  42. package/dist/ai.js.map +1 -0
  43. package/dist/block.d.ts +21 -0
  44. package/dist/block.d.ts.map +1 -0
  45. package/dist/block.js +105 -0
  46. package/dist/block.js.map +1 -0
  47. package/dist/blockDocumentRegistration.d.ts +45 -0
  48. package/dist/blockDocumentRegistration.d.ts.map +1 -0
  49. package/dist/blockDocumentRegistration.js +68 -0
  50. package/dist/blockDocumentRegistration.js.map +1 -0
  51. package/dist/createDeckJsonSpecFromDatasets.d.ts +11 -0
  52. package/dist/createDeckJsonSpecFromDatasets.d.ts.map +1 -0
  53. package/dist/createDeckJsonSpecFromDatasets.js +85 -0
  54. package/dist/createDeckJsonSpecFromDatasets.js.map +1 -0
  55. package/dist/createOrUpdateDeckMapResource.d.ts +81 -0
  56. package/dist/createOrUpdateDeckMapResource.d.ts.map +1 -0
  57. package/dist/createOrUpdateDeckMapResource.js +82 -0
  58. package/dist/createOrUpdateDeckMapResource.js.map +1 -0
  59. package/dist/dashboard.d.ts +6 -0
  60. package/dist/dashboard.d.ts.map +1 -0
  61. package/dist/dashboard.js +337 -0
  62. package/dist/dashboard.js.map +1 -0
  63. package/dist/dashboardConfig.d.ts +25 -0
  64. package/dist/dashboardConfig.d.ts.map +1 -0
  65. package/dist/dashboardConfig.js +82 -0
  66. package/dist/dashboardConfig.js.map +1 -0
  67. package/dist/dashboardIntegration.d.ts +3 -0
  68. package/dist/dashboardIntegration.d.ts.map +1 -0
  69. package/dist/dashboardIntegration.js +16 -0
  70. package/dist/dashboardIntegration.js.map +1 -0
  71. package/dist/datasetSourceUtils.d.ts +16 -0
  72. package/dist/datasetSourceUtils.d.ts.map +1 -0
  73. package/dist/datasetSourceUtils.js +25 -0
  74. package/dist/datasetSourceUtils.js.map +1 -0
  75. package/dist/datasets/PreparedDatasetStore.d.ts +120 -0
  76. package/dist/datasets/PreparedDatasetStore.d.ts.map +1 -0
  77. package/dist/datasets/PreparedDatasetStore.js +268 -0
  78. package/dist/datasets/PreparedDatasetStore.js.map +1 -0
  79. package/dist/datasets/helpers.d.ts +57 -0
  80. package/dist/datasets/helpers.d.ts.map +1 -0
  81. package/dist/datasets/helpers.js +155 -0
  82. package/dist/datasets/helpers.js.map +1 -0
  83. package/dist/datasets/normalizeDatasets.d.ts +11 -0
  84. package/dist/datasets/normalizeDatasets.d.ts.map +1 -0
  85. package/dist/datasets/normalizeDatasets.js +50 -0
  86. package/dist/datasets/normalizeDatasets.js.map +1 -0
  87. package/dist/datasets/tableAdapter.d.ts +11 -0
  88. package/dist/datasets/tableAdapter.d.ts.map +1 -0
  89. package/dist/datasets/tableAdapter.js +11 -0
  90. package/dist/datasets/tableAdapter.js.map +1 -0
  91. package/dist/datasets/tableDatasetSql.d.ts +16 -0
  92. package/dist/datasets/tableDatasetSql.d.ts.map +1 -0
  93. package/dist/datasets/tableDatasetSql.js +49 -0
  94. package/dist/datasets/tableDatasetSql.js.map +1 -0
  95. package/dist/datasets/types.d.ts +40 -0
  96. package/dist/datasets/types.d.ts.map +1 -0
  97. package/dist/datasets/types.js +2 -0
  98. package/dist/datasets/types.js.map +1 -0
  99. package/dist/datasets/usePreparedDatasetStates.d.ts +16 -0
  100. package/dist/datasets/usePreparedDatasetStates.d.ts.map +1 -0
  101. package/dist/datasets/usePreparedDatasetStates.js +59 -0
  102. package/dist/datasets/usePreparedDatasetStates.js.map +1 -0
  103. package/dist/index.d.ts +34 -0
  104. package/dist/index.d.ts.map +1 -0
  105. package/dist/index.js +27 -0
  106. package/dist/index.js.map +1 -0
  107. package/dist/json/aggregateWaypoints.d.ts +14 -0
  108. package/dist/json/aggregateWaypoints.d.ts.map +1 -0
  109. package/dist/json/aggregateWaypoints.js +190 -0
  110. package/dist/json/aggregateWaypoints.js.map +1 -0
  111. package/dist/json/colorScaleFunction.d.ts +27 -0
  112. package/dist/json/colorScaleFunction.d.ts.map +1 -0
  113. package/dist/json/colorScaleFunction.js +46 -0
  114. package/dist/json/colorScaleFunction.js.map +1 -0
  115. package/dist/json/compileColorScale.d.ts +12 -0
  116. package/dist/json/compileColorScale.d.ts.map +1 -0
  117. package/dist/json/compileColorScale.js +125 -0
  118. package/dist/json/compileColorScale.js.map +1 -0
  119. package/dist/json/compileGeoArrowAccessor.d.ts +18 -0
  120. package/dist/json/compileGeoArrowAccessor.d.ts.map +1 -0
  121. package/dist/json/compileGeoArrowAccessor.js +129 -0
  122. package/dist/json/compileGeoArrowAccessor.js.map +1 -0
  123. package/dist/json/createDeckJsonConfiguration.d.ts +9 -0
  124. package/dist/json/createDeckJsonConfiguration.d.ts.map +1 -0
  125. package/dist/json/createDeckJsonConfiguration.js +315 -0
  126. package/dist/json/createDeckJsonConfiguration.js.map +1 -0
  127. package/dist/json/defaultClasses.d.ts +12 -0
  128. package/dist/json/defaultClasses.d.ts.map +1 -0
  129. package/dist/json/defaultClasses.js +35 -0
  130. package/dist/json/defaultClasses.js.map +1 -0
  131. package/dist/json/extractColorScaleLegends.d.ts +8 -0
  132. package/dist/json/extractColorScaleLegends.d.ts.map +1 -0
  133. package/dist/json/extractColorScaleLegends.js +86 -0
  134. package/dist/json/extractColorScaleLegends.js.map +1 -0
  135. package/dist/json/heatmapDefaults.d.ts +8 -0
  136. package/dist/json/heatmapDefaults.d.ts.map +1 -0
  137. package/dist/json/heatmapDefaults.js +14 -0
  138. package/dist/json/heatmapDefaults.js.map +1 -0
  139. package/dist/json/layerCompatibility.d.ts +21 -0
  140. package/dist/json/layerCompatibility.d.ts.map +1 -0
  141. package/dist/json/layerCompatibility.js +168 -0
  142. package/dist/json/layerCompatibility.js.map +1 -0
  143. package/dist/json/layerConfig.d.ts +14 -0
  144. package/dist/json/layerConfig.d.ts.map +1 -0
  145. package/dist/json/layerConfig.js +54 -0
  146. package/dist/json/layerConfig.js.map +1 -0
  147. package/dist/json/layers/DeckColumnLayer.d.ts +10 -0
  148. package/dist/json/layers/DeckColumnLayer.d.ts.map +1 -0
  149. package/dist/json/layers/DeckColumnLayer.js +26 -0
  150. package/dist/json/layers/DeckColumnLayer.js.map +1 -0
  151. package/dist/json/layers/DeckH3HexagonLayer.d.ts +37 -0
  152. package/dist/json/layers/DeckH3HexagonLayer.d.ts.map +1 -0
  153. package/dist/json/layers/DeckH3HexagonLayer.js +118 -0
  154. package/dist/json/layers/DeckH3HexagonLayer.js.map +1 -0
  155. package/dist/json/layers/DeckTripsLayer.d.ts +46 -0
  156. package/dist/json/layers/DeckTripsLayer.d.ts.map +1 -0
  157. package/dist/json/layers/DeckTripsLayer.js +170 -0
  158. package/dist/json/layers/DeckTripsLayer.js.map +1 -0
  159. package/dist/json/layers/createTableToRecordBatchAdapter.d.ts +20 -0
  160. package/dist/json/layers/createTableToRecordBatchAdapter.d.ts.map +1 -0
  161. package/dist/json/layers/createTableToRecordBatchAdapter.js +81 -0
  162. package/dist/json/layers/createTableToRecordBatchAdapter.js.map +1 -0
  163. package/dist/json/layers/index.d.ts +5 -0
  164. package/dist/json/layers/index.d.ts.map +1 -0
  165. package/dist/json/layers/index.js +5 -0
  166. package/dist/json/layers/index.js.map +1 -0
  167. package/dist/json/rewriteGeoArrowAccessors.d.ts +7 -0
  168. package/dist/json/rewriteGeoArrowAccessors.d.ts.map +1 -0
  169. package/dist/json/rewriteGeoArrowAccessors.js +55 -0
  170. package/dist/json/rewriteGeoArrowAccessors.js.map +1 -0
  171. package/dist/mapAiConfig.d.ts +111 -0
  172. package/dist/mapAiConfig.d.ts.map +1 -0
  173. package/dist/mapAiConfig.js +69 -0
  174. package/dist/mapAiConfig.js.map +1 -0
  175. package/dist/mapConfig.d.ts +73 -0
  176. package/dist/mapConfig.d.ts.map +1 -0
  177. package/dist/mapConfig.js +47 -0
  178. package/dist/mapConfig.js.map +1 -0
  179. package/dist/mapConfigUtils.d.ts +111 -0
  180. package/dist/mapConfigUtils.d.ts.map +1 -0
  181. package/dist/mapConfigUtils.js +502 -0
  182. package/dist/mapConfigUtils.js.map +1 -0
  183. package/dist/mapDataPolicy.d.ts +9 -0
  184. package/dist/mapDataPolicy.d.ts.map +1 -0
  185. package/dist/mapDataPolicy.js +25 -0
  186. package/dist/mapDataPolicy.js.map +1 -0
  187. package/dist/mapFit.d.ts +62 -0
  188. package/dist/mapFit.d.ts.map +1 -0
  189. package/dist/mapFit.js +325 -0
  190. package/dist/mapFit.js.map +1 -0
  191. package/dist/mapLayerConfigUtils.d.ts +54 -0
  192. package/dist/mapLayerConfigUtils.d.ts.map +1 -0
  193. package/dist/mapLayerConfigUtils.js +296 -0
  194. package/dist/mapLayerConfigUtils.js.map +1 -0
  195. package/dist/mapResourceAuthoring.d.ts +40 -0
  196. package/dist/mapResourceAuthoring.d.ts.map +1 -0
  197. package/dist/mapResourceAuthoring.js +266 -0
  198. package/dist/mapResourceAuthoring.js.map +1 -0
  199. package/dist/mosaic.d.ts +9 -0
  200. package/dist/mosaic.d.ts.map +1 -0
  201. package/dist/mosaic.js +8 -0
  202. package/dist/mosaic.js.map +1 -0
  203. package/dist/prepare/detectGeometryColumn.d.ts +19 -0
  204. package/dist/prepare/detectGeometryColumn.d.ts.map +1 -0
  205. package/dist/prepare/detectGeometryColumn.js +126 -0
  206. package/dist/prepare/detectGeometryColumn.js.map +1 -0
  207. package/dist/prepare/geoarrow.d.ts +18 -0
  208. package/dist/prepare/geoarrow.d.ts.map +1 -0
  209. package/dist/prepare/geoarrow.js +114 -0
  210. package/dist/prepare/geoarrow.js.map +1 -0
  211. package/dist/prepare/geometryDecoder.d.ts +8 -0
  212. package/dist/prepare/geometryDecoder.d.ts.map +1 -0
  213. package/dist/prepare/geometryDecoder.js +2 -0
  214. package/dist/prepare/geometryDecoder.js.map +1 -0
  215. package/dist/prepare/prepareDeckDataset.d.ts +57 -0
  216. package/dist/prepare/prepareDeckDataset.d.ts.map +1 -0
  217. package/dist/prepare/prepareDeckDataset.js +112 -0
  218. package/dist/prepare/prepareDeckDataset.js.map +1 -0
  219. package/dist/prepare/toGeoJsonBinary.d.ts +9 -0
  220. package/dist/prepare/toGeoJsonBinary.d.ts.map +1 -0
  221. package/dist/prepare/toGeoJsonBinary.js +26 -0
  222. package/dist/prepare/toGeoJsonBinary.js.map +1 -0
  223. package/dist/prepare/types.d.ts +25 -0
  224. package/dist/prepare/types.d.ts.map +1 -0
  225. package/dist/prepare/types.js +2 -0
  226. package/dist/prepare/types.js.map +1 -0
  227. package/dist/prepare/wkbDecoder.d.ts +3 -0
  228. package/dist/prepare/wkbDecoder.d.ts.map +1 -0
  229. package/dist/prepare/wkbDecoder.js +419 -0
  230. package/dist/prepare/wkbDecoder.js.map +1 -0
  231. package/dist/prepare/wkbParser.d.ts +24 -0
  232. package/dist/prepare/wkbParser.d.ts.map +1 -0
  233. package/dist/prepare/wkbParser.js +139 -0
  234. package/dist/prepare/wkbParser.js.map +1 -0
  235. package/dist/types.d.ts +92 -0
  236. package/dist/types.d.ts.map +1 -0
  237. package/dist/types.js +11 -0
  238. package/dist/types.js.map +1 -0
  239. package/dist/useDeckMapDatasetSchema.d.ts +33 -0
  240. package/dist/useDeckMapDatasetSchema.d.ts.map +1 -0
  241. package/dist/useDeckMapDatasetSchema.js +138 -0
  242. package/dist/useDeckMapDatasetSchema.js.map +1 -0
  243. package/dist/useDeckMapDatasets.d.ts +17 -0
  244. package/dist/useDeckMapDatasets.d.ts.map +1 -0
  245. package/dist/useDeckMapDatasets.js +69 -0
  246. package/dist/useDeckMapDatasets.js.map +1 -0
  247. package/dist/useDeckMapFitToBounds.d.ts +31 -0
  248. package/dist/useDeckMapFitToBounds.d.ts.map +1 -0
  249. package/dist/useDeckMapFitToBounds.js +58 -0
  250. package/dist/useDeckMapFitToBounds.js.map +1 -0
  251. package/package.json +98 -0
@@ -0,0 +1,16 @@
1
+ import { FC } from 'react';
2
+ import { type DataTable } from '@sqlrooms/duckdb';
3
+ import { type DeckMapConfig } from './mapConfig';
4
+ export interface DeckMapSettingsPanelProps {
5
+ title: string;
6
+ selectedTable?: string;
7
+ config: DeckMapConfig;
8
+ tables: DataTable[];
9
+ onClose?: () => void;
10
+ onTableChange: (table: DataTable) => void;
11
+ onTitleChange: (title: string) => void;
12
+ onConfigChange: (config: DeckMapConfig) => void;
13
+ readOnly?: boolean;
14
+ }
15
+ export declare const DeckMapSettingsPanel: FC<DeckMapSettingsPanelProps>;
16
+ //# sourceMappingURL=MapSettings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MapSettings.d.ts","sourceRoot":"","sources":["../src/MapSettings.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,EAAE,EAAiC,MAAM,OAAO,CAAC;AACzD,OAAO,EAGL,KAAK,SAAS,EACf,MAAM,kBAAkB,CAAC;AAqB1B,OAAO,EAA8B,KAAK,aAAa,EAAC,MAAM,aAAa,CAAC;AAoF5E,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,aAAa,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IAC1C,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,cAAc,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAeD,eAAO,MAAM,oBAAoB,EAAE,EAAE,CAAC,yBAAyB,CAs5B9D,CAAC"}
@@ -0,0 +1,292 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useCallback, useMemo, useState } from 'react';
3
+ import { getTableIdentity, resolveTableReference, } from '@sqlrooms/duckdb';
4
+ import { binnedNumericSchemes, categoricalSchemes, continuousDivergingSchemes, continuousSequentialSchemes, continuousSequentialInterpolators, parseColorString, } from '@sqlrooms/color-scales';
5
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Slider, ScrollArea, SettingsPanelHeader, Switch, } from '@sqlrooms/ui';
6
+ import { isDeckMapTableDatasetSource } from './mapConfig';
7
+ import { clearDeckMapLayerColorScale, createDeckMapLayerColorScale, DECK_MAP_COLOR_SCALE_TYPE_OPTIONS, DECK_MAP_LAYER_TYPE_OPTIONS, getDeckMapColorAccessorOptions, getDeckMapLayerDatasetId, getDeckMapLayerColorScale, getDeckMapLayerRecords, setDeckMapLayerColorScale, setDeckMapLayerGeometryColumn, setDeckMapLayerHexagonColumn, setDeckMapLayerArcColumns, setDeckMapLayerTimestampColumn, setDeckMapLayerType, updateDeckMapLayer, usesGeometryColumnSetting, usesH3ColumnSetting, usesArcColumnSetting, usesRadiusSetting, usesColumnRadiusSetting, usesTripsSettings, usesExtrusionSettings, } from './mapLayerConfigUtils';
8
+ import { DeckMapCodeViewerPanel, DeckMapCodeViewToggleButton, DeckMapColumnSelector as ColumnSelector, DeckMapColumnsProvider as ColumnsProvider, DeckMapSettingsField as Field, DeckMapTableSelector as DataTableSelector, } from './MapSettingsControls';
9
+ import { regenerateMapConfigForTable } from './mapConfigUtils';
10
+ import { useDeckMapDatasetSchema } from './useDeckMapDatasetSchema';
11
+ const HEATMAP_COLOR_STEPS = 6;
12
+ const EMPTY_COLUMNS = [];
13
+ function schemeToColorRange(scheme) {
14
+ const interpolator = continuousSequentialInterpolators[scheme];
15
+ if (!interpolator) {
16
+ return continuousSequentialInterpolators.Viridis
17
+ ? Array.from({ length: HEATMAP_COLOR_STEPS }, (_, i) => parseColorString(continuousSequentialInterpolators.Viridis(i / (HEATMAP_COLOR_STEPS - 1))))
18
+ : [];
19
+ }
20
+ return Array.from({ length: HEATMAP_COLOR_STEPS }, (_, i) => parseColorString(interpolator(i / (HEATMAP_COLOR_STEPS - 1))));
21
+ }
22
+ function detectHeatmapScheme(colorRange) {
23
+ if (!Array.isArray(colorRange) || colorRange.length === 0)
24
+ return 'Viridis';
25
+ for (const scheme of continuousSequentialSchemes) {
26
+ const sampled = schemeToColorRange(scheme);
27
+ if (sampled.length === colorRange.length) {
28
+ const matches = sampled.every((color, idx) => {
29
+ const actual = colorRange[idx];
30
+ if (!Array.isArray(actual))
31
+ return false;
32
+ return (Math.abs(color[0] - actual[0]) < 2 &&
33
+ Math.abs(color[1] - actual[1]) < 2 &&
34
+ Math.abs(color[2] - actual[2]) < 2);
35
+ });
36
+ if (matches)
37
+ return scheme;
38
+ }
39
+ }
40
+ return 'Viridis';
41
+ }
42
+ function getSchemeOptions(type) {
43
+ if (type === 'categorical') {
44
+ return categoricalSchemes;
45
+ }
46
+ if (type === 'diverging') {
47
+ return continuousDivergingSchemes;
48
+ }
49
+ if (type === 'sequential') {
50
+ return continuousSequentialSchemes;
51
+ }
52
+ return binnedNumericSchemes;
53
+ }
54
+ export const DeckMapSettingsPanel = ({ title, selectedTable, config, tables, onClose, onTableChange, onTitleChange, onConfigChange, readOnly, }) => {
55
+ const [layerIndex, setLayerIndex] = useState(0);
56
+ const [colorAccessor, setColorAccessor] = useState('getFillColor');
57
+ const [viewMode, setViewMode] = useState('settings');
58
+ const selectedDataTable = useMemo(() => selectedTable
59
+ ? resolveTableReference(tables, selectedTable).table
60
+ : undefined, [selectedTable, tables]);
61
+ const handleTableChange = useCallback((table) => {
62
+ if (readOnly)
63
+ return;
64
+ onTableChange(table);
65
+ }, [onTableChange, readOnly]);
66
+ const mapConfig = config;
67
+ const serializedMapConfig = useMemo(() => JSON.stringify(config, null, 2), [config]);
68
+ const showCode = viewMode === 'code';
69
+ const layers = getDeckMapLayerRecords(mapConfig);
70
+ const activeLayerIndex = Math.min(layerIndex, Math.max(layers.length - 1, 0));
71
+ const activeLayer = layers[activeLayerIndex];
72
+ const activeLayerDatasetId = getDeckMapLayerDatasetId(activeLayer);
73
+ const activeLayerDataset = activeLayerDatasetId
74
+ ? mapConfig.datasets?.[activeLayerDatasetId]
75
+ : undefined;
76
+ // Resolve the structured source table separately from the compiled dataset
77
+ // output. Coordinate selectors edit the source transform, while render
78
+ // bindings such as geometry/color/elevation target output columns.
79
+ const activeLayerDatasetSource = activeLayerDataset?.source;
80
+ const fallbackTableName = isDeckMapTableDatasetSource(activeLayerDatasetSource)
81
+ ? activeLayerDatasetSource.tableName
82
+ : undefined;
83
+ const fallbackTable = useMemo(() => fallbackTableName
84
+ ? resolveTableReference(tables, fallbackTableName).table
85
+ : undefined, [fallbackTableName, tables]);
86
+ const sourceDataTable = selectedDataTable ?? fallbackTable;
87
+ const sourceColumns = sourceDataTable?.columns ?? EMPTY_COLUMNS;
88
+ const resolvedActiveLayerDatasetSource = useMemo(() => {
89
+ if (!activeLayerDatasetSource) {
90
+ return selectedDataTable
91
+ ? { tableName: getTableIdentity(selectedDataTable.table) }
92
+ : undefined;
93
+ }
94
+ if (!isDeckMapTableDatasetSource(activeLayerDatasetSource)) {
95
+ return activeLayerDatasetSource;
96
+ }
97
+ return {
98
+ tableName: selectedDataTable
99
+ ? getTableIdentity(selectedDataTable.table)
100
+ : activeLayerDatasetSource.tableName,
101
+ ...(activeLayerDatasetSource.transformSql
102
+ ? { transformSql: activeLayerDatasetSource.transformSql }
103
+ : {}),
104
+ };
105
+ }, [activeLayerDatasetSource, selectedDataTable]);
106
+ const datasetSchema = useDeckMapDatasetSchema({
107
+ source: resolvedActiveLayerDatasetSource,
108
+ sourceColumns,
109
+ });
110
+ const outputColumns = datasetSchema.outputColumns;
111
+ const dataOutputColumns = datasetSchema.dataOutputColumns;
112
+ const datasetSchemaErrorMessage = datasetSchema.error?.message;
113
+ const showGeometryColumnSetting = usesGeometryColumnSetting(activeLayer?.['@@type']);
114
+ const showH3ColumnSetting = usesH3ColumnSetting(activeLayer?.['@@type']);
115
+ const showArcColumnSetting = usesArcColumnSetting(activeLayer?.['@@type']);
116
+ const showRadiusSetting = usesRadiusSetting(activeLayer?.['@@type']);
117
+ const showColumnRadiusSetting = usesColumnRadiusSetting(activeLayer?.['@@type']);
118
+ const showTripsSettings = usesTripsSettings(activeLayer?.['@@type']);
119
+ const showExtrusionSettings = usesExtrusionSettings(activeLayer?.['@@type']);
120
+ const colorAccessorOptions = getDeckMapColorAccessorOptions(activeLayer?.['@@type']);
121
+ const effectiveColorAccessor = colorAccessorOptions.find((option) => option.value === colorAccessor)
122
+ ?.value ?? colorAccessorOptions[0]?.value;
123
+ const pointRadiusPixels = activeLayer?.radiusUnits === 'pixels' &&
124
+ typeof activeLayer?.getRadius === 'number'
125
+ ? activeLayer.getRadius
126
+ : (activeLayer?.radiusMinPixels ?? 2);
127
+ const colorScale = effectiveColorAccessor
128
+ ? getDeckMapLayerColorScale(activeLayer, effectiveColorAccessor)
129
+ : undefined;
130
+ const colorScaleType = colorScale?.type ?? 'sequential';
131
+ const schemeOptions = getSchemeOptions(colorScaleType);
132
+ const isHeatmapLayer = activeLayer?.['@@type'] === 'GeoArrowHeatmapLayer';
133
+ const firstColumnName = dataOutputColumns[0]?.name;
134
+ const applyConfig = useCallback((nextConfig) => {
135
+ if (readOnly)
136
+ return;
137
+ onConfigChange(nextConfig);
138
+ }, [onConfigChange, readOnly]);
139
+ const updateColorScale = (patch) => {
140
+ const field = patch.field ?? colorScale?.field ?? firstColumnName;
141
+ if (!field || !effectiveColorAccessor)
142
+ return;
143
+ const type = patch.type ?? colorScale?.type ?? 'sequential';
144
+ const scheme = patch.scheme ??
145
+ (patch.type && patch.type !== colorScale?.type
146
+ ? undefined
147
+ : colorScale?.scheme);
148
+ applyConfig(setDeckMapLayerColorScale(mapConfig, activeLayerIndex, effectiveColorAccessor, createDeckMapLayerColorScale({
149
+ field,
150
+ type,
151
+ scheme,
152
+ title: field,
153
+ })));
154
+ };
155
+ return (_jsxs("div", { className: "flex h-full min-h-0 flex-col", children: [_jsx(SettingsPanelHeader, { title: "Map settings", className: "shrink-0 p-2", actions: _jsx(DeckMapCodeViewToggleButton, { label: showCode ? 'Show settings' : 'View code', selected: showCode, onClick: () => setViewMode((currentViewMode) => currentViewMode === 'code' ? 'settings' : 'code') }), onClose: onClose, closeLabel: "Close map settings" }), showCode ? (_jsx(DeckMapCodeViewerPanel, { value: serializedMapConfig, copyTooltipLabel: "Copy map config" })) : (_jsx(ScrollArea, { className: "min-h-0 flex-1 [&_[data-radix-scroll-area-viewport]>div]:!block", children: _jsxs("div", { className: "flex flex-col gap-2 p-2 pt-0", children: [_jsx(Field, { label: "Title", children: _jsx("input", { value: title, onChange: (e) => onTitleChange(e.target.value), placeholder: "Map title", disabled: readOnly, className: "border-input placeholder:text-muted-foreground focus-visible:ring-ring h-8 w-full rounded-md border bg-transparent px-3 py-2 text-xs font-medium shadow-sm outline-hidden transition-colors focus-visible:ring-1 disabled:cursor-not-allowed disabled:opacity-50" }) }), _jsx(Field, { label: "Dataset", required: true, children: _jsx(DataTableSelector, { onChange: handleTableChange, tables: tables, value: selectedDataTable, disabled: readOnly }) }), layers.length > 0 && (_jsxs("div", { className: "flex flex-col gap-3", children: [layers.length > 1 && (_jsx(Field, { label: "Layer", children: _jsxs(Select, { value: String(activeLayerIndex), onValueChange: (value) => setLayerIndex(Number(value)), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: layers.map((layer, index) => (_jsx(SelectItem, { value: String(index), children: String(layer.id ?? `Layer ${index + 1}`) }, index))) })] }) })), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-xs font-medium", children: "Visible" }), _jsx(Switch, { checked: activeLayer?.visible !== false, onCheckedChange: (checked) => applyConfig(updateDeckMapLayer(mapConfig, activeLayerIndex, (layer) => ({
156
+ ...layer,
157
+ visible: checked,
158
+ }))) })] }), _jsx(Field, { label: "Layer type", children: _jsxs(Select, { value: typeof activeLayer?.['@@type'] === 'string'
159
+ ? activeLayer['@@type']
160
+ : undefined, onValueChange: (value) => applyConfig(setDeckMapLayerType(mapConfig, activeLayerIndex, value)), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, { placeholder: "Select layer type" }) }), _jsx(SelectContent, { children: DECK_MAP_LAYER_TYPE_OPTIONS.map((option) => (_jsx(SelectItem, { value: option.value, children: option.label }, option.value))) })] }) }), (datasetSchema.isLoading || datasetSchemaErrorMessage) && (_jsx("div", { className: "text-muted-foreground rounded-md border px-2 py-1.5 text-xs", children: datasetSchema.isLoading
161
+ ? 'Inspecting dataset schema...'
162
+ : `Dataset schema unavailable: ${datasetSchemaErrorMessage}` })), showTripsSettings && (_jsxs(_Fragment, { children: [outputColumns.length > 0 && (_jsx(ColumnsProvider, { columns: outputColumns, children: _jsx(Field, { label: "Timestamp column", required: true, children: _jsx(ColumnSelector, { value: activeLayer?._sqlroomsBinding?.timestampColumn, onChange: (timestampColumn) => applyConfig(setDeckMapLayerTimestampColumn(mapConfig, activeLayerIndex, timestampColumn)), placeholder: "Select timestamp column...", disabled: readOnly }) }) })), _jsx(Field, { label: `Line width: ${activeLayer?.widthMinPixels ?? 3}px`, children: _jsx(Slider, { min: 1, max: 20, step: 1, value: [
163
+ activeLayer?.widthMinPixels ??
164
+ 3,
165
+ ], onValueChange: (values) => {
166
+ const value = values[0] ?? 3;
167
+ applyConfig(updateDeckMapLayer(mapConfig, activeLayerIndex, (layer) => ({
168
+ ...layer,
169
+ widthMinPixels: value,
170
+ })));
171
+ } }) }), _jsx(Field, { label: `Trail length: ${Math.round((activeLayer?._trailLengthFactor ?? 0.4) * 100)}%`, children: _jsx(Slider, { min: 5, max: 100, step: 5, value: [
172
+ Math.round((activeLayer?._trailLengthFactor ?? 0.4) * 100),
173
+ ], onValueChange: (values) => {
174
+ const value = (values[0] ?? 40) / 100;
175
+ applyConfig(updateDeckMapLayer(mapConfig, activeLayerIndex, (layer) => ({
176
+ ...layer,
177
+ _trailLengthFactor: value,
178
+ })));
179
+ } }) })] })), isHeatmapLayer ? (_jsxs("div", { className: "flex flex-col gap-2 rounded-md border p-2", children: [_jsx("span", { className: "text-xs font-medium", children: "Color scheme (density)" }), _jsx(Field, { label: "Scheme", children: _jsxs(Select, { value: detectHeatmapScheme(activeLayer?.colorRange), onValueChange: (value) => applyConfig(updateDeckMapLayer(mapConfig, activeLayerIndex, (layer) => ({
180
+ ...layer,
181
+ colorRange: schemeToColorRange(value),
182
+ }))), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: continuousSequentialSchemes.map((scheme) => (_jsx(SelectItem, { value: scheme, children: scheme }, scheme))) })] }) })] })) : (_jsxs("div", { className: "flex flex-col gap-2 rounded-md border p-2", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx("span", { className: "text-xs font-medium", children: "Color scale" }), _jsx(Switch, { checked: Boolean(colorScale), onCheckedChange: (checked) => {
183
+ if (!effectiveColorAccessor)
184
+ return;
185
+ if (checked) {
186
+ updateColorScale({});
187
+ return;
188
+ }
189
+ applyConfig(clearDeckMapLayerColorScale(mapConfig, activeLayerIndex, effectiveColorAccessor));
190
+ }, disabled: !firstColumnName || !effectiveColorAccessor })] }), effectiveColorAccessor && (_jsx(Field, { label: "Color property", children: _jsxs(Select, { value: effectiveColorAccessor, onValueChange: (value) => setColorAccessor(value), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: colorAccessorOptions.map((option) => (_jsx(SelectItem, { value: option.value, children: option.label }, option.value))) })] }) })), colorScale && dataOutputColumns.length > 0 && (_jsx(ColumnsProvider, { columns: dataOutputColumns, children: _jsx(Field, { label: "Color field", required: true, children: colorScaleType === 'categorical' ? (_jsx(ColumnSelector.Categorical, { value: colorScale.field, onChange: (field) => updateColorScale({ field }), disabled: readOnly })) : (_jsx(ColumnSelector.Quantitative, { value: colorScale.field, onChange: (field) => updateColorScale({ field }), disabled: readOnly })) }) })), colorScale && (_jsxs(_Fragment, { children: [_jsx(Field, { label: "Scale type", children: _jsxs(Select, { value: colorScaleType, onValueChange: (value) => updateColorScale({
191
+ type: value,
192
+ }), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: DECK_MAP_COLOR_SCALE_TYPE_OPTIONS.map((option) => (_jsx(SelectItem, { value: option.value, children: option.label }, option.value))) })] }) }), _jsx(Field, { label: "Scheme", children: _jsxs(Select, { value: colorScale.scheme, onValueChange: (value) => updateColorScale({
193
+ scheme: value,
194
+ }), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: schemeOptions.map((scheme) => (_jsx(SelectItem, { value: scheme, children: scheme }, scheme))) })] }) })] }))] }))] })), isHeatmapLayer && (_jsx(Field, { label: `Radius: ${activeLayer?.radiusPixels ?? 30}px`, children: _jsx("div", { className: "pt-0.5", children: _jsx(Slider, { min: 1, max: 100, step: 1, value: [
195
+ activeLayer?.radiusPixels ?? 30,
196
+ ], onValueChange: (values) => {
197
+ const value = values[0] ?? 30;
198
+ applyConfig(updateDeckMapLayer(mapConfig, activeLayerIndex, (layer) => ({
199
+ ...layer,
200
+ radiusPixels: value,
201
+ })));
202
+ } }) }) })), showRadiusSetting && (_jsx(Field, { label: `Point radius: ${pointRadiusPixels}px`, children: _jsx("div", { className: "pt-0.5", children: _jsx(Slider, { min: 1, max: 50, step: 1, value: [pointRadiusPixels], onValueChange: (values) => {
203
+ const value = values[0] ?? 2;
204
+ applyConfig(updateDeckMapLayer(mapConfig, activeLayerIndex, (layer) => {
205
+ const nextLayer = {
206
+ ...layer,
207
+ radiusMinPixels: value,
208
+ radiusMaxPixels: Math.max(value, layer.radiusMaxPixels ??
209
+ value),
210
+ };
211
+ if (layer.radiusUnits === 'pixels' &&
212
+ typeof layer.getRadius !== 'string') {
213
+ nextLayer.getRadius = value;
214
+ }
215
+ return nextLayer;
216
+ }));
217
+ } }) }) })), showColumnRadiusSetting && (_jsx(Field, { label: `Column radius: ${activeLayer?.radius ?? 50}m`, children: _jsx("div", { className: "pt-0.5", children: _jsx(Slider, { min: 1, max: 10000, step: 1, value: [activeLayer?.radius ?? 50], onValueChange: (values) => {
218
+ const value = values[0] ?? 50;
219
+ applyConfig(updateDeckMapLayer(mapConfig, activeLayerIndex, (layer) => ({
220
+ ...layer,
221
+ radius: value,
222
+ })));
223
+ } }) }) })), outputColumns.length > 0 && showGeometryColumnSetting && (_jsx(ColumnsProvider, { columns: outputColumns, children: _jsx(Field, { label: "Geometry column", required: true, children: _jsx(ColumnSelector, { value: activeLayerDataset?.geometryColumn, onChange: (geometryColumn) => applyConfig(setDeckMapLayerGeometryColumn(mapConfig, activeLayerIndex, geometryColumn)), placeholder: "Select geometry column...", disabled: readOnly }) }) })), outputColumns.length > 0 && showH3ColumnSetting && (_jsx(ColumnsProvider, { columns: outputColumns, children: _jsx(Field, { label: "H3 column", required: true, children: _jsx(ColumnSelector, { value: activeLayer?._sqlroomsBinding
224
+ ?.hexagonColumn, onChange: (hexagonColumn) => applyConfig(setDeckMapLayerHexagonColumn(mapConfig, activeLayerIndex, hexagonColumn)), placeholder: "Select H3 index column...", disabled: readOnly }) }) })), outputColumns.length > 0 && showArcColumnSetting && (_jsxs(ColumnsProvider, { columns: outputColumns, children: [_jsx(Field, { label: "Source geometry", required: true, children: _jsx(ColumnSelector, { value: activeLayer?._sqlroomsBinding
225
+ ?.sourceGeometryColumn, onChange: (sourceGeometryColumn) => applyConfig(setDeckMapLayerArcColumns(mapConfig, activeLayerIndex, {
226
+ sourceGeometryColumn,
227
+ })), placeholder: "Select source geometry...", disabled: readOnly }) }), _jsx(Field, { label: "Target geometry", required: true, children: _jsx(ColumnSelector, { value: activeLayer?._sqlroomsBinding
228
+ ?.targetGeometryColumn, onChange: (targetGeometryColumn) => applyConfig(setDeckMapLayerArcColumns(mapConfig, activeLayerIndex, {
229
+ targetGeometryColumn,
230
+ })), placeholder: "Select target geometry...", disabled: readOnly }) })] })), showArcColumnSetting && (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-xs font-medium", children: "Flat lines" }), _jsx(Switch, { checked: activeLayer?.getHeight === 0, onCheckedChange: (checked) => applyConfig(updateDeckMapLayer(mapConfig, activeLayerIndex, (layer) => ({
231
+ ...layer,
232
+ getHeight: checked ? 0 : undefined,
233
+ }))) })] })), showArcColumnSetting && (_jsx(Field, { label: `Line width: ${activeLayer?.widthMinPixels ?? 1}px`, children: _jsx(Slider, { min: 1, max: 20, step: 1, value: [
234
+ activeLayer?.widthMinPixels ?? 1,
235
+ ], onValueChange: (values) => {
236
+ const value = values[0] ?? 1;
237
+ applyConfig(updateDeckMapLayer(mapConfig, activeLayerIndex, (layer) => ({
238
+ ...layer,
239
+ widthMinPixels: value,
240
+ })));
241
+ } }) })), showExtrusionSettings && (_jsxs("div", { className: "flex flex-col gap-2 rounded-md border p-2", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx("span", { className: "text-xs font-medium", children: "Extrusion" }), _jsx(Switch, { checked: Boolean(activeLayer?.extruded), onCheckedChange: (checked) => applyConfig(updateDeckMapLayer(mapConfig, activeLayerIndex, (layer) => ({
242
+ ...layer,
243
+ extruded: checked,
244
+ getElevation: checked
245
+ ? (layer.getElevation ?? 1)
246
+ : layer.getElevation,
247
+ }))) })] }), Boolean(activeLayer?.extruded) &&
248
+ dataOutputColumns.length > 0 && (_jsx(ColumnsProvider, { columns: dataOutputColumns, children: _jsx(Field, { label: "Elevation column", children: _jsx(ColumnSelector.Numeric, { value: (() => {
249
+ const elev = activeLayer?.getElevation;
250
+ if (elev &&
251
+ typeof elev === 'object' &&
252
+ '@@function' in elev) {
253
+ return elev.field;
254
+ }
255
+ if (typeof elev === 'string' &&
256
+ elev.startsWith('@@=')) {
257
+ return elev.slice(3);
258
+ }
259
+ return undefined;
260
+ })(), onChange: (elevationColumn) => applyConfig(updateDeckMapLayer(mapConfig, activeLayerIndex, (layer) => ({
261
+ ...layer,
262
+ getElevation: elevationColumn
263
+ ? {
264
+ '@@function': 'scale',
265
+ field: elevationColumn,
266
+ type: 'linear',
267
+ domain: 'auto',
268
+ range: [0, 200],
269
+ }
270
+ : undefined,
271
+ elevationScale: layer.elevationScale ?? 1,
272
+ }))), placeholder: "Select elevation column...", disabled: readOnly }) }) })), Boolean(activeLayer?.extruded) && (_jsx(Field, { label: `Elevation scale: ${activeLayer?.elevationScale ?? 1}x`, children: _jsx("div", { className: "pt-1.5", children: _jsx(Slider, { min: 0.01, max: 100, step: 0.01, value: [
273
+ activeLayer?.elevationScale ??
274
+ 1,
275
+ ], onValueChange: (values) => {
276
+ const value = values[0] ?? 1;
277
+ applyConfig(updateDeckMapLayer(mapConfig, activeLayerIndex, (layer) => ({
278
+ ...layer,
279
+ elevationScale: value,
280
+ })));
281
+ } }) }) }))] })), sourceDataTable &&
282
+ !showGeometryColumnSetting &&
283
+ !showH3ColumnSetting &&
284
+ !showArcColumnSetting && (_jsxs(ColumnsProvider, { columns: sourceColumns, children: [_jsx(Field, { label: "Latitude column", required: true, children: _jsx(ColumnSelector.Numeric, { value: mapConfig.fitToData?.latitudeColumn, onChange: (latitudeColumn) => {
285
+ const longitudeColumn = mapConfig.fitToData?.longitudeColumn;
286
+ applyConfig(regenerateMapConfigForTable({ config: mapConfig }, sourceDataTable, longitudeColumn, latitudeColumn));
287
+ }, disabled: readOnly }) }), _jsx(Field, { label: "Longitude column", required: true, children: _jsx(ColumnSelector.Numeric, { value: mapConfig.fitToData?.longitudeColumn, onChange: (longitudeColumn) => {
288
+ const latitudeColumn = mapConfig.fitToData?.latitudeColumn;
289
+ applyConfig(regenerateMapConfigForTable({ config: mapConfig }, sourceDataTable, longitudeColumn, latitudeColumn));
290
+ }, disabled: readOnly }) })] }))] }) }))] }));
291
+ };
292
+ //# sourceMappingURL=MapSettings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MapSettings.js","sourceRoot":"","sources":["../src/MapSettings.tsx"],"names":[],"mappings":"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","sourcesContent":["import {FC, useCallback, useMemo, useState} from 'react';\nimport {\n getTableIdentity,\n resolveTableReference,\n type DataTable,\n} from '@sqlrooms/duckdb';\nimport {\n binnedNumericSchemes,\n categoricalSchemes,\n continuousDivergingSchemes,\n continuousSequentialSchemes,\n continuousSequentialInterpolators,\n parseColorString,\n} from '@sqlrooms/color-scales';\nimport type {ColorScaleConfig, ColorScaleScheme} from '@sqlrooms/color-scales';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Slider,\n ScrollArea,\n SettingsPanelHeader,\n Switch,\n} from '@sqlrooms/ui';\nimport {isDeckMapTableDatasetSource, type DeckMapConfig} from './mapConfig';\nimport {\n clearDeckMapLayerColorScale,\n createDeckMapLayerColorScale,\n DECK_MAP_COLOR_SCALE_TYPE_OPTIONS,\n DECK_MAP_LAYER_TYPE_OPTIONS,\n getDeckMapColorAccessorOptions,\n getDeckMapLayerDatasetId,\n getDeckMapLayerColorScale,\n getDeckMapLayerRecords,\n setDeckMapLayerColorScale,\n setDeckMapLayerGeometryColumn,\n setDeckMapLayerHexagonColumn,\n setDeckMapLayerArcColumns,\n setDeckMapLayerTimestampColumn,\n setDeckMapLayerType,\n updateDeckMapLayer,\n type DeckMapLayerColorAccessor,\n type DeckMapLayerRecord,\n usesGeometryColumnSetting,\n usesH3ColumnSetting,\n usesArcColumnSetting,\n usesRadiusSetting,\n usesColumnRadiusSetting,\n usesTripsSettings,\n usesExtrusionSettings,\n} from './mapLayerConfigUtils';\nimport {\n DeckMapCodeViewerPanel,\n DeckMapCodeViewToggleButton,\n DeckMapColumnSelector as ColumnSelector,\n DeckMapColumnsProvider as ColumnsProvider,\n DeckMapSettingsField as Field,\n DeckMapTableSelector as DataTableSelector,\n} from './MapSettingsControls';\nimport {regenerateMapConfigForTable} from './mapConfigUtils';\nimport {useDeckMapDatasetSchema} from './useDeckMapDatasetSchema';\n\nconst HEATMAP_COLOR_STEPS = 6;\nconst EMPTY_COLUMNS: DataTable['columns'] = [];\n\nfunction schemeToColorRange(\n scheme: string,\n): Array<[number, number, number, number]> {\n const interpolator =\n continuousSequentialInterpolators[\n scheme as keyof typeof continuousSequentialInterpolators\n ];\n if (!interpolator) {\n return continuousSequentialInterpolators.Viridis\n ? Array.from({length: HEATMAP_COLOR_STEPS}, (_, i) =>\n parseColorString(\n continuousSequentialInterpolators.Viridis(\n i / (HEATMAP_COLOR_STEPS - 1),\n ),\n ),\n )\n : [];\n }\n return Array.from({length: HEATMAP_COLOR_STEPS}, (_, i) =>\n parseColorString(interpolator(i / (HEATMAP_COLOR_STEPS - 1))),\n );\n}\n\nfunction detectHeatmapScheme(colorRange: unknown): string {\n if (!Array.isArray(colorRange) || colorRange.length === 0) return 'Viridis';\n for (const scheme of continuousSequentialSchemes) {\n const sampled = schemeToColorRange(scheme);\n if (sampled.length === colorRange.length) {\n const matches = sampled.every((color, idx) => {\n const actual = colorRange[idx];\n if (!Array.isArray(actual)) return false;\n return (\n Math.abs(color[0] - actual[0]) < 2 &&\n Math.abs(color[1] - actual[1]) < 2 &&\n Math.abs(color[2] - actual[2]) < 2\n );\n });\n if (matches) return scheme;\n }\n }\n return 'Viridis';\n}\n\nexport interface DeckMapSettingsPanelProps {\n title: string;\n selectedTable?: string;\n config: DeckMapConfig;\n tables: DataTable[];\n onClose?: () => void;\n onTableChange: (table: DataTable) => void;\n onTitleChange: (title: string) => void;\n onConfigChange: (config: DeckMapConfig) => void;\n readOnly?: boolean;\n}\n\nfunction getSchemeOptions(type: ColorScaleConfig['type']) {\n if (type === 'categorical') {\n return categoricalSchemes;\n }\n if (type === 'diverging') {\n return continuousDivergingSchemes;\n }\n if (type === 'sequential') {\n return continuousSequentialSchemes;\n }\n return binnedNumericSchemes;\n}\n\nexport const DeckMapSettingsPanel: FC<DeckMapSettingsPanelProps> = ({\n title,\n selectedTable,\n config,\n tables,\n onClose,\n onTableChange,\n onTitleChange,\n onConfigChange,\n readOnly,\n}) => {\n const [layerIndex, setLayerIndex] = useState(0);\n const [colorAccessor, setColorAccessor] =\n useState<DeckMapLayerColorAccessor>('getFillColor');\n const [viewMode, setViewMode] = useState<'settings' | 'code'>('settings');\n\n const selectedDataTable = useMemo(\n () =>\n selectedTable\n ? resolveTableReference(tables, selectedTable).table\n : undefined,\n [selectedTable, tables],\n );\n\n const handleTableChange = useCallback(\n (table: DataTable) => {\n if (readOnly) return;\n onTableChange(table);\n },\n [onTableChange, readOnly],\n );\n\n const mapConfig = config;\n const serializedMapConfig = useMemo(\n () => JSON.stringify(config, null, 2),\n [config],\n );\n const showCode = viewMode === 'code';\n const layers = getDeckMapLayerRecords(mapConfig);\n const activeLayerIndex = Math.min(layerIndex, Math.max(layers.length - 1, 0));\n const activeLayer = layers[activeLayerIndex];\n const activeLayerDatasetId = getDeckMapLayerDatasetId(activeLayer);\n const activeLayerDataset = activeLayerDatasetId\n ? mapConfig.datasets?.[activeLayerDatasetId]\n : undefined;\n\n // Resolve the structured source table separately from the compiled dataset\n // output. Coordinate selectors edit the source transform, while render\n // bindings such as geometry/color/elevation target output columns.\n const activeLayerDatasetSource = activeLayerDataset?.source;\n const fallbackTableName = isDeckMapTableDatasetSource(\n activeLayerDatasetSource,\n )\n ? activeLayerDatasetSource.tableName\n : undefined;\n const fallbackTable = useMemo(\n () =>\n fallbackTableName\n ? resolveTableReference(tables, fallbackTableName).table\n : undefined,\n [fallbackTableName, tables],\n );\n const sourceDataTable = selectedDataTable ?? fallbackTable;\n const sourceColumns = sourceDataTable?.columns ?? EMPTY_COLUMNS;\n const resolvedActiveLayerDatasetSource = useMemo(() => {\n if (!activeLayerDatasetSource) {\n return selectedDataTable\n ? {tableName: getTableIdentity(selectedDataTable.table)}\n : undefined;\n }\n if (!isDeckMapTableDatasetSource(activeLayerDatasetSource)) {\n return activeLayerDatasetSource;\n }\n\n return {\n tableName: selectedDataTable\n ? getTableIdentity(selectedDataTable.table)\n : activeLayerDatasetSource.tableName,\n ...(activeLayerDatasetSource.transformSql\n ? {transformSql: activeLayerDatasetSource.transformSql}\n : {}),\n };\n }, [activeLayerDatasetSource, selectedDataTable]);\n const datasetSchema = useDeckMapDatasetSchema({\n source: resolvedActiveLayerDatasetSource,\n sourceColumns,\n });\n const outputColumns = datasetSchema.outputColumns;\n const dataOutputColumns = datasetSchema.dataOutputColumns;\n const datasetSchemaErrorMessage = datasetSchema.error?.message;\n\n const showGeometryColumnSetting = usesGeometryColumnSetting(\n activeLayer?.['@@type'],\n );\n const showH3ColumnSetting = usesH3ColumnSetting(activeLayer?.['@@type']);\n const showArcColumnSetting = usesArcColumnSetting(activeLayer?.['@@type']);\n const showRadiusSetting = usesRadiusSetting(activeLayer?.['@@type']);\n const showColumnRadiusSetting = usesColumnRadiusSetting(\n activeLayer?.['@@type'],\n );\n const showTripsSettings = usesTripsSettings(activeLayer?.['@@type']);\n const showExtrusionSettings = usesExtrusionSettings(activeLayer?.['@@type']);\n const colorAccessorOptions = getDeckMapColorAccessorOptions(\n activeLayer?.['@@type'],\n );\n const effectiveColorAccessor =\n colorAccessorOptions.find((option) => option.value === colorAccessor)\n ?.value ?? colorAccessorOptions[0]?.value;\n const pointRadiusPixels =\n activeLayer?.radiusUnits === 'pixels' &&\n typeof activeLayer?.getRadius === 'number'\n ? activeLayer.getRadius\n : ((activeLayer?.radiusMinPixels as number | undefined) ?? 2);\n const colorScale = effectiveColorAccessor\n ? getDeckMapLayerColorScale(activeLayer, effectiveColorAccessor)\n : undefined;\n const colorScaleType = colorScale?.type ?? 'sequential';\n const schemeOptions = getSchemeOptions(colorScaleType);\n const isHeatmapLayer = activeLayer?.['@@type'] === 'GeoArrowHeatmapLayer';\n const firstColumnName = dataOutputColumns[0]?.name;\n\n const applyConfig = useCallback(\n (nextConfig: DeckMapConfig) => {\n if (readOnly) return;\n onConfigChange(nextConfig);\n },\n [onConfigChange, readOnly],\n );\n\n const updateColorScale = (patch: {\n field?: string;\n type?: ColorScaleConfig['type'];\n scheme?: ColorScaleScheme;\n }) => {\n const field = patch.field ?? colorScale?.field ?? firstColumnName;\n if (!field || !effectiveColorAccessor) return;\n\n const type = patch.type ?? colorScale?.type ?? 'sequential';\n const scheme =\n patch.scheme ??\n (patch.type && patch.type !== colorScale?.type\n ? undefined\n : colorScale?.scheme);\n\n applyConfig(\n setDeckMapLayerColorScale(\n mapConfig,\n activeLayerIndex,\n effectiveColorAccessor,\n createDeckMapLayerColorScale({\n field,\n type,\n scheme,\n title: field,\n }),\n ),\n );\n };\n\n return (\n <div className=\"flex h-full min-h-0 flex-col\">\n <SettingsPanelHeader\n title=\"Map settings\"\n className=\"shrink-0 p-2\"\n actions={\n <DeckMapCodeViewToggleButton\n label={showCode ? 'Show settings' : 'View code'}\n selected={showCode}\n onClick={() =>\n setViewMode((currentViewMode) =>\n currentViewMode === 'code' ? 'settings' : 'code',\n )\n }\n />\n }\n onClose={onClose}\n closeLabel=\"Close map settings\"\n />\n\n {showCode ? (\n <DeckMapCodeViewerPanel\n value={serializedMapConfig}\n copyTooltipLabel=\"Copy map config\"\n />\n ) : (\n <ScrollArea className=\"min-h-0 flex-1 [&_[data-radix-scroll-area-viewport]>div]:!block\">\n <div className=\"flex flex-col gap-2 p-2 pt-0\">\n <Field label=\"Title\">\n <input\n value={title}\n onChange={(e) => onTitleChange(e.target.value)}\n placeholder=\"Map title\"\n disabled={readOnly}\n className=\"border-input placeholder:text-muted-foreground focus-visible:ring-ring h-8 w-full rounded-md border bg-transparent px-3 py-2 text-xs font-medium shadow-sm outline-hidden transition-colors focus-visible:ring-1 disabled:cursor-not-allowed disabled:opacity-50\"\n />\n </Field>\n\n <Field label=\"Dataset\" required>\n <DataTableSelector\n onChange={handleTableChange}\n tables={tables}\n value={selectedDataTable}\n disabled={readOnly}\n />\n </Field>\n\n {layers.length > 0 && (\n <div className=\"flex flex-col gap-3\">\n {layers.length > 1 && (\n <Field label=\"Layer\">\n <Select\n value={String(activeLayerIndex)}\n onValueChange={(value) => setLayerIndex(Number(value))}\n >\n <SelectTrigger className=\"w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {layers.map((layer, index) => (\n <SelectItem key={index} value={String(index)}>\n {String(layer.id ?? `Layer ${index + 1}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </Field>\n )}\n\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium\">Visible</span>\n <Switch\n checked={activeLayer?.visible !== false}\n onCheckedChange={(checked) =>\n applyConfig(\n updateDeckMapLayer(\n mapConfig,\n activeLayerIndex,\n (layer) => ({\n ...layer,\n visible: checked,\n }),\n ),\n )\n }\n />\n </div>\n\n <Field label=\"Layer type\">\n <Select\n value={\n typeof activeLayer?.['@@type'] === 'string'\n ? activeLayer['@@type']\n : undefined\n }\n onValueChange={(value) =>\n applyConfig(\n setDeckMapLayerType(mapConfig, activeLayerIndex, value),\n )\n }\n >\n <SelectTrigger className=\"w-full\">\n <SelectValue placeholder=\"Select layer type\" />\n </SelectTrigger>\n <SelectContent>\n {DECK_MAP_LAYER_TYPE_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </Field>\n\n {(datasetSchema.isLoading || datasetSchemaErrorMessage) && (\n <div className=\"text-muted-foreground rounded-md border px-2 py-1.5 text-xs\">\n {datasetSchema.isLoading\n ? 'Inspecting dataset schema...'\n : `Dataset schema unavailable: ${datasetSchemaErrorMessage}`}\n </div>\n )}\n\n {showTripsSettings && (\n <>\n {outputColumns.length > 0 && (\n <ColumnsProvider columns={outputColumns}>\n <Field label=\"Timestamp column\" required>\n <ColumnSelector\n value={\n (\n activeLayer?._sqlroomsBinding as Record<\n string,\n unknown\n >\n )?.timestampColumn as string | undefined\n }\n onChange={(timestampColumn) =>\n applyConfig(\n setDeckMapLayerTimestampColumn(\n mapConfig,\n activeLayerIndex,\n timestampColumn,\n ),\n )\n }\n placeholder=\"Select timestamp column...\"\n disabled={readOnly}\n />\n </Field>\n </ColumnsProvider>\n )}\n <Field\n label={`Line width: ${(activeLayer?.widthMinPixels as number | undefined) ?? 3}px`}\n >\n <Slider\n min={1}\n max={20}\n step={1}\n value={[\n (activeLayer?.widthMinPixels as number | undefined) ??\n 3,\n ]}\n onValueChange={(values) => {\n const value = values[0] ?? 3;\n applyConfig(\n updateDeckMapLayer(\n mapConfig,\n activeLayerIndex,\n (layer) => ({\n ...layer,\n widthMinPixels: value,\n }),\n ),\n );\n }}\n />\n </Field>\n <Field\n label={`Trail length: ${Math.round(((activeLayer?._trailLengthFactor as number | undefined) ?? 0.4) * 100)}%`}\n >\n <Slider\n min={5}\n max={100}\n step={5}\n value={[\n Math.round(\n ((activeLayer?._trailLengthFactor as\n | number\n | undefined) ?? 0.4) * 100,\n ),\n ]}\n onValueChange={(values) => {\n const value = (values[0] ?? 40) / 100;\n applyConfig(\n updateDeckMapLayer(\n mapConfig,\n activeLayerIndex,\n (layer) => ({\n ...layer,\n _trailLengthFactor: value,\n }),\n ),\n );\n }}\n />\n </Field>\n </>\n )}\n\n {isHeatmapLayer ? (\n <div className=\"flex flex-col gap-2 rounded-md border p-2\">\n <span className=\"text-xs font-medium\">\n Color scheme (density)\n </span>\n <Field label=\"Scheme\">\n <Select\n value={detectHeatmapScheme(activeLayer?.colorRange)}\n onValueChange={(value) =>\n applyConfig(\n updateDeckMapLayer(\n mapConfig,\n activeLayerIndex,\n (layer) => ({\n ...layer,\n colorRange: schemeToColorRange(value),\n }),\n ),\n )\n }\n >\n <SelectTrigger className=\"w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {continuousSequentialSchemes.map((scheme) => (\n <SelectItem key={scheme} value={scheme}>\n {scheme}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </Field>\n </div>\n ) : (\n <div className=\"flex flex-col gap-2 rounded-md border p-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-xs font-medium\">Color scale</span>\n <Switch\n checked={Boolean(colorScale)}\n onCheckedChange={(checked) => {\n if (!effectiveColorAccessor) return;\n if (checked) {\n updateColorScale({});\n return;\n }\n applyConfig(\n clearDeckMapLayerColorScale(\n mapConfig,\n activeLayerIndex,\n effectiveColorAccessor,\n ),\n );\n }}\n disabled={!firstColumnName || !effectiveColorAccessor}\n />\n </div>\n\n {effectiveColorAccessor && (\n <Field label=\"Color property\">\n <Select\n value={effectiveColorAccessor}\n onValueChange={(value) =>\n setColorAccessor(value as DeckMapLayerColorAccessor)\n }\n >\n <SelectTrigger className=\"w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {colorAccessorOptions.map((option) => (\n <SelectItem\n key={option.value}\n value={option.value}\n >\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </Field>\n )}\n\n {colorScale && dataOutputColumns.length > 0 && (\n <ColumnsProvider columns={dataOutputColumns}>\n <Field label=\"Color field\" required>\n {colorScaleType === 'categorical' ? (\n <ColumnSelector.Categorical\n value={colorScale.field}\n onChange={(field) => updateColorScale({field})}\n disabled={readOnly}\n />\n ) : (\n <ColumnSelector.Quantitative\n value={colorScale.field}\n onChange={(field) => updateColorScale({field})}\n disabled={readOnly}\n />\n )}\n </Field>\n </ColumnsProvider>\n )}\n\n {colorScale && (\n <>\n <Field label=\"Scale type\">\n <Select\n value={colorScaleType}\n onValueChange={(value) =>\n updateColorScale({\n type: value as ColorScaleConfig['type'],\n })\n }\n >\n <SelectTrigger className=\"w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {DECK_MAP_COLOR_SCALE_TYPE_OPTIONS.map(\n (option) => (\n <SelectItem\n key={option.value}\n value={option.value}\n >\n {option.label}\n </SelectItem>\n ),\n )}\n </SelectContent>\n </Select>\n </Field>\n\n <Field label=\"Scheme\">\n <Select\n value={colorScale.scheme}\n onValueChange={(value) =>\n updateColorScale({\n scheme: value as ColorScaleScheme,\n })\n }\n >\n <SelectTrigger className=\"w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {schemeOptions.map((scheme) => (\n <SelectItem key={scheme} value={scheme}>\n {scheme}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </Field>\n </>\n )}\n </div>\n )}\n </div>\n )}\n\n {isHeatmapLayer && (\n <Field\n label={`Radius: ${(activeLayer?.radiusPixels as number | undefined) ?? 30}px`}\n >\n <div className=\"pt-0.5\">\n <Slider\n min={1}\n max={100}\n step={1}\n value={[\n (activeLayer?.radiusPixels as number | undefined) ?? 30,\n ]}\n onValueChange={(values) => {\n const value = values[0] ?? 30;\n applyConfig(\n updateDeckMapLayer(\n mapConfig,\n activeLayerIndex,\n (layer) => ({\n ...layer,\n radiusPixels: value,\n }),\n ),\n );\n }}\n />\n </div>\n </Field>\n )}\n\n {showRadiusSetting && (\n <Field label={`Point radius: ${pointRadiusPixels}px`}>\n <div className=\"pt-0.5\">\n <Slider\n min={1}\n max={50}\n step={1}\n value={[pointRadiusPixels]}\n onValueChange={(values) => {\n const value = values[0] ?? 2;\n applyConfig(\n updateDeckMapLayer(\n mapConfig,\n activeLayerIndex,\n (layer) => {\n const nextLayer: DeckMapLayerRecord = {\n ...layer,\n radiusMinPixels: value,\n radiusMaxPixels: Math.max(\n value,\n (layer.radiusMaxPixels as number | undefined) ??\n value,\n ),\n };\n\n if (\n layer.radiusUnits === 'pixels' &&\n typeof layer.getRadius !== 'string'\n ) {\n nextLayer.getRadius = value;\n }\n\n return nextLayer;\n },\n ),\n );\n }}\n />\n </div>\n </Field>\n )}\n\n {showColumnRadiusSetting && (\n <Field\n label={`Column radius: ${(activeLayer?.radius as number | undefined) ?? 50}m`}\n >\n <div className=\"pt-0.5\">\n <Slider\n min={1}\n max={10000}\n step={1}\n value={[(activeLayer?.radius as number | undefined) ?? 50]}\n onValueChange={(values) => {\n const value = values[0] ?? 50;\n applyConfig(\n updateDeckMapLayer(\n mapConfig,\n activeLayerIndex,\n (layer) => ({\n ...layer,\n radius: value,\n }),\n ),\n );\n }}\n />\n </div>\n </Field>\n )}\n\n {outputColumns.length > 0 && showGeometryColumnSetting && (\n <ColumnsProvider columns={outputColumns}>\n <Field label=\"Geometry column\" required>\n <ColumnSelector\n value={activeLayerDataset?.geometryColumn}\n onChange={(geometryColumn) =>\n applyConfig(\n setDeckMapLayerGeometryColumn(\n mapConfig,\n activeLayerIndex,\n geometryColumn,\n ),\n )\n }\n placeholder=\"Select geometry column...\"\n disabled={readOnly}\n />\n </Field>\n </ColumnsProvider>\n )}\n\n {outputColumns.length > 0 && showH3ColumnSetting && (\n <ColumnsProvider columns={outputColumns}>\n <Field label=\"H3 column\" required>\n <ColumnSelector\n value={\n (activeLayer?._sqlroomsBinding as Record<string, unknown>)\n ?.hexagonColumn as string | undefined\n }\n onChange={(hexagonColumn) =>\n applyConfig(\n setDeckMapLayerHexagonColumn(\n mapConfig,\n activeLayerIndex,\n hexagonColumn,\n ),\n )\n }\n placeholder=\"Select H3 index column...\"\n disabled={readOnly}\n />\n </Field>\n </ColumnsProvider>\n )}\n\n {outputColumns.length > 0 && showArcColumnSetting && (\n <ColumnsProvider columns={outputColumns}>\n <Field label=\"Source geometry\" required>\n <ColumnSelector\n value={\n (activeLayer?._sqlroomsBinding as Record<string, unknown>)\n ?.sourceGeometryColumn as string | undefined\n }\n onChange={(sourceGeometryColumn) =>\n applyConfig(\n setDeckMapLayerArcColumns(mapConfig, activeLayerIndex, {\n sourceGeometryColumn,\n }),\n )\n }\n placeholder=\"Select source geometry...\"\n disabled={readOnly}\n />\n </Field>\n <Field label=\"Target geometry\" required>\n <ColumnSelector\n value={\n (activeLayer?._sqlroomsBinding as Record<string, unknown>)\n ?.targetGeometryColumn as string | undefined\n }\n onChange={(targetGeometryColumn) =>\n applyConfig(\n setDeckMapLayerArcColumns(mapConfig, activeLayerIndex, {\n targetGeometryColumn,\n }),\n )\n }\n placeholder=\"Select target geometry...\"\n disabled={readOnly}\n />\n </Field>\n </ColumnsProvider>\n )}\n\n {showArcColumnSetting && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium\">Flat lines</span>\n <Switch\n checked={activeLayer?.getHeight === 0}\n onCheckedChange={(checked) =>\n applyConfig(\n updateDeckMapLayer(\n mapConfig,\n activeLayerIndex,\n (layer) => ({\n ...layer,\n getHeight: checked ? 0 : undefined,\n }),\n ),\n )\n }\n />\n </div>\n )}\n\n {showArcColumnSetting && (\n <Field\n label={`Line width: ${(activeLayer?.widthMinPixels as number | undefined) ?? 1}px`}\n >\n <Slider\n min={1}\n max={20}\n step={1}\n value={[\n (activeLayer?.widthMinPixels as number | undefined) ?? 1,\n ]}\n onValueChange={(values) => {\n const value = values[0] ?? 1;\n applyConfig(\n updateDeckMapLayer(\n mapConfig,\n activeLayerIndex,\n (layer) => ({\n ...layer,\n widthMinPixels: value,\n }),\n ),\n );\n }}\n />\n </Field>\n )}\n\n {showExtrusionSettings && (\n <div className=\"flex flex-col gap-2 rounded-md border p-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-xs font-medium\">Extrusion</span>\n <Switch\n checked={Boolean(activeLayer?.extruded)}\n onCheckedChange={(checked) =>\n applyConfig(\n updateDeckMapLayer(\n mapConfig,\n activeLayerIndex,\n (layer) => ({\n ...layer,\n extruded: checked,\n getElevation: checked\n ? (layer.getElevation ?? 1)\n : layer.getElevation,\n }),\n ),\n )\n }\n />\n </div>\n\n {Boolean(activeLayer?.extruded) &&\n dataOutputColumns.length > 0 && (\n <ColumnsProvider columns={dataOutputColumns}>\n <Field label=\"Elevation column\">\n <ColumnSelector.Numeric\n value={(() => {\n const elev = activeLayer?.getElevation;\n if (\n elev &&\n typeof elev === 'object' &&\n '@@function' in (elev as object)\n ) {\n return (elev as Record<string, unknown>).field as\n | string\n | undefined;\n }\n if (\n typeof elev === 'string' &&\n elev.startsWith('@@=')\n ) {\n return elev.slice(3);\n }\n return undefined;\n })()}\n onChange={(elevationColumn) =>\n applyConfig(\n updateDeckMapLayer(\n mapConfig,\n activeLayerIndex,\n (layer) => ({\n ...layer,\n getElevation: elevationColumn\n ? {\n '@@function': 'scale',\n field: elevationColumn,\n type: 'linear',\n domain: 'auto',\n range: [0, 200],\n }\n : undefined,\n elevationScale: layer.elevationScale ?? 1,\n }),\n ),\n )\n }\n placeholder=\"Select elevation column...\"\n disabled={readOnly}\n />\n </Field>\n </ColumnsProvider>\n )}\n\n {Boolean(activeLayer?.extruded) && (\n <Field\n label={`Elevation scale: ${(activeLayer?.elevationScale as number | undefined) ?? 1}x`}\n >\n <div className=\"pt-1.5\">\n <Slider\n min={0.01}\n max={100}\n step={0.01}\n value={[\n (activeLayer?.elevationScale as number | undefined) ??\n 1,\n ]}\n onValueChange={(values) => {\n const value = values[0] ?? 1;\n applyConfig(\n updateDeckMapLayer(\n mapConfig,\n activeLayerIndex,\n (layer) => ({\n ...layer,\n elevationScale: value,\n }),\n ),\n );\n }}\n />\n </div>\n </Field>\n )}\n </div>\n )}\n\n {sourceDataTable &&\n !showGeometryColumnSetting &&\n !showH3ColumnSetting &&\n !showArcColumnSetting && (\n <ColumnsProvider columns={sourceColumns}>\n <Field label=\"Latitude column\" required>\n <ColumnSelector.Numeric\n value={mapConfig.fitToData?.latitudeColumn}\n onChange={(latitudeColumn) => {\n const longitudeColumn =\n mapConfig.fitToData?.longitudeColumn;\n applyConfig(\n regenerateMapConfigForTable(\n {config: mapConfig},\n sourceDataTable,\n longitudeColumn,\n latitudeColumn,\n ) as DeckMapConfig,\n );\n }}\n disabled={readOnly}\n />\n </Field>\n <Field label=\"Longitude column\" required>\n <ColumnSelector.Numeric\n value={mapConfig.fitToData?.longitudeColumn}\n onChange={(longitudeColumn) => {\n const latitudeColumn =\n mapConfig.fitToData?.latitudeColumn;\n applyConfig(\n regenerateMapConfigForTable(\n {config: mapConfig},\n sourceDataTable,\n longitudeColumn,\n latitudeColumn,\n ) as DeckMapConfig,\n );\n }}\n disabled={readOnly}\n />\n </Field>\n </ColumnsProvider>\n )}\n </div>\n </ScrollArea>\n )}\n </div>\n );\n};\n"]}
@@ -0,0 +1,40 @@
1
+ import { type DataTable, type TableColumn } from '@sqlrooms/duckdb';
2
+ import { type FC, type PropsWithChildren } from 'react';
3
+ export declare const DeckMapSettingsField: FC<PropsWithChildren<{
4
+ label: string;
5
+ required?: boolean;
6
+ }>>;
7
+ export type DeckMapColumnKind = 'all' | 'numeric' | 'quantitative' | 'categorical';
8
+ export declare function filterDeckMapColumns(columns: TableColumn[], kind: DeckMapColumnKind): TableColumn[];
9
+ export declare const DeckMapColumnsProvider: FC<PropsWithChildren<{
10
+ columns: TableColumn[];
11
+ }>>;
12
+ export type DeckMapColumnSelectorProps = {
13
+ columns?: TableColumn[];
14
+ kind?: DeckMapColumnKind;
15
+ value?: string;
16
+ onChange: (value: string) => void;
17
+ placeholder?: string;
18
+ disabled?: boolean;
19
+ };
20
+ export declare const DeckMapColumnSelector: FC<DeckMapColumnSelectorProps> & {
21
+ Numeric: (props: Omit<DeckMapColumnSelectorProps, "kind">) => import("react/jsx-runtime").JSX.Element;
22
+ Quantitative: (props: Omit<DeckMapColumnSelectorProps, "kind">) => import("react/jsx-runtime").JSX.Element;
23
+ Categorical: (props: Omit<DeckMapColumnSelectorProps, "kind">) => import("react/jsx-runtime").JSX.Element;
24
+ };
25
+ export declare const DeckMapTableSelector: FC<{
26
+ tables: DataTable[];
27
+ value?: DataTable;
28
+ onChange: (table: DataTable) => void;
29
+ disabled?: boolean;
30
+ }>;
31
+ export declare const DeckMapCodeViewToggleButton: FC<{
32
+ selected: boolean;
33
+ onClick: () => void;
34
+ label?: string;
35
+ }>;
36
+ export declare const DeckMapCodeViewerPanel: FC<{
37
+ value: string;
38
+ copyTooltipLabel?: string;
39
+ }>;
40
+ //# sourceMappingURL=MapSettingsControls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MapSettingsControls.d.ts","sourceRoot":"","sources":["../src/MapSettingsControls.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAY1B,OAAO,EAGL,KAAK,EAAE,EACP,KAAK,iBAAiB,EACvB,MAAM,OAAO,CAAC;AAEf,eAAO,MAAM,oBAAoB,EAAE,EAAE,CACnC,iBAAiB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAC,CAAC,CASvD,CAAC;AAEF,MAAM,MAAM,iBAAiB,GACzB,KAAK,GACL,SAAS,GACT,cAAc,GACd,aAAa,CAAC;AAElB,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,WAAW,EAAE,EACtB,IAAI,EAAE,iBAAiB,iBASxB;AAID,eAAO,MAAM,sBAAsB,EAAE,EAAE,CACrC,iBAAiB,CAAC;IAAC,OAAO,EAAE,WAAW,EAAE,CAAA;CAAC,CAAC,CAK5C,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAqDF,eAAO,MAAM,qBAAqB;qBACf,IAAI,CAAC,0BAA0B,EAAE,MAAM,CAAC;0BAGnC,IAAI,CAAC,0BAA0B,EAAE,MAAM,CAAC;yBAGzC,IAAI,CAAC,0BAA0B,EAAE,MAAM,CAAC;CAG7D,CAAC;AAEH,eAAO,MAAM,oBAAoB,EAAE,EAAE,CAAC;IACpC,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAoDA,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,EAAE,CAAC;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAoBA,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,EAAE,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAkBA,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { getTableDisplayName, getTableIdentity, isColumnCategorical, isColumnNumeric, isColumnQuantitative, } from '@sqlrooms/duckdb';
3
+ import { Button, cn, Combobox, CopyButton, ScrollArea, Tooltip, TooltipContent, TooltipTrigger, } from '@sqlrooms/ui';
4
+ import { CodeIcon, TableIcon } from 'lucide-react';
5
+ import { createContext, useContext, } from 'react';
6
+ export const DeckMapSettingsField = ({ label, required, children }) => (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsxs("label", { className: "text-xs font-medium", children: [label, required && _jsx("span", { className: "text-destructive ml-1", children: "*" })] }), _jsx("div", { className: "grid items-end gap-2", children: children })] }));
7
+ export function filterDeckMapColumns(columns, kind) {
8
+ if (kind === 'all')
9
+ return columns;
10
+ return columns.filter((column) => {
11
+ if (!column.type)
12
+ return false;
13
+ if (kind === 'numeric')
14
+ return isColumnNumeric(column.type);
15
+ if (kind === 'quantitative')
16
+ return isColumnQuantitative(column.type);
17
+ return isColumnCategorical(column.type);
18
+ });
19
+ }
20
+ const DeckMapColumnsContext = createContext([]);
21
+ export const DeckMapColumnsProvider = ({ columns, children }) => (_jsx(DeckMapColumnsContext.Provider, { value: columns, children: children }));
22
+ const DeckMapColumnSelectorRoot = ({ columns, kind = 'all', value, onChange, placeholder = 'Select column…', disabled, }) => {
23
+ const contextColumns = useContext(DeckMapColumnsContext);
24
+ const options = filterDeckMapColumns(columns ?? contextColumns, kind);
25
+ const selectedColumn = options.find((column) => column.name === value);
26
+ const isMissing = Boolean(value && !selectedColumn);
27
+ return (_jsxs(Combobox, { value: value ?? '', onChange: onChange, disabled: disabled, children: [_jsx(Combobox.Trigger, { className: cn('w-full', isMissing && 'border-destructive/60 bg-destructive/5'), children: selectedColumn ? (_jsxs("span", { className: "flex min-w-0 items-baseline gap-1", children: [_jsx("span", { className: "truncate", children: selectedColumn.name }), _jsx("span", { className: "text-muted-foreground truncate text-[8px]", children: selectedColumn.type })] })) : value ? (_jsxs("span", { className: "text-destructive truncate", children: [value, " (missing)"] })) : (_jsx("span", { className: "text-muted-foreground truncate", children: placeholder })) }), _jsx(Combobox.Content, { searchable: true, searchPlaceholder: "Search columns...", emptyMessage: "No matching column.", children: options.map((column) => (_jsxs(Combobox.Item, { value: column.name, children: [_jsx("span", { className: "truncate", children: column.name }), _jsx("span", { className: "text-muted-foreground ml-auto text-[8px]", children: column.type })] }, column.name))) })] }));
28
+ };
29
+ export const DeckMapColumnSelector = Object.assign(DeckMapColumnSelectorRoot, {
30
+ Numeric: (props) => (_jsx(DeckMapColumnSelectorRoot, { ...props, kind: "numeric" })),
31
+ Quantitative: (props) => (_jsx(DeckMapColumnSelectorRoot, { ...props, kind: "quantitative" })),
32
+ Categorical: (props) => (_jsx(DeckMapColumnSelectorRoot, { ...props, kind: "categorical" })),
33
+ });
34
+ export const DeckMapTableSelector = ({ tables, value, onChange, disabled }) => {
35
+ const identity = value ? getTableIdentity(value.table) : '';
36
+ return (_jsxs(Combobox, { value: identity, onChange: (nextIdentity) => {
37
+ const table = tables.find((candidate) => getTableIdentity(candidate.table) === nextIdentity);
38
+ if (table)
39
+ onChange(table);
40
+ }, disabled: disabled, children: [_jsx(Combobox.Trigger, { className: "w-full font-mono", children: _jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [_jsx(TableIcon, { className: "text-muted-foreground h-3.5 w-3.5 shrink-0" }), _jsx("span", { className: "truncate", children: value ? getTableDisplayName(value.table) : 'Select table...' })] }) }), _jsx(Combobox.Content, { searchable: true, searchPlaceholder: "Search tables...", emptyMessage: "No tables found.", children: tables.map((table) => {
41
+ const tableIdentity = getTableIdentity(table.table);
42
+ return (_jsxs(Combobox.Item, { value: tableIdentity, keywords: [
43
+ getTableDisplayName(table.table),
44
+ table.table.schema ?? '',
45
+ table.table.database ?? '',
46
+ ], children: [_jsx("span", { className: "truncate font-mono", children: getTableDisplayName(table.table) }), table.isView ? (_jsx("span", { className: "text-muted-foreground ml-auto text-[10px]", children: "view" })) : null] }, tableIdentity));
47
+ }) })] }));
48
+ };
49
+ export const DeckMapCodeViewToggleButton = ({ selected, onClick, label: labelProp }) => {
50
+ const label = labelProp ?? (selected ? 'Show settings' : 'View code');
51
+ return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { type: "button", variant: selected ? 'secondary' : 'ghost', size: "icon", className: "h-6 w-6", onClick: onClick, "aria-label": label, "aria-pressed": selected, children: _jsx(CodeIcon, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: label })] }));
52
+ };
53
+ export const DeckMapCodeViewerPanel = ({ value, copyTooltipLabel = 'Copy map config' }) => (_jsx(ScrollArea, { className: "min-h-0 flex-1", children: _jsx("div", { className: "h-full p-2", children: _jsxs("div", { className: "border-input relative h-full overflow-hidden rounded-md border", children: [_jsx("pre", { className: "h-full overflow-auto p-3 pr-12 font-mono text-xs whitespace-pre-wrap", children: value }), _jsx("div", { className: "bg-background absolute top-2 right-2 rounded-md border", children: _jsx(CopyButton, { text: value, size: "xs", tooltipLabel: copyTooltipLabel, disabled: !value.trim() }) })] }) }) }));
54
+ //# sourceMappingURL=MapSettingsControls.js.map