@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 @@
1
+ {"version":3,"file":"DeckJsonMapSpec.d.ts","sourceRoot":"","sources":["../src/DeckJsonMapSpec.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,eAAO,MAAM,oBAAoB;;;;EAAqC,CAAC;AACvE,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAExE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAK9B,CAAC;AACF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEpE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;iBAQ7B,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEpE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;iBAE5B,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAiBlE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmC/B,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAOxE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAO1B,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC"}
@@ -0,0 +1,82 @@
1
+ import { ColorScaleConfig, RGBAColor } from '@sqlrooms/color-scales';
2
+ import { z } from 'zod';
3
+ export const GeometryEncodingHint = z.enum(['geoarrow', 'wkb', 'wkt']);
4
+ export const ColorScaleFunction = z.intersection(z.object({
5
+ '@@function': z.literal('colorScale'),
6
+ }), ColorScaleConfig);
7
+ export const LayerBindingConfig = z.object({
8
+ dataset: z.string().min(1).optional(),
9
+ geometryColumn: z.string().min(1).optional(),
10
+ geometryEncodingHint: GeometryEncodingHint.optional(),
11
+ sourceGeometryColumn: z.string().min(1).optional(),
12
+ targetGeometryColumn: z.string().min(1).optional(),
13
+ timestampColumn: z.string().min(1).optional(),
14
+ hexagonColumn: z.string().min(1).optional(),
15
+ });
16
+ export const LayerBindingProps = z.object({
17
+ _sqlroomsBinding: LayerBindingConfig.optional(),
18
+ });
19
+ const JsonAccessor = z.union([
20
+ z.string(),
21
+ z.number(),
22
+ RGBAColor,
23
+ z.array(z.number()),
24
+ ColorScaleFunction,
25
+ z.record(z.string(), z.unknown()),
26
+ ]);
27
+ // Keep the layer spec loose for now because `DeckJsonMap` accepts deck.gl JSON as an
28
+ // external spec format, and that surface is much broader than SQLRooms-owned
29
+ // `_sqlroomsBinding` extensions. We validate the binding config fully and a handful of
30
+ // common deck props we know we rely on, while allowing the rest through.
31
+ // TODO(deck-json-schema): Replace this with fuller schemas when deck.gl/json
32
+ // exposes reusable validators or we decide to maintain a broader local schema.
33
+ export const DeckJsonMapLayerSpec = z.looseObject({
34
+ '@@type': z.string().optional(),
35
+ id: z.string().optional(),
36
+ data: z.unknown().optional(),
37
+ visible: z.boolean().optional(),
38
+ pickable: z.boolean().optional(),
39
+ filled: z.boolean().optional(),
40
+ stroked: z.boolean().optional(),
41
+ extruded: z.boolean().optional(),
42
+ radiusScale: z.number().optional(),
43
+ radiusUnits: z.string().optional(),
44
+ radiusMinPixels: z.number().optional(),
45
+ radiusMaxPixels: z.number().optional(),
46
+ lineWidthMinPixels: z.number().optional(),
47
+ lineWidthScale: z.number().optional(),
48
+ lineWidthUnits: z.string().optional(),
49
+ getRadius: JsonAccessor.optional(),
50
+ getFillColor: JsonAccessor.optional(),
51
+ getLineColor: JsonAccessor.optional(),
52
+ getColor: JsonAccessor.optional(),
53
+ getWeight: JsonAccessor.optional(),
54
+ getWidth: JsonAccessor.optional(),
55
+ getHeight: JsonAccessor.optional(),
56
+ getTilt: JsonAccessor.optional(),
57
+ getElevation: JsonAccessor.optional(),
58
+ getSourceColor: JsonAccessor.optional(),
59
+ getTargetColor: JsonAccessor.optional(),
60
+ getPosition: JsonAccessor.optional(),
61
+ getSourcePosition: JsonAccessor.optional(),
62
+ getTargetPosition: JsonAccessor.optional(),
63
+ getPolygon: JsonAccessor.optional(),
64
+ getPath: JsonAccessor.optional(),
65
+ getHexagon: JsonAccessor.optional(),
66
+ getTimestamps: JsonAccessor.optional(),
67
+ _sqlroomsBinding: LayerBindingConfig.optional(),
68
+ });
69
+ // Keep the top-level spec loose for the same reason as `DeckJsonMapLayerSpec`: deck.gl
70
+ // JSON supports many runtime-level props, and SQLRooms currently only needs a
71
+ // validated subset plus open-ended compatibility with upstream deck specs.
72
+ // TODO(deck-json-schema): Replace this with fuller schemas when we have a more
73
+ // complete upstream or local model of deck.gl/json top-level props.
74
+ export const DeckJsonMapSpec = z.looseObject({
75
+ initialViewState: z.record(z.string(), z.unknown()).optional(),
76
+ viewState: z.record(z.string(), z.unknown()).optional(),
77
+ controller: z
78
+ .union([z.boolean(), z.record(z.string(), z.unknown())])
79
+ .optional(),
80
+ layers: z.array(DeckJsonMapLayerSpec).optional(),
81
+ });
82
+ //# sourceMappingURL=DeckJsonMapSpec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeckJsonMapSpec.js","sourceRoot":"","sources":["../src/DeckJsonMapSpec.ts"],"names":[],"mappings":"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","sourcesContent":["import {ColorScaleConfig, RGBAColor} from '@sqlrooms/color-scales';\nimport {z} from 'zod';\n\nexport const GeometryEncodingHint = z.enum(['geoarrow', 'wkb', 'wkt']);\nexport type GeometryEncodingHint = z.infer<typeof GeometryEncodingHint>;\n\nexport const ColorScaleFunction = z.intersection(\n z.object({\n '@@function': z.literal('colorScale'),\n }),\n ColorScaleConfig,\n);\nexport type ColorScaleFunction = z.infer<typeof ColorScaleFunction>;\n\nexport const LayerBindingConfig = z.object({\n dataset: z.string().min(1).optional(),\n geometryColumn: z.string().min(1).optional(),\n geometryEncodingHint: GeometryEncodingHint.optional(),\n sourceGeometryColumn: z.string().min(1).optional(),\n targetGeometryColumn: z.string().min(1).optional(),\n timestampColumn: z.string().min(1).optional(),\n hexagonColumn: z.string().min(1).optional(),\n});\nexport type LayerBindingConfig = z.infer<typeof LayerBindingConfig>;\n\nexport const LayerBindingProps = z.object({\n _sqlroomsBinding: LayerBindingConfig.optional(),\n});\nexport type LayerBindingProps = z.infer<typeof LayerBindingProps>;\n\nconst JsonAccessor = z.union([\n z.string(),\n z.number(),\n RGBAColor,\n z.array(z.number()),\n ColorScaleFunction,\n z.record(z.string(), z.unknown()),\n]);\n\n// Keep the layer spec loose for now because `DeckJsonMap` accepts deck.gl JSON as an\n// external spec format, and that surface is much broader than SQLRooms-owned\n// `_sqlroomsBinding` extensions. We validate the binding config fully and a handful of\n// common deck props we know we rely on, while allowing the rest through.\n// TODO(deck-json-schema): Replace this with fuller schemas when deck.gl/json\n// exposes reusable validators or we decide to maintain a broader local schema.\nexport const DeckJsonMapLayerSpec = z.looseObject({\n '@@type': z.string().optional(),\n id: z.string().optional(),\n data: z.unknown().optional(),\n visible: z.boolean().optional(),\n pickable: z.boolean().optional(),\n filled: z.boolean().optional(),\n stroked: z.boolean().optional(),\n extruded: z.boolean().optional(),\n radiusScale: z.number().optional(),\n radiusUnits: z.string().optional(),\n radiusMinPixels: z.number().optional(),\n radiusMaxPixels: z.number().optional(),\n lineWidthMinPixels: z.number().optional(),\n lineWidthScale: z.number().optional(),\n lineWidthUnits: z.string().optional(),\n getRadius: JsonAccessor.optional(),\n getFillColor: JsonAccessor.optional(),\n getLineColor: JsonAccessor.optional(),\n getColor: JsonAccessor.optional(),\n getWeight: JsonAccessor.optional(),\n getWidth: JsonAccessor.optional(),\n getHeight: JsonAccessor.optional(),\n getTilt: JsonAccessor.optional(),\n getElevation: JsonAccessor.optional(),\n getSourceColor: JsonAccessor.optional(),\n getTargetColor: JsonAccessor.optional(),\n getPosition: JsonAccessor.optional(),\n getSourcePosition: JsonAccessor.optional(),\n getTargetPosition: JsonAccessor.optional(),\n getPolygon: JsonAccessor.optional(),\n getPath: JsonAccessor.optional(),\n getHexagon: JsonAccessor.optional(),\n getTimestamps: JsonAccessor.optional(),\n _sqlroomsBinding: LayerBindingConfig.optional(),\n});\nexport type DeckJsonMapLayerSpec = z.infer<typeof DeckJsonMapLayerSpec>;\n\n// Keep the top-level spec loose for the same reason as `DeckJsonMapLayerSpec`: deck.gl\n// JSON supports many runtime-level props, and SQLRooms currently only needs a\n// validated subset plus open-ended compatibility with upstream deck specs.\n// TODO(deck-json-schema): Replace this with fuller schemas when we have a more\n// complete upstream or local model of deck.gl/json top-level props.\nexport const DeckJsonMapSpec = z.looseObject({\n initialViewState: z.record(z.string(), z.unknown()).optional(),\n viewState: z.record(z.string(), z.unknown()).optional(),\n controller: z\n .union([z.boolean(), z.record(z.string(), z.unknown())])\n .optional(),\n layers: z.array(DeckJsonMapLayerSpec).optional(),\n});\nexport type DeckJsonMapSpec = z.infer<typeof DeckJsonMapSpec>;\n"]}
@@ -0,0 +1,28 @@
1
+ import type { ResolvedTheme } from '@sqlrooms/ui';
2
+ import type { MapProps } from 'react-map-gl/maplibre';
3
+ import { type FC, type PropsWithChildren } from 'react';
4
+ /** A MapLibre-compatible style accepted by the Deck map renderer. */
5
+ export type DeckMapStyle = NonNullable<MapProps['mapStyle']>;
6
+ /** Optional host-provided basemap defaults keyed by resolved UI theme. */
7
+ export type DeckMapDefaultStyles = Partial<Record<ResolvedTheme, DeckMapStyle>>;
8
+ /**
9
+ * Supplies host-owned, theme-aware basemap defaults without persisting them in
10
+ * individual map resources. Explicit map config styles still take precedence.
11
+ */
12
+ export declare const DeckMapDefaultStylesProvider: FC<PropsWithChildren<{
13
+ styles: DeckMapDefaultStyles;
14
+ }>>;
15
+ /** Returns theme-aware host map defaults from the nearest provider, if any. */
16
+ export declare function useDeckMapDefaultStyles(): Partial<Record<ResolvedTheme, DeckMapStyle>> | undefined;
17
+ /**
18
+ * Resolves the effective map style from explicit config, map props, host
19
+ * defaults, and finally the package fallback for the active theme.
20
+ */
21
+ export declare function resolveDeckMapStyle(options: {
22
+ mapStyle?: string;
23
+ mapPropsMapStyle?: MapProps['mapStyle'];
24
+ hostDefaultStyles?: DeckMapDefaultStyles;
25
+ resolvedTheme: ResolvedTheme;
26
+ fallbackStyles: Record<ResolvedTheme, string>;
27
+ }): DeckMapStyle;
28
+ //# sourceMappingURL=DeckMapDefaultStylesProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeckMapDefaultStylesProvider.d.ts","sourceRoot":"","sources":["../src/DeckMapDefaultStylesProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAGL,KAAK,EAAE,EACP,KAAK,iBAAiB,EACvB,MAAM,OAAO,CAAC;AAEf,qEAAqE;AACrE,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;AAE7D,0EAA0E;AAC1E,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC;AAMhF;;;GAGG;AACH,eAAO,MAAM,4BAA4B,EAAE,EAAE,CAC3C,iBAAiB,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAA;CAAC,CAAC,CAKlD,CAAC;AAEF,+EAA+E;AAC/E,wBAAgB,uBAAuB,6DAEtC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;IACxC,iBAAiB,CAAC,EAAE,oBAAoB,CAAC;IACzC,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;CAC/C,GAAG,YAAY,CAOf"}
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, } from 'react';
3
+ const DeckMapDefaultStylesContext = createContext(undefined);
4
+ /**
5
+ * Supplies host-owned, theme-aware basemap defaults without persisting them in
6
+ * individual map resources. Explicit map config styles still take precedence.
7
+ */
8
+ export const DeckMapDefaultStylesProvider = ({ styles, children }) => (_jsx(DeckMapDefaultStylesContext.Provider, { value: styles, children: children }));
9
+ /** Returns theme-aware host map defaults from the nearest provider, if any. */
10
+ export function useDeckMapDefaultStyles() {
11
+ return useContext(DeckMapDefaultStylesContext);
12
+ }
13
+ /**
14
+ * Resolves the effective map style from explicit config, map props, host
15
+ * defaults, and finally the package fallback for the active theme.
16
+ */
17
+ export function resolveDeckMapStyle(options) {
18
+ return (options.mapStyle ??
19
+ options.mapPropsMapStyle ??
20
+ options.hostDefaultStyles?.[options.resolvedTheme] ??
21
+ options.fallbackStyles[options.resolvedTheme]);
22
+ }
23
+ //# sourceMappingURL=DeckMapDefaultStylesProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeckMapDefaultStylesProvider.js","sourceRoot":"","sources":["../src/DeckMapDefaultStylesProvider.tsx"],"names":[],"mappings":";AAEA,OAAO,EACL,aAAa,EACb,UAAU,GAGX,MAAM,OAAO,CAAC;AAQf,MAAM,2BAA2B,GAAG,aAAa,CAE/C,SAAS,CAAC,CAAC;AAEb;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAErC,CAAC,EAAC,MAAM,EAAE,QAAQ,EAAC,EAAE,EAAE,CAAC,CAC1B,KAAC,2BAA2B,CAAC,QAAQ,IAAC,KAAK,EAAE,MAAM,YAChD,QAAQ,GAC4B,CACxC,CAAC;AAEF,+EAA+E;AAC/E,MAAM,UAAU,uBAAuB;IACrC,OAAO,UAAU,CAAC,2BAA2B,CAAC,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAMnC;IACC,OAAO,CACL,OAAO,CAAC,QAAQ;QAChB,OAAO,CAAC,gBAAgB;QACxB,OAAO,CAAC,iBAAiB,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC;QAClD,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,aAAa,CAAC,CAC9C,CAAC;AACJ,CAAC","sourcesContent":["import type {ResolvedTheme} from '@sqlrooms/ui';\nimport type {MapProps} from 'react-map-gl/maplibre';\nimport {\n createContext,\n useContext,\n type FC,\n type PropsWithChildren,\n} from 'react';\n\n/** A MapLibre-compatible style accepted by the Deck map renderer. */\nexport type DeckMapStyle = NonNullable<MapProps['mapStyle']>;\n\n/** Optional host-provided basemap defaults keyed by resolved UI theme. */\nexport type DeckMapDefaultStyles = Partial<Record<ResolvedTheme, DeckMapStyle>>;\n\nconst DeckMapDefaultStylesContext = createContext<\n DeckMapDefaultStyles | undefined\n>(undefined);\n\n/**\n * Supplies host-owned, theme-aware basemap defaults without persisting them in\n * individual map resources. Explicit map config styles still take precedence.\n */\nexport const DeckMapDefaultStylesProvider: FC<\n PropsWithChildren<{styles: DeckMapDefaultStyles}>\n> = ({styles, children}) => (\n <DeckMapDefaultStylesContext.Provider value={styles}>\n {children}\n </DeckMapDefaultStylesContext.Provider>\n);\n\n/** Returns theme-aware host map defaults from the nearest provider, if any. */\nexport function useDeckMapDefaultStyles() {\n return useContext(DeckMapDefaultStylesContext);\n}\n\n/**\n * Resolves the effective map style from explicit config, map props, host\n * defaults, and finally the package fallback for the active theme.\n */\nexport function resolveDeckMapStyle(options: {\n mapStyle?: string;\n mapPropsMapStyle?: MapProps['mapStyle'];\n hostDefaultStyles?: DeckMapDefaultStyles;\n resolvedTheme: ResolvedTheme;\n fallbackStyles: Record<ResolvedTheme, string>;\n}): DeckMapStyle {\n return (\n options.mapStyle ??\n options.mapPropsMapStyle ??\n options.hostDefaultStyles?.[options.resolvedTheme] ??\n options.fallbackStyles[options.resolvedTheme]\n );\n}\n"]}
@@ -0,0 +1,39 @@
1
+ import type { DataTable } from '@sqlrooms/duckdb';
2
+ import { type ReactNode } from 'react';
3
+ import type { DeckMapResource, DeckMapRuntimeIssue } from './DeckMapsSlice';
4
+ import type { DeckDatasetInput } from './types';
5
+ /**
6
+ * Host-neutral data boundary for Deck map resources. Worksheet maps use the
7
+ * direct adapter below and are intentionally independent: no Mosaic selection
8
+ * or cross-filter state is read or published.
9
+ */
10
+ export type DeckMapDataAdapter = {
11
+ resolveDatasets: (options: {
12
+ mapId: string;
13
+ map: DeckMapResource;
14
+ }) => Record<string, DeckDatasetInput>;
15
+ /** Resolves an unsampled dataset input for fit-to-data bounds queries. */
16
+ resolveFitDataset?: (options: {
17
+ mapId: string;
18
+ map: DeckMapResource;
19
+ datasetId: string;
20
+ }) => DeckDatasetInput | undefined;
21
+ getTableColumns?: (tableName: string) => DataTable['columns'] | undefined;
22
+ };
23
+ export declare const directDeckMapDataAdapter: DeckMapDataAdapter;
24
+ export type DeckMapSurfaceProps = {
25
+ mapId: string;
26
+ map: DeckMapResource;
27
+ readOnly?: boolean;
28
+ selected?: boolean;
29
+ caption?: string;
30
+ headerActions?: ReactNode;
31
+ fitRequestVersion?: number;
32
+ onUpdateMap: (patch: Partial<DeckMapResource>) => void;
33
+ onReportIssue: (issue: Omit<DeckMapRuntimeIssue, 'mapId'>) => void;
34
+ /** Clears the current issue when its kind matches, or all issues when omitted. */
35
+ onClearIssue: (kind?: DeckMapRuntimeIssue['kind']) => void;
36
+ dataAdapter?: DeckMapDataAdapter;
37
+ };
38
+ export declare function DeckMapSurface({ mapId, map, onReportIssue, onClearIssue, fitRequestVersion, dataAdapter, }: DeckMapSurfaceProps): import("react/jsx-runtime").JSX.Element;
39
+ //# sourceMappingURL=DeckMapSurface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeckMapSurface.d.ts","sourceRoot":"","sources":["../src/DeckMapSurface.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAC,eAAe,EAAE,mBAAmB,EAAC,MAAM,iBAAiB,CAAC;AAa1E,OAAO,KAAK,EACV,gBAAgB,EAGjB,MAAM,SAAS,CAAC;AA6BjB;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,eAAe,EAAE,CAAC,OAAO,EAAE;QACzB,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,eAAe,CAAC;KACtB,KAAK,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACvC,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE;QAC5B,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,eAAe,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;KACnB,KAAK,gBAAgB,GAAG,SAAS,CAAC;IACnC,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,SAAS,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;CAC3E,CAAC;AAoCF,eAAO,MAAM,wBAAwB,EAAE,kBAKtC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,eAAe,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC;IACvD,aAAa,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,mBAAmB,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACnE,kFAAkF;IAClF,YAAY,EAAE,CAAC,IAAI,CAAC,EAAE,mBAAmB,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IAC3D,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,GAAG,EACH,aAAa,EACb,YAAY,EACZ,iBAAqB,EACrB,WAAsC,GACvC,EAAE,mBAAmB,2CA4HrB"}
@@ -0,0 +1,137 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useMemo, useRef, useState, } from 'react';
3
+ import { DeckJsonMap } from './DeckJsonMap';
4
+ import { DECK_TABLE_DATASET_SOURCE_RELATION } from './datasets/tableDatasetSql';
5
+ import { isDeckMapSqlDatasetSource, isDeckMapTableDatasetSource, } from './mapConfig';
6
+ import { getDeckMapDataPolicy } from './mapDataPolicy';
7
+ import { getDeckMapResourceConfigIssues } from './mapResourceAuthoring';
8
+ import { getDeckMapDatasetSource, resolveDeckMapFitToData, useDeckMapFitController, } from './mapFit';
9
+ function sampleDatasetSql(sql, maxRows) {
10
+ const sourceSql = sql.trim().replace(/(?:\s*;+\s*)+$/, '');
11
+ return `SELECT * FROM (${sourceSql}) USING SAMPLE ${maxRows} ROWS`;
12
+ }
13
+ function applyDataPolicy(input, policy) {
14
+ if (policy.disabled)
15
+ return input;
16
+ const maxRows = Math.max(1, Math.floor(policy.maxRows));
17
+ if ('sqlQuery' in input) {
18
+ return { ...input, sqlQuery: sampleDatasetSql(input.sqlQuery, maxRows) };
19
+ }
20
+ if ('tableName' in input) {
21
+ return {
22
+ ...input,
23
+ transformSql: sampleDatasetSql(input.transformSql ??
24
+ `SELECT * FROM ${DECK_TABLE_DATASET_SOURCE_RELATION}`, maxRows),
25
+ };
26
+ }
27
+ return input;
28
+ }
29
+ function resolveDirectDeckMapDatasets(map, dataPolicy) {
30
+ const resolved = {};
31
+ // A top-level selected table is only an unambiguous override when the map
32
+ // has one table-backed dataset. Multi-source maps retain authored tables.
33
+ const tableDatasetCount = Object.values(map.config.datasets).filter((dataset) => isDeckMapTableDatasetSource(dataset.source)).length;
34
+ for (const [datasetId, dataset] of Object.entries(map.config.datasets)) {
35
+ const { source, ...datasetConfig } = dataset;
36
+ let input;
37
+ if (isDeckMapSqlDatasetSource(source)) {
38
+ input = { ...datasetConfig, sqlQuery: source.sqlQuery };
39
+ }
40
+ else if (isDeckMapTableDatasetSource(source)) {
41
+ input = {
42
+ ...datasetConfig,
43
+ tableName: tableDatasetCount === 1
44
+ ? (map.selectedTable ?? source.tableName)
45
+ : source.tableName,
46
+ transformSql: source.transformSql,
47
+ };
48
+ }
49
+ if (input) {
50
+ resolved[datasetId] = dataPolicy
51
+ ? applyDataPolicy(input, dataPolicy)
52
+ : input;
53
+ }
54
+ }
55
+ return resolved;
56
+ }
57
+ export const directDeckMapDataAdapter = {
58
+ resolveDatasets: ({ map }) => resolveDirectDeckMapDatasets(map, getDeckMapDataPolicy(map.config)),
59
+ resolveFitDataset: ({ map, datasetId }) => resolveDirectDeckMapDatasets(map)[datasetId],
60
+ };
61
+ export function DeckMapSurface({ mapId, map, onReportIssue, onClearIssue, fitRequestVersion = 0, dataAdapter = directDeckMapDataAdapter, }) {
62
+ const [container, setContainer] = useState(null);
63
+ const deckMapRef = useRef(null);
64
+ const datasets = useMemo(() => dataAdapter.resolveDatasets({ mapId, map }), [dataAdapter, map, mapId]);
65
+ const configIssues = useMemo(() => getDeckMapResourceConfigIssues(map.config, { allowEmpty: true }), [map.config]);
66
+ useEffect(() => {
67
+ if (configIssues.length > 0) {
68
+ onReportIssue({
69
+ kind: 'config-error',
70
+ message: `${configIssues[0].path}: ${configIssues[0].message}`,
71
+ recoverable: true,
72
+ details: { issues: configIssues },
73
+ });
74
+ }
75
+ else {
76
+ onClearIssue('config-error');
77
+ }
78
+ }, [configIssues, onClearIssue, onReportIssue]);
79
+ const handleDatasetStates = useCallback((states) => {
80
+ const failure = Object.values(states).find((state) => state.status === 'error');
81
+ if (failure) {
82
+ onReportIssue({
83
+ kind: 'sql-error',
84
+ message: failure.error.message,
85
+ recoverable: true,
86
+ });
87
+ }
88
+ else if (Object.values(states).every((state) => state.status === 'ready')) {
89
+ onClearIssue('sql-error');
90
+ }
91
+ }, [onClearIssue, onReportIssue]);
92
+ useEffect(() => {
93
+ if (configIssues.length === 0 && Object.keys(datasets).length === 0) {
94
+ onClearIssue();
95
+ }
96
+ }, [configIssues, datasets, onClearIssue]);
97
+ const fitToData = useMemo(() => resolveDeckMapFitToData(map.config), [map.config]);
98
+ const fitSource = useMemo(() => {
99
+ if (!fitToData)
100
+ return null;
101
+ const fitDataset = dataAdapter.resolveFitDataset?.({
102
+ mapId,
103
+ map,
104
+ datasetId: fitToData.dataset,
105
+ }) ?? datasets[fitToData.dataset];
106
+ return getDeckMapDatasetSource(fitDataset);
107
+ }, [dataAdapter, datasets, fitToData, map, mapId]);
108
+ const handleFitError = useCallback((error) => onReportIssue({
109
+ kind: 'fit-error',
110
+ message: error.message,
111
+ recoverable: true,
112
+ }), [onReportIssue]);
113
+ const handleFitSuccess = useCallback(() => onClearIssue('fit-error'), [onClearIssue]);
114
+ useDeckMapFitController({
115
+ scopeId: mapId,
116
+ fitToData,
117
+ source: fitSource,
118
+ container,
119
+ deckMapRef,
120
+ requestVersion: fitRequestVersion,
121
+ autoFit: true,
122
+ onSuccess: handleFitSuccess,
123
+ onError: handleFitError,
124
+ });
125
+ if (configIssues.length > 0) {
126
+ return (_jsx("div", { className: "text-destructive flex h-full min-h-[320px] items-center justify-center p-4 text-center text-sm", children: `Invalid map configuration: ${configIssues[0].path}: ${configIssues[0].message}` }));
127
+ }
128
+ if (Object.keys(datasets).length === 0) {
129
+ return (_jsx("div", { className: "text-muted-foreground flex h-full min-h-[320px] items-center justify-center p-4 text-center text-sm", children: "Select a geospatial table to configure this map." }));
130
+ }
131
+ return (_jsx("div", { ref: setContainer, className: "h-full min-h-[320px]", children: _jsx(DeckJsonMap, { ref: deckMapRef, spec: map.config.spec, datasets: datasets, mapStyle: map.config.mapStyle, mapProps: map.config.mapProps, showLegends: map.config.showLegends, className: "h-full min-h-[320px]", onDatasetStatesChange: handleDatasetStates, onRenderingError: (error) => onReportIssue({
132
+ kind: 'render-error',
133
+ message: error.message,
134
+ recoverable: true,
135
+ }) }) }));
136
+ }
137
+ //# sourceMappingURL=DeckMapSurface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeckMapSurface.js","sourceRoot":"","sources":["../src/DeckMapSurface.tsx"],"names":[],"mappings":"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","sourcesContent":["import type {DataTable} from '@sqlrooms/duckdb';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport {DeckJsonMap} from './DeckJsonMap';\nimport type {DeckMapResource, DeckMapRuntimeIssue} from './DeckMapsSlice';\nimport {DECK_TABLE_DATASET_SOURCE_RELATION} from './datasets/tableDatasetSql';\nimport {\n isDeckMapSqlDatasetSource,\n isDeckMapTableDatasetSource,\n} from './mapConfig';\nimport {getDeckMapDataPolicy, type DeckMapDataPolicy} from './mapDataPolicy';\nimport {getDeckMapResourceConfigIssues} from './mapResourceAuthoring';\nimport {\n getDeckMapDatasetSource,\n resolveDeckMapFitToData,\n useDeckMapFitController,\n} from './mapFit';\nimport type {\n DeckDatasetInput,\n DeckJsonMapHandle,\n PreparedDeckDatasetState,\n} from './types';\n\nfunction sampleDatasetSql(sql: string, maxRows: number) {\n const sourceSql = sql.trim().replace(/(?:\\s*;+\\s*)+$/, '');\n return `SELECT * FROM (${sourceSql}) USING SAMPLE ${maxRows} ROWS`;\n}\n\nfunction applyDataPolicy(\n input: DeckDatasetInput,\n policy: DeckMapDataPolicy,\n): DeckDatasetInput {\n if (policy.disabled) return input;\n const maxRows = Math.max(1, Math.floor(policy.maxRows));\n if ('sqlQuery' in input) {\n return {...input, sqlQuery: sampleDatasetSql(input.sqlQuery, maxRows)};\n }\n if ('tableName' in input) {\n return {\n ...input,\n transformSql: sampleDatasetSql(\n input.transformSql ??\n `SELECT * FROM ${DECK_TABLE_DATASET_SOURCE_RELATION}`,\n maxRows,\n ),\n };\n }\n return input;\n}\n\n/**\n * Host-neutral data boundary for Deck map resources. Worksheet maps use the\n * direct adapter below and are intentionally independent: no Mosaic selection\n * or cross-filter state is read or published.\n */\nexport type DeckMapDataAdapter = {\n resolveDatasets: (options: {\n mapId: string;\n map: DeckMapResource;\n }) => Record<string, DeckDatasetInput>;\n /** Resolves an unsampled dataset input for fit-to-data bounds queries. */\n resolveFitDataset?: (options: {\n mapId: string;\n map: DeckMapResource;\n datasetId: string;\n }) => DeckDatasetInput | undefined;\n getTableColumns?: (tableName: string) => DataTable['columns'] | undefined;\n};\n\nfunction resolveDirectDeckMapDatasets(\n map: DeckMapResource,\n dataPolicy?: DeckMapDataPolicy,\n) {\n const resolved: Record<string, DeckDatasetInput> = {};\n // A top-level selected table is only an unambiguous override when the map\n // has one table-backed dataset. Multi-source maps retain authored tables.\n const tableDatasetCount = Object.values(map.config.datasets).filter(\n (dataset) => isDeckMapTableDatasetSource(dataset.source),\n ).length;\n for (const [datasetId, dataset] of Object.entries(map.config.datasets)) {\n const {source, ...datasetConfig} = dataset;\n let input: DeckDatasetInput | undefined;\n if (isDeckMapSqlDatasetSource(source)) {\n input = {...datasetConfig, sqlQuery: source.sqlQuery};\n } else if (isDeckMapTableDatasetSource(source)) {\n input = {\n ...datasetConfig,\n tableName:\n tableDatasetCount === 1\n ? (map.selectedTable ?? source.tableName)\n : source.tableName,\n transformSql: source.transformSql,\n };\n }\n if (input) {\n resolved[datasetId] = dataPolicy\n ? applyDataPolicy(input, dataPolicy)\n : input;\n }\n }\n return resolved;\n}\n\nexport const directDeckMapDataAdapter: DeckMapDataAdapter = {\n resolveDatasets: ({map}) =>\n resolveDirectDeckMapDatasets(map, getDeckMapDataPolicy(map.config)),\n resolveFitDataset: ({map, datasetId}) =>\n resolveDirectDeckMapDatasets(map)[datasetId],\n};\n\nexport type DeckMapSurfaceProps = {\n mapId: string;\n map: DeckMapResource;\n readOnly?: boolean;\n selected?: boolean;\n caption?: string;\n headerActions?: ReactNode;\n fitRequestVersion?: number;\n onUpdateMap: (patch: Partial<DeckMapResource>) => void;\n onReportIssue: (issue: Omit<DeckMapRuntimeIssue, 'mapId'>) => void;\n /** Clears the current issue when its kind matches, or all issues when omitted. */\n onClearIssue: (kind?: DeckMapRuntimeIssue['kind']) => void;\n dataAdapter?: DeckMapDataAdapter;\n};\n\nexport function DeckMapSurface({\n mapId,\n map,\n onReportIssue,\n onClearIssue,\n fitRequestVersion = 0,\n dataAdapter = directDeckMapDataAdapter,\n}: DeckMapSurfaceProps) {\n const [container, setContainer] = useState<HTMLDivElement | null>(null);\n const deckMapRef = useRef<DeckJsonMapHandle>(null);\n const datasets = useMemo(\n () => dataAdapter.resolveDatasets({mapId, map}),\n [dataAdapter, map, mapId],\n );\n const configIssues = useMemo(\n () => getDeckMapResourceConfigIssues(map.config, {allowEmpty: true}),\n [map.config],\n );\n useEffect(() => {\n if (configIssues.length > 0) {\n onReportIssue({\n kind: 'config-error',\n message: `${configIssues[0]!.path}: ${configIssues[0]!.message}`,\n recoverable: true,\n details: {issues: configIssues},\n });\n } else {\n onClearIssue('config-error');\n }\n }, [configIssues, onClearIssue, onReportIssue]);\n const handleDatasetStates = useCallback(\n (states: Record<string, PreparedDeckDatasetState>) => {\n const failure = Object.values(states).find(\n (\n state,\n ): state is Extract<PreparedDeckDatasetState, {status: 'error'}> =>\n state.status === 'error',\n );\n if (failure) {\n onReportIssue({\n kind: 'sql-error',\n message: failure.error.message,\n recoverable: true,\n });\n } else if (\n Object.values(states).every((state) => state.status === 'ready')\n ) {\n onClearIssue('sql-error');\n }\n },\n [onClearIssue, onReportIssue],\n );\n useEffect(() => {\n if (configIssues.length === 0 && Object.keys(datasets).length === 0) {\n onClearIssue();\n }\n }, [configIssues, datasets, onClearIssue]);\n const fitToData = useMemo(\n () => resolveDeckMapFitToData(map.config),\n [map.config],\n );\n const fitSource = useMemo(() => {\n if (!fitToData) return null;\n const fitDataset =\n dataAdapter.resolveFitDataset?.({\n mapId,\n map,\n datasetId: fitToData.dataset,\n }) ?? datasets[fitToData.dataset];\n return getDeckMapDatasetSource(fitDataset);\n }, [dataAdapter, datasets, fitToData, map, mapId]);\n const handleFitError = useCallback(\n (error: Error) =>\n onReportIssue({\n kind: 'fit-error',\n message: error.message,\n recoverable: true,\n }),\n [onReportIssue],\n );\n const handleFitSuccess = useCallback(\n () => onClearIssue('fit-error'),\n [onClearIssue],\n );\n useDeckMapFitController({\n scopeId: mapId,\n fitToData,\n source: fitSource,\n container,\n deckMapRef,\n requestVersion: fitRequestVersion,\n autoFit: true,\n onSuccess: handleFitSuccess,\n onError: handleFitError,\n });\n\n if (configIssues.length > 0) {\n return (\n <div className=\"text-destructive flex h-full min-h-[320px] items-center justify-center p-4 text-center text-sm\">\n {`Invalid map configuration: ${configIssues[0]!.path}: ${configIssues[0]!.message}`}\n </div>\n );\n }\n if (Object.keys(datasets).length === 0) {\n return (\n <div className=\"text-muted-foreground flex h-full min-h-[320px] items-center justify-center p-4 text-center text-sm\">\n Select a geospatial table to configure this map.\n </div>\n );\n }\n return (\n <div ref={setContainer} className=\"h-full min-h-[320px]\">\n <DeckJsonMap\n ref={deckMapRef}\n spec={map.config.spec}\n datasets={datasets}\n mapStyle={map.config.mapStyle}\n mapProps={map.config.mapProps}\n showLegends={map.config.showLegends}\n className=\"h-full min-h-[320px]\"\n onDatasetStatesChange={handleDatasetStates}\n onRenderingError={(error) =>\n onReportIssue({\n kind: 'render-error',\n message: error.message,\n recoverable: true,\n })\n }\n />\n </div>\n );\n}\n"]}
@@ -0,0 +1,99 @@
1
+ import { type DuckDbSliceState } from '@sqlrooms/duckdb';
2
+ import { z } from 'zod';
3
+ import { type DeckMapConfig } from './mapConfig';
4
+ /** Runtime schema for a durable Deck map resource entry. */
5
+ export declare const DeckMapResourceSchema: z.ZodObject<{
6
+ id: z.ZodString;
7
+ title: z.ZodString;
8
+ selectedTable: z.ZodOptional<z.ZodString>;
9
+ config: z.ZodObject<{
10
+ spec: z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnknown>]>;
11
+ datasets: z.ZodRecord<z.ZodString, z.ZodUnknown>;
12
+ configMode: z.ZodOptional<z.ZodEnum<{
13
+ custom: "custom";
14
+ basic: "basic";
15
+ }>>;
16
+ mapStyle: z.ZodOptional<z.ZodString>;
17
+ mapProps: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
18
+ showLegends: z.ZodOptional<z.ZodBoolean>;
19
+ interaction: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
20
+ fitToData: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
21
+ dataPolicy: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
22
+ settingsOpen: z.ZodOptional<z.ZodBoolean>;
23
+ }, z.core.$strip>;
24
+ }, z.core.$strip>;
25
+ /** A durable Deck map resource stored in the room configuration. */
26
+ export type DeckMapResource = Omit<z.infer<typeof DeckMapResourceSchema>, 'config'> & {
27
+ config: DeckMapConfig;
28
+ };
29
+ /** Persistence schema for the Deck maps slice configuration. */
30
+ export declare const DeckMapsSliceConfig: z.ZodObject<{
31
+ mapsById: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
32
+ id: z.ZodString;
33
+ title: z.ZodString;
34
+ selectedTable: z.ZodOptional<z.ZodString>;
35
+ config: z.ZodObject<{
36
+ spec: z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnknown>]>;
37
+ datasets: z.ZodRecord<z.ZodString, z.ZodUnknown>;
38
+ configMode: z.ZodOptional<z.ZodEnum<{
39
+ custom: "custom";
40
+ basic: "basic";
41
+ }>>;
42
+ mapStyle: z.ZodOptional<z.ZodString>;
43
+ mapProps: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
44
+ showLegends: z.ZodOptional<z.ZodBoolean>;
45
+ interaction: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
46
+ fitToData: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
47
+ dataPolicy: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
48
+ settingsOpen: z.ZodOptional<z.ZodBoolean>;
49
+ }, z.core.$strip>;
50
+ }, z.core.$strip>>>;
51
+ }, z.core.$strip>;
52
+ /** Persisted Deck map resources indexed by their stable resource ids. */
53
+ export type DeckMapsSliceConfig = {
54
+ mapsById: Record<string, DeckMapResource>;
55
+ };
56
+ /** Ephemeral rendering or data issue associated with one Deck map resource. */
57
+ export type DeckMapRuntimeIssue = {
58
+ kind: 'sql-error' | 'fit-error' | 'render-error' | 'data-policy-error' | 'config-error';
59
+ mapId: string;
60
+ message: string;
61
+ recoverable: boolean;
62
+ details?: Record<string, unknown>;
63
+ };
64
+ /** Callback pair for reporting and clearing ephemeral Deck map issues. */
65
+ export type DeckMapRuntimeIssueReporter = {
66
+ reportIssue: (issue: DeckMapRuntimeIssue) => void;
67
+ clearIssue: () => void;
68
+ };
69
+ /** Room-store state and actions for durable maps and ephemeral runtime issues. */
70
+ export type DeckMapsSliceState = {
71
+ deckMaps: {
72
+ config: DeckMapsSliceConfig;
73
+ runtime: {
74
+ issuesByMapId: Record<string, DeckMapRuntimeIssue>;
75
+ };
76
+ setConfig: (config: DeckMapsSliceConfig) => void;
77
+ ensureMap: (id: string, options?: {
78
+ title?: string;
79
+ config?: DeckMapConfig;
80
+ }) => void;
81
+ removeMap: (id: string) => void;
82
+ getMap: (id: string) => DeckMapResource | undefined;
83
+ updateMap: (id: string, patch: Partial<DeckMapResource>) => void;
84
+ setSelectedTable: (id: string, tableName?: string) => void;
85
+ reportMapIssue: (id: string, issue: Omit<DeckMapRuntimeIssue, 'mapId'>) => void;
86
+ /** Clears the current issue when its kind matches, or unconditionally when omitted. */
87
+ clearMapIssue: (id: string, kind?: DeckMapRuntimeIssue['kind']) => void;
88
+ };
89
+ };
90
+ /**
91
+ * Creates the room-store slice that owns durable Deck map resources and their
92
+ * instance-scoped runtime issues.
93
+ */
94
+ export declare function createDeckMapsSlice(props?: {
95
+ config?: Partial<DeckMapsSliceConfig>;
96
+ }): import("zustand").StateCreator<DeckMapsSliceState>;
97
+ /** Selects Deck map and DuckDB state from the current room store. */
98
+ export declare function useStoreWithDeckMaps<T>(selector: (state: DeckMapsSliceState & DuckDbSliceState) => T): T;
99
+ //# sourceMappingURL=DeckMapsSlice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeckMapsSlice.d.ts","sourceRoot":"","sources":["../src/DeckMapsSlice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,gBAAgB,EAAC,MAAM,kBAAkB,CAAC;AAOvD,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAA2B,KAAK,aAAa,EAAC,MAAM,aAAa,CAAC;AAezE,4DAA4D;AAC5D,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;iBAKhC,CAAC;AAEH,oEAAoE;AACpE,MAAM,MAAM,eAAe,GAAG,IAAI,CAChC,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,EACrC,QAAQ,CACT,GAAG;IACF,MAAM,EAAE,aAAa,CAAC;CACvB,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;iBAE9B,CAAC;AAEH,yEAAyE;AACzE,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC3C,CAAC;AAEF,+EAA+E;AAC/E,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EACA,WAAW,GACX,WAAW,GACX,cAAc,GACd,mBAAmB,GACnB,cAAc,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,CAAC;AAEF,0EAA0E;AAC1E,MAAM,MAAM,2BAA2B,GAAG;IACxC,WAAW,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAClD,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB,CAAC;AAEF,kFAAkF;AAClF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE;QACR,MAAM,EAAE,mBAAmB,CAAC;QAC5B,OAAO,EAAE;YAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;SAAC,CAAC;QAC9D,SAAS,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;QACjD,SAAS,EAAE,CACT,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE;YAAC,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,aAAa,CAAA;SAAC,KAC/C,IAAI,CAAC;QACV,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;QAChC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,eAAe,GAAG,SAAS,CAAC;QACpD,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC;QACjE,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;QAC3D,cAAc,EAAE,CACd,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,IAAI,CAAC,mBAAmB,EAAE,OAAO,CAAC,KACtC,IAAI,CAAC;QACV,uFAAuF;QACvF,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,mBAAmB,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;KACzE,CAAC;CACH,CAAC;AAEF;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,CAAC,EAAE;IAC1C,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACvC,sDA0EA;AAED,qEAAqE;AACrE,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,GAAG,gBAAgB,KAAK,CAAC,GAC5D,CAAC,CAEH"}
@@ -0,0 +1,89 @@
1
+ import { createSlice, useBaseRoomStore, } from '@sqlrooms/room-store';
2
+ import { produce } from 'immer';
3
+ import { z } from 'zod';
4
+ import { createEmptyDeckMapConfig } from './mapConfig';
5
+ const DeckMapConfigSchema = z.object({
6
+ spec: z.union([z.string(), z.record(z.string(), z.unknown())]),
7
+ datasets: z.record(z.string(), z.unknown()),
8
+ configMode: z.enum(['basic', 'custom']).optional(),
9
+ mapStyle: z.string().optional(),
10
+ mapProps: z.record(z.string(), z.unknown()).optional(),
11
+ showLegends: z.boolean().optional(),
12
+ interaction: z.record(z.string(), z.unknown()).optional(),
13
+ fitToData: z.record(z.string(), z.unknown()).optional(),
14
+ dataPolicy: z.record(z.string(), z.unknown()).optional(),
15
+ settingsOpen: z.boolean().optional(),
16
+ });
17
+ /** Runtime schema for a durable Deck map resource entry. */
18
+ export const DeckMapResourceSchema = z.object({
19
+ id: z.string(),
20
+ title: z.string(),
21
+ selectedTable: z.string().optional(),
22
+ config: DeckMapConfigSchema,
23
+ });
24
+ /** Persistence schema for the Deck maps slice configuration. */
25
+ export const DeckMapsSliceConfig = z.object({
26
+ mapsById: z.record(z.string(), DeckMapResourceSchema).default({}),
27
+ });
28
+ /**
29
+ * Creates the room-store slice that owns durable Deck map resources and their
30
+ * instance-scoped runtime issues.
31
+ */
32
+ export function createDeckMapsSlice(props) {
33
+ return createSlice((set, get) => ({
34
+ deckMaps: {
35
+ config: { mapsById: props?.config?.mapsById ?? {} },
36
+ runtime: { issuesByMapId: {} },
37
+ setConfig: (config) => set((state) => produce(state, (draft) => {
38
+ draft.deckMaps.config = config;
39
+ })),
40
+ ensureMap: (id, options) => set((state) => produce(state, (draft) => {
41
+ if (!draft.deckMaps.config.mapsById[id]) {
42
+ draft.deckMaps.config.mapsById[id] = {
43
+ id,
44
+ title: options?.title ?? 'Map',
45
+ config: options?.config ?? createEmptyDeckMapConfig(),
46
+ };
47
+ }
48
+ })),
49
+ removeMap: (id) => set((state) => produce(state, (draft) => {
50
+ delete draft.deckMaps.config.mapsById[id];
51
+ delete draft.deckMaps.runtime.issuesByMapId[id];
52
+ })),
53
+ getMap: (id) => get().deckMaps.config.mapsById[id],
54
+ updateMap: (id, patch) => set((state) => produce(state, (draft) => {
55
+ const map = draft.deckMaps.config.mapsById[id];
56
+ if (!map)
57
+ throw new Error(`Deck map ${id} was not found`);
58
+ Object.assign(map, patch, { id });
59
+ if (patch.config) {
60
+ const issue = draft.deckMaps.runtime.issuesByMapId[id];
61
+ if (Object.keys(patch.config.datasets).length === 0 ||
62
+ issue?.kind === 'render-error') {
63
+ delete draft.deckMaps.runtime.issuesByMapId[id];
64
+ }
65
+ }
66
+ })),
67
+ setSelectedTable: (id, tableName) => set((state) => produce(state, (draft) => {
68
+ const map = draft.deckMaps.config.mapsById[id];
69
+ if (!map)
70
+ throw new Error(`Deck map ${id} was not found`);
71
+ map.selectedTable = tableName;
72
+ })),
73
+ reportMapIssue: (id, issue) => set((state) => produce(state, (draft) => {
74
+ draft.deckMaps.runtime.issuesByMapId[id] = { ...issue, mapId: id };
75
+ })),
76
+ clearMapIssue: (id, kind) => set((state) => produce(state, (draft) => {
77
+ const issue = draft.deckMaps.runtime.issuesByMapId[id];
78
+ if (!kind || issue?.kind === kind) {
79
+ delete draft.deckMaps.runtime.issuesByMapId[id];
80
+ }
81
+ })),
82
+ },
83
+ }));
84
+ }
85
+ /** Selects Deck map and DuckDB state from the current room store. */
86
+ export function useStoreWithDeckMaps(selector) {
87
+ return useBaseRoomStore(selector);
88
+ }
89
+ //# sourceMappingURL=DeckMapsSlice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeckMapsSlice.js","sourceRoot":"","sources":["../src/DeckMapsSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {type DuckDbSliceState} from '@sqlrooms/duckdb';\nimport {\n type BaseRoomStoreState,\n createSlice,\n useBaseRoomStore,\n} from '@sqlrooms/room-store';\nimport {produce} from 'immer';\nimport {z} from 'zod';\nimport {createEmptyDeckMapConfig, type DeckMapConfig} from './mapConfig';\n\nconst DeckMapConfigSchema = z.object({\n spec: z.union([z.string(), z.record(z.string(), z.unknown())]),\n datasets: z.record(z.string(), z.unknown()),\n configMode: z.enum(['basic', 'custom']).optional(),\n mapStyle: z.string().optional(),\n mapProps: z.record(z.string(), z.unknown()).optional(),\n showLegends: z.boolean().optional(),\n interaction: z.record(z.string(), z.unknown()).optional(),\n fitToData: z.record(z.string(), z.unknown()).optional(),\n dataPolicy: z.record(z.string(), z.unknown()).optional(),\n settingsOpen: z.boolean().optional(),\n});\n\n/** Runtime schema for a durable Deck map resource entry. */\nexport const DeckMapResourceSchema = z.object({\n id: z.string(),\n title: z.string(),\n selectedTable: z.string().optional(),\n config: DeckMapConfigSchema,\n});\n\n/** A durable Deck map resource stored in the room configuration. */\nexport type DeckMapResource = Omit<\n z.infer<typeof DeckMapResourceSchema>,\n 'config'\n> & {\n config: DeckMapConfig;\n};\n\n/** Persistence schema for the Deck maps slice configuration. */\nexport const DeckMapsSliceConfig = z.object({\n mapsById: z.record(z.string(), DeckMapResourceSchema).default({}),\n});\n\n/** Persisted Deck map resources indexed by their stable resource ids. */\nexport type DeckMapsSliceConfig = {\n mapsById: Record<string, DeckMapResource>;\n};\n\n/** Ephemeral rendering or data issue associated with one Deck map resource. */\nexport type DeckMapRuntimeIssue = {\n kind:\n | 'sql-error'\n | 'fit-error'\n | 'render-error'\n | 'data-policy-error'\n | 'config-error';\n mapId: string;\n message: string;\n recoverable: boolean;\n details?: Record<string, unknown>;\n};\n\n/** Callback pair for reporting and clearing ephemeral Deck map issues. */\nexport type DeckMapRuntimeIssueReporter = {\n reportIssue: (issue: DeckMapRuntimeIssue) => void;\n clearIssue: () => void;\n};\n\n/** Room-store state and actions for durable maps and ephemeral runtime issues. */\nexport type DeckMapsSliceState = {\n deckMaps: {\n config: DeckMapsSliceConfig;\n runtime: {issuesByMapId: Record<string, DeckMapRuntimeIssue>};\n setConfig: (config: DeckMapsSliceConfig) => void;\n ensureMap: (\n id: string,\n options?: {title?: string; config?: DeckMapConfig},\n ) => void;\n removeMap: (id: string) => void;\n getMap: (id: string) => DeckMapResource | undefined;\n updateMap: (id: string, patch: Partial<DeckMapResource>) => void;\n setSelectedTable: (id: string, tableName?: string) => void;\n reportMapIssue: (\n id: string,\n issue: Omit<DeckMapRuntimeIssue, 'mapId'>,\n ) => void;\n /** Clears the current issue when its kind matches, or unconditionally when omitted. */\n clearMapIssue: (id: string, kind?: DeckMapRuntimeIssue['kind']) => void;\n };\n};\n\n/**\n * Creates the room-store slice that owns durable Deck map resources and their\n * instance-scoped runtime issues.\n */\nexport function createDeckMapsSlice(props?: {\n config?: Partial<DeckMapsSliceConfig>;\n}) {\n type RootState = BaseRoomStoreState & DuckDbSliceState & DeckMapsSliceState;\n return createSlice<DeckMapsSliceState, RootState>((set, get) => ({\n deckMaps: {\n config: {mapsById: props?.config?.mapsById ?? {}},\n runtime: {issuesByMapId: {}},\n setConfig: (config) =>\n set((state) =>\n produce(state, (draft) => {\n draft.deckMaps.config = config;\n }),\n ),\n ensureMap: (id, options) =>\n set((state) =>\n produce(state, (draft) => {\n if (!draft.deckMaps.config.mapsById[id]) {\n draft.deckMaps.config.mapsById[id] = {\n id,\n title: options?.title ?? 'Map',\n config: options?.config ?? createEmptyDeckMapConfig(),\n };\n }\n }),\n ),\n removeMap: (id) =>\n set((state) =>\n produce(state, (draft) => {\n delete draft.deckMaps.config.mapsById[id];\n delete draft.deckMaps.runtime.issuesByMapId[id];\n }),\n ),\n getMap: (id) => get().deckMaps.config.mapsById[id],\n updateMap: (id, patch) =>\n set((state) =>\n produce(state, (draft) => {\n const map = draft.deckMaps.config.mapsById[id];\n if (!map) throw new Error(`Deck map ${id} was not found`);\n Object.assign(map, patch, {id});\n if (patch.config) {\n const issue = draft.deckMaps.runtime.issuesByMapId[id];\n if (\n Object.keys(patch.config.datasets).length === 0 ||\n issue?.kind === 'render-error'\n ) {\n delete draft.deckMaps.runtime.issuesByMapId[id];\n }\n }\n }),\n ),\n setSelectedTable: (id, tableName) =>\n set((state) =>\n produce(state, (draft) => {\n const map = draft.deckMaps.config.mapsById[id];\n if (!map) throw new Error(`Deck map ${id} was not found`);\n map.selectedTable = tableName;\n }),\n ),\n reportMapIssue: (id, issue) =>\n set((state) =>\n produce(state, (draft) => {\n draft.deckMaps.runtime.issuesByMapId[id] = {...issue, mapId: id};\n }),\n ),\n clearMapIssue: (id, kind) =>\n set((state) =>\n produce(state, (draft) => {\n const issue = draft.deckMaps.runtime.issuesByMapId[id];\n if (!kind || issue?.kind === kind) {\n delete draft.deckMaps.runtime.issuesByMapId[id];\n }\n }),\n ),\n },\n }));\n}\n\n/** Selects Deck map and DuckDB state from the current room store. */\nexport function useStoreWithDeckMaps<T>(\n selector: (state: DeckMapsSliceState & DuckDbSliceState) => T,\n): T {\n return useBaseRoomStore<DeckMapsSliceState & DuckDbSliceState, T>(selector);\n}\n"]}