@jupytergis/base 0.15.0 → 0.16.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. package/lib/commands/BaseCommandIDs.d.ts +5 -0
  2. package/lib/commands/BaseCommandIDs.js +5 -0
  3. package/lib/commands/index.js +218 -47
  4. package/lib/commands/operationCommands.js +2 -2
  5. package/lib/constants.js +5 -1
  6. package/lib/{panelview/annotationPanel.js → features/annotations/AnnotationsPanel.js} +1 -1
  7. package/lib/{annotations → features/annotations}/index.d.ts +1 -0
  8. package/lib/{annotations → features/annotations}/index.js +1 -0
  9. package/lib/{console → features/console}/consoleview.js +1 -1
  10. package/lib/{panelview/filter-panel → features/filter}/Filter.js +4 -4
  11. package/lib/{panelview/filter-panel → features/filter}/FilterRow.d.ts +3 -2
  12. package/lib/{panelview/filter-panel → features/filter}/FilterRow.js +2 -1
  13. package/lib/{panelview/identify-panel → features/identify}/IdentifyPanel.d.ts +2 -0
  14. package/lib/features/identify/IdentifyPanel.js +102 -0
  15. package/lib/features/identify/components/FeatureCard.d.ts +17 -0
  16. package/lib/features/identify/components/FeatureCard.js +26 -0
  17. package/lib/features/identify/components/FeatureCardHeader.d.ts +11 -0
  18. package/lib/features/identify/components/FeatureCardHeader.js +30 -0
  19. package/lib/features/identify/components/FeatureFloater.d.ts +7 -0
  20. package/lib/features/identify/components/FeatureFloater.js +19 -0
  21. package/lib/features/identify/components/FeaturePropertyList.d.ts +11 -0
  22. package/lib/features/identify/components/FeaturePropertyList.js +18 -0
  23. package/lib/features/identify/components/FeatureRow.d.ts +13 -0
  24. package/lib/features/identify/components/FeatureRow.js +25 -0
  25. package/lib/features/identify/components/PropertyEditors.d.ts +44 -0
  26. package/lib/features/identify/components/PropertyEditors.js +56 -0
  27. package/lib/features/identify/hooks/useIdentifyPropertyEditor.d.ts +11 -0
  28. package/lib/features/identify/hooks/useIdentifyPropertyEditor.js +132 -0
  29. package/lib/features/identify/types/editorTypes.d.ts +21 -0
  30. package/lib/features/identify/utils/getFeatureIdentifier.d.ts +5 -0
  31. package/lib/features/identify/utils/getFeatureIdentifier.js +14 -0
  32. package/lib/features/identify/utils/highlightLayer.d.ts +11 -0
  33. package/lib/features/identify/utils/highlightLayer.js +57 -0
  34. package/lib/features/identify/utils/highlightStyle.d.ts +7 -0
  35. package/lib/features/identify/utils/highlightStyle.js +40 -0
  36. package/lib/{dialogs/layerBrowserDialog.js → features/layer-browser/index.js} +2 -2
  37. package/lib/features/layers/forms/layer/geoTiffLayerForm.d.ts +3 -0
  38. package/lib/{formbuilder/objectform/layer/webGlLayerForm.js → features/layers/forms/layer/geoTiffLayerForm.js} +5 -5
  39. package/lib/{formbuilder/objectform → features/layers/forms}/layer/heatmapLayerForm.js +4 -4
  40. package/lib/{formbuilder/objectform → features/layers/forms}/layer/hillshadeLayerForm.js +4 -4
  41. package/lib/{formbuilder/objectform → features/layers/forms}/layer/index.d.ts +1 -1
  42. package/lib/{formbuilder/objectform → features/layers/forms}/layer/index.js +1 -1
  43. package/lib/{formbuilder/objectform → features/layers/forms}/layer/layerform.d.ts +1 -1
  44. package/lib/{formbuilder/objectform → features/layers/forms}/layer/layerform.js +4 -4
  45. package/lib/features/layers/forms/layer/storySegmentLayerForm.js +150 -0
  46. package/lib/{formbuilder/objectform → features/layers/forms}/layer/vectorlayerform.js +4 -4
  47. package/lib/{formbuilder/objectform → features/layers/forms}/source/geojsonsource.js +5 -5
  48. package/lib/features/layers/forms/source/geopackagesource.d.ts +3 -0
  49. package/lib/features/layers/forms/source/geopackagesource.js +93 -0
  50. package/lib/{formbuilder/objectform → features/layers/forms}/source/geotiffsource.js +5 -5
  51. package/lib/{formbuilder/objectform → features/layers/forms}/source/index.d.ts +1 -0
  52. package/lib/{formbuilder/objectform → features/layers/forms}/source/index.js +1 -0
  53. package/lib/{formbuilder/objectform → features/layers/forms}/source/pathbasedsource.js +5 -5
  54. package/lib/{formbuilder/objectform → features/layers/forms}/source/sourceform.d.ts +1 -1
  55. package/lib/{formbuilder/objectform → features/layers/forms}/source/sourceform.js +4 -4
  56. package/lib/{formbuilder/objectform → features/layers/forms}/source/tilesourceform.js +4 -4
  57. package/lib/{formbuilder/objectform → features/layers/forms}/source/wmsTileSource.d.ts +1 -1
  58. package/lib/{formbuilder/objectform → features/layers/forms}/source/wmsTileSource.js +6 -6
  59. package/lib/{dialogs → features/layers}/layerCreationFormDialog.d.ts +1 -1
  60. package/lib/{dialogs → features/layers}/layerCreationFormDialog.js +1 -1
  61. package/lib/features/layers/symbology/Grammar.d.ts +11 -0
  62. package/lib/features/layers/symbology/Grammar.js +235 -0
  63. package/lib/{dialogs/symbology/vector_layer/types → features/layers/symbology}/Heatmap.d.ts +1 -1
  64. package/lib/{dialogs/symbology/vector_layer/types → features/layers/symbology}/Heatmap.js +30 -10
  65. package/lib/{dialogs → features/layers}/symbology/classificationModes.d.ts +6 -6
  66. package/lib/{dialogs → features/layers}/symbology/classificationModes.js +48 -44
  67. package/lib/{dialogs → features/layers}/symbology/colorRampUtils.d.ts +1 -0
  68. package/lib/{dialogs → features/layers}/symbology/colorRampUtils.js +12 -1
  69. package/lib/features/layers/symbology/components/MappingRow.d.ts +40 -0
  70. package/lib/features/layers/symbology/components/MappingRow.js +516 -0
  71. package/lib/features/layers/symbology/components/NumericInput.d.ts +20 -0
  72. package/lib/features/layers/symbology/components/NumericInput.js +44 -0
  73. package/lib/features/layers/symbology/components/ScaleEditor.d.ts +33 -0
  74. package/lib/features/layers/symbology/components/ScaleEditor.js +221 -0
  75. package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampControls.d.ts +1 -1
  76. package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampControls.js +3 -2
  77. package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampSelector.d.ts +2 -1
  78. package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampSelector.js +6 -1
  79. package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ModeSelectRow.d.ts +1 -1
  80. package/lib/{dialogs → features/layers}/symbology/components/color_ramp/RgbaColorPicker.js +39 -9
  81. package/lib/{dialogs → features/layers}/symbology/components/color_stops/StopRow.d.ts +1 -1
  82. package/lib/{dialogs → features/layers}/symbology/components/color_stops/StopRow.js +1 -1
  83. package/lib/features/layers/symbology/grammarToOLLayer.d.ts +27 -0
  84. package/lib/features/layers/symbology/grammarToOLLayer.js +145 -0
  85. package/lib/features/layers/symbology/grammarToOLStyle.d.ts +32 -0
  86. package/lib/features/layers/symbology/grammarToOLStyle.js +467 -0
  87. package/lib/{dialogs → features/layers}/symbology/hooks/useGetBandInfo.d.ts +1 -1
  88. package/lib/{dialogs → features/layers}/symbology/hooks/useGetBandInfo.js +1 -1
  89. package/lib/{dialogs → features/layers}/symbology/hooks/useGetProperties.js +1 -1
  90. package/lib/{dialogs → features/layers}/symbology/hooks/useGetSymbology.js +4 -2
  91. package/lib/features/layers/symbology/styleBuilder.d.ts +21 -0
  92. package/lib/features/layers/symbology/styleBuilder.js +145 -0
  93. package/lib/{dialogs → features/layers}/symbology/symbologyDialog.d.ts +1 -1
  94. package/lib/{dialogs → features/layers}/symbology/symbologyDialog.js +12 -12
  95. package/lib/{dialogs → features/layers}/symbology/symbologyUtils.d.ts +18 -10
  96. package/lib/{dialogs → features/layers}/symbology/symbologyUtils.js +0 -84
  97. package/lib/{panelview/objectproperties.d.ts → features/objectproperties/index.d.ts} +1 -1
  98. package/lib/{panelview/objectproperties.js → features/objectproperties/index.js} +5 -10
  99. package/lib/{dialogs → features/processing}/ProcessingFormDialog.d.ts +1 -1
  100. package/lib/{dialogs → features/processing}/ProcessingFormDialog.js +28 -14
  101. package/lib/features/processing/forms/MapExtentToggle.d.ts +13 -0
  102. package/lib/features/processing/forms/MapExtentToggle.js +20 -0
  103. package/lib/features/processing/forms/clipRasterByExtentForm.d.ts +10 -0
  104. package/lib/features/processing/forms/clipRasterByExtentForm.js +99 -0
  105. package/lib/{formbuilder/objectform/process → features/processing/forms}/dissolveProcessForm.js +5 -5
  106. package/lib/{formbuilder/objectform → features/processing/forms}/processingForm.d.ts +1 -1
  107. package/lib/{formbuilder/objectform → features/processing/forms}/processingForm.js +6 -6
  108. package/lib/features/processing/forms/rasterizeForm.d.ts +10 -0
  109. package/lib/features/processing/forms/rasterizeForm.js +75 -0
  110. package/lib/features/processing/forms/useMapExtent.d.ts +22 -0
  111. package/lib/features/processing/forms/useMapExtent.js +57 -0
  112. package/lib/{processing → features/processing}/index.d.ts +19 -2
  113. package/lib/features/processing/index.js +1246 -0
  114. package/lib/{processing → features/processing}/processingCommands.d.ts +1 -1
  115. package/lib/features/processing/processingCommands.js +168 -0
  116. package/lib/features/processing/serverProcessing.d.ts +51 -0
  117. package/lib/features/processing/serverProcessing.js +99 -0
  118. package/lib/{stacBrowser → features/stac-browser}/components/StacPanel.js +2 -2
  119. package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/QueryableComboBox.js +5 -5
  120. package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/QueryableRow.js +1 -1
  121. package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/StacFilterExtensionPanel.js +2 -2
  122. package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/StacQueryableFilters.js +1 -1
  123. package/lib/{stacBrowser → features/stac-browser}/components/geodes/StacFilterSection.js +3 -3
  124. package/lib/{stacBrowser → features/stac-browser}/components/shared/StacPanelResults.js +3 -3
  125. package/lib/{stacBrowser → features/stac-browser}/components/shared/StacSpatialExtent.js +1 -1
  126. package/lib/{stacBrowser → features/stac-browser}/components/shared/StacTemporalExtent.js +1 -1
  127. package/lib/{stacBrowser → features/stac-browser}/context/StacResultsContext.js +2 -2
  128. package/lib/{stacBrowser → features/stac-browser}/hooks/useGeodesSearch.js +2 -2
  129. package/lib/{stacBrowser → features/stac-browser}/hooks/useStacFilterExtension.js +3 -3
  130. package/lib/{stacBrowser → features/stac-browser}/hooks/useStacSearch.js +1 -1
  131. package/lib/features/stac-browser/types/types.js +1 -0
  132. package/lib/{panelview/story-maps → features/story}/SpectaPanel.d.ts +4 -1
  133. package/lib/{panelview/story-maps → features/story}/SpectaPanel.js +3 -4
  134. package/lib/{panelview/story-maps → features/story}/StoryEditorPanel.js +1 -1
  135. package/lib/{panelview/story-maps → features/story}/StoryViewerPanel.d.ts +12 -11
  136. package/lib/features/story/StoryViewerPanel.js +64 -0
  137. package/lib/features/story/__tests__/fixtures/listStoryTestItems.d.ts +9 -0
  138. package/lib/features/story/__tests__/fixtures/listStoryTestItems.js +21 -0
  139. package/lib/features/story/components/ListStoryMapOverlayPanel.d.ts +10 -0
  140. package/lib/features/story/components/ListStoryMapOverlayPanel.js +11 -0
  141. package/lib/features/story/components/ListStoryMarkdownMeasurePane.d.ts +11 -0
  142. package/lib/features/story/components/ListStoryMarkdownMeasurePane.js +55 -0
  143. package/lib/features/story/components/ListStoryOverlayMarkdown.d.ts +15 -0
  144. package/lib/features/story/components/ListStoryOverlayMarkdown.js +93 -0
  145. package/lib/features/story/components/ListStoryStageOverlay.d.ts +12 -0
  146. package/lib/features/story/components/ListStoryStageOverlay.js +132 -0
  147. package/lib/features/story/components/ListStoryVirtualScrollTrack.d.ts +6 -0
  148. package/lib/features/story/components/ListStoryVirtualScrollTrack.js +7 -0
  149. package/lib/{panelview/story-maps → features/story}/components/SpectaDesktopView.d.ts +4 -2
  150. package/lib/features/story/components/SpectaDesktopView.js +67 -0
  151. package/lib/{panelview/story-maps → features/story}/components/SpectaMobileView.d.ts +2 -4
  152. package/lib/{panelview/story-maps → features/story}/components/SpectaMobileView.js +3 -3
  153. package/lib/features/story/components/SpectaSingleModeContent.d.ts +18 -0
  154. package/lib/features/story/components/SpectaSingleModeContent.js +8 -0
  155. package/lib/features/story/context/ListStoryScrollTrackContext.d.ts +15 -0
  156. package/lib/features/story/context/ListStoryScrollTrackContext.js +142 -0
  157. package/lib/features/story/hooks/useCurrentSegmentIndex.d.ts +3 -0
  158. package/lib/features/story/hooks/useCurrentSegmentIndex.js +17 -0
  159. package/lib/features/story/hooks/useListStoryScroll.d.ts +15 -0
  160. package/lib/features/story/hooks/useListStoryScroll.js +107 -0
  161. package/lib/features/story/hooks/useQueuedMarkdownHeightMeasure.d.ts +19 -0
  162. package/lib/features/story/hooks/useQueuedMarkdownHeightMeasure.js +56 -0
  163. package/lib/features/story/hooks/useStoryImagePreload.d.ts +1 -0
  164. package/lib/features/story/hooks/useStoryImagePreload.js +24 -0
  165. package/lib/{panelview/story-maps → features/story}/hooks/useStoryMap.d.ts +2 -7
  166. package/lib/{panelview/story-maps → features/story}/hooks/useStoryMap.js +20 -44
  167. package/lib/features/story/hooks/useStoryScrollState.d.ts +21 -0
  168. package/lib/features/story/hooks/useStoryScrollState.js +39 -0
  169. package/lib/features/story/hooks/useStorySegmentSync.d.ts +8 -0
  170. package/lib/features/story/hooks/useStorySegmentSync.js +51 -0
  171. package/lib/features/story/types/types.d.ts +38 -0
  172. package/lib/features/story/types/types.js +1 -0
  173. package/lib/features/story/utils/computeListStoryScrollState.d.ts +12 -0
  174. package/lib/features/story/utils/computeListStoryScrollState.js +70 -0
  175. package/lib/features/story/utils/listStoryMeasureQueue.d.ts +11 -0
  176. package/lib/features/story/utils/listStoryMeasureQueue.js +14 -0
  177. package/lib/features/story/utils/listStoryScrollTrack.d.ts +17 -0
  178. package/lib/features/story/utils/listStoryScrollTrack.js +72 -0
  179. package/lib/features/story/utils/spectaPresentation.d.ts +9 -0
  180. package/lib/features/story/utils/spectaPresentation.js +37 -0
  181. package/lib/features/story/utils/storySegmentViewItems.d.ts +5 -0
  182. package/lib/features/story/utils/storySegmentViewItems.js +30 -0
  183. package/lib/index.d.ts +11 -9
  184. package/lib/index.js +11 -9
  185. package/lib/keybindings.json +5 -0
  186. package/lib/mainview/OpenEOTileLayer.d.ts +49 -0
  187. package/lib/mainview/OpenEOTileLayer.js +179 -0
  188. package/lib/mainview/TemporalSlider.js +11 -9
  189. package/lib/mainview/geoJsonFeaturePatch.d.ts +9 -0
  190. package/lib/mainview/geoJsonFeaturePatch.js +43 -0
  191. package/lib/mainview/mainView.d.ts +90 -7
  192. package/lib/mainview/mainView.js +1196 -586
  193. package/lib/mainview/mainviewwidget.d.ts +5 -1
  194. package/lib/mainview/mainviewwidget.js +4 -2
  195. package/lib/shared/components/Button.d.ts +1 -1
  196. package/lib/shared/components/DropdownMenu.d.ts +1 -0
  197. package/lib/shared/components/DropdownMenu.js +3 -2
  198. package/lib/shared/components/NativeSelect.d.ts +8 -0
  199. package/lib/shared/components/NativeSelect.js +29 -0
  200. package/lib/shared/components/Tabs.d.ts +3 -3
  201. package/lib/shared/components/Tabs.js +5 -5
  202. package/lib/{formbuilder → shared/formbuilder}/creationform.js +71 -4
  203. package/lib/{formbuilder → shared/formbuilder}/editform.js +1 -1
  204. package/lib/{formbuilder → shared/formbuilder}/formselectors.d.ts +2 -2
  205. package/lib/{formbuilder → shared/formbuilder}/formselectors.js +10 -4
  206. package/lib/shared/formbuilder/index.d.ts +4 -0
  207. package/lib/shared/formbuilder/index.js +4 -0
  208. package/lib/{formbuilder → shared/formbuilder}/objectform/SchemaForm.d.ts +1 -1
  209. package/lib/{formbuilder → shared/formbuilder}/objectform/StoryEditorForm.d.ts +1 -1
  210. package/lib/{formbuilder → shared/formbuilder}/objectform/StoryEditorForm.js +1 -1
  211. package/lib/{formbuilder → shared/formbuilder}/objectform/components/LayerSelect.js +1 -1
  212. package/lib/{formbuilder → shared/formbuilder}/objectform/components/SegmentFormSymbology.js +4 -4
  213. package/lib/{formbuilder → shared/formbuilder}/objectform/components/SourcePropertiesField.js +1 -1
  214. package/lib/{formbuilder → shared/formbuilder}/objectform/components/StorySegmentReset.js +1 -1
  215. package/lib/{formbuilder → shared/formbuilder}/objectform/components/WmsTileSourceUrlInput.js +4 -4
  216. package/lib/{formbuilder → shared/formbuilder}/objectform/fileselectorwidget.js +8 -1
  217. package/lib/{formbuilder → shared/formbuilder}/objectform/schemaUtils.d.ts +3 -1
  218. package/lib/{formbuilder → shared/formbuilder}/objectform/schemaUtils.js +11 -0
  219. package/lib/{formbuilder → shared/formbuilder}/objectform/useSchemaFormState.d.ts +1 -1
  220. package/lib/{formbuilder → shared/formbuilder}/objectform/useSchemaFormState.js +1 -1
  221. package/lib/{icons.d.ts → shared/icons.d.ts} +2 -0
  222. package/lib/{icons.js → shared/icons.js} +28 -18
  223. package/lib/tools.d.ts +2 -0
  224. package/lib/tools.js +138 -4
  225. package/lib/types.d.ts +6 -1
  226. package/lib/types.js +6 -1
  227. package/lib/{menus.js → workspace/menus.js} +10 -2
  228. package/lib/workspace/panels/components/TabbedPanel.d.ts +17 -0
  229. package/lib/workspace/panels/components/TabbedPanel.js +19 -0
  230. package/lib/{panelview → workspace/panels}/components/layers.js +63 -18
  231. package/lib/workspace/panels/components/legendItem.js +680 -0
  232. package/lib/workspace/panels/hooks/useLayerTree.d.ts +19 -0
  233. package/lib/workspace/panels/hooks/useLayerTree.js +103 -0
  234. package/lib/workspace/panels/hooks/useRightPanelOptions.d.ts +27 -0
  235. package/lib/workspace/panels/hooks/useRightPanelOptions.js +72 -0
  236. package/lib/workspace/panels/hooks/useUIState.d.ts +2 -0
  237. package/lib/workspace/panels/hooks/useUIState.js +25 -0
  238. package/lib/{panelview → workspace/panels}/index.d.ts +1 -1
  239. package/lib/{panelview → workspace/panels}/index.js +1 -1
  240. package/lib/{panelview → workspace/panels}/leftpanel.d.ts +1 -1
  241. package/lib/workspace/panels/leftpanel.js +70 -0
  242. package/lib/{panelview/rightpanel.d.ts → workspace/panels/mergedpanel.d.ts} +6 -5
  243. package/lib/workspace/panels/mergedpanel.js +166 -0
  244. package/lib/workspace/panels/rightpanel.d.ts +25 -0
  245. package/lib/{panelview → workspace/panels}/rightpanel.js +53 -63
  246. package/lib/{statusbar → workspace/statusbar}/StatusBar.js +5 -4
  247. package/lib/{toolbar → workspace/toolbar}/widget.d.ts +2 -0
  248. package/lib/{toolbar → workspace/toolbar}/widget.js +33 -5
  249. package/lib/{widget.d.ts → workspace/widget.d.ts} +7 -5
  250. package/lib/{widget.js → workspace/widget.js} +16 -7
  251. package/package.json +16 -4
  252. package/style/base.css +109 -1
  253. package/style/icons/geopackage.svg +95 -0
  254. package/style/icons/pencil_solid.svg +7 -0
  255. package/style/identify.css +95 -0
  256. package/style/layerBrowser.css +28 -0
  257. package/style/leftPanel.css +25 -0
  258. package/style/shared/button.css +12 -0
  259. package/style/shared/dropdownMenu.css +9 -0
  260. package/style/shared/nativeSelect.css +75 -0
  261. package/style/shared/tabs.css +1 -1
  262. package/style/spectaProgressBar.css +0 -1
  263. package/style/storyPanel.css +140 -9
  264. package/style/storySpectaArticleOverlay.css +129 -0
  265. package/style/symbologyDialog.css +285 -27
  266. package/lib/dialogs/symbology/tiff_layer/TiffRendering.d.ts +0 -4
  267. package/lib/dialogs/symbology/tiff_layer/TiffRendering.js +0 -42
  268. package/lib/dialogs/symbology/tiff_layer/components/BandRow.d.ts +0 -23
  269. package/lib/dialogs/symbology/tiff_layer/components/BandRow.js +0 -59
  270. package/lib/dialogs/symbology/tiff_layer/types/MultibandColor.d.ts +0 -4
  271. package/lib/dialogs/symbology/tiff_layer/types/MultibandColor.js +0 -92
  272. package/lib/dialogs/symbology/tiff_layer/types/SingleBandPseudoColor.d.ts +0 -5
  273. package/lib/dialogs/symbology/tiff_layer/types/SingleBandPseudoColor.js +0 -313
  274. package/lib/dialogs/symbology/vector_layer/VectorRendering.d.ts +0 -4
  275. package/lib/dialogs/symbology/vector_layer/VectorRendering.js +0 -112
  276. package/lib/dialogs/symbology/vector_layer/components/ValueSelect.d.ts +0 -8
  277. package/lib/dialogs/symbology/vector_layer/components/ValueSelect.js +0 -9
  278. package/lib/dialogs/symbology/vector_layer/types/Canonical.d.ts +0 -4
  279. package/lib/dialogs/symbology/vector_layer/types/Canonical.js +0 -130
  280. package/lib/dialogs/symbology/vector_layer/types/Categorized.d.ts +0 -4
  281. package/lib/dialogs/symbology/vector_layer/types/Categorized.js +0 -243
  282. package/lib/dialogs/symbology/vector_layer/types/Graduated.d.ts +0 -4
  283. package/lib/dialogs/symbology/vector_layer/types/Graduated.js +0 -362
  284. package/lib/dialogs/symbology/vector_layer/types/SimpleSymbol.d.ts +0 -4
  285. package/lib/dialogs/symbology/vector_layer/types/SimpleSymbol.js +0 -120
  286. package/lib/formbuilder/index.d.ts +0 -4
  287. package/lib/formbuilder/index.js +0 -4
  288. package/lib/formbuilder/objectform/layer/storySegmentLayerForm.js +0 -95
  289. package/lib/formbuilder/objectform/layer/webGlLayerForm.d.ts +0 -3
  290. package/lib/formbuilder/objectform/process/index.d.ts +0 -1
  291. package/lib/formbuilder/objectform/process/index.js +0 -1
  292. package/lib/panelview/components/legendItem.js +0 -210
  293. package/lib/panelview/identify-panel/IdentifyPanel.js +0 -102
  294. package/lib/panelview/leftpanel.js +0 -139
  295. package/lib/panelview/story-maps/StoryViewerPanel.js +0 -116
  296. package/lib/panelview/story-maps/components/SpectaDesktopView.js +0 -49
  297. package/lib/processing/index.js +0 -200
  298. package/lib/processing/processingCommands.js +0 -67
  299. /package/lib/{panelview/annotationPanel.d.ts → features/annotations/AnnotationsPanel.d.ts} +0 -0
  300. /package/lib/{annotations → features/annotations}/components/Annotation.d.ts +0 -0
  301. /package/lib/{annotations → features/annotations}/components/Annotation.js +0 -0
  302. /package/lib/{annotations → features/annotations}/components/AnnotationFloater.d.ts +0 -0
  303. /package/lib/{annotations → features/annotations}/components/AnnotationFloater.js +0 -0
  304. /package/lib/{annotations → features/annotations}/components/Message.d.ts +0 -0
  305. /package/lib/{annotations → features/annotations}/components/Message.js +0 -0
  306. /package/lib/{annotations → features/annotations}/model.d.ts +0 -0
  307. /package/lib/{annotations → features/annotations}/model.js +0 -0
  308. /package/lib/{console → features/console}/consoleview.d.ts +0 -0
  309. /package/lib/{console → features/console}/index.d.ts +0 -0
  310. /package/lib/{console → features/console}/index.js +0 -0
  311. /package/lib/{panelview/filter-panel → features/filter}/Filter.d.ts +0 -0
  312. /package/lib/{stacBrowser/types/types.js → features/identify/types/editorTypes.js} +0 -0
  313. /package/lib/{dialogs/layerBrowserDialog.d.ts → features/layer-browser/index.d.ts} +0 -0
  314. /package/lib/{formbuilder/objectform → features/layers/forms}/layer/heatmapLayerForm.d.ts +0 -0
  315. /package/lib/{formbuilder/objectform → features/layers/forms}/layer/hillshadeLayerForm.d.ts +0 -0
  316. /package/lib/{formbuilder/objectform → features/layers/forms}/layer/storySegmentLayerForm.d.ts +0 -0
  317. /package/lib/{formbuilder/objectform → features/layers/forms}/layer/vectorlayerform.d.ts +0 -0
  318. /package/lib/{formbuilder/objectform → features/layers/forms}/source/geojsonsource.d.ts +0 -0
  319. /package/lib/{formbuilder/objectform → features/layers/forms}/source/geotiffsource.d.ts +0 -0
  320. /package/lib/{formbuilder/objectform → features/layers/forms}/source/pathbasedsource.d.ts +0 -0
  321. /package/lib/{formbuilder/objectform → features/layers/forms}/source/tilesourceform.d.ts +0 -0
  322. /package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampSelectorEntry.d.ts +0 -0
  323. /package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampSelectorEntry.js +0 -0
  324. /package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ModeSelectRow.js +0 -0
  325. /package/lib/{dialogs → features/layers}/symbology/components/color_ramp/RgbaColorPicker.d.ts +0 -0
  326. /package/lib/{dialogs → features/layers}/symbology/components/color_ramp/cmocean.json +0 -0
  327. /package/lib/{dialogs → features/layers}/symbology/components/color_stops/StopContainer.d.ts +0 -0
  328. /package/lib/{dialogs → features/layers}/symbology/components/color_stops/StopContainer.js +0 -0
  329. /package/lib/{dialogs → features/layers}/symbology/hooks/useEffectiveSymbologyParams.d.ts +0 -0
  330. /package/lib/{dialogs → features/layers}/symbology/hooks/useEffectiveSymbologyParams.js +0 -0
  331. /package/lib/{dialogs → features/layers}/symbology/hooks/useGetProperties.d.ts +0 -0
  332. /package/lib/{dialogs → features/layers}/symbology/hooks/useGetSymbology.d.ts +0 -0
  333. /package/lib/{dialogs → features/layers}/symbology/hooks/useOkSignal.d.ts +0 -0
  334. /package/lib/{dialogs → features/layers}/symbology/hooks/useOkSignal.js +0 -0
  335. /package/lib/{formbuilder/objectform/process → features/processing/forms}/dissolveProcessForm.d.ts +0 -0
  336. /package/lib/{processing → features/processing}/processingFormToParam.d.ts +0 -0
  337. /package/lib/{processing → features/processing}/processingFormToParam.js +0 -0
  338. /package/lib/{stacBrowser → features/stac-browser}/components/StacPanel.d.ts +0 -0
  339. /package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/QueryableComboBox.d.ts +0 -0
  340. /package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/QueryableRow.d.ts +0 -0
  341. /package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/StacFilterExtensionPanel.d.ts +0 -0
  342. /package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/StacQueryableFilters.d.ts +0 -0
  343. /package/lib/{stacBrowser → features/stac-browser}/components/geodes/StacFilterSection.d.ts +0 -0
  344. /package/lib/{stacBrowser → features/stac-browser}/components/geodes/StacGeodesFilterPanel.d.ts +0 -0
  345. /package/lib/{stacBrowser → features/stac-browser}/components/geodes/StacGeodesFilterPanel.js +0 -0
  346. /package/lib/{stacBrowser → features/stac-browser}/components/shared/StacPanelResults.d.ts +0 -0
  347. /package/lib/{stacBrowser → features/stac-browser}/components/shared/StacSpatialExtent.d.ts +0 -0
  348. /package/lib/{stacBrowser → features/stac-browser}/components/shared/StacTemporalExtent.d.ts +0 -0
  349. /package/lib/{stacBrowser → features/stac-browser}/constants.d.ts +0 -0
  350. /package/lib/{stacBrowser → features/stac-browser}/constants.js +0 -0
  351. /package/lib/{stacBrowser → features/stac-browser}/context/StacResultsContext.d.ts +0 -0
  352. /package/lib/{stacBrowser → features/stac-browser}/hooks/useGeodesSearch.d.ts +0 -0
  353. /package/lib/{stacBrowser → features/stac-browser}/hooks/useStacFilterExtension.d.ts +0 -0
  354. /package/lib/{stacBrowser → features/stac-browser}/hooks/useStacSearch.d.ts +0 -0
  355. /package/lib/{stacBrowser → features/stac-browser}/index.d.ts +0 -0
  356. /package/lib/{stacBrowser → features/stac-browser}/index.js +0 -0
  357. /package/lib/{stacBrowser → features/stac-browser}/types/types.d.ts +0 -0
  358. /package/lib/{panelview/story-maps → features/story}/StoryEditorPanel.d.ts +0 -0
  359. /package/lib/{panelview/story-maps → features/story}/components/PreviewModeSwitch.d.ts +0 -0
  360. /package/lib/{panelview/story-maps → features/story}/components/PreviewModeSwitch.js +0 -0
  361. /package/lib/{panelview/story-maps → features/story}/components/StoryContentSection.d.ts +0 -0
  362. /package/lib/{panelview/story-maps → features/story}/components/StoryContentSection.js +0 -0
  363. /package/lib/{panelview/story-maps → features/story}/components/StoryImageSection.d.ts +0 -0
  364. /package/lib/{panelview/story-maps → features/story}/components/StoryImageSection.js +0 -0
  365. /package/lib/{panelview/story-maps → features/story}/components/StoryNavBar.d.ts +0 -0
  366. /package/lib/{panelview/story-maps → features/story}/components/StoryNavBar.js +0 -0
  367. /package/lib/{panelview/story-maps → features/story}/components/StorySubtitleSection.d.ts +0 -0
  368. /package/lib/{panelview/story-maps → features/story}/components/StorySubtitleSection.js +0 -0
  369. /package/lib/{panelview/story-maps → features/story}/components/StoryTitleSection.d.ts +0 -0
  370. /package/lib/{panelview/story-maps → features/story}/components/StoryTitleSection.js +0 -0
  371. /package/lib/{formbuilder → shared/formbuilder}/creationform.d.ts +0 -0
  372. /package/lib/{formbuilder → shared/formbuilder}/editform.d.ts +0 -0
  373. /package/lib/{formbuilder → shared/formbuilder}/objectform/SchemaForm.js +0 -0
  374. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/LayerSelect.d.ts +0 -0
  375. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/OpacitySlider.d.ts +0 -0
  376. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/OpacitySlider.js +0 -0
  377. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/SegmentFormSymbology.d.ts +0 -0
  378. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/SourcePropertiesField.d.ts +0 -0
  379. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/StorySegmentReset.d.ts +0 -0
  380. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/WmsTileSourceUrlInput.d.ts +0 -0
  381. /package/lib/{formbuilder → shared/formbuilder}/objectform/fileselectorwidget.d.ts +0 -0
  382. /package/lib/{store.d.ts → shared/store.d.ts} +0 -0
  383. /package/lib/{store.js → shared/store.js} +0 -0
  384. /package/lib/{menus.d.ts → workspace/menus.d.ts} +0 -0
  385. /package/lib/{panelview → workspace/panels}/components/layers.d.ts +0 -0
  386. /package/lib/{panelview → workspace/panels}/components/legendItem.d.ts +0 -0
  387. /package/lib/{panelview → workspace/panels}/header.d.ts +0 -0
  388. /package/lib/{panelview → workspace/panels}/header.js +0 -0
  389. /package/lib/{statusbar → workspace/statusbar}/SpectaPresentationProgressBar.d.ts +0 -0
  390. /package/lib/{statusbar → workspace/statusbar}/SpectaPresentationProgressBar.js +0 -0
  391. /package/lib/{statusbar → workspace/statusbar}/StatusBar.d.ts +0 -0
  392. /package/lib/{toolbar → workspace/toolbar}/index.d.ts +0 -0
  393. /package/lib/{toolbar → workspace/toolbar}/index.js +0 -0
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Grammar symbology panel.
3
+ *
4
+ * Shows encoding rules grouped by layer. Each layer has optional render-side
5
+ * transforms (KDE, cluster) followed by (field → scale → channels) mapping rows.
6
+ * Multiple layers allow independent rendering pipelines on the same source.
7
+ */
8
+ import React from 'react';
9
+ import { ISymbologyDialogProps } from "./symbologyDialog";
10
+ declare const Grammar: React.FC<ISymbologyDialogProps>;
11
+ export default Grammar;
@@ -0,0 +1,235 @@
1
+ /**
2
+ * Grammar symbology panel.
3
+ *
4
+ * Shows encoding rules grouped by layer. Each layer has optional render-side
5
+ * transforms (KDE, cluster) followed by (field → scale → channels) mapping rows.
6
+ * Multiple layers allow independent rendering pipelines on the same source.
7
+ */
8
+ import { faPlus, faTrash, faXmark } from '@fortawesome/free-solid-svg-icons';
9
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
10
+ import { UUID } from '@lumino/coreutils';
11
+ import React, { useCallback, useEffect, useState } from 'react';
12
+ import MappingRow, { WhenAddForm, formatPredicate, } from "./components/MappingRow";
13
+ import { NumericInput } from "./components/NumericInput";
14
+ import { useEffectiveSymbologyParams } from "./hooks/useEffectiveSymbologyParams";
15
+ import useGetBandInfo from "./hooks/useGetBandInfo";
16
+ import { useGetProperties } from "./hooks/useGetProperties";
17
+ import { useOkSignal } from "./hooks/useOkSignal";
18
+ import { saveSymbology, } from "./symbologyUtils";
19
+ import { Button } from "../../../shared/components/Button";
20
+ import { NativeSelect, NativeSelectOption, } from "../../../shared/components/NativeSelect";
21
+ const DEFAULT_CHANNELS = ['fill-color', 'circle-fill-color'];
22
+ const DEFAULT_RGBA = [128, 128, 128, 1];
23
+ // ---------------------------------------------------------------------------
24
+ // Canonical → Grammar conversion
25
+ // ---------------------------------------------------------------------------
26
+ // ---------------------------------------------------------------------------
27
+ // Transform row
28
+ // ---------------------------------------------------------------------------
29
+ const TRANSFORM_TYPES = [
30
+ { value: 'kde', label: 'KDE (heatmap)' },
31
+ { value: 'cluster', label: 'cluster' },
32
+ ];
33
+ function defaultTransform(type) {
34
+ switch (type) {
35
+ case 'kde':
36
+ return { type: 'kde', radius: 10, blur: 15 };
37
+ case 'cluster':
38
+ return { type: 'cluster', radius: 40 };
39
+ }
40
+ }
41
+ const TransformRow = ({ transform, availableFields, onChange, onDelete, }) => {
42
+ var _a;
43
+ const handleTypeChange = (type) => {
44
+ onChange(defaultTransform(type));
45
+ };
46
+ return (React.createElement("div", { className: "jp-gis-grammar-transform-row" },
47
+ React.createElement(NativeSelect, { value: transform.type, onChange: e => handleTypeChange(e.target.value) }, TRANSFORM_TYPES.map(({ value, label }) => (React.createElement(NativeSelectOption, { key: value, value: value }, label)))),
48
+ transform.type === 'kde' && (React.createElement(React.Fragment, null,
49
+ React.createElement("label", null, "radius"),
50
+ React.createElement(NumericInput, { style: { width: 52 }, value: transform.radius, onChange: v => onChange(Object.assign(Object.assign({}, transform), { radius: v })) }),
51
+ React.createElement("label", null, "blur"),
52
+ React.createElement(NumericInput, { style: { width: 52 }, value: transform.blur, onChange: v => onChange(Object.assign(Object.assign({}, transform), { blur: v })) }),
53
+ React.createElement("label", null, "weight"),
54
+ React.createElement(NativeSelect, { value: (_a = transform.weightField) !== null && _a !== void 0 ? _a : '', onChange: e => onChange(Object.assign(Object.assign({}, transform), { weightField: e.target.value || undefined })) },
55
+ React.createElement(NativeSelectOption, { value: "" }, "(none)"),
56
+ availableFields.map(field => (React.createElement(NativeSelectOption, { key: field, value: field }, field)))))),
57
+ transform.type === 'cluster' && (React.createElement(React.Fragment, null,
58
+ React.createElement("label", null, "radius"),
59
+ React.createElement(NumericInput, { style: { width: 52 }, value: transform.radius, onChange: v => onChange(Object.assign(Object.assign({}, transform), { radius: v })) }))),
60
+ React.createElement(Button, { type: "button", className: "jp-gis-grammar-delete-btn", onClick: onDelete, title: "Remove transform", style: { marginLeft: 'auto' } },
61
+ React.createElement(FontAwesomeIcon, { icon: faTrash }))));
62
+ };
63
+ const LayerSection = ({ layer, layerIndex, totalLayers, availableFields, featureValues, isRasterLayer = false, onChange, onDelete, }) => {
64
+ var _a, _b, _c, _d;
65
+ const [addingLayerWhen, setAddingLayerWhen] = useState(false);
66
+ const addLayerPredicate = useCallback((pred) => {
67
+ var _a;
68
+ onChange(Object.assign(Object.assign({}, layer), { when: [...((_a = layer.when) !== null && _a !== void 0 ? _a : []), pred] }));
69
+ setAddingLayerWhen(false);
70
+ }, [layer, onChange]);
71
+ const removeLayerPredicate = useCallback((index) => {
72
+ var _a;
73
+ const next = ((_a = layer.when) !== null && _a !== void 0 ? _a : []).filter((_, i) => i !== index);
74
+ onChange(Object.assign(Object.assign({}, layer), { when: next.length > 0 ? next : undefined }));
75
+ }, [layer, onChange]);
76
+ const updateTransform = useCallback((index, t) => {
77
+ const next = [...layer.transforms];
78
+ next[index] = t;
79
+ onChange(Object.assign(Object.assign({}, layer), { transforms: next }));
80
+ }, [layer, onChange]);
81
+ const removeTransform = useCallback((index) => {
82
+ onChange(Object.assign(Object.assign({}, layer), { transforms: layer.transforms.filter((_, i) => i !== index) }));
83
+ }, [layer, onChange]);
84
+ const addTransform = useCallback(() => {
85
+ onChange(Object.assign(Object.assign({}, layer), { transforms: [...layer.transforms, defaultTransform('kde')] }));
86
+ }, [layer, onChange]);
87
+ const updateRow = useCallback((index, row) => {
88
+ const next = [...layer.rows];
89
+ next[index] = row;
90
+ onChange(Object.assign(Object.assign({}, layer), { rows: next }));
91
+ }, [layer, onChange]);
92
+ const removeRow = useCallback((index) => {
93
+ onChange(Object.assign(Object.assign({}, layer), { rows: layer.rows.filter((_, i) => i !== index) }));
94
+ }, [layer, onChange]);
95
+ const hasKDE = layer.transforms.some(t => t.type === 'kde');
96
+ const isRaster = isRasterLayer || hasKDE;
97
+ const addRow = useCallback(() => {
98
+ const defaultChannels = isRaster
99
+ ? ['pixel-color']
100
+ : DEFAULT_CHANNELS;
101
+ onChange(Object.assign(Object.assign({}, layer), { rows: [
102
+ ...layer.rows,
103
+ {
104
+ id: UUID.uuid4(),
105
+ scale: { scheme: 'constant_rgba', params: { value: DEFAULT_RGBA } },
106
+ channels: [...defaultChannels],
107
+ },
108
+ ] }));
109
+ }, [layer, onChange, isRaster]);
110
+ // KDE layers expose '$density'; raster layers expose $band-N fields.
111
+ // Both cases suppress the raw feature attribute list.
112
+ const encodingFields = hasKDE ? ['$density'] : availableFields;
113
+ return (React.createElement("div", { className: "jp-gis-grammar-layer-section" },
114
+ React.createElement("div", { className: "jp-gis-grammar-layer-header" },
115
+ React.createElement("span", { className: "jp-gis-grammar-layer-label" },
116
+ "Layer ",
117
+ layerIndex + 1),
118
+ React.createElement(Button, { type: "button", variant: "outline", onClick: addTransform, title: "Add transform" },
119
+ React.createElement(FontAwesomeIcon, { "data-icon": "inline-start", icon: faPlus }),
120
+ "Transform"),
121
+ totalLayers > 1 && (React.createElement(Button, { type: "button", variant: "outline", style: { height: 32, width: 32 }, onClick: onDelete, title: "Remove layer" },
122
+ React.createElement(FontAwesomeIcon, { icon: faTrash })))),
123
+ React.createElement("div", { className: "jp-gis-grammar-when-row" },
124
+ React.createElement("span", { className: "jp-gis-grammar-when-label" }, "when"),
125
+ ((_b = (_a = layer.when) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) > 1 && (React.createElement(Button, { type: "button", className: "jp-gis-grammar-when-op", onClick: () => {
126
+ var _a;
127
+ return onChange(Object.assign(Object.assign({}, layer), { whenOp: ((_a = layer.whenOp) !== null && _a !== void 0 ? _a : 'all') === 'all' ? 'any' : 'all' }));
128
+ } }, (_c = layer.whenOp) !== null && _c !== void 0 ? _c : 'all')), (_d = layer.when) === null || _d === void 0 ? void 0 :
129
+ _d.map((pred, i) => (React.createElement("span", { key: i, className: "jp-gis-grammar-when-chip" },
130
+ formatPredicate(pred),
131
+ React.createElement(Button, { type: "button", onClick: () => removeLayerPredicate(i), title: "Remove condition" },
132
+ React.createElement(FontAwesomeIcon, { icon: faXmark }))))),
133
+ addingLayerWhen ? (React.createElement(WhenAddForm, { availableFields: availableFields, onAdd: addLayerPredicate, onCancel: () => setAddingLayerWhen(false) })) : (React.createElement(Button, { type: "button", className: "jp-gis-grammar-when-add-btn", onClick: () => setAddingLayerWhen(true) },
134
+ React.createElement(FontAwesomeIcon, { icon: faPlus })))),
135
+ layer.transforms.map((t, i) => (React.createElement(TransformRow, { key: i, transform: t, availableFields: availableFields, onChange: updated => updateTransform(i, updated), onDelete: () => removeTransform(i) }))),
136
+ layer.rows.map((row, i) => (React.createElement(MappingRow, { key: row.id, row: row, availableFields: encodingFields, featureValues: featureValues, isRaster: isRaster, onChange: updated => updateRow(i, updated), onDelete: () => removeRow(i) }))),
137
+ React.createElement("div", { className: "jp-gis-symbology-button-container" },
138
+ React.createElement(Button, { className: "jp-Dialog-button jp-mod-accept jp-mod-styled", style: { margin: '0 0 0.5rem 1rem' }, onClick: addRow }, "Add Mapping"))));
139
+ };
140
+ // ---------------------------------------------------------------------------
141
+ // Grammar panel
142
+ // ---------------------------------------------------------------------------
143
+ const Grammar = ({ model, okSignalPromise, layerId, isStorySegmentOverride, segmentId, }) => {
144
+ const layer = layerId !== undefined ? model.getLayer(layerId) : null;
145
+ const isRasterLayer = (layer === null || layer === void 0 ? void 0 : layer.type) === 'GeoTiffLayer';
146
+ const { featureProperties: selectableAttributesAndValues } = useGetProperties({ layerId, model });
147
+ // For raster layers, expose $band-N pseudo-fields derived from band metadata.
148
+ const { bandRows } = useGetBandInfo(model, layer);
149
+ const params = useEffectiveSymbologyParams({
150
+ model,
151
+ layerId,
152
+ layer,
153
+ isStorySegmentOverride,
154
+ segmentId,
155
+ });
156
+ const [layers, setLayers] = useState([
157
+ { id: UUID.uuid4(), transforms: [], rows: [] },
158
+ ]);
159
+ useEffect(() => {
160
+ if (!(params === null || params === void 0 ? void 0 : params.symbologyState)) {
161
+ return;
162
+ }
163
+ const rawState = params.symbologyState;
164
+ if (!Array.isArray(rawState.layers) ||
165
+ !rawState.layers.length) {
166
+ setLayers([{ id: UUID.uuid4(), transforms: [], rows: [] }]);
167
+ return;
168
+ }
169
+ const state = rawState;
170
+ setLayers(state.layers.map(grammarLayer => {
171
+ var _a, _b;
172
+ return (Object.assign(Object.assign(Object.assign({ id: grammarLayer.id, transforms: (_a = grammarLayer.preprocess) !== null && _a !== void 0 ? _a : [] }, (((_b = grammarLayer.when) === null || _b === void 0 ? void 0 : _b.length) ? { when: grammarLayer.when } : {})), (grammarLayer.whenOp ? { whenOp: grammarLayer.whenOp } : {})), { rows: grammarLayer.rules.flatMap(rule => rule.mappings.map((mapping, mi) => {
173
+ var _a;
174
+ return (Object.assign(Object.assign({
175
+ // Preserve the rule's stable id so React keys and story-segment
176
+ // override merging stay consistent across dialog opens.
177
+ // When a rule has multiple mappings, suffix with the mapping index.
178
+ id: rule.mappings.length === 1 ? rule.id : `${rule.id}-${mi}`, fields: ((_a = rule.fields) === null || _a === void 0 ? void 0 : _a.length) ? rule.fields : undefined, scale: mapping.scale, channels: [...mapping.channels] }, (rule.when ? { when: rule.when } : {})), (rule.whenOp ? { whenOp: rule.whenOp } : {})));
179
+ })) }));
180
+ }));
181
+ }, [params]);
182
+ const handleOk = () => {
183
+ if (!layerId || !(layer === null || layer === void 0 ? void 0 : layer.parameters)) {
184
+ return;
185
+ }
186
+ const grammarLayers = layers.map(uiLayer => {
187
+ var _a;
188
+ const rules = uiLayer.rows
189
+ .filter(row => row.channels.length > 0)
190
+ .map(row => {
191
+ var _a, _b;
192
+ return (Object.assign(Object.assign(Object.assign(Object.assign({ id: row.id }, (((_a = row.fields) === null || _a === void 0 ? void 0 : _a.length) ? { fields: row.fields } : {})), (((_b = row.when) === null || _b === void 0 ? void 0 : _b.length) ? { when: row.when } : {})), (row.whenOp ? { whenOp: row.whenOp } : {})), { mappings: [
193
+ {
194
+ scale: row.scale,
195
+ channels: row.channels,
196
+ },
197
+ ] }));
198
+ });
199
+ return Object.assign(Object.assign(Object.assign(Object.assign({ id: uiLayer.id }, (uiLayer.transforms.length
200
+ ? { preprocess: uiLayer.transforms }
201
+ : {})), (((_a = uiLayer.when) === null || _a === void 0 ? void 0 : _a.length) ? { when: uiLayer.when } : {})), (uiLayer.whenOp ? { whenOp: uiLayer.whenOp } : {})), { rules });
202
+ });
203
+ const symbologyState = {
204
+ layers: grammarLayers,
205
+ };
206
+ saveSymbology({
207
+ model,
208
+ layerId,
209
+ isStorySegmentOverride,
210
+ segmentId,
211
+ payload: { symbologyState },
212
+ mutateLayerBeforeSave: targetLayer => {
213
+ var _a;
214
+ if (((_a = targetLayer.parameters) === null || _a === void 0 ? void 0 : _a.color) !== undefined) {
215
+ delete targetLayer.parameters.color;
216
+ }
217
+ },
218
+ });
219
+ };
220
+ useOkSignal(okSignalPromise, handleOk);
221
+ const addLayer = () => {
222
+ setLayers(prev => [
223
+ ...prev,
224
+ { id: UUID.uuid4(), transforms: [], rows: [] },
225
+ ]);
226
+ };
227
+ const availableFields = isRasterLayer
228
+ ? bandRows.map(b => `$band-${b.band}`)
229
+ : Object.keys(selectableAttributesAndValues);
230
+ return (React.createElement("div", { className: "jp-gis-layer-symbology-container" },
231
+ layers.map((uiLayer, i) => (React.createElement(LayerSection, { key: uiLayer.id, layer: uiLayer, layerIndex: i, totalLayers: layers.length, availableFields: availableFields, featureValues: selectableAttributesAndValues, isRasterLayer: isRasterLayer, onChange: updated => setLayers(prev => prev.map((l, j) => (j === i ? updated : l))), onDelete: () => setLayers(prev => prev.filter((_, j) => j !== i)) }))),
232
+ React.createElement("div", { className: "jp-gis-symbology-button-container" },
233
+ React.createElement(Button, { className: "jp-Dialog-button jp-mod-accept jp-mod-styled", onClick: addLayer }, "Add Layer"))));
234
+ };
235
+ export default Grammar;
@@ -1,4 +1,4 @@
1
1
  import React from 'react';
2
- import { ISymbologyDialogProps } from "../../symbologyDialog";
2
+ import { ISymbologyDialogProps } from "./symbologyDialog";
3
3
  declare const Heatmap: React.FC<ISymbologyDialogProps>;
4
4
  export default Heatmap;
@@ -1,10 +1,11 @@
1
1
  import colormap from 'colormap';
2
2
  import React, { useEffect, useState } from 'react';
3
- import ColorRampSelector from "../../components/color_ramp/ColorRampSelector";
4
- import { useOkSignal } from "../../hooks/useOkSignal";
5
- import { saveSymbology, } from "../../symbologyUtils";
6
- import { useLatest } from "../../../../shared/hooks/useLatest";
7
- import { useEffectiveSymbologyParams } from '../../hooks/useEffectiveSymbologyParams';
3
+ import ColorRampSelector from "./components/color_ramp/ColorRampSelector";
4
+ import { useOkSignal } from "./hooks/useOkSignal";
5
+ import { saveSymbology, } from "./symbologyUtils";
6
+ import { useLatest } from "../../../shared/hooks/useLatest";
7
+ import { useColorMapList, COLOR_RAMP_DEFAULTS, } from './colorRampUtils';
8
+ import { useEffectiveSymbologyParams } from './hooks/useEffectiveSymbologyParams';
8
9
  const Heatmap = ({ model, okSignalPromise, layerId, isStorySegmentOverride, segmentId, }) => {
9
10
  if (!layerId) {
10
11
  return;
@@ -26,9 +27,20 @@ const Heatmap = ({ model, okSignalPromise, layerId, isStorySegmentOverride, segm
26
27
  blur: 15,
27
28
  });
28
29
  const [reverseRamp, setReverseRamp] = useState(false);
30
+ const [colorMaps, setColorMaps] = useState([]);
29
31
  const selectedRampRef = useLatest(selectedRamp);
30
32
  const heatmapOptionsRef = useLatest(heatmapOptions);
31
33
  const reverseRampRef = useLatest(reverseRamp);
34
+ useColorMapList(setColorMaps);
35
+ // Filter: only continuous colormaps with class requirement <= 9 nshades
36
+ // because heatmap does not support nshades > 9
37
+ const continuousMaps = colorMaps.filter(m => {
38
+ if (m.type !== 'continuous') {
39
+ return false;
40
+ }
41
+ const minShades = COLOR_RAMP_DEFAULTS[m.name];
42
+ return !minShades || minShades <= 9;
43
+ });
32
44
  useEffect(() => {
33
45
  populateOptions();
34
46
  }, []);
@@ -38,8 +50,8 @@ const Heatmap = ({ model, okSignalPromise, layerId, isStorySegmentOverride, segm
38
50
  if ((_a = params.symbologyState) === null || _a === void 0 ? void 0 : _a.colorRamp) {
39
51
  colorRamp = params.symbologyState.colorRamp;
40
52
  }
41
- if (typeof ((_b = params.symbologyState) === null || _b === void 0 ? void 0 : _b.reverse) === 'boolean') {
42
- setReverseRamp(params.symbologyState.reverse);
53
+ if (typeof ((_b = params.symbologyState) === null || _b === void 0 ? void 0 : _b.reverseRamp) === 'boolean') {
54
+ setReverseRamp(params.symbologyState.reverseRamp);
43
55
  }
44
56
  setSelectedRamp(colorRamp);
45
57
  };
@@ -52,10 +64,15 @@ const Heatmap = ({ model, okSignalPromise, layerId, isStorySegmentOverride, segm
52
64
  if (reverseRampRef.current) {
53
65
  colorMap = [...colorMap].reverse();
54
66
  }
67
+ // The Heatmap dialog converts a vector layer to a heatmap layer via
68
+ // mutateLayerBeforeSave; the symbologyState it writes is structurally
69
+ // a heatmap state (renderType: 'Heatmap', with a gradient array) but
70
+ // needs to be accepted on VectorSymbologyParams here, hence the cast.
55
71
  const symbologyState = {
56
72
  renderType: 'Heatmap',
57
73
  colorRamp: selectedRampRef.current,
58
- reverse: reverseRampRef.current,
74
+ reverseRamp: reverseRampRef.current,
75
+ gradient: colorMap,
59
76
  };
60
77
  saveSymbology({
61
78
  model,
@@ -64,12 +81,15 @@ const Heatmap = ({ model, okSignalPromise, layerId, isStorySegmentOverride, segm
64
81
  segmentId,
65
82
  payload: {
66
83
  symbologyState,
67
- color: colorMap,
68
84
  },
69
85
  mutateLayerBeforeSave: targetLayer => {
86
+ var _a;
70
87
  targetLayer.parameters.blur = heatmapOptionsRef.current.blur;
71
88
  targetLayer.parameters.radius = heatmapOptionsRef.current.radius;
72
89
  targetLayer.type = 'HeatmapLayer';
90
+ if (((_a = targetLayer.parameters) === null || _a === void 0 ? void 0 : _a.color) !== undefined) {
91
+ delete targetLayer.parameters.color;
92
+ }
73
93
  },
74
94
  });
75
95
  };
@@ -78,7 +98,7 @@ const Heatmap = ({ model, okSignalPromise, layerId, isStorySegmentOverride, segm
78
98
  React.createElement("p", null, "Represent features based on their density using a heatmap."),
79
99
  React.createElement("div", { className: "jp-gis-symbology-row jp-gis-heatmap" },
80
100
  React.createElement("label", { htmlFor: "color-ramp-select" }, "Color Ramp:"),
81
- React.createElement(ColorRampSelector, { selectedRamp: selectedRamp, setSelected: setSelectedRamp, reverse: reverseRamp, setReverse: setReverseRamp })),
101
+ React.createElement(ColorRampSelector, { selectedRamp: selectedRamp, setSelected: setSelectedRamp, reverse: reverseRamp, setReverse: setReverseRamp, colorMaps: continuousMaps })),
82
102
  React.createElement("div", { className: "jp-gis-symbology-row" },
83
103
  React.createElement("label", { htmlFor: 'vector-value-select' }, "Radius:"),
84
104
  React.createElement("input", { type: "number", value: heatmapOptions.radius, className: "jp-mod-styled", onChange: event => setHetamapOptions(prevState => (Object.assign(Object.assign({}, prevState), { radius: +event.target.value }))) })),
@@ -1,10 +1,10 @@
1
- import { InterpolationType } from './tiff_layer/types/SingleBandPseudoColor';
1
+ export type InterpolationType = 'discrete' | 'linear' | 'exact';
2
2
  export declare namespace VectorClassifications {
3
- const calculateQuantileBreaks: (values: number[], nClasses: number) => number[];
4
- const calculateEqualIntervalBreaks: (values: number[], nClasses: number) => number[];
5
- const calculateJenksBreaks: (values: number[], nClasses: number) => any[];
6
- const calculatePrettyBreaks: (values: number[], nClasses: number) => number[];
7
- const calculateLogarithmicBreaks: (values: number[], nClasses: number) => number[];
3
+ const calculateQuantileBreaks: (values: number[], nStops: number) => number[];
4
+ const calculateEqualIntervalBreaks: (values: number[], nStops: number) => number[];
5
+ const calculateJenksBreaks: (values: number[], nStops: number) => any[];
6
+ const calculatePrettyBreaks: (values: number[], nStops: number) => number[];
7
+ const calculateLogarithmicBreaks: (values: number[], nStops: number) => number[];
8
8
  }
9
9
  export declare namespace GeoTiffClassifications {
10
10
  const classifyQuantileBreaks: (nClasses: number, bandNumber: number, url: string, colorRampType: string) => Promise<number[]>;
@@ -2,7 +2,8 @@
2
2
  import { Pool, fromUrl } from 'geotiff';
3
3
  export var VectorClassifications;
4
4
  (function (VectorClassifications) {
5
- VectorClassifications.calculateQuantileBreaks = (values, nClasses) => {
5
+ VectorClassifications.calculateQuantileBreaks = (values, nStops) => {
6
+ // Returns nStops anchor points: vmin, (nStops-2) interior quantile boundaries, vmax.
6
7
  // q-th quantile of a data set:
7
8
  // value where q fraction of data is below and (1-q) fraction is above this value
8
9
  // Xq = (1 - r) * X_NI1 + r * X_NI2
@@ -11,54 +12,56 @@ export var VectorClassifications;
11
12
  // r = q * (n+1) - (int) (q * (n+1))
12
13
  // (indices of X: 1...n)
13
14
  const sortedValues = [...values].sort((a, b) => a - b);
14
- const breaks = [];
15
- if (!sortedValues) {
15
+ if (sortedValues.length === 0) {
16
16
  return [];
17
17
  }
18
18
  const n = sortedValues.length;
19
- let xq = n > 0 ? sortedValues[0] : 0;
20
- for (let i = 1; i < nClasses; i++) {
19
+ const breaks = [sortedValues[0]]; // vmin
20
+ for (let i = 1; i < nStops - 1; i++) {
21
21
  if (n > 1) {
22
- const q = i / nClasses;
22
+ const q = i / (nStops - 1);
23
23
  const a = q * (n - 1);
24
24
  const aa = Math.floor(a);
25
25
  const r = a - aa;
26
- xq = (1 - r) * sortedValues[aa] + r * sortedValues[aa + 1];
26
+ const xq = (1 - r) * sortedValues[aa] +
27
+ r * sortedValues[Math.min(aa + 1, n - 1)];
28
+ breaks.push(xq);
27
29
  }
28
- breaks.push(xq);
29
30
  }
30
- breaks.push(sortedValues[n - 1]);
31
+ breaks.push(sortedValues[n - 1]); // vmax
31
32
  return breaks;
32
33
  };
33
- VectorClassifications.calculateEqualIntervalBreaks = (values, nClasses) => {
34
+ VectorClassifications.calculateEqualIntervalBreaks = (values, nStops) => {
35
+ // Returns nStops evenly-spaced anchor points from vmin to vmax (linspace contract).
34
36
  const minimum = Math.min(...values);
35
37
  const maximum = Math.max(...values);
38
+ if (nStops <= 1) {
39
+ return [minimum];
40
+ }
36
41
  const breaks = [];
37
- const step = (maximum - minimum) / nClasses;
38
- let value = minimum;
39
- for (let i = 0; i < nClasses; i++) {
40
- value += step;
41
- breaks.push(value);
42
+ const step = (maximum - minimum) / (nStops - 1);
43
+ for (let i = 0; i < nStops; i++) {
44
+ breaks.push(minimum + i * step);
42
45
  }
43
- breaks[nClasses - 1] = maximum;
46
+ breaks[nStops - 1] = maximum; // pin to avoid floating-point drift
44
47
  return breaks;
45
48
  };
46
- VectorClassifications.calculateJenksBreaks = (values, nClasses) => {
49
+ VectorClassifications.calculateJenksBreaks = (values, nStops) => {
47
50
  const maximum = Math.max(...values);
48
51
  if (values.length === 0) {
49
52
  return [];
50
53
  }
51
- if (nClasses <= 1) {
54
+ if (nStops <= 1) {
52
55
  return [maximum];
53
56
  }
54
- if (nClasses >= values.length) {
57
+ if (nStops >= values.length) {
55
58
  return values;
56
59
  }
57
60
  const sample = [...values].sort((a, b) => a - b);
58
61
  const n = sample.length;
59
- const matrixOne = Array.from({ length: n + 1 }, () => Array(nClasses + 1).fill(0));
60
- const matrixTwo = Array.from({ length: n + 1 }, () => Array(nClasses + 1).fill(Number.MAX_VALUE));
61
- for (let i = 1; i <= nClasses; i++) {
62
+ const matrixOne = Array.from({ length: n + 1 }, () => Array(nStops + 1).fill(0));
63
+ const matrixTwo = Array.from({ length: n + 1 }, () => Array(nStops + 1).fill(Number.MAX_VALUE));
64
+ for (let i = 1; i <= nStops; i++) {
62
65
  matrixOne[0][i] = 1;
63
66
  matrixOne[1][i] = 1;
64
67
  matrixTwo[0][i] = 0.0;
@@ -80,7 +83,7 @@ export var VectorClassifications;
80
83
  v = s2 - (s1 * s1) / w;
81
84
  const i4 = i3 - 1;
82
85
  if (i4 !== 0) {
83
- for (let j = 2; j <= nClasses; j++) {
86
+ for (let j = 2; j <= nStops; j++) {
84
87
  if (matrixTwo[l][j] >= v + matrixTwo[i4][j - 1]) {
85
88
  matrixOne[l][j] = i4;
86
89
  matrixTwo[l][j] = v + matrixTwo[i4][j - 1];
@@ -91,28 +94,33 @@ export var VectorClassifications;
91
94
  matrixOne[l][1] = 1;
92
95
  matrixTwo[l][1] = v;
93
96
  }
94
- const breaks = Array(nClasses);
95
- breaks[nClasses - 1] = sample[n - 1];
96
- for (let j = nClasses, k = n; j >= 2; j--) {
97
- const id = matrixOne[k][j] - 1;
98
- breaks[j - 2] = sample[id];
99
- k = matrixOne[k][j] - 1;
97
+ // Returns nStops anchor points: vmin, (nStops-2) natural-break upper bounds, vmax.
98
+ // Interior breaks use the upper bound of each class (last element before the next
99
+ // class starts) rather than the lower bound (first element of the next class).
100
+ const breaks = Array(nStops);
101
+ breaks[0] = sample[0]; // vmin
102
+ breaks[nStops - 1] = sample[n - 1]; // vmax
103
+ let k = n;
104
+ for (let j = nStops; j >= 3; j--) {
105
+ const id = matrixOne[k][j] - 1; // 0-based start index of class j
106
+ breaks[j - 2] = sample[id - 1]; // upper bound of class j-1
107
+ k = id;
100
108
  }
101
109
  return breaks;
102
110
  };
103
- VectorClassifications.calculatePrettyBreaks = (values, nClasses) => {
111
+ VectorClassifications.calculatePrettyBreaks = (values, nStops) => {
104
112
  const minimum = Math.min(...values);
105
113
  const maximum = Math.max(...values);
106
114
  const breaks = [];
107
- if (nClasses < 1) {
115
+ if (nStops < 1) {
108
116
  breaks.push(maximum);
109
117
  return breaks;
110
118
  }
111
- const minimumCount = Math.floor(nClasses / 3);
119
+ const minimumCount = Math.floor(nStops / 3);
112
120
  const shrink = 0.75;
113
121
  const highBias = 1.5;
114
122
  const adjustBias = 0.5 + 1.5 * highBias;
115
- const divisions = nClasses;
123
+ const divisions = nStops;
116
124
  const h = highBias;
117
125
  let cell;
118
126
  let small = false;
@@ -177,18 +185,14 @@ export var VectorClassifications;
177
185
  }
178
186
  const minimumBreak = start * unit;
179
187
  const count = end - start;
180
- for (let i = 1; i < count + 1; i++) {
188
+ // Include the pretty lower bound (i=0) so all stops snap to round values,
189
+ // even when minimumBreak < vmin (that is the point of pretty breaks).
190
+ for (let i = 0; i < count + 1; i++) {
181
191
  breaks.push(minimumBreak + i * unit);
182
192
  }
183
193
  if (breaks.length === 0) {
184
194
  return breaks;
185
195
  }
186
- if (breaks[0] < minimum) {
187
- breaks[0] = minimum;
188
- }
189
- if (breaks[breaks.length - 1] > maximum) {
190
- breaks[breaks.length - 1] = maximum;
191
- }
192
196
  if (minimum < 0.0 && maximum > 0.0) {
193
197
  const breaksMinusZero = breaks.map(b => b - 0.0);
194
198
  let posOfMin = 0;
@@ -201,9 +205,9 @@ export var VectorClassifications;
201
205
  }
202
206
  return breaks;
203
207
  };
204
- VectorClassifications.calculateLogarithmicBreaks = (values, nClasses) => {
208
+ VectorClassifications.calculateLogarithmicBreaks = (values, nStops) => {
205
209
  const positiveValues = values.filter(v => v > 0);
206
- if (positiveValues.length === 0 || nClasses < 1) {
210
+ if (positiveValues.length === 0 || nStops < 1) {
207
211
  return [];
208
212
  }
209
213
  const minimum = Math.min(...positiveValues);
@@ -211,8 +215,8 @@ export var VectorClassifications;
211
215
  const logMin = Math.log10(minimum);
212
216
  const logMax = Math.log10(maximum);
213
217
  const breaks = [];
214
- for (let i = 0; i < nClasses; i++) {
215
- const t = nClasses === 1 ? 0 : i / (nClasses - 1);
218
+ for (let i = 0; i < nStops; i++) {
219
+ const t = nStops === 1 ? 0 : i / (nStops - 1);
216
220
  breaks.push(Math.pow(10, logMin + t * (logMax - logMin)));
217
221
  }
218
222
  return breaks;
@@ -49,6 +49,7 @@ export declare const getColorMapList: () => IColorMap[];
49
49
  * Hook that loads and sets color maps.
50
50
  */
51
51
  export declare const useColorMapList: (setColorMaps: (maps: IColorMap[]) => void) => void;
52
+ export declare const getColorMap: (name: ColorRampName) => IColorMap | undefined;
52
53
  /**
53
54
  * Ensure we always get a valid hex string from either an RGB(A) array or string.
54
55
  */
@@ -14,7 +14,7 @@ import colorScale from 'colormap/colorScale.js';
14
14
  import * as d3Chromatic from 'd3-scale-chromatic';
15
15
  import { useEffect } from 'react';
16
16
  import rawCmocean from "./components/color_ramp/cmocean.json";
17
- import { objectEntries } from "../../tools";
17
+ import { objectEntries } from "../../../tools";
18
18
  export const RGBA_INDEX = { r: 0, g: 1, b: 2, a: 3 };
19
19
  /** OpenLayers default blue, used as the fallback color throughout symbology dialogs. */
20
20
  export const DEFAULT_COLOR = [51, 153, 204, 1];
@@ -156,6 +156,17 @@ export const useColorMapList = (setColorMaps) => {
156
156
  setColorMaps(getColorMapList());
157
157
  }, [setColorMaps]);
158
158
  };
159
+ /**
160
+ * Get a color map by name.
161
+ * Caches the full list on first call for efficiency, since generating color ramps is expensive.
162
+ */
163
+ let colorMapCache = null;
164
+ export const getColorMap = (name) => {
165
+ if (!colorMapCache) {
166
+ colorMapCache = getColorMapList();
167
+ }
168
+ return colorMapCache.find(c => c.name === name);
169
+ };
159
170
  /**
160
171
  * Ensure we always get a valid hex string from either an RGB(A) array or string.
161
172
  */
@@ -0,0 +1,40 @@
1
+ /**
2
+ * A single grammar mapping row: field → scale → channels (fan-out tree).
3
+ * The scale preview spans all channel rows. Additional channels branch below.
4
+ * "when" predicates are shown as chips below the grid.
5
+ */
6
+ import { IPredicate, IScale, StyleChannel } from '@jupytergis/schema';
7
+ import React from 'react';
8
+ export declare function formatPredicate(pred: IPredicate): string;
9
+ interface IWhenAddFormProps {
10
+ availableFields: string[];
11
+ onAdd: (pred: IPredicate) => void;
12
+ onCancel: () => void;
13
+ }
14
+ export declare const WhenAddForm: React.FC<IWhenAddFormProps>;
15
+ export interface IGrammarRow {
16
+ id: string;
17
+ /** Selected input field(s). Length is governed by fieldCountForScale(scale). */
18
+ fields?: string[];
19
+ scale: IScale;
20
+ channels: StyleChannel[];
21
+ when?: IPredicate[];
22
+ whenOp?: 'all' | 'any';
23
+ }
24
+ /**
25
+ * How many input fields a scale accepts.
26
+ * 0 — constants (no field selector shown)
27
+ * 1 — all single-field scales
28
+ * 'any' — multi-field (expression scale, sub-channel assembly)
29
+ */
30
+ export declare function fieldCountForScale(scheme: IScale['scheme']): 0 | 1 | 'any';
31
+ interface IMappingRowProps {
32
+ row: IGrammarRow;
33
+ availableFields: string[];
34
+ featureValues: Record<string, Set<any>>;
35
+ isRaster?: boolean;
36
+ onChange: (row: IGrammarRow) => void;
37
+ onDelete: () => void;
38
+ }
39
+ declare const MappingRow: React.FC<IMappingRowProps>;
40
+ export default MappingRow;