@jupytergis/base 0.15.0 → 0.16.0-alpha.1

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 (414) 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 -48
  4. package/lib/commands/operationCommands.js +2 -2
  5. package/lib/constants.js +9 -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/{formbuilder/objectform/layer/heatmapLayerForm.d.ts → features/layers/forms/layer/geoTiffLayerForm.d.ts} +1 -1
  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/hillshadeLayerForm.js +4 -4
  40. package/lib/{formbuilder/objectform → features/layers/forms}/layer/index.d.ts +1 -2
  41. package/lib/{formbuilder/objectform → features/layers/forms}/layer/index.js +1 -2
  42. package/lib/{formbuilder/objectform → features/layers/forms}/layer/layerform.d.ts +1 -1
  43. package/lib/{formbuilder/objectform → features/layers/forms}/layer/layerform.js +4 -4
  44. package/lib/features/layers/forms/layer/storySegmentLayerForm.js +150 -0
  45. package/lib/{formbuilder/objectform → features/layers/forms}/layer/vectorlayerform.js +4 -4
  46. package/lib/{formbuilder/objectform → features/layers/forms}/source/geojsonsource.js +5 -5
  47. package/lib/features/layers/forms/source/geopackagesource.d.ts +3 -0
  48. package/lib/features/layers/forms/source/geopackagesource.js +93 -0
  49. package/lib/{formbuilder/objectform → features/layers/forms}/source/geotiffsource.js +5 -5
  50. package/lib/{formbuilder/objectform → features/layers/forms}/source/index.d.ts +1 -0
  51. package/lib/{formbuilder/objectform → features/layers/forms}/source/index.js +1 -0
  52. package/lib/{formbuilder/objectform → features/layers/forms}/source/pathbasedsource.js +5 -5
  53. package/lib/{formbuilder/objectform → features/layers/forms}/source/sourceform.d.ts +1 -1
  54. package/lib/{formbuilder/objectform → features/layers/forms}/source/sourceform.js +4 -4
  55. package/lib/{formbuilder/objectform → features/layers/forms}/source/tilesourceform.js +4 -4
  56. package/lib/{formbuilder/objectform → features/layers/forms}/source/wmsTileSource.d.ts +1 -1
  57. package/lib/{formbuilder/objectform → features/layers/forms}/source/wmsTileSource.js +6 -6
  58. package/lib/{dialogs → features/layers}/layerCreationFormDialog.d.ts +1 -1
  59. package/lib/{dialogs → features/layers}/layerCreationFormDialog.js +1 -1
  60. package/lib/features/layers/symbology/Grammar.d.ts +11 -0
  61. package/lib/features/layers/symbology/Grammar.js +316 -0
  62. package/lib/{dialogs → features/layers}/symbology/classificationModes.d.ts +6 -6
  63. package/lib/{dialogs → features/layers}/symbology/classificationModes.js +48 -44
  64. package/lib/{dialogs → features/layers}/symbology/colorRampUtils.d.ts +1 -0
  65. package/lib/{dialogs → features/layers}/symbology/colorRampUtils.js +12 -1
  66. package/lib/features/layers/symbology/components/MappingRow.d.ts +40 -0
  67. package/lib/features/layers/symbology/components/MappingRow.js +520 -0
  68. package/lib/features/layers/symbology/components/NumericInput.d.ts +20 -0
  69. package/lib/features/layers/symbology/components/NumericInput.js +44 -0
  70. package/lib/features/layers/symbology/components/ScaleEditor.d.ts +33 -0
  71. package/lib/features/layers/symbology/components/ScaleEditor.js +221 -0
  72. package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampControls.d.ts +1 -1
  73. package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampControls.js +4 -3
  74. package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampSelector.d.ts +2 -1
  75. package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampSelector.js +6 -1
  76. package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ModeSelectRow.d.ts +1 -1
  77. package/lib/{dialogs → features/layers}/symbology/components/color_ramp/RgbaColorPicker.js +39 -9
  78. package/lib/{dialogs → features/layers}/symbology/components/color_stops/StopContainer.js +1 -1
  79. package/lib/{dialogs → features/layers}/symbology/components/color_stops/StopRow.d.ts +1 -1
  80. package/lib/{dialogs → features/layers}/symbology/components/color_stops/StopRow.js +14 -2
  81. package/lib/features/layers/symbology/grammarToOLLayer.d.ts +27 -0
  82. package/lib/features/layers/symbology/grammarToOLLayer.js +145 -0
  83. package/lib/features/layers/symbology/grammarToOLStyle.d.ts +32 -0
  84. package/lib/features/layers/symbology/grammarToOLStyle.js +487 -0
  85. package/lib/{dialogs → features/layers}/symbology/hooks/useGetBandInfo.d.ts +1 -1
  86. package/lib/{dialogs → features/layers}/symbology/hooks/useGetBandInfo.js +1 -1
  87. package/lib/{dialogs → features/layers}/symbology/hooks/useGetProperties.js +1 -1
  88. package/lib/{dialogs → features/layers}/symbology/hooks/useGetSymbology.js +4 -2
  89. package/lib/features/layers/symbology/styleBuilder.d.ts +24 -0
  90. package/lib/features/layers/symbology/styleBuilder.js +158 -0
  91. package/lib/{dialogs → features/layers}/symbology/symbologyDialog.d.ts +1 -1
  92. package/lib/{dialogs → features/layers}/symbology/symbologyDialog.js +11 -13
  93. package/lib/{dialogs → features/layers}/symbology/symbologyUtils.d.ts +18 -10
  94. package/lib/{dialogs → features/layers}/symbology/symbologyUtils.js +0 -84
  95. package/lib/{panelview/objectproperties.d.ts → features/objectproperties/index.d.ts} +1 -1
  96. package/lib/{panelview/objectproperties.js → features/objectproperties/index.js} +5 -10
  97. package/lib/{dialogs → features/processing}/ProcessingFormDialog.d.ts +1 -1
  98. package/lib/{dialogs → features/processing}/ProcessingFormDialog.js +28 -14
  99. package/lib/features/processing/forms/MapExtentToggle.d.ts +13 -0
  100. package/lib/features/processing/forms/MapExtentToggle.js +20 -0
  101. package/lib/features/processing/forms/clipRasterByExtentForm.d.ts +10 -0
  102. package/lib/features/processing/forms/clipRasterByExtentForm.js +99 -0
  103. package/lib/{formbuilder/objectform/process → features/processing/forms}/dissolveProcessForm.js +5 -5
  104. package/lib/{formbuilder/objectform → features/processing/forms}/processingForm.d.ts +1 -1
  105. package/lib/{formbuilder/objectform → features/processing/forms}/processingForm.js +6 -6
  106. package/lib/features/processing/forms/rasterizeForm.d.ts +10 -0
  107. package/lib/features/processing/forms/rasterizeForm.js +75 -0
  108. package/lib/features/processing/forms/useMapExtent.d.ts +22 -0
  109. package/lib/features/processing/forms/useMapExtent.js +57 -0
  110. package/lib/{processing → features/processing}/index.d.ts +19 -2
  111. package/lib/features/processing/index.js +1246 -0
  112. package/lib/{processing → features/processing}/processingCommands.d.ts +1 -1
  113. package/lib/features/processing/processingCommands.js +168 -0
  114. package/lib/features/processing/serverProcessing.d.ts +51 -0
  115. package/lib/features/processing/serverProcessing.js +99 -0
  116. package/lib/{stacBrowser → features/stac-browser}/components/StacPanel.js +2 -2
  117. package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/QueryableComboBox.js +5 -5
  118. package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/QueryableRow.js +1 -1
  119. package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/StacFilterExtensionPanel.js +2 -2
  120. package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/StacQueryableFilters.js +1 -1
  121. package/lib/{stacBrowser → features/stac-browser}/components/geodes/StacFilterSection.js +3 -3
  122. package/lib/{stacBrowser → features/stac-browser}/components/shared/StacPanelResults.js +3 -3
  123. package/lib/{stacBrowser → features/stac-browser}/components/shared/StacSpatialExtent.js +1 -1
  124. package/lib/{stacBrowser → features/stac-browser}/components/shared/StacTemporalExtent.js +1 -1
  125. package/lib/{stacBrowser → features/stac-browser}/context/StacResultsContext.js +2 -2
  126. package/lib/{stacBrowser → features/stac-browser}/hooks/useGeodesSearch.js +2 -2
  127. package/lib/{stacBrowser → features/stac-browser}/hooks/useStacFilterExtension.js +3 -3
  128. package/lib/{stacBrowser → features/stac-browser}/hooks/useStacSearch.js +1 -1
  129. package/lib/features/stac-browser/types/types.js +1 -0
  130. package/lib/{panelview/story-maps → features/story}/SpectaPanel.d.ts +4 -1
  131. package/lib/{panelview/story-maps → features/story}/SpectaPanel.js +3 -4
  132. package/lib/{panelview/story-maps → features/story}/StoryEditorPanel.js +1 -1
  133. package/lib/{panelview/story-maps → features/story}/StoryViewerPanel.d.ts +12 -11
  134. package/lib/features/story/StoryViewerPanel.js +64 -0
  135. package/lib/features/story/__tests__/fixtures/listStoryTestItems.d.ts +9 -0
  136. package/lib/features/story/__tests__/fixtures/listStoryTestItems.js +21 -0
  137. package/lib/features/story/components/ListStoryMapOverlayPanel.d.ts +10 -0
  138. package/lib/features/story/components/ListStoryMapOverlayPanel.js +11 -0
  139. package/lib/features/story/components/ListStoryMarkdownMeasurePane.d.ts +11 -0
  140. package/lib/features/story/components/ListStoryMarkdownMeasurePane.js +55 -0
  141. package/lib/features/story/components/ListStoryOverlayMarkdown.d.ts +15 -0
  142. package/lib/features/story/components/ListStoryOverlayMarkdown.js +93 -0
  143. package/lib/features/story/components/ListStoryStageOverlay.d.ts +11 -0
  144. package/lib/features/story/components/ListStoryStageOverlay.js +150 -0
  145. package/lib/features/story/components/ListStoryTitleBar.d.ts +7 -0
  146. package/lib/features/story/components/ListStoryTitleBar.js +20 -0
  147. package/lib/features/story/components/ListStoryTitleBarDesktop.d.ts +2 -0
  148. package/lib/features/story/components/ListStoryTitleBarDesktop.js +55 -0
  149. package/lib/features/story/components/ListStoryTitleBarMobile.d.ts +2 -0
  150. package/lib/features/story/components/ListStoryTitleBarMobile.js +41 -0
  151. package/lib/features/story/components/ListStoryVirtualScrollTrack.d.ts +6 -0
  152. package/lib/features/story/components/ListStoryVirtualScrollTrack.js +7 -0
  153. package/lib/{panelview/story-maps → features/story}/components/SpectaDesktopView.d.ts +4 -2
  154. package/lib/features/story/components/SpectaDesktopView.js +67 -0
  155. package/lib/features/story/components/SpectaMobileListModeContent.d.ts +13 -0
  156. package/lib/features/story/components/SpectaMobileListModeContent.js +36 -0
  157. package/lib/features/story/components/SpectaMobileSingleModeContent.d.ts +14 -0
  158. package/lib/{panelview/story-maps/components/SpectaMobileView.js → features/story/components/SpectaMobileSingleModeContent.js} +4 -6
  159. package/lib/{panelview/story-maps → features/story}/components/SpectaMobileView.d.ts +5 -3
  160. package/lib/features/story/components/SpectaMobileView.js +12 -0
  161. package/lib/features/story/components/SpectaSingleModeContent.d.ts +18 -0
  162. package/lib/features/story/components/SpectaSingleModeContent.js +8 -0
  163. package/lib/features/story/context/ListStoryScrollTrackContext.d.ts +19 -0
  164. package/lib/features/story/context/ListStoryScrollTrackContext.js +186 -0
  165. package/lib/features/story/hooks/useCurrentSegmentIndex.d.ts +3 -0
  166. package/lib/features/story/hooks/useCurrentSegmentIndex.js +17 -0
  167. package/lib/features/story/hooks/useListStoryScroll.d.ts +15 -0
  168. package/lib/features/story/hooks/useListStoryScroll.js +107 -0
  169. package/lib/features/story/hooks/useQueuedMarkdownHeightMeasure.d.ts +19 -0
  170. package/lib/features/story/hooks/useQueuedMarkdownHeightMeasure.js +56 -0
  171. package/lib/features/story/hooks/useStoryImagePreload.d.ts +1 -0
  172. package/lib/features/story/hooks/useStoryImagePreload.js +24 -0
  173. package/lib/{panelview/story-maps → features/story}/hooks/useStoryMap.d.ts +2 -7
  174. package/lib/{panelview/story-maps → features/story}/hooks/useStoryMap.js +21 -60
  175. package/lib/features/story/hooks/useStoryScrollState.d.ts +21 -0
  176. package/lib/features/story/hooks/useStoryScrollState.js +39 -0
  177. package/lib/features/story/hooks/useStorySegmentSync.d.ts +8 -0
  178. package/lib/features/story/hooks/useStorySegmentSync.js +51 -0
  179. package/lib/features/story/types/types.d.ts +43 -0
  180. package/lib/features/story/types/types.js +1 -0
  181. package/lib/features/story/utils/computeListStoryScrollState.d.ts +14 -0
  182. package/lib/features/story/utils/computeListStoryScrollState.js +79 -0
  183. package/lib/features/story/utils/listStoryMeasureQueue.d.ts +11 -0
  184. package/lib/features/story/utils/listStoryMeasureQueue.js +14 -0
  185. package/lib/features/story/utils/listStoryScrollTrack.d.ts +17 -0
  186. package/lib/features/story/utils/listStoryScrollTrack.js +72 -0
  187. package/lib/features/story/utils/spectaPresentation.d.ts +9 -0
  188. package/lib/features/story/utils/spectaPresentation.js +37 -0
  189. package/lib/features/story/utils/storySegmentViewItems.d.ts +5 -0
  190. package/lib/features/story/utils/storySegmentViewItems.js +30 -0
  191. package/lib/index.d.ts +11 -9
  192. package/lib/index.js +11 -9
  193. package/lib/keybindings.json +5 -0
  194. package/lib/mainview/OpenEOTileLayer.d.ts +49 -0
  195. package/lib/mainview/OpenEOTileLayer.js +179 -0
  196. package/lib/mainview/TemporalSlider.js +11 -9
  197. package/lib/mainview/components/MainViewMapSurface.d.ts +15 -0
  198. package/lib/mainview/components/MainViewMapSurface.js +13 -0
  199. package/lib/mainview/components/MainViewOverlayLayer.d.ts +9 -0
  200. package/lib/mainview/components/MainViewOverlayLayer.js +11 -0
  201. package/lib/mainview/components/MainViewSidePanels.d.ts +17 -0
  202. package/lib/mainview/components/MainViewSidePanels.js +10 -0
  203. package/lib/mainview/components/MainViewSpectaPanel.d.ts +17 -0
  204. package/lib/mainview/components/MainViewSpectaPanel.js +8 -0
  205. package/lib/mainview/components/MainViewStoryStage.d.ts +13 -0
  206. package/lib/mainview/components/MainViewStoryStage.js +17 -0
  207. package/lib/mainview/components/PositionedFloater.d.ts +10 -0
  208. package/lib/mainview/components/PositionedFloater.js +7 -0
  209. package/lib/mainview/geoJsonFeaturePatch.d.ts +9 -0
  210. package/lib/mainview/geoJsonFeaturePatch.js +43 -0
  211. package/lib/mainview/mainView.d.ts +93 -14
  212. package/lib/mainview/mainView.js +1216 -686
  213. package/lib/mainview/mainviewwidget.d.ts +5 -1
  214. package/lib/mainview/mainviewwidget.js +4 -2
  215. package/lib/shared/components/Button.d.ts +1 -1
  216. package/lib/shared/components/DropdownMenu.d.ts +1 -0
  217. package/lib/shared/components/DropdownMenu.js +3 -2
  218. package/lib/shared/components/NativeSelect.d.ts +8 -0
  219. package/lib/shared/components/NativeSelect.js +29 -0
  220. package/lib/shared/components/Tabs.d.ts +3 -3
  221. package/lib/shared/components/Tabs.js +5 -5
  222. package/lib/{formbuilder → shared/formbuilder}/creationform.js +71 -4
  223. package/lib/{formbuilder → shared/formbuilder}/editform.js +1 -1
  224. package/lib/{formbuilder → shared/formbuilder}/formselectors.d.ts +2 -2
  225. package/lib/{formbuilder → shared/formbuilder}/formselectors.js +10 -7
  226. package/lib/shared/formbuilder/index.d.ts +4 -0
  227. package/lib/shared/formbuilder/index.js +4 -0
  228. package/lib/{formbuilder → shared/formbuilder}/objectform/SchemaForm.d.ts +1 -1
  229. package/lib/{formbuilder → shared/formbuilder}/objectform/StoryEditorForm.d.ts +1 -1
  230. package/lib/{formbuilder → shared/formbuilder}/objectform/StoryEditorForm.js +1 -1
  231. package/lib/{formbuilder → shared/formbuilder}/objectform/components/LayerSelect.js +1 -1
  232. package/lib/{formbuilder → shared/formbuilder}/objectform/components/SegmentFormSymbology.js +4 -4
  233. package/lib/{formbuilder → shared/formbuilder}/objectform/components/SourcePropertiesField.js +1 -1
  234. package/lib/{formbuilder → shared/formbuilder}/objectform/components/StorySegmentReset.js +1 -1
  235. package/lib/{formbuilder → shared/formbuilder}/objectform/components/WmsTileSourceUrlInput.js +4 -4
  236. package/lib/{formbuilder → shared/formbuilder}/objectform/fileselectorwidget.js +8 -1
  237. package/lib/{formbuilder → shared/formbuilder}/objectform/schemaUtils.d.ts +3 -1
  238. package/lib/{formbuilder → shared/formbuilder}/objectform/schemaUtils.js +11 -0
  239. package/lib/{formbuilder → shared/formbuilder}/objectform/useSchemaFormState.d.ts +1 -1
  240. package/lib/{formbuilder → shared/formbuilder}/objectform/useSchemaFormState.js +1 -1
  241. package/lib/{icons.d.ts → shared/icons.d.ts} +2 -0
  242. package/lib/{icons.js → shared/icons.js} +28 -18
  243. package/lib/tools.d.ts +2 -0
  244. package/lib/tools.js +138 -4
  245. package/lib/types.d.ts +6 -1
  246. package/lib/types.js +6 -2
  247. package/lib/{menus.js → workspace/menus.js} +10 -2
  248. package/lib/workspace/panels/components/TabbedPanel.d.ts +17 -0
  249. package/lib/workspace/panels/components/TabbedPanel.js +19 -0
  250. package/lib/{panelview → workspace/panels}/components/layers.js +63 -18
  251. package/lib/workspace/panels/components/legendItem.js +680 -0
  252. package/lib/workspace/panels/hooks/useLayerTree.d.ts +19 -0
  253. package/lib/workspace/panels/hooks/useLayerTree.js +103 -0
  254. package/lib/workspace/panels/hooks/useRightPanelOptions.d.ts +27 -0
  255. package/lib/workspace/panels/hooks/useRightPanelOptions.js +72 -0
  256. package/lib/workspace/panels/hooks/useUIState.d.ts +2 -0
  257. package/lib/workspace/panels/hooks/useUIState.js +25 -0
  258. package/lib/{panelview → workspace/panels}/index.d.ts +1 -1
  259. package/lib/{panelview → workspace/panels}/index.js +1 -1
  260. package/lib/{panelview → workspace/panels}/leftpanel.d.ts +1 -1
  261. package/lib/workspace/panels/leftpanel.js +70 -0
  262. package/lib/{panelview/rightpanel.d.ts → workspace/panels/mergedpanel.d.ts} +6 -5
  263. package/lib/workspace/panels/mergedpanel.js +166 -0
  264. package/lib/workspace/panels/rightpanel.d.ts +25 -0
  265. package/lib/{panelview → workspace/panels}/rightpanel.js +53 -63
  266. package/lib/{statusbar → workspace/statusbar}/StatusBar.js +5 -4
  267. package/lib/{toolbar → workspace/toolbar}/widget.d.ts +2 -0
  268. package/lib/{toolbar → workspace/toolbar}/widget.js +33 -5
  269. package/lib/{widget.d.ts → workspace/widget.d.ts} +7 -5
  270. package/lib/{widget.js → workspace/widget.js} +16 -7
  271. package/package.json +16 -4
  272. package/style/base.css +124 -2
  273. package/style/icons/geopackage.svg +95 -0
  274. package/style/icons/pencil_solid.svg +7 -0
  275. package/style/identify.css +95 -0
  276. package/style/layerBrowser.css +29 -1
  277. package/style/leftPanel.css +25 -0
  278. package/style/shared/button.css +12 -0
  279. package/style/shared/dropdownMenu.css +9 -0
  280. package/style/shared/nativeSelect.css +75 -0
  281. package/style/shared/tabs.css +1 -1
  282. package/style/spectaProgressBar.css +0 -1
  283. package/style/storyPanel.css +330 -9
  284. package/style/storySpectaArticleOverlay.css +129 -0
  285. package/style/symbologyDialog.css +522 -27
  286. package/lib/dialogs/symbology/tiff_layer/TiffRendering.d.ts +0 -4
  287. package/lib/dialogs/symbology/tiff_layer/TiffRendering.js +0 -42
  288. package/lib/dialogs/symbology/tiff_layer/components/BandRow.d.ts +0 -23
  289. package/lib/dialogs/symbology/tiff_layer/components/BandRow.js +0 -59
  290. package/lib/dialogs/symbology/tiff_layer/types/MultibandColor.d.ts +0 -4
  291. package/lib/dialogs/symbology/tiff_layer/types/MultibandColor.js +0 -92
  292. package/lib/dialogs/symbology/tiff_layer/types/SingleBandPseudoColor.d.ts +0 -5
  293. package/lib/dialogs/symbology/tiff_layer/types/SingleBandPseudoColor.js +0 -313
  294. package/lib/dialogs/symbology/vector_layer/VectorRendering.d.ts +0 -4
  295. package/lib/dialogs/symbology/vector_layer/VectorRendering.js +0 -112
  296. package/lib/dialogs/symbology/vector_layer/components/ValueSelect.d.ts +0 -8
  297. package/lib/dialogs/symbology/vector_layer/components/ValueSelect.js +0 -9
  298. package/lib/dialogs/symbology/vector_layer/types/Canonical.d.ts +0 -4
  299. package/lib/dialogs/symbology/vector_layer/types/Canonical.js +0 -130
  300. package/lib/dialogs/symbology/vector_layer/types/Categorized.d.ts +0 -4
  301. package/lib/dialogs/symbology/vector_layer/types/Categorized.js +0 -243
  302. package/lib/dialogs/symbology/vector_layer/types/Graduated.d.ts +0 -4
  303. package/lib/dialogs/symbology/vector_layer/types/Graduated.js +0 -362
  304. package/lib/dialogs/symbology/vector_layer/types/Heatmap.d.ts +0 -4
  305. package/lib/dialogs/symbology/vector_layer/types/Heatmap.js +0 -89
  306. package/lib/dialogs/symbology/vector_layer/types/SimpleSymbol.d.ts +0 -4
  307. package/lib/dialogs/symbology/vector_layer/types/SimpleSymbol.js +0 -120
  308. package/lib/formbuilder/index.d.ts +0 -4
  309. package/lib/formbuilder/index.js +0 -4
  310. package/lib/formbuilder/objectform/layer/heatmapLayerForm.js +0 -96
  311. package/lib/formbuilder/objectform/layer/storySegmentLayerForm.js +0 -95
  312. package/lib/formbuilder/objectform/layer/webGlLayerForm.d.ts +0 -3
  313. package/lib/formbuilder/objectform/process/index.d.ts +0 -1
  314. package/lib/formbuilder/objectform/process/index.js +0 -1
  315. package/lib/panelview/components/legendItem.js +0 -210
  316. package/lib/panelview/identify-panel/IdentifyPanel.js +0 -102
  317. package/lib/panelview/leftpanel.js +0 -139
  318. package/lib/panelview/story-maps/StoryViewerPanel.js +0 -116
  319. package/lib/panelview/story-maps/components/SpectaDesktopView.js +0 -49
  320. package/lib/processing/index.js +0 -200
  321. package/lib/processing/processingCommands.js +0 -67
  322. /package/lib/{panelview/annotationPanel.d.ts → features/annotations/AnnotationsPanel.d.ts} +0 -0
  323. /package/lib/{annotations → features/annotations}/components/Annotation.d.ts +0 -0
  324. /package/lib/{annotations → features/annotations}/components/Annotation.js +0 -0
  325. /package/lib/{annotations → features/annotations}/components/AnnotationFloater.d.ts +0 -0
  326. /package/lib/{annotations → features/annotations}/components/AnnotationFloater.js +0 -0
  327. /package/lib/{annotations → features/annotations}/components/Message.d.ts +0 -0
  328. /package/lib/{annotations → features/annotations}/components/Message.js +0 -0
  329. /package/lib/{annotations → features/annotations}/model.d.ts +0 -0
  330. /package/lib/{annotations → features/annotations}/model.js +0 -0
  331. /package/lib/{console → features/console}/consoleview.d.ts +0 -0
  332. /package/lib/{console → features/console}/index.d.ts +0 -0
  333. /package/lib/{console → features/console}/index.js +0 -0
  334. /package/lib/{panelview/filter-panel → features/filter}/Filter.d.ts +0 -0
  335. /package/lib/{stacBrowser/types/types.js → features/identify/types/editorTypes.js} +0 -0
  336. /package/lib/{dialogs/layerBrowserDialog.d.ts → features/layer-browser/index.d.ts} +0 -0
  337. /package/lib/{formbuilder/objectform → features/layers/forms}/layer/hillshadeLayerForm.d.ts +0 -0
  338. /package/lib/{formbuilder/objectform → features/layers/forms}/layer/storySegmentLayerForm.d.ts +0 -0
  339. /package/lib/{formbuilder/objectform → features/layers/forms}/layer/vectorlayerform.d.ts +0 -0
  340. /package/lib/{formbuilder/objectform → features/layers/forms}/source/geojsonsource.d.ts +0 -0
  341. /package/lib/{formbuilder/objectform → features/layers/forms}/source/geotiffsource.d.ts +0 -0
  342. /package/lib/{formbuilder/objectform → features/layers/forms}/source/pathbasedsource.d.ts +0 -0
  343. /package/lib/{formbuilder/objectform → features/layers/forms}/source/tilesourceform.d.ts +0 -0
  344. /package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampSelectorEntry.d.ts +0 -0
  345. /package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampSelectorEntry.js +0 -0
  346. /package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ModeSelectRow.js +0 -0
  347. /package/lib/{dialogs → features/layers}/symbology/components/color_ramp/RgbaColorPicker.d.ts +0 -0
  348. /package/lib/{dialogs → features/layers}/symbology/components/color_ramp/cmocean.json +0 -0
  349. /package/lib/{dialogs → features/layers}/symbology/components/color_stops/StopContainer.d.ts +0 -0
  350. /package/lib/{dialogs → features/layers}/symbology/hooks/useEffectiveSymbologyParams.d.ts +0 -0
  351. /package/lib/{dialogs → features/layers}/symbology/hooks/useEffectiveSymbologyParams.js +0 -0
  352. /package/lib/{dialogs → features/layers}/symbology/hooks/useGetProperties.d.ts +0 -0
  353. /package/lib/{dialogs → features/layers}/symbology/hooks/useGetSymbology.d.ts +0 -0
  354. /package/lib/{dialogs → features/layers}/symbology/hooks/useOkSignal.d.ts +0 -0
  355. /package/lib/{dialogs → features/layers}/symbology/hooks/useOkSignal.js +0 -0
  356. /package/lib/{formbuilder/objectform/process → features/processing/forms}/dissolveProcessForm.d.ts +0 -0
  357. /package/lib/{processing → features/processing}/processingFormToParam.d.ts +0 -0
  358. /package/lib/{processing → features/processing}/processingFormToParam.js +0 -0
  359. /package/lib/{stacBrowser → features/stac-browser}/components/StacPanel.d.ts +0 -0
  360. /package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/QueryableComboBox.d.ts +0 -0
  361. /package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/QueryableRow.d.ts +0 -0
  362. /package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/StacFilterExtensionPanel.d.ts +0 -0
  363. /package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/StacQueryableFilters.d.ts +0 -0
  364. /package/lib/{stacBrowser → features/stac-browser}/components/geodes/StacFilterSection.d.ts +0 -0
  365. /package/lib/{stacBrowser → features/stac-browser}/components/geodes/StacGeodesFilterPanel.d.ts +0 -0
  366. /package/lib/{stacBrowser → features/stac-browser}/components/geodes/StacGeodesFilterPanel.js +0 -0
  367. /package/lib/{stacBrowser → features/stac-browser}/components/shared/StacPanelResults.d.ts +0 -0
  368. /package/lib/{stacBrowser → features/stac-browser}/components/shared/StacSpatialExtent.d.ts +0 -0
  369. /package/lib/{stacBrowser → features/stac-browser}/components/shared/StacTemporalExtent.d.ts +0 -0
  370. /package/lib/{stacBrowser → features/stac-browser}/constants.d.ts +0 -0
  371. /package/lib/{stacBrowser → features/stac-browser}/constants.js +0 -0
  372. /package/lib/{stacBrowser → features/stac-browser}/context/StacResultsContext.d.ts +0 -0
  373. /package/lib/{stacBrowser → features/stac-browser}/hooks/useGeodesSearch.d.ts +0 -0
  374. /package/lib/{stacBrowser → features/stac-browser}/hooks/useStacFilterExtension.d.ts +0 -0
  375. /package/lib/{stacBrowser → features/stac-browser}/hooks/useStacSearch.d.ts +0 -0
  376. /package/lib/{stacBrowser → features/stac-browser}/index.d.ts +0 -0
  377. /package/lib/{stacBrowser → features/stac-browser}/index.js +0 -0
  378. /package/lib/{stacBrowser → features/stac-browser}/types/types.d.ts +0 -0
  379. /package/lib/{panelview/story-maps → features/story}/StoryEditorPanel.d.ts +0 -0
  380. /package/lib/{panelview/story-maps → features/story}/components/PreviewModeSwitch.d.ts +0 -0
  381. /package/lib/{panelview/story-maps → features/story}/components/PreviewModeSwitch.js +0 -0
  382. /package/lib/{panelview/story-maps → features/story}/components/StoryContentSection.d.ts +0 -0
  383. /package/lib/{panelview/story-maps → features/story}/components/StoryContentSection.js +0 -0
  384. /package/lib/{panelview/story-maps → features/story}/components/StoryImageSection.d.ts +0 -0
  385. /package/lib/{panelview/story-maps → features/story}/components/StoryImageSection.js +0 -0
  386. /package/lib/{panelview/story-maps → features/story}/components/StoryNavBar.d.ts +0 -0
  387. /package/lib/{panelview/story-maps → features/story}/components/StoryNavBar.js +0 -0
  388. /package/lib/{panelview/story-maps → features/story}/components/StorySubtitleSection.d.ts +0 -0
  389. /package/lib/{panelview/story-maps → features/story}/components/StorySubtitleSection.js +0 -0
  390. /package/lib/{panelview/story-maps → features/story}/components/StoryTitleSection.d.ts +0 -0
  391. /package/lib/{panelview/story-maps → features/story}/components/StoryTitleSection.js +0 -0
  392. /package/lib/{formbuilder → shared/formbuilder}/creationform.d.ts +0 -0
  393. /package/lib/{formbuilder → shared/formbuilder}/editform.d.ts +0 -0
  394. /package/lib/{formbuilder → shared/formbuilder}/objectform/SchemaForm.js +0 -0
  395. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/LayerSelect.d.ts +0 -0
  396. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/OpacitySlider.d.ts +0 -0
  397. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/OpacitySlider.js +0 -0
  398. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/SegmentFormSymbology.d.ts +0 -0
  399. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/SourcePropertiesField.d.ts +0 -0
  400. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/StorySegmentReset.d.ts +0 -0
  401. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/WmsTileSourceUrlInput.d.ts +0 -0
  402. /package/lib/{formbuilder → shared/formbuilder}/objectform/fileselectorwidget.d.ts +0 -0
  403. /package/lib/{store.d.ts → shared/store.d.ts} +0 -0
  404. /package/lib/{store.js → shared/store.js} +0 -0
  405. /package/lib/{menus.d.ts → workspace/menus.d.ts} +0 -0
  406. /package/lib/{panelview → workspace/panels}/components/layers.d.ts +0 -0
  407. /package/lib/{panelview → workspace/panels}/components/legendItem.d.ts +0 -0
  408. /package/lib/{panelview → workspace/panels}/header.d.ts +0 -0
  409. /package/lib/{panelview → workspace/panels}/header.js +0 -0
  410. /package/lib/{statusbar → workspace/statusbar}/SpectaPresentationProgressBar.d.ts +0 -0
  411. /package/lib/{statusbar → workspace/statusbar}/SpectaPresentationProgressBar.js +0 -0
  412. /package/lib/{statusbar → workspace/statusbar}/StatusBar.d.ts +0 -0
  413. /package/lib/{toolbar → workspace/toolbar}/index.d.ts +0 -0
  414. /package/lib/{toolbar → workspace/toolbar}/index.js +0 -0
@@ -0,0 +1,316 @@
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 { faArrowDown, faArrowUp, faGripVertical, 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, useRef, 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", variant: "ghost", 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, onMoveUp, onMoveDown, }) => {
64
+ var _a, _b, _c, _d;
65
+ const [addingLayerWhen, setAddingLayerWhen] = useState(false);
66
+ const dragIndexRef = useRef(null);
67
+ const dragOverRef = useRef(null);
68
+ const [dragOverIndex, setDragOverIndex] = useState(null);
69
+ const moveRow = useCallback((fromIndex, toIndex) => {
70
+ if (fromIndex === toIndex) {
71
+ return;
72
+ }
73
+ const next = [...layer.rows];
74
+ const [moved] = next.splice(fromIndex, 1);
75
+ next.splice(toIndex, 0, moved);
76
+ onChange(Object.assign(Object.assign({}, layer), { rows: next }));
77
+ }, [layer, onChange]);
78
+ const addLayerPredicate = useCallback((pred) => {
79
+ var _a;
80
+ onChange(Object.assign(Object.assign({}, layer), { when: [...((_a = layer.when) !== null && _a !== void 0 ? _a : []), pred] }));
81
+ setAddingLayerWhen(false);
82
+ }, [layer, onChange]);
83
+ const removeLayerPredicate = useCallback((index) => {
84
+ var _a;
85
+ const next = ((_a = layer.when) !== null && _a !== void 0 ? _a : []).filter((_, i) => i !== index);
86
+ onChange(Object.assign(Object.assign({}, layer), { when: next.length > 0 ? next : undefined }));
87
+ }, [layer, onChange]);
88
+ const addTransform = useCallback(() => {
89
+ if (layer.transforms.length > 0) {
90
+ return;
91
+ }
92
+ onChange(Object.assign(Object.assign({}, layer), { transforms: [defaultTransform('kde')] }));
93
+ }, [layer, onChange]);
94
+ const updateTransform = useCallback((t) => {
95
+ onChange(Object.assign(Object.assign({}, layer), { transforms: [t] }));
96
+ }, [layer, onChange]);
97
+ const removeTransform = useCallback(() => {
98
+ onChange(Object.assign(Object.assign({}, layer), { transforms: [] }));
99
+ }, [layer, onChange]);
100
+ const updateRow = useCallback((index, row) => {
101
+ const next = [...layer.rows];
102
+ next[index] = row;
103
+ onChange(Object.assign(Object.assign({}, layer), { rows: next }));
104
+ }, [layer, onChange]);
105
+ const removeRow = useCallback((index) => {
106
+ onChange(Object.assign(Object.assign({}, layer), { rows: layer.rows.filter((_, i) => i !== index) }));
107
+ }, [layer, onChange]);
108
+ const hasKDE = layer.transforms.some(t => t.type === 'kde');
109
+ const isRaster = isRasterLayer || hasKDE;
110
+ const addRow = useCallback(() => {
111
+ const defaultChannels = isRaster
112
+ ? ['pixel-color']
113
+ : DEFAULT_CHANNELS;
114
+ onChange(Object.assign(Object.assign({}, layer), { rows: [
115
+ ...layer.rows,
116
+ {
117
+ id: UUID.uuid4(),
118
+ scale: { scheme: 'constant_rgba', params: { value: DEFAULT_RGBA } },
119
+ channels: [...defaultChannels],
120
+ },
121
+ ] }));
122
+ }, [layer, onChange, isRaster]);
123
+ // KDE layers expose '$density'; raster layers expose $band-N fields.
124
+ // Both cases suppress the raw feature attribute list.
125
+ const encodingFields = hasKDE ? ['$density'] : availableFields;
126
+ return (React.createElement("div", { className: "jp-gis-grammar-layer-section" },
127
+ React.createElement("div", { className: "jp-gis-grammar-layer-header" },
128
+ React.createElement("span", { className: "jp-gis-grammar-layer-label" },
129
+ "Layer ",
130
+ layerIndex + 1),
131
+ layer.transforms.length === 0 && (React.createElement(Button, { type: "button", variant: "ghost", onClick: addTransform, title: "Add transform" },
132
+ React.createElement(FontAwesomeIcon, { "data-icon": "inline-start", icon: faPlus }),
133
+ "Transform")),
134
+ totalLayers > 1 && onMoveUp && (React.createElement(Button, { type: "button", variant: "ghost", style: { height: 32, width: 32 }, onClick: onMoveUp, title: "Move layer up" },
135
+ React.createElement(FontAwesomeIcon, { icon: faArrowUp }))),
136
+ totalLayers > 1 && onMoveDown && (React.createElement(Button, { type: "button", variant: "ghost", style: { height: 32, width: 32 }, onClick: onMoveDown, title: "Move layer down" },
137
+ React.createElement(FontAwesomeIcon, { icon: faArrowDown }))),
138
+ totalLayers > 1 && (React.createElement(Button, { type: "button", variant: "ghost", style: { height: 32, width: 32 }, onClick: onDelete, title: "Remove layer" },
139
+ React.createElement(FontAwesomeIcon, { icon: faTrash })))),
140
+ React.createElement("div", { className: "jp-gis-grammar-when-row" },
141
+ React.createElement("span", { className: "jp-gis-grammar-when-label" }, "when"),
142
+ ((_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: () => {
143
+ var _a;
144
+ return onChange(Object.assign(Object.assign({}, layer), { whenOp: ((_a = layer.whenOp) !== null && _a !== void 0 ? _a : 'all') === 'all' ? 'any' : 'all' }));
145
+ } }, (_c = layer.whenOp) !== null && _c !== void 0 ? _c : 'all')), (_d = layer.when) === null || _d === void 0 ? void 0 :
146
+ _d.map((pred, i) => (React.createElement("span", { key: i, className: "jp-gis-grammar-when-chip" },
147
+ formatPredicate(pred),
148
+ React.createElement(Button, { type: "button", onClick: () => removeLayerPredicate(i), title: "Remove condition" },
149
+ React.createElement(FontAwesomeIcon, { icon: faXmark }))))),
150
+ 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) },
151
+ React.createElement(FontAwesomeIcon, { icon: faPlus })))),
152
+ layer.transforms[0] && (React.createElement(TransformRow, { transform: layer.transforms[0], availableFields: availableFields, onChange: updateTransform, onDelete: removeTransform })),
153
+ React.createElement("div", { className: "jp-gis-grammar-rules-container", onDragOver: e => {
154
+ e.preventDefault();
155
+ // Find which wrapper the cursor is closest to
156
+ const wrappers = Array.from(e.currentTarget.querySelectorAll(':scope > .jp-gis-grammar-drag-wrapper'));
157
+ let idx = layer.rows.length;
158
+ for (let j = 0; j < wrappers.length; j++) {
159
+ const rect = wrappers[j].getBoundingClientRect();
160
+ const midY = rect.top + rect.height / 2;
161
+ if (e.clientY < midY) {
162
+ idx = j;
163
+ break;
164
+ }
165
+ }
166
+ dragOverRef.current = idx;
167
+ setDragOverIndex(idx);
168
+ }, onDrop: () => {
169
+ const over = dragOverRef.current;
170
+ if (dragIndexRef.current !== null && over !== null) {
171
+ const to = over > dragIndexRef.current ? over - 1 : over;
172
+ moveRow(dragIndexRef.current, to);
173
+ }
174
+ dragIndexRef.current = null;
175
+ dragOverRef.current = null;
176
+ setDragOverIndex(null);
177
+ }, onDragEnd: () => {
178
+ dragIndexRef.current = null;
179
+ dragOverRef.current = null;
180
+ setDragOverIndex(null);
181
+ } }, layer.rows.map((row, i) => (React.createElement("div", { key: row.id, className: "jp-gis-grammar-drag-wrapper", style: {
182
+ borderTop: dragOverIndex === i && dragIndexRef.current !== i
183
+ ? '2px solid var(--jp-brand-color1)'
184
+ : '2px solid transparent',
185
+ borderBottom: dragOverIndex === layer.rows.length &&
186
+ i === layer.rows.length - 1 &&
187
+ dragIndexRef.current !== i
188
+ ? '2px solid var(--jp-brand-color1)'
189
+ : '2px solid transparent',
190
+ } },
191
+ layer.rows.length > 1 && (React.createElement("div", { className: "jp-gis-grammar-reorder-bar" },
192
+ React.createElement(Button, { type: "button", disabled: i === 0, onClick: () => moveRow(i, i - 1), title: "Move up" },
193
+ React.createElement(FontAwesomeIcon, { icon: faArrowUp })),
194
+ React.createElement("div", { className: "jp-gis-grammar-drag-handle", draggable: true, onDragStart: e => {
195
+ dragIndexRef.current = i;
196
+ const wrapper = e.currentTarget.closest('.jp-gis-grammar-drag-wrapper');
197
+ if (wrapper) {
198
+ e.dataTransfer.setDragImage(wrapper, 0, 0);
199
+ }
200
+ }, title: "Drag to reorder" },
201
+ React.createElement(FontAwesomeIcon, { icon: faGripVertical })),
202
+ React.createElement(Button, { type: "button", disabled: i === layer.rows.length - 1, onClick: () => moveRow(i, i + 1), title: "Move down" },
203
+ React.createElement(FontAwesomeIcon, { icon: faArrowDown })))),
204
+ React.createElement(MappingRow, { row: row, availableFields: encodingFields, featureValues: featureValues, isRaster: isRaster, onChange: updated => updateRow(i, updated), onDelete: () => removeRow(i) }))))),
205
+ React.createElement("div", { className: "jp-gis-symbology-button-container" },
206
+ React.createElement(Button, { variant: "ghost", style: { margin: '0 0 0.5rem 1rem' }, onClick: addRow },
207
+ React.createElement(FontAwesomeIcon, { icon: faPlus }),
208
+ "Add Mapping"))));
209
+ };
210
+ // ---------------------------------------------------------------------------
211
+ // Grammar panel
212
+ // ---------------------------------------------------------------------------
213
+ const Grammar = ({ model, okSignalPromise, layerId, isStorySegmentOverride, segmentId, }) => {
214
+ const layer = layerId !== undefined ? model.getLayer(layerId) : null;
215
+ const isRasterLayer = (layer === null || layer === void 0 ? void 0 : layer.type) === 'GeoTiffLayer';
216
+ const { featureProperties: selectableAttributesAndValues } = useGetProperties({ layerId, model });
217
+ // For raster layers, expose $band-N pseudo-fields derived from band metadata.
218
+ const { bandRows } = useGetBandInfo(model, layer);
219
+ const params = useEffectiveSymbologyParams({
220
+ model,
221
+ layerId,
222
+ layer,
223
+ isStorySegmentOverride,
224
+ segmentId,
225
+ });
226
+ const [layers, setLayers] = useState([
227
+ { id: UUID.uuid4(), transforms: [], rows: [] },
228
+ ]);
229
+ useEffect(() => {
230
+ if (!(params === null || params === void 0 ? void 0 : params.symbologyState)) {
231
+ return;
232
+ }
233
+ const rawState = params.symbologyState;
234
+ if (!Array.isArray(rawState.layers) ||
235
+ !rawState.layers.length) {
236
+ setLayers([{ id: UUID.uuid4(), transforms: [], rows: [] }]);
237
+ return;
238
+ }
239
+ const state = rawState;
240
+ setLayers(state.layers.map(grammarLayer => {
241
+ var _a, _b;
242
+ 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) => {
243
+ var _a;
244
+ return (Object.assign(Object.assign({
245
+ // Preserve the rule's stable id so React keys and story-segment
246
+ // override merging stay consistent across dialog opens.
247
+ // When a rule has multiple mappings, suffix with the mapping index.
248
+ 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 } : {})));
249
+ })) }));
250
+ }));
251
+ }, [params]);
252
+ const handleOk = () => {
253
+ if (!layerId || !(layer === null || layer === void 0 ? void 0 : layer.parameters)) {
254
+ return;
255
+ }
256
+ const grammarLayers = layers.map(uiLayer => {
257
+ var _a;
258
+ const rules = uiLayer.rows
259
+ .filter(row => row.channels.length > 0)
260
+ .map(row => {
261
+ var _a, _b;
262
+ 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: [
263
+ {
264
+ scale: row.scale,
265
+ channels: row.channels,
266
+ },
267
+ ] }));
268
+ });
269
+ return Object.assign(Object.assign(Object.assign(Object.assign({ id: uiLayer.id }, (uiLayer.transforms.length
270
+ ? { preprocess: uiLayer.transforms }
271
+ : {})), (((_a = uiLayer.when) === null || _a === void 0 ? void 0 : _a.length) ? { when: uiLayer.when } : {})), (uiLayer.whenOp ? { whenOp: uiLayer.whenOp } : {})), { rules });
272
+ });
273
+ const symbologyState = {
274
+ layers: grammarLayers,
275
+ };
276
+ saveSymbology({
277
+ model,
278
+ layerId,
279
+ isStorySegmentOverride,
280
+ segmentId,
281
+ payload: { symbologyState },
282
+ mutateLayerBeforeSave: targetLayer => {
283
+ var _a;
284
+ if (((_a = targetLayer.parameters) === null || _a === void 0 ? void 0 : _a.color) !== undefined) {
285
+ delete targetLayer.parameters.color;
286
+ }
287
+ },
288
+ });
289
+ };
290
+ useOkSignal(okSignalPromise, handleOk);
291
+ const addLayer = () => {
292
+ setLayers(prev => [
293
+ ...prev,
294
+ { id: UUID.uuid4(), transforms: [], rows: [] },
295
+ ]);
296
+ };
297
+ const moveLayer = useCallback((from, to) => {
298
+ if (from === to) {
299
+ return;
300
+ }
301
+ setLayers(prev => {
302
+ const next = [...prev];
303
+ const [moved] = next.splice(from, 1);
304
+ next.splice(to, 0, moved);
305
+ return next;
306
+ });
307
+ }, [setLayers]);
308
+ const availableFields = isRasterLayer
309
+ ? bandRows.map(b => `$band-${b.band}`)
310
+ : Object.keys(selectableAttributesAndValues);
311
+ return (React.createElement("div", { className: "jp-gis-layer-symbology-container" },
312
+ 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)), onMoveUp: i > 0 ? () => moveLayer(i, i - 1) : undefined, onMoveDown: i < layers.length - 1 ? () => moveLayer(i, i + 1) : undefined }))),
313
+ React.createElement("div", { className: "jp-gis-symbology-button-container" },
314
+ React.createElement(Button, { className: "jp-gis-grammar-action-btn", onClick: addLayer }, "Add Layer"))));
315
+ };
316
+ export default Grammar;
@@ -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;