@jupytergis/base 0.14.1 → 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 (397) hide show
  1. package/lib/commands/BaseCommandIDs.d.ts +6 -0
  2. package/lib/commands/BaseCommandIDs.js +6 -0
  3. package/lib/commands/index.js +245 -55
  4. package/lib/commands/operationCommands.js +2 -2
  5. package/lib/constants.js +6 -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 +2 -0
  52. package/lib/{formbuilder/objectform → features/layers/forms}/source/index.js +2 -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/features/layers/forms/source/wmsTileSource.d.ts +4 -0
  58. package/lib/features/layers/forms/source/wmsTileSource.js +78 -0
  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 +57 -57
  67. package/lib/features/layers/symbology/colorRampUtils.d.ts +65 -0
  68. package/lib/features/layers/symbology/colorRampUtils.js +242 -0
  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 +12 -15
  79. package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampSelectorEntry.d.ts +2 -2
  80. package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampSelectorEntry.js +3 -11
  81. package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ModeSelectRow.d.ts +1 -1
  82. package/lib/features/layers/symbology/components/color_ramp/RgbaColorPicker.d.ts +13 -0
  83. package/lib/features/layers/symbology/components/color_ramp/RgbaColorPicker.js +128 -0
  84. package/lib/{dialogs → features/layers}/symbology/components/color_stops/StopContainer.js +3 -1
  85. package/lib/{dialogs → features/layers}/symbology/components/color_stops/StopRow.d.ts +2 -2
  86. package/lib/{dialogs → features/layers}/symbology/components/color_stops/StopRow.js +12 -7
  87. package/lib/features/layers/symbology/grammarToOLLayer.d.ts +27 -0
  88. package/lib/features/layers/symbology/grammarToOLLayer.js +145 -0
  89. package/lib/features/layers/symbology/grammarToOLStyle.d.ts +32 -0
  90. package/lib/features/layers/symbology/grammarToOLStyle.js +467 -0
  91. package/lib/{dialogs → features/layers}/symbology/hooks/useGetBandInfo.d.ts +1 -1
  92. package/lib/{dialogs → features/layers}/symbology/hooks/useGetBandInfo.js +1 -1
  93. package/lib/{dialogs → features/layers}/symbology/hooks/useGetProperties.js +1 -1
  94. package/lib/{dialogs → features/layers}/symbology/hooks/useGetSymbology.js +4 -2
  95. package/lib/features/layers/symbology/styleBuilder.d.ts +21 -0
  96. package/lib/features/layers/symbology/styleBuilder.js +145 -0
  97. package/lib/{dialogs → features/layers}/symbology/symbologyDialog.d.ts +3 -2
  98. package/lib/{dialogs → features/layers}/symbology/symbologyDialog.js +12 -12
  99. package/lib/features/layers/symbology/symbologyUtils.d.ts +41 -0
  100. package/lib/features/layers/symbology/symbologyUtils.js +114 -0
  101. package/lib/{panelview/objectproperties.d.ts → features/objectproperties/index.d.ts} +1 -1
  102. package/lib/{panelview/objectproperties.js → features/objectproperties/index.js} +5 -10
  103. package/lib/{dialogs → features/processing}/ProcessingFormDialog.d.ts +1 -1
  104. package/lib/{dialogs → features/processing}/ProcessingFormDialog.js +28 -14
  105. package/lib/features/processing/forms/MapExtentToggle.d.ts +13 -0
  106. package/lib/features/processing/forms/MapExtentToggle.js +20 -0
  107. package/lib/features/processing/forms/clipRasterByExtentForm.d.ts +10 -0
  108. package/lib/features/processing/forms/clipRasterByExtentForm.js +99 -0
  109. package/lib/{formbuilder/objectform/process → features/processing/forms}/dissolveProcessForm.js +5 -5
  110. package/lib/{formbuilder/objectform → features/processing/forms}/processingForm.d.ts +1 -1
  111. package/lib/{formbuilder/objectform → features/processing/forms}/processingForm.js +6 -6
  112. package/lib/features/processing/forms/rasterizeForm.d.ts +10 -0
  113. package/lib/features/processing/forms/rasterizeForm.js +75 -0
  114. package/lib/features/processing/forms/useMapExtent.d.ts +22 -0
  115. package/lib/features/processing/forms/useMapExtent.js +57 -0
  116. package/lib/{processing → features/processing}/index.d.ts +19 -2
  117. package/lib/features/processing/index.js +1246 -0
  118. package/lib/{processing → features/processing}/processingCommands.d.ts +1 -1
  119. package/lib/features/processing/processingCommands.js +168 -0
  120. package/lib/features/processing/serverProcessing.d.ts +51 -0
  121. package/lib/features/processing/serverProcessing.js +99 -0
  122. package/lib/{stacBrowser → features/stac-browser}/components/StacPanel.js +2 -2
  123. package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/QueryableComboBox.js +64 -21
  124. package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/QueryableRow.js +1 -1
  125. package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/StacFilterExtensionPanel.js +2 -2
  126. package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/StacQueryableFilters.js +1 -1
  127. package/lib/{stacBrowser → features/stac-browser}/components/geodes/StacFilterSection.js +3 -3
  128. package/lib/{stacBrowser → features/stac-browser}/components/shared/StacPanelResults.js +3 -3
  129. package/lib/{stacBrowser → features/stac-browser}/components/shared/StacSpatialExtent.js +1 -1
  130. package/lib/{stacBrowser → features/stac-browser}/components/shared/StacTemporalExtent.js +1 -1
  131. package/lib/{stacBrowser → features/stac-browser}/context/StacResultsContext.js +2 -2
  132. package/lib/{stacBrowser → features/stac-browser}/hooks/useGeodesSearch.js +2 -2
  133. package/lib/{stacBrowser → features/stac-browser}/hooks/useStacFilterExtension.d.ts +1 -1
  134. package/lib/{stacBrowser → features/stac-browser}/hooks/useStacFilterExtension.js +198 -114
  135. package/lib/{stacBrowser → features/stac-browser}/hooks/useStacSearch.d.ts +1 -0
  136. package/lib/{stacBrowser → features/stac-browser}/hooks/useStacSearch.js +19 -11
  137. package/lib/features/stac-browser/types/types.js +1 -0
  138. package/lib/{panelview/story-maps → features/story}/SpectaPanel.d.ts +4 -1
  139. package/lib/{panelview/story-maps → features/story}/SpectaPanel.js +3 -4
  140. package/lib/{panelview/story-maps → features/story}/StoryEditorPanel.js +1 -1
  141. package/lib/{panelview/story-maps → features/story}/StoryViewerPanel.d.ts +12 -11
  142. package/lib/features/story/StoryViewerPanel.js +64 -0
  143. package/lib/features/story/__tests__/fixtures/listStoryTestItems.d.ts +9 -0
  144. package/lib/features/story/__tests__/fixtures/listStoryTestItems.js +21 -0
  145. package/lib/features/story/components/ListStoryMapOverlayPanel.d.ts +10 -0
  146. package/lib/features/story/components/ListStoryMapOverlayPanel.js +11 -0
  147. package/lib/features/story/components/ListStoryMarkdownMeasurePane.d.ts +11 -0
  148. package/lib/features/story/components/ListStoryMarkdownMeasurePane.js +55 -0
  149. package/lib/features/story/components/ListStoryOverlayMarkdown.d.ts +15 -0
  150. package/lib/features/story/components/ListStoryOverlayMarkdown.js +93 -0
  151. package/lib/features/story/components/ListStoryStageOverlay.d.ts +12 -0
  152. package/lib/features/story/components/ListStoryStageOverlay.js +132 -0
  153. package/lib/features/story/components/ListStoryVirtualScrollTrack.d.ts +6 -0
  154. package/lib/features/story/components/ListStoryVirtualScrollTrack.js +7 -0
  155. package/lib/{panelview/story-maps → features/story}/components/SpectaDesktopView.d.ts +4 -2
  156. package/lib/features/story/components/SpectaDesktopView.js +67 -0
  157. package/lib/{panelview/story-maps → features/story}/components/SpectaMobileView.d.ts +2 -4
  158. package/lib/{panelview/story-maps → features/story}/components/SpectaMobileView.js +3 -3
  159. package/lib/features/story/components/SpectaSingleModeContent.d.ts +18 -0
  160. package/lib/features/story/components/SpectaSingleModeContent.js +8 -0
  161. package/lib/features/story/context/ListStoryScrollTrackContext.d.ts +15 -0
  162. package/lib/features/story/context/ListStoryScrollTrackContext.js +142 -0
  163. package/lib/features/story/hooks/useCurrentSegmentIndex.d.ts +3 -0
  164. package/lib/features/story/hooks/useCurrentSegmentIndex.js +17 -0
  165. package/lib/features/story/hooks/useListStoryScroll.d.ts +15 -0
  166. package/lib/features/story/hooks/useListStoryScroll.js +107 -0
  167. package/lib/features/story/hooks/useQueuedMarkdownHeightMeasure.d.ts +19 -0
  168. package/lib/features/story/hooks/useQueuedMarkdownHeightMeasure.js +56 -0
  169. package/lib/features/story/hooks/useStoryImagePreload.d.ts +1 -0
  170. package/lib/features/story/hooks/useStoryImagePreload.js +24 -0
  171. package/lib/{panelview/story-maps → features/story}/hooks/useStoryMap.d.ts +2 -7
  172. package/lib/{panelview/story-maps → features/story}/hooks/useStoryMap.js +20 -44
  173. package/lib/features/story/hooks/useStoryScrollState.d.ts +21 -0
  174. package/lib/features/story/hooks/useStoryScrollState.js +39 -0
  175. package/lib/features/story/hooks/useStorySegmentSync.d.ts +8 -0
  176. package/lib/features/story/hooks/useStorySegmentSync.js +51 -0
  177. package/lib/features/story/types/types.d.ts +38 -0
  178. package/lib/features/story/types/types.js +1 -0
  179. package/lib/features/story/utils/computeListStoryScrollState.d.ts +12 -0
  180. package/lib/features/story/utils/computeListStoryScrollState.js +70 -0
  181. package/lib/features/story/utils/listStoryMeasureQueue.d.ts +11 -0
  182. package/lib/features/story/utils/listStoryMeasureQueue.js +14 -0
  183. package/lib/features/story/utils/listStoryScrollTrack.d.ts +17 -0
  184. package/lib/features/story/utils/listStoryScrollTrack.js +72 -0
  185. package/lib/features/story/utils/spectaPresentation.d.ts +9 -0
  186. package/lib/features/story/utils/spectaPresentation.js +37 -0
  187. package/lib/features/story/utils/storySegmentViewItems.d.ts +5 -0
  188. package/lib/features/story/utils/storySegmentViewItems.js +30 -0
  189. package/lib/index.d.ts +11 -9
  190. package/lib/index.js +11 -9
  191. package/lib/keybindings.json +5 -0
  192. package/lib/mainview/OpenEOTileLayer.d.ts +49 -0
  193. package/lib/mainview/OpenEOTileLayer.js +179 -0
  194. package/lib/mainview/TemporalSlider.js +11 -9
  195. package/lib/mainview/geoJsonFeaturePatch.d.ts +9 -0
  196. package/lib/mainview/geoJsonFeaturePatch.js +43 -0
  197. package/lib/mainview/mainView.d.ts +93 -8
  198. package/lib/mainview/mainView.js +1286 -529
  199. package/lib/mainview/mainviewwidget.d.ts +5 -1
  200. package/lib/mainview/mainviewwidget.js +4 -2
  201. package/lib/shared/components/Button.d.ts +1 -1
  202. package/lib/shared/components/DropdownMenu.d.ts +1 -0
  203. package/lib/shared/components/DropdownMenu.js +3 -2
  204. package/lib/shared/components/NativeSelect.d.ts +8 -0
  205. package/lib/shared/components/NativeSelect.js +29 -0
  206. package/lib/shared/components/Tabs.d.ts +3 -3
  207. package/lib/shared/components/Tabs.js +5 -5
  208. package/lib/{formbuilder → shared/formbuilder}/creationform.js +71 -4
  209. package/lib/{formbuilder → shared/formbuilder}/editform.js +1 -1
  210. package/lib/{formbuilder → shared/formbuilder}/formselectors.d.ts +2 -2
  211. package/lib/{formbuilder → shared/formbuilder}/formselectors.js +13 -4
  212. package/lib/shared/formbuilder/index.d.ts +4 -0
  213. package/lib/shared/formbuilder/index.js +4 -0
  214. package/lib/{formbuilder → shared/formbuilder}/objectform/SchemaForm.d.ts +1 -1
  215. package/lib/{formbuilder → shared/formbuilder}/objectform/StoryEditorForm.d.ts +1 -1
  216. package/lib/{formbuilder → shared/formbuilder}/objectform/StoryEditorForm.js +1 -1
  217. package/lib/{formbuilder → shared/formbuilder}/objectform/components/LayerSelect.js +1 -1
  218. package/lib/{formbuilder → shared/formbuilder}/objectform/components/SegmentFormSymbology.js +4 -4
  219. package/lib/{formbuilder → shared/formbuilder}/objectform/components/SourcePropertiesField.js +1 -1
  220. package/lib/{formbuilder → shared/formbuilder}/objectform/components/StorySegmentReset.js +1 -1
  221. package/lib/shared/formbuilder/objectform/components/WmsTileSourceUrlInput.d.ts +3 -0
  222. package/lib/shared/formbuilder/objectform/components/WmsTileSourceUrlInput.js +84 -0
  223. package/lib/{formbuilder → shared/formbuilder}/objectform/fileselectorwidget.js +8 -1
  224. package/lib/{formbuilder → shared/formbuilder}/objectform/schemaUtils.d.ts +3 -1
  225. package/lib/{formbuilder → shared/formbuilder}/objectform/schemaUtils.js +11 -0
  226. package/lib/{formbuilder → shared/formbuilder}/objectform/useSchemaFormState.d.ts +2 -2
  227. package/lib/{formbuilder → shared/formbuilder}/objectform/useSchemaFormState.js +1 -1
  228. package/lib/{icons.d.ts → shared/icons.d.ts} +2 -0
  229. package/lib/{icons.js → shared/icons.js} +28 -18
  230. package/lib/tools.d.ts +3 -1
  231. package/lib/tools.js +140 -6
  232. package/lib/types.d.ts +12 -1
  233. package/lib/types.js +6 -1
  234. package/lib/{menus.js → workspace/menus.js} +14 -2
  235. package/lib/workspace/panels/components/TabbedPanel.d.ts +17 -0
  236. package/lib/workspace/panels/components/TabbedPanel.js +19 -0
  237. package/lib/{panelview → workspace/panels}/components/layers.js +82 -20
  238. package/lib/workspace/panels/components/legendItem.js +680 -0
  239. package/lib/workspace/panels/hooks/useLayerTree.d.ts +19 -0
  240. package/lib/workspace/panels/hooks/useLayerTree.js +103 -0
  241. package/lib/workspace/panels/hooks/useRightPanelOptions.d.ts +27 -0
  242. package/lib/workspace/panels/hooks/useRightPanelOptions.js +72 -0
  243. package/lib/workspace/panels/hooks/useUIState.d.ts +2 -0
  244. package/lib/workspace/panels/hooks/useUIState.js +25 -0
  245. package/lib/{panelview → workspace/panels}/index.d.ts +1 -1
  246. package/lib/{panelview → workspace/panels}/index.js +1 -1
  247. package/lib/{panelview → workspace/panels}/leftpanel.d.ts +1 -1
  248. package/lib/workspace/panels/leftpanel.js +70 -0
  249. package/lib/{panelview/rightpanel.d.ts → workspace/panels/mergedpanel.d.ts} +6 -5
  250. package/lib/workspace/panels/mergedpanel.js +166 -0
  251. package/lib/workspace/panels/rightpanel.d.ts +25 -0
  252. package/lib/{panelview → workspace/panels}/rightpanel.js +53 -63
  253. package/lib/{statusbar → workspace/statusbar}/StatusBar.js +5 -4
  254. package/lib/{toolbar → workspace/toolbar}/widget.d.ts +2 -0
  255. package/lib/{toolbar → workspace/toolbar}/widget.js +33 -5
  256. package/lib/{widget.d.ts → workspace/widget.d.ts} +7 -5
  257. package/lib/{widget.js → workspace/widget.js} +16 -7
  258. package/package.json +19 -4
  259. package/style/base.css +109 -1
  260. package/style/icons/geopackage.svg +95 -0
  261. package/style/icons/pencil_solid.svg +7 -0
  262. package/style/identify.css +95 -0
  263. package/style/layerBrowser.css +28 -0
  264. package/style/leftPanel.css +25 -0
  265. package/style/shared/button.css +12 -0
  266. package/style/shared/dropdownMenu.css +9 -0
  267. package/style/shared/nativeSelect.css +75 -0
  268. package/style/shared/tabs.css +3 -3
  269. package/style/spectaProgressBar.css +0 -1
  270. package/style/storyPanel.css +142 -9
  271. package/style/storySpectaArticleOverlay.css +129 -0
  272. package/style/symbologyDialog.css +330 -28
  273. package/lib/dialogs/symbology/colorRampUtils.d.ts +0 -20
  274. package/lib/dialogs/symbology/colorRampUtils.js +0 -132
  275. package/lib/dialogs/symbology/symbologyUtils.d.ts +0 -33
  276. package/lib/dialogs/symbology/symbologyUtils.js +0 -180
  277. package/lib/dialogs/symbology/tiff_layer/TiffRendering.d.ts +0 -4
  278. package/lib/dialogs/symbology/tiff_layer/TiffRendering.js +0 -42
  279. package/lib/dialogs/symbology/tiff_layer/components/BandRow.d.ts +0 -23
  280. package/lib/dialogs/symbology/tiff_layer/components/BandRow.js +0 -59
  281. package/lib/dialogs/symbology/tiff_layer/types/MultibandColor.d.ts +0 -4
  282. package/lib/dialogs/symbology/tiff_layer/types/MultibandColor.js +0 -92
  283. package/lib/dialogs/symbology/tiff_layer/types/SingleBandPseudoColor.d.ts +0 -5
  284. package/lib/dialogs/symbology/tiff_layer/types/SingleBandPseudoColor.js +0 -301
  285. package/lib/dialogs/symbology/vector_layer/VectorRendering.d.ts +0 -4
  286. package/lib/dialogs/symbology/vector_layer/VectorRendering.js +0 -112
  287. package/lib/dialogs/symbology/vector_layer/components/ValueSelect.d.ts +0 -8
  288. package/lib/dialogs/symbology/vector_layer/components/ValueSelect.js +0 -9
  289. package/lib/dialogs/symbology/vector_layer/types/Canonical.d.ts +0 -4
  290. package/lib/dialogs/symbology/vector_layer/types/Canonical.js +0 -65
  291. package/lib/dialogs/symbology/vector_layer/types/Categorized.d.ts +0 -4
  292. package/lib/dialogs/symbology/vector_layer/types/Categorized.js +0 -196
  293. package/lib/dialogs/symbology/vector_layer/types/Graduated.d.ts +0 -4
  294. package/lib/dialogs/symbology/vector_layer/types/Graduated.js +0 -250
  295. package/lib/dialogs/symbology/vector_layer/types/SimpleSymbol.d.ts +0 -4
  296. package/lib/dialogs/symbology/vector_layer/types/SimpleSymbol.js +0 -105
  297. package/lib/formbuilder/index.d.ts +0 -4
  298. package/lib/formbuilder/index.js +0 -4
  299. package/lib/formbuilder/objectform/layer/storySegmentLayerForm.js +0 -95
  300. package/lib/formbuilder/objectform/layer/webGlLayerForm.d.ts +0 -3
  301. package/lib/formbuilder/objectform/process/index.d.ts +0 -1
  302. package/lib/formbuilder/objectform/process/index.js +0 -1
  303. package/lib/panelview/components/legendItem.js +0 -200
  304. package/lib/panelview/identify-panel/IdentifyPanel.js +0 -102
  305. package/lib/panelview/leftpanel.js +0 -139
  306. package/lib/panelview/story-maps/StoryViewerPanel.js +0 -116
  307. package/lib/panelview/story-maps/components/SpectaDesktopView.js +0 -49
  308. package/lib/processing/index.js +0 -200
  309. package/lib/processing/processingCommands.js +0 -67
  310. /package/lib/{panelview/annotationPanel.d.ts → features/annotations/AnnotationsPanel.d.ts} +0 -0
  311. /package/lib/{annotations → features/annotations}/components/Annotation.d.ts +0 -0
  312. /package/lib/{annotations → features/annotations}/components/Annotation.js +0 -0
  313. /package/lib/{annotations → features/annotations}/components/AnnotationFloater.d.ts +0 -0
  314. /package/lib/{annotations → features/annotations}/components/AnnotationFloater.js +0 -0
  315. /package/lib/{annotations → features/annotations}/components/Message.d.ts +0 -0
  316. /package/lib/{annotations → features/annotations}/components/Message.js +0 -0
  317. /package/lib/{annotations → features/annotations}/model.d.ts +0 -0
  318. /package/lib/{annotations → features/annotations}/model.js +0 -0
  319. /package/lib/{console → features/console}/consoleview.d.ts +0 -0
  320. /package/lib/{console → features/console}/index.d.ts +0 -0
  321. /package/lib/{console → features/console}/index.js +0 -0
  322. /package/lib/{panelview/filter-panel → features/filter}/Filter.d.ts +0 -0
  323. /package/lib/{stacBrowser/types/types.js → features/identify/types/editorTypes.js} +0 -0
  324. /package/lib/{dialogs/layerBrowserDialog.d.ts → features/layer-browser/index.d.ts} +0 -0
  325. /package/lib/{formbuilder/objectform → features/layers/forms}/layer/heatmapLayerForm.d.ts +0 -0
  326. /package/lib/{formbuilder/objectform → features/layers/forms}/layer/hillshadeLayerForm.d.ts +0 -0
  327. /package/lib/{formbuilder/objectform → features/layers/forms}/layer/storySegmentLayerForm.d.ts +0 -0
  328. /package/lib/{formbuilder/objectform → features/layers/forms}/layer/vectorlayerform.d.ts +0 -0
  329. /package/lib/{formbuilder/objectform → features/layers/forms}/source/geojsonsource.d.ts +0 -0
  330. /package/lib/{formbuilder/objectform → features/layers/forms}/source/geotiffsource.d.ts +0 -0
  331. /package/lib/{formbuilder/objectform → features/layers/forms}/source/pathbasedsource.d.ts +0 -0
  332. /package/lib/{formbuilder/objectform → features/layers/forms}/source/tilesourceform.d.ts +0 -0
  333. /package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ModeSelectRow.js +0 -0
  334. /package/lib/{dialogs → features/layers}/symbology/components/color_ramp/cmocean.json +0 -0
  335. /package/lib/{dialogs → features/layers}/symbology/components/color_stops/StopContainer.d.ts +0 -0
  336. /package/lib/{dialogs → features/layers}/symbology/hooks/useEffectiveSymbologyParams.d.ts +0 -0
  337. /package/lib/{dialogs → features/layers}/symbology/hooks/useEffectiveSymbologyParams.js +0 -0
  338. /package/lib/{dialogs → features/layers}/symbology/hooks/useGetProperties.d.ts +0 -0
  339. /package/lib/{dialogs → features/layers}/symbology/hooks/useGetSymbology.d.ts +0 -0
  340. /package/lib/{dialogs → features/layers}/symbology/hooks/useOkSignal.d.ts +0 -0
  341. /package/lib/{dialogs → features/layers}/symbology/hooks/useOkSignal.js +0 -0
  342. /package/lib/{formbuilder/objectform/process → features/processing/forms}/dissolveProcessForm.d.ts +0 -0
  343. /package/lib/{processing → features/processing}/processingFormToParam.d.ts +0 -0
  344. /package/lib/{processing → features/processing}/processingFormToParam.js +0 -0
  345. /package/lib/{stacBrowser → features/stac-browser}/components/StacPanel.d.ts +0 -0
  346. /package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/QueryableComboBox.d.ts +0 -0
  347. /package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/QueryableRow.d.ts +0 -0
  348. /package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/StacFilterExtensionPanel.d.ts +0 -0
  349. /package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/StacQueryableFilters.d.ts +0 -0
  350. /package/lib/{stacBrowser → features/stac-browser}/components/geodes/StacFilterSection.d.ts +0 -0
  351. /package/lib/{stacBrowser → features/stac-browser}/components/geodes/StacGeodesFilterPanel.d.ts +0 -0
  352. /package/lib/{stacBrowser → features/stac-browser}/components/geodes/StacGeodesFilterPanel.js +0 -0
  353. /package/lib/{stacBrowser → features/stac-browser}/components/shared/StacPanelResults.d.ts +0 -0
  354. /package/lib/{stacBrowser → features/stac-browser}/components/shared/StacSpatialExtent.d.ts +0 -0
  355. /package/lib/{stacBrowser → features/stac-browser}/components/shared/StacTemporalExtent.d.ts +0 -0
  356. /package/lib/{stacBrowser → features/stac-browser}/constants.d.ts +0 -0
  357. /package/lib/{stacBrowser → features/stac-browser}/constants.js +0 -0
  358. /package/lib/{stacBrowser → features/stac-browser}/context/StacResultsContext.d.ts +0 -0
  359. /package/lib/{stacBrowser → features/stac-browser}/hooks/useGeodesSearch.d.ts +0 -0
  360. /package/lib/{stacBrowser → features/stac-browser}/index.d.ts +0 -0
  361. /package/lib/{stacBrowser → features/stac-browser}/index.js +0 -0
  362. /package/lib/{stacBrowser → features/stac-browser}/types/types.d.ts +0 -0
  363. /package/lib/{panelview/story-maps → features/story}/StoryEditorPanel.d.ts +0 -0
  364. /package/lib/{panelview/story-maps → features/story}/components/PreviewModeSwitch.d.ts +0 -0
  365. /package/lib/{panelview/story-maps → features/story}/components/PreviewModeSwitch.js +0 -0
  366. /package/lib/{panelview/story-maps → features/story}/components/StoryContentSection.d.ts +0 -0
  367. /package/lib/{panelview/story-maps → features/story}/components/StoryContentSection.js +0 -0
  368. /package/lib/{panelview/story-maps → features/story}/components/StoryImageSection.d.ts +0 -0
  369. /package/lib/{panelview/story-maps → features/story}/components/StoryImageSection.js +0 -0
  370. /package/lib/{panelview/story-maps → features/story}/components/StoryNavBar.d.ts +0 -0
  371. /package/lib/{panelview/story-maps → features/story}/components/StoryNavBar.js +0 -0
  372. /package/lib/{panelview/story-maps → features/story}/components/StorySubtitleSection.d.ts +0 -0
  373. /package/lib/{panelview/story-maps → features/story}/components/StorySubtitleSection.js +0 -0
  374. /package/lib/{panelview/story-maps → features/story}/components/StoryTitleSection.d.ts +0 -0
  375. /package/lib/{panelview/story-maps → features/story}/components/StoryTitleSection.js +0 -0
  376. /package/lib/{formbuilder → shared/formbuilder}/creationform.d.ts +0 -0
  377. /package/lib/{formbuilder → shared/formbuilder}/editform.d.ts +0 -0
  378. /package/lib/{formbuilder → shared/formbuilder}/objectform/SchemaForm.js +0 -0
  379. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/LayerSelect.d.ts +0 -0
  380. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/OpacitySlider.d.ts +0 -0
  381. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/OpacitySlider.js +0 -0
  382. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/SegmentFormSymbology.d.ts +0 -0
  383. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/SourcePropertiesField.d.ts +0 -0
  384. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/StorySegmentReset.d.ts +0 -0
  385. /package/lib/{formbuilder → shared/formbuilder}/objectform/fileselectorwidget.d.ts +0 -0
  386. /package/lib/{store.d.ts → shared/store.d.ts} +0 -0
  387. /package/lib/{store.js → shared/store.js} +0 -0
  388. /package/lib/{menus.d.ts → workspace/menus.d.ts} +0 -0
  389. /package/lib/{panelview → workspace/panels}/components/layers.d.ts +0 -0
  390. /package/lib/{panelview → workspace/panels}/components/legendItem.d.ts +0 -0
  391. /package/lib/{panelview → workspace/panels}/header.d.ts +0 -0
  392. /package/lib/{panelview → workspace/panels}/header.js +0 -0
  393. /package/lib/{statusbar → workspace/statusbar}/SpectaPresentationProgressBar.d.ts +0 -0
  394. /package/lib/{statusbar → workspace/statusbar}/SpectaPresentationProgressBar.js +0 -0
  395. /package/lib/{statusbar → workspace/statusbar}/StatusBar.d.ts +0 -0
  396. /package/lib/{toolbar → workspace/toolbar}/index.d.ts +0 -0
  397. /package/lib/{toolbar → workspace/toolbar}/index.js +0 -0
@@ -0,0 +1,142 @@
1
+ import React, { createContext, useCallback, useContext, useLayoutEffect, useMemo, useRef, useState, } from 'react';
2
+ import { ListStoryMarkdownMeasurePane } from "../components/ListStoryMarkdownMeasurePane";
3
+ import { useCurrentSegmentIndex } from "../hooks/useCurrentSegmentIndex";
4
+ import { useQueuedMarkdownHeightMeasure } from "../hooks/useQueuedMarkdownHeightMeasure";
5
+ import { buildListStoryScrollTrack } from "../utils/listStoryScrollTrack";
6
+ import { buildStorySegmentViewItems, getListStoryMarkdownSegmentsFromItems, } from "../utils/storySegmentViewItems";
7
+ const ListStoryScrollTrackContext = createContext(null);
8
+ export function ListStoryScrollTrackProvider({ model, enabled, children, }) {
9
+ const [storyRevision, setStoryRevision] = useState(0);
10
+ const [heightsById, setHeightsById] = useState({});
11
+ const [viewportHeight, setViewportHeight] = useState(0);
12
+ const [mapViewportHeight, setMapViewportHeight] = useState(0);
13
+ const currentSegmentIndex = useCurrentSegmentIndex(model);
14
+ const scrollerRef = useRef(null);
15
+ useLayoutEffect(() => {
16
+ const bump = () => {
17
+ setStoryRevision(value => value + 1);
18
+ setHeightsById({});
19
+ };
20
+ model.sharedModel.storyMapsChanged.connect(bump);
21
+ model.sharedModel.layersChanged.connect(bump);
22
+ return () => {
23
+ model.sharedModel.storyMapsChanged.disconnect(bump);
24
+ model.sharedModel.layersChanged.disconnect(bump);
25
+ };
26
+ }, [model]);
27
+ const storyData = useMemo(() => {
28
+ var _a;
29
+ return (_a = model.getSelectedStory().story) !== null && _a !== void 0 ? _a : null;
30
+ }, [model, storyRevision]);
31
+ const items = useMemo(() => buildStorySegmentViewItems(model, storyData), [model, storyData]);
32
+ const markdownSegments = useMemo(() => getListStoryMarkdownSegmentsFromItems(items), [items]);
33
+ const mapViewportHeightOption = mapViewportHeight > 0 ? mapViewportHeight : undefined;
34
+ const buildScrollTrackLayout = useCallback((nextHeightsById) => buildListStoryScrollTrack({
35
+ items,
36
+ viewportHeight,
37
+ mapViewportHeight: mapViewportHeightOption,
38
+ heightsById: nextHeightsById,
39
+ }), [items, viewportHeight, mapViewportHeightOption]);
40
+ const bindScrollTrackElement = useCallback((element) => {
41
+ scrollerRef.current = element;
42
+ if (!element) {
43
+ setViewportHeight(0);
44
+ return;
45
+ }
46
+ setViewportHeight(element.clientHeight);
47
+ }, []);
48
+ const observeElementHeight = useCallback((element, update, options) => {
49
+ if (options === null || options === void 0 ? void 0 : options.callImmediately) {
50
+ update();
51
+ }
52
+ const ro = new ResizeObserver(update);
53
+ ro.observe(element);
54
+ return () => {
55
+ ro.disconnect();
56
+ };
57
+ }, []);
58
+ useLayoutEffect(() => {
59
+ const scroller = scrollerRef.current;
60
+ if (!scroller || !enabled) {
61
+ return;
62
+ }
63
+ const update = () => {
64
+ setViewportHeight(scroller.clientHeight);
65
+ };
66
+ return observeElementHeight(scroller, update);
67
+ }, [enabled, storyRevision, observeElementHeight]);
68
+ useLayoutEffect(() => {
69
+ if (!enabled) {
70
+ setMapViewportHeight(0);
71
+ return;
72
+ }
73
+ const container = document.querySelector('.jGIS-Mainview-Container');
74
+ if (!(container instanceof HTMLElement)) {
75
+ setMapViewportHeight(0);
76
+ return;
77
+ }
78
+ const update = () => {
79
+ setMapViewportHeight(container.clientHeight);
80
+ };
81
+ return observeElementHeight(container, update, { callImmediately: true });
82
+ }, [enabled, storyRevision, observeElementHeight]);
83
+ const handleMeasuredHeight = useCallback((segmentId, height) => {
84
+ const measuredHeightPx = Math.ceil(height);
85
+ setHeightsById(prev => {
86
+ if (prev[segmentId] === measuredHeightPx) {
87
+ return prev;
88
+ }
89
+ const scroller = scrollerRef.current;
90
+ const oldLayout = enabled && viewportHeight > 0
91
+ ? buildListStoryScrollTrack({
92
+ items,
93
+ viewportHeight,
94
+ mapViewportHeight: mapViewportHeight || undefined,
95
+ heightsById: prev,
96
+ })
97
+ : null;
98
+ const next = Object.assign(Object.assign({}, prev), { [segmentId]: measuredHeightPx });
99
+ if (scroller && oldLayout) {
100
+ const oldSegment = oldLayout.segments.find(s => s.id === segmentId);
101
+ if (oldSegment && !oldSegment.measured) {
102
+ const scrollCompensation = measuredHeightPx - oldSegment.height;
103
+ if (scrollCompensation !== 0 &&
104
+ scroller.scrollTop > oldSegment.start) {
105
+ requestAnimationFrame(() => {
106
+ scroller.scrollTop += scrollCompensation;
107
+ });
108
+ }
109
+ }
110
+ }
111
+ return next;
112
+ });
113
+ }, [enabled, items, mapViewportHeight, viewportHeight]);
114
+ const { segmentBeingMeasured, reportHeight, completeMeasure } = useQueuedMarkdownHeightMeasure({
115
+ enabled: enabled && viewportHeight > 0,
116
+ markdownSegments,
117
+ currentSegmentIndex,
118
+ heightsById,
119
+ onHeight: handleMeasuredHeight,
120
+ });
121
+ const scrollTrackLayout = useMemo(() => {
122
+ if (!enabled || !items.length || viewportHeight <= 0) {
123
+ return null;
124
+ }
125
+ return buildScrollTrackLayout(heightsById);
126
+ }, [enabled, items, viewportHeight, heightsById, buildScrollTrackLayout]);
127
+ const value = useMemo(() => ({
128
+ scrollTrackLayout,
129
+ bindScrollTrackElement,
130
+ }), [scrollTrackLayout, bindScrollTrackElement]);
131
+ return (React.createElement(ListStoryScrollTrackContext.Provider, { value: value },
132
+ children,
133
+ enabled && segmentBeingMeasured ? (React.createElement("div", { className: "jgis-story-markdown-measure-host", "aria-hidden": true },
134
+ React.createElement(ListStoryMarkdownMeasurePane, { key: segmentBeingMeasured.id, segmentId: segmentBeingMeasured.id, markdown: segmentBeingMeasured.markdown, onHeight: reportHeight, onMeasureComplete: completeMeasure }))) : null));
135
+ }
136
+ export function useListStoryScrollTrackContext() {
137
+ const value = useContext(ListStoryScrollTrackContext);
138
+ if (!value) {
139
+ throw new Error('useListStoryScrollTrackContext must be used within ListStoryScrollTrackProvider');
140
+ }
141
+ return value;
142
+ }
@@ -0,0 +1,3 @@
1
+ import type { IJupyterGISModel } from '@jupytergis/schema';
2
+ /** Subscribes to model's current story segment index for a single source of truth */
3
+ export declare function useCurrentSegmentIndex(model: IJupyterGISModel): number;
@@ -0,0 +1,17 @@
1
+ import { useEffect, useState } from 'react';
2
+ /** Subscribes to model's current story segment index for a single source of truth */
3
+ export function useCurrentSegmentIndex(model) {
4
+ const [currentIndex, setCurrentIndex] = useState(() => { var _a; return (_a = model.getCurrentSegmentIndex()) !== null && _a !== void 0 ? _a : 0; });
5
+ useEffect(() => {
6
+ var _a;
7
+ const handler = (_sender, index) => {
8
+ setCurrentIndex(Math.max(0, index !== null && index !== void 0 ? index : 0));
9
+ };
10
+ model.currentSegmentIndexChanged.connect(handler);
11
+ setCurrentIndex((_a = model.getCurrentSegmentIndex()) !== null && _a !== void 0 ? _a : 0);
12
+ return () => {
13
+ model.currentSegmentIndexChanged.disconnect(handler);
14
+ };
15
+ }, [model]);
16
+ return currentIndex;
17
+ }
@@ -0,0 +1,15 @@
1
+ import type { IJGISStoryMap } from '@jupytergis/schema';
2
+ import { RefObject } from 'react';
3
+ import type { IListStoryScrollTrackLayout, IStorySegmentViewItem, IListStorySegmentTransition } from "../types/types";
4
+ interface IUseListStoryScrollParams {
5
+ enabled: boolean;
6
+ scrollContainerRef: RefObject<HTMLDivElement | null>;
7
+ storyData: IJGISStoryMap | null;
8
+ scrollTrackLayout: IListStoryScrollTrackLayout | null;
9
+ items: IStorySegmentViewItem[];
10
+ currentIndex: number;
11
+ setIndex: (index: number) => void;
12
+ onSegmentTransitionChange?: (payload: IListStorySegmentTransition | null) => void;
13
+ }
14
+ export declare function useListStoryScroll({ enabled, scrollContainerRef, storyData, scrollTrackLayout, items, currentIndex, setIndex, onSegmentTransitionChange, }: IUseListStoryScrollParams): void;
15
+ export {};
@@ -0,0 +1,107 @@
1
+ import { useCallback, useEffect, useRef } from 'react';
2
+ import { computeListStoryScrollState, } from "../utils/computeListStoryScrollState";
3
+ function isSameSegmentTransition(prev, next) {
4
+ if (!prev || !next) {
5
+ return false;
6
+ }
7
+ return (next.progress === prev.progress &&
8
+ next.fromIndex === prev.fromIndex &&
9
+ next.toIndex === prev.toIndex &&
10
+ next.fromMode === prev.fromMode &&
11
+ next.toMode === prev.toMode);
12
+ }
13
+ export function useListStoryScroll({ enabled, scrollContainerRef, storyData, scrollTrackLayout, items, currentIndex, setIndex, onSegmentTransitionChange, }) {
14
+ const onSegmentTransitionChangeRef = useRef(onSegmentTransitionChange);
15
+ onSegmentTransitionChangeRef.current = onSegmentTransitionChange;
16
+ const setIndexRef = useRef(setIndex);
17
+ setIndexRef.current = setIndex;
18
+ const storyDataRef = useRef(storyData);
19
+ storyDataRef.current = storyData;
20
+ const scrollTrackLayoutRef = useRef(scrollTrackLayout);
21
+ scrollTrackLayoutRef.current = scrollTrackLayout;
22
+ const currentIndexRef = useRef(currentIndex);
23
+ currentIndexRef.current = currentIndex;
24
+ const latchedRef = useRef({
25
+ activeIndex: currentIndex,
26
+ segmentTransition: null,
27
+ });
28
+ const rafIdRef = useRef(null);
29
+ const clearSegmentTransition = useCallback(() => {
30
+ var _a;
31
+ latchedRef.current = {
32
+ activeIndex: currentIndexRef.current,
33
+ segmentTransition: null,
34
+ };
35
+ (_a = onSegmentTransitionChangeRef.current) === null || _a === void 0 ? void 0 : _a.call(onSegmentTransitionChangeRef, null);
36
+ }, []);
37
+ const emitState = useCallback((next) => {
38
+ var _a;
39
+ const prev = latchedRef.current;
40
+ latchedRef.current = next;
41
+ if (next.activeIndex !== currentIndexRef.current) {
42
+ setIndexRef.current(next.activeIndex);
43
+ }
44
+ const segmentTransition = next.segmentTransition;
45
+ const prevTransition = prev.segmentTransition;
46
+ if (isSameSegmentTransition(prevTransition, segmentTransition)) {
47
+ return;
48
+ }
49
+ (_a = onSegmentTransitionChangeRef.current) === null || _a === void 0 ? void 0 : _a.call(onSegmentTransitionChangeRef, segmentTransition);
50
+ }, []);
51
+ const computeAndEmit = useCallback(() => {
52
+ const scroller = scrollContainerRef.current;
53
+ const layout = scrollTrackLayoutRef.current;
54
+ const currentStoryData = storyDataRef.current;
55
+ if (!enabled || !scroller || !currentStoryData || !layout) {
56
+ clearSegmentTransition();
57
+ return;
58
+ }
59
+ const next = computeListStoryScrollState({
60
+ scrollTop: scroller.scrollTop,
61
+ viewportHeight: scroller.clientHeight,
62
+ segments: layout.segments,
63
+ });
64
+ if (!next) {
65
+ return;
66
+ }
67
+ emitState(next);
68
+ }, [enabled, scrollContainerRef, emitState, clearSegmentTransition]);
69
+ const scheduleCompute = useCallback(() => {
70
+ if (rafIdRef.current !== null) {
71
+ return;
72
+ }
73
+ rafIdRef.current = window.requestAnimationFrame(() => {
74
+ rafIdRef.current = null;
75
+ computeAndEmit();
76
+ });
77
+ }, [computeAndEmit]);
78
+ useEffect(() => {
79
+ latchedRef.current = {
80
+ activeIndex: currentIndex,
81
+ segmentTransition: latchedRef.current.segmentTransition,
82
+ };
83
+ }, [currentIndex]);
84
+ useEffect(() => {
85
+ scheduleCompute();
86
+ }, [items, storyData, scrollTrackLayout, scheduleCompute]);
87
+ useEffect(() => {
88
+ if (!enabled) {
89
+ clearSegmentTransition();
90
+ return;
91
+ }
92
+ const scroller = scrollContainerRef.current;
93
+ if (!scroller) {
94
+ clearSegmentTransition();
95
+ return;
96
+ }
97
+ scroller.addEventListener('scroll', scheduleCompute, { passive: true });
98
+ scheduleCompute();
99
+ return () => {
100
+ scroller.removeEventListener('scroll', scheduleCompute);
101
+ if (rafIdRef.current !== null) {
102
+ window.cancelAnimationFrame(rafIdRef.current);
103
+ rafIdRef.current = null;
104
+ }
105
+ };
106
+ }, [enabled, scrollContainerRef, scheduleCompute, clearSegmentTransition]);
107
+ }
@@ -0,0 +1,19 @@
1
+ import type { IListStoryMarkdownSegment } from "../types/types";
2
+ interface IUseQueuedMarkdownHeightMeasureParams {
3
+ enabled: boolean;
4
+ markdownSegments: IListStoryMarkdownSegment[];
5
+ currentSegmentIndex: number;
6
+ heightsById: Readonly<Record<string, number>>;
7
+ onHeight: (segmentId: string, height: number) => void;
8
+ }
9
+ interface IQueuedMarkdownHeightMeasureState {
10
+ segmentBeingMeasured: IListStoryMarkdownSegment | null;
11
+ reportHeight: (segmentId: string, height: number) => void;
12
+ completeMeasure: () => void;
13
+ }
14
+ /**
15
+ * Queues markdown segments near the active index and measures them one at a time
16
+ * in a shared off-screen pane (see ListStoryMarkdownMeasurePane).
17
+ */
18
+ export declare function useQueuedMarkdownHeightMeasure({ enabled, markdownSegments, currentSegmentIndex, heightsById, onHeight, }: IUseQueuedMarkdownHeightMeasureParams): IQueuedMarkdownHeightMeasureState;
19
+ export {};
@@ -0,0 +1,56 @@
1
+ import { useCallback, useEffect, useRef, useState } from 'react';
2
+ import { buildPendingMeasureIds } from "../utils/listStoryMeasureQueue";
3
+ /**
4
+ * Queues markdown segments near the active index and measures them one at a time
5
+ * in a shared off-screen pane (see ListStoryMarkdownMeasurePane).
6
+ */
7
+ export function useQueuedMarkdownHeightMeasure({ enabled, markdownSegments, currentSegmentIndex, heightsById, onHeight, }) {
8
+ const [segmentBeingMeasured, setSegmentBeingMeasured] = useState(null);
9
+ const queueRef = useRef([]);
10
+ const refillQueue = useCallback(() => {
11
+ queueRef.current = buildPendingMeasureIds({
12
+ markdownSegments,
13
+ currentSegmentIndex,
14
+ heightsById,
15
+ measuringSegmentId: segmentBeingMeasured === null || segmentBeingMeasured === void 0 ? void 0 : segmentBeingMeasured.id,
16
+ });
17
+ }, [
18
+ markdownSegments,
19
+ currentSegmentIndex,
20
+ heightsById,
21
+ segmentBeingMeasured === null || segmentBeingMeasured === void 0 ? void 0 : segmentBeingMeasured.id,
22
+ ]);
23
+ const reportHeight = useCallback((segmentId, height) => {
24
+ onHeight(segmentId, height);
25
+ }, [onHeight]);
26
+ const completeMeasure = useCallback(() => {
27
+ setSegmentBeingMeasured(null);
28
+ }, []);
29
+ useEffect(() => {
30
+ if (!enabled) {
31
+ setSegmentBeingMeasured(null);
32
+ queueRef.current = [];
33
+ return;
34
+ }
35
+ refillQueue();
36
+ if (segmentBeingMeasured) {
37
+ return;
38
+ }
39
+ const nextId = queueRef.current.shift();
40
+ if (!nextId) {
41
+ return;
42
+ }
43
+ const segment = markdownSegments.find(item => item.id === nextId);
44
+ if (segment) {
45
+ setSegmentBeingMeasured(segment);
46
+ }
47
+ }, [
48
+ enabled,
49
+ currentSegmentIndex,
50
+ markdownSegments,
51
+ heightsById,
52
+ segmentBeingMeasured,
53
+ refillQueue,
54
+ ]);
55
+ return { segmentBeingMeasured, reportHeight, completeMeasure };
56
+ }
@@ -0,0 +1 @@
1
+ export declare function useStoryImagePreload(imageUrl?: string): boolean;
@@ -0,0 +1,24 @@
1
+ import { useEffect, useState } from 'react';
2
+ export function useStoryImagePreload(imageUrl) {
3
+ const [imageLoaded, setImageLoaded] = useState(false);
4
+ useEffect(() => {
5
+ if (!imageUrl) {
6
+ setImageLoaded(false);
7
+ return;
8
+ }
9
+ setImageLoaded(false);
10
+ const img = new Image();
11
+ img.onload = () => {
12
+ setImageLoaded(true);
13
+ };
14
+ img.onerror = () => {
15
+ setImageLoaded(false);
16
+ };
17
+ img.src = imageUrl;
18
+ return () => {
19
+ img.onload = null;
20
+ img.onerror = null;
21
+ };
22
+ }, [imageUrl]);
23
+ return imageLoaded;
24
+ }
@@ -1,5 +1,5 @@
1
1
  import type { IJGISLayer, IJGISStoryMap, IJupyterGISModel } from '@jupytergis/schema';
2
- import { CSSProperties, RefObject } from 'react';
2
+ import { RefObject } from 'react';
3
3
  /** Entry for a layer affected by layer override
4
4
  * remove if we added a layer or restore if we modified an existing layer.
5
5
  **/
@@ -13,12 +13,8 @@ export interface IUseStoryMapParams {
13
13
  removeLayer?: (id: string) => void;
14
14
  addLayer?: (id: string, layer: IJGISLayer, index: number) => Promise<void>;
15
15
  isSpecta: boolean;
16
- /** Panel root element for applying specta presentation CSS variables. */
17
- panelRef?: RefObject<HTMLDivElement | null>;
18
16
  }
19
- /** Inline style for specta presentation (bg and text color from story). */
20
- export declare function getSpectaPresentationStyle(story: IJGISStoryMap | null): CSSProperties;
21
- export declare function useStoryMap({ model, overrideLayerEntriesRef, removeLayer, addLayer, panelRef, isSpecta, }: IUseStoryMapParams): {
17
+ export declare function useStoryMap({ model, overrideLayerEntriesRef, removeLayer, addLayer, isSpecta, }: IUseStoryMapParams): {
22
18
  storyData: IJGISStoryMap | null;
23
19
  storySegments: IJGISLayer[];
24
20
  currentIndex: number;
@@ -36,5 +32,4 @@ export declare function useStoryMap({ model, overrideLayerEntriesRef, removeLaye
36
32
  } | undefined;
37
33
  layerName: string;
38
34
  currentStorySegmentId: string | undefined;
39
- zoomToCurrentLayer: () => void;
40
35
  };
@@ -1,22 +1,8 @@
1
1
  import { UUID } from '@lumino/coreutils';
2
- import { useCallback, useEffect, useMemo, useState, } from 'react';
3
- /** Inline style for specta presentation (bg and text color from story). */
4
- export function getSpectaPresentationStyle(story) {
5
- const bgColor = story === null || story === void 0 ? void 0 : story.presentationBgColor;
6
- const textColor = story === null || story === void 0 ? void 0 : story.presentationTextColor;
7
- const style = {};
8
- if (bgColor) {
9
- style['--jgis-specta-bg-color'] = bgColor;
10
- style.backgroundColor = bgColor;
11
- }
12
- if (textColor) {
13
- style['--jgis-specta-text-color'] = textColor;
14
- style.color = textColor;
15
- }
16
- return style;
17
- }
18
- export function useStoryMap({ model, overrideLayerEntriesRef, removeLayer, addLayer, panelRef, isSpecta, }) {
19
- var _a;
2
+ import { useCallback, useEffect, useMemo, useState } from 'react';
3
+ import { STORY_TYPE } from "../../../types";
4
+ export function useStoryMap({ model, overrideLayerEntriesRef, removeLayer, addLayer, isSpecta, }) {
5
+ var _a, _b;
20
6
  const [currentIndex, setCurrentIndex] = useState(() => { var _a; return (_a = model.getCurrentSegmentIndex()) !== null && _a !== void 0 ? _a : 0; });
21
7
  const [storyData, setStoryData] = useState(() => { var _a; return (_a = model.getSelectedStory().story) !== null && _a !== void 0 ? _a : null; });
22
8
  const storySegments = useMemo(() => {
@@ -33,7 +19,9 @@ export function useStoryMap({ model, overrideLayerEntriesRef, removeLayer, addLa
33
19
  const activeSlide = useMemo(() => currentStorySegment === null || currentStorySegment === void 0 ? void 0 : currentStorySegment.parameters, [currentStorySegment]);
34
20
  const layerName = useMemo(() => { var _a; return (_a = currentStorySegment === null || currentStorySegment === void 0 ? void 0 : currentStorySegment.name) !== null && _a !== void 0 ? _a : ''; }, [currentStorySegment]);
35
21
  const currentStorySegmentId = useMemo(() => storySegmentIds === null || storySegmentIds === void 0 ? void 0 : storySegmentIds[currentIndex], [storySegmentIds, currentIndex]);
36
- const showGradient = (_a = storyData === null || storyData === void 0 ? void 0 : storyData.showGradient) !== null && _a !== void 0 ? _a : true;
22
+ const currentSegmentContentMode = (_a = activeSlide === null || activeSlide === void 0 ? void 0 : activeSlide.content) === null || _a === void 0 ? void 0 : _a.contentMode;
23
+ const showGradient = (_b = storyData === null || storyData === void 0 ? void 0 : storyData.showGradient) !== null && _b !== void 0 ? _b : true;
24
+ const isGuidedStory = (storyData === null || storyData === void 0 ? void 0 : storyData.storyType) === STORY_TYPE.guided;
37
25
  const hasPrev = currentIndex > 0;
38
26
  const hasNext = currentIndex < segmentCount - 1;
39
27
  const clearOverrideLayers = useCallback(() => {
@@ -54,11 +42,6 @@ export function useStoryMap({ model, overrideLayerEntriesRef, removeLayer, addLa
54
42
  });
55
43
  entries.length = 0;
56
44
  }, [model, overrideLayerEntriesRef, removeLayer]);
57
- const zoomToCurrentLayer = useCallback(() => {
58
- if (currentStorySegmentId) {
59
- model.centerOnPosition(currentStorySegmentId);
60
- }
61
- }, [model, currentStorySegmentId]);
62
45
  const setIndex = useCallback((index) => {
63
46
  model.setCurrentSegmentIndex(index);
64
47
  }, [model]);
@@ -196,44 +179,38 @@ export function useStoryMap({ model, overrideLayerEntriesRef, removeLayer, addLa
196
179
  };
197
180
  }, []);
198
181
  useEffect(() => {
199
- if (currentStorySegmentId) {
200
- zoomToCurrentLayer();
182
+ if (!currentStorySegmentId) {
183
+ return;
201
184
  }
202
- }, [currentStorySegmentId, zoomToCurrentLayer]);
185
+ if (currentSegmentContentMode === 'markdown') {
186
+ return;
187
+ }
188
+ model.centerOnPosition(currentStorySegmentId);
189
+ }, [model, currentStorySegmentId, currentSegmentContentMode]);
203
190
  // Set selected layer and apply symbology when segment changes; remove previous segment's override layers first.
204
191
  useEffect(() => {
205
192
  if (!(storyData === null || storyData === void 0 ? void 0 : storyData.storySegments) || currentIndex < 0) {
206
193
  return;
207
194
  }
208
195
  clearOverrideLayers();
209
- setSelectedLayerByIndex(currentIndex);
196
+ if (isGuidedStory) {
197
+ setSelectedLayerByIndex(currentIndex);
198
+ }
210
199
  overrideSymbology(currentIndex);
211
200
  }, [
212
201
  storyData,
213
202
  currentIndex,
203
+ isGuidedStory,
214
204
  setSelectedLayerByIndex,
215
205
  clearOverrideLayers,
216
206
  overrideSymbology,
217
207
  ]);
218
208
  // Set selected layer on initial render and when story data changes
219
209
  useEffect(() => {
220
- if ((storyData === null || storyData === void 0 ? void 0 : storyData.storySegments) && currentIndex >= 0) {
210
+ if (isGuidedStory && (storyData === null || storyData === void 0 ? void 0 : storyData.storySegments) && currentIndex >= 0) {
221
211
  setSelectedLayerByIndex(currentIndex);
222
212
  }
223
- }, [storyData, currentIndex, setSelectedLayerByIndex]);
224
- // Apply story presentation colors (specta) to panel root
225
- useEffect(() => {
226
- if (!isSpecta || !(panelRef === null || panelRef === void 0 ? void 0 : panelRef.current)) {
227
- return;
228
- }
229
- const container = panelRef.current;
230
- const style = getSpectaPresentationStyle(storyData);
231
- Object.entries(style).forEach(([key, value]) => {
232
- if (value !== null) {
233
- container.style.setProperty(key, String(value));
234
- }
235
- });
236
- }, [storyData, isSpecta, panelRef]);
213
+ }, [storyData, currentIndex, isGuidedStory, setSelectedLayerByIndex]);
237
214
  return {
238
215
  storyData,
239
216
  storySegments,
@@ -250,6 +227,5 @@ export function useStoryMap({ model, overrideLayerEntriesRef, removeLayer, addLa
250
227
  activeSlide,
251
228
  layerName,
252
229
  currentStorySegmentId,
253
- zoomToCurrentLayer,
254
230
  };
255
231
  }
@@ -0,0 +1,21 @@
1
+ import { RefObject } from 'react';
2
+ /**
3
+ * Specta story column scroll container + optional sentinel tracking.
4
+ * - `scrollContainerRef`: list + single attach here (`#jgis-story-segment-panel`).
5
+ * - With `sentinelsEnabled: false` (list mode), only the ref is used.
6
+ * - `getAtTop` / `getAtBottom`: guided/unguided wheel edges (single mode).
7
+ */
8
+ interface IUseStoryScrollStateParams {
9
+ currentIndex: number;
10
+ /** When false, only exposes scrollContainerRef (list story virtual track). */
11
+ sentinelsEnabled?: boolean;
12
+ }
13
+ interface IUseStoryScrollStateResult {
14
+ scrollContainerRef: RefObject<HTMLDivElement>;
15
+ topSentinelRef: RefObject<HTMLDivElement>;
16
+ bottomSentinelRef: RefObject<HTMLDivElement>;
17
+ getAtTop: () => boolean;
18
+ getAtBottom: () => boolean;
19
+ }
20
+ export declare function useStoryScrollState({ currentIndex, sentinelsEnabled, }: IUseStoryScrollStateParams): IUseStoryScrollStateResult;
21
+ export {};
@@ -0,0 +1,39 @@
1
+ import { useEffect, useRef } from 'react';
2
+ export function useStoryScrollState({ currentIndex, sentinelsEnabled = true, }) {
3
+ const scrollContainerRef = useRef(null);
4
+ const topSentinelRef = useRef(null);
5
+ const bottomSentinelRef = useRef(null);
6
+ const atTopRef = useRef(false);
7
+ const atBottomRef = useRef(false);
8
+ useEffect(() => {
9
+ if (!sentinelsEnabled) {
10
+ return;
11
+ }
12
+ const root = scrollContainerRef.current;
13
+ const topEl = topSentinelRef.current;
14
+ const bottomEl = bottomSentinelRef.current;
15
+ if (!root || !topEl || !bottomEl) {
16
+ return;
17
+ }
18
+ const observer = new IntersectionObserver((entries) => {
19
+ for (const entry of entries) {
20
+ if (entry.target === topEl) {
21
+ atTopRef.current = entry.isIntersecting;
22
+ }
23
+ else if (entry.target === bottomEl) {
24
+ atBottomRef.current = entry.isIntersecting;
25
+ }
26
+ }
27
+ }, { root, threshold: 0, rootMargin: '0px' });
28
+ observer.observe(topEl);
29
+ observer.observe(bottomEl);
30
+ return () => observer.disconnect();
31
+ }, [currentIndex, sentinelsEnabled]);
32
+ return {
33
+ scrollContainerRef,
34
+ topSentinelRef,
35
+ bottomSentinelRef,
36
+ getAtTop: () => atTopRef.current,
37
+ getAtBottom: () => atBottomRef.current,
38
+ };
39
+ }
@@ -0,0 +1,8 @@
1
+ import { IJGISStoryMap, IJupyterGISModel } from '@jupytergis/schema';
2
+ interface IUseStorySegmentSyncParams {
3
+ model: IJupyterGISModel;
4
+ storyData: IJGISStoryMap | null;
5
+ setIndex: (index: number) => void;
6
+ }
7
+ export declare function useStorySegmentSync({ model, storyData, setIndex, }: IUseStorySegmentSyncParams): void;
8
+ export {};
@@ -0,0 +1,51 @@
1
+ import { useEffect } from 'react';
2
+ import { STORY_TYPE } from "../../../types";
3
+ function getSingleSelectedLayerId(selected) {
4
+ if (!selected) {
5
+ return null;
6
+ }
7
+ const selectedLayerIds = Object.keys(selected);
8
+ if (selectedLayerIds.length !== 1) {
9
+ return null;
10
+ }
11
+ return selectedLayerIds[0];
12
+ }
13
+ function getStorySegmentIndexFromLayerId(storyData, selectedLayerId) {
14
+ var _a;
15
+ const index = (_a = storyData.storySegments) === null || _a === void 0 ? void 0 : _a.indexOf(selectedLayerId);
16
+ if (index === undefined || index === -1) {
17
+ return null;
18
+ }
19
+ return index;
20
+ }
21
+ // This hook just syncs the active segment with the currently selected segment
22
+ // Only for unguided mode
23
+ export function useStorySegmentSync({ model, storyData, setIndex, }) {
24
+ useEffect(() => {
25
+ const handleSelectedStorySegmentChanged = () => {
26
+ var _a, _b;
27
+ if (!storyData || storyData.storyType !== STORY_TYPE.unguided) {
28
+ return;
29
+ }
30
+ const selected = (_b = (_a = model.localState) === null || _a === void 0 ? void 0 : _a.selected) === null || _b === void 0 ? void 0 : _b.value;
31
+ const selectedLayerId = getSingleSelectedLayerId(selected);
32
+ if (!selectedLayerId) {
33
+ return;
34
+ }
35
+ const selectedLayer = model.getLayer(selectedLayerId);
36
+ if (!selectedLayer || selectedLayer.type !== 'StorySegmentLayer') {
37
+ return;
38
+ }
39
+ const index = getStorySegmentIndexFromLayerId(storyData, selectedLayerId);
40
+ if (index === null) {
41
+ return;
42
+ }
43
+ setIndex(index);
44
+ };
45
+ model.selectedChanged.connect(handleSelectedStorySegmentChanged);
46
+ handleSelectedStorySegmentChanged();
47
+ return () => {
48
+ model.selectedChanged.disconnect(handleSelectedStorySegmentChanged);
49
+ };
50
+ }, [model, storyData, setIndex]);
51
+ }