Showing preview only (6,277K chars total). Download the full file or copy to clipboard to get everything.
Repository: geojupyter/jupytergis
Branch: main
Commit: 6248266043b9
Files: 551
Total size: 5.9 MB
Directory structure:
gitextract_7za2u5u1/
├── .eslintignore
├── .eslintrc.js
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── 0-user-story.yml
│ │ ├── 1-experience-report.yml
│ │ ├── 2-bug.yml
│ │ ├── 3-docs.yml
│ │ ├── 4-feature-request.yml
│ │ └── config.yml
│ ├── dependabot.yml
│ ├── pull_request_template.md
│ └── workflows/
│ ├── binder-on-pr.yml
│ ├── build-test-without-lockfile.yml
│ ├── build.yml
│ ├── check-links.yml
│ ├── check-release.yml
│ ├── draft-pdf.yml
│ ├── enforce-labels.yml
│ ├── lint-js.yml
│ ├── pr-rtd-link.yml
│ ├── prep-release.yml
│ ├── publish-release.yml
│ ├── triage-prs-to-board.yml
│ ├── typecheck-python.yml
│ ├── unit-test-js.yml
│ ├── unit-test-python.yml
│ ├── update_galata_references.yaml
│ ├── update_lite_galata_references.yaml
│ └── zizmor.yml
├── .gitignore
├── .nblink/
│ ├── environment.yml
│ └── nblink-lock.json
├── .pre-commit-config.yaml
├── .prettierignore
├── .prettierrc
├── .readthedocs.yaml
├── .yarnrc.yml
├── CHANGELOG.md
├── CITATION.cff
├── CONTRIBUTING.md
├── LICENSE
├── RELEASE.md
├── binder/
│ ├── environment.yml
│ ├── jupyter_config.json
│ ├── postBuild
│ └── start
├── docs/
│ ├── assets/
│ │ └── css/
│ │ └── custom.css
│ ├── build-on-change.sh
│ ├── build.sh
│ ├── changelog.md
│ ├── clean.sh
│ ├── conf.py
│ ├── contributor_guide/
│ │ ├── development_setup.md
│ │ ├── explanation/
│ │ │ ├── architecture.md
│ │ │ ├── code-generation.md
│ │ │ ├── form-system.md
│ │ │ ├── index.md
│ │ │ ├── security-and-npm-dependencies.md
│ │ │ └── ui-testing.md
│ │ ├── how-tos/
│ │ │ ├── add-to-layer-gallery.md
│ │ │ ├── build-docs-locally.md
│ │ │ ├── code_quality.md
│ │ │ ├── commands/
│ │ │ │ └── index.md
│ │ │ ├── index.md
│ │ │ ├── keybindings/
│ │ │ │ └── index.md
│ │ │ ├── processing-operations/
│ │ │ │ └── index.md
│ │ │ ├── release.md
│ │ │ ├── schema-migration.md
│ │ │ ├── test.md
│ │ │ ├── ui-tests-debug-failures.md
│ │ │ ├── ui-tests-update-snapshots.md
│ │ │ └── write-tutorials.md
│ │ ├── index.md
│ │ └── troubleshooting.md
│ ├── environment-docs.yml
│ ├── environment.yml
│ ├── index.md
│ ├── jupyter-lite.json
│ ├── jupyter_lite_config.json
│ ├── overview/
│ │ ├── features/
│ │ │ ├── collab.md
│ │ │ ├── extension.md
│ │ │ └── index.md
│ │ ├── index.md
│ │ └── what-is-jgis.md
│ └── user_guide/
│ ├── how-tos/
│ │ ├── ai-skills.md
│ │ ├── collab.md
│ │ ├── index.md
│ │ └── story-maps.md
│ ├── index.md
│ ├── install.md
│ ├── python_api.md
│ └── tutorials/
│ ├── 01-intro/
│ │ └── index.md
│ ├── 02-collaboration/
│ │ └── index.md
│ └── index.md
├── examples/
│ ├── 01-Create_a_new_JGIS_document.ipynb
│ ├── 99-Explore_data_in_a_map.ipynb
│ ├── 99-Open_an_existing_JGIS_Project_and_add_layers.ipynb
│ ├── 99-Vector_styling.ipynb
│ ├── buildings.jGIS
│ ├── buildings.qgz
│ ├── cloud_optimized_geotiff.jGIS
│ ├── data/
│ │ ├── eq.geojson
│ │ ├── france_regions.geojson
│ │ ├── nyc/
│ │ │ ├── nyc_roads.dbf
│ │ │ ├── nyc_roads.prj
│ │ │ ├── nyc_roads.shp
│ │ │ └── nyc_roads.shx
│ │ └── temporal-test.geojson
│ ├── earthquakes.jGIS
│ ├── europe_demo.jGIS
│ ├── france_hiking.jGIS
│ ├── geopackage.jgis
│ ├── geoparquet.jGIS
│ ├── geotiff.qgz
│ ├── hillshade.jGIS
│ ├── image.jGIS
│ ├── local.jGIS
│ ├── pmtiles-raster.jGIS
│ ├── pmtiles-vector.jGIS
│ ├── roads.jGIS
│ ├── shapefile.jGIS
│ ├── story_map.jGIS
│ ├── test.jGIS
│ ├── wms-tile.jGIS
│ ├── world-epsg4326.jGIS
│ └── world.jGIS
├── lerna.json
├── lite/
│ ├── environment.yml
│ ├── jupyter-lite.json
│ └── jupyter_lite_config.json
├── nx.json
├── package.json
├── packages/
│ ├── base/
│ │ ├── jest.config.js
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── __tests__/
│ │ │ │ └── migrations.spec.ts
│ │ │ ├── commands/
│ │ │ │ ├── BaseCommandIDs.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── operationCommands.ts
│ │ │ ├── constants.ts
│ │ │ ├── declaration.d.ts
│ │ │ ├── features/
│ │ │ │ ├── annotations/
│ │ │ │ │ ├── AnnotationsPanel.tsx
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── Annotation.tsx
│ │ │ │ │ │ ├── AnnotationFloater.tsx
│ │ │ │ │ │ └── Message.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── model.ts
│ │ │ │ ├── console/
│ │ │ │ │ ├── consoleview.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── filter/
│ │ │ │ │ ├── Filter.tsx
│ │ │ │ │ └── FilterRow.tsx
│ │ │ │ ├── identify/
│ │ │ │ │ └── IdentifyPanel.tsx
│ │ │ │ ├── layer-browser/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── layers/
│ │ │ │ │ ├── forms/
│ │ │ │ │ │ ├── layer/
│ │ │ │ │ │ │ ├── heatmapLayerForm.tsx
│ │ │ │ │ │ │ ├── hillshadeLayerForm.tsx
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ ├── layerform.tsx
│ │ │ │ │ │ │ ├── storySegmentLayerForm.tsx
│ │ │ │ │ │ │ ├── vectorlayerform.tsx
│ │ │ │ │ │ │ └── webGlLayerForm.tsx
│ │ │ │ │ │ └── source/
│ │ │ │ │ │ ├── geojsonsource.tsx
│ │ │ │ │ │ ├── geopackagesource.tsx
│ │ │ │ │ │ ├── geotiffsource.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── pathbasedsource.tsx
│ │ │ │ │ │ ├── sourceform.tsx
│ │ │ │ │ │ ├── tilesourceform.tsx
│ │ │ │ │ │ └── wmsTileSource.tsx
│ │ │ │ │ ├── layerCreationFormDialog.tsx
│ │ │ │ │ └── symbology/
│ │ │ │ │ ├── __tests__/
│ │ │ │ │ │ ├── classificationModes.spec.ts
│ │ │ │ │ │ └── styleBuilder.spec.ts
│ │ │ │ │ ├── classificationModes.ts
│ │ │ │ │ ├── colorRampUtils.ts
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── color_ramp/
│ │ │ │ │ │ │ ├── ColorRampControls.tsx
│ │ │ │ │ │ │ ├── ColorRampSelector.tsx
│ │ │ │ │ │ │ ├── ColorRampSelectorEntry.tsx
│ │ │ │ │ │ │ ├── ModeSelectRow.tsx
│ │ │ │ │ │ │ ├── RgbaColorPicker.tsx
│ │ │ │ │ │ │ └── cmocean.json
│ │ │ │ │ │ └── color_stops/
│ │ │ │ │ │ ├── StopContainer.tsx
│ │ │ │ │ │ └── StopRow.tsx
│ │ │ │ │ ├── hooks/
│ │ │ │ │ │ ├── useEffectiveSymbologyParams.ts
│ │ │ │ │ │ ├── useGetBandInfo.ts
│ │ │ │ │ │ ├── useGetProperties.ts
│ │ │ │ │ │ ├── useGetSymbology.ts
│ │ │ │ │ │ └── useOkSignal.ts
│ │ │ │ │ ├── styleBuilder.ts
│ │ │ │ │ ├── symbologyDialog.tsx
│ │ │ │ │ ├── symbologyUtils.ts
│ │ │ │ │ ├── tiff_layer/
│ │ │ │ │ │ ├── TiffRendering.tsx
│ │ │ │ │ │ ├── components/
│ │ │ │ │ │ │ └── BandRow.tsx
│ │ │ │ │ │ └── types/
│ │ │ │ │ │ ├── MultibandColor.tsx
│ │ │ │ │ │ └── SingleBandPseudoColor.tsx
│ │ │ │ │ └── vector_layer/
│ │ │ │ │ ├── VectorRendering.tsx
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── ValueSelect.tsx
│ │ │ │ │ └── types/
│ │ │ │ │ ├── Canonical.tsx
│ │ │ │ │ ├── Categorized.tsx
│ │ │ │ │ ├── Graduated.tsx
│ │ │ │ │ ├── Heatmap.tsx
│ │ │ │ │ └── SimpleSymbol.tsx
│ │ │ │ ├── objectproperties/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── processing/
│ │ │ │ │ ├── ProcessingFormDialog.tsx
│ │ │ │ │ ├── forms/
│ │ │ │ │ │ ├── dissolveProcessForm.tsx
│ │ │ │ │ │ └── processingForm.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── processingCommands.ts
│ │ │ │ │ └── processingFormToParam.ts
│ │ │ │ ├── stac-browser/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── StacPanel.tsx
│ │ │ │ │ │ ├── filter-extension/
│ │ │ │ │ │ │ ├── QueryableComboBox.tsx
│ │ │ │ │ │ │ ├── QueryableRow.tsx
│ │ │ │ │ │ │ ├── StacFilterExtensionPanel.tsx
│ │ │ │ │ │ │ └── StacQueryableFilters.tsx
│ │ │ │ │ │ ├── geodes/
│ │ │ │ │ │ │ ├── StacFilterSection.tsx
│ │ │ │ │ │ │ └── StacGeodesFilterPanel.tsx
│ │ │ │ │ │ └── shared/
│ │ │ │ │ │ ├── StacPanelResults.tsx
│ │ │ │ │ │ ├── StacSpatialExtent.tsx
│ │ │ │ │ │ └── StacTemporalExtent.tsx
│ │ │ │ │ ├── constants.ts
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── StacResultsContext.tsx
│ │ │ │ │ ├── hooks/
│ │ │ │ │ │ ├── useGeodesSearch.ts
│ │ │ │ │ │ ├── useStacFilterExtension.ts
│ │ │ │ │ │ └── useStacSearch.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── types/
│ │ │ │ │ └── types.ts
│ │ │ │ └── story/
│ │ │ │ ├── SpectaPanel.tsx
│ │ │ │ ├── StoryEditorPanel.tsx
│ │ │ │ ├── StoryViewerPanel.tsx
│ │ │ │ ├── components/
│ │ │ │ │ ├── PreviewModeSwitch.tsx
│ │ │ │ │ ├── SpectaDesktopView.tsx
│ │ │ │ │ ├── SpectaMobileView.tsx
│ │ │ │ │ ├── StoryContentSection.tsx
│ │ │ │ │ ├── StoryImageSection.tsx
│ │ │ │ │ ├── StoryNavBar.tsx
│ │ │ │ │ ├── StorySubtitleSection.tsx
│ │ │ │ │ └── StoryTitleSection.tsx
│ │ │ │ └── hooks/
│ │ │ │ └── useStoryMap.ts
│ │ │ ├── formbuilder/
│ │ │ │ ├── creationform.tsx
│ │ │ │ ├── editform.tsx
│ │ │ │ ├── formselectors.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── objectform/
│ │ │ │ ├── SchemaForm.tsx
│ │ │ │ ├── StoryEditorForm.tsx
│ │ │ │ ├── components/
│ │ │ │ │ ├── LayerSelect.tsx
│ │ │ │ │ ├── OpacitySlider.tsx
│ │ │ │ │ ├── SegmentFormSymbology.tsx
│ │ │ │ │ ├── SourcePropertiesField.tsx
│ │ │ │ │ ├── StorySegmentReset.tsx
│ │ │ │ │ └── WmsTileSourceUrlInput.tsx
│ │ │ │ ├── fileselectorwidget.tsx
│ │ │ │ ├── schemaUtils.ts
│ │ │ │ └── useSchemaFormState.ts
│ │ │ ├── gdal.ts
│ │ │ ├── index.ts
│ │ │ ├── keybindings.json
│ │ │ ├── mainview/
│ │ │ │ ├── CollaboratorPointers.tsx
│ │ │ │ ├── FollowIndicator.tsx
│ │ │ │ ├── TemporalSlider.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── mainView.tsx
│ │ │ │ ├── mainviewmodel.ts
│ │ │ │ └── mainviewwidget.tsx
│ │ │ ├── shared/
│ │ │ │ ├── components/
│ │ │ │ │ ├── Badge.tsx
│ │ │ │ │ ├── Button.tsx
│ │ │ │ │ ├── Calendar.tsx
│ │ │ │ │ ├── Checkbox.tsx
│ │ │ │ │ ├── Collapsible.tsx
│ │ │ │ │ ├── Combobox.tsx
│ │ │ │ │ ├── Command.tsx
│ │ │ │ │ ├── Dialog.tsx
│ │ │ │ │ ├── Drawer.tsx
│ │ │ │ │ ├── DropdownMenu.tsx
│ │ │ │ │ ├── Input.tsx
│ │ │ │ │ ├── Pagination.tsx
│ │ │ │ │ ├── Popover.tsx
│ │ │ │ │ ├── RadioGroup.tsx
│ │ │ │ │ ├── Select.tsx
│ │ │ │ │ ├── Sheet.tsx
│ │ │ │ │ ├── SingleDatePicker.tsx
│ │ │ │ │ ├── Switch.tsx
│ │ │ │ │ ├── Tabs.tsx
│ │ │ │ │ ├── ToggleGroup.tsx
│ │ │ │ │ ├── loading.tsx
│ │ │ │ │ └── utils.ts
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── useIsFirstRender.ts
│ │ │ │ │ ├── useLatest.ts
│ │ │ │ │ └── useMediaQuery.ts
│ │ │ │ ├── icons.ts
│ │ │ │ └── store.ts
│ │ │ ├── tools.ts
│ │ │ ├── types/
│ │ │ │ ├── colormap.d.ts
│ │ │ │ ├── geoparquet.d.ts
│ │ │ │ └── ol-load-geopackage.d.ts
│ │ │ ├── types.ts
│ │ │ └── workspace/
│ │ │ ├── menus.ts
│ │ │ ├── panels/
│ │ │ │ ├── components/
│ │ │ │ │ ├── TabbedPanel.tsx
│ │ │ │ │ ├── layers.tsx
│ │ │ │ │ └── legendItem.tsx
│ │ │ │ ├── header.tsx
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── useLayerTree.ts
│ │ │ │ │ ├── useRightPanelOptions.ts
│ │ │ │ │ └── useUIState.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── leftpanel.tsx
│ │ │ │ ├── mergedpanel.tsx
│ │ │ │ └── rightpanel.tsx
│ │ │ ├── statusbar/
│ │ │ │ ├── SpectaPresentationProgressBar.tsx
│ │ │ │ └── StatusBar.tsx
│ │ │ ├── toolbar/
│ │ │ │ ├── index.ts
│ │ │ │ └── widget.tsx
│ │ │ └── widget.ts
│ │ ├── style/
│ │ │ ├── base.css
│ │ │ ├── colorExpression.css
│ │ │ ├── dialog.css
│ │ │ ├── filterPanel.css
│ │ │ ├── index.css
│ │ │ ├── index.js
│ │ │ ├── layerBrowser.css
│ │ │ ├── leftPanel.css
│ │ │ ├── shared/
│ │ │ │ ├── badge.css
│ │ │ │ ├── button.css
│ │ │ │ ├── calendar.css
│ │ │ │ ├── checkbox.css
│ │ │ │ ├── combobox.css
│ │ │ │ ├── command.css
│ │ │ │ ├── dialog.css
│ │ │ │ ├── drawer.css
│ │ │ │ ├── dropdownMenu.css
│ │ │ │ ├── input.css
│ │ │ │ ├── pagination.css
│ │ │ │ ├── popover.css
│ │ │ │ ├── radioGroup.css
│ │ │ │ ├── sheet.css
│ │ │ │ ├── switch.css
│ │ │ │ ├── tabs.css
│ │ │ │ └── toggle.css
│ │ │ ├── spectaProgressBar.css
│ │ │ ├── stacBrowser.css
│ │ │ ├── statusBar.css
│ │ │ ├── storyPanel.css
│ │ │ ├── symbologyDialog.css
│ │ │ ├── tabPanel.css
│ │ │ └── temporalSlider.css
│ │ ├── tsconfig.json
│ │ └── tsconfig.test.json
│ ├── jest.base.js
│ └── schema/
│ ├── cacheGeoJSONSchema.js
│ ├── jest.config.js
│ ├── package.json
│ ├── scripts/
│ │ ├── add-schema-version.js
│ │ ├── dereference-and-combine-schemas-for-registry.js
│ │ ├── preprocess-schemas-for-python-type-generation.js
│ │ ├── process.py
│ │ └── validate-examples.js
│ ├── src/
│ │ ├── doc.ts
│ │ ├── index.ts
│ │ ├── interfaces.ts
│ │ ├── migrations/
│ │ │ ├── index.ts
│ │ │ └── v0_5_to_v0_6.ts
│ │ ├── model.ts
│ │ ├── processing/
│ │ │ ├── ProcessingMerge.ts
│ │ │ └── config/
│ │ │ ├── boundingBoxes.json
│ │ │ ├── buffer.json
│ │ │ ├── centroids.json
│ │ │ ├── concaveHull.json
│ │ │ ├── convexHull.json
│ │ │ └── dissolve.json
│ │ ├── schema/
│ │ │ ├── export/
│ │ │ │ ├── exportGeoJson.json
│ │ │ │ └── exportGeoTiff.json
│ │ │ ├── processing/
│ │ │ │ ├── boundingBoxes.json
│ │ │ │ ├── buffer.json
│ │ │ │ ├── centroids.json
│ │ │ │ ├── concaveHull.json
│ │ │ │ ├── convexHull.json
│ │ │ │ └── dissolve.json
│ │ │ └── project/
│ │ │ ├── jgis.json
│ │ │ ├── layers/
│ │ │ │ ├── heatmapLayer.json
│ │ │ │ ├── hillshadeLayer.json
│ │ │ │ ├── imageLayer.json
│ │ │ │ ├── rasterLayer.json
│ │ │ │ ├── stacLayer.json
│ │ │ │ ├── storySegmentLayer.json
│ │ │ │ ├── vectorLayer.json
│ │ │ │ ├── vectorTileLayer.json
│ │ │ │ └── webGlLayer.json
│ │ │ └── sources/
│ │ │ ├── geoJsonSource.json
│ │ │ ├── geoPackageRasterSource.json
│ │ │ ├── geoPackageVectorSource.json
│ │ │ ├── geoParquetSource.json
│ │ │ ├── geoTiffSource.json
│ │ │ ├── imageSource.json
│ │ │ ├── markerSource.json
│ │ │ ├── rasterDemSource.json
│ │ │ ├── rasterSource.json
│ │ │ ├── shapefileSource.json
│ │ │ ├── vectorTileSource.json
│ │ │ ├── videoSource.json
│ │ │ └── wmsTileSource.json
│ │ ├── token.ts
│ │ └── types.ts
│ ├── test-fixtures/
│ │ └── migrations/
│ │ ├── v0.5.0/
│ │ │ └── legacy-symbology.jGIS
│ │ └── v0.6.0/
│ │ └── legacy-symbology.jGIS
│ ├── tsconfig.json
│ └── tsconfig.test.json
├── paper/
│ ├── paper.bib
│ └── paper.md
├── pyproject.toml
├── python/
│ ├── jupytergis/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── jupytergis/
│ │ │ └── __init__.py
│ │ ├── pyproject.toml
│ │ ├── scripts/
│ │ │ └── bump-version.py
│ │ └── setup.py
│ ├── jupytergis_core/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── jupyter-config/
│ │ │ └── server-config/
│ │ │ └── jupytergis_core.json
│ │ ├── jupytergis_core/
│ │ │ ├── __init__.py
│ │ │ ├── color_ramps.py
│ │ │ ├── colors.py
│ │ │ ├── handler.py
│ │ │ ├── jgis_ydoc.py
│ │ │ ├── migrations/
│ │ │ │ ├── __init__.py
│ │ │ │ └── v0_5_to_v0_6.py
│ │ │ ├── schema/
│ │ │ │ └── __init__.py
│ │ │ └── tests/
│ │ │ ├── __init__.py
│ │ │ └── test_migrations.py
│ │ ├── package.json
│ │ ├── pyproject.toml
│ │ ├── schema/
│ │ │ └── jupytergis-settings.json
│ │ ├── scripts/
│ │ │ └── bump-version.py
│ │ ├── setup.py
│ │ ├── src/
│ │ │ ├── @types/
│ │ │ │ └── wasm.ts
│ │ │ ├── externalcommand.ts
│ │ │ ├── factory.ts
│ │ │ ├── index.ts
│ │ │ ├── jgisplugin/
│ │ │ │ ├── modelfactory.ts
│ │ │ │ └── plugins.ts
│ │ │ ├── layerBrowserRegistry.ts
│ │ │ ├── plugin.ts
│ │ │ └── schemaregistry.ts
│ │ ├── style/
│ │ │ ├── base.css
│ │ │ ├── index.css
│ │ │ └── index.js
│ │ ├── tsconfig.json
│ │ └── webpack.config.js
│ ├── jupytergis_lab/
│ │ ├── .gitignore
│ │ ├── .prettierignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── install.json
│ │ ├── jupytergis_lab/
│ │ │ ├── __init__.py
│ │ │ └── notebook/
│ │ │ ├── __init__.py
│ │ │ ├── explore.py
│ │ │ ├── gis_document.py
│ │ │ ├── tests/
│ │ │ │ ├── __init__.py
│ │ │ │ └── test_api.py
│ │ │ ├── utils.py
│ │ │ └── y_connector.py
│ │ ├── package.json
│ │ ├── pyproject.toml
│ │ ├── scripts/
│ │ │ └── bump-version.py
│ │ ├── setup.py
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ └── notebookrenderer.ts
│ │ ├── style/
│ │ │ ├── base.css
│ │ │ ├── index.css
│ │ │ └── index.js
│ │ └── tsconfig.json
│ ├── jupytergis_lite/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── jupytergis/
│ │ │ └── __init__.py
│ │ ├── pyproject.toml
│ │ ├── scripts/
│ │ │ └── bump-version.py
│ │ └── setup.py
│ └── jupytergis_qgis/
│ ├── .prettierignore
│ ├── LICENSE
│ ├── README.md
│ ├── install.json
│ ├── jupyter-config/
│ │ └── server-config/
│ │ └── jupytergis_qgis.json
│ ├── jupytergis_qgis/
│ │ ├── __init__.py
│ │ ├── handlers.py
│ │ ├── qgis_loader.py
│ │ ├── qgis_ydoc.py
│ │ └── tests/
│ │ ├── __init__.py
│ │ ├── files/
│ │ │ └── project0.qgs
│ │ └── test_qgis.py
│ ├── package.json
│ ├── pyproject.toml
│ ├── schema/
│ │ └── qgisplugin.json
│ ├── scripts/
│ │ └── bump-version.py
│ ├── setup.py
│ ├── src/
│ │ ├── index.ts
│ │ ├── modelfactory.ts
│ │ └── plugins.ts
│ ├── style/
│ │ ├── base.css
│ │ ├── index.css
│ │ └── index.js
│ └── tsconfig.json
├── scripts/
│ ├── build_packages.py
│ ├── dev-install.py
│ └── layer_gallery/
│ ├── README.md
│ ├── layer_gallery/
│ │ ├── __init__.py
│ │ ├── __main__.py
│ │ ├── config.py
│ │ ├── generate.py
│ │ ├── models.py
│ │ ├── thumbnail.py
│ │ └── utils.py
│ ├── pyproject.toml
│ └── tests/
│ ├── __init__.py
│ ├── conftest.py
│ ├── helpers.py
│ ├── test_generate.py
│ ├── test_models.py
│ ├── test_thumbnail.py
│ └── test_utils.py
├── tsconfig.eslint.json
├── tsconfigbase.json
└── ui-tests/
├── content/
│ └── jgis.ipynb
├── jupyter_server_test_config.py
├── package.json
├── playwright-lite.config.js
├── playwright.config.js
└── tests/
├── annotations.spec.ts
├── contextmenu.spec.ts
├── export.spec.ts
├── filters.spec.ts
├── geojson-layers.spec.ts
├── gis-files/
│ ├── annotation-test.jGIS
│ ├── buildings.qgs
│ ├── buildings.qgz
│ ├── context-test.jGIS
│ ├── empty-france.jGIS
│ ├── eq.geojson
│ ├── filter-test.jGIS
│ ├── france-hiking.jGIS
│ ├── france_regions.geojson
│ ├── graduated-lines-test.jGIS
│ ├── panel-test.jGIS
│ ├── roads-test.geojson
│ ├── shapefile-test.jGIS
│ ├── stac-test.jGIS
│ └── test.jGIS
├── graduated-lines.spec.ts
├── layer-browser.spec.ts
├── left-panel.spec.ts
├── lite.spec.ts
├── mobile-panel.spec.ts
├── new-file.spec.ts
├── notebook.spec.ts
├── notebooks/
│ └── Notebook.ipynb
├── stac-browser.spec.ts
└── ui.spec.ts
================================================
FILE CONTENTS
================================================
================================================
FILE: .eslintignore
================================================
node_modules
dist
coverage
**/*.d.ts
**/*.js
tests
ui-tests
**/build/
examples/
================================================
FILE: .eslintrc.js
================================================
module.exports = {
extends: [
"eslint:recommended",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended",
],
parser: "@typescript-eslint/parser",
parserOptions: {
project: "tsconfig.eslint.json",
sourceType: "module",
},
plugins: ["@typescript-eslint", "import"],
rules: {
"@typescript-eslint/ban-ts-comment": "warn",
"@typescript-eslint/naming-convention": [
"error",
{
selector: "interface",
format: ["PascalCase"],
custom: {
regex: "^I[A-Z]",
match: true,
},
},
],
"@typescript-eslint/no-unused-vars": [
"warn",
{
args: "none",
varsIgnorePattern: "^_$"
}
],
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-namespace": "off",
"@typescript-eslint/no-unnecessary-type-assertion": "error",
"@typescript-eslint/no-use-before-define": "off",
"@typescript-eslint/quotes": [
"error",
"single",
{ avoidEscape: true, allowTemplateLiterals: false },
],
"curly": ["error", "all"],
"eqeqeq": "error",
"import/order": [
"error",
{
"alphabetize": {"order": "asc"},
"groups": [
"external",
"builtin",
["internal", "sibling", "parent", "index"]
],
"distinctGroup": false,
"pathGroups": [
{pattern: "@/**", group: "internal", position: "before"}
],
"newlines-between": "always"
}
],
"prefer-arrow-callback": "error",
"no-console": ["error", {"allow": ["error", "warn", "debug"]}],
"no-duplicate-imports": "error",
},
};
================================================
FILE: .github/ISSUE_TEMPLATE/0-user-story.yml
================================================
name: '📖 User story'
description: |
Share a workflow that you would like to see improve (faster, less
frustrating, less steps, and/or less cognitive load).
labels:
- 'user story'
body:
- type: 'textarea'
attributes:
label: 'Description'
description: |
Please describe your experience clearly.
Please describe points of friction, frustration, or mental burden.
validations:
required: true
- type: 'textarea'
attributes:
label: 'Steps'
description: |
Please write a numbered list of all the steps in your story.
Please write as if you're describing what a non-GIS-professional
looking over your shoulder would see.
Please estimate the time consumed by each step, and let us know about
any steps that are particularly frustrating or rewarding.
**We would especially like to know about where you experienced
[mental context switches](https://en.wikipedia.org/wiki/Human_multitasking)
during this process.**
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/1-experience-report.yml
================================================
name: '🧪 Experience report'
description: 'Share your experience using JupyterGIS; anything goes.'
labels:
- 'experience report'
body:
- type: 'textarea'
attributes:
label: 'Description'
description: |
Please describe your experience clearly.
We'd love to hear where you experienced friction, unintuitive behavior, or joy when using JupyterGIS.
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/2-bug.yml
================================================
name: '🐞 Bug'
description: 'Any behavior that is unexpected or differs from the documentation.'
labels:
- 'bug'
body:
## Excluded for now; we're not really seeing a ton of duplicate issue
## reports, and I'd love to make reporting as approachable as possible.
# - type: "checkboxes"
# attributes:
# label: "Is there an existing issue for this?"
# description: |
# Please [:mag: search for existing issues](https://github.com/geojupyter/jupytergis/issues?q=sort%3Aupdated-desc%20is%3Aissue)
# to see if this has already been reported.
# options:
# - label: "I've searched existing issues"
# required: true
- type: 'input'
attributes:
label: 'JupyterGIS version'
description: |
In which version of JupyterGIS does this issue occur?
You can find this information on the status bar at the bottom of the JupyterGIS window.
validations:
required: false
- type: 'textarea'
attributes:
label: 'Description'
description: |
Please describe the issue clearly.
For best results, include a reproducible example or a screenshot/video of the issue.
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/3-docs.yml
================================================
name: '📃 Documentation'
description: 'Anything that could be improved about our documentation.'
labels:
- 'documentation'
body:
## Excluded for now; we're not really seeing a ton of duplicate issue
## reports, and I'd love to make reporting as approachable as possible.
# - type: "checkboxes"
# attributes:
# label: "Is there an existing issue for this?"
# description: |
# Please [:mag: search for existing issues](https://github.com/geojupyter/jupytergis/issues?q=sort%3Aupdated-desc%20is%3Aissue)
# to see if this has already been reported.
# options:
# - label: "I've searched existing issues"
# required: true
- type: 'textarea'
attributes:
label: 'Description'
description: |
Please describe the issue clearly.
If you're reporting an issue with an existing page, please link to it.
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/4-feature-request.yml
================================================
name: '🚀 Feature Request'
description: 'New features you would like to see.'
labels:
- 'enhancement'
body:
- type: 'textarea'
attributes:
label: 'Use case'
description: |
Please describe for which use case this feature would help.
validations:
required: true
- type: 'textarea'
attributes:
label: 'Preferred solution'
description: |
Please describe your preferred solution if you have any.
validations:
required: false
- type: 'textarea'
attributes:
label: 'Alternative solutions'
description: |
Please describe alternative solutions if you have any.
validations:
required: false
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: true
contact_links:
- name: '🌟 Community support'
url: 'https://jupyter.zulipchat.com/#narrow/channel/471314-geojupyter'
about: 'Explore our open Zulip chat to ask questions, share insights, and connect with other JupyterGIS users.'
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: 'github-actions'
directory: '/'
schedule:
interval: 'monthly'
cooldown:
default-days: 7
groups:
gha-dependencies:
patterns:
- '*'
================================================
FILE: .github/pull_request_template.md
================================================
## Description
<!--
Insert Pull Request description here.
What does this PR change? Why?
-->
## Checklist
- [ ] PR has a descriptive title and content.
- [ ] PR description contains [references](https://docs.github.com/en/issues/tracking-your-work-with-issues/using-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword) to any issues the PR resolves, e.g. `Resolves #XXX`.
- [ ] PR has one of the labels: documentation, bug, enhancement, feature, maintenance
- [ ] Checks are passing.
Failing lint checks can be resolved with:
- `pre-commit run --all-files`
- `jlpm run lint`
- [ ] If you wish to be cited for your contribution, `CITATION.cff` contains an [author entry](https://github.com/citation-file-format/citation-file-format/blob/main/schema-guide.md#definitionsperson) for yourself
================================================
FILE: .github/workflows/binder-on-pr.yml
================================================
name: Binder Badge
on:
pull_request_target:
types: [opened]
jobs:
binder:
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
- uses: jupyterlab/maintainer-tools/.github/actions/binder-link@7bebe19dab1c58587eb734aca9184d8e59fdf911 # v1
with:
github_token: ${{ secrets.github_token }}
================================================
FILE: .github/workflows/build-test-without-lockfile.yml
================================================
name: Test-build without lockfile
on:
push:
branches: main
pull_request:
branches: '*'
permissions: {}
jobs:
test_build_without_lockfile:
name: Test-build without lockfile
runs-on: ubuntu-latest
steps:
- name: Install Conda environment with Micromamba
uses: mamba-org/setup-micromamba@add3a49764cedee8ee24e82dfde87f5bc2914462 # v2
with:
environment-name: gis
create-args: >-
pip
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
persist-credentials: false
- name: Install build deps
shell: bash -l {0}
run: pip install --group build
- name: Test build without lockfile
shell: bash -l {0}
run: |
rm yarn.lock
jlpm
jlpm run build:prod
================================================
FILE: .github/workflows/build.yml
================================================
name: Build
on:
push:
branches: main
pull_request:
branches: '*'
workflow_dispatch:
jobs:
build:
name: Build jupytergis
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ['3.12', '3.14']
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
persist-credentials: false
- name: Install Conda environment with Micromamba
uses: mamba-org/setup-micromamba@add3a49764cedee8ee24e82dfde87f5bc2914462 # v2
with:
environment-name: gis
create-args: >-
python=${{ matrix.python-version }}
pip
- name: Setup pip cache
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5
with:
path: ~/.cache/pip
key: pip-${{ matrix.python-version }}-${{ hashFiles('package.json') }}
restore-keys: |
pip-${{ matrix.python-version }}-
pip-
- name: Install build dependencies
shell: bash -l {0}
run: pip install --group build
- name: Get yarn cache directory path
id: yarn-cache-dir-path
shell: bash -l {0}
run: |
set -e
CACHE_DIR="$(jlpm config get cacheFolder)"
echo "dir=${CACHE_DIR}" >> $GITHUB_OUTPUT
- name: Setup yarn cache
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5
id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: yarn-${{ hashFiles('yarn.lock') }}
restore-keys: |
yarn-
- name: Build the extension
shell: bash -l {0}
run: |
set -eux
jlpm install
jlpm dev
jupyter labextension list 2>&1 | grep -ie "jupytergis-core.*OK"
jupyter labextension list 2>&1 | grep -ie "jupytergis-lab.*OK"
- name: Package the extension
shell: bash -l {0}
run: |
set -eux
jlpm build:packages
- name: Upload extension packages
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7
with:
name: ${{ matrix.python-version == '3.12' && 'extension-artifacts' || format('extension-artifacts-{0}', matrix.python-version) }}
path: |
python/jupytergis/dist/jupytergis*
python/jupytergis_core/dist/jupytergis*
python/jupytergis_lab/dist/jupytergis*
python/jupytergis_qgis/dist/jupytergis*
python/jupytergis_lite/dist/jupytergis*
if-no-files-found: error
validate-examples:
name: Validate example .jGIS files
runs-on: ubuntu-latest
needs: build
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
persist-credentials: false
- name: Install Conda environment with Micromamba
uses: mamba-org/setup-micromamba@add3a49764cedee8ee24e82dfde87f5bc2914462 # v2
with:
environment-name: gis
create-args: >-
python=3.12
yarn=3
- name: Install dependencies
shell: bash -l {0}
run: yarn install
- name: Validate example .jGIS files against schema
shell: bash -l {0}
run: node packages/schema/scripts/validate-examples.js
test_isolated:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
with:
name: extension-artifacts
- name: Install and Test
shell: bash -l {0}
run: |
set -eux
# Remove NodeJS, twice to take care of system and locally installed node versions.
sudo rm -rf $(which node)
sudo rm -rf $(which node)
cp ./jupytergis/dist/jupytergis*.whl ./jupytergis_core/dist/jupytergis*.whl ./jupytergis_lab/dist/jupytergis*.whl ./jupytergis_qgis/dist/jupytergis*.whl .
python -m pip install jupytergis*.whl
jupyter labextension list
jupyter labextension list 2>&1 | grep -ie "jupytergis.*OK"
integration-tests:
name: Integration tests
needs: build
runs-on: ubuntu-latest
env:
PLAYWRIGHT_BROWSERS_PATH: ${{ github.workspace }}/pw-browsers
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
persist-credentials: false
- name: Install Conda environment with Micromamba
uses: mamba-org/setup-micromamba@add3a49764cedee8ee24e82dfde87f5bc2914462 # v2
with:
micromamba-version: '1.5.5-0'
environment-name: gis
create-args: >-
python=3.12
qgis
- name: Download extension package
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
with:
name: extension-artifacts
- name: Install the extension
shell: bash -l {0}
run: |
set -eux
cp ./jupytergis/dist/jupytergis*.whl ./jupytergis_core/dist/jupytergis*.whl ./jupytergis_lab/dist/jupytergis*.whl ./jupytergis_qgis/dist/jupytergis*.whl .
python -m pip install jupytergis*.whl
- name: Install
shell: bash -l {0}
working-directory: ui-tests
run: |
jlpm install
jlpm playwright install chromium
- name: Execute integration tests
shell: bash -l {0}
working-directory: ui-tests
run: jlpm run test
- name: Upload Playwright Test report
id: upload-galata-artifact
if: always()
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7
with:
name: jupytergis-playwright-tests
path: |
ui-tests/test-results
ui-tests/playwright-report
build-lite:
name: Build JupyterLite artifacts
needs: build
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
persist-credentials: false
- name: Install Conda environment with Micromamba
uses: mamba-org/setup-micromamba@add3a49764cedee8ee24e82dfde87f5bc2914462 # v2
with:
micromamba-version: '1.5.5-0'
environment-name: build-env
create-args: >-
python=3.12
pip
jupyterlite-core
jupyterlite-xeus
jupyter_server
specta
- name: Download extension package
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
with:
name: extension-artifacts
- name: debug
run: ls
- name: Install the extension
shell: bash -l {0}
run: |
set -eux
cp ./jupytergis_core/dist/jupytergis*.whl jupytergis_core-0.0.1-py3-none-any.whl
cp ./jupytergis_lab/dist/jupytergis*.whl jupytergis_lab-0.0.1-py3-none-any.whl
cp ./jupytergis_qgis/dist/jupytergis*.whl jupytergis_qgis-0.0.1-py3-none-any.whl
cp ./jupytergis_lite/dist/jupytergis*.whl jupytergis_lite-0.0.1-py3-none-any.whl
cp ./jupytergis/dist/jupytergis*.whl jupytergis-0.0.1-py3-none-any.whl
- name: Build JupyterLite
shell: bash -l {0}
working-directory: lite
run: |
set -eux
cp --recursive --dereference ../ui-tests/content ./content
find ./content -type d -name ".ipynb_checkpoints" -exec rm -rf {} +
jupyter lite build --contents content --output-dir dist
- name: Upload Lite artifacts
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7
with:
name: lite-artifacts
path: ./lite/dist
retention-days: 30
integration-tests-lite:
name: Integration tests Lite
needs: build-lite
runs-on: ubuntu-latest
env:
PLAYWRIGHT_BROWSERS_PATH: ${{ github.workspace }}/pw-browsers
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
persist-credentials: false
- name: Install Conda environment with Micromamba
uses: mamba-org/setup-micromamba@add3a49764cedee8ee24e82dfde87f5bc2914462 # v2
with:
micromamba-version: '1.5.5-0'
environment-name: gis
create-args: >-
python=3.9
jupyterlab
- name: Download extension package
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
with:
name: lite-artifacts
path: dist
- name: Install dependencies
shell: bash -l {0}
working-directory: ui-tests
env:
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
run: jlpm install
- name: Set up browser cache
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5
with:
path: |
${{ github.workspace }}/pw-browsers
key: ${{ runner.os }}-${{ hashFiles('ui-tests/yarn.lock') }}
- name: Install browser
shell: bash -l {0}
run: npx playwright install chromium
working-directory: ui-tests
- name: Execute integration tests
shell: bash -l {0}
working-directory: ui-tests
run: jlpm run test:lite
- name: Upload Playwright Test report
id: upload-galata-artifact
if: always()
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7
with:
name: jupytergis-lite-playwright-tests
path: |
ui-tests/test-results
ui-tests/playwright-report
================================================
FILE: .github/workflows/check-links.yml
================================================
name: Check links
on:
push:
branches: main
pull_request:
branches: '*'
permissions: {}
jobs:
check_links:
name: Check links
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
persist-credentials: false
- uses: jupyterlab/maintainer-tools/.github/actions/base-setup@7bebe19dab1c58587eb734aca9184d8e59fdf911 # v1
- uses: jupyterlab/maintainer-tools/.github/actions/check-links@7bebe19dab1c58587eb734aca9184d8e59fdf911 # v1
with:
ignore_links: >-
lite/
https://www\.npmjs\.com.*
^/.*
https://blog\.jupyter\.org/.*
https://medium\.com/.*
================================================
FILE: .github/workflows/check-release.yml
================================================
name: Check Release
on:
push:
branches:
- main
pull_request:
branches:
- main
permissions:
contents: write
jobs:
check_release:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
persist-credentials: false
- name: Base Setup
uses: jupyterlab/maintainer-tools/.github/actions/base-setup@7bebe19dab1c58587eb734aca9184d8e59fdf911 # v1
- name: Check Release
uses: jupyter-server/jupyter_releaser/.github/actions/check-release@3e74486d1011d24cd5e9977202fd349dece0db9c # v2
with:
token: ${{ secrets.GITHUB_TOKEN }}
version_spec: next
- name: Upload Distributions
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7
with:
name: jupytergis-releaser-dist-${{ github.run_number }}
path: .jupyter_releaser_checkout/dist
================================================
FILE: .github/workflows/draft-pdf.yml
================================================
name: Draft PDF
on:
push:
paths:
- paper/**
- .github/workflows/draft-pdf.yml
jobs:
paper:
runs-on: ubuntu-latest
name: Paper Draft
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
persist-credentials: false
- name: Build draft PDF
uses: openjournals/openjournals-draft-action@85a18372e48f551d8af9ddb7a747de685fbbb01c # master
with:
journal: joss
paper-path: paper/paper.md
- name: Upload
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7
with:
name: paper
path: paper/paper.pdf
================================================
FILE: .github/workflows/enforce-labels.yml
================================================
name: Enforce PR label
on:
pull_request:
types: [labeled, unlabeled, opened, edited, synchronize]
jobs:
enforce-label:
runs-on: ubuntu-latest
steps:
- name: enforce-triage-label
uses: jupyterlab/maintainer-tools/.github/actions/enforce-label@7bebe19dab1c58587eb734aca9184d8e59fdf911 # v1
================================================
FILE: .github/workflows/lint-js.yml
================================================
name: Lint JavaScript
on:
push:
branches: main
pull_request:
branches: '*'
permissions: {}
jobs:
lint-js:
name: Lint JavaScript
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
persist-credentials: false
- name: Install Conda environment with Micromamba
uses: mamba-org/setup-micromamba@add3a49764cedee8ee24e82dfde87f5bc2914462 # v2
with:
cache-environment: true
environment-name: gis
create-args: >-
pip
qgis
- name: Setup pip cache
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5
with:
path: ~/.cache/pip
key: pip-${{ matrix.python-version }}-${{ hashFiles('package.json') }}
restore-keys: |
pip-${{ matrix.python-version }}-
pip-
- name: Install Python build deps
shell: bash -l {0}
run: pip install --group build
- name: Get yarn cache directory path
id: yarn-cache-dir-path
shell: bash -l {0}
run: |
set -e
CACHE_DIR="$(jlpm config get cacheFolder)"
echo "dir=${CACHE_DIR}" >> $GITHUB_OUTPUT
- name: Setup yarn cache
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5
id: yarn-cache
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: yarn-${{ hashFiles('yarn.lock') }}
restore-keys: |
yarn-
- name: Install JS build deps
shell: bash -l {0}
run: |
set -e
jlpm install
jlpm info
# Unfortunately, we need to build to properly lint. If we don't build,
# the types for cross-package dependencies won't be available and we'll
# see false positives and negatives in our lint jobs.
- name: Build
shell: bash -l {0}
run: jlpm run build
- name: Lint
id: eslint
continue-on-error: true
shell: bash -l {0}
run: jlpm run eslint:check
- name: Check formatting
id: prettier
continue-on-error: true
shell: bash -l {0}
run: |
jlpm run prettier:check
rc=$?
if [ $rc -ne 0 ]; then
# Show what was changed -- useful if CI is reporting an error and
# local prettier run is not (╯°□°)╯︵ ┻━┻
jlpm run prettier
git diff
git restore .
fi
exit $rc
- name: Report
env:
ESLINT_OUTCOME: ${{ steps.eslint.outcome }}
PRETTIER_OUTCOME: ${{ steps.prettier.outcome }}
run: |
failed=0
if [ "${ESLINT_OUTCOME}" == "success" ]; then
echo "🎉 ESLint check passed"
else
echo "❌ ESLint check failed"
failed=1
fi
if [ "${PRETTIER_OUTCOME}" == "success" ]; then
echo "🎉 Prettier format check passed"
else
echo "❌ Prettier format check failed"
failed=1
fi
exit $failed
================================================
FILE: .github/workflows/pr-rtd-link.yml
================================================
# The ReadTheDocs preview link is "hidden" within the GitHub "Checks"
# interface. For users who don't know this, finding the preview link may be
# very difficult or frustrating. This workflow makes the link more
# findable by updating PR descriptions to include it.
name: 'Add ReadTheDocs preview link to PR description'
on:
pull_request_target:
types:
- 'opened'
permissions:
pull-requests: 'write'
jobs:
autolink-rtd-previews:
runs-on: 'ubuntu-latest'
steps:
- uses: 'mfisher87/readthedocs-actions/preview@382564110b66bee5eae9d1202b492bfe4f1adec7' # main
with:
project-slug: 'jupytergis'
message-template: |
---
📚 Documentation preview: {docs-pr-index-url}
💡 JupyterLite preview: {docs-pr-index-url}lite
💡 Specta preview: {docs-pr-index-url}lite/specta
================================================
FILE: .github/workflows/prep-release.yml
================================================
name: 'Step 1: Prep Release'
on:
workflow_dispatch:
inputs:
version_spec:
description: 'New Version Specifier'
default: 'next'
required: false
branch:
description: 'The branch to target'
required: false
post_version_spec:
description: 'Post Version Specifier'
required: false
silent:
description: "Set a placeholder in the changelog and don't publish the release."
required: false
type: boolean
since:
description: 'Use PRs with activity since this date or git reference'
required: false
since_last_stable:
description: 'Use PRs with activity since the last stable git tag'
required: false
type: boolean
jobs:
prep_release:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: jupyterlab/maintainer-tools/.github/actions/base-setup@7bebe19dab1c58587eb734aca9184d8e59fdf911 # v1
- name: Prep Release
id: prep-release
uses: jupyter-server/jupyter_releaser/.github/actions/prep-release@3e74486d1011d24cd5e9977202fd349dece0db9c # v2
with:
token: ${{ secrets.GITHUB_TOKEN }}
version_spec: ${{ github.event.inputs.version_spec }}
silent: ${{ github.event.inputs.silent }}
post_version_spec: ${{ github.event.inputs.post_version_spec }}
branch: ${{ github.event.inputs.branch }}
since: ${{ github.event.inputs.since }}
since_last_stable: ${{ github.event.inputs.since_last_stable }}
- name: '** Next Step **'
run: |
echo "Optional): Review Draft Release: ${{ steps.prep-release.outputs.release_url }}"
================================================
FILE: .github/workflows/publish-release.yml
================================================
name: 'Step 2: Publish Release'
on:
workflow_dispatch:
inputs:
branch:
description: 'The target branch'
required: false
release_url:
description: 'The URL of the draft GitHub release'
required: false
steps_to_skip:
description: 'Comma separated list of steps to skip'
required: false
jobs:
publish_release:
runs-on: ubuntu-latest
environment: release
permissions:
id-token: write
steps:
- uses: jupyterlab/maintainer-tools/.github/actions/base-setup@7bebe19dab1c58587eb734aca9184d8e59fdf911 # v1
- uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3.0.0
id: app-token
with:
app-id: ${{ vars.APP_ID }}
private-key: ${{ secrets.APP_PRIVATE_KEY }}
- name: Populate Release
id: populate-release
uses: jupyter-server/jupyter_releaser/.github/actions/populate-release@3e74486d1011d24cd5e9977202fd349dece0db9c # v2
with:
token: ${{ steps.app-token.outputs.token }}
branch: ${{ github.event.inputs.branch }}
release_url: ${{ github.event.inputs.release_url }}
steps_to_skip: ${{ github.event.inputs.steps_to_skip }}
- name: Finalize Release
id: finalize-release
uses: jupyter-server/jupyter_releaser/.github/actions/finalize-release@3e74486d1011d24cd5e9977202fd349dece0db9c # v2
with:
token: ${{ steps.app-token.outputs.token }}
release_url: ${{ steps.populate-release.outputs.release_url }}
- name: '** Next Step **'
if: ${{ success() }}
run: |
echo "Verify the final release"
echo ${{ steps.finalize-release.outputs.release_url }}
- name: '** Failure Message **'
if: ${{ failure() }}
run: |
echo "Failed to Publish the Draft Release Url:"
echo ${{ steps.populate-release.outputs.release_url }}
================================================
FILE: .github/workflows/triage-prs-to-board.yml
================================================
name: 'PR Triage Bot'
on:
schedule:
- cron: '0 * * * *'
workflow_dispatch:
jobs:
pr-triage:
runs-on: 'ubuntu-latest'
steps:
- name: 'Run PR Triage Bot'
uses: 'yuvipanda/pr-triage-board-bot@20fe5e15dc83ecff7eddffd9850f1d25518615c9'
with:
organization: 'geojupyter'
repositories: 'jupytergis'
project-number: '3'
gh-app-id: '1943749'
gh-app-installation-id: '85628873'
gh-app-private-key: '${{ secrets.GH_APP_PRIVATE_KEY }}'
================================================
FILE: .github/workflows/typecheck-python.yml
================================================
name: 'Typecheck Python (layer gallery script only)'
on:
push:
branches: 'main'
pull_request:
branches: '*'
concurrency:
group: '${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}'
cancel-in-progress: true
permissions: {}
jobs:
mypy:
runs-on: 'ubuntu-latest'
steps:
- name: 'Checkout'
uses: 'actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5' # v4
with:
persist-credentials: false
- name: 'Install the latest version of uv'
uses: 'astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78' # v7
with:
enable-cache: true
- name: 'Install dependencies'
working-directory: './scripts/layer_gallery'
run: 'uv sync'
- name: 'Run mypy'
working-directory: './scripts/layer_gallery'
run: 'uv run mypy'
================================================
FILE: .github/workflows/unit-test-js.yml
================================================
name: Unit test JavaScript
on:
push:
branches: main
pull_request:
branches: '*'
permissions: {}
jobs:
unit-test-js:
name: Run JavaScript unit tests
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
persist-credentials: false
- name: Install Conda environment with Micromamba
uses: mamba-org/setup-micromamba@add3a49764cedee8ee24e82dfde87f5bc2914462 # v2
with:
cache-environment: true
environment-name: gis
create-args: >-
pip
- name: Install Python build deps
shell: bash -l {0}
run: pip install --group build
- name: Get yarn cache directory path
id: yarn-cache-dir-path
shell: bash -l {0}
run: |
set -e
CACHE_DIR="$(jlpm config get cacheFolder)"
echo "dir=${CACHE_DIR}" >> $GITHUB_OUTPUT
- name: Setup yarn cache
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: yarn-${{ hashFiles('yarn.lock') }}
restore-keys: |
yarn-
- name: Install JS dependencies
shell: bash -l {0}
run: jlpm install
- name: Build
shell: bash -l {0}
run: jlpm run build
- name: Run unit tests
shell: bash -l {0}
run: jlpm lerna run test --scope @jupytergis/base
================================================
FILE: .github/workflows/unit-test-python.yml
================================================
name: Unit test Python
on:
push:
branches: main
pull_request:
branches: '*'
permissions: {}
jobs:
unit-test-python:
name: Run Python unit tests
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ['3.12', '3.14']
steps:
- name: Install Conda environment with Micromamba
uses: mamba-org/setup-micromamba@add3a49764cedee8ee24e82dfde87f5bc2914462 # v2
with:
environment-name: gis
create-args: >-
python=${{ matrix.python-version }}
qgis
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
persist-credentials: false
- name: Install
shell: bash -l {0}
run: python scripts/dev-install.py
- name: Install test packages
shell: bash -l {0}
run: pip install --group test
- name: Run QGIS tests
shell: bash -l {0}
run: pytest --color=yes -v python/jupytergis_qgis/jupytergis_qgis/tests
- name: Run Python API tests
shell: bash -l {0}
run: pytest --color=yes -v python/jupytergis_lab/
- name: Run layer gallery generator tests
working-directory: ./scripts/layer_gallery
shell: bash -l {0}
run: uv run pytest --color=yes -v
================================================
FILE: .github/workflows/update_galata_references.yaml
================================================
name: Update Galata References
on:
issue_comment:
types: [created, edited]
permissions:
contents: write
pull-requests: write
defaults:
run:
shell: bash -l {0}
jobs:
update-snapshots:
runs-on: ubuntu-latest
# Only run on issue comments
if: github.event.issue.pull_request && contains(github.event.comment.body, 'please update snapshots')
steps:
- uses: jupyterlab/maintainer-tools/.github/actions/update-snapshots-checkout@93556350e3433849ea434d68e8b8f7d9e9a402a4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
- name: Download extension package
uses: dawidd6/action-download-artifact@8a338493df3d275e4a7a63bcff3b8fe97e51a927 # v19
with:
pr: ${{github.event.issue.number}}
workflow: 'build.yml'
workflow_conclusion: ''
name: extension-artifacts
allow_forks: true
- name: Install Conda environment with Micromamba
uses: mamba-org/setup-micromamba@add3a49764cedee8ee24e82dfde87f5bc2914462 # v2
with:
environment-name: gis
create-args: >-
python=3.12
- name: Install the extension
shell: bash -l {0}
run: |
whereis python
cp ./jupytergis_core/dist/jupytergis*.whl ./jupytergis_lab/dist/jupytergis*.whl ./jupytergis_qgis/dist/jupytergis*.whl ./jupytergis/dist/jupytergis*.whl .
python -m pip install jupytergis*.whl
- name: Install dependencies
shell: bash -l {0}
working-directory: ui-tests
env:
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
run: |
jlpm install
jlpm playwright install
- uses: jupyterlab/maintainer-tools/.github/actions/update-snapshots@93556350e3433849ea434d68e8b8f7d9e9a402a4
with:
npm_client: jlpm
browser: chromium
github_token: ${{ secrets.GITHUB_TOKEN }}
start_server_script: 'null'
test_folder: ui-tests
================================================
FILE: .github/workflows/update_lite_galata_references.yaml
================================================
name: Update Lite Galata References
on:
issue_comment:
types: [created, edited]
permissions:
contents: write
pull-requests: write
defaults:
run:
shell: bash -l {0}
jobs:
update-lite-snapshots:
runs-on: ubuntu-latest
# Only run on issue comments
if: github.event.issue.pull_request && contains(github.event.comment.body, 'please update snapshots')
steps:
- uses: jupyterlab/maintainer-tools/.github/actions/update-snapshots-checkout@93556350e3433849ea434d68e8b8f7d9e9a402a4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
- name: Download extension package
uses: dawidd6/action-download-artifact@8a338493df3d275e4a7a63bcff3b8fe97e51a927 # v19
with:
pr: ${{github.event.issue.number}}
workflow: 'build.yml'
workflow_conclusion: ''
name: lite-artifacts
path: dist
allow_forks: true
- name: Install dependencies
shell: bash -l {0}
working-directory: ui-tests
env:
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
run: |
pip install jupyterlab
jlpm install
jlpm playwright install
- uses: jupyterlab/maintainer-tools/.github/actions/update-snapshots@93556350e3433849ea434d68e8b8f7d9e9a402a4
with:
npm_client: jlpm
browser: chromium
github_token: ${{ secrets.GITHUB_TOKEN }}
start_server_script: 'null'
test_folder: ui-tests
update_script: test:updatelite
================================================
FILE: .github/workflows/zizmor.yml
================================================
name: 'GitHub Actions Security Analysis with zizmor 🌈'
on:
push:
branches:
- 'main'
paths:
- '.github/workflows/*'
pull_request:
paths:
- '.github/workflows/*'
permissions: {}
jobs:
zizmor:
name: 'Run zizmor 🌈'
runs-on: 'ubuntu-latest'
permissions:
security-events: 'write' # Required for upload-sarif (used by zizmor-action) to upload SARIF files.
steps:
- name: 'Checkout repository'
uses: 'actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd' # v6.0.2
with:
persist-credentials: false
- name: 'Run zizmor 🌈'
uses: 'zizmorcore/zizmor-action@71321a20a9ded102f6e9ce5718a2fcec2c4f70d8' # v0.5.2
================================================
FILE: .gitignore
================================================
*.bundle.*
lib/
node_modules/
.mamba
*.egg-info/
.ipynb_checkpoints
*.tsbuildinfo
python/**/labextension
python/**/_version.py
# Created by https://www.gitignore.io/api/python
# Edit at https://www.gitignore.io/?templates=python
jupytergis/_version.py
### Python ###
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Virtual environment
.venv
# Distribution / packaging
.Python
build/
build_dir/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
.installed.cfg
*.egg
MANIFEST
_output
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/
# Translations
*.mo
*.pot
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# pyenv
.python-version
# celery beat schedule file
celerybeat-schedule
# SageMath parsed files
*.sage.py
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# Mr Developer
.mr.developer.cfg
.project
.pydevproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# End of https://www.gitignore.io/api/python
# OSX files
.DS_Store
.vscode
**/_interface/
*.db
.eslintcache
# Integration tests
**/ui-tests/test-results/
**/ui-tests/playwright-report/
examples/Untitled*.ipynb
# Hatchling
jupytergis/_version.py
.yarn
python/jupytergis_qgis/jupytergis_qgis/labextension/
python/jupytergis_lab/jupytergis_lab/labextension/
untitled*
# nx cache stuff
.nx
# GeoJSON schema
packages/schema/src/schema/geojson.json
# Schema pre-processing
packages/schema/temp-schema
# Automatically generated file for processing
packages/schema/src/processing/_generated/*
# Local example files
examples/local_examples/*
packages/base/_generated/
================================================
FILE: .nblink/environment.yml
================================================
name: gis-nblink-environment
channels:
- https://prefix.dev/emscripten-forge-4x
- https://prefix.dev/conda-forge
dependencies:
- xeus-python
- jupytergis-lite
================================================
FILE: .nblink/nblink-lock.json
================================================
{
"lockVersion": "1.0.3",
"platform": "emscripten-wasm32",
"specs": ["xeus-python", "jupytergis-lite"],
"channels": ["emscripten-forge-4x", "conda-forge"],
"channelInfo": {
"emscripten-forge-4x": [
{
"url": "https://prefix.dev/emscripten-forge-4x",
"protocol": "https"
},
{
"url": "https://repo.prefix.dev/emscripten-forge-4x",
"protocol": "https"
}
],
"conda-forge": [
{
"url": "https://prefix.dev/conda-forge",
"protocol": "https"
},
{
"url": "https://repo.prefix.dev/conda-forge",
"protocol": "https"
}
]
},
"packages": {
"xeus-python-0.18.3-py313h6852881_0.tar.bz2": {
"name": "xeus-python",
"build": "py313h6852881_0",
"version": "0.18.3",
"subdir": "emscripten-wasm32",
"channel": "emscripten-forge-4x",
"hash": {
"md5": "132d9c828e1a94bae73e5cebf60367fc",
"sha256": "364f2aebd73e32efb830643cc1dbf575161de8fda67e0d563d841d8da3936979"
},
"size": 5118148
},
"xeus-6.0.3-h0b0027f_0.tar.bz2": {
"name": "xeus",
"build": "h0b0027f_0",
"version": "6.0.3",
"subdir": "emscripten-wasm32",
"channel": "emscripten-forge-4x",
"hash": {
"md5": "7be899253a93e7458a592459ec199539",
"sha256": "54dbcd76281f08634c645f72d49bce40e409081318df7e7cb271a204b2d9cbcb"
},
"size": 310457
},
"jupytergis-lite-0.15.0-pyhd8ed1ab_0.conda": {
"name": "jupytergis-lite",
"build": "pyhd8ed1ab_0",
"version": "0.15.0",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "5f7b841ad1040bb51eb77e3fb54b0ba7",
"sha256": "271643b9b09cab9efb5483f0464f84035be9995af094a341292d0d74f320c50f"
},
"size": 10521
},
"jupytergis-lab-0.15.0-pyhd8ed1ab_0.conda": {
"name": "jupytergis-lab",
"build": "pyhd8ed1ab_0",
"version": "0.15.0",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "eb3ec91c8e307b8e4a8ef701344ecba6",
"sha256": "d90e63a2a4aa3153fe1c5e46b503385f484771928ff378ea60d23621b006e55b"
},
"size": 47268
},
"jupytergis-core-0.15.0-pyhd8ed1ab_0.conda": {
"name": "jupytergis-core",
"build": "pyhd8ed1ab_0",
"version": "0.15.0",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "0c1c35012d6735088de36c062f4c25b3",
"sha256": "526a66c1ba428fdf448a1e922b1da018f95bf7eefab5a385a97789031fe7db59"
},
"size": 13394199
},
"yjs-widgets-0.4.0-pyhd8ed1ab_0.conda": {
"name": "yjs-widgets",
"build": "pyhd8ed1ab_0",
"version": "0.4.0",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "879c55bca00674dadb16376818c1cb33",
"sha256": "398a3fc17dbeb999cce55e0557134d046c51eed9997b2475953985e9426e721f"
},
"size": 22051
},
"python-3.13.1-h_2efca29_11_cp313.tar.bz2": {
"name": "python",
"build": "h_2efca29_11_cp313",
"version": "3.13.1",
"subdir": "emscripten-wasm32",
"channel": "emscripten-forge-4x",
"hash": {
"md5": "6541a249de9b863533e745bdeeb6d346",
"sha256": "87a2f18dd094535772fba34526a2398902e0e9e385435f135932a9e563f96acb"
},
"size": 5731072
},
"xeus-python-shell-lite-0.6.6-pyhd8ed1ab_0.conda": {
"name": "xeus-python-shell-lite",
"build": "pyhd8ed1ab_0",
"version": "0.6.6",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "e053ba510540bd9f6e52a72626062e33",
"sha256": "59588e3f38120c0e4df3fa4347727f3f59fdc5e4e677aa0266eb560aa646b618"
},
"size": 7321
},
"xeus-python-shell-0.6.6-pyh332efcf_0.conda": {
"name": "xeus-python-shell",
"build": "pyh332efcf_0",
"version": "0.6.6",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "fb78d1cc085480f0d2b38fee492ff7ae",
"sha256": "dd7eb23e335e9baf5b83eadf97c751d649c6128d5fc14746399c138ff45d7349"
},
"size": 7365
},
"pyodide-http-0.2.2-pyhcf101f3_0.conda": {
"name": "pyodide-http",
"build": "pyhcf101f3_0",
"version": "0.2.2",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "fa9bbfc44b2482fb55bbb9e106958b71",
"sha256": "7e2a6f50f86910c22ab7883aa358fe1f5b4d2e2278b8f158d421c85d27057542"
},
"size": 16750
},
"xeus-python-shell-raw-0.6.6-pyhd8ed1ab_0.conda": {
"name": "xeus-python-shell-raw",
"build": "pyhd8ed1ab_0",
"version": "0.6.6",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "c753450d7e2b773bb35cfd1e2253c2c9",
"sha256": "dd308739e9531ce75f7ba20127cbe2356d00eec63610e813e8d5a06fa0f3af4c"
},
"size": 12760
},
"pyjs-rt-4.0.3-py313h690bb57_0.tar.bz2": {
"name": "pyjs-rt",
"build": "py313h690bb57_0",
"version": "4.0.3",
"subdir": "emscripten-wasm32",
"channel": "emscripten-forge-4x",
"hash": {
"md5": "f7bcdeaa0b21a61b2366095e2f41c278",
"sha256": "3906c8820e34b85bfb9d37e5a515e47dc117a71e7959654004043a6f6a9280f5"
},
"size": 46444
},
"emscripten-abi-4.0.9-h267e887_8.tar.bz2": {
"name": "emscripten-abi",
"build": "h267e887_8",
"version": "4.0.9",
"subdir": "noarch",
"channel": "emscripten-forge-4x",
"hash": {
"md5": "744cafd9d23d91fc2943a29fdbb4c6a6",
"sha256": "98cfd70341371eccfd6e186e3be1b18b2ac1cb859ecb9efb9a96303885a6bb2a"
},
"size": 13081
},
"python_abi-3.13-8_cp313.conda": {
"name": "python_abi",
"build": "8_cp313",
"version": "3.13",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "94305520c52a4aa3f6c2b1ff6008d9f8",
"sha256": "210bffe7b121e651419cb196a2a63687b087497595c9be9d20ebe97dd06060a7"
},
"size": 7002
},
"nlohmann_json-abi-3.12.0-h0f90c79_1.conda": {
"name": "nlohmann_json-abi",
"build": "h0f90c79_1",
"version": "3.12.0",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "59659d0213082bc13be8500bab80c002",
"sha256": "2a909594ca78843258e4bda36e43d165cda844743329838a29402823c8f20dec"
},
"size": 4335
},
"my-jupyter-shared-drive-0.3.0-pyhd8ed1ab_0.conda": {
"name": "my-jupyter-shared-drive",
"build": "pyhd8ed1ab_0",
"version": "0.3.0",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "e6253e4a5bc351c89b2861786ba1ec9f",
"sha256": "7a3731a70acb3756ce3919feb03824fd42e7138893bcb717fba46db654ad4459"
},
"size": 19332
},
"packaging-26.0-pyhcf101f3_0.conda": {
"name": "packaging",
"build": "pyhcf101f3_0",
"version": "26.0",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "b76541e68fea4d511b1ac46a28dcd2c6",
"sha256": "c1fc0f953048f743385d31c468b4a678b3ad20caffdeaa94bed85ba63049fd58"
},
"size": 72010
},
"ipython-9.9.0-py313h6d8a2ba_0.tar.bz2": {
"name": "ipython",
"build": "py313h6d8a2ba_0",
"version": "9.9.0",
"subdir": "emscripten-wasm32",
"channel": "emscripten-forge-4x",
"hash": {
"sha256": "7887d2b248c431a1efc18fe03e43042d05c91b103b20f0cdc221e2c5792227b3"
},
"size": 1177339
},
"backcall-0.2.0-pyh9f0ad1d_0.tar.bz2": {
"name": "backcall",
"build": "pyh9f0ad1d_0",
"version": "0.2.0",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "6006a6d08a3fa99268a2681c7fb55213",
"sha256": "ee62d6434090c1327a48551734e06bd10e65a64ef7f3b6e68719500dab0e42b9"
},
"size": 13705
},
"decorator-5.2.1-pyhd8ed1ab_0.conda": {
"name": "decorator",
"build": "pyhd8ed1ab_0",
"version": "5.2.1",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "9ce473d1d1be1cc3810856a48b3fab32",
"sha256": "c17c6b9937c08ad63cb20a26f403a3234088e57d4455600974a0ce865cb14017"
},
"size": 14129
},
"matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda": {
"name": "matplotlib-inline",
"build": "pyhd8ed1ab_0",
"version": "0.2.1",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "00e120ce3e40bad7bfc78861ce3c4a25",
"sha256": "9d690334de0cd1d22c51bc28420663f4277cfa60d34fa5cad1ce284a13f1d603"
},
"size": 15175
},
"pickleshare-0.7.5-pyhd8ed1ab_1004.conda": {
"name": "pickleshare",
"build": "pyhd8ed1ab_1004",
"version": "0.7.5",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "11a9d1d09a3615fc07c3faf79bc0b943",
"sha256": "e2ac3d66c367dada209fc6da43e645672364b9fd5f9d28b9f016e24b81af475b"
},
"size": 11748
},
"prompt-toolkit-3.0.52-pyha770c72_0.conda": {
"name": "prompt-toolkit",
"build": "pyha770c72_0",
"version": "3.0.52",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "edb16f14d920fb3faf17f5ce582942d6",
"sha256": "4817651a276016f3838957bfdf963386438c70761e9faec7749d411635979bae"
},
"size": 273927
},
"pygments-2.20.0-pyhd8ed1ab_0.conda": {
"name": "pygments",
"build": "pyhd8ed1ab_0",
"version": "2.20.0",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "16c18772b340887160c79a6acc022db0",
"sha256": "cf70b2f5ad9ae472b71235e5c8a736c9316df3705746de419b59d442e8348e86"
},
"size": 893031
},
"stack_data-0.6.3-pyhd8ed1ab_1.conda": {
"name": "stack_data",
"build": "pyhd8ed1ab_1",
"version": "0.6.3",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "b1b505328da7a6b246787df4b5a49fbc",
"sha256": "570da295d421661af487f1595045760526964f41471021056e993e73089e9c41"
},
"size": 26988
},
"traitlets-5.14.3-pyhd8ed1ab_1.conda": {
"name": "traitlets",
"build": "pyhd8ed1ab_1",
"version": "5.14.3",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "019a7385be9af33791c989871317e1ed",
"sha256": "f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959"
},
"size": 110051
},
"pexpect-4.9.0-pyhd8ed1ab_1.conda": {
"name": "pexpect",
"build": "pyhd8ed1ab_1",
"version": "4.9.0",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "d0d408b1f18883a944376da5cf8101ea",
"sha256": "202af1de83b585d36445dc1fda94266697341994d1a3328fabde4989e1b3d07a"
},
"size": 53561
},
"typing_extensions-4.15.0-pyhcf101f3_0.conda": {
"name": "typing_extensions",
"build": "pyhcf101f3_0",
"version": "4.15.0",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "0caa1af407ecff61170c9437a808404d",
"sha256": "032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731"
},
"size": 51692
},
"jupyter_ydoc-3.4.0-pyhcf101f3_0.conda": {
"name": "jupyter_ydoc",
"build": "pyhcf101f3_0",
"version": "3.4.0",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "8045a6dbb5d4c497524e436b7f3f59ad",
"sha256": "a549103fba5e76dd12adba4e7ac3a88d420b4e4bcc075e380b272f51205e4bef"
},
"size": 116968
},
"comm-0.1.4-pyhd8ed1ab_0.conda": {
"name": "comm",
"build": "pyhd8ed1ab_0",
"version": "0.1.4",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "c8eaca39e2b6abae1fc96acc929ae939",
"sha256": "11057745946a95ee7cc4c98900a60c7362266a4cb28bc97d96cd88e3056eb701"
},
"size": 11682
},
"pydantic-2.12.5-pyhcf101f3_1.conda": {
"name": "pydantic",
"build": "pyhcf101f3_1",
"version": "2.12.5",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "c3946ed24acdb28db1b5d63321dbca7d",
"sha256": "868569d9505b7fe246c880c11e2c44924d7613a8cdcc1f6ef85d5375e892f13d"
},
"size": 340482
},
"typing-extensions-4.15.0-h396c80c_0.conda": {
"name": "typing-extensions",
"build": "h396c80c_0",
"version": "4.15.0",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "edd329d7d3a4ab45dcf905899a7a6115",
"sha256": "7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c"
},
"size": 91383
},
"requests-2.33.1-pyhcf101f3_0.conda": {
"name": "requests",
"build": "pyhcf101f3_0",
"version": "2.33.1",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "10afbb4dbf06ff959ad25a92ccee6e59",
"sha256": "c0249bc4bf4c0e8e06d0e7b4d117a5d593cc4ab2144d5006d6d47c83cb0af18e"
},
"size": 63712
},
"sidecar-0.8.1-pyhd8ed1ab_0.conda": {
"name": "sidecar",
"build": "pyhd8ed1ab_0",
"version": "0.8.1",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "cfb677f6a4bd1168598ae22c494637a0",
"sha256": "3f49e3c40dde4dd8180c1f6b908a2e72538eaa370a4abb40e85cda9b24bcd26f"
},
"size": 21643
},
"ypywidgets-0.9.7-pyhd8ed1ab_0.conda": {
"name": "ypywidgets",
"build": "pyhd8ed1ab_0",
"version": "0.9.7",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "c3b6d6b2cbbb712fd87db61b2f9ba256",
"sha256": "2629f814e51dadad94a4feb3d18884ac6a85c164af2b6fe156ba9153b62a5e39"
},
"size": 11018
},
"wcwidth-0.6.0-pyhd8ed1ab_0.conda": {
"name": "wcwidth",
"build": "pyhd8ed1ab_0",
"version": "0.6.0",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "c3197f8c0d5b955c904616b716aca093",
"sha256": "e298b508b2473c4227206800dfb14c39e4b14fd79d4636132e9e1e4244cdf4aa"
},
"size": 71550
},
"asttokens-3.0.1-pyhd8ed1ab_0.conda": {
"name": "asttokens",
"build": "pyhd8ed1ab_0",
"version": "3.0.1",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "9673a61a297b00016442e022d689faa6",
"sha256": "ee4da0f3fe9d59439798ee399ef3e482791e48784873d546e706d0935f9ff010"
},
"size": 28797
},
"executing-2.2.1-pyhd8ed1ab_0.conda": {
"name": "executing",
"build": "pyhd8ed1ab_0",
"version": "2.2.1",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "ff9efb7f7469aed3c4a8106ffa29593c",
"sha256": "210c8165a58fdbf16e626aac93cc4c14dbd551a01d1516be5ecad795d2422cad"
},
"size": 30753
},
"pure_eval-0.2.3-pyhd8ed1ab_1.conda": {
"name": "pure_eval",
"build": "pyhd8ed1ab_1",
"version": "0.2.3",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "3bfdfb8dbcdc4af1ae3f9a8eb3948f04",
"sha256": "71bd24600d14bb171a6321d523486f6a06f855e75e547fa0cb2a0953b02047f0"
},
"size": 16668
},
"ptyprocess-0.7.0-pyhd8ed1ab_1.conda": {
"name": "ptyprocess",
"build": "pyhd8ed1ab_1",
"version": "0.7.0",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "7d9daffbb8d8e0af0f769dbbcd173a54",
"sha256": "a7713dfe30faf17508ec359e0bc7e0983f5d94682492469bd462cdaae9c64d83"
},
"size": 19457
},
"anyio-4.13.0-pyhcf101f3_0.conda": {
"name": "anyio",
"build": "pyhcf101f3_0",
"version": "4.13.0",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "af2df4b9108808da3dc76710fe50eae2",
"sha256": "f09aed24661cd45ba54a43772504f05c0698248734f9ae8cd289d314ac89707e"
},
"size": 146764
},
"pycrdt-0.12.50-py313h3ab680a_0.tar.bz2": {
"name": "pycrdt",
"build": "py313h3ab680a_0",
"version": "0.12.50",
"subdir": "emscripten-wasm32",
"channel": "emscripten-forge-4x",
"hash": {
"md5": "24d40ea802da6d6f91e79dbaac949c20",
"sha256": "2613d4caa3b1f6e36db5922db5a25ddb33d80e2da3898d7bad62f5e401a41ea5"
},
"size": 376830
},
"typing-inspection-0.4.2-pyhd8ed1ab_1.conda": {
"name": "typing-inspection",
"build": "pyhd8ed1ab_1",
"version": "0.4.2",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "a0a4a3035667fc34f29bfbd5c190baa6",
"sha256": "70db27de58a97aeb7ba7448366c9853f91b21137492e0b4430251a1870aa8ff4"
},
"size": 18923
},
"annotated-types-0.7.0-pyhd8ed1ab_1.conda": {
"name": "annotated-types",
"build": "pyhd8ed1ab_1",
"version": "0.7.0",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "2934f256a8acfe48f6ebb4fce6cde29c",
"sha256": "e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48"
},
"size": 18074
},
"pydantic-core-2.41.5-py313h1e85631_2.tar.bz2": {
"name": "pydantic-core",
"build": "py313h1e85631_2",
"version": "2.41.5",
"subdir": "emscripten-wasm32",
"channel": "emscripten-forge-4x",
"hash": {
"md5": "bc7a49e7ac16ed2ed88345b909d38bfe",
"sha256": "af34a25c614162ad395f5d2dd7e51dbdffeb1150ba4a0ca2db89547c2c8192e9"
},
"size": 1159917
},
"certifi-2026.2.25-pyhd8ed1ab_0.conda": {
"name": "certifi",
"build": "pyhd8ed1ab_0",
"version": "2026.2.25",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "765c4d97e877cdbbb88ff33152b86125",
"sha256": "a6b118fd1ed6099dc4fc03f9c492b88882a780fadaef4ed4f93dc70757713656"
},
"size": 151445
},
"charset-normalizer-3.4.7-pyhd8ed1ab_0.conda": {
"name": "charset-normalizer",
"build": "pyhd8ed1ab_0",
"version": "3.4.7",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "a9167b9571f3baa9d448faa2139d1089",
"sha256": "3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457"
},
"size": 58872
},
"idna-3.11-pyhd8ed1ab_0.conda": {
"name": "idna",
"build": "pyhd8ed1ab_0",
"version": "3.11",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "53abe63df7e10a6ba605dc5f9f961d36",
"sha256": "ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0"
},
"size": 50721
},
"urllib3-2.2.2-pyhd8ed1ab_0.conda": {
"name": "urllib3",
"build": "pyhd8ed1ab_0",
"version": "2.2.2",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "92cdb6fe54b78739ad70637e4f0deb07",
"sha256": "8cd972048f297b8e0601158ce352f5ca9510dda9f2706a46560220aa58b9f038"
},
"size": 95016
},
"ipywidgets-8.1.8-pyhd8ed1ab_0.conda": {
"name": "ipywidgets",
"build": "pyhd8ed1ab_0",
"version": "8.1.8",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "d68e3f70d1f068f1b66d94822fdc644e",
"sha256": "6bb58afb7eabc8b4ac0c7e92707fb498313cc0164cf04e7ba1090dbf49af514b"
},
"size": 114376
},
"reacttrs-0.2.1-pyhd8ed1ab_1.conda": {
"name": "reacttrs",
"build": "pyhd8ed1ab_1",
"version": "0.2.1",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "47eac4b432c1e5706ccf6b23aa13bc8a",
"sha256": "9b5f6a40f92d392d557335e275236e42dcf07b76d7d4616096ec3cac2b9cc290"
},
"size": 10363
},
"exceptiongroup-1.3.1-pyhd8ed1ab_0.conda": {
"name": "exceptiongroup",
"build": "pyhd8ed1ab_0",
"version": "1.3.1",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "8e662bd460bda79b1ea39194e3c4c9ab",
"sha256": "ee6cf346d017d954255bbcbdb424cddea4d14e4ed7e9813e429db1d795d01144"
},
"size": 21333
},
"cffi-2.0.0-py313h3f75574_2.tar.bz2": {
"name": "cffi",
"build": "py313h3f75574_2",
"version": "2.0.0",
"subdir": "emscripten-wasm32",
"channel": "emscripten-forge-4x",
"hash": {
"md5": "7a276e1e26d931c2824663948cf2714e",
"sha256": "d57dd1082c2dfc7fbf316f64b405f0225670b0409af181f655d12bc26dac6200"
},
"size": 142510
},
"brotli-python-1.2.0-py313ha26e73d_2.tar.bz2": {
"name": "brotli-python",
"build": "py313ha26e73d_2",
"version": "1.2.0",
"subdir": "emscripten-wasm32",
"channel": "emscripten-forge-4x",
"hash": {
"md5": "453a69143b7b2cc9925786fdf0245c57",
"sha256": "a95f7fa26ab49341cf8124c8fc0b63d59684ef18a7921701f8065e9a15e59485"
},
"size": 322484
},
"pysocks-1.7.1-py313h1804a44_3.tar.bz2": {
"name": "pysocks",
"build": "py313h1804a44_3",
"version": "1.7.1",
"subdir": "emscripten-wasm32",
"channel": "emscripten-forge-4x",
"hash": {
"md5": "57894a81ce1ffd23b77701ce0fe33aa9",
"sha256": "d6ba305a95b1ee410e2c3054a011898116dd9be4fa2a3aff6f3776bbedd8aa80"
},
"size": 23576
},
"jupyterlab_widgets-3.0.16-pyhcf101f3_1.conda": {
"name": "jupyterlab_widgets",
"build": "pyhcf101f3_1",
"version": "3.0.16",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "dbf8b81974504fa51d34e436ca7ef389",
"sha256": "5c03de243d7ae6247f39a402f4785d95e61c3be79ef18738e8f17155585d31a8"
},
"size": 216779
},
"widgetsnbextension-4.0.15-pyhd8ed1ab_0.conda": {
"name": "widgetsnbextension",
"build": "pyhd8ed1ab_0",
"version": "4.0.15",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "dc257b7e7cad9b79c1dfba194e92297b",
"sha256": "826af5e2c09e5e45361fa19168f46ff524e7a766022615678c3a670c45895d9a"
},
"size": 889195
},
"pycparser-2.22-pyh29332c3_1.conda": {
"name": "pycparser",
"build": "pyh29332c3_1",
"version": "2.22",
"subdir": "noarch",
"channel": "conda-forge",
"hash": {
"md5": "12c566707c80111f9799308d9e265aef",
"sha256": "79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6"
},
"size": 110100
}
},
"pipPackages": {},
"id": "56892554335591"
}
================================================
FILE: .pre-commit-config.yaml
================================================
ci:
# pre-commit.ci will open PRs updating our hooks once a month
autoupdate_schedule: quarterly
autofix_prs: false
exclude: '.*\.jgis$'
repos:
# Autoformat and linting, misc. details
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v6.0.0
hooks:
- id: forbid-new-submodules
- id: end-of-file-fixer
exclude: galata/.*-snapshots
- id: check-case-conflict
- id: requirements-txt-fixer
- id: check-added-large-files
args: ['--maxkb=5000']
- id: check-case-conflict
- id: check-json
- id: check-toml
- id: check-yaml
- id: debug-statements
- id: check-builtin-literals
- id: trailing-whitespace
exclude: .bumpversion.cfg
# Autoformat & lint: Python code
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.15.9
hooks:
- id: ruff
args: ['--fix', '--show-fixes', '--exit-non-zero-on-fix']
- id: ruff-format
- repo: https://github.com/rstcheck/rstcheck
rev: v6.2.5
hooks:
- id: rstcheck
args: ['--ignore-directives=jupyterlite,tabs,toctree,autoclass,cssclass,include', '--report-level=warning']
# Validate citation metadata
- repo: https://github.com/citation-file-format/cffconvert
rev: "b6045d78aac9e02b039703b030588d54d53262ac"
hooks:
- id: validate-cff
================================================
FILE: .prettierignore
================================================
node_modules
**/node_modules
.mamba
.jupyter-data
**/lib
**/*.d.ts
**/*.js
yarn.lock
*.jGIS
playwright.config.js
================================================
FILE: .prettierrc
================================================
{
"singleQuote": true,
"trailingComma": "all",
"arrowParens": "avoid",
"endOfLine": "auto"
}
================================================
FILE: .readthedocs.yaml
================================================
# See https://docs.readthedocs.io/en/stable/config-file/v2.html
version: 2
build:
os: "ubuntu-24.04"
tools:
python: "3.12"
nodejs: "24"
jobs:
# Install micromamba
pre_create_environment:
# The recommended syntax in the micromamba docs is process substitution.
# RTD's default shell chokes on it, so we're doing it in multiple steps
# instead.
- curl -L micro.mamba.pm/install.sh > /tmp/micromamba-install.sh
- chmod +x /tmp/micromamba-install.sh
# For some reason, SHELL is not set. The install script requires it.
- SHELL=/bin/bash /bin/bash /tmp/micromamba-install.sh
# Override the create_environment step (undocumented feature) to create
# multiple environments.
create_environment:
# Pin micromamba
- /bin/bash --login -c "micromamba self-update --version 2.0.7"
# Create the isolated env for building JupyterGIS
- /bin/bash --login -c "micromamba create -n jupytergis-build -c conda-forge nodejs=24 pip python=3.13"
- /bin/bash --login -c "micromamba run -n jupytergis-build pip install --group build"
# Build JupyterGIS Javascript packages; required for building the docs env
- /bin/bash --login -c "micromamba run -n jupytergis-build jlpm install"
- /bin/bash --login -c "micromamba run -n jupytergis-build jlpm build"
- /bin/bash --login -c "micromamba run -n jupytergis-build jlpm build:packages"
# Create the env for building the docs
- /bin/bash --login -c "micromamba env create -n jupytergis-docs -f docs/environment-docs.yml"
# Override the install step to do nothing - we already created the envs
install:
- "echo 'Skipping! We already have the environments we need.'"
build:
html:
- |-
/bin/bash --login -c "cd docs && micromamba run -n jupytergis-docs \
python -m sphinx --fail-on-warning --keep-going --nitpicky --show-traceback --builder html --doctree-dir _build/doctrees --define language=en . \
$READTHEDOCS_OUTPUT/html"
================================================
FILE: .yarnrc.yml
================================================
nodeLinker: node-modules
enableImmutableInstalls: false
enableScripts: false
================================================
FILE: CHANGELOG.md
================================================
# Changelog
<!-- <START NEW CHANGELOG ENTRY> -->
## 0.15.0
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.14.1...5c8116f025fca8909c49585395137e4bdfeb1036))
### Enhancements made
- Load complete STAC collections, cache filter metadata, and debounce queryable updates [#1234](https://github.com/geojupyter/jupytergis/pull/1234) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou))
- fix: MacroStrat.CartoVector gallery — carto-slim URL, Canonical symbology, new thumbnail [#1227](https://github.com/geojupyter/jupytergis/pull/1227) ([@MMesch](https://github.com/MMesch), [@HaudinFlorence](https://github.com/HaudinFlorence), [@martinRenou](https://github.com/martinRenou))
- Shorten JOSS paper [#1219](https://github.com/geojupyter/jupytergis/pull/1219) ([@SylvainCorlay](https://github.com/SylvainCorlay))
- Add Copy Coordinates option in mainView context menu [#1217](https://github.com/geojupyter/jupytergis/pull/1217) ([@nakul-py](https://github.com/nakul-py), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
- fix: hide panel scrollbars when content does not overflow [#1213](https://github.com/geojupyter/jupytergis/pull/1213) ([@MMesch](https://github.com/MMesch), [@martinRenou](https://github.com/martinRenou))
- feat: add RGBA inputs and transparent checkbox to color picker [#1211](https://github.com/geojupyter/jupytergis/pull/1211) ([@MMesch](https://github.com/MMesch), [@arjxn-py](https://github.com/arjxn-py))
- Less verbose layer creation menu items [#1202](https://github.com/geojupyter/jupytergis/pull/1202) ([@arjxn-py](https://github.com/arjxn-py), [@martinRenou](https://github.com/martinRenou))
- feat: stroke matches fill checkbox, fallback color, and OL filter for vector symbology [#1200](https://github.com/geojupyter/jupytergis/pull/1200) ([@MMesch](https://github.com/MMesch), [@arjxn-py](https://github.com/arjxn-py), [@martinRenou](https://github.com/martinRenou))
- feat: add RGBA color picker to vector symbology dialogs [#1195](https://github.com/geojupyter/jupytergis/pull/1195) ([@MMesch](https://github.com/MMesch), [@arjxn-py](https://github.com/arjxn-py), [@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou))
- Improve Graduated symbology: log breaks fix and vmin/vmax controls [#1193](https://github.com/geojupyter/jupytergis/pull/1193) ([@MMesch](https://github.com/MMesch), [@martinRenou](https://github.com/martinRenou))
- Add Natural Earth and ESRI overlay layers to gallery [#1191](https://github.com/geojupyter/jupytergis/pull/1191) ([@MMesch](https://github.com/MMesch), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
- Add D3 categorical color ramps [#1186](https://github.com/geojupyter/jupytergis/pull/1186) ([@nakul-py](https://github.com/nakul-py), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
- StopRow now supports strings values [#1183](https://github.com/geojupyter/jupytergis/pull/1183) ([@nakul-py](https://github.com/nakul-py), [@martinRenou](https://github.com/martinRenou))
- Add support for WMS layers [#1178](https://github.com/geojupyter/jupytergis/pull/1178) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou))
### Bugs fixed
- Fix version getter [#1255](https://github.com/geojupyter/jupytergis/pull/1255) ([@martinRenou](https://github.com/martinRenou))
- Focus mainview when opening specta presentation [#1240](https://github.com/geojupyter/jupytergis/pull/1240) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou))
- Fix CTRL+click not removing items from selection [#1224](https://github.com/geojupyter/jupytergis/pull/1224) ([@matyasrada](https://github.com/matyasrada), [@mfisher87](https://github.com/mfisher87), [@nakul-py](https://github.com/nakul-py))
- Reduce redundant STAC search fetches on filter panel load [#1223](https://github.com/geojupyter/jupytergis/pull/1223) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou))
- Add array into source to fix length error in Heatmap symbology. [#1220](https://github.com/geojupyter/jupytergis/pull/1220) ([@nakul-py](https://github.com/nakul-py), [@martinRenou](https://github.com/martinRenou))
- fix: use stable IDs as React keys for StopRow components [#1210](https://github.com/geojupyter/jupytergis/pull/1210) ([@MMesch](https://github.com/MMesch), [@gjmooney](https://github.com/gjmooney))
- Fix Graduated Symbology for lines [#1207](https://github.com/geojupyter/jupytergis/pull/1207) ([@arjxn-py](https://github.com/arjxn-py), [@martinRenou](https://github.com/martinRenou))
- fix: various symbology bugs [#1206](https://github.com/geojupyter/jupytergis/pull/1206) ([@MMesch](https://github.com/MMesch), [@arjxn-py](https://github.com/arjxn-py), [@martinRenou](https://github.com/martinRenou), [@nakul-py](https://github.com/nakul-py))
- Fix map projection ignored when opening .jGIS file [#1189](https://github.com/geojupyter/jupytergis/pull/1189) ([@MMesch](https://github.com/MMesch), [@elifsu-simula](https://github.com/elifsu-simula), [@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou))
- Fix Canonical symbology on VectorTile layers [#1188](https://github.com/geojupyter/jupytergis/pull/1188) ([@MMesch](https://github.com/MMesch), [@martinRenou](https://github.com/martinRenou))
### Maintenance and upkeep improvements
- Revert `handlebars` bump and set packagemanager in each `package.json` [#1232](https://github.com/geojupyter/jupytergis/pull/1232) ([@mfisher87](https://github.com/mfisher87), [@arjxn-py](https://github.com/arjxn-py), [@martinRenou](https://github.com/martinRenou), [@nakul-py](https://github.com/nakul-py))
- Replace specta link with its new home [#1231](https://github.com/geojupyter/jupytergis/pull/1231) ([@mfisher87](https://github.com/mfisher87), [@nakul-py](https://github.com/nakul-py))
- Remove `NPM_TOKEN` secret from publish workflow [#1225](https://github.com/geojupyter/jupytergis/pull/1225) ([@mfisher87](https://github.com/mfisher87), [@martinRenou](https://github.com/martinRenou))
- Update notebook.link environment [#1222](https://github.com/geojupyter/jupytergis/pull/1222) ([@martinRenou](https://github.com/martinRenou))
- Add Zizmor for GHA security auditing, fix some alerts [#1194](https://github.com/geojupyter/jupytergis/pull/1194) ([@mfisher87](https://github.com/mfisher87), [@martinRenou](https://github.com/martinRenou), [@nakul-py](https://github.com/nakul-py))
### Documentation improvements
- Acknowledgement for GeoJupyter Logo [#1229](https://github.com/geojupyter/jupytergis/pull/1229) ([@arjxn-py](https://github.com/arjxn-py), [@martinRenou](https://github.com/martinRenou))
### Other merged PRs
- Bump the gha-dependencies group with 2 updates [#1228](https://github.com/geojupyter/jupytergis/pull/1228) ([@arjxn-py](https://github.com/arjxn-py), [@mfisher87](https://github.com/mfisher87))
- Bump handlebars from 4.7.8 to 4.7.9 [#1218](https://github.com/geojupyter/jupytergis/pull/1218) ([@mfisher87](https://github.com/mfisher87))
### Contributors to this release
The following people contributed discussions, new ideas, code and documentation contributions, and review.
See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports).
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2026-03-23&to=2026-04-03&type=c))
@arjxn-py ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2026-03-23..2026-04-03&type=Issues)) | @elifsu-simula ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aelifsu-simula+updated%3A2026-03-23..2026-04-03&type=Issues)) | @gjmooney ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agjmooney+updated%3A2026-03-23..2026-04-03&type=Issues)) | @HaudinFlorence ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AHaudinFlorence+updated%3A2026-03-23..2026-04-03&type=Issues)) | @martinRenou ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2026-03-23..2026-04-03&type=Issues)) | @matyasrada ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amatyasrada+updated%3A2026-03-23..2026-04-03&type=Issues)) | @mfisher87 ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2026-03-23..2026-04-03&type=Issues)) | @MMesch ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AMMesch+updated%3A2026-03-23..2026-04-03&type=Issues)) | @nakul-py ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Anakul-py+updated%3A2026-03-23..2026-04-03&type=Issues)) | @SylvainCorlay ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3ASylvainCorlay+updated%3A2026-03-23..2026-04-03&type=Issues))
<!-- <END NEW CHANGELOG ENTRY> -->
## 0.14.1
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.14.0...ee8f7729ab9a8b454a69cff374e23b154bab6c47))
### Enhancements made
- Adjust CSS for input and button components [#1181](https://github.com/geojupyter/jupytergis/pull/1181) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou))
- Sorting Value in alphabetical order [#1180](https://github.com/geojupyter/jupytergis/pull/1180) ([@nakul-py](https://github.com/nakul-py), [@martinRenou](https://github.com/martinRenou))
- Changing Filters tab position [#1177](https://github.com/geojupyter/jupytergis/pull/1177) ([@nakul-py](https://github.com/nakul-py), [@martinRenou](https://github.com/martinRenou))
- Make gradient optional [#1167](https://github.com/geojupyter/jupytergis/pull/1167) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
### Bugs fixed
- fix: restore file browser icons for .jgis/.qgs/.qgz files [#1184](https://github.com/geojupyter/jupytergis/pull/1184) ([@costajohnt](https://github.com/costajohnt), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87), [@nakul-py](https://github.com/nakul-py))
### Maintenance and upkeep improvements
- Remove appsharing.space automation [#1179](https://github.com/geojupyter/jupytergis/pull/1179) ([@arjxn-py](https://github.com/arjxn-py), [@martinRenou](https://github.com/martinRenou))
### Other merged PRs
- Bump tar from 7.5.2 to 7.5.12 in /ui-tests [#1185](https://github.com/geojupyter/jupytergis/pull/1185) ([@mfisher87](https://github.com/mfisher87))
- Bump minimatch from 10.1.1 to 10.2.4 in /ui-tests [#1176](https://github.com/geojupyter/jupytergis/pull/1176) ([@arjxn-py](https://github.com/arjxn-py))
### Contributors to this release
The following people contributed discussions, new ideas, code and documentation contributions, and review.
See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports).
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2026-03-18&to=2026-03-23&type=c))
@arjxn-py ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2026-03-18..2026-03-23&type=Issues)) | @costajohnt ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Acostajohnt+updated%3A2026-03-18..2026-03-23&type=Issues)) | @gjmooney ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agjmooney+updated%3A2026-03-18..2026-03-23&type=Issues)) | @martinRenou ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2026-03-18..2026-03-23&type=Issues)) | @mfisher87 ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2026-03-18..2026-03-23&type=Issues)) | @nakul-py ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Anakul-py+updated%3A2026-03-18..2026-03-23&type=Issues))
## 0.14.0
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.13.3...a3df3a864055f471163626c0474591ebb682de47))
### Enhancements made
- Make layer override sections of segment editor collapsible [#1174](https://github.com/geojupyter/jupytergis/pull/1174) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou))
- Rename and Disable some commands [#1173](https://github.com/geojupyter/jupytergis/pull/1173) ([@nakul-py](https://github.com/nakul-py), [@martinRenou](https://github.com/martinRenou))
- Allow touch scrolling on mobile view & Story Panel improvements [#1166](https://github.com/geojupyter/jupytergis/pull/1166) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou))
- Add Duplicate Layer option in Layer context menu [#1152](https://github.com/geojupyter/jupytergis/pull/1152) ([@nakul-py](https://github.com/nakul-py), [@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
- Form refactor [#1147](https://github.com/geojupyter/jupytergis/pull/1147) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87), [@nakul-py](https://github.com/nakul-py))
- Source segment modifications [#1142](https://github.com/geojupyter/jupytergis/pull/1142) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
- Adjust animation when hovering on ColorRamp dropdown entries [#1141](https://github.com/geojupyter/jupytergis/pull/1141) ([@nakul-py](https://github.com/nakul-py), [@mfisher87](https://github.com/mfisher87))
- Refactor reverse ramp control into ColorRampControls component [#1139](https://github.com/geojupyter/jupytergis/pull/1139) ([@nakul-py](https://github.com/nakul-py), [@mfisher87](https://github.com/mfisher87))
- Keyboard segment change [#1137](https://github.com/geojupyter/jupytergis/pull/1137) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87), [@nakul-py](https://github.com/nakul-py))
- Presentation progress bar [#1136](https://github.com/geojupyter/jupytergis/pull/1136) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
- Refactor command arguments to enable AI prompts with JupyterGIS [#969](https://github.com/geojupyter/jupytergis/pull/969) ([@arjxn-py](https://github.com/arjxn-py), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
### Bugs fixed
- Fix Marker SVG icon rendering issue in Chrome [#1163](https://github.com/geojupyter/jupytergis/pull/1163) ([@nakul-py](https://github.com/nakul-py), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
- Improve switch appearance [#1158](https://github.com/geojupyter/jupytergis/pull/1158) ([@nakul-py](https://github.com/nakul-py), [@mfisher87](https://github.com/mfisher87))
- Add keybinding class into toolbar section [#1156](https://github.com/geojupyter/jupytergis/pull/1156) ([@nakul-py](https://github.com/nakul-py), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
- Fix symbology value selection [#1153](https://github.com/geojupyter/jupytergis/pull/1153) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
- Symbology panel: Fix initial state by restoring nclasses correctly [#1149](https://github.com/geojupyter/jupytergis/pull/1149) ([@nakul-py](https://github.com/nakul-py), [@martinRenou](https://github.com/martinRenou))
- Hydrate color ramp "reverse" state from project state [#1146](https://github.com/geojupyter/jupytergis/pull/1146) ([@nakul-py](https://github.com/nakul-py), [@mfisher87](https://github.com/mfisher87))
- Dont show segments in layer selection dropdown [#1143](https://github.com/geojupyter/jupytergis/pull/1143) ([@gjmooney](https://github.com/gjmooney), [@mfisher87](https://github.com/mfisher87))
- Specta symbology override fix [#1134](https://github.com/geojupyter/jupytergis/pull/1134) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou))
### Maintenance and upkeep improvements
- chore: replace uuid package with @lumino/coreutils UUID [#1165](https://github.com/geojupyter/jupytergis/pull/1165) ([@costajohnt](https://github.com/costajohnt), [@martinRenou](https://github.com/martinRenou), [@nakul-py](https://github.com/nakul-py))
- Re-enable strict docs build (fail on warning) [#1164](https://github.com/geojupyter/jupytergis/pull/1164) ([@mfisher87](https://github.com/mfisher87), [@gjmooney](https://github.com/gjmooney))
- Bump systeminformation from 5.27.14 to 5.31.3 in /ui-tests [#1154](https://github.com/geojupyter/jupytergis/pull/1154) ([@martinRenou](https://github.com/martinRenou))
- Bump the gha-dependencies group with 3 updates [#1145](https://github.com/geojupyter/jupytergis/pull/1145) ([@mfisher87](https://github.com/mfisher87))
### Contributors to this release
The following people contributed discussions, new ideas, code and documentation contributions, and review.
See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports).
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2026-02-20&to=2026-03-18&type=c))
@arjxn-py ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2026-02-20..2026-03-18&type=Issues)) | @costajohnt ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Acostajohnt+updated%3A2026-02-20..2026-03-18&type=Issues)) | @gjmooney ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agjmooney+updated%3A2026-02-20..2026-03-18&type=Issues)) | @martinRenou ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2026-02-20..2026-03-18&type=Issues)) | @mfisher87 ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2026-02-20..2026-03-18&type=Issues)) | @nakul-py ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Anakul-py+updated%3A2026-02-20..2026-03-18&type=Issues))
## 0.13.3
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.13.2...253446019d0c8f93e14ca679abdacb7bc82b4dea))
### Enhancements made
- Add initialSyncReady promise and defer main view until model is populated [#1130](https://github.com/geojupyter/jupytergis/pull/1130) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou))
- Add icons for removing and renaming layers in context menu [#1129](https://github.com/geojupyter/jupytergis/pull/1129) ([@nakul-py](https://github.com/nakul-py), [@martinRenou](https://github.com/martinRenou))
### Contributors to this release
The following people contributed discussions, new ideas, code and documentation contributions, and review.
See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports).
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2026-02-18&to=2026-02-20&type=c))
@gjmooney ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agjmooney+updated%3A2026-02-18..2026-02-20&type=Issues)) | @martinRenou ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2026-02-18..2026-02-20&type=Issues)) | @nakul-py ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Anakul-py+updated%3A2026-02-18..2026-02-20&type=Issues))
## 0.13.2
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.13.1...4028ebad33e66c9fb4fbe7a77a9589cd77e3a595))
### Enhancements made
- Zoom to layer on double-click [#1116](https://github.com/geojupyter/jupytergis/pull/1116) ([@nakul-py](https://github.com/nakul-py), [@martinRenou](https://github.com/martinRenou))
- Make embedded side panels draggable [#1014](https://github.com/geojupyter/jupytergis/pull/1014) ([@nakul-py](https://github.com/nakul-py), [@arjxn-py](https://github.com/arjxn-py), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
### Bugs fixed
- Scrollytelling fix [#1128](https://github.com/geojupyter/jupytergis/pull/1128) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou))
- Simplify and improve Rename/Remove logic for layers and layer groups [#1123](https://github.com/geojupyter/jupytergis/pull/1123) ([@nakul-py](https://github.com/nakul-py), [@martinRenou](https://github.com/martinRenou))
- Increase timeout for STAC browser results viewer integration test [#1120](https://github.com/geojupyter/jupytergis/pull/1120) ([@nakul-py](https://github.com/nakul-py), [@mfisher87](https://github.com/mfisher87))
- Fixing default colorRamp display bug [#1117](https://github.com/geojupyter/jupytergis/pull/1117) ([@nakul-py](https://github.com/nakul-py), [@mfisher87](https://github.com/mfisher87))
### Maintenance and upkeep improvements
- Fix openjournals/openjournals-draft-action action version [#1125](https://github.com/geojupyter/jupytergis/pull/1125) ([@martinRenou](https://github.com/martinRenou))
- Enable manually running the build workflow [#1122](https://github.com/geojupyter/jupytergis/pull/1122) ([@nakul-py](https://github.com/nakul-py), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
- Fix tests flakiness. [#1121](https://github.com/geojupyter/jupytergis/pull/1121) ([@nakul-py](https://github.com/nakul-py), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
### Documentation improvements
- Expand JupyterGIS JOSS submission to follow the updated guidelines [#1109](https://github.com/geojupyter/jupytergis/pull/1109) ([@SylvainCorlay](https://github.com/SylvainCorlay), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
### Contributors to this release
The following people contributed discussions, new ideas, code and documentation contributions, and review.
See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports).
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2026-02-12&to=2026-02-18&type=c))
@arjxn-py ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2026-02-12..2026-02-18&type=Issues)) | @gjmooney ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agjmooney+updated%3A2026-02-12..2026-02-18&type=Issues)) | @martinRenou ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2026-02-12..2026-02-18&type=Issues)) | @mfisher87 ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2026-02-12..2026-02-18&type=Issues)) | @nakul-py ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Anakul-py+updated%3A2026-02-12..2026-02-18&type=Issues)) | @SylvainCorlay ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3ASylvainCorlay+updated%3A2026-02-12..2026-02-18&type=Issues))
## 0.13.1
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.13.0...afc359c45c00ef8e31ba27af4e7e47f93ba72855))
### Bugs fixed
- UI changes not reflected in file bug fix [#1114](https://github.com/geojupyter/jupytergis/pull/1114) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou))
- UI related bug fixes and examples update [#1110](https://github.com/geojupyter/jupytergis/pull/1110) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou))
- Missed some renames [#1108](https://github.com/geojupyter/jupytergis/pull/1108) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou), [@nakul-py](https://github.com/nakul-py))
### Documentation improvements
- Fix docs build [#1115](https://github.com/geojupyter/jupytergis/pull/1115) ([@martinRenou](https://github.com/martinRenou), [@nakul-py](https://github.com/nakul-py))
- Add story map sharing section to docs [#1107](https://github.com/geojupyter/jupytergis/pull/1107) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
### Contributors to this release
The following people contributed discussions, new ideas, code and documentation contributions, and review.
See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports).
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2026-02-06&to=2026-02-12&type=c))
@gjmooney ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agjmooney+updated%3A2026-02-06..2026-02-12&type=Issues)) | @martinRenou ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2026-02-06..2026-02-12&type=Issues)) | @mfisher87 ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2026-02-06..2026-02-12&type=Issues)) | @nakul-py ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Anakul-py+updated%3A2026-02-06..2026-02-12&type=Issues))
## 0.13.0
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.12.2...e1850c15360674f0bfe65fd5c0775d12f8f82501))
### Enhancements made
- Add symbolologyState to the VectorTileLayer schema [#1106](https://github.com/geojupyter/jupytergis/pull/1106) ([@HaudinFlorence](https://github.com/HaudinFlorence), [@martinRenou](https://github.com/martinRenou))
- Add story segment symbology overrides [#1102](https://github.com/geojupyter/jupytergis/pull/1102) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou))
### Bugs fixed
- Prevent layer updates when changing selected layer [#1105](https://github.com/geojupyter/jupytergis/pull/1105) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou))
- Story map: Use theme colors as fallback when bg/text colors not set in file [#1104](https://github.com/geojupyter/jupytergis/pull/1104) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou))
### Maintenance and upkeep improvements
- Update notebook.link lock with mambajs and document how to do it [#1103](https://github.com/geojupyter/jupytergis/pull/1103) ([@martinRenou](https://github.com/martinRenou))
### Contributors to this release
The following people contributed discussions, new ideas, code and documentation contributions, and review.
See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports).
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2026-02-04&to=2026-02-06&type=c))
@gjmooney ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agjmooney+updated%3A2026-02-04..2026-02-06&type=Issues)) | @HaudinFlorence ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AHaudinFlorence+updated%3A2026-02-04..2026-02-06&type=Issues)) | @martinRenou ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2026-02-04..2026-02-06&type=Issues))
## 0.12.2
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.12.1...4ab38b642281e0e163f8ba040d0b6d7e709739a8))
### Enhancements made
- Select top layer by default [#1100](https://github.com/geojupyter/jupytergis/pull/1100) ([@gjmooney](https://github.com/gjmooney), [@SylvainCorlay](https://github.com/SylvainCorlay), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
- Add mobile-friendly story map view for specta [#1096](https://github.com/geojupyter/jupytergis/pull/1096) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou))
- Update layer gallery to support more layer types and sources [#1071](https://github.com/geojupyter/jupytergis/pull/1071) ([@HaudinFlorence](https://github.com/HaudinFlorence), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
### Bugs fixed
- Sync settings before/after opening document [#1083](https://github.com/geojupyter/jupytergis/pull/1083) ([@nakul-py](https://github.com/nakul-py), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
### Maintenance and upkeep improvements
- Bump dawidd6/action-download-artifact from 12 to 14 in the gha-dependencies group [#1099](https://github.com/geojupyter/jupytergis/pull/1099) ([@mfisher87](https://github.com/mfisher87))
### Contributors to this release
The following people contributed discussions, new ideas, code and documentation contributions, and review.
See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports).
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2026-02-02&to=2026-02-04&type=c))
@gjmooney ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agjmooney+updated%3A2026-02-02..2026-02-04&type=Issues)) | @HaudinFlorence ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AHaudinFlorence+updated%3A2026-02-02..2026-02-04&type=Issues)) | @martinRenou ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2026-02-02..2026-02-04&type=Issues)) | @mfisher87 ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2026-02-02..2026-02-04&type=Issues)) | @nakul-py ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Anakul-py+updated%3A2026-02-02..2026-02-04&type=Issues)) | @SylvainCorlay ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3ASylvainCorlay+updated%3A2026-02-02..2026-02-04&type=Issues))
## 0.12.1
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.12.0...b31da746c0497294ec5cc008ce098c0f4b7bccbc))
### Bugs fixed
- Restore functionality of zoom controls when enabled in settings [#1098](https://github.com/geojupyter/jupytergis/pull/1098) ([@mfisher87](https://github.com/mfisher87), [@nakul-py](https://github.com/nakul-py))
- Story map fixes [#1094](https://github.com/geojupyter/jupytergis/pull/1094) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou))
### Maintenance and upkeep improvements
- Update nblink lock [#1095](https://github.com/geojupyter/jupytergis/pull/1095) ([@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
### Contributors to this release
The following people contributed discussions, new ideas, code and documentation contributions, and review.
See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports).
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2026-01-28&to=2026-02-02&type=c))
@gjmooney ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agjmooney+updated%3A2026-01-28..2026-02-02&type=Issues)) | @martinRenou ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2026-01-28..2026-02-02&type=Issues)) | @mfisher87 ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2026-01-28..2026-02-02&type=Issues)) | @nakul-py ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Anakul-py+updated%3A2026-01-28..2026-02-02&type=Issues))
## 0.12.0
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.11.1...e21aa20bbf8ac0ec87b886828d77b1e634c2056f))
### Enhancements made
- Make the repository Notebook.link ready [#1090](https://github.com/geojupyter/jupytergis/pull/1090) ([@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
- Add Disable Layers setting and improve settings. [#1085](https://github.com/geojupyter/jupytergis/pull/1085) ([@nakul-py](https://github.com/nakul-py), [@mfisher87](https://github.com/mfisher87))
- Add icon for JupyterGIS setting [#1082](https://github.com/geojupyter/jupytergis/pull/1082) ([@nakul-py](https://github.com/nakul-py), [@mfisher87](https://github.com/mfisher87))
- Add a Story Map presentation mode for Specta [#1061](https://github.com/geojupyter/jupytergis/pull/1061) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou), [@trungleduc](https://github.com/trungleduc))
- Add MacroStrat tile layer to the layer browser [#1060](https://github.com/geojupyter/jupytergis/pull/1060) ([@HaudinFlorence](https://github.com/HaudinFlorence), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
- Adding manual buttons for zoom-in or zoom-out [#1055](https://github.com/geojupyter/jupytergis/pull/1055) ([@nakul-py](https://github.com/nakul-py), [@mfisher87](https://github.com/mfisher87))
- Move JOSS paper to standard directory [#1049](https://github.com/geojupyter/jupytergis/pull/1049) ([@SylvainCorlay](https://github.com/SylvainCorlay))
- Add ORCID for Greg [#1048](https://github.com/geojupyter/jupytergis/pull/1048) ([@SylvainCorlay](https://github.com/SylvainCorlay))
- Add content for JOSS submission [#1045](https://github.com/geojupyter/jupytergis/pull/1045) ([@SylvainCorlay](https://github.com/SylvainCorlay), [@mfisher87](https://github.com/mfisher87))
- Support STAC spec filter extension [#1035](https://github.com/geojupyter/jupytergis/pull/1035) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou))
### Bugs fixed
- Add Story mode presentation toggle button to toolbar [#1056](https://github.com/geojupyter/jupytergis/pull/1056) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou))
- Fix Zooming in or out with keys. [#1051](https://github.com/geojupyter/jupytergis/pull/1051) ([@nakul-py](https://github.com/nakul-py), [@mfisher87](https://github.com/mfisher87))
- Fix SingleBand pseudocolor band selector bug, index bands from 1 [#998](https://github.com/geojupyter/jupytergis/pull/998) ([@nakul-py](https://github.com/nakul-py), [@mfisher87](https://github.com/mfisher87))
### Maintenance and upkeep improvements
- Pin jupytext in docs build: bring back our icons [#1092](https://github.com/geojupyter/jupytergis/pull/1092) ([@martinRenou](https://github.com/martinRenou))
- Fix file loading [#1091](https://github.com/geojupyter/jupytergis/pull/1091) ([@martinRenou](https://github.com/martinRenou), [@gjmooney](https://github.com/gjmooney))
- Divide image sizes per two [#1089](https://github.com/geojupyter/jupytergis/pull/1089) ([@martinRenou](https://github.com/martinRenou))
- Optimize pngs in the repository and remove GIFs [#1088](https://github.com/geojupyter/jupytergis/pull/1088) ([@martinRenou](https://github.com/martinRenou))
- Remove unused geotiff example file [#1087](https://github.com/geojupyter/jupytergis/pull/1087) ([@martinRenou](https://github.com/martinRenou))
- Pin sphinx to 8.x to fix docs build [#1086](https://github.com/geojupyter/jupytergis/pull/1086) ([@mfisher87](https://github.com/mfisher87), [@nakul-py](https://github.com/nakul-py))
- Bot: Use official jupyterlab/maintainer-tools action [#1076](https://github.com/geojupyter/jupytergis/pull/1076) ([@martinRenou](https://github.com/martinRenou))
- Bot: Reuse more action steps from maintainer tools [#1074](https://github.com/geojupyter/jupytergis/pull/1074) ([@martinRenou](https://github.com/martinRenou))
- Bot: Reusable workflow for checking permissions [#1072](https://github.com/geojupyter/jupytergis/pull/1072) ([@martinRenou](https://github.com/martinRenou))
- Bot: Missing token [#1070](https://github.com/geojupyter/jupytergis/pull/1070) ([@martinRenou](https://github.com/martinRenou))
- Bot: provide negative response if the user has no permission [#1069](https://github.com/geojupyter/jupytergis/pull/1069) ([@martinRenou](https://github.com/martinRenou))
- Fix bot permission handling [#1067](https://github.com/geojupyter/jupytergis/pull/1067) ([@martinRenou](https://github.com/martinRenou))
- Focus on map without click on map while zooming [#1053](https://github.com/geojupyter/jupytergis/pull/1053) ([@nakul-py](https://github.com/nakul-py), [@mfisher87](https://github.com/mfisher87))
- Bump the gha-dependencies group across 1 directory with 5 updates [#1052](https://github.com/geojupyter/jupytergis/pull/1052) ([@mfisher87](https://github.com/mfisher87))
- Add GitHub action checking build of JOSS paper [#1050](https://github.com/geojupyter/jupytergis/pull/1050) ([@SylvainCorlay](https://github.com/SylvainCorlay))
- Add CITATION.cff for citing JupyterGIS and auto-minting Zenodo DOIs for each release [#1046](https://github.com/geojupyter/jupytergis/pull/1046) ([@mfisher87](https://github.com/mfisher87), [@arjxn-py](https://github.com/arjxn-py), [@matthewfeickert](https://github.com/matthewfeickert), [@pblottiere](https://github.com/pblottiere))
### Documentation improvements
- Add UI testing how-tos and explanation [#1066](https://github.com/geojupyter/jupytergis/pull/1066) ([@mfisher87](https://github.com/mfisher87), [@nakul-py](https://github.com/nakul-py))
- Add Europe Demo example [#1043](https://github.com/geojupyter/jupytergis/pull/1043) ([@arjxn-py](https://github.com/arjxn-py), [@martinRenou](https://github.com/martinRenou))
### Other merged PRs
- Bot: More reusable action steps [#1075](https://github.com/geojupyter/jupytergis/pull/1075) ([@martinRenou](https://github.com/martinRenou))
### Contributors to this release
The following people contributed discussions, new ideas, code and documentation contributions, and review.
See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports).
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2025-12-18&to=2026-01-28&type=c))
@arjxn-py ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2025-12-18..2026-01-28&type=Issues)) | @gjmooney ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agjmooney+updated%3A2025-12-18..2026-01-28&type=Issues)) | @HaudinFlorence ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AHaudinFlorence+updated%3A2025-12-18..2026-01-28&type=Issues)) | @martinRenou ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2025-12-18..2026-01-28&type=Issues)) | @matthewfeickert ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amatthewfeickert+updated%3A2025-12-18..2026-01-28&type=Issues)) | @mfisher87 ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2025-12-18..2026-01-28&type=Issues)) | @nakul-py ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Anakul-py+updated%3A2025-12-18..2026-01-28&type=Issues)) | @pblottiere ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Apblottiere+updated%3A2025-12-18..2026-01-28&type=Issues)) | @SylvainCorlay ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3ASylvainCorlay+updated%3A2025-12-18..2026-01-28&type=Issues)) | @trungleduc ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Atrungleduc+updated%3A2025-12-18..2026-01-28&type=Issues))
## 0.11.1
No merged PRs
## 0.11.0
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.10.1...2896ba993d49e66bda70e7aae50490c4a4524ced))
### Enhancements made
- Update jupyter-collaboration [#1040](https://github.com/geojupyter/jupytergis/pull/1040) ([@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
- Add radio and dialog components [#1005](https://github.com/geojupyter/jupytergis/pull/1005) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou))
- Add story maps [#994](https://github.com/geojupyter/jupytergis/pull/994) ([@gjmooney](https://github.com/gjmooney), [@martinRenou](https://github.com/martinRenou), [@mfisher87](https://github.com/mfisher87))
### Bugs fixed
- Remove `nclasses` and `mode` from `symbologyState` for categorized symbology [#1029](https://github.com/geojupyter/jupytergis/pull/1029) ([@nakul-py](https://github.com/nakul-py), [@mfisher87](https://github.com/mfisher87))
### Maintenance and upkeep improvements
- Add CI test run for fresh yarn lock [#1041](https://github.com/geojupyter/jupytergis/pull/1041) ([@martinRenou](https://github.com/martinRenou))
- Using raw github url for image [#1039](https://github.com/geojupyter/jupytergis/pull/1039) ([@nakul-py](https://github.com/nakul-py), [@arjxn-py](https://github.com/arjxn-py))
- Correct spelling mistakes [#1036](https://github.com/geojupyter/jupytergis/pull/1036) ([@EdwardBetts](https://github.com/EdwardBetts), [@mfisher87](https://github.com/mfisher87))
- Improve PyPI metadata and classifiers [#1032](https://github.com/geojupyter/jupytergis/pull/1032) ([@ktaletsk](https://github.com/ktaletsk), [@mfisher87](https://github.com/mfisher87))
### Contributors to this release
The following people contributed discussions, new ideas, code and documentation contributions, and review.
See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/#how-does-this-tool-define-contributions-in-the-reports).
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2025-12-05&to=2025-12-18&type=c))
@arjxn-py ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2025-12-05..2025-12-18&type=Issues)) | @EdwardBetts ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AEdwardBetts+updated%3A2025-12-05..2025-12-18&type=Issues)) | @gjmooney ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agjmooney+updated%3A2025-12-05..2025-12-18&type=Issues)) | @krassowski ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Akrassowski+updated%3A2025-12-05..2025-12-18&type=Issues)) | @ktaletsk ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aktaletsk+updated%3A2025-12-05..2025-12-18&type=Issues)) | @martinRenou ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2025-12-05..2025-12-18&type=Issues)) | @mfisher87 ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2025-12-05..2025-12-18&type=Issues)) | @nakul-py ([activity](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Anakul-py+updated%3A2025-12-05..2025-12-18&type=Issues))
## 0.10.1
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.10.0...0109921f4ec34eef5e56a386a157ac6c06551698))
### Bugs fixed
- Fix symbology bugs with GeoJSON layers added by Python API [#1023](https://github.com/geojupyter/jupytergis/pull/1023) ([@mfisher87](https://github.com/mfisher87))
### Maintenance and upkeep improvements
- Upper bound (exclusive) JupyterLab at 4.5.0 [#1019](https://github.com/geojupyter/jupytergis/pull/1019) ([@mfisher87](https://github.com/mfisher87))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2025-12-04&to=2025-12-05&type=c))
[@mfisher87](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2025-12-04..2025-12-05&type=Issues)
## 0.10.0
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.9.2...557ee59b2e78f978ed0de7b6868d5b21b31e43ae))
### Enhancements made
- Remove undo/redo buttons [#984](https://github.com/geojupyter/jupytergis/pull/984) ([@gjmooney](https://github.com/gjmooney))
- Make side panel tabs list scrollable [#970](https://github.com/geojupyter/jupytergis/pull/970) ([@gjmooney](https://github.com/gjmooney))
- Allow adding markers to the map [#965](https://github.com/geojupyter/jupytergis/pull/965) ([@gjmooney](https://github.com/gjmooney)), [#986](https://github.com/geojupyter/jupytergis/pull/986) ([@gjmooney](https://github.com/gjmooney)), [#985](https://github.com/geojupyter/jupytergis/pull/985) ([@nakul-py](https://github.com/nakul-py))
- Add labels for geoTiffSource 'normalize' and 'wrapX' options [#964](https://github.com/geojupyter/jupytergis/pull/964) ([@nakul-py](https://github.com/nakul-py))
- Support legends for heatmaps [#956](https://github.com/geojupyter/jupytergis/pull/956) ([@nakul-py](https://github.com/nakul-py))
- Support 'hsv', 'picnic', 'rainbow-soft', 'cubehelix' colormaps [#922](https://github.com/geojupyter/jupytergis/pull/922) ([@nakul-py](https://github.com/nakul-py))
- Support non-numeric attributes in categorized rendering [#977](https://github.com/geojupyter/jupytergis/pull/977) ([@arjxn-py](https://github.com/arjxn-py))
### Bugs fixed
- Enable layers with embedded GeoJSON to use graduated, categorized, and canonical symbology [#1020](https://github.com/geojupyter/jupytergis/pull/1020) ([@mfisher87](https://github.com/mfisher87))
- Fix symbology for newly created layers [#1013](https://github.com/geojupyter/jupytergis/pull/1013) ([@martinRenou](https://github.com/martinRenou))
- Fix bug causing layer selection to alter sources [#992](https://github.com/geojupyter/jupytergis/pull/992) ([@gjmooney](https://github.com/gjmooney))
- Display side panels in full screen view [#979](https://github.com/geojupyter/jupytergis/pull/979) ([@gjmooney](https://github.com/gjmooney))
- Resolve some browser errors [#971](https://github.com/geojupyter/jupytergis/pull/971) ([@gjmooney](https://github.com/gjmooney))
- In graduated symbology mode, remove static fill color field and fix stroke color field [#952](https://github.com/geojupyter/jupytergis/pull/952) ([@nakul-py](https://github.com/nakul-py))
- Fix color ramp gradient cut off, add labels [#950](https://github.com/geojupyter/jupytergis/pull/950) ([@nakul-py](https://github.com/nakul-py))
### Maintenance and upkeep improvements
- Fix hatchling build errors [#1010](https://github.com/geojupyter/jupytergis/pull/1010) ([@martinRenou](https://github.com/martinRenou))
- CI: Quiet spurious errors caused by link check job [#1003](https://github.com/geojupyter/jupytergis/pull/1003) ([@arjxn-py](https://github.com/arjxn-py)), [#944](https://github.com/geojupyter/jupytergis/pull/944) ([@mfisher87](https://github.com/mfisher87)), [#943](https://github.com/geojupyter/jupytergis/pull/943) ([@mfisher87](https://github.com/mfisher87))
- Remove duplicate `classificationModes.ts` file [#1000](https://github.com/geojupyter/jupytergis/pull/1000) ([@nakul-py](https://github.com/nakul-py))
- Improve typing [#967](https://github.com/geojupyter/jupytergis/pull/967) ([@gaolinai8888](https://github.com/gaolinai8888)), [#937](https://github.com/geojupyter/jupytergis/pull/937) ([@nakul-py](https://github.com/nakul-py))
- Rename files and add comments [#955](https://github.com/geojupyter/jupytergis/pull/955) ([@nakul-py](https://github.com/nakul-py))
- Fix docs build warnings [#954](https://github.com/geojupyter/jupytergis/pull/954) ([@mfisher87](https://github.com/mfisher87)), [#953](https://github.com/geojupyter/jupytergis/pull/953) ([@arjxn-py](https://github.com/arjxn-py))
- Security: Disable lifecycle scripts for Yarn [#932](https://github.com/geojupyter/jupytergis/pull/932) ([@mfisher87](https://github.com/mfisher87))
- Add PR triage board & automation [#931](https://github.com/geojupyter/jupytergis/pull/931) ([@mfisher87](https://github.com/mfisher87)), [#930](https://github.com/geojupyter/jupytergis/pull/930) ([@mfisher87](https://github.com/mfisher87)), [#929](https://github.com/geojupyter/jupytergis/pull/929) ([@mfisher87](https://github.com/mfisher87)), [#924](https://github.com/geojupyter/jupytergis/pull/924) ([@mfisher87](https://github.com/mfisher87)), [#923](https://github.com/geojupyter/jupytergis/pull/923) ([@mfisher87](https://github.com/mfisher87))
- Lint: Forbid unnecessary type assertions [#933](https://github.com/geojupyter/jupytergis/pull/933) ([@mfisher87](https://github.com/mfisher87))
- Lint: Forbid `console.log` and `console.info` [#835](https://github.com/geojupyter/jupytergis/pull/835) ([@mfisher87](https://github.com/mfisher87))
### Documentation improvements
- Document how to deploy JupyterGIS with JupyterLite [#976](https://github.com/geojupyter/jupytergis/pull/976) ([@arjxn-py](https://github.com/arjxn-py))
- Update development setup doc to require Micromamba installation [#962](https://github.com/geojupyter/jupytergis/pull/962) ([@gaolinai8888](https://github.com/gaolinai8888))
- Create new top-level "overview" section in docs, note lack of collaboration support in JupyterLite [#921](https://github.com/geojupyter/jupytergis/pull/921) ([@mfisher87](https://github.com/mfisher87))
- Exclude unsupported files from JupyterLite build in documentation site [#919](https://github.com/geojupyter/jupytergis/pull/919) ([@arjxn-py](https://github.com/arjxn-py))
- Add contributor docs troubleshooting entry for `.yarn-state.yml` CI failure [#915](https://github.com/geojupyter/jupytergis/pull/915) ([@mfisher87](https://github.com/mfisher87))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2025-09-05&to=2025-12-04&type=c))
[@agriyakhetarpal](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aagriyakhetarpal+updated%3A2025-09-05..2025-12-04&type=Issues) | [@arjxn-py](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2025-09-05..2025-12-04&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Adependabot+updated%3A2025-09-05..2025-12-04&type=Issues) | [@gaolinai8888](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agaolinai8888+updated%3A2025-09-05..2025-12-04&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agithub-actions+updated%3A2025-09-05..2025-12-04&type=Issues) | [@gjmooney](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agjmooney+updated%3A2025-09-05..2025-12-04&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2025-09-05..2025-12-04&type=Issues) | [@mfisher87](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2025-09-05..2025-12-04&type=Issues) | [@nakul-py](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Anakul-py+updated%3A2025-09-05..2025-12-04&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Apre-commit-ci+updated%3A2025-09-05..2025-12-04&type=Issues)
## 0.9.2
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.9.1...fc35e76946d0fc9a0c53528531ee56de9e0c4987))
### Enhancements made
- Add cmocean colormaps, fix bug when switching render type [#886](https://github.com/geojupyter/jupytergis/pull/886) ([@nakul-py](https://github.com/nakul-py))
### Bugs fixed
- Notebook Renderer: make `formSchemaRegistry` a required property [#918](https://github.com/geojupyter/jupytergis/pull/918) ([@arjxn-py](https://github.com/arjxn-py))
### Maintenance and upkeep improvements
- Bump the gha-dependencies group with 2 updates [#914](https://github.com/geojupyter/jupytergis/pull/914) ([@dependabot](https://github.com/dependabot))
### Documentation improvements
- JupyterLite deployment: Disable caching content [#913](https://github.com/geojupyter/jupytergis/pull/913) ([@martinRenou](https://github.com/martinRenou))
- Updated and organized ipynb examples directory for clarity [#872](https://github.com/geojupyter/jupytergis/pull/872) ([@mapninja](https://github.com/mapninja))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2025-08-27&to=2025-09-05&type=c))
[@arjxn-py](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2025-08-27..2025-09-05&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Adependabot+updated%3A2025-08-27..2025-09-05&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agithub-actions+updated%3A2025-08-27..2025-09-05&type=Issues) | [@mapninja](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amapninja+updated%3A2025-08-27..2025-09-05&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2025-08-27..2025-09-05&type=Issues) | [@mfisher87](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2025-08-27..2025-09-05&type=Issues) | [@nakul-py](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Anakul-py+updated%3A2025-08-27..2025-09-05&type=Issues)
## 0.9.1
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.9.0...5a70634d47a9fc2d3ed4dde6d5fb722cf75d659c))
### Enhancements made
- Add some information to the user on how to use the identify tool [#909](https://github.com/geojupyter/jupytergis/pull/909) ([@martinRenou](https://github.com/martinRenou))
### Bugs fixed
- Fix double click bug while identifying vectorTileLayers [#908](https://github.com/geojupyter/jupytergis/pull/908) ([@arjxn-py](https://github.com/arjxn-py))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2025-08-27&to=2025-08-27&type=c))
[@arjxn-py](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2025-08-27..2025-08-27&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agithub-actions+updated%3A2025-08-27..2025-08-27&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2025-08-27..2025-08-27&type=Issues)
## 0.9.0
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.8.1...a1c9126e1dc406ae736283cdd849d57388ba17b5))
### Enhancements made
- Identify panel: try to infer the feature name instead of showing the default "Feature X" name [#906](https://github.com/geojupyter/jupytergis/pull/906) ([@martinRenou](https://github.com/martinRenou))
- Adding Checkbox for reverse Color Ramp [#904](https://github.com/geojupyter/jupytergis/pull/904) ([@nakul-py](https://github.com/nakul-py))
- Lazy load gdal [#901](https://github.com/geojupyter/jupytergis/pull/901) ([@martinRenou](https://github.com/martinRenou))
- Automatically switch to identify panel when identifying [#900](https://github.com/geojupyter/jupytergis/pull/900) ([@arjxn-py](https://github.com/arjxn-py))
- Introduce settings to optionally disable some features (filtering/annotations etc) [#898](https://github.com/geojupyter/jupytergis/pull/898) ([@arjxn-py](https://github.com/arjxn-py))
- Fix Overlapping of Panels on smaller screens [#896](https://github.com/geojupyter/jupytergis/pull/896) ([@arjxn-py](https://github.com/arjxn-py))
- Rename "Identify Features" panel tab -> "Identified Features" (#893) [#895](https://github.com/geojupyter/jupytergis/pull/895) ([@Gauss-Taylor-Euler](https://github.com/Gauss-Taylor-Euler))
- Legends for Vector Layers [#880](https://github.com/geojupyter/jupytergis/pull/880) ([@arjxn-py](https://github.com/arjxn-py))
### Bugs fixed
- Don't hardcode geojson feature projection [#903](https://github.com/geojupyter/jupytergis/pull/903) ([@gjmooney](https://github.com/gjmooney))
- Fix geotif file loading [#884](https://github.com/geojupyter/jupytergis/pull/884) ([@gjmooney](https://github.com/gjmooney))
### Maintenance and upkeep improvements
- Avoid react-fontawesome 3.0.0 for now because of breaking change [#888](https://github.com/geojupyter/jupytergis/pull/888) ([@mfisher87](https://github.com/mfisher87))
- Add user story issue template [#883](https://github.com/geojupyter/jupytergis/pull/883) ([@mfisher87](https://github.com/mfisher87))
### Documentation improvements
- Python API documentation grammar and rendering updates [#874](https://github.com/geojupyter/jupytergis/pull/874) ([@mtaniguchiking](https://github.com/mtaniguchiking))
- Make minor text edits to 'Getting Started with JupyterGIS' markdown file [#873](https://github.com/geojupyter/jupytergis/pull/873) ([@kpdavi](https://github.com/kpdavi))
- Fix typo in docs: delete extra backtick [#868](https://github.com/geojupyter/jupytergis/pull/868) ([@jasongrout](https://github.com/jasongrout))
- Fix add_geoparquet_layer docstring bug [#867](https://github.com/geojupyter/jupytergis/pull/867) ([@giswqs](https://github.com/giswqs))
- Remove changelog list from the homepage [#864](https://github.com/geojupyter/jupytergis/pull/864) ([@giswqs](https://github.com/giswqs))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2025-08-13&to=2025-08-27&type=c))
[@arjxn-py](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2025-08-13..2025-08-27&type=Issues) | [@Gauss-Taylor-Euler](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AGauss-Taylor-Euler+updated%3A2025-08-13..2025-08-27&type=Issues) | [@giswqs](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agiswqs+updated%3A2025-08-13..2025-08-27&type=Issues) | [@gjmooney](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agjmooney+updated%3A2025-08-13..2025-08-27&type=Issues) | [@jasongrout](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Ajasongrout+updated%3A2025-08-13..2025-08-27&type=Issues) | [@kpdavi](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Akpdavi+updated%3A2025-08-13..2025-08-27&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2025-08-13..2025-08-27&type=Issues) | [@mfisher87](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2025-08-13..2025-08-27&type=Issues) | [@MMesch](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AMMesch+updated%3A2025-08-13..2025-08-27&type=Issues) | [@mtaniguchiking](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amtaniguchiking+updated%3A2025-08-13..2025-08-27&type=Issues) | [@nakul-py](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Anakul-py+updated%3A2025-08-13..2025-08-27&type=Issues)
## 0.8.1
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.8.0...7a8af8129738cccb8c586bdf8eee0711f5de5035))
### Enhancements made
- Add a flag to hide annotation panel [#862](https://github.com/geojupyter/jupytergis/pull/862) ([@arjxn-py](https://github.com/arjxn-py))
- Also load `.pmtiles.gz` files [#857](https://github.com/geojupyter/jupytergis/pull/857) ([@arjxn-py](https://github.com/arjxn-py))
- Add a flag to hide STAC browser [#855](https://github.com/geojupyter/jupytergis/pull/855) ([@arjxn-py](https://github.com/arjxn-py))
- Support identifying features in vector tile layers [#852](https://github.com/geojupyter/jupytergis/pull/852) ([@Gauss-Taylor-Euler](https://github.com/Gauss-Taylor-Euler))
### Documentation improvements
- Improve releasing docs [#850](https://github.com/geojupyter/jupytergis/pull/850) ([@mfisher87](https://github.com/mfisher87))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2025-08-06&to=2025-08-13&type=c))
[@arjxn-py](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2025-08-06..2025-08-13&type=Issues) | [@Gauss-Taylor-Euler](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AGauss-Taylor-Euler+updated%3A2025-08-06..2025-08-13&type=Issues) | [@mfisher87](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2025-08-06..2025-08-13&type=Issues)
## 0.8.0
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.7.0...8582f4c4604ea79801f86fc5f5f601ea5fee9771))
### Enhancements made
- Support Graduated, Categorised & Canonical Symbology on VectorTiles [#844](https://github.com/geojupyter/jupytergis/pull/844) ([@arjxn-py](https://github.com/arjxn-py))
- Enable empty path for geojson layer [#810](https://github.com/geojupyter/jupytergis/pull/810) ([@HaudinFlorence](https://github.com/HaudinFlorence))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2025-08-01&to=2025-08-06&type=c))
[@arjxn-py](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2025-08-01..2025-08-06&type=Issues) | [@HaudinFlorence](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AHaudinFlorence+updated%3A2025-08-01..2025-08-06&type=Issues) | [@mfisher87](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2025-08-01..2025-08-06&type=Issues)
## 0.7.0
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.6.2...4d0075ac0bde0b4fdd9e22b0ca62453f17a7be30))
### Enhancements made
- Change default colormap from 'cool' to 'viridis' [#828](https://github.com/geojupyter/jupytergis/pull/828) ([@mfisher87](https://github.com/mfisher87))
- Embed side panels in map view [#784](https://github.com/geojupyter/jupytergis/pull/784) ([@Gauss-Taylor-Euler](https://github.com/Gauss-Taylor-Euler))
- Add GeoParquet support [#727](https://github.com/geojupyter/jupytergis/pull/727) ([@elifsu-simula](https://github.com/elifsu-simula))
### Maintenance and upkeep improvements
- Fix bot again [#834](https://github.com/geojupyter/jupytergis/pull/834) ([@martinRenou](https://github.com/martinRenou))
- Bump form-data from 4.0.3 to 4.0.4 [#832](https://github.com/geojupyter/jupytergis/pull/832) ([@dependabot](https://github.com/dependabot))
- Cleanup examples [#822](https://github.com/geojupyter/jupytergis/pull/822) ([@martinRenou](https://github.com/martinRenou))
### Other merged PRs
- Try fixing snapshots bot [#833](https://github.com/geojupyter/jupytergis/pull/833) ([@martinRenou](https://github.com/martinRenou))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2025-07-16&to=2025-08-01&type=c))
[@arjxn-py](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2025-07-16..2025-08-01&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Adependabot+updated%3A2025-07-16..2025-08-01&type=Issues) | [@elifsu-simula](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aelifsu-simula+updated%3A2025-07-16..2025-08-01&type=Issues) | [@Gauss-Taylor-Euler](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AGauss-Taylor-Euler+updated%3A2025-07-16..2025-08-01&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agithub-actions+updated%3A2025-07-16..2025-08-01&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2025-07-16..2025-08-01&type=Issues) | [@mfisher87](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2025-07-16..2025-08-01&type=Issues) | [@MMesch](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AMMesch+updated%3A2025-07-16..2025-08-01&type=Issues)
## 0.6.2
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.6.1...86d8b46951ad45e215b75f2c16777224aabf9bce))
### Bugs fixed
- Fix processing functions [#819](https://github.com/geojupyter/jupytergis/pull/819) ([@martinRenou](https://github.com/martinRenou))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2025-07-15&to=2025-07-16&type=c))
[@github-actions](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agithub-actions+updated%3A2025-07-15..2025-07-16&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2025-07-15..2025-07-16&type=Issues)
## 0.6.1
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.6.0...d5a5451ae352fe06d1f90a5803275f47048b3036))
### Enhancements made
- Add 'New JupyterGIS Project' option to right-click context menu [#800](https://github.com/geojupyter/jupytergis/pull/800) ([@arjxn-py](https://github.com/arjxn-py))
### Bugs fixed
- Ensure correct positioning of collaborator icons [#817](https://github.com/geojupyter/jupytergis/pull/817) ([@arjxn-py](https://github.com/arjxn-py))
- Fix collaborative follow mode [#812](https://github.com/geojupyter/jupytergis/pull/812) ([@mfisher87](https://github.com/mfisher87))
- Add remove button to STAC badges [#806](https://github.com/geojupyter/jupytergis/pull/806) ([@gjmooney](https://github.com/gjmooney))
- Remove STAC platform/product selections when no longer relevant [#805](https://github.com/geojupyter/jupytergis/pull/805) ([@gjmooney](https://github.com/gjmooney))
### Maintenance and upkeep improvements
- Indicate to user when running the JS and Python type generation build steps [#798](https://github.com/geojupyter/jupytergis/pull/798) ([@mfisher87](https://github.com/mfisher87))
- Move GeoJSON source schema to correct dir [#801](https://github.com/geojupyter/jupytergis/pull/801) ([@mfisher87](https://github.com/mfisher87))
### Documentation improvements
- Add code generation documentation [#807](https://github.com/geojupyter/jupytergis/pull/807) ([@mfisher87](https://github.com/mfisher87))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2025-07-02&to=2025-07-15&type=c))
[@arjxn-py](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2025-07-02..2025-07-15&type=Issues) | [@gjmooney](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agjmooney+updated%3A2025-07-02..2025-07-15&type=Issues) | [@HaudinFlorence](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AHaudinFlorence+updated%3A2025-07-02..2025-07-15&type=Issues) | [@mfisher87](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2025-07-02..2025-07-15&type=Issues)
## 0.6.0
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.5.0...89fd8fb7cc101629f546ea1617590633287b4454))
### Enhancements made
- Increased the width of main-panel in notebook viewer [#787](https://github.com/geojupyter/jupytergis/pull/787) ([@Gauss-Taylor-Euler](https://github.com/Gauss-Taylor-Euler))
- Add OpenLayers fullscreen control to map [#764](https://github.com/geojupyter/jupytergis/pull/764) ([@mfisher87](https://github.com/mfisher87))
- Refactor of processing logic to make it less verbose. [#758](https://github.com/geojupyter/jupytergis/pull/758) ([@Gauss-Taylor-Euler](https://github.com/Gauss-Taylor-Euler))
- GEODES STAC API Search [#753](https://github.com/geojupyter/jupytergis/pull/753) ([@gjmooney](https://github.com/gjmooney))
- Create shared components [#749](https://github.com/geojupyter/jupytergis/pull/749) ([@gjmooney](https://github.com/gjmooney))
- Enhance proxy [#748](https://github.com/geojupyter/jupytergis/pull/748) ([@gjmooney](https://github.com/gjmooney))
- Processing: Bounding boxes of a vector layer(#734) [#744](https://github.com/geojupyter/jupytergis/pull/744) ([@Gauss-Taylor-Euler](https://github.com/Gauss-Taylor-Euler))
- Processing : Centroids of a vector layer [#740](https://github.com/geojupyter/jupytergis/pull/740) ([@Gauss-Taylor-Euler](https://github.com/Gauss-Taylor-Euler))
- Multiband symbology: support alpha channel & Fix band offset bug [#718](https://github.com/geojupyter/jupytergis/pull/718) ([@arjxn-py](https://github.com/arjxn-py))
- Enable Python API to add geojson layer with remote url [#715](https://github.com/geojupyter/jupytergis/pull/715) ([@arjxn-py](https://github.com/arjxn-py))
- Refactor vector symbology: Configure radius and color separately [#714](https://github.com/geojupyter/jupytergis/pull/714) ([@arjxn-py](https://github.com/arjxn-py))
- Support coloring vector features by an attribute containing a hex color code [#713](https://github.com/geojupyter/jupytergis/pull/713) ([@mfisher87](https://github.com/mfisher87))
- Auto-save project when updating any property [#708](https://github.com/geojupyter/jupytergis/pull/708) ([@arjxn-py](https://github.com/arjxn-py))
- Simplify Symbology of Vectors [#672](https://github.com/geojupyter/jupytergis/pull/672) ([@arjxn-py](https://github.com/arjxn-py))
### Bugs fixed
- Pin proj4js >=2.19.3 [#778](https://github.com/geojupyter/jupytergis/pull/778) ([@mfisher87](https://github.com/mfisher87))
- Fix LayoutRestorer entries [#743](https://github.com/geojupyter/jupytergis/pull/743) ([@martinRenou](https://github.com/martinRenou))
- Fix file rename in side panels [#736](https://github.com/geojupyter/jupytergis/pull/736) ([@Gauss-Taylor-Euler](https://github.com/Gauss-Taylor-Euler))
- Fix blank menu after selecting heatmap [#707](https://github.com/geojupyter/jupytergis/pull/707) ([@arjxn-py](https://github.com/arjxn-py))
- Support Symbology on VectorTileLayers [#703](https://github.com/geojupyter/jupytergis/pull/703) ([@arjxn-py](https://github.com/arjxn-py))
- SymbologyPanel: Eliminate need to re-classify when changing between "radius" and "color" methods [#700](https://github.com/geojupyter/jupytergis/pull/700) ([@arjxn-py](https://github.com/arjxn-py))
- Prevent duplication of color steps when reopening the symbology panel [#697](https://github.com/geojupyter/jupytergis/pull/697) ([@arjxn-py](https://github.com/arjxn-py))
- Don't Save annotation as stringified json [#637](https://github.com/geojupyter/jupytergis/pull/637) ([@arjxn-py](https://github.com/arjxn-py))
### Maintenance and upkeep improvements
- Bump dawidd6/action-download-artifact from 10 to 11 in the gha-dependencies group [#794](https://github.com/geojupyter/jupytergis/pull/794) ([@dependabot](https://github.com/dependabot))
- Add React component type annotations [#791](https://github.com/geojupyter/jupytergis/pull/791) ([@mfisher87](https://github.com/mfisher87))
- Add more explicit typing on RJSF objects [#789](https://github.com/geojupyter/jupytergis/pull/789) ([@mfisher87](https://github.com/mfisher87))
- Improve file naming consistency of schemas [#786](https://github.com/geojupyter/jupytergis/pull/786) ([@mfisher87](https://github.com/mfisher87))
- Use latest version of xeus for docs build [#771](https://github.com/geojupyter/jupytergis/pull/771) ([@Gauss-Taylor-Euler](https://github.com/Gauss-Taylor-Euler))
- Extract loading spinners to shared components [#769](https://github.com/geojupyter/jupytergis/pull/769) ([@mfisher87](https://github.com/mfisher87))
- Rename `generateScene()` -> `generateMap()` [#762](https://github.com/geojupyter/jupytergis/pull/762) ([@HaudinFlorence](https://github.com/HaudinFlorence))
- Refactor vector symbology menus: drive logic with data structure [#752](https://github.com/geojupyter/jupytergis/pull/752) ([@mfisher87](https://github.com/mfisher87))
- new feature request template [#746](https://github.com/geojupyter/jupytergis/pull/746) ([@MMesch](https://github.com/MMesch))
- Update prettier config to always use trailing commas [#731](https://github.com/geojupyter/jupytergis/pull/731) ([@mfisher87](https://github.com/mfisher87))
- Consistently sort and group all TS imports [#730](https://github.com/geojupyter/jupytergis/pull/730) ([@mfisher87](https://github.com/mfisher87))
- Support importing from path alias `@` [#728](https://github.com/geojupyter/jupytergis/pull/728) ([@mfisher87](https://github.com/mfisher87))
- Bump dawidd6/action-download-artifact from 9 to 10 in the gha-dependencies group [#726](https://github.com/geojupyter/jupytergis/pull/726) ([@dependabot](https://github.com/dependabot))
- Remove UsersItem component and use the one from `@jupyter/collaboration` [#723](https://github.com/geojupyter/jupytergis/pull/723) ([@arjxn-py](https://github.com/arjxn-py))
### Documentation improvements
- Make install docs more readable with tabs [#790](https://github.com/geojupyter/jupytergis/pull/790) ([@mfisher87](https://github.com/mfisher87))
- Minor typo fix "you can you" -> "you can use" [#779](https://github.com/geojupyter/jupytergis/pull/779) ([@tylere](https://github.com/tylere))
- Update releasing docs [#684](https://github.com/geojupyter/jupytergis/pull/684) ([@mfisher87](https://github.com/mfisher87))
- Add architecture docs [#576](https://github.com/geojupyter/jupytergis/pull/576) ([@mfisher87](https://github.com/mfisher87))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2025-05-08&to=2025-07-02&type=c))
[@arjxn-py](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2025-05-08..2025-07-02&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Adependabot+updated%3A2025-05-08..2025-07-02&type=Issues) | [@Gauss-Taylor-Euler](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AGauss-Taylor-Euler+updated%3A2025-05-08..2025-07-02&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agithub-actions+updated%3A2025-05-08..2025-07-02&type=Issues) | [@gjmooney](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agjmooney+updated%3A2025-05-08..2025-07-02&type=Issues) | [@HaudinFlorence](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AHaudinFlorence+updated%3A2025-05-08..2025-07-02&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2025-05-08..2025-07-02&type=Issues) | [@mfisher87](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2025-05-08..2025-07-02&type=Issues) | [@MMesch](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AMMesch+updated%3A2025-05-08..2025-07-02&type=Issues) | [@SylvainCorlay](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3ASylvainCorlay+updated%3A2025-05-08..2025-07-02&type=Issues) | [@trungleduc](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Atrungleduc+updated%3A2025-05-08..2025-07-02&type=Issues) | [@tylere](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Atylere+updated%3A2025-05-08..2025-07-02&type=Issues)
## 0.5.0
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.4.5...5b440ca10f1eec6fbe000aee08b889580f9c8b2d))
### Enhancements made
- Make "add layer" menus more consistent [#681](https://github.com/geojupyter/jupytergis/pull/681) ([@mfisher87](https://github.com/mfisher87))
- Make the toolbar console button a toggle button [#676](https://github.com/geojupyter/jupytergis/pull/676) ([@HaudinFlorence](https://github.com/HaudinFlorence))
- Remove "sources" panel [#671](https://github.com/geojupyter/jupytergis/pull/671) ([@arjxn-py](https://github.com/arjxn-py))
- Remove source automatically when removing layer [#670](https://github.com/geojupyter/jupytergis/pull/670) ([@arjxn-py](https://github.com/arjxn-py))
- Make collaborator cursors more prominent [#668](https://github.com/geojupyter/jupytergis/pull/668) ([@mfisher87](https://github.com/mfisher87))
- Record JupyterGIS schema version in `.jGIS` project files [#663](https://github.com/geojupyter/jupytergis/pull/663) ([@arjxn-py](https://github.com/arjxn-py))
- Enable setting CORS proxy URL in settings editor [#619](https://github.com/geojupyter/jupytergis/pull/619) ([@arjxn-py](https://github.com/arjxn-py))
### Bugs fixed
- Fix mistakes in explorer basemap names [#680](https://github.com/geojupyter/jupytergis/pull/680) ([@mfisher87](https://github.com/mfisher87))
### Maintenance and upkeep improvements
- Add issue templates: experience report, bug, docs, blank issue [#679](https://github.com/geojupyter/jupytergis/pull/679) ([@mfisher87](https://github.com/mfisher87))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2025-04-25&to=2025-05-08&type=c))
[@arjxn-py](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2025-04-25..2025-05-08&type=Issues) | [@brichet](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Abrichet+updated%3A2025-04-25..2025-05-08&type=Issues) | [@HaudinFlorence](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AHaudinFlorence+updated%3A2025-04-25..2025-05-08&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2025-04-25..2025-05-08&type=Issues) | [@mfisher87](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2025-04-25..2025-05-08&type=Issues)
## 0.4.5
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.4.4...f0e42dbe3e0e4694ee733714794070ff3d471c3e))
### Enhancements made
- Allow initializing a `GISDocument` that has a path [#666](https://github.com/geojupyter/jupytergis/pull/666) ([@davidbrochart](https://github.com/davidbrochart))
- Allow passing source ID [#660](https://github.com/geojupyter/jupytergis/pull/660) ([@davidbrochart](https://github.com/davidbrochart))
- Indicate the point being identified on GeoTiFF [#659](https://github.com/geojupyter/jupytergis/pull/659) ([@arjxn-py](https://github.com/arjxn-py))
- Some fixes in Annotation UX [#650](https://github.com/geojupyter/jupytergis/pull/650) ([@arjxn-py](https://github.com/arjxn-py))
- Interactive Identify Panel [#649](https://github.com/geojupyter/jupytergis/pull/649) ([@arjxn-py](https://github.com/arjxn-py))
- Fill vertical space in linked output & sidecar views [#643](https://github.com/geojupyter/jupytergis/pull/643) ([@SylvainCorlay](https://github.com/SylvainCorlay))
- Improved Annotation UX [#640](https://github.com/geojupyter/jupytergis/pull/640) ([@arjxn-py](https://github.com/arjxn-py))
- Use svg icons for the main view toolbar [#627](https://github.com/geojupyter/jupytergis/pull/627) ([@HaudinFlorence](https://github.com/HaudinFlorence))
- New toolbar button: Center on user's geolocation [#626](https://github.com/geojupyter/jupytergis/pull/626) ([@HaudinFlorence](https://github.com/HaudinFlorence))
- Add scrollbar to the identify panel [#614](https://github.com/geojupyter/jupytergis/pull/614) ([@arjxn-py](https://github.com/arjxn-py))
- Add `explore()` function and `GISDocument.sidecar()` method [#340](https://github.com/geojupyter/jupytergis/pull/340) ([@mfisher87](https://github.com/mfisher87))
### Bugs fixed
- Initialize map view from model's lat/lon/zoom [#665](https://github.com/geojupyter/jupytergis/pull/665) ([@davidbrochart](https://github.com/davidbrochart))
- Alphabetically sort feature properties in IdentifyPanel [#658](https://github.com/geojupyter/jupytergis/pull/658) ([@arjxn-py](https://github.com/arjxn-py))
- Some fixes in Annotation UX [#650](https://github.com/geojupyter/jupytergis/pull/650) ([@arjxn-py](https://github.com/arjxn-py))
- Try fixing layer browser ui-tests [#636](https://github.com/geojupyter/jupytergis/pull/636) ([@arjxn-py](https://github.com/arjxn-py))
- Try fixing notebook on lite by pinning `my-jupyter-shared-drive<0.2.0` [#635](https://github.com/geojupyter/jupytergis/pull/635) ([@arjxn-py](https://github.com/arjxn-py))
### Maintenance and upkeep improvements
- Try fixing layer browser ui-tests [#636](https://github.com/geojupyter/jupytergis/pull/636) ([@arjxn-py](https://github.com/arjxn-py))
- Try fixing notebook on lite by pinning `my-jupyter-shared-drive<0.2.0` [#635](https://github.com/geojupyter/jupytergis/pull/635) ([@arjxn-py](https://github.com/arjxn-py))
### Documentation improvements
- Remove work-in-progress warning from README [#633](https://github.com/geojupyter/jupytergis/pull/633) ([@arjxn-py](https://github.com/arjxn-py))
- Document how to run tests locally (and when you shouldn't) [#632](https://github.com/geojupyter/jupytergis/pull/632) ([@mfisher87](https://github.com/mfisher87))
- Add contributor how-to: Editing commands [#621](https://github.com/geojupyter/jupytergis/pull/621) ([@mfisher87](https://github.com/mfisher87))
- Fix tabs rendering in Contributor Guide [#617](https://github.com/geojupyter/jupytergis/pull/617) ([@pblottiere](https://github.com/pblottiere))
- Add collaborative session creation guide [#608](https://github.com/geojupyter/jupytergis/pull/608) ([@elifsu-simula](https://github.com/elifsu-simula))
- Add contributor how-to: Editing keybindings [#586](https://github.com/geojupyter/jupytergis/pull/586) ([@mfisher87](https://github.com/mfisher87))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2025-04-08&to=2025-04-25&type=c))
[@arjxn-py](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2025-04-08..2025-04-25&type=Issues) | [@brichet](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Abrichet+updated%3A2025-04-08..2025-04-25&type=Issues) | [@davidbrochart](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Adavidbrochart+updated%3A2025-04-08..2025-04-25&type=Issues) | [@elifsu-simula](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aelifsu-simula+updated%3A2025-04-08..2025-04-25&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agithub-actions+updated%3A2025-04-08..2025-04-25&type=Issues) | [@gjmooney](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agjmooney+updated%3A2025-04-08..2025-04-25&type=Issues) | [@HaudinFlorence](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AHaudinFlorence+updated%3A2025-04-08..2025-04-25&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2025-04-08..2025-04-25&type=Issues) | [@mfisher87](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2025-04-08..2025-04-25&type=Issues) | [@pblottiere](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Apblottiere+updated%3A2025-04-08..2025-04-25&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Apre-commit-ci+updated%3A2025-04-08..2025-04-25&type=Issues) | [@SylvainCorlay](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3ASylvainCorlay+updated%3A2025-04-08..2025-04-25&type=Issues)
## 0.4.4
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.4.3...270a3b5cbae99d6f85043430e9110f9826a26ae1))
### Bugs fixed
- Pin docprovider [#615](https://github.com/geojupyter/jupytergis/pull/615) ([@martinRenou](https://github.com/martinRenou))
- Use Accel I temporarily [#611](https://github.com/geojupyter/jupytergis/pull/611) ([@arjxn-py](https://github.com/arjxn-py))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2025-04-07&to=2025-04-08&type=c))
[@arjxn-py](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2025-04-07..2025-04-08&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agithub-actions+updated%3A2025-04-07..2025-04-08&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2025-04-07..2025-04-08&type=Issues)
## 0.4.3
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.4.2...10924070d7cd747006448a424e3cc128fd04683e))
### Enhancements made
- Add `save_as()` method to GISDocument API [#595](https://github.com/geojupyter/jupytergis/pull/595) ([@mfisher87](https://github.com/mfisher87))
- Processing: Option to save output layer by the side [#589](https://github.com/geojupyter/jupytergis/pull/589) ([@arjxn-py](https://github.com/arjxn-py))
- Feat:- Adding key shortcut i to identity [#581](https://github.com/geojupyter/jupytergis/pull/581) ([@nakul-py](https://github.com/nakul-py))
- Refactor Processing Logic to make it modular [#578](https://github.com/geojupyter/jupytergis/pull/578) ([@arjxn-py](https://github.com/arjxn-py))
- Make Output Layer name configurable for processing [#573](https://github.com/geojupyter/jupytergis/pull/573) ([@arjxn-py](https://github.com/arjxn-py))
- Restore local geotiff file support [#571](https://github.com/geojupyter/jupytergis/pull/571) ([@arjxn-py](https://github.com/arjxn-py))
- Remove reprojection from buffer operation [#563](https://github.com/geojupyter/jupytergis/pull/563) ([@mfisher87](https://github.com/mfisher87))
- Disable identify tool when we can't identify [#553](https://github.com/geojupyter/jupytergis/pull/553) ([@martinRenou](https://github.com/martinRenou))
- Processing: Add `Dissolve` Command & A better Form structure for Processing Commands [#550](https://github.com/geojupyter/jupytergis/pull/550) ([@arjxn-py](https://github.com/arjxn-py))
- Explicit buffer processing distance unit [#529](https://github.com/geojupyter/jupytergis/pull/529) ([@martinRenou](https://github.com/martinRenou))
- Enable downloading a vectorlayer [#528](https://github.com/geojupyter/jupytergis/pull/528) ([@arjxn-py](https://github.com/arjxn-py))
- Add new user-facing interpolate source property [#522](https://github.com/geojupyter/jupytergis/pull/522) ([@mfisher87](https://github.com/mfisher87))
- Processing PoC - Buffer [#510](https://github.com/geojupyter/jupytergis/pull/510) ([@arjxn-py](https://github.com/arjxn-py))
### Bugs fixed
- Enable adding annotations on QGZ files [#607](https://github.com/geojupyter/jupytergis/pull/607) ([@arjxn-py](https://github.com/arjxn-py))
- Fix pointer to show correct updated location [#606](https://github.com/geojupyter/jupytergis/pull/606) ([@arjxn-py](https://github.com/arjxn-py))
- Use only relevant selectors for keybindings to prevent conflicts [#603](https://github.com/geojupyter/jupytergis/pull/603) ([@arjxn-py](https://github.com/arjxn-py))
- Temporarily change identify keybinding to "Accel+I" to work around bug #592 [#600](https://github.com/geojupyter/jupytergis/pull/600) ([@mfisher87](https://github.com/mfisher87))
### Maintenance and upkeep improvements
- Add documentation build script, fix build warning, and update docs on building docs [#584](https://github.com/geojupyter/jupytergis/pull/584) ([@mfisher87](https://github.com/mfisher87))
- Refactor Processing Logic to make it modular [#578](https://github.com/geojupyter/jupytergis/pull/578) ([@arjxn-py](https://github.com/arjxn-py))
- Organise forms [#572](https://github.com/geojupyter/jupytergis/pull/572) ([@arjxn-py](https://github.com/arjxn-py))
- Update lockfile [#568](https://github.com/geojupyter/jupytergis/pull/568) ([@arjxn-py](https://github.com/arjxn-py))
- Resolve dependabot security alert for `axios` [#565](https://github.com/geojupyter/jupytergis/pull/565) ([@dependabot](https://github.com/dependabot))
- Enable ruff's bugbear "B" ruleset [#562](https://github.com/geojupyter/jupytergis/pull/562) ([@mfisher87](https://github.com/mfisher87))
- organise `schema/` [#542](https://github.com/geojupyter/jupytergis/pull/542) ([@arjxn-py](https://github.com/arjxn-py))
### Documentation improvements
- Add documentation build script, fix build warning, and update docs on building docs [#584](https://github.com/geojupyter/jupytergis/pull/584) ([@mfisher87](https://github.com/mfisher87))
- Convert docs rst to myst [#570](https://github.com/geojupyter/jupytergis/pull/570) ([@kpdavi](https://github.com/kpdavi))
- Fix docs build warning: Adjust documentation headings to start at H1 [#566](https://github.com/geojupyter/jupytergis/pull/566) ([@mfisher87](https://github.com/mfisher87))
- Create requirements-docs.md for building local docs workflow [#557](https://github.com/geojupyter/jupytergis/pull/557) ([@YaoTingYao](https://github.com/YaoTingYao))
- Fix API doc build [#556](https://github.com/geojupyter/jupytergis/pull/556) ([@mfisher87](https://github.com/mfisher87))
- Add quickstart to installation doc [#555](https://github.com/geojupyter/jupytergis/pull/555) ([@mfisher87](https://github.com/mfisher87))
- Docs: upgrading micromamba [#543](https://github.com/geojupyter/jupytergis/pull/543) ([@martinRenou](https://github.com/martinRenou))
- Add a tutorial for collaborative features [#530](https://github.com/geojupyter/jupytergis/pull/530) ([@elifsu-simula](https://github.com/elifsu-simula))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2025-03-06&to=2025-04-07&type=c))
[@arjxn-py](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2025-03-06..2025-04-07&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Adependabot+updated%3A2025-03-06..2025-04-07&type=Issues) | [@elifsu-simula](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aelifsu-simula+updated%3A2025-03-06..2025-04-07&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agithub-actions+updated%3A2025-03-06..2025-04-07&type=Issues) | [@kpdavi](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Akpdavi+updated%3A2025-03-06..2025-04-07&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2025-03-06..2025-04-07&type=Issues) | [@mfisher87](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2025-03-06..2025-04-07&type=Issues) | [@nakul-py](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Anakul-py+updated%3A2025-03-06..2025-04-07&type=Issues) | [@YaoTingYao](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AYaoTingYao+updated%3A2025-03-06..2025-04-07&type=Issues)
## 0.4.2
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.4.1...4978e892b2d8deaa59a9d9cc515d98d6126b504e))
### Bugs fixed
- Fix releaser for publishing jupytergis-lite [#524](https://github.com/geojupyter/jupytergis/pull/524) ([@martinRenou](https://github.com/martinRenou))
- Move layer visibility toggle to the left of the layer title and icon [#487](https://github.com/geojupyter/jupytergis/pull/487) ([@mfisher87](https://github.com/mfisher87))
### Maintenance and upkeep improvements
- Bump the gha-dependencies group with 3 updates [#512](https://github.com/geojupyter/jupytergis/pull/512) ([@dependabot](https://github.com/dependabot))
### Documentation improvements
- Removing misleading comment [#511](https://github.com/geojupyter/jupytergis/pull/511) ([@martinRenou](https://github.com/martinRenou))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2025-02-27&to=2025-03-06&type=c))
[@arjxn-py](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2025-02-27..2025-03-06&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Adependabot+updated%3A2025-02-27..2025-03-06&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agithub-actions+updated%3A2025-02-27..2025-03-06&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2025-02-27..2025-03-06&type=Issues) | [@mfisher87](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2025-02-27..2025-03-06&type=Issues)
## 0.4.1
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.4.0...8a87ee1f424e09578a372b89d0848d2a1ddea921))
### Enhancements made
- Gallery: Add ESRI maps [#508](https://github.com/geojupyter/jupytergis/pull/508) ([@martinRenou](https://github.com/martinRenou))
- Disable smoothing on all raster sources [#485](https://github.com/geojupyter/jupytergis/pull/485) ([@mfisher87](https://github.com/mfisher87))
- Add `remove_layer` method to Python `GISDocument` API [#478](https://github.com/geojupyter/jupytergis/pull/478) ([@mfisher87](https://github.com/mfisher87))
### Bugs fixed
- Fix to vector colors notebook [#507](https://github.com/geojupyter/jupytergis/pull/507) ([@arjxn-py](https://github.com/arjxn-py))
- Fix examples in JupyterLite [#506](https://github.com/geojupyter/jupytergis/pull/506) ([@martinRenou](https://github.com/martinRenou))
- Fix COG performances [#503](https://github.com/geojupyter/jupytergis/pull/503) ([@martinRenou](https://github.com/martinRenou))
- Put commandRegistry back in consoleOptions [#499](https://github.com/geojupyter/jupytergis/pull/499) ([@gjmooney](https://github.com/gjmooney))
- Fix "Try it with JupyterLite" button in user guide [#470](https://github.com/geojupyter/jupytergis/pull/470) ([@mfisher87](https://github.com/mfisher87))
- Lazy import jupyter_server [#465](https://github.com/geojupyter/jupytergis/pull/465) ([@martinRenou](https://github.com/martinRenou))
- Fix bump script for jupytergis-lite [#464](https://github.com/geojupyter/jupytergis/pull/464) ([@martinRenou](https://github.com/martinRenou))
### Maintenance and upkeep improvements
- Use `dist/` while using lite-artifacts [#491](https://github.com/geojupyter/jupytergis/pull/491) ([@arjxn-py](https://github.com/arjxn-py))
- Separate bot for lite snapshots update [#490](https://github.com/geojupyter/jupytergis/pull/490) ([@arjxn-py](https://github.com/arjxn-py))
- Configure ui-tests for lite deployment [#489](https://github.com/geojupyter/jupytergis/pull/489) ([@arjxn-py](https://github.com/arjxn-py))
- Install JupyterGIS metapackage in Update snapshots workflow [#477](https://github.com/geojupyter/jupytergis/pull/477) ([@arjxn-py](https://github.com/arjxn-py))
### Documentation improvements
- Update README screenshot [#482](https://github.com/geojupyter/jupytergis/pull/482) ([@martinRenou](https://github.com/martinRenou))
- Update `image.jGIS` and file handling logic to load correctly [#481](https://github.com/geojupyter/jupytergis/pull/481) ([@arjxn-py](https://github.com/arjxn-py))
- Convert the Troubleshooting document to MyST [#479](https://github.com/geojupyter/jupytergis/pull/479) ([@jmarokhovsky](https://github.com/jmarokhovsky))
- Update user guide tutorial [#475](https://github.com/geojupyter/jupytergis/pull/475) ([@elifsu-simula](https://github.com/elifsu-simula))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2025-02-13&to=2025-02-27&type=c))
[@arjxn-py](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2025-02-13..2025-02-27&type=Issues) | [@brichet](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Abrichet+updated%3A2025-02-13..2025-02-27&type=Issues) | [@elifsu-simula](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aelifsu-simula+updated%3A2025-02-13..2025-02-27&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agithub-actions+updated%3A2025-02-13..2025-02-27&type=Issues) | [@gjmooney](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agjmooney+updated%3A2025-02-13..2025-02-27&type=Issues) | [@jmarokhovsky](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Ajmarokhovsky+updated%3A2025-02-13..2025-02-27&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2025-02-13..2025-02-27&type=Issues) | [@mfisher87](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2025-02-13..2025-02-27&type=Issues)
## 0.4.0
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.3.0...142a554f57d7d7ccf1c960d82432f78ea69f3e39))
### Enhancements made
- fix #418 path validation of shapefiles [#453](https://github.com/geojupyter/jupytergis/pull/453) ([@annefou](https://github.com/annefou))
- Add jupytergis-lite metapackage [#451](https://github.com/geojupyter/jupytergis/pull/451) ([@martinRenou](https://github.com/martinRenou))
- Import VectorLayer from QGIS [#424](https://github.com/geojupyter/jupytergis/pull/424) ([@arjxn-py](https://github.com/arjxn-py))
- Time slider [#421](https://github.com/geojupyter/jupytergis/pull/421) ([@gjmooney](https://github.com/gjmooney))
- Widget with toolbar and sidepanel in cell output [#419](https://github.com/geojupyter/jupytergis/pull/419) ([@brichet](https://github.com/brichet))
- Enable Python API in the JupyterLite deployment [#412](https://github.com/geojupyter/jupytergis/pull/412) ([@davidbrochart](https://github.com/davidbrochart))
- Rework add layer toolbar menu [#410](https://github.com/geojupyter/jupytergis/pull/410) ([@gjmooney](https://github.com/gjmooney))
- Add error handling [#391](https://github.com/geojupyter/jupytergis/pull/391) ([@Meriem-BenIsmail](https://github.com/Meriem-BenIsmail))
- Support exporting vectorLayer to qgis [#390](https://github.com/geojupyter/jupytergis/pull/390) ([@arjxn-py](https://github.com/arjxn-py))
- Add local file support for `GeoTiff` [#385](https://github.com/geojupyter/jupytergis/pull/385) ([@Meriem-BenIsmail](https://github.com/Meriem-BenIsmail))
- Add Heatmap layer [#384](https://github.com/geojupyter/jupytergis/pull/384) ([@gjmooney](https://github.com/gjmooney))
- Support path lib objects [#378](https://github.com/geojupyter/jupytergis/pull/378) ([@gjmooney](https://github.com/gjmooney))
- Extend caching for image, geoJSON & shapeFiles [#339](https://github.com/geojupyter/jupytergis/pull/339) ([@arjxn-py](https://github.com/arjxn-py))
### Bugs fixed
- Pin meta-package dependencies [#460](https://github.com/geojupyter/jupytergis/pull/460) ([@gjmooney](https://github.com/gjmooney))
- Use symlink for readme for pypi [#458](https://github.com/geojupyter/jupytergis/pull/458) ([@gjmooney](https://github.com/gjmooney))
- Fix collab view bug [#450](https://github.com/geojupyter/jupytergis/pull/450) ([@gjmooney](https://github.com/gjmooney))
- Fix a typo in gis_document.py [#448](https://github.com/geojupyter/jupytergis/pull/448) ([@brichet](https://github.com/brichet))
- Fix slider sync issue [#443](https://github.com/geojupyter/jupytergis/pull/443) ([@gjmooney](https://github.com/gjmooney))
- Fix categorized symbology [#430](https://github.com/geojupyter/jupytergis/pull/430) ([@gjmooney](https://github.com/gjmooney))
- Replace input field for selected file path with text [#417](https://github.com/geojupyter/jupytergis/pull/417) ([@Meriem-BenIsmail](https://github.com/Meriem-BenIsmail))
- Fix scale indicator in notebooks and symbology overflow [#408](https://github.com/geojupyter/jupytergis/pull/408) ([@gjmooney](https://github.com/gjmooney))
- Create a new file from the Python API [#402](https://github.com/geojupyter/jupytergis/pull/402) ([@brichet](https://github.com/brichet))
- Add optional-chaining check for `symbologyState` [#383](https://github.com/geojupyter/jupytergis/pull/383) ([@Meriem-BenIsmail](https://github.com/Meriem-BenIsmail))
- Proper Styling Added for OK Button [#379](https://github.com/geojupyter/jupytergis/pull/379) ([@Meriem-BenIsmail](https://github.com/Meriem-BenIsmail))
- Support path lib objects [#378](https://github.com/geojupyter/jupytergis/pull/378) ([@gjmooney](https://github.com/gjmooney))
### Maintenance and upkeep improvements
- Continue installing the labextension in the dev install script [#463](https://github.com/geojupyter/jupytergis/pull/463) ([@arjxn-py](https://github.com/arjxn-py))
- Updating version of proj4-list [#459](https://github.com/geojupyter/jupytergis/pull/459) ([@josueggh](https://github.com/josueggh))
- Bump yjs-widgets to >=0.3.9 [#449](https://github.com/geojupyter/jupytergis/pull/449) ([@brichet](https://github.com/brichet))
- Replace broken shapefile from ui tests [#442](https://github.com/geojupyter/jupytergis/pull/442) ([@arjxn-py](https://github.com/arjxn-py))
- Fix link to contribution docs [#440](https://github.com/geojupyter/jupytergis/pull/440) ([@martinRenou](https://github.com/martinRenou))
- Remove test to expect warning on vectorLayer export [#423](https://github.com/geojupyter/jupytergis/pull/423) ([@arjxn-py](https://github.com/arjxn-py))
- Bump dawidd6/action-download-artifact from 7 to 8 in the gha-dependencies group [#422](https://github.com/geojupyter/jupytergis/pull/422) ([@dependabot](https://github.com/dependabot))
- Remove source layer stuff [#413](https://github.com/geojupyter/jupytergis/pull/413) ([@gjmooney](https://github.com/gjmooney))
- Upgrade jupyter-ydoc python to match the npm version [#409](https://github.com/geojupyter/jupytergis/pull/409) ([@brichet](https://github.com/brichet))
- Fix shared document interface [#406](https://github.com/geojupyter/jupytergis/pull/406) ([@brichet](https://github.com/brichet))
- Fix name typo `notebookRenderePlugin` -> `notebookRendererPlugin` [#400](https://github.com/geojupyter/jupytergis/pull/400) ([@mfisher87](https://github.com/mfisher87))
- Move jupyterlab dependency from jupytergis_lab to jupytergis [#382](https://github.com/geojupyter/jupytergis/pull/382) ([@davidbrochart](https://github.com/davidbrochart))
### Documentation improvements
- Add Docker install instructions [#446](https://github.com/geojupyter/jupytergis/pull/446) ([@mfisher87](https://github.com/mfisher87))
- Fix link to contribution docs [#440](https://github.com/geojupyter/jupytergis/pull/440) ([@martinRenou](https://github.com/martinRenou))
- Re-organize docs navigation and add releasing guide [#428](https://github.com/geojupyter/jupytergis/pull/428) ([@mfisher87](https://github.com/mfisher87))
- added simple tutorial to introduce the jupyterGIS GUI. [#393](https://github.com/geojupyter/jupytergis/pull/393) ([@annefou](https://github.com/annefou))
- Restore rich Sphinx contributing doc, link from GitHub-Markdown doc [#392](https://github.com/geojupyter/jupytergis/pull/392) ([@mfisher87](https://github.com/mfisher87))
- Remove Duplicate CONTRIBUTING.md and add CHANGELOG to docs [#381](https://github.com/geojupyter/jupytergis/pull/381) ([@arjxn-py](https://github.com/arjxn-py))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2025-01-21&to=2025-02-13&type=c))
[@annefou](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aannefou+updated%3A2025-01-21..2025-02-13&type=Issues) | [@arjxn-py](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2025-01-21..2025-02-13&type=Issues) | [@brichet](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Abrichet+updated%3A2025-01-21..2025-02-13&type=Issues) | [@davidbrochart](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Adavidbrochart+updated%3A2025-01-21..2025-02-13&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Adependabot+updated%3A2025-01-21..2025-02-13&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agithub-actions+updated%3A2025-01-21..2025-02-13&type=Issues) | [@gjmooney](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agjmooney+updated%3A2025-01-21..2025-02-13&type=Issues) | [@josueggh](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Ajosueggh+updated%3A2025-01-21..2025-02-13&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2025-01-21..2025-02-13&type=Issues) | [@Meriem-BenIsmail](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AMeriem-BenIsmail+updated%3A2025-01-21..2025-02-13&type=Issues) | [@mfisher87](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2025-01-21..2025-02-13&type=Issues)
## 0.3.0
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.2.1...5e05c1a0c7e0c373ebbcb8dd5c84e52899e4a680))
### Enhancements made
- Use `interpolate` property to Disable Image Smoothing for `ImageLayers` [#373](https://github.com/geojupyter/jupytergis/pull/373) ([@Meriem-BenIsmail](https://github.com/Meriem-BenIsmail))
- Add numerical input next to the slider and handle value 1-10 [#365](https://github.com/geojupyter/jupytergis/pull/365) ([@arjxn-py](https://github.com/arjxn-py))
- Add Path Validation for `ShapefileSource` and `ImageSource`. [#362](https://github.com/geojupyter/jupytergis/pull/362) ([@Meriem-BenIsmail](https://github.com/Meriem-BenIsmail))
- Multi band symbology [#360](https://github.com/geojupyter/jupytergis/pull/360) ([@gjmooney](https://github.com/gjmooney))
- Add Proper Styling to Symbology panel's "mode" [#354](https://github.com/geojupyter/jupytergis/pull/354) ([@Meriem-BenIsmail](https://github.com/Meriem-BenIsmail))
- Add status bar to map [#348](https://github.com/geojupyter/jupytergis/pull/348) ([@gjmooney](https://github.com/gjmooney))
- Move jupyter-collaboration dependency to jupytergis [#347](https://github.com/geojupyter/jupytergis/pull/347) ([@davidbrochart](https://github.com/davidbrochart))
- QGIS logo added for `.qgz` files [#337](https://github.com/geojupyter/jupytergis/pull/337) ([@Meriem-BenIsmail](https://github.com/Meriem-BenIsmail))
- Create layers by path or external URL with separate fields [#335](https://github.com/geojupyter/jupytergis/pull/335) ([@Meriem-BenIsmail](https://github.com/Meriem-BenIsmail))
- visibility icon turns white when layer selected. [#330](https://github.com/geojupyter/jupytergis/pull/330) ([@Meriem-BenIsmail](https://github.com/Meriem-BenIsmail))
- Give some padding to the headings in editForm [#329](https://github.com/geojupyter/jupytergis/pull/329) ([@arjxn-py](https://github.com/arjxn-py))
- Use slider to set opacity in layer form [#325](https://github.com/geojupyter/jupytergis/pull/325) ([@arjxn-py](https://github.com/arjxn-py))
- Add Hillshade layer to notebook api [#304](https://github.com/geojupyter/jupytergis/pull/304) ([@gjmooney](https://github.com/gjmooney))
- Support Python 3.12 & Drop support for 3.8 and 3.9 [#303](https://github.com/geojupyter/jupytergis/pull/303) ([@arjxn-py](https://github.com/arjxn-py))
- Add zoom to layer to layer context menu [#294](https://github.com/geojupyter/jupytergis/pull/294) ([@gjmooney](https://github.com/gjmooney))
- Local and external file loading support for geojson, image and shapefile sources [#256](https://github.com/geojupyter/jupytergis/pull/256) ([@arjxn-py](https://github.com/arjxn-py))
### Bugs fixed
- Add numerical input next to the slider and handle value 1-10 [#365](https://github.com/geojupyter/jupytergis/pull/365) ([@arjxn-py](https://github.com/arjxn-py))
- Disable Image Smoothing for `ImageSource` [#364](https://github.com/geojupyter/jupytergis/pull/364) ([@Meriem-BenIsmail](https://github.com/Meriem-BenIsmail))
- Fix JupyterGISDoc.setSource [#346](https://github.com/geojupyter/jupytergis/pull/346) ([@davidbrochart](https://github.com/davidbrochart))
- Include files in lite deployment for `local.jGIS` [#345](https://github.com/geojupyter/jupytergis/pull/345) ([@arjxn-py](https://github.com/arjxn-py))
- Register new projections if needed when adding layers [#343](https://github.com/geojupyter/jupytergis/pull/343) ([@gjmooney](https://github.com/gjmooney))
- Move dependencies from root to dependent package + Update JupyterLite in lite build [#333](https://github.com/geojupyter/jupytergis/pull/333) ([@arjxn-py](https://github.com/arjxn-py))
- Try fixing jupyterlite deployment [#332](https://github.com/geojupyter/jupytergis/pull/332) ([@arjxn-py](https://github.com/arjxn-py))
- Add keyboard shortcuts for undo and redo [#320](https://github.com/geojupyter/jupytergis/pull/320) ([@gjmooney](https://github.com/gjmooney))
- Add "identified" style for polygons & linestrings [#319](https://github.com/geojupyter/jupytergis/pull/319) ([@gjmooney](https://github.com/gjmooney))
### Maintenance and upkeep improvements
- Bot: missing collaboration package [#368](https://github.com/geojupyter/jupytergis/pull/368) ([@martinRenou](https://github.com/martinRenou))
- Keep extension package name extension-artifacts for 3.12 to fix bot [#366](https://github.com/geojupyter/jupytergis/pull/366) ([@arjxn-py](https://github.com/arjxn-py))
- Support Python 3.12 & Drop support for 3.8 and 3.9 [#303](https://github.com/geojupyter/jupytergis/pull/303) ([@arjxn-py](https://github.com/arjxn-py))
- Add issue linkage to PR checklist [#298](https://github.com/geojupyter/jupytergis/pull/298) ([@mfisher87](https://github.com/mfisher87))
### Documentation improvements
- Add a pretty JupyterLite button to docs [#361](https://github.com/geojupyter/jupytergis/pull/361) ([@mfisher87](https://github.com/mfisher87))
- Fix Lite Deployment Badge via RTD on PR using Custom Action [#356](https://github.com/geojupyter/jupytergis/pull/356) ([@arjxn-py](https://github.com/arjxn-py))
### Other merged PRs
- Bot: Update Python [#367](https://github.com/geojupyter/jupytergis/pull/367) ([@martinRenou](https://github.com/martinRenou))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2025-01-13&to=2025-01-21&type=c))
[@arjxn-py](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2025-01-13..2025-01-21&type=Issues) | [@brichet](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Abrichet+updated%3A2025-01-13..2025-01-21&type=Issues) | [@davidbrochart](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Adavidbrochart+updated%3A2025-01-13..2025-01-21&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agithub-actions+updated%3A2025-01-13..2025-01-21&type=Issues) | [@gjmooney](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agjmooney+updated%3A2025-01-13..2025-01-21&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2025-01-13..2025-01-21&type=Issues) | [@Meriem-BenIsmail](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AMeriem-BenIsmail+updated%3A2025-01-13..2025-01-21&type=Issues) | [@mfisher87](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2025-01-13..2025-01-21&type=Issues) | [@simonprovost](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Asimonprovost+updated%3A2025-01-13..2025-01-21&type=Issues) | [@SylvainCorlay](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3ASylvainCorlay+updated%3A2025-01-13..2025-01-21&type=Issues)
## 0.2.1
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.2.0...96cef85ae8edf6948e4e7d3b9b24c5a061e473c2))
### Bugs fixed
- Fix bug when loading geojson layers in notebook and update notebook test [#305](https://github.com/geojupyter/jupytergis/pull/305) ([@gjmooney](https://github.com/gjmooney))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2025-01-10&to=2025-01-13&type=c))
[@github-actions](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agithub-actions+updated%3A2025-01-10..2025-01-13&type=Issues) | [@gjmooney](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agjmooney+updated%3A2025-01-10..2025-01-13&type=Issues)
## 0.2.0
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.1.7...c2372d35a7ce4368d85f484b92bcc83f6c781b61))
### Enhancements made
- Improve logos styling [#286](https://github.com/geojupyter/jupytergis/pull/286) ([@arjxn-py](https://github.com/arjxn-py))
- Add Identify tool [#270](https://github.com/geojupyter/jupytergis/pull/270) ([@gjmooney](https://github.com/gjmooney))
- Show other collaborators' cursors on map [#264](https://github.com/geojupyter/jupytergis/pull/264) ([@gjmooney](https://github.com/gjmooney))
- Speed-up GeoTIFF file handling [#262](https://github.com/geojupyter/jupytergis/pull/262) ([@Meriem-BenIsmail](https://github.com/Meriem-BenIsmail))
- Add ability to follow a collaborator's viewport [#257](https://github.com/geojupyter/jupytergis/pull/257) ([@gjmooney](https://github.com/gjmooney))
- Emphasize the hidden layer icon [#243](https://github.com/geojupyter/jupytergis/pull/243) ([@mfisher87](https://github.com/mfisher87))
- Add annotations support [#234](https://github.com/geojupyter/jupytergis/pull/234) ([@gjmooney](https://github.com/gjmooney))
### Bugs fixed
- Fix image layer python API [#297](https://github.com/geojupyter/jupytergis/pull/297) ([@gjmooney](https://github.com/gjmooney))
- Refactor layer tree updates [#284](https://github.com/geojupyter/jupytergis/pull/284) ([@gjmooney](https://github.com/gjmooney))
- Do not rely on collaborative drive for external file reading [#241](https://github.com/geojupyter/jupytergis/pull/241) ([@martinRenou](https://github.com/martinRenou))
- Fix shippping of geojson schema [#239](https://github.com/geojupyter/jupytergis/pull/239) ([@arjxn-py](https://github.com/arjxn-py))
- Fix check-release workflow [#223](https://github.com/geojupyter/jupytergis/pull/223) ([@gjmooney](https://github.com/gjmooney))
### Maintenance and upkeep improvements
- Remove redundant dev install instructions, loosen pydantic pin [#295](https://github.com/geojupyter/jupytergis/pull/295) ([@davidbrochart](https://github.com/davidbrochart))
- Temporary PR comment for lite preview [#290](https://github.com/geojupyter/jupytergis/pull/290) ([@brichet](https://github.com/brichet))
- Fix typo in ReadTheDocs PR link automation [#285](https://github.com/geojupyter/jupytergis/pull/285) ([@mfisher87](https://github.com/mfisher87))
- Bump the gha-dependencies group with 4 updates [#283](https://github.com/geojupyter/jupytergis/pull/283) ([@dependabot](https://github.com/dependabot))
- Make prettier output more human readable, improve documentation of linting [#282](https://github.com/geojupyter/jupytergis/pull/282) ([@mfisher87](https://github.com/mfisher87))
- Fix typo and formatting errors in dependabot config [#280](https://github.com/geojupyter/jupytergis/pull/280) ([@mfisher87](https://github.com/mfisher87))
- Bump actions/upload-artifact to v4 [#278](https://github.com/geojupyter/jupytergis/pull/278) ([@trungleduc](https://github.com/trungleduc))
- Build docs and Lite deployment in ReadTheDocs [#275](https://github.com/geojupyter/jupytergis/pull/275) ([@mfisher87](https://github.com/mfisher87))
- Automatically upgrade GitHub Action dependencies with Dependabot [#274](https://github.com/geojupyter/jupytergis/pull/274) ([@mfisher87](https://github.com/mfisher87))
- Add checks for reST content [#273](https://github.com/geojupyter/jupytergis/pull/273) ([@mfisher87](https://github.com/mfisher87))
- Improve layer update logic [#269](https://github.com/geojupyter/jupytergis/pull/269) ([@Meriem-BenIsmail](https://github.com/Meriem-BenIsmail))
- Grey out symbology entry for unsupported layers [#255](https://github.com/geojupyter/jupytergis/pull/255) ([@gjmooney](https://github.com/gjmooney))
- Replace @jupyterlab/rjsf with FormComponent from @jupyterlab/ui-components [#252](https://github.com/geojupyter/jupytergis/pull/252) ([@Meriem-BenIsmail](https://github.com/Meriem-BenIsmail))
- Apply pre-commit autofixes [#249](https://github.com/geojupyter/jupytergis/pull/249) ([@mfisher87](https://github.com/mfisher87))
- Update PR preview links [#233](https://github.com/geojupyter/jupytergis/pull/233) ([@martinRenou](https://github.com/martinRenou))
- Fix check-release workflow [#223](https://github.com/geojupyter/jupytergis/pull/223) ([@gjmooney](https://github.com/gjmooney))
- Embed GeoJSON schema in the project to improve build reliability [#165](https://github.com/geojupyter/jupytergis/pull/165) ([@arjxn-py](https://github.com/arjxn-py))
### Documentation improvements
- Remove unnecessary jupyterlab install [#301](https://github.com/geojupyter/jupytergis/pull/301) ([@davidbrochart](https://github.com/davidbrochart))
- Shrink logo and add lite badge to readme [#292](https://github.com/geojupyter/jupytergis/pull/292) ([@gjmooney](https://github.com/gjmooney))
- Configure lerna to use `jlpm` as npm client [#279](https://github.com/geojupyter/jupytergis/pull/279) ([@mfisher87](https://github.com/mfisher87))
- Add checks for reST content [#273](https://github.com/geojupyter/jupytergis/pull/273) ([@mfisher87](https://github.com/mfisher87))
- Set expectation that RTC doesn't work yet in JupyterLite deployment [#260](https://github.com/geojupyter/jupytergis/pull/260) ([@mfisher87](https://github.com/mfisher87))
- Update contributing docs to be more comprehensive (and fix links) [#242](https://github.com/geojupyter/jupytergis/pull/242) ([@mfisher87](https://github.com/mfisher87))
- docs: Add conda-forge install instructions [#228](https://github.com/geojupyter/jupytergis/pull/228) ([@matthewfeickert](https://github.com/matthewfeickert))
- Update README demo link to open `france_hiking.jGIS` [#226](https://github.com/geojupyter/jupytergis/pull/226) ([@mfisher87](https://github.com/mfisher87))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2024-12-06&to=2025-01-10&type=c))
[@arjxn-py](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2024-12-06..2025-01-10&type=Issues) | [@brichet](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Abrichet+updated%3A2024-12-06..2025-01-10&type=Issues) | [@davidbrochart](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Adavidbrochart+updated%3A2024-12-06..2025-01-10&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Adependabot+updated%3A2024-12-06..2025-01-10&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agithub-actions+updated%3A2024-12-06..2025-01-10&type=Issues) | [@gjmooney](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agjmooney+updated%3A2024-12-06..2025-01-10&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2024-12-06..2025-01-10&type=Issues) | [@matthewfeickert](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amatthewfeickert+updated%3A2024-12-06..2025-01-10&type=Issues) | [@Meriem-BenIsmail](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AMeriem-BenIsmail+updated%3A2024-12-06..2025-01-10&type=Issues) | [@mfisher87](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Amfisher87+updated%3A2024-12-06..2025-01-10&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Apre-commit-ci+updated%3A2024-12-06..2025-01-10&type=Issues) | [@trungleduc](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Atrungleduc+updated%3A2024-12-06..2025-01-10&type=Issues)
## 0.1.7
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.1.6...52c36a5d1a548724efc055de81f463a34ba1d1fb))
### Enhancements made
- JupyterLite: do not fail on file validation issues [#219](https://github.com/geojupyter/jupytergis/pull/219) ([@martinRenou](https://github.com/martinRenou))
- Open jgis files with json viewer [#210](https://github.com/geojupyter/jupytergis/pull/210) ([@gjmooney](https://github.com/gjmooney))
- Add support for other projections [#199](https://github.com/geojupyter/jupytergis/pull/199) ([@gjmooney](https://github.com/gjmooney))
- Symbology refactor [#193](https://github.com/geojupyter/jupytergis/pull/193) ([@gjmooney](https://github.com/gjmooney))
- Color ramps and classification [#177](https://github.com/geojupyter/jupytergis/pull/177) ([@gjmooney](https://github.com/gjmooney))
### Bugs fixed
- Skip cache when building prod [#222](https://github.com/geojupyter/jupytergis/pull/222) ([@gjmooney](https://github.com/gjmooney))
- CI: Set up caching [#211](https://github.com/geojupyter/jupytergis/pull/211) ([@gjmooney](https://github.com/gjmooney))
- UI-tests fix: Pin Jupyter Lab 4.2 [#203](https://github.com/geojupyter/jupytergis/pull/203) ([@gjmooney](https://github.com/gjmooney))
- Fix focus bug [#202](https://github.com/geojupyter/jupytergis/pull/202) ([@gjmooney](https://github.com/gjmooney))
- Add a min-height to the toolbar separator [#200](https://github.com/geojupyter/jupytergis/pull/200) ([@brichet](https://github.com/brichet))
- Add nodata to geotiff source [#198](https://github.com/geojupyter/jupytergis/pull/198) ([@gjmooney](https://github.com/gjmooney))
- Set collaborative attribute to False in Jupyterlite [#192](https://github.com/geojupyter/jupytergis/pull/192) ([@martinRenou](https://github.com/martinRenou))
### Maintenance and upkeep improvements
- Skip cache when building prod [#222](https://github.com/geojupyter/jupytergis/pull/222) ([@gjmooney](https://github.com/gjmooney))
- Commit gallery in the repo [#221](https://github.com/geojupyter/jupytergis/pull/221) ([@martinRenou](https://github.com/martinRenou))
- Fix update projection and allow exposing maps to ui-tests [#214](https://github.com/geojupyter/jupytergis/pull/214) ([@brichet](https://github.com/brichet))
- Disable docprovider-extension in lite deployment [#213](https://github.com/geojupyter/jupytergis/pull/213) ([@brichet](https://github.com/brichet))
- Update to jupyter-collaboration>=3 [#204](https://github.com/geojupyter/jupytergis/pull/204) ([@brichet](https://github.com/brichet))
- Use appsharing for testing jupyterlite from PRs and galata reports [#188](https://github.com/geojupyter/jupytergis/pull/188) ([@martinRenou](https://github.com/martinRenou))
### Documentation improvements
- Fix links to docs and lite deployment [#206](https://github.com/geojupyter/jupytergis/pull/206) ([@martinRenou](https://github.com/martinRenou))
- Build and publish docs to github pages [#205](https://github.com/geojupyter/jupytergis/pull/205) ([@martinRenou](https://github.com/martinRenou))
- first draft of documentation for JupyterGIS [#195](https://github.com/geojupyter/jupytergis/pull/195) ([@annefou](https://github.com/annefou))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2024-10-14&to=2024-12-06&type=c))
[@annefou](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aannefou+updated%3A2024-10-14..2024-12-06&type=Issues) | [@brichet](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Abrichet+updated%3A2024-10-14..2024-12-06&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agithub-actions+updated%3A2024-10-14..2024-12-06&type=Issues) | [@gjmooney](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Agjmooney+updated%3A2024-10-14..2024-12-06&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3AmartinRenou+updated%3A2024-10-14..2024-12-06&type=Issues)
## 0.1.6
([Full Changelog](https://github.com/geojupyter/jupytergis/compare/@jupytergis/base@0.1.5...84200c15ed4537cf469482035c2d4eca9ffbfb42))
### Enhancements made
- Add `logoicon` as tab icon [#183](https://github.com/geojupyter/jupytergis/pull/183) ([@arjxn-py](https://github.com/arjxn-py))
- Reactive toolbar w.r.t width [#181](https://github.com/geojupyter/jupytergis/pull/181) ([@arjxn-py](https://github.com/arjxn-py))
- Rename launcher item [#180](https://github.com/geojupyter/jupytergis/pull/180) ([@martinRenou](https://github.com/martinRenou))
- Add JupyterGIS icons in the filebrowser [#179](https://github.com/geojupyter/jupytergis/pull/179) ([@martinRenou](https://github.com/martinRenou))
- Read/write color information for QGIS files [#175](https://github.com/geojupyter/jupytergis/pull/175) ([@gjmooney](https://github.com/gjmooney))
### Bugs fixed
- Remove extra comma from JSON repr, fixing creation of new files [#184](https://github.com/geojupyter/jupytergis/pull/184) ([@martinRenou](https://github.com/martinRenou))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/geojupyter/jupytergis/graphs/contributors?from=2024-10-04&to=2024-10-14&type=c))
[@arjxn-py](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3Aarjxn-py+updated%3A2024-10-04..2024-10-14&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ageojupyter%2Fjupytergis+involves%3
gitextract_7za2u5u1/
├── .eslintignore
├── .eslintrc.js
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── 0-user-story.yml
│ │ ├── 1-experience-report.yml
│ │ ├── 2-bug.yml
│ │ ├── 3-docs.yml
│ │ ├── 4-feature-request.yml
│ │ └── config.yml
│ ├── dependabot.yml
│ ├── pull_request_template.md
│ └── workflows/
│ ├── binder-on-pr.yml
│ ├── build-test-without-lockfile.yml
│ ├── build.yml
│ ├── check-links.yml
│ ├── check-release.yml
│ ├── draft-pdf.yml
│ ├── enforce-labels.yml
│ ├── lint-js.yml
│ ├── pr-rtd-link.yml
│ ├── prep-release.yml
│ ├── publish-release.yml
│ ├── triage-prs-to-board.yml
│ ├── typecheck-python.yml
│ ├── unit-test-js.yml
│ ├── unit-test-python.yml
│ ├── update_galata_references.yaml
│ ├── update_lite_galata_references.yaml
│ └── zizmor.yml
├── .gitignore
├── .nblink/
│ ├── environment.yml
│ └── nblink-lock.json
├── .pre-commit-config.yaml
├── .prettierignore
├── .prettierrc
├── .readthedocs.yaml
├── .yarnrc.yml
├── CHANGELOG.md
├── CITATION.cff
├── CONTRIBUTING.md
├── LICENSE
├── RELEASE.md
├── binder/
│ ├── environment.yml
│ ├── jupyter_config.json
│ ├── postBuild
│ └── start
├── docs/
│ ├── assets/
│ │ └── css/
│ │ └── custom.css
│ ├── build-on-change.sh
│ ├── build.sh
│ ├── changelog.md
│ ├── clean.sh
│ ├── conf.py
│ ├── contributor_guide/
│ │ ├── development_setup.md
│ │ ├── explanation/
│ │ │ ├── architecture.md
│ │ │ ├── code-generation.md
│ │ │ ├── form-system.md
│ │ │ ├── index.md
│ │ │ ├── security-and-npm-dependencies.md
│ │ │ └── ui-testing.md
│ │ ├── how-tos/
│ │ │ ├── add-to-layer-gallery.md
│ │ │ ├── build-docs-locally.md
│ │ │ ├── code_quality.md
│ │ │ ├── commands/
│ │ │ │ └── index.md
│ │ │ ├── index.md
│ │ │ ├── keybindings/
│ │ │ │ └── index.md
│ │ │ ├── processing-operations/
│ │ │ │ └── index.md
│ │ │ ├── release.md
│ │ │ ├── schema-migration.md
│ │ │ ├── test.md
│ │ │ ├── ui-tests-debug-failures.md
│ │ │ ├── ui-tests-update-snapshots.md
│ │ │ └── write-tutorials.md
│ │ ├── index.md
│ │ └── troubleshooting.md
│ ├── environment-docs.yml
│ ├── environment.yml
│ ├── index.md
│ ├── jupyter-lite.json
│ ├── jupyter_lite_config.json
│ ├── overview/
│ │ ├── features/
│ │ │ ├── collab.md
│ │ │ ├── extension.md
│ │ │ └── index.md
│ │ ├── index.md
│ │ └── what-is-jgis.md
│ └── user_guide/
│ ├── how-tos/
│ │ ├── ai-skills.md
│ │ ├── collab.md
│ │ ├── index.md
│ │ └── story-maps.md
│ ├── index.md
│ ├── install.md
│ ├── python_api.md
│ └── tutorials/
│ ├── 01-intro/
│ │ └── index.md
│ ├── 02-collaboration/
│ │ └── index.md
│ └── index.md
├── examples/
│ ├── 01-Create_a_new_JGIS_document.ipynb
│ ├── 99-Explore_data_in_a_map.ipynb
│ ├── 99-Open_an_existing_JGIS_Project_and_add_layers.ipynb
│ ├── 99-Vector_styling.ipynb
│ ├── buildings.jGIS
│ ├── buildings.qgz
│ ├── cloud_optimized_geotiff.jGIS
│ ├── data/
│ │ ├── eq.geojson
│ │ ├── france_regions.geojson
│ │ ├── nyc/
│ │ │ ├── nyc_roads.dbf
│ │ │ ├── nyc_roads.prj
│ │ │ ├── nyc_roads.shp
│ │ │ └── nyc_roads.shx
│ │ └── temporal-test.geojson
│ ├── earthquakes.jGIS
│ ├── europe_demo.jGIS
│ ├── france_hiking.jGIS
│ ├── geopackage.jgis
│ ├── geoparquet.jGIS
│ ├── geotiff.qgz
│ ├── hillshade.jGIS
│ ├── image.jGIS
│ ├── local.jGIS
│ ├── pmtiles-raster.jGIS
│ ├── pmtiles-vector.jGIS
│ ├── roads.jGIS
│ ├── shapefile.jGIS
│ ├── story_map.jGIS
│ ├── test.jGIS
│ ├── wms-tile.jGIS
│ ├── world-epsg4326.jGIS
│ └── world.jGIS
├── lerna.json
├── lite/
│ ├── environment.yml
│ ├── jupyter-lite.json
│ └── jupyter_lite_config.json
├── nx.json
├── package.json
├── packages/
│ ├── base/
│ │ ├── jest.config.js
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── __tests__/
│ │ │ │ └── migrations.spec.ts
│ │ │ ├── commands/
│ │ │ │ ├── BaseCommandIDs.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── operationCommands.ts
│ │ │ ├── constants.ts
│ │ │ ├── declaration.d.ts
│ │ │ ├── features/
│ │ │ │ ├── annotations/
│ │ │ │ │ ├── AnnotationsPanel.tsx
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── Annotation.tsx
│ │ │ │ │ │ ├── AnnotationFloater.tsx
│ │ │ │ │ │ └── Message.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── model.ts
│ │ │ │ ├── console/
│ │ │ │ │ ├── consoleview.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── filter/
│ │ │ │ │ ├── Filter.tsx
│ │ │ │ │ └── FilterRow.tsx
│ │ │ │ ├── identify/
│ │ │ │ │ └── IdentifyPanel.tsx
│ │ │ │ ├── layer-browser/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── layers/
│ │ │ │ │ ├── forms/
│ │ │ │ │ │ ├── layer/
│ │ │ │ │ │ │ ├── heatmapLayerForm.tsx
│ │ │ │ │ │ │ ├── hillshadeLayerForm.tsx
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ ├── layerform.tsx
│ │ │ │ │ │ │ ├── storySegmentLayerForm.tsx
│ │ │ │ │ │ │ ├── vectorlayerform.tsx
│ │ │ │ │ │ │ └── webGlLayerForm.tsx
│ │ │ │ │ │ └── source/
│ │ │ │ │ │ ├── geojsonsource.tsx
│ │ │ │ │ │ ├── geopackagesource.tsx
│ │ │ │ │ │ ├── geotiffsource.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── pathbasedsource.tsx
│ │ │ │ │ │ ├── sourceform.tsx
│ │ │ │ │ │ ├── tilesourceform.tsx
│ │ │ │ │ │ └── wmsTileSource.tsx
│ │ │ │ │ ├── layerCreationFormDialog.tsx
│ │ │ │ │ └── symbology/
│ │ │ │ │ ├── __tests__/
│ │ │ │ │ │ ├── classificationModes.spec.ts
│ │ │ │ │ │ └── styleBuilder.spec.ts
│ │ │ │ │ ├── classificationModes.ts
│ │ │ │ │ ├── colorRampUtils.ts
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── color_ramp/
│ │ │ │ │ │ │ ├── ColorRampControls.tsx
│ │ │ │ │ │ │ ├── ColorRampSelector.tsx
│ │ │ │ │ │ │ ├── ColorRampSelectorEntry.tsx
│ │ │ │ │ │ │ ├── ModeSelectRow.tsx
│ │ │ │ │ │ │ ├── RgbaColorPicker.tsx
│ │ │ │ │ │ │ └── cmocean.json
│ │ │ │ │ │ └── color_stops/
│ │ │ │ │ │ ├── StopContainer.tsx
│ │ │ │ │ │ └── StopRow.tsx
│ │ │ │ │ ├── hooks/
│ │ │ │ │ │ ├── useEffectiveSymbologyParams.ts
│ │ │ │ │ │ ├── useGetBandInfo.ts
│ │ │ │ │ │ ├── useGetProperties.ts
│ │ │ │ │ │ ├── useGetSymbology.ts
│ │ │ │ │ │ └── useOkSignal.ts
│ │ │ │ │ ├── styleBuilder.ts
│ │ │ │ │ ├── symbologyDialog.tsx
│ │ │ │ │ ├── symbologyUtils.ts
│ │ │ │ │ ├── tiff_layer/
│ │ │ │ │ │ ├── TiffRendering.tsx
│ │ │ │ │ │ ├── components/
│ │ │ │ │ │ │ └── BandRow.tsx
│ │ │ │ │ │ └── types/
│ │ │ │ │ │ ├── MultibandColor.tsx
│ │ │ │ │ │ └── SingleBandPseudoColor.tsx
│ │ │ │ │ └── vector_layer/
│ │ │ │ │ ├── VectorRendering.tsx
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── ValueSelect.tsx
│ │ │ │ │ └── types/
│ │ │ │ │ ├── Canonical.tsx
│ │ │ │ │ ├── Categorized.tsx
│ │ │ │ │ ├── Graduated.tsx
│ │ │ │ │ ├── Heatmap.tsx
│ │ │ │ │ └── SimpleSymbol.tsx
│ │ │ │ ├── objectproperties/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── processing/
│ │ │ │ │ ├── ProcessingFormDialog.tsx
│ │ │ │ │ ├── forms/
│ │ │ │ │ │ ├── dissolveProcessForm.tsx
│ │ │ │ │ │ └── processingForm.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── processingCommands.ts
│ │ │ │ │ └── processingFormToParam.ts
│ │ │ │ ├── stac-browser/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── StacPanel.tsx
│ │ │ │ │ │ ├── filter-extension/
│ │ │ │ │ │ │ ├── QueryableComboBox.tsx
│ │ │ │ │ │ │ ├── QueryableRow.tsx
│ │ │ │ │ │ │ ├── StacFilterExtensionPanel.tsx
│ │ │ │ │ │ │ └── StacQueryableFilters.tsx
│ │ │ │ │ │ ├── geodes/
│ │ │ │ │ │ │ ├── StacFilterSection.tsx
│ │ │ │ │ │ │ └── StacGeodesFilterPanel.tsx
│ │ │ │ │ │ └── shared/
│ │ │ │ │ │ ├── StacPanelResults.tsx
│ │ │ │ │ │ ├── StacSpatialExtent.tsx
│ │ │ │ │ │ └── StacTemporalExtent.tsx
│ │ │ │ │ ├── constants.ts
│ │ │ │ │ ├── context/
│ │ │ │ │ │ └── StacResultsContext.tsx
│ │ │ │ │ ├── hooks/
│ │ │ │ │ │ ├── useGeodesSearch.ts
│ │ │ │ │ │ ├── useStacFilterExtension.ts
│ │ │ │ │ │ └── useStacSearch.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── types/
│ │ │ │ │ └── types.ts
│ │ │ │ └── story/
│ │ │ │ ├── SpectaPanel.tsx
│ │ │ │ ├── StoryEditorPanel.tsx
│ │ │ │ ├── StoryViewerPanel.tsx
│ │ │ │ ├── components/
│ │ │ │ │ ├── PreviewModeSwitch.tsx
│ │ │ │ │ ├── SpectaDesktopView.tsx
│ │ │ │ │ ├── SpectaMobileView.tsx
│ │ │ │ │ ├── StoryContentSection.tsx
│ │ │ │ │ ├── StoryImageSection.tsx
│ │ │ │ │ ├── StoryNavBar.tsx
│ │ │ │ │ ├── StorySubtitleSection.tsx
│ │ │ │ │ └── StoryTitleSection.tsx
│ │ │ │ └── hooks/
│ │ │ │ └── useStoryMap.ts
│ │ │ ├── formbuilder/
│ │ │ │ ├── creationform.tsx
│ │ │ │ ├── editform.tsx
│ │ │ │ ├── formselectors.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── objectform/
│ │ │ │ ├── SchemaForm.tsx
│ │ │ │ ├── StoryEditorForm.tsx
│ │ │ │ ├── components/
│ │ │ │ │ ├── LayerSelect.tsx
│ │ │ │ │ ├── OpacitySlider.tsx
│ │ │ │ │ ├── SegmentFormSymbology.tsx
│ │ │ │ │ ├── SourcePropertiesField.tsx
│ │ │ │ │ ├── StorySegmentReset.tsx
│ │ │ │ │ └── WmsTileSourceUrlInput.tsx
│ │ │ │ ├── fileselectorwidget.tsx
│ │ │ │ ├── schemaUtils.ts
│ │ │ │ └── useSchemaFormState.ts
│ │ │ ├── gdal.ts
│ │ │ ├── index.ts
│ │ │ ├── keybindings.json
│ │ │ ├── mainview/
│ │ │ │ ├── CollaboratorPointers.tsx
│ │ │ │ ├── FollowIndicator.tsx
│ │ │ │ ├── TemporalSlider.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── mainView.tsx
│ │ │ │ ├── mainviewmodel.ts
│ │ │ │ └── mainviewwidget.tsx
│ │ │ ├── shared/
│ │ │ │ ├── components/
│ │ │ │ │ ├── Badge.tsx
│ │ │ │ │ ├── Button.tsx
│ │ │ │ │ ├── Calendar.tsx
│ │ │ │ │ ├── Checkbox.tsx
│ │ │ │ │ ├── Collapsible.tsx
│ │ │ │ │ ├── Combobox.tsx
│ │ │ │ │ ├── Command.tsx
│ │ │ │ │ ├── Dialog.tsx
│ │ │ │ │ ├── Drawer.tsx
│ │ │ │ │ ├── DropdownMenu.tsx
│ │ │ │ │ ├── Input.tsx
│ │ │ │ │ ├── Pagination.tsx
│ │ │ │ │ ├── Popover.tsx
│ │ │ │ │ ├── RadioGroup.tsx
│ │ │ │ │ ├── Select.tsx
│ │ │ │ │ ├── Sheet.tsx
│ │ │ │ │ ├── SingleDatePicker.tsx
│ │ │ │ │ ├── Switch.tsx
│ │ │ │ │ ├── Tabs.tsx
│ │ │ │ │ ├── ToggleGroup.tsx
│ │ │ │ │ ├── loading.tsx
│ │ │ │ │ └── utils.ts
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── useIsFirstRender.ts
│ │ │ │ │ ├── useLatest.ts
│ │ │ │ │ └── useMediaQuery.ts
│ │ │ │ ├── icons.ts
│ │ │ │ └── store.ts
│ │ │ ├── tools.ts
│ │ │ ├── types/
│ │ │ │ ├── colormap.d.ts
│ │ │ │ ├── geoparquet.d.ts
│ │ │ │ └── ol-load-geopackage.d.ts
│ │ │ ├── types.ts
│ │ │ └── workspace/
│ │ │ ├── menus.ts
│ │ │ ├── panels/
│ │ │ │ ├── components/
│ │ │ │ │ ├── TabbedPanel.tsx
│ │ │ │ │ ├── layers.tsx
│ │ │ │ │ └── legendItem.tsx
│ │ │ │ ├── header.tsx
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── useLayerTree.ts
│ │ │ │ │ ├── useRightPanelOptions.ts
│ │ │ │ │ └── useUIState.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── leftpanel.tsx
│ │ │ │ ├── mergedpanel.tsx
│ │ │ │ └── rightpanel.tsx
│ │ │ ├── statusbar/
│ │ │ │ ├── SpectaPresentationProgressBar.tsx
│ │ │ │ └── StatusBar.tsx
│ │ │ ├── toolbar/
│ │ │ │ ├── index.ts
│ │ │ │ └── widget.tsx
│ │ │ └── widget.ts
│ │ ├── style/
│ │ │ ├── base.css
│ │ │ ├── colorExpression.css
│ │ │ ├── dialog.css
│ │ │ ├── filterPanel.css
│ │ │ ├── index.css
│ │ │ ├── index.js
│ │ │ ├── layerBrowser.css
│ │ │ ├── leftPanel.css
│ │ │ ├── shared/
│ │ │ │ ├── badge.css
│ │ │ │ ├── button.css
│ │ │ │ ├── calendar.css
│ │ │ │ ├── checkbox.css
│ │ │ │ ├── combobox.css
│ │ │ │ ├── command.css
│ │ │ │ ├── dialog.css
│ │ │ │ ├── drawer.css
│ │ │ │ ├── dropdownMenu.css
│ │ │ │ ├── input.css
│ │ │ │ ├── pagination.css
│ │ │ │ ├── popover.css
│ │ │ │ ├── radioGroup.css
│ │ │ │ ├── sheet.css
│ │ │ │ ├── switch.css
│ │ │ │ ├── tabs.css
│ │ │ │ └── toggle.css
│ │ │ ├── spectaProgressBar.css
│ │ │ ├── stacBrowser.css
│ │ │ ├── statusBar.css
│ │ │ ├── storyPanel.css
│ │ │ ├── symbologyDialog.css
│ │ │ ├── tabPanel.css
│ │ │ └── temporalSlider.css
│ │ ├── tsconfig.json
│ │ └── tsconfig.test.json
│ ├── jest.base.js
│ └── schema/
│ ├── cacheGeoJSONSchema.js
│ ├── jest.config.js
│ ├── package.json
│ ├── scripts/
│ │ ├── add-schema-version.js
│ │ ├── dereference-and-combine-schemas-for-registry.js
│ │ ├── preprocess-schemas-for-python-type-generation.js
│ │ ├── process.py
│ │ └── validate-examples.js
│ ├── src/
│ │ ├── doc.ts
│ │ ├── index.ts
│ │ ├── interfaces.ts
│ │ ├── migrations/
│ │ │ ├── index.ts
│ │ │ └── v0_5_to_v0_6.ts
│ │ ├── model.ts
│ │ ├── processing/
│ │ │ ├── ProcessingMerge.ts
│ │ │ └── config/
│ │ │ ├── boundingBoxes.json
│ │ │ ├── buffer.json
│ │ │ ├── centroids.json
│ │ │ ├── concaveHull.json
│ │ │ ├── convexHull.json
│ │ │ └── dissolve.json
│ │ ├── schema/
│ │ │ ├── export/
│ │ │ │ ├── exportGeoJson.json
│ │ │ │ └── exportGeoTiff.json
│ │ │ ├── processing/
│ │ │ │ ├── boundingBoxes.json
│ │ │ │ ├── buffer.json
│ │ │ │ ├── centroids.json
│ │ │ │ ├── concaveHull.json
│ │ │ │ ├── convexHull.json
│ │ │ │ └── dissolve.json
│ │ │ └── project/
│ │ │ ├── jgis.json
│ │ │ ├── layers/
│ │ │ │ ├── heatmapLayer.json
│ │ │ │ ├── hillshadeLayer.json
│ │ │ │ ├── imageLayer.json
│ │ │ │ ├── rasterLayer.json
│ │ │ │ ├── stacLayer.json
│ │ │ │ ├── storySegmentLayer.json
│ │ │ │ ├── vectorLayer.json
│ │ │ │ ├── vectorTileLayer.json
│ │ │ │ └── webGlLayer.json
│ │ │ └── sources/
│ │ │ ├── geoJsonSource.json
│ │ │ ├── geoPackageRasterSource.json
│ │ │ ├── geoPackageVectorSource.json
│ │ │ ├── geoParquetSource.json
│ │ │ ├── geoTiffSource.json
│ │ │ ├── imageSource.json
│ │ │ ├── markerSource.json
│ │ │ ├── rasterDemSource.json
│ │ │ ├── rasterSource.json
│ │ │ ├── shapefileSource.json
│ │ │ ├── vectorTileSource.json
│ │ │ ├── videoSource.json
│ │ │ └── wmsTileSource.json
│ │ ├── token.ts
│ │ └── types.ts
│ ├── test-fixtures/
│ │ └── migrations/
│ │ ├── v0.5.0/
│ │ │ └── legacy-symbology.jGIS
│ │ └── v0.6.0/
│ │ └── legacy-symbology.jGIS
│ ├── tsconfig.json
│ └── tsconfig.test.json
├── paper/
│ ├── paper.bib
│ └── paper.md
├── pyproject.toml
├── python/
│ ├── jupytergis/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── jupytergis/
│ │ │ └── __init__.py
│ │ ├── pyproject.toml
│ │ ├── scripts/
│ │ │ └── bump-version.py
│ │ └── setup.py
│ ├── jupytergis_core/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── jupyter-config/
│ │ │ └── server-config/
│ │ │ └── jupytergis_core.json
│ │ ├── jupytergis_core/
│ │ │ ├── __init__.py
│ │ │ ├── color_ramps.py
│ │ │ ├── colors.py
│ │ │ ├── handler.py
│ │ │ ├── jgis_ydoc.py
│ │ │ ├── migrations/
│ │ │ │ ├── __init__.py
│ │ │ │ └── v0_5_to_v0_6.py
│ │ │ ├── schema/
│ │ │ │ └── __init__.py
│ │ │ └── tests/
│ │ │ ├── __init__.py
│ │ │ └── test_migrations.py
│ │ ├── package.json
│ │ ├── pyproject.toml
│ │ ├── schema/
│ │ │ └── jupytergis-settings.json
│ │ ├── scripts/
│ │ │ └── bump-version.py
│ │ ├── setup.py
│ │ ├── src/
│ │ │ ├── @types/
│ │ │ │ └── wasm.ts
│ │ │ ├── externalcommand.ts
│ │ │ ├── factory.ts
│ │ │ ├── index.ts
│ │ │ ├── jgisplugin/
│ │ │ │ ├── modelfactory.ts
│ │ │ │ └── plugins.ts
│ │ │ ├── layerBrowserRegistry.ts
│ │ │ ├── plugin.ts
│ │ │ └── schemaregistry.ts
│ │ ├── style/
│ │ │ ├── base.css
│ │ │ ├── index.css
│ │ │ └── index.js
│ │ ├── tsconfig.json
│ │ └── webpack.config.js
│ ├── jupytergis_lab/
│ │ ├── .gitignore
│ │ ├── .prettierignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── install.json
│ │ ├── jupytergis_lab/
│ │ │ ├── __init__.py
│ │ │ └── notebook/
│ │ │ ├── __init__.py
│ │ │ ├── explore.py
│ │ │ ├── gis_document.py
│ │ │ ├── tests/
│ │ │ │ ├── __init__.py
│ │ │ │ └── test_api.py
│ │ │ ├── utils.py
│ │ │ └── y_connector.py
│ │ ├── package.json
│ │ ├── pyproject.toml
│ │ ├── scripts/
│ │ │ └── bump-version.py
│ │ ├── setup.py
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ └── notebookrenderer.ts
│ │ ├── style/
│ │ │ ├── base.css
│ │ │ ├── index.css
│ │ │ └── index.js
│ │ └── tsconfig.json
│ ├── jupytergis_lite/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── jupytergis/
│ │ │ └── __init__.py
│ │ ├── pyproject.toml
│ │ ├── scripts/
│ │ │ └── bump-version.py
│ │ └── setup.py
│ └── jupytergis_qgis/
│ ├── .prettierignore
│ ├── LICENSE
│ ├── README.md
│ ├── install.json
│ ├── jupyter-config/
│ │ └── server-config/
│ │ └── jupytergis_qgis.json
│ ├── jupytergis_qgis/
│ │ ├── __init__.py
│ │ ├── handlers.py
│ │ ├── qgis_loader.py
│ │ ├── qgis_ydoc.py
│ │ └── tests/
│ │ ├── __init__.py
│ │ ├── files/
│ │ │ └── project0.qgs
│ │ └── test_qgis.py
│ ├── package.json
│ ├── pyproject.toml
│ ├── schema/
│ │ └── qgisplugin.json
│ ├── scripts/
│ │ └── bump-version.py
│ ├── setup.py
│ ├── src/
│ │ ├── index.ts
│ │ ├── modelfactory.ts
│ │ └── plugins.ts
│ ├── style/
│ │ ├── base.css
│ │ ├── index.css
│ │ └── index.js
│ └── tsconfig.json
├── scripts/
│ ├── build_packages.py
│ ├── dev-install.py
│ └── layer_gallery/
│ ├── README.md
│ ├── layer_gallery/
│ │ ├── __init__.py
│ │ ├── __main__.py
│ │ ├── config.py
│ │ ├── generate.py
│ │ ├── models.py
│ │ ├── thumbnail.py
│ │ └── utils.py
│ ├── pyproject.toml
│ └── tests/
│ ├── __init__.py
│ ├── conftest.py
│ ├── helpers.py
│ ├── test_generate.py
│ ├── test_models.py
│ ├── test_thumbnail.py
│ └── test_utils.py
├── tsconfig.eslint.json
├── tsconfigbase.json
└── ui-tests/
├── content/
│ └── jgis.ipynb
├── jupyter_server_test_config.py
├── package.json
├── playwright-lite.config.js
├── playwright.config.js
└── tests/
├── annotations.spec.ts
├── contextmenu.spec.ts
├── export.spec.ts
├── filters.spec.ts
├── geojson-layers.spec.ts
├── gis-files/
│ ├── annotation-test.jGIS
│ ├── buildings.qgs
│ ├── buildings.qgz
│ ├── context-test.jGIS
│ ├── empty-france.jGIS
│ ├── eq.geojson
│ ├── filter-test.jGIS
│ ├── france-hiking.jGIS
│ ├── france_regions.geojson
│ ├── graduated-lines-test.jGIS
│ ├── panel-test.jGIS
│ ├── roads-test.geojson
│ ├── shapefile-test.jGIS
│ ├── stac-test.jGIS
│ └── test.jGIS
├── graduated-lines.spec.ts
├── layer-browser.spec.ts
├── left-panel.spec.ts
├── lite.spec.ts
├── mobile-panel.spec.ts
├── new-file.spec.ts
├── notebook.spec.ts
├── notebooks/
│ └── Notebook.ipynb
├── stac-browser.spec.ts
└── ui.spec.ts
SYMBOL INDEX (1138 symbols across 205 files)
FILE: packages/base/src/__tests__/migrations.spec.ts
constant FIXTURES_ROOT (line 15) | const FIXTURES_ROOT = path.resolve(
constant VERSION_PAIRS (line 20) | const VERSION_PAIRS: [string, string][] = [['v0.5.0', 'v0.6.0']];
function sharedFixtureNames (line 22) | function sharedFixtureNames(fromV: string, toV: string): string[] {
FILE: packages/base/src/commands/index.ts
constant POINT_SELECTION_TOOL_CLASS (line 35) | const POINT_SELECTION_TOOL_CLASS = 'jGIS-point-selection-tool';
type ICreateEntry (line 37) | interface ICreateEntry {
function loadKeybindings (line 49) | function loadKeybindings(commands: CommandRegistry, keybindings: any[]) {
function addCommands (line 62) | function addCommands(
function createLayerBrowser (line 1881) | function createLayerBrowser(
function createSymbologyDialog (line 1902) | function createSymbologyDialog(
function createEntry (line 1921) | function createEntry({
function removeSelectedItems (line 1954) | function removeSelectedItems(model: IJupyterGISModel | undefined) {
function renameSelectedItem (line 1976) | async function renameSelectedItem(
function executeConsole (line 2001) | function executeConsole(tracker: JupyterGISTracker): void {
function removeConsole (line 2009) | function removeConsole(tracker: JupyterGISTracker): void {
function toggleConsole (line 2018) | async function toggleConsole(
function generateCopyName (line 2030) | function generateCopyName(
FILE: packages/base/src/commands/operationCommands.ts
type LayerCreationSpec (line 20) | type LayerCreationSpec = {
function createLayerCommand (line 34) | function createLayerCommand(
function addLayerCreationCommands (line 99) | function addLayerCreationCommands(options: {
FILE: packages/base/src/constants.ts
type IRegisteredIcon (line 26) | interface IRegisteredIcon {
FILE: packages/base/src/features/annotations/AnnotationsPanel.tsx
type IAnnotationPanelProps (line 6) | interface IAnnotationPanelProps {
class AnnotationsPanel (line 11) | class AnnotationsPanel extends Component<IAnnotationPanelProps> {
method constructor (line 12) | constructor(props: IAnnotationPanelProps) {
method render (line 26) | render(): JSX.Element {
FILE: packages/base/src/features/annotations/components/Annotation.tsx
type IAnnotationProps (line 14) | interface IAnnotationProps {
FILE: packages/base/src/features/annotations/components/Message.tsx
type IProps (line 4) | interface IProps {
FILE: packages/base/src/features/annotations/model.ts
class AnnotationModel (line 10) | class AnnotationModel implements IAnnotationModel {
method constructor (line 11) | constructor(options: AnnotationModel.IOptions) {
method updateSignal (line 15) | get updateSignal(): ISignal<this, null> {
method user (line 19) | get user(): User.IIdentity | undefined {
method model (line 23) | set model(model: IJupyterGISModel | undefined) {
method model (line 32) | get model(): IJupyterGISModel | undefined {
method modelChanged (line 36) | get modelChanged(): ISignal<this, void> {
method update (line 40) | update(): void {
method getAnnotation (line 44) | getAnnotation(id: string): IAnnotation | undefined {
method getAnnotationIds (line 51) | getAnnotationIds(): string[] {
method addAnnotation (line 61) | addAnnotation(key: string, value: IAnnotation): void {
method updateAnnotation (line 65) | updateAnnotation(id: string, updates: Partial<IAnnotation>): void {
method removeAnnotation (line 76) | removeAnnotation(key: string): void {
method addContent (line 80) | addContent(id: string, value: string): void {
type IOptions (line 103) | interface IOptions {
FILE: packages/base/src/features/console/consoleview.ts
class ConsoleView (line 16) | class ConsoleView extends BoxPanel {
method constructor (line 17) | constructor(options: ConsoleView.IOptions) {
method consolePanel (line 55) | get consolePanel() {
method dispose (line 59) | dispose(): void {
method execute (line 66) | execute() {
method onResize (line 70) | protected onResize(msg: Widget.ResizeMessage): void {
type IOptions (line 81) | interface IOptions {
FILE: packages/base/src/features/filter/Filter.tsx
type IFilterComponentProps (line 17) | interface IFilterComponentProps {
FILE: packages/base/src/features/identify/IdentifyPanel.tsx
type IIdentifyComponentProps (line 12) | interface IIdentifyComponentProps {
FILE: packages/base/src/features/layer-browser/index.tsx
type ILayerBrowserDialogProps (line 20) | interface ILayerBrowserDialogProps {
type ILayerBrowserOptions (line 245) | interface ILayerBrowserOptions {
class LayerBrowserWidget (line 251) | class LayerBrowserWidget extends Dialog<boolean> {
method constructor (line 252) | constructor(options: ILayerBrowserOptions) {
method resolve (line 289) | resolve(index?: number): void {
FILE: packages/base/src/features/layers/forms/layer/heatmapLayerForm.tsx
function fetchFeatureNames (line 14) | async function fetchFeatureNames(
function HeatmapLayerPropertiesForm (line 46) | function HeatmapLayerPropertiesForm(
FILE: packages/base/src/features/layers/forms/layer/hillshadeLayerForm.tsx
function HillshadeLayerPropertiesForm (line 14) | function HillshadeLayerPropertiesForm(
FILE: packages/base/src/features/layers/forms/layer/layerform.tsx
type ILayerProps (line 19) | interface ILayerProps extends IBaseFormProps {
function LayerPropertiesForm (line 37) | function LayerPropertiesForm(
FILE: packages/base/src/features/layers/forms/layer/storySegmentLayerForm.tsx
function getFirstSelectedStorySegmentLayerId (line 17) | function getFirstSelectedStorySegmentLayerId(
function StorySegmentLayerPropertiesForm (line 46) | function StorySegmentLayerPropertiesForm(
FILE: packages/base/src/features/layers/forms/layer/vectorlayerform.tsx
function VectorLayerPropertiesForm (line 14) | function VectorLayerPropertiesForm(
FILE: packages/base/src/features/layers/forms/layer/webGlLayerForm.tsx
function WebGlLayerPropertiesForm (line 14) | function WebGlLayerPropertiesForm(
FILE: packages/base/src/features/layers/forms/source/geojsonsource.tsx
function GeoJSONSourcePropertiesForm (line 18) | function GeoJSONSourcePropertiesForm(
FILE: packages/base/src/features/layers/forms/source/geopackagesource.tsx
function GeoPackagePropertiesForm (line 16) | function GeoPackagePropertiesForm(
FILE: packages/base/src/features/layers/forms/source/geotiffsource.tsx
function GeoTiffSourcePropertiesForm (line 16) | function GeoTiffSourcePropertiesForm(
FILE: packages/base/src/features/layers/forms/source/pathbasedsource.tsx
function PathBasedSourcePropertiesForm (line 16) | function PathBasedSourcePropertiesForm(
FILE: packages/base/src/features/layers/forms/source/sourceform.tsx
type ISourceFormProps (line 19) | interface ISourceFormProps extends IBaseFormProps {
function SourcePropertiesForm (line 36) | function SourcePropertiesForm(
FILE: packages/base/src/features/layers/forms/source/tilesourceform.tsx
function getUrlParameters (line 14) | function getUrlParameters(url: string | undefined): string[] {
function TileSourcePropertiesForm (line 33) | function TileSourcePropertiesForm(
FILE: packages/base/src/features/layers/forms/source/wmsTileSource.tsx
constant WMS_AVAILABLE_LAYERS_CACHE (line 17) | const WMS_AVAILABLE_LAYERS_CACHE = 'jgis:wmsTileSource:availableLayers';
function WmsTileSourceForm (line 19) | function WmsTileSourceForm(
FILE: packages/base/src/features/layers/layerCreationFormDialog.tsx
type ICreationFormWrapperProps (line 9) | interface ICreationFormWrapperProps extends ICreationFormProps {
type ICreationFormDialogOptions (line 34) | interface ICreationFormDialogOptions extends ICreationFormProps {
class LayerCreationFormDialog (line 78) | class LayerCreationFormDialog extends Dialog<IDict> {
method constructor (line 79) | constructor(options: ICreationFormDialogOptions) {
method resolve (line 148) | resolve(index?: number): void {
FILE: packages/base/src/features/layers/symbology/__tests__/styleBuilder.spec.ts
function graduatedStopValues (line 16) | function graduatedStopValues(
constant BASE_STATE (line 28) | const BASE_STATE: SymbologyState = {
FILE: packages/base/src/features/layers/symbology/colorRampUtils.ts
type RgbaColor (line 11) | type RgbaColor = [number, number, number, number];
constant RGBA_INDEX (line 12) | const RGBA_INDEX = { r: 0, g: 1, b: 2, a: 3 } as const;
type RgbaChannel (line 13) | type RgbaChannel = keyof typeof RGBA_INDEX;
constant DEFAULT_COLOR (line 16) | const DEFAULT_COLOR: RgbaColor = [51, 153, 204, 1];
constant DEFAULT_STROKE_WIDTH (line 19) | const DEFAULT_STROKE_WIDTH = 1.25;
function isColor (line 26) | function isColor(val: unknown): boolean {
function findExprNode (line 38) | function findExprNode(
type IColorMap (line 57) | interface IColorMap {
constant COLOR_RAMP_NAMES (line 67) | const COLOR_RAMP_NAMES = [
constant COLOR_RAMP_DEFAULTS (line 125) | const COLOR_RAMP_DEFAULTS: Partial<Record<ColorRampName, number>> = {
constant D3_CATEGORICAL_SCHEMES (line 132) | const D3_CATEGORICAL_SCHEMES = {
type D3SchemeName (line 146) | type D3SchemeName = keyof typeof D3_CATEGORICAL_SCHEMES;
type ColorRampName (line 148) | type ColorRampName = (typeof COLOR_RAMP_NAMES)[number] | D3SchemeName;
function colorToRgba (line 219) | function colorToRgba(color: unknown): RgbaColor {
FILE: packages/base/src/features/layers/symbology/components/color_ramp/ColorRampControls.tsx
type IColorRampControlsProps (line 30) | interface IColorRampControlsProps {
type ColorRampControlsOptions (line 44) | type ColorRampControlsOptions = {
FILE: packages/base/src/features/layers/symbology/components/color_ramp/ColorRampSelector.tsx
type IColorRampSelectorProps (line 25) | interface IColorRampSelectorProps {
FILE: packages/base/src/features/layers/symbology/components/color_ramp/ColorRampSelectorEntry.tsx
type IColorRampSelectorEntryProps (line 21) | interface IColorRampSelectorEntryProps {
FILE: packages/base/src/features/layers/symbology/components/color_ramp/ModeSelectRow.tsx
type IModeSelectRowProps (line 4) | interface IModeSelectRowProps {
FILE: packages/base/src/features/layers/symbology/components/color_ramp/RgbaColorPicker.tsx
type IRgbaColorPickerProps (line 12) | interface IRgbaColorPickerProps {
FILE: packages/base/src/features/layers/symbology/components/color_stops/StopContainer.tsx
type IStopContainerProps (line 8) | interface IStopContainerProps {
FILE: packages/base/src/features/layers/symbology/hooks/useEffectiveSymbologyParams.ts
type IUseEffectiveSymbologyParamsArgs (line 9) | interface IUseEffectiveSymbologyParamsArgs {
function useEffectiveSymbologyParams (line 23) | function useEffectiveSymbologyParams<
FILE: packages/base/src/features/layers/symbology/hooks/useGetBandInfo.ts
type IBandRow (line 7) | interface IBandRow {
FILE: packages/base/src/features/layers/symbology/hooks/useGetProperties.ts
type IUseGetPropertiesProps (line 8) | interface IUseGetPropertiesProps {
type IUseGetPropertiesResult (line 13) | interface IUseGetPropertiesResult {
function getGeoJsonProperties (line 19) | async function getGeoJsonProperties({
function getVectorTileProperties (line 58) | function getVectorTileProperties({
FILE: packages/base/src/features/layers/symbology/hooks/useGetSymbology.ts
type IUseGetSymbologyProps (line 4) | interface IUseGetSymbologyProps {
type IUseGetSymbologyResult (line 9) | interface IUseGetSymbologyResult {
FILE: packages/base/src/features/layers/symbology/hooks/useOkSignal.ts
type OkSignalPromise (line 4) | type OkSignalPromise = {
function useOkSignal (line 8) | function useOkSignal(
FILE: packages/base/src/features/layers/symbology/styleBuilder.ts
type SymbologyState (line 15) | type SymbologyState = NonNullable<IVectorLayer['symbologyState']>;
type GeometryType (line 16) | type GeometryType = 'fill' | 'circle' | 'line';
constant DEFAULT_RADIUS (line 18) | const DEFAULT_RADIUS = 5;
constant TRANSPARENT (line 19) | const TRANSPARENT: RgbaColor = [0, 0, 0, 0];
constant DEFAULT_FLAT_STYLE (line 24) | const DEFAULT_FLAT_STYLE: FlatStyle = {
type IComputedStop (line 35) | interface IComputedStop {
type IComputedRadiusStop (line 41) | interface IComputedRadiusStop {
function buildVectorFlatStyle (line 57) | function buildVectorFlatStyle(
function buildTransparentFallbackFilter (line 83) | function buildTransparentFallbackFilter(
function overrideToComputedStops (line 136) | function overrideToComputedStops(
function computeGraduatedColorStops (line 165) | function computeGraduatedColorStops(
function computeCategorizedColorStops (line 250) | function computeCategorizedColorStops(
function computeGraduatedRadiusStops (line 281) | function computeGraduatedRadiusStops(
function mapStopsToColors (line 351) | function mapStopsToColors(
function generateColors (line 370) | function generateColors(
function buildSingleSymbol (line 433) | function buildSingleSymbol(state: SymbologyState): FlatStyle {
function buildGraduated (line 456) | function buildGraduated(
function buildCategorized (line 541) | function buildCategorized(
function buildCanonical (line 596) | function buildCanonical(state: SymbologyState): FlatStyle {
function nonNegative (line 630) | function nonNegative(value: number | undefined, fallback: number): number {
FILE: packages/base/src/features/layers/symbology/symbologyDialog.tsx
type ISymbologyDialogProps (line 12) | interface ISymbologyDialogProps {
type ISymbologyDialogWithAttributesProps (line 20) | interface ISymbologyDialogWithAttributesProps extends ISymbologyDialogPr...
type ISymbologyTabbedDialogProps (line 24) | interface ISymbologyTabbedDialogProps extends ISymbologyDialogProps {
type ISymbologyTabbedDialogWithAttributesProps (line 28) | type ISymbologyTabbedDialogWithAttributesProps =
type ISymbologyWidgetOptions (line 31) | interface ISymbologyWidgetOptions {
type IStopRow (line 38) | interface IStopRow {
class SymbologyWidget (line 123) | class SymbologyWidget extends Dialog<boolean> {
method constructor (line 126) | constructor(options: ISymbologyWidgetOptions) {
method resolve (line 150) | resolve(index: number): void {
FILE: packages/base/src/features/layers/symbology/symbologyUtils.ts
type ISymbologyPayload (line 20) | interface ISymbologyPayload {
type ISaveSymbologyOptions (line 33) | interface ISaveSymbologyOptions {
type VectorSymbologyParams (line 42) | type VectorSymbologyParams = Pick<
type WebGlSymbologyParams (line 47) | type WebGlSymbologyParams = Pick<
type IEffectiveSymbologyParams (line 53) | type IEffectiveSymbologyParams =
function getEffectiveSymbologyParams (line 61) | function getEffectiveSymbologyParams(
function saveSymbology (line 88) | function saveSymbology(options: ISaveSymbologyOptions): void {
FILE: packages/base/src/features/layers/symbology/tiff_layer/components/BandRow.tsx
type IBandRowProps (line 5) | interface IBandRowProps {
FILE: packages/base/src/features/layers/symbology/tiff_layer/types/MultibandColor.tsx
type ISelectedBands (line 17) | interface ISelectedBands {
type rgbEnum (line 24) | type rgbEnum = keyof ISelectedBands;
FILE: packages/base/src/features/layers/symbology/tiff_layer/types/SingleBandPseudoColor.tsx
type InterpolationType (line 31) | type InterpolationType = 'discrete' | 'linear' | 'exact';
FILE: packages/base/src/features/layers/symbology/vector_layer/VectorRendering.tsx
type IRenderTypeProps (line 20) | interface IRenderTypeProps {
type RenderTypeOptions (line 26) | type RenderTypeOptions = {
type ISelectableRenderTypeProps (line 30) | interface ISelectableRenderTypeProps extends IRenderTypeProps {
type SelectableRenderTypes (line 34) | type SelectableRenderTypes = {
constant RENDER_TYPE_OPTIONS (line 38) | const RENDER_TYPE_OPTIONS: RenderTypeOptions = {
FILE: packages/base/src/features/layers/symbology/vector_layer/components/ValueSelect.tsx
type IValueSelectProps (line 3) | interface IValueSelectProps {
FILE: packages/base/src/features/layers/symbology/vector_layer/types/Canonical.tsx
constant TRANSPARENT (line 17) | const TRANSPARENT: RgbaColor = [0, 0, 0, 0];
FILE: packages/base/src/features/layers/symbology/vector_layer/types/Graduated.tsx
type SymbologyState (line 209) | type SymbologyState = NonNullable<IVectorLayer['symbologyState']>;
FILE: packages/base/src/features/layers/symbology/vector_layer/types/SimpleSymbol.tsx
type SymbologyState (line 85) | type SymbologyState = NonNullable<IVectorLayer['symbologyState']>;
FILE: packages/base/src/features/objectproperties/index.tsx
type IStates (line 11) | interface IStates {
type IProps (line 19) | interface IProps {
class ObjectPropertiesReact (line 26) | class ObjectPropertiesReact extends React.Component<IProps, IStates> {
method constructor (line 27) | constructor(props: IProps) {
method render (line 91) | render(): React.ReactNode {
FILE: packages/base/src/features/processing/ProcessingFormDialog.tsx
type IProcessingFormDialogOptions (line 11) | interface IProcessingFormDialogOptions extends IBaseFormProps {
type IProcessingFormWrapperProps (line 29) | interface IProcessingFormWrapperProps extends IProcessingFormDialogOptio...
class ProcessingFormDialog (line 76) | class ProcessingFormDialog extends Dialog<IDict> {
method constructor (line 77) | constructor(options: IProcessingFormDialogOptions) {
method resolve (line 172) | resolve(index?: number): void {
FILE: packages/base/src/features/processing/forms/dissolveProcessForm.tsx
type IDissolveFormProps (line 16) | interface IDissolveFormProps extends IBaseFormProps {
function fetchFieldNames (line 21) | async function fetchFieldNames(
function DissolveForm (line 51) | function DissolveForm(
FILE: packages/base/src/features/processing/forms/processingForm.tsx
type IProcessingFormWrapperProps (line 18) | interface IProcessingFormWrapperProps extends IBaseFormProps {
function DefaultProcessingForm (line 23) | function DefaultProcessingForm(
FILE: packages/base/src/features/processing/index.ts
function getSingleSelectedLayer (line 23) | function getSingleSelectedLayer(
function selectedLayerIsOfType (line 53) | function selectedLayerIsOfType(
function getLayerGeoJSON (line 64) | async function getLayerGeoJSON(
type GdalFunctions (line 85) | type GdalFunctions =
function processLayer (line 94) | async function processLayer(
function executeSQLProcessing (line 219) | async function executeSQLProcessing(
FILE: packages/base/src/features/processing/processingCommands.ts
function replaceInSql (line 14) | function replaceInSql(
function addProcessingCommands (line 43) | function addProcessingCommands(
FILE: packages/base/src/features/processing/processingFormToParam.ts
function processingFormToParam (line 8) | function processingFormToParam(
FILE: packages/base/src/features/stac-browser/components/StacPanel.tsx
constant GEODES_URL (line 19) | const GEODES_URL = 'https://geodes-portal.cnes.fr/api/stac/';
constant COPERNICUS_URL (line 20) | const COPERNICUS_URL = 'https://stac.dataspace.copernicus.eu/v1/';
constant WORLDPOP_URL (line 21) | const WORLDPOP_URL = 'https://api.stac.worldpop.org/';
type IProvider (line 24) | interface IProvider {
constant PROVIDERS (line 29) | const PROVIDERS: IProvider[] = [
constant URL_TO_PANEL_MAP (line 37) | const URL_TO_PANEL_MAP: Record<
type IStacViewProps (line 44) | interface IStacViewProps {
function ProviderSelect (line 110) | function ProviderSelect() {
FILE: packages/base/src/features/stac-browser/components/filter-extension/QueryableComboBox.tsx
type IQueryableComboProps (line 23) | interface IQueryableComboProps {
type IOperatorOption (line 29) | interface IOperatorOption {
function QueryableComboBox (line 34) | function QueryableComboBox({
FILE: packages/base/src/features/stac-browser/components/filter-extension/QueryableRow.tsx
type IOperatorOption (line 10) | interface IOperatorOption {
type IQueryableRowProps (line 15) | interface IQueryableRowProps {
function QueryableRow (line 24) | function QueryableRow({
FILE: packages/base/src/features/stac-browser/components/filter-extension/StacFilterExtensionPanel.tsx
type IStacFilterExtensionPanelProps (line 13) | interface IStacFilterExtensionPanelProps {
type FilteredCollection (line 17) | type FilteredCollection = Pick<IStacCollection, 'id' | 'title'>;
function StacFilterExtensionPanel (line 19) | function StacFilterExtensionPanel({ model }: IStacFilterExtensionPanelPr...
FILE: packages/base/src/features/stac-browser/components/filter-extension/StacQueryableFilters.tsx
type IStacQueryableFilterListProps (line 12) | interface IStacQueryableFilterListProps {
FILE: packages/base/src/features/stac-browser/components/geodes/StacFilterSection.tsx
type StacFilterSectionProps (line 27) | type StacFilterSectionProps =
FILE: packages/base/src/features/stac-browser/components/geodes/StacGeodesFilterPanel.tsx
type IStacGeodesFilterPanelProps (line 14) | interface IStacGeodesFilterPanelProps {
FILE: packages/base/src/features/stac-browser/components/shared/StacPanelResults.tsx
function getPageItems (line 16) | function getPageItems(
FILE: packages/base/src/features/stac-browser/components/shared/StacSpatialExtent.tsx
type IStacSpatialExtentProps (line 5) | interface IStacSpatialExtentProps {
FILE: packages/base/src/features/stac-browser/components/shared/StacTemporalExtent.tsx
type IStacTemporalExtentProps (line 5) | interface IStacTemporalExtentProps {
function StacTemporalExtent (line 12) | function StacTemporalExtent({
FILE: packages/base/src/features/stac-browser/constants.ts
type DatasetsType (line 201) | type DatasetsType = typeof datasets;
type PlatformsType (line 202) | type PlatformsType = typeof platforms;
type ProductsType (line 203) | type ProductsType = typeof products;
FILE: packages/base/src/features/stac-browser/context/StacResultsContext.tsx
type IStacResultsContext (line 24) | interface IStacResultsContext {
type IStacResultsProviderProps (line 58) | interface IStacResultsProviderProps {
type IStacSelectedUrlStateDb (line 63) | interface IStacSelectedUrlStateDb {
constant STAC_SELECTED_URL_STATE_KEY (line 67) | const STAC_SELECTED_URL_STATE_KEY = 'jupytergis:stac-selected-url';
function StacResultsProvider (line 69) | function StacResultsProvider({
function useStacResultsContext (line 436) | function useStacResultsContext() {
FILE: packages/base/src/features/stac-browser/hooks/useGeodesSearch.ts
type IUseGeodesSearchProps (line 16) | interface IUseGeodesSearchProps {
type IUseGeodesSearchReturn (line 20) | interface IUseGeodesSearchReturn {
type IStacQueryBody (line 32) | interface IStacQueryBody {
constant GEODES_STAC_FILTERS_KEY (line 58) | const GEODES_STAC_FILTERS_KEY = 'jupytergis:geodes-stac-filters';
function useGeodesSearch (line 66) | function useGeodesSearch({
FILE: packages/base/src/features/stac-browser/hooks/useStacFilterExtension.ts
type FilteredCollection (line 21) | type FilteredCollection = Pick<IStacCollection, 'id' | 'title'>;
type IStacFilterExtensionStateDb (line 23) | interface IStacFilterExtensionStateDb {
constant STAC_FILTER_EXTENSION_STATE_KEY (line 32) | const STAC_FILTER_EXTENSION_STATE_KEY =
constant STAC_COLLECTIONS_CACHE_STATE_KEY (line 34) | const STAC_COLLECTIONS_CACHE_STATE_KEY = 'jupytergis:stac-collections-ca...
constant STAC_QUERYABLES_CACHE_STATE_KEY (line 35) | const STAC_QUERYABLES_CACHE_STATE_KEY = 'jupytergis:stac-queryables-cache';
type IUseStacFilterExtensionProps (line 37) | interface IUseStacFilterExtensionProps {
function useStacFilterExtension (line 47) | function useStacFilterExtension({
FILE: packages/base/src/features/stac-browser/hooks/useStacSearch.ts
type IUseStacSearchProps (line 6) | interface IUseStacSearchProps {
type IUseStacSearchReturn (line 10) | interface IUseStacSearchReturn {
type IStacSearchStateDb (line 22) | interface IStacSearchStateDb {
constant STAC_SEARCH_STATE_KEY (line 28) | const STAC_SEARCH_STATE_KEY = 'jupytergis:stac-search-state';
function useStacSearch (line 33) | function useStacSearch({
FILE: packages/base/src/features/stac-browser/types/types.ts
type IStacCollectionsReturn (line 1) | interface IStacCollectionsReturn {
type IStacCollection (line 6) | interface IStacCollection {
type IStacRange (line 27) | interface IStacRange {
type IStacExtent (line 32) | interface IStacExtent {
type IStacTemporalExtent (line 37) | interface IStacTemporalExtent {
type IStacSpatialExtent (line 41) | interface IStacSpatialExtent {
type IStacProvider (line 45) | interface IStacProvider {
type IStacLink (line 52) | interface IStacLink {
type IStacPaginationLink (line 63) | interface IStacPaginationLink extends IStacLink {
type IStacAsset (line 68) | interface IStacAsset {
type IStacItem (line 76) | interface IStacItem {
type IStacSearchResult (line 108) | interface IStacSearchResult {
type Operator (line 120) | type Operator = '=' | '!=' | '<' | '<=' | '>' | '>=';
type IStacFilterCondition (line 126) | interface IStacFilterCondition {
type FilterOperator (line 131) | type FilterOperator = 'and' | 'or';
type IStacCql2Filter (line 136) | interface IStacCql2Filter {
type IQueryableFilter (line 141) | interface IQueryableFilter {
type UpdateSelectedQueryables (line 146) | type UpdateSelectedQueryables = (
type IStacQueryableSchema (line 157) | interface IStacQueryableSchema {
type IStacQueryables (line 175) | type IStacQueryables = [string, IStacQueryableSchema][];
type IStacFilterExtensionQueryBody (line 181) | interface IStacFilterExtensionQueryBody {
type IStacGeodesQueryBody (line 192) | interface IStacGeodesQueryBody {
type IStacQueryBodyUnion (line 222) | type IStacQueryBodyUnion =
type StacFilterKey (line 226) | type StacFilterKey =
type StacFilterState (line 233) | type StacFilterState = Record<StacFilterKey, Set<string>>;
type StacFilterStateStateDb (line 236) | type StacFilterStateStateDb = { [K in keyof StacFilterState]: string[] };
type StacFilterSetters (line 239) | type StacFilterSetters = Record<
type SetResultsFunction (line 245) | type SetResultsFunction = (
FILE: packages/base/src/features/story/SpectaPanel.tsx
type ISpectaPanelProps (line 9) | interface ISpectaPanelProps {
function SpectaPanel (line 20) | function SpectaPanel({
FILE: packages/base/src/features/story/StoryEditorPanel.tsx
type IStoryPanelProps (line 14) | interface IStoryPanelProps {
function StoryEditorPanel (line 29) | function StoryEditorPanel({ model, commands }: IStoryPanelProps) {
FILE: packages/base/src/features/story/StoryViewerPanel.tsx
type IStoryViewerPanelProps (line 15) | interface IStoryViewerPanelProps {
type IStoryViewerPanelHandle (line 32) | interface IStoryViewerPanelHandle {
type StoryNavPlacement (line 51) | type StoryNavPlacement =
function getStoryNavPlacement (line 59) | function getStoryNavPlacement(
function StoryViewerPanel (line 78) | function StoryViewerPanel({
FILE: packages/base/src/features/story/components/PreviewModeSwitch.tsx
type IPreviewModeSwitchProps (line 5) | interface IPreviewModeSwitchProps {
function PreviewModeSwitch (line 10) | function PreviewModeSwitch({
FILE: packages/base/src/features/story/components/SpectaDesktopView.tsx
type ISpectaDesktopViewProps (line 18) | interface ISpectaDesktopViewProps {
function SpectaDesktopView (line 36) | function SpectaDesktopView({
FILE: packages/base/src/features/story/components/SpectaMobileView.tsx
constant MAIN_ID (line 17) | const MAIN_ID = 'jp-main-content-panel';
constant SEGMENT_PANEL_ID (line 18) | const SEGMENT_PANEL_ID = 'jgis-story-segment-panel';
constant SEGMENT_HEADER_ID (line 19) | const SEGMENT_HEADER_ID = 'jgis-story-segment-header';
constant SNAP_FIRST_MIN (line 21) | const SNAP_FIRST_MIN = 0.3;
constant SNAP_FIRST_MAX (line 22) | const SNAP_FIRST_MAX = 0.95;
constant SNAP_FIRST_DEFAULT (line 23) | const SNAP_FIRST_DEFAULT = 0.7;
constant SEGMENT_HEADER_OFFSET_PX (line 25) | const SEGMENT_HEADER_OFFSET_PX = 16.8 * 2 + 18.76;
type ISpectaMobileViewProps (line 27) | interface ISpectaMobileViewProps {
function getFirstSnapFromSegmentHeader (line 47) | function getFirstSnapFromSegmentHeader(
function SpectaMobileView (line 67) | function SpectaMobileView({
FILE: packages/base/src/features/story/components/StoryContentSection.tsx
type IStoryContentProps (line 4) | interface IStoryContentProps {
function StoryContentSection (line 8) | function StoryContentSection({ markdown }: IStoryContentProps) {
FILE: packages/base/src/features/story/components/StoryImageSection.tsx
type IStoryImageSectionProps (line 3) | interface IStoryImageSectionProps {
function StoryImageSection (line 11) | function StoryImageSection({
FILE: packages/base/src/features/story/components/StoryNavBar.tsx
type IStoryNavBarProps (line 7) | interface IStoryNavBarProps {
function StoryNavBar (line 15) | function StoryNavBar({
FILE: packages/base/src/features/story/components/StorySubtitleSection.tsx
type IStorySubtitleSectionProps (line 3) | interface IStorySubtitleSectionProps {
function StorySubtitleSection (line 8) | function StorySubtitleSection({ title, navSlot }: IStorySubtitleSectionP...
FILE: packages/base/src/features/story/components/StoryTitleSection.tsx
type IStoryTitleSectionProps (line 3) | interface IStoryTitleSectionProps {
function StoryTitleSection (line 8) | function StoryTitleSection({ title, navSlot }: IStoryTitleSectionProps) {
FILE: packages/base/src/features/story/hooks/useStoryMap.ts
type IOverrideLayerEntry (line 20) | interface IOverrideLayerEntry {
type IUseStoryMapParams (line 25) | interface IUseStoryMapParams {
function getSpectaPresentationStyle (line 36) | function getSpectaPresentationStyle(
function useStoryMap (line 53) | function useStoryMap({
FILE: packages/base/src/formbuilder/creationform.tsx
type ICreationFormProps (line 18) | interface ICreationFormProps {
function CreationForm (line 85) | function CreationForm(props: ICreationFormProps) {
FILE: packages/base/src/formbuilder/editform.tsx
type IEditFormProps (line 16) | interface IEditFormProps {
function syncObjectProperties (line 31) | function syncObjectProperties(
function EditForm (line 45) | function EditForm(props: IEditFormProps): React.ReactElement | null {
FILE: packages/base/src/formbuilder/formselectors.ts
function getLayerTypeForm (line 24) | function getLayerTypeForm(
function getSourceTypeForm (line 53) | function getSourceTypeForm(
FILE: packages/base/src/formbuilder/objectform/SchemaForm.tsx
type ISchemaFormProps (line 17) | interface ISchemaFormProps {
function hasExtraErrors (line 45) | function hasExtraErrors(extraErrors: IDict | undefined): boolean {
function SchemaForm (line 75) | function SchemaForm(props: ISchemaFormProps): React.ReactElement {
FILE: packages/base/src/formbuilder/objectform/StoryEditorForm.tsx
function StoryEditorPropertiesForm (line 10) | function StoryEditorPropertiesForm(
FILE: packages/base/src/formbuilder/objectform/components/LayerSelect.tsx
type StorySegmentFormContext (line 8) | type StorySegmentFormContext = IJupyterGISFormContext<IStorySegmentLayer>;
function LayerSelect (line 14) | function LayerSelect(props: FieldProps) {
FILE: packages/base/src/formbuilder/objectform/components/OpacitySlider.tsx
function OpacitySlider (line 5) | function OpacitySlider({ formData, onChange }: FieldProps<number>) {
FILE: packages/base/src/formbuilder/objectform/components/SegmentFormSymbology.tsx
type ILayerOverrideFormItem (line 19) | interface ILayerOverrideFormItem {
type ILayerOverrideItemProps (line 25) | interface ILayerOverrideItemProps {
constant SELECTION_SETTLE_MS (line 30) | const SELECTION_SETTLE_MS = 100;
function LayerOverrideItem (line 32) | function LayerOverrideItem({ item, formContext }: ILayerOverrideItemProp...
function ArrayFieldTemplate (line 101) | function ArrayFieldTemplate(props: ArrayFieldTemplateProps) {
FILE: packages/base/src/formbuilder/objectform/components/SourcePropertiesField.tsx
function SourcePropertiesField (line 13) | function SourcePropertiesField(props: FieldProps): React.ReactElement {
FILE: packages/base/src/formbuilder/objectform/components/StorySegmentReset.tsx
type IStorySegmentResetProps (line 8) | interface IStorySegmentResetProps {
function StorySegmentReset (line 13) | function StorySegmentReset({ model, layerId }: IStorySegmentResetProps) {
FILE: packages/base/src/formbuilder/objectform/components/WmsTileSourceUrlInput.tsx
function WmsTileSourceUrlInput (line 11) | function WmsTileSourceUrlInput(
FILE: packages/base/src/formbuilder/objectform/schemaUtils.ts
function removeFormEntry (line 13) | function removeFormEntry(
function processBaseSchema (line 35) | function processBaseSchema(
FILE: packages/base/src/formbuilder/objectform/useSchemaFormState.ts
type IUseSchemaFormStateProps (line 21) | interface IUseSchemaFormStateProps {
type IUseSchemaFormStateResult (line 36) | interface IUseSchemaFormStateResult {
function useSchemaFormState (line 60) | function useSchemaFormState(
FILE: packages/base/src/gdal.ts
function getGdal (line 3) | async function getGdal() {
FILE: packages/base/src/mainview/CollaboratorPointers.tsx
type ICollaboratorPointersProps (line 9) | interface ICollaboratorPointersProps {
type ClientPointer (line 13) | type ClientPointer = {
FILE: packages/base/src/mainview/FollowIndicator.tsx
type IFollowIndicatorProps (line 4) | interface IFollowIndicatorProps {
FILE: packages/base/src/mainview/TemporalSlider.tsx
type ITemporalSliderProps (line 25) | interface ITemporalSliderProps {
FILE: packages/base/src/mainview/mainView.tsx
type OlLayerTypes (line 151) | type OlLayerTypes =
constant DRAW_GEOMETRIES (line 162) | const DRAW_GEOMETRIES = ['Point', 'LineString', 'Polygon'] as const;
type IMainViewProps (line 180) | interface IMainViewProps {
type IStates (line 190) | interface IStates {
class MainView (line 211) | class MainView extends React.Component<IMainViewProps, IStates> {
method constructor (line 212) | constructor(props: IMainViewProps) {
method componentDidMount (line 333) | async componentDidMount(): Promise<void> {
method componentDidUpdate (line 355) | componentDidUpdate(prevProps: IMainViewProps, prevState: IStates): void {
method componentWillUnmount (line 366) | componentWillUnmount(): void {
method generateMap (line 399) | async generateMap(
method addSource (line 810) | async addSource(id: string, source: IJGISSource): Promise<void> {
method computeSourceUrl (line 1259) | private computeSourceUrl(source: IJGISSource): string {
method updateSource (line 1285) | async updateSource(id: string, source: IJGISSource): Promise<void> {
method removeSource (line 1306) | removeSource(id: string): void {
method updateLayers (line 1315) | updateLayers(layerIds: string[]): void {
method _updateLayersImpl (line 1325) | private async _updateLayersImpl(layerIds: string[]): Promise<void> {
method _buildMapLayer (line 1385) | private async _buildMapLayer(
method addProjection (line 1553) | addProjection(newMapLayer: Layer) {
method addLayer (line 1593) | async addLayer(id: string, layer: IJGISLayer, index: number): Promise<...
method elevation (line 1724) | function elevation(xOffset: number, yOffset: number) {
method updateLayer (line 1769) | async updateLayer(
method flyToGeometry (line 1911) | private flyToGeometry(sender: IJupyterGISModel, geometry: any): void {
method highlightFeatureOnMap (line 1927) | private highlightFeatureOnMap(
method _computeExtent (line 2018) | private _computeExtent(
method _computeZoomFromExtent (line 2051) | private _computeZoomFromExtent(extent: number[]): number | null {
method _getLayerCreatorId (line 2065) | private _getLayerCreatorId(layerId: string): number | undefined {
method _trackLayerViewState (line 2080) | private _trackLayerViewState(
method _trackSourceExtZoom (line 2118) | private _trackSourceExtZoom(sourceId: string, olSource: Source): void {
method _waitForReady (line 2141) | private _waitForReady(): Promise<void> {
method _waitForSourceReady (line 2163) | private _waitForSourceReady(layer: Layer | LayerGroup) {
method removeLayer (line 2189) | removeLayer(id: string): void {
method _onSharedOptionsChanged (line 2344) | private _onSharedOptionsChanged(): void {
method _syncSettingsFromRegistry (line 2371) | private async _syncSettingsFromRegistry() {
method _onSettingsChanged (line 2379) | private _onSettingsChanged(): void {
method updateOptions (line 2401) | private async updateOptions(options: IJGISOptions): Promise<void> {
method _onViewChanged (line 2453) | private _onViewChanged(
method getLayer (line 2464) | private getLayer(id: string) {
method getLayerIndex (line 2475) | private getLayerIndex(id: string) {
method getLayerIDs (line 2485) | private getLayerIDs(): string[] {
method moveLayer (line 2498) | moveLayer(id: string, index: number): void {
method replaceLayer (line 2523) | replaceLayer(id: string, layer: IJGISLayer) {
method _onLayersChanged (line 2529) | private _onLayersChanged(
method _onLayerTreeChange (line 2574) | private _onLayerTreeChange(
method _onSourcesChange (line 2584) | private _onSourcesChange(
method _computeAnnotationPosition (line 2802) | private _computeAnnotationPosition(annotation: IAnnotation) {
method _updateAnnotation (line 2811) | private _updateAnnotation() {
method _onZoomToPosition (line 2828) | private _onZoomToPosition(_: IJupyterGISModel, id: string) {
method _moveToPosition (line 2937) | private _moveToPosition(
method _flyToPosition (line 2956) | private _flyToPosition(
method _onPointerMove (line 3012) | private _onPointerMove(e: PointerEvent) {
method _addMarker (line 3027) | private async _addMarker(e: MapBrowserEvent<any>) {
method _identifyFeature (line 3069) | private _identifyFeature(e: MapBrowserEvent<any>) {
method _triggerLayerUpdate (line 3184) | private _triggerLayerUpdate(_: IJupyterGISModel, args: string) {
method _convertFeatureToMs (line 3202) | private _convertFeatureToMs(_: IJupyterGISModel, args: string) {
method _handleGeolocationChanged (line 3219) | private _handleGeolocationChanged(
method _updateEditingVectorLayer (line 3276) | private _updateEditingVectorLayer() {
method render (line 3485) | render(): JSX.Element {
method _log (line 3684) | private _log(
function MainViewWithMediaQuery (line 3718) | function MainViewWithMediaQuery(props: Omit<IMainViewProps, 'isMobile'>) {
FILE: packages/base/src/mainview/mainviewmodel.ts
class MainViewModel (line 12) | class MainViewModel implements IDisposable {
method constructor (line 13) | constructor(options: MainViewModel.IOptions) {
method isDisposed (line 19) | get isDisposed(): boolean {
method id (line 23) | get id(): string {
method jGISModel (line 27) | get jGISModel() {
method viewSettingChanged (line 31) | get viewSettingChanged() {
method commands (line 35) | get commands(): CommandRegistry {
method dispose (line 39) | dispose(): void {
method initSignal (line 50) | initSignal(): void {
method addAnnotation (line 57) | addAnnotation(value: IAnnotation): void {
method _onsharedLayersChanged (line 61) | private async _onsharedLayersChanged(
type IOptions (line 78) | interface IOptions {
FILE: packages/base/src/mainview/mainviewwidget.tsx
type IOptions (line 10) | interface IOptions {
class JupyterGISMainViewPanel (line 18) | class JupyterGISMainViewPanel extends ReactWidget {
method constructor (line 22) | constructor(options: IOptions) {
method render (line 29) | render(): JSX.Element {
FILE: packages/base/src/shared/components/Badge.tsx
type IBadgeProps (line 5) | interface IBadgeProps extends React.HTMLAttributes<HTMLButtonElement> {
function Badge (line 10) | function Badge({ variant, className, ...props }: IBadgeProps) {
FILE: packages/base/src/shared/components/Button.tsx
type IButtonProps (line 6) | interface IButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElem...
FILE: packages/base/src/shared/components/Calendar.tsx
type CalendarProps (line 15) | type CalendarProps = DayPickerProps & {
type NavView (line 52) | type NavView = 'days' | 'years';
function Calendar (line 60) | function Calendar({
function Nav (line 231) | function Nav({
function CaptionLabel (line 372) | function CaptionLabel({
function MonthGrid (line 402) | function MonthGrid({
function YearGrid (line 440) | function YearGrid({
FILE: packages/base/src/shared/components/Collapsible.tsx
function Collapsible (line 4) | function Collapsible({
function CollapsibleTrigger (line 10) | function CollapsibleTrigger({
function CollapsibleContent (line 21) | function CollapsibleContent({
FILE: packages/base/src/shared/components/Combobox.tsx
type IComboboxItem (line 20) | interface IComboboxItem {
type IComboboxProps (line 28) | interface IComboboxProps {
function Combobox (line 40) | function Combobox({
FILE: packages/base/src/shared/components/Command.tsx
function Command (line 14) | function Command({
function CommandDialog (line 27) | function CommandDialog({
function CommandInput (line 56) | function CommandInput({
function CommandList (line 75) | function CommandList({
function CommandEmpty (line 88) | function CommandEmpty({
function CommandGroup (line 100) | function CommandGroup({
function CommandSeparator (line 113) | function CommandSeparator({
function CommandItem (line 126) | function CommandItem({
function CommandShortcut (line 139) | function CommandShortcut({
FILE: packages/base/src/shared/components/Dialog.tsx
function Dialog (line 7) | function Dialog({
function DialogTrigger (line 13) | function DialogTrigger({
function DialogPortal (line 19) | function DialogPortal({
function DialogClose (line 25) | function DialogClose({
function DialogOverlay (line 31) | function DialogOverlay({
function DialogContent (line 44) | function DialogContent({
function DialogHeader (line 75) | function DialogHeader({ className, ...props }: React.ComponentProps<'div...
function DialogFooter (line 85) | function DialogFooter({ className, ...props }: React.ComponentProps<'div...
function DialogTitle (line 95) | function DialogTitle({
function DialogDescription (line 108) | function DialogDescription({
FILE: packages/base/src/shared/components/Drawer.tsx
function Drawer (line 6) | function Drawer({
function DrawerTrigger (line 12) | function DrawerTrigger({
function DrawerPortal (line 18) | function DrawerPortal({
function DrawerClose (line 24) | function DrawerClose({
function DrawerOverlay (line 30) | function DrawerOverlay({
function DrawerContent (line 43) | function DrawerContent({
function DrawerHeader (line 63) | function DrawerHeader({ className, ...props }: React.ComponentProps<'div...
function DrawerFooter (line 73) | function DrawerFooter({ className, ...props }: React.ComponentProps<'div...
function DrawerTitle (line 83) | function DrawerTitle({
function DrawerDescription (line 96) | function DrawerDescription({
FILE: packages/base/src/shared/components/Input.tsx
function Input (line 5) | function Input({ className, type, ...props }: React.ComponentProps<'inpu...
FILE: packages/base/src/shared/components/Pagination.tsx
type PaginationLinkProps (line 35) | type PaginationLinkProps = {
FILE: packages/base/src/shared/components/RadioGroup.tsx
function RadioGroup (line 7) | function RadioGroup({
function RadioGroupItem (line 20) | function RadioGroupItem({
FILE: packages/base/src/shared/components/Select.tsx
type ISelectItem (line 20) | interface ISelectItem {
type ISelectProps (line 26) | interface ISelectProps {
function Select (line 38) | function Select({
FILE: packages/base/src/shared/components/Sheet.tsx
function Sheet (line 8) | function Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive....
function SheetTrigger (line 12) | function SheetTrigger({
function SheetClose (line 18) | function SheetClose({
function SheetPortal (line 24) | function SheetPortal({
function SheetOverlay (line 30) | function SheetOverlay({
function SheetContent (line 43) | function SheetContent({
function SheetHeader (line 78) | function SheetHeader({ className, ...props }: React.ComponentProps<'div'...
function SheetFooter (line 88) | function SheetFooter({ className, ...props }: React.ComponentProps<'div'...
function SheetTitle (line 98) | function SheetTitle({
function SheetDescription (line 111) | function SheetDescription({
FILE: packages/base/src/shared/components/SingleDatePicker.tsx
type ISingleDatePickerProps (line 13) | interface ISingleDatePickerProps {
function SingleDatePicker (line 22) | function SingleDatePicker({
FILE: packages/base/src/shared/components/Switch.tsx
function Switch (line 6) | function Switch({
FILE: packages/base/src/shared/components/Tabs.tsx
type IPanelTabProps (line 6) | interface IPanelTabProps {
FILE: packages/base/src/shared/components/loading.tsx
type FontAwesomeIconSize (line 5) | type FontAwesomeIconSize =
type ILoadingIcon (line 22) | interface ILoadingIcon {
FILE: packages/base/src/shared/components/utils.ts
function cn (line 3) | function cn(...inputs: ClassValue[]) {
FILE: packages/base/src/shared/hooks/useLatest.ts
function useLatest (line 3) | function useLatest<T>(value: T): React.MutableRefObject<T> {
FILE: packages/base/src/shared/hooks/useMediaQuery.ts
function useMediaQuery (line 10) | function useMediaQuery(query: string): boolean {
FILE: packages/base/src/shared/store.ts
class GlobalStateDbManager (line 3) | class GlobalStateDbManager {
method constructor (line 9) | private constructor() {}
method getInstance (line 11) | public static getInstance(): GlobalStateDbManager {
method initialize (line 18) | public initialize(stateDb: IStateDB): void {
method getStateDb (line 26) | public getStateDb(): IStateDB | null {
FILE: packages/base/src/tools.ts
function throttle (line 38) | function throttle<T extends (...args: any[]) => void>(
function getElementFromProperty (line 59) | function getElementFromProperty(
function nearest (line 74) | function nearest(n: number, tol: number): number {
function getCssVarAsColor (line 84) | function getCssVarAsColor(cssVar: string): string {
function requestAPI (line 105) | async function requestAPI<T>(
function isLightTheme (line 140) | function isLightTheme(): boolean {
function deepCopy (line 144) | function deepCopy<T = IDict<any>>(value: T): T {
function createDefaultLayerRegistry (line 156) | function createDefaultLayerRegistry(
function getTileCoordinates (line 228) | function getTileCoordinates(latDeg: number, lonDeg: number, zoom: number) {
function getLayerTileInfo (line 244) | async function getLayerTileInfo(
type IParsedStyle (line 293) | interface IParsedStyle {
function parseColor (line 302) | function parseColor(style: any): IParsedStyle | undefined {
type ProxyStrategy (line 399) | type ProxyStrategy = 'direct' | 'internal' | 'external';
type IVectorEntry (line 500) | interface IVectorEntry {
type ITileEntry (line 505) | interface ITileEntry {
type GpkgTable (line 510) | type GpkgTable = Record<string, IVectorEntry | ITileEntry>;
function linearizeReprojectGpkg (line 520) | async function linearizeReprojectGpkg(
function loadGeoPackageVectorFile (line 542) | function loadGeoPackageVectorFile(
function loadGeoPackageRasterFile (line 572) | async function loadGeoPackageRasterFile(
function loadGkpgFromUrl (line 622) | async function loadGkpgFromUrl(
function getGeoPackageTableNames (line 636) | async function getGeoPackageTableNames(
constant INTERNAL_PROXY_BASE (line 956) | const INTERNAL_PROXY_BASE = '/jupytergis_core/proxy';
constant MIME_TYPES (line 958) | const MIME_TYPES: { [ext: string]: string } = {
function downloadFile (line 1190) | function downloadFile(
function getGeoJSONDataFromLayerSource (line 1205) | async function getGeoJSONDataFromLayerSource(
function extractLayerOverrideIndex (line 1255) | function extractLayerOverrideIndex(idSchema: {
FILE: packages/base/src/types.ts
type ValueOf (line 13) | type ValueOf<T> = T[keyof T];
type JupyterGISTracker (line 15) | type JupyterGISTracker = WidgetTracker<IJupyterGISWidget>;
type SymbologyTab (line 17) | type SymbologyTab = 'color' | 'radius' | 'filters';
type RgbColorValue (line 19) | type RgbColorValue =
type HexColorValue (line 22) | type HexColorValue = string;
type InternalRgbArray (line 23) | type InternalRgbArray = number[];
type ColorValue (line 25) | type ColorValue = RgbColorValue | HexColorValue;
type SizeValue (line 27) | type SizeValue = number;
type SymbologyValue (line 29) | type SymbologyValue = SizeValue | ColorValue | InternalRgbArray;
type VectorRenderType (line 31) | type VectorRenderType =
type Window (line 43) | interface Window {
type ClassificationMode (line 60) | type ClassificationMode = (typeof classificationModes)[number];
constant SYMBOLOGY_VALID_LAYER_TYPES (line 62) | const SYMBOLOGY_VALID_LAYER_TYPES = [
type IWmsLayerInfo (line 69) | interface IWmsLayerInfo {
type IJupyterGISFormContext (line 75) | interface IJupyterGISFormContext<TFormData = IDict | undefined> {
type IBaseFormStates (line 84) | interface IBaseFormStates {
type IBaseFormProps (line 90) | interface IBaseFormProps {
FILE: packages/base/src/workspace/panels/components/TabbedPanel.tsx
type ITabConfig (line 11) | interface ITabConfig {
type ITabbedPanelProps (line 19) | interface ITabbedPanelProps {
FILE: packages/base/src/workspace/panels/components/layers.tsx
constant LAYER_GROUP_CLASS (line 35) | const LAYER_GROUP_CLASS = 'jp-gis-layerGroup';
constant LAYER_GROUP_HEADER_CLASS (line 36) | const LAYER_GROUP_HEADER_CLASS = 'jp-gis-layerGroupHeader';
constant LAYER_GROUP_COLLAPSER_CLASS (line 37) | const LAYER_GROUP_COLLAPSER_CLASS = 'jp-gis-layerGroupCollapser';
constant LAYER_ITEM_CLASS (line 38) | const LAYER_ITEM_CLASS = 'jp-gis-layerItem';
constant LAYER_CLASS (line 39) | const LAYER_CLASS = 'jp-gis-layer';
constant LAYER_TITLE_CLASS (line 40) | const LAYER_TITLE_CLASS = 'jp-gis-layerTitle';
constant LAYER_ICON_CLASS (line 41) | const LAYER_ICON_CLASS = 'jp-gis-layerIcon';
constant LAYER_TEXT_CLASS (line 42) | const LAYER_TEXT_CLASS = 'jp-gis-layerText data-jgis-keybinding';
constant LAYER_SLIDE_NUMBER_CLASS (line 43) | const LAYER_SLIDE_NUMBER_CLASS = 'jp-gis-layerSlideNumber';
type IBodyProps (line 45) | interface IBodyProps {
type ILayerGroupProps (line 230) | interface ILayerGroupProps {
type ILayerProps (line 425) | interface ILayerProps {
function isSelected (line 432) | function isSelected(layerId: string, model: IJupyterGISModel | undefined) {
type IDragInfo (line 709) | interface IDragInfo {
FILE: packages/base/src/workspace/panels/header.tsx
class ControlPanelHeader (line 3) | class ControlPanelHeader extends Widget {
method constructor (line 7) | constructor() {
function createHeader (line 18) | function createHeader(): HTMLElement {
FILE: packages/base/src/workspace/panels/hooks/useLayerTree.ts
function useLayerTree (line 19) | function useLayerTree(
FILE: packages/base/src/workspace/panels/hooks/useRightPanelOptions.ts
type IUseRightPanelOptionsResult (line 4) | interface IUseRightPanelOptionsResult {
function useRightPanelOptions (line 26) | function useRightPanelOptions(
FILE: packages/base/src/workspace/panels/hooks/useUIState.ts
constant STATE_DB_KEY_PREFIX (line 6) | const STATE_DB_KEY_PREFIX = 'jupytergis:localUIState:';
function useUIState (line 8) | function useUIState<K extends keyof IJGISUIState>(
FILE: packages/base/src/workspace/panels/leftpanel.tsx
type ILeftPanelClickHandlerParams (line 18) | interface ILeftPanelClickHandlerParams {
type ILeftPanelProps (line 24) | interface ILeftPanelProps {
FILE: packages/base/src/workspace/panels/mergedpanel.tsx
type IMergedPanelProps (line 25) | interface IMergedPanelProps {
FILE: packages/base/src/workspace/panels/rightpanel.tsx
function RightPanelStoryViewer (line 34) | function RightPanelStoryViewer({
type IRightPanelProps (line 79) | interface IRightPanelProps {
FILE: packages/base/src/workspace/statusbar/SpectaPresentationProgressBar.tsx
type ISpectaPresentationProgressBarProps (line 4) | interface ISpectaPresentationProgressBarProps {
function SpectaPresentationProgressBar (line 8) | function SpectaPresentationProgressBar({
FILE: packages/base/src/workspace/statusbar/StatusBar.tsx
type IStatusBarProps (line 13) | interface IStatusBarProps {
FILE: packages/base/src/workspace/toolbar/widget.tsx
constant TOOLBAR_SEPARATOR_CLASS (line 24) | const TOOLBAR_SEPARATOR_CLASS = 'jGIS-Toolbar-Separator';
constant TOOLBAR_GROUPNAME_CLASS (line 25) | const TOOLBAR_GROUPNAME_CLASS = 'jGIS-Toolbar-GroupName';
class Separator (line 27) | class Separator extends Widget {
method constructor (line 31) | constructor() {
function createUserIconRenderer (line 37) | function createUserIconRenderer(model: JupyterGISModel) {
class ToolbarWidget (line 65) | class ToolbarWidget extends ReactiveToolbar {
method constructor (line 71) | constructor(options: ToolbarWidget.IOptions) {
method _updateStorySegmentMenuItem (line 230) | private _updateStorySegmentMenuItem(): void {
method _updateTogglePanelVisibility (line 266) | private _updateTogglePanelVisibility(): void {
method dispose (line 294) | dispose(): void {
type IOptions (line 307) | interface IOptions extends Toolbar.IOptions {
FILE: packages/base/src/workspace/widget.ts
constant CELL_OUTPUT_WIDGET_CLASS (line 24) | const CELL_OUTPUT_WIDGET_CLASS = 'jgis-cell-output-widget';
type JupyterGISWidget (line 26) | type JupyterGISWidget =
class JupyterGISDocumentWidget (line 30) | class JupyterGISDocumentWidget
method constructor (line 34) | constructor(
method model (line 40) | get model(): IJupyterGISModel {
method dispose (line 47) | dispose(): void {
class JupyterGISOutputWidget (line 61) | class JupyterGISOutputWidget
method constructor (line 65) | constructor(options: JupyterGISOutputWidget.IOptions) {
method dispose (line 82) | dispose(): void {
type IOptions (line 95) | interface IOptions extends MainAreaWidget.IOptions<JupyterGISPanel> {
class JupyterGISPanel (line 100) | class JupyterGISPanel extends SplitPanel {
method constructor (line 101) | constructor({
method _initModel (line 134) | _initModel(options: {
method _initView (line 146) | _initView(
method jupyterGISMainViewPanel (line 162) | get jupyterGISMainViewPanel(): JupyterGISMainViewPanel {
method viewChanged (line 169) | get viewChanged(): ISignal<
method dispose (line 182) | dispose(): void {
method currentViewModel (line 194) | get currentViewModel(): MainViewModel {
method consolePanel (line 201) | get consolePanel(): ConsolePanel | undefined {
method consoleOpened (line 205) | get consoleOpened(): boolean {
method executeConsole (line 209) | executeConsole() {
method removeConsole (line 215) | removeConsole() {
method toggleConsole (line 226) | async toggleConsole(jgisPath: string) {
type IOptions (line 291) | interface IOptions extends Partial<ConsoleView.IOptions> {
FILE: packages/schema/scripts/dereference-and-combine-schemas-for-registry.js
function getSchemaFiles (line 9) | function getSchemaFiles(dir) {
FILE: packages/schema/scripts/preprocess-schemas-for-python-type-generation.js
function updateRefPath (line 24) | function updateRefPath(refValue, schemaDir, schemaRoot) {
function processSchema (line 49) | function processSchema(schema, schemaDir, schemaRoot) {
function preProcessSchemaDirectory (line 79) | function preProcessSchemaDirectory(src, dest, schemaRoot) {
function preProcessSchemas (line 107) | function preProcessSchemas() {
FILE: packages/schema/scripts/process.py
function addBanner (line 14) | def addBanner(f):
function generateJsonMerge (line 18) | def generateJsonMerge():
function exportSchema (line 26) | def exportSchema():
function defineProcessingType (line 36) | def defineProcessingType():
FILE: packages/schema/scripts/validate-examples.js
constant LAYER_SCHEMAS (line 17) | const LAYER_SCHEMAS = {
constant SOURCE_SCHEMAS (line 29) | const SOURCE_SCHEMAS = {
function findJgisFiles (line 42) | function findJgisFiles(dir, files = []) {
function loadDereferencedSchema (line 55) | async function loadDereferencedSchema(relativePath) {
function main (line 60) | async function main() {
FILE: packages/schema/src/doc.ts
constant DEFAULT_PROJECTION (line 29) | const DEFAULT_PROJECTION = 'EPSG:3857';
constant DEFAULT_JGIS_DOCUMENT_CONTENT (line 32) | const DEFAULT_JGIS_DOCUMENT_CONTENT = `{
class JupyterGISDoc (line 43) | class JupyterGISDoc
method constructor (line 47) | constructor() {
method initialSyncReady (line 76) | get initialSyncReady(): Promise<void> {
method _onOptionsObserverFired (line 80) | private _onOptionsObserverFired(): void {
method getSource (line 88) | getSource(): JSONObject {
method setSource (line 108) | setSource(value: JSONObject | string): void {
method dispose (line 155) | dispose(): void {
method version (line 159) | get version(): string {
method layers (line 163) | get layers(): IJGISLayers {
method layers (line 167) | set layers(layers: IJGISLayers) {
method sources (line 175) | set sources(sources: IJGISSources) {
method sources (line 183) | get sources(): IJGISSources {
method stories (line 187) | set stories(stories: IJGISStoryMaps) {
method stories (line 195) | get stories(): IJGISStoryMaps {
method viewState (line 199) | get viewState(): IJGISViewState {
method viewState (line 203) | set viewState(viewState: IJGISViewState) {
method layerTree (line 211) | get layerTree(): IJGISLayerTree {
method layerTree (line 215) | set layerTree(layerTree: IJGISLayerTree) {
method getLayer (line 222) | getLayer(id: string): IJGISLayer | undefined {
method getLayerSource (line 229) | getLayerSource(id: string): IJGISSource | undefined {
method getLayersBySource (line 242) | getLayersBySource(id: string): string[] {
method options (line 252) | set options(options: IJGISOptions) {
method options (line 260) | get options(): IJGISOptions {
method layersChanged (line 264) | get layersChanged(): ISignal<IJupyterGISDoc, IJGISLayerDocChange> {
method layerTreeChanged (line 268) | get layerTreeChanged(): ISignal<IJupyterGISDoc, IJGISLayerTreeDocChang...
method sourcesChanged (line 272) | get sourcesChanged(): ISignal<IJupyterGISDoc, IJGISSourceDocChange> {
method storyMapsChanged (line 276) | get storyMapsChanged(): ISignal<IJupyterGISDoc, IJGISStoryMapDocChange> {
method viewStateChanged (line 280) | get viewStateChanged(): ISignal<IJupyterGISDoc, MapChange> {
method optionsChanged (line 284) | get optionsChanged(): ISignal<IJupyterGISDoc, MapChange> {
method layerExists (line 288) | layerExists(id: string): boolean {
method removeLayer (line 292) | removeLayer(id: string): void {
method addLayer (line 298) | addLayer(id: string, value: IJGISLayer): void {
method updateLayer (line 304) | updateLayer(id: string, value: IJGISLayer): void {
method addLayerTreeItem (line 310) | addLayerTreeItem(index: number, item: IJGISLayerItem) {
method updateLayerTreeItem (line 316) | updateLayerTreeItem(index: number, item: IJGISLayerItem) {
method getObject (line 325) | getObject(id: string): IJGISLayer | IJGISSource | undefined {
method updateObjectParameters (line 337) | updateObjectParameters(
method sourceExists (line 362) | sourceExists(id: string): boolean {
method removeSource (line 366) | removeSource(id: string): void {
method addSource (line 381) | addSource(id: string, value: IJGISSource): void {
method updateSource (line 387) | updateSource(id: string, value: any): void {
method removeStoryMap (line 391) | removeStoryMap(id: string): void {
method addStoryMap (line 397) | addStoryMap(id: string, value: IJGISStoryMap): void {
method updateStoryMap (line 403) | updateStoryMap(id: string, value: any): void {
method getStoryMap (line 407) | getStoryMap(id: string): IJGISStoryMap | undefined {
method getOption (line 414) | getOption(key: keyof IJGISOptions): IDict | undefined {
method setOption (line 422) | setOption(key: keyof IJGISOptions, value: IDict): void {
method getMetadata (line 426) | getMetadata(key: string): string | undefined {
method setMetadata (line 430) | setMetadata(key: string, value: string): void {
method removeMetadata (line 434) | removeMetadata(key: string): void {
method metadata (line 440) | get metadata(): JSONObject {
method metadata (line 444) | set metadata(metadata: { [k: string]: string }) {
method metadataChanged (line 452) | get metadataChanged(): ISignal<IJupyterGISDoc, MapChange> {
method create (line 456) | static create(): IJupyterGISDoc {
method _getLayerAsYMap (line 462) | private _getLayerAsYMap(id: string): Y.Map<any> | undefined {
method _getSourceAsYMap (line 469) | private _getSourceAsYMap(id: string): Y.Map<any> | undefined {
method _layersObserver (line 476) | private _layersObserver(events: Y.YEvent<any>[]): void {
method _layerTreeObserver (line 501) | private _layerTreeObserver(event: Y.YArrayEvent<IJGISLayerItem>): void {
method _sourcesObserver (line 506) | private _sourcesObserver(events: Y.YEvent<any>[]): void {
method _storyMapsObserver (line 529) | private _storyMapsObserver(events: Y.YEvent<any>[]): void {
FILE: packages/schema/src/interfaces.ts
type IJGISUIState (line 58) | interface IJGISUIState {
type IJGISStoryMaps (line 63) | interface IJGISStoryMaps {
type JgisCoordinates (line 67) | type JgisCoordinates = { x: number; y: number };
type IViewPortState (line 69) | interface IViewPortState {
type Pointer (line 75) | type Pointer = {
type IDict (line 78) | interface IDict<T = any> {
type IJGISLayerDocChange (line 82) | interface IJGISLayerDocChange {
type IJGISLayerTreeDocChange (line 90) | interface IJGISLayerTreeDocChange {
type IJGISStoryMapDocChange (line 94) | interface IJGISStoryMapDocChange {
type IJGISSourceDocChange (line 101) | interface IJGISSourceDocChange {
type SelectionType (line 108) | type SelectionType = 'layer' | 'source' | 'group';
type ISelection (line 110) | interface ISelection {
type IJupyterGISClientState (line 115) | interface IJupyterGISClientState {
type IJupyterGISDoc (line 131) | interface IJupyterGISDoc extends YDocument<IJupyterGISDocChange> {
type IJupyterGISDocChange (line 196) | interface IJupyterGISDocChange extends DocumentChange {
type IViewState (line 209) | interface IViewState {
type IStorySegmentRef (line 219) | interface IStorySegmentRef {
type IJupyterGISModel (line 224) | interface IJupyterGISModel extends DocumentRegistry.IModel {
type IUserData (line 361) | interface IUserData {
type IJupyterGISDocumentWidget (line 366) | interface IJupyterGISDocumentWidget extends IDocumentWidget<
type IJupyterGISOutputWidget (line 373) | interface IJupyterGISOutputWidget extends MainAreaWidget {
type IJupyterGISWidget (line 377) | type IJupyterGISWidget =
type IJupyterGISTracker (line 381) | type IJupyterGISTracker = IWidgetTracker<IJupyterGISWidget>;
type IJGISFormSchemaRegistry (line 383) | interface IJGISFormSchemaRegistry {
type IJGISExternalCommand (line 413) | interface IJGISExternalCommand {
type IJGISExternalCommandRegistry (line 419) | interface IJGISExternalCommandRegistry {
type ILayerGalleryEntry (line 430) | type ILayerGalleryEntry = {
type IJGISLayerBrowserRegistry (line 460) | interface IJGISLayerBrowserRegistry {
type IAnnotationModel (line 467) | interface IAnnotationModel {
type IAnnotationContent (line 489) | interface IAnnotationContent {
type IAnnotation (line 494) | interface IAnnotation {
type IJupyterGISSettings (line 503) | interface IJupyterGISSettings {
FILE: packages/schema/src/migrations/index.ts
type IMigrationStep (line 12) | interface IMigrationStep {
constant STEPS (line 18) | const STEPS: IMigrationStep[] = [
function migrateDocument (line 30) | function migrateDocument(
function _compareVersions (line 61) | function _compareVersions(a: string, b: string): number {
FILE: packages/schema/src/migrations/v0_5_to_v0_6.ts
function migrate (line 9) | function migrate(doc: Record<string, any>): Record<string, any> {
function _vectorSymbologyFromColor (line 43) | function _vectorSymbologyFromColor(
function _firstSolidColor (line 86) | function _firstSolidColor(...candidates: unknown[]): number[] | undefined {
FILE: packages/schema/src/model.ts
constant SETTINGS_ID (line 51) | const SETTINGS_ID = '@jupytergis/jupytergis-core:jupytergis-settings';
constant DEFAULT_SETTINGS (line 53) | const DEFAULT_SETTINGS: IJupyterGISSettings = {
class JupyterGISModel (line 66) | class JupyterGISModel implements IJupyterGISModel {
method constructor (line 67) | constructor(options: JupyterGISModel.IOptions) {
method initSettings (line 101) | async initSettings() {
method _updateLocalSettings (line 135) | private _updateLocalSettings(): void {
method jgisSettings (line 149) | get jgisSettings(): IJupyterGISSettings {
method settingsChanged (line 156) | get settingsChanged(): ISignal<JupyterGISModel, string> {
method getSettings (line 163) | async getSettings(): Promise<ISettingRegistry.ISettings> {
method getFeaturesForCurrentTile (line 167) | getFeaturesForCurrentTile({ sourceId }: { sourceId: string }): Feature...
method syncTileFeatures (line 171) | syncTileFeatures({
method sharedModel (line 197) | get sharedModel(): IJupyterGISDoc {
method isDisposed (line 201) | get isDisposed(): boolean {
method contentChanged (line 205) | get contentChanged(): ISignal<this, void> {
method stateChanged (line 209) | get stateChanged(): ISignal<this, IChangedArgs<any, any, string>> {
method pathChanged (line 213) | get pathChanged(): ISignal<IJupyterGISModel, string> {
method themeChanged (line 217) | get themeChanged(): Signal<
method currentUserId (line 224) | get currentUserId(): number | undefined {
method users (line 228) | get users(): IUserData[] {
method userChanged (line 239) | get userChanged(): ISignal<this, IUserData[]> {
method dirty (line 243) | get dirty(): boolean {
method dirty (line 247) | set dirty(value: boolean) {
method readOnly (line 251) | get readOnly(): boolean {
method readOnly (line 254) | set readOnly(value: boolean) {
method localState (line 258) | get localState(): IJupyterGISClientState | null {
method clientStateChanged (line 262) | get clientStateChanged(): ISignal<this, Map<number, IJupyterGISClientS...
method sharedOptionsChanged (line 266) | get sharedOptionsChanged(): ISignal<IJupyterGISDoc, MapChange> {
method sharedLayersChanged (line 270) | get sharedLayersChanged(): ISignal<IJupyterGISDoc, IJGISLayerDocChange> {
method sharedLayerTreeChanged (line 274) | get sharedLayerTreeChanged(): ISignal<
method sharedSourcesChanged (line 281) | get sharedSourcesChanged(): ISignal<IJupyterGISDoc, IJGISSourceDocChan...
method disposed (line 285) | get disposed(): ISignal<JupyterGISModel, void> {
method sharedMetadataChanged (line 289) | get sharedMetadataChanged(): ISignal<this, MapChange> {
method zoomToPositionSignal (line 293) | get zoomToPositionSignal(): ISignal<this, string> {
method isTemporalControllerActive (line 297) | set isTemporalControllerActive(isActive: boolean) {
method isTemporalControllerActive (line 301) | get isTemporalControllerActive(): boolean {
method centerOnPosition (line 305) | centerOnPosition(id: string) {
method _metadataChangedHandler (line 309) | private _metadataChangedHandler(_: IJupyterGISDoc, args: MapChange) {
method addMetadata (line 313) | addMetadata(key: string, value: string): void {
method removeMetadata (line 317) | removeMetadata(key: string): void {
method dispose (line 321) | dispose(): void {
method toString (line 331) | toString(): string {
method fromString (line 335) | fromString(data: string): void {
method toJSON (line 369) | toJSON(): PartialJSONObject {
method fromJSON (line 373) | fromJSON(data: PartialJSONObject): void {
method initialize (line 377) | initialize(): void {
method getWorker (line 381) | getWorker(): Worker {
method getContent (line 390) | getContent(): IJGISContent {
method getViewState (line 400) | getViewState(): IViewState {
method contentsManager (line 407) | get contentsManager(): Contents.IManager | undefined {
method contentsManager (line 415) | set contentsManager(manager: Contents.IManager | undefined) {
method filePath (line 422) | get filePath(): string {
method filePath (line 429) | set filePath(path: string) {
method getLayers (line 434) | getLayers(): IJGISLayers {
method getSources (line 438) | getSources(): IJGISSources {
method getLayerTree (line 442) | getLayerTree(): IJGISLayerTree {
method getLayer (line 446) | getLayer(id: string): IJGISLayer | undefined {
method getExtent (line 450) | getExtent(id: string): number[] | undefined {
method getLayerOrSource (line 454) | getLayerOrSource(id: string): IJGISLayer | IJGISSource | undefined {
method getSource (line 458) | getSource(id: string): IJGISSource | undefined {
method getSourcesByType (line 466) | getSourcesByType(type: string): { [key: string]: string } {
method addGroup (line 486) | addGroup(name: string, groupName?: string, position?: number): void {
method addLayer (line 509) | addLayer(
method updateLayerViewState (line 526) | updateLayerViewState(id: string, view: IViewState[string]): void {
method removeLayer (line 536) | removeLayer(layer_id: string) {
method removeSource (line 565) | removeSource(sourceId: string): void {
method setOptions (line 569) | setOptions(value: IJGISOptions) {
method getOptions (line 573) | getOptions(): IJGISOptions {
method syncViewport (line 577) | syncViewport(viewport?: IViewPortState, emitter?: string): void {
method syncPointer (line 584) | syncPointer(pointer?: Pointer, emitter?: string): void {
method syncSelected (line 591) | syncSelected(value: { [key: string]: ISelection }, emitter?: string): ...
method syncLastAddedLayer (line 598) | syncLastAddedLayer(layerId: string): void {
method selected (line 603) | get selected(): { [key: string]: ISelection } | undefined {
method selected (line 607) | set selected(value: { [key: string]: ISelection } | undefined) {
method syncIdentifiedFeatures (line 611) | syncIdentifiedFeatures(features: IDict<any>, emitter?: string): void {
method setUserToFollow (line 618) | setUserToFollow(userId?: number): void {
method setEditingItem (line 624) | setEditingItem(type: SelectionType, itemId: string): void {
method clearEditingItem (line 629) | clearEditingItem(): void {
method editing (line 634) | get editing(): { type: SelectionType; itemId: string } | null {
method editingChanged (line 638) | get editingChanged(): ISignal<
method getClientId (line 645) | getClientId(): number {
method isSpectaMode (line 655) | isSpectaMode(): boolean {
method getSelectedStory (line 667) | getSelectedStory(): {
method getCurrentSegmentIndex (line 683) | getCurrentSegmentIndex(): number {
method setCurrentSegmentIndex (line 690) | setCurrentSegmentIndex(index: number): void {
method currentSegmentIndexChanged (line 695) | get currentSegmentIndexChanged(): ISignal<this, number> {
method addStorySegment (line 703) | addStorySegment(viewState?: IViewState[string]): IStorySegmentRef | nu...
method _generateStorySegmentName (line 771) | private _generateStorySegmentName(viewState?: IViewState[string]): str...
method createStorySegmentFromLayer (line 785) | createStorySegmentFromLayer(layerId: string) {
method segmentAdded (line 824) | get segmentAdded(): ISignal<this, IStorySegmentRef> {
method _addLayerTreeItem (line 837) | private _addLayerTreeItem(
method moveItemsToGroup (line 865) | moveItemsToGroup(items: string[], groupName: string, index?: number) {
method moveItemRelatedTo (line 885) | moveItemRelatedTo(item: string, relativeItem: string, after: boolean) {
method addNewLayerGroup (line 917) | addNewLayerGroup(
method _removeLayerTreeLayer (line 929) | private _removeLayerTreeLayer(
method _removeLayerTreeGroup (line 937) | private _removeLayerTreeGroup(
method _removeLayerTreeItem (line 945) | private _removeLayerTreeItem(
method renameLayerGroup (line 970) | renameLayerGroup(groupName: string, newName: string): void {
method removeLayerGroup (line 984) | removeLayerGroup(groupName: string) {
method toggleMode (line 1020) | toggleMode(mode: Modes) {
method currentMode (line 1024) | get currentMode(): Modes {
method currentMode (line 1028) | set currentMode(value: Modes) {
method setUIState (line 1032) | setUIState(value: Partial<IJGISUIState>): void {
method getUIState (line 1037) | getUIState(): IJGISUIState {
method uiStateChanged (line 1041) | get uiStateChanged(): ISignal<this, IJGISUIState> {
method toggleTemporalController (line 1045) | toggleTemporalController() {
method _getLayerTreeInfo (line 1054) | private _getLayerTreeInfo(groupName: string):
method addFeatureAsMsSignal (line 1106) | get addFeatureAsMsSignal() {
method updateLayerSignal (line 1110) | get updateLayerSignal() {
method checkIfIsADrawVectorLayer (line 1118) | checkIfIsADrawVectorLayer(layer: IJGISLayer): boolean {
method updateEditingVectorLayer (line 1127) | updateEditingVectorLayer(): void {
method editingVectorLayer (line 1131) | get editingVectorLayer(): boolean {
method editingVectorLayer (line 1135) | set editingVectorLayer(editingVectorLayer: boolean) {
method geolocation (line 1140) | get geolocation(): JgisCoordinates {
method geolocation (line 1144) | set geolocation(geolocation: JgisCoordinates) {
method geolocationChanged (line 1149) | get geolocationChanged() {
function getOrderedLayerIds (line 1223) | function getOrderedLayerIds(model: IJupyterGISModel): string[] {
type IOptions (line 1227) | interface IOptions extends DocumentRegistry.IModelOptions<IJupyterGISDoc> {
function layerTreeRecursion (line 1240) | function layerTreeRecursion(
function findItemPath (line 1262) | function findItemPath(
FILE: packages/schema/src/processing/ProcessingMerge.ts
type ProcessingElement (line 4) | type ProcessingElement = {
FILE: packages/schema/src/types.ts
type Modes (line 43) | type Modes = 'panning' | 'identifying' | 'marking';
FILE: python/jupytergis/scripts/bump-version.py
function get_version (line 22) | def get_version():
function next_version (line 33) | def next_version():
function bump_jupytergis_deps (line 40) | def bump_jupytergis_deps(py_version: str):
function bump_citation_cff (line 54) | def bump_citation_cff(py_version: str):
function bump (line 90) | def bump():
FILE: python/jupytergis_core/jupytergis_core/__init__.py
function _jupyter_labextension_paths (line 16) | def _jupyter_labextension_paths():
function _jupyter_server_extension_points (line 20) | def _jupyter_server_extension_points():
function _load_jupyter_server_extension (line 24) | def _load_jupyter_server_extension(server_app):
FILE: python/jupytergis_core/jupytergis_core/color_ramps.py
function _resolve (line 39) | def _resolve(name: str) -> LinearColormap:
function get_color_ramp (line 49) | def get_color_ramp(
function sample_colors (line 80) | def sample_colors(
FILE: python/jupytergis_core/jupytergis_core/colors.py
function hex_to_rgba (line 10) | def hex_to_rgba(hex_color: str) -> tuple[int, int, int, float]:
function try_hex_to_rgba (line 29) | def try_hex_to_rgba(hex_color: str) -> tuple[int, int, int, float] | None:
function rgb_to_hex (line 41) | def rgb_to_hex(rgb_str: str) -> str:
FILE: python/jupytergis_core/jupytergis_core/handler.py
class ProxyConfig (line 16) | class ProxyConfig:
function load_config (line 28) | def load_config() -> ProxyConfig:
class ProxyError (line 52) | class ProxyError(Exception):
class ValidationError (line 56) | class ValidationError(ProxyError):
class RateLimitError (line 60) | class RateLimitError(ProxyError):
class ProxyHandler (line 64) | class ProxyHandler(APIHandler):
method initialize (line 67) | def initialize(self) -> None:
method _check_rate_limit (line 80) | def _check_rate_limit(self) -> None:
method get (line 101) | async def get(self) -> None:
method post (line 106) | async def post(self) -> None:
method _parse_headers (line 110) | def _parse_headers(self) -> dict[str, str]:
method _handle_request (line 142) | async def _handle_request(self, method: str) -> None:
method _validate_url (line 204) | def _validate_url(self, url: str) -> str:
method _validate_body (line 224) | async def _validate_body(self, method: str) -> str | None:
method _make_request (line 254) | async def _make_request(
method _set_response_headers (line 311) | def _set_response_headers(self, response: HTTPResponse) -> None:
method _handle_error_response (line 330) | def _handle_error_response(self, error: Exception) -> None:
function setup_handlers (line 349) | def setup_handlers(web_app: Any) -> None:
FILE: python/jupytergis_core/jupytergis_core/jgis_ydoc.py
class YJGIS (line 13) | class YJGIS(YBaseDoc):
method __init__ (line 14) | def __init__(self, *args, **kwargs):
method version (line 25) | def version(self) -> str:
method get (line 28) | def get(self) -> str:
method set (line 55) | def set(self, value: str) -> None:
method observe (line 84) | def observe(self, callback: Callable[[str, Any], None]):
FILE: python/jupytergis_core/jupytergis_core/migrations/__init__.py
function migrate (line 19) | def migrate(doc: dict[str, Any], to_version: str | None = None) -> dict[...
FILE: python/jupytergis_core/jupytergis_core/migrations/v0_5_to_v0_6.py
function migrate (line 11) | def migrate(doc: dict[str, Any]) -> dict[str, Any]:
function _vector_symbology_from_color (line 42) | def _vector_symbology_from_color(color_expr: Any) -> dict[str, Any]:
function _to_rgba (line 78) | def _to_rgba(value: Any) -> list[float] | None:
FILE: python/jupytergis_core/jupytergis_core/tests/test_migrations.py
function _fixture_pairs (line 26) | def _fixture_pairs(from_v: str, to_v: str) -> list[tuple[Path, Path]]:
function test_migration_fixture (line 45) | def test_migration_fixture(from_path: Path, to_path: Path) -> None:
FILE: python/jupytergis_core/scripts/bump-version.py
function bump (line 8) | def bump():
FILE: python/jupytergis_core/src/externalcommand.ts
class JupyterGISExternalCommandRegistry (line 6) | class JupyterGISExternalCommandRegistry implements IJGISExternalCommandR...
method constructor (line 7) | constructor() {
method registerCommand (line 11) | registerCommand(cmd: IJGISExternalCommand): void {
method getCommands (line 15) | getCommands(): IJGISExternalCommand[] {
FILE: python/jupytergis_core/src/factory.ts
type IOptions (line 22) | interface IOptions extends DocumentRegistry.IWidgetFactoryOptions {
class JupyterGISDocumentWidgetFactory (line 39) | class JupyterGISDocumentWidgetFactory extends ABCWidgetFactory<
method constructor (line 43) | constructor(private options: IOptions) {
method createNewWidget (line 58) | protected createNewWidget(
FILE: python/jupytergis_core/src/jgisplugin/modelfactory.ts
class JupyterGISModelFactory (line 13) | class JupyterGISModelFactory implements DocumentRegistry.IModelFactory<J...
method constructor (line 14) | constructor(options: JupyterGISModelFactory.IOptions) {
method name (line 28) | get name(): string {
method contentType (line 37) | get contentType(): Contents.ContentType {
method fileFormat (line 46) | get fileFormat(): Contents.FileFormat {
method isDisposed (line 55) | get isDisposed(): boolean {
method dispose (line 62) | dispose(): void {
method preferredLanguage (line 72) | preferredLanguage(path: string): string {
method createNew (line 81) | createNew(
type IOptions (line 98) | interface IOptions {
FILE: python/jupytergis_core/src/jgisplugin/plugins.ts
constant FACTORY (line 40) | const FACTORY = 'JupyterGIS .jgis Viewer';
constant CONTENT_TYPE (line 41) | const CONTENT_TYPE = 'jgis';
constant PALETTE_CATEGORY (line 42) | const PALETTE_CATEGORY = 'JupyterGIS';
constant MODEL_NAME (line 43) | const MODEL_NAME = 'jupytergis-jgismodel';
constant SETTINGS_ID (line 44) | const SETTINGS_ID = '@jupytergis/jupytergis-core:jupytergis-settings';
FILE: python/jupytergis_core/src/layerBrowserRegistry.ts
class JupyterGISLayerBrowserRegistry (line 13) | class JupyterGISLayerBrowserRegistry implements IJGISLayerBrowserRegistry {
method constructor (line 16) | constructor() {
method getRegistryLayers (line 25) | getRegistryLayers(): ILayerGalleryEntry[] {
method addRegistryLayer (line 33) | addRegistryLayer(data: ILayerGalleryEntry): void {
method removeRegistryLayer (line 41) | removeRegistryLayer(name: string): void {
method clearRegistry (line 48) | clearRegistry(): void {
FILE: python/jupytergis_core/src/plugin.ts
constant NAME_SPACE (line 34) | const NAME_SPACE = 'jupytergis';
FILE: python/jupytergis_core/src/schemaregistry.ts
class JupyterGISFormSchemaRegistry (line 5) | class JupyterGISFormSchemaRegistry implements IJGISFormSchemaRegistry {
method constructor (line 8) | constructor(docManager: IDocumentManager) {
method registerSchema (line 13) | registerSchema(name: string, schema: IDict): void {
method has (line 21) | has(name: string): boolean {
method getSchemas (line 25) | getSchemas(): Map<string, IDict> {
method getDocManager (line 29) | getDocManager(): IDocumentManager {
FILE: python/jupytergis_lab/jupytergis_lab/__init__.py
function _jupyter_labextension_paths (line 21) | def _jupyter_labextension_paths():
FILE: python/jupytergis_lab/jupytergis_lab/notebook/explore.py
class Basemap (line 10) | class Basemap:
function explore (line 46) | def explore(
function _add_layer (line 79) | def _add_layer(
FILE: python/jupytergis_lab/jupytergis_lab/notebook/gis_document.py
function reversed_tree (line 47) | def reversed_tree(root):
function _color_to_rgba (line 53) | def _color_to_rgba(value: Any) -> list[float] | None:
function _vector_symbology_state_from_color_expr (line 77) | def _vector_symbology_state_from_color_expr(color_expr: Any) -> dict[str...
class GISDocument (line 121) | class GISDocument(CommWidget):
method __init__ (line 133) | def __init__(
method layers (line 186) | def layers(self) -> dict:
method layer_tree (line 191) | def layer_tree(self) -> list[str | dict]:
method sidecar (line 195) | def sidecar(
method export_to_qgis (line 217) | def export_to_qgis(self, path: str | Path) -> bool:
method add_raster_layer (line 230) | def add_raster_layer(
method add_vectortile_layer (line 272) | def add_vectortile_layer(
method add_geojson_layer (line 329) | def add_geojson_layer(
method add_image_layer (line 405) | def add_image_layer(
method add_video_layer (line 439) | def add_video_layer(
method add_tiff_layer (line 476) | def add_tiff_layer(
method add_hillshade_layer (line 523) | def add_hillshade_layer(
method add_heatmap_layer (line 559) | def add_heatmap_layer(
method add_geoparquet_layer (line 631) | def add_geoparquet_layer(
method add_geopackage_vector_layer (line 680) | def add_geopackage_vector_layer(
method add_geopackage_raster_layer (line 761) | def add_geopackage_raster_layer(
method get_wms_available_layers (line 815) | def get_wms_available_layers(
method add_wms_tile_layer (line 909) | def add_wms_tile_layer(
method remove_layer (line 971) | def remove_layer(self, layer_id: str):
method _remove_source_if_orphaned (line 985) | def _remove_source_if_orphaned(self, source_id: str):
method create_color_expr (line 999) | def create_color_expr(
method add_filter (line 1050) | def add_filter(
method update_filter (line 1095) | def update_filter(
method clear_filters (line 1139) | def clear_filters(self, layer_id: str):
method _add_source (line 1156) | def _add_source(self, new_object, id: str | None = None) -> str:
method _add_layer (line 1162) | def _add_layer(self, new_object, id: str | None = None) -> str:
method _make_comm (line 1170) | def _make_comm(cls, *, path: str | None) -> dict:
method to_py (line 1200) | def to_py(self) -> dict:
class JGISLayer (line 1211) | class JGISLayer(BaseModel):
class Config (line 1212) | class Config:
method __init__ (line 1231) | def __init__(__pydantic_self__, parent, **data: Any) -> None: # noqa
class JGISSource (line 1236) | class JGISSource(BaseModel):
class Config (line 1237) | class Config:
method __init__ (line 1259) | def __init__(__pydantic_self__, parent, **data: Any) -> None: # noqa
class SingletonMeta (line 1264) | class SingletonMeta(type):
method __call__ (line 1267) | def __call__(cls, *args, **kwargs):
class ObjectFactoryManager (line 1274) | class ObjectFactoryManager(metaclass=SingletonMeta):
method __init__ (line 1275) | def __init__(self):
method register_factory (line 1278) | def register_factory(self, shape_type: str, cls: type[BaseModel]) -> N...
method create_layer (line 1282) | def create_layer(
method create_source (line 1308) | def create_source(
FILE: python/jupytergis_lab/jupytergis_lab/notebook/tests/test_api.py
class TestDocument (line 14) | class TestDocument:
method setup_method (line 15) | def setup_method(self):
class TestTiffLayer (line 19) | class TestTiffLayer(TestDocument):
method test_sourcelayer (line 20) | def test_sourcelayer(self):
class TestGeoPackageVectorLayer (line 37) | class TestGeoPackageVectorLayer(TestDocument):
method test_sourcelayer (line 38) | def test_sourcelayer(self):
class TestGeoPackageRasterLayer (line 43) | class TestGeoPackageRasterLayer(TestDocument):
method test_sourcelayer (line 44) | def test_sourcelayer(self):
class TestGeoParquetLayer (line 49) | class TestGeoParquetLayer(TestDocument):
method test_sourcelayer (line 50) | def test_sourcelayer(self):
function test_vector_symbology_state_from_color_expr (line 111) | def test_vector_symbology_state_from_color_expr(color_expr, expected):
class TestLayerManipulation (line 115) | class TestLayerManipulation(TestDocument):
method test_add_and_remove_layer_and_source (line 116) | def test_add_and_remove_layer_and_source(self):
method test_remove_nonexistent_layer_raises (line 126) | def test_remove_nonexistent_layer_raises(self):
FILE: python/jupytergis_lab/jupytergis_lab/notebook/utils.py
class MESSAGE_ACTION (line 9) | class MESSAGE_ACTION(StrEnum):
function multi_urljoin (line 14) | def multi_urljoin(*parts) -> str:
function isURL (line 23) | def isURL(path: str) -> bool:
function download_file (line 27) | def download_file(url: str, ext: str) -> str:
function get_gpkg_layers (line 37) | def get_gpkg_layers(gpkg_path: str, data_type: str) -> list[str]:
FILE: python/jupytergis_lab/jupytergis_lab/notebook/y_connector.py
class YDocConnector (line 9) | class YDocConnector(Widget):
method __init__ (line 10) | def __init__(self, path: str | Path | None, **kwargs) -> None:
FILE: python/jupytergis_lab/scripts/bump-version.py
function bump (line 8) | def bump():
FILE: python/jupytergis_lab/src/index.ts
function populateMenus (line 243) | function populateMenus(mainMenu: IMainMenu, isEnabled: () => boolean): v...
function buildGroupsMenu (line 258) | function buildGroupsMenu(
FILE: python/jupytergis_lab/src/notebookrenderer.ts
type ICommMetadata (line 41) | interface ICommMetadata {
constant CLASS_NAME (line 49) | const CLASS_NAME = 'jupytergis-notebook-widget';
class YJupyterGISModel (line 51) | class YJupyterGISModel extends JupyterYModel {
method awareness (line 54) | get awareness() {
class YJupyterGISLuminoWidget (line 59) | class YJupyterGISLuminoWidget extends Panel {
method constructor (line 60) | constructor(options: IOptions) {
method jgisWidget (line 84) | get jgisWidget(): JupyterGISOutputWidget {
type IOptions (line 129) | interface IOptions {
class YJupyterGISModelFactory (line 168) | class YJupyterGISModelFactory extends YJupyterGISModel {
method initialize (line 169) | protected async initialize(commMetadata: {
class YJupyterGISWidget (line 246) | class YJupyterGISWidget implements IJupyterYWidget {
method constructor (line 247) | constructor(yModel: YJupyterGISModel, node: HTMLElement) {
method dispose (line 267) | dispose(): void {
FILE: python/jupytergis_lite/scripts/bump-version.py
function get_version (line 12) | def get_version():
function next_version (line 17) | def next_version():
function bump_jupytergis_deps (line 24) | def bump_jupytergis_deps(py_version: str):
function bump (line 38) | def bump():
FILE: python/jupytergis_qgis/jupytergis_qgis/__init__.py
function _jupyter_labextension_paths (line 17) | def _jupyter_labextension_paths():
function _jupyter_server_extension_points (line 21) | def _jupyter_server_extension_points():
function _load_jupyter_server_extension (line 25) | def _load_jupyter_server_extension(server_app):
FILE: python/jupytergis_qgis/jupytergis_qgis/handlers.py
class BackendCheckHandler (line 10) | class BackendCheckHandler(APIHandler):
method post (line 12) | def post(self):
class ExportToQgisHandler (line 21) | class ExportToQgisHandler(APIHandler):
method post (line 23) | def post(self):
function setup_handlers (line 53) | def setup_handlers(web_app):
FILE: python/jupytergis_qgis/jupytergis_qgis/qgis_loader.py
function closeQgis (line 61) | def closeQgis():
function qgis_layer_to_jgis (line 65) | def qgis_layer_to_jgis(
function _build_color_ramp (line 391) | def _build_color_ramp(operator, colorList, band, source_min, source_max):
function qgis_layer_tree_to_jgis (line 435) | def qgis_layer_tree_to_jgis(
function import_project_from_qgis (line 466) | def import_project_from_qgis(path: str | Path):
function _rgba_to_qcolor (line 500) | def _rgba_to_qcolor(rgba):
function get_base_symbol (line 511) | def get_base_symbol(geometry_type, symb_state, opacity):
function _build_color_ramp (line 541) | def _build_color_ramp(symbology_state):
function _sample_qcolors (line 557) | def _sample_qcolors(symbology_state, n):
function create_categorized_renderer (line 575) | def create_categorized_renderer(symbology_state, geometry_type, base_sym...
function create_graduated_renderer (line 613) | def create_graduated_renderer(symbology_state, geometry_type, base_symbo...
function jgis_layer_to_qgis (line 648) | def jgis_layer_to_qgis(
function jgis_layer_group_to_qgis (line 979) | def jgis_layer_group_to_qgis(
function export_project_to_qgis (line 1012) | def export_project_to_qgis(
FILE: python/jupytergis_qgis/jupytergis_qgis/qgis_ydoc.py
function reversed_tree (line 12) | def reversed_tree(root):
class YQGISBase (line 18) | class YQGISBase(YBaseDoc):
method __init__ (line 19) | def __init__(self, *args, **kwargs):
method layers (line 30) | def layers(self) -> Map:
method sources (line 34) | def sources(self) -> Map:
method options (line 38) | def options(self) -> Map:
method layerTree (line 42) | def layerTree(self) -> Array:
method metadata (line 46) | def metadata(self) -> Map:
method version (line 50) | def version(self) -> str:
method get (line 53) | def get(self):
method set (line 68) | def set(self, value):
method observe (line 89) | def observe(self, callback: Callable[[str, Any], None]):
method _load (line 110) | def _load(self, source: str):
method _save (line 123) | def _save(self, virtual_file: dict[str, Any]):
class YQGS (line 137) | class YQGS(YQGISBase):
method __init__ (line 138) | def __init__(self, *args, **kwargs):
class YQGZ (line 143) | class YQGZ(YQGISBase):
method __init__ (line 144) | def __init__(self, *args, **kwargs):
FILE: python/jupytergis_qgis/jupytergis_qgis/tests/test_qgis.py
function test_qgis_loader (line 12) | def test_qgis_loader():
function test_qgis_saver (line 124) | def test_qgis_saver():
FILE: python/jupytergis_qgis/scripts/bump-version.py
function bump (line 8) | def bump():
FILE: python/jupytergis_qgis/src/modelfactory.ts
class JupyterGISModelFactoryBase (line 13) | class JupyterGISModelFactoryBase implements DocumentRegistry.IModelFacto...
method constructor (line 14) | constructor(options: JupyterGISModelFactoryBase.IOptions) {
method name (line 29) | get name(): string {
method contentType (line 38) | get contentType(): Contents.ContentType {
method fileFormat (line 47) | get fileFormat(): Contents.FileFormat {
method isDisposed (line 56) | get isDisposed(): boolean {
method dispose (line 63) | dispose(): void {
method preferredLanguage (line 73) | preferredLanguage(path: string): string {
method createNew (line 82) | createNew(
type IOptions (line 100) | interface IOptions {
class QGZModelFactory (line 106) | class QGZModelFactory extends JupyterGISModelFactoryBase {
method name (line 112) | get name(): string {
method contentType (line 121) | get contentType(): Contents.ContentType {
class QGSModelFactory (line 126) | class QGSModelFactory extends JupyterGISModelFactoryBase {
method name (line 132) | get name(): string {
method contentType (line 141) | get contentType(): Contents.ContentType {
FILE: python/jupytergis_qgis/src/plugins.ts
type IExportResponse (line 58) | interface IExportResponse {
FILE: scripts/build_packages.py
function execute (line 10) | def execute(cmd: str, cwd=None):
function build_packages (line 14) | def build_packages():
FILE: scripts/dev-install.py
function execute (line 5) | def execute(cmd: str, cwd=None):
function install_dev (line 9) | def install_dev():
FILE: scripts/layer_gallery/layer_gallery/generate.py
function _check_missing_thumbnails (line 46) | def _check_missing_thumbnails() -> list[Path]:
function _report_missing_thumbnails (line 57) | def _report_missing_thumbnails(
function _find_orphan_images (line 76) | def _find_orphan_images() -> list[Path]:
function _layer_parameters (line 90) | def _layer_parameters(entry: LayerEntry) -> dict[str, Any]:
function _write_gallery_json (line 103) | def _write_gallery_json(data: dict[str, Any]) -> None:
function _make_thumbnail (line 110) | def _make_thumbnail(entry: LayerEntry) -> None:
function _report_thumbnail_orphans (line 127) | def _report_thumbnail_orphans() -> None:
function _build_gallery_entry (line 135) | def _build_gallery_entry(entry: LayerEntry) -> dict[str, Any]:
function run (line 164) | def run(*, generate_thumbnails: bool) -> None:
function cli (line 188) | def cli() -> None:
FILE: scripts/layer_gallery/layer_gallery/models.py
class ThumbnailConfig (line 14) | class ThumbnailConfig(BaseModel):
class XYZServicesRef (line 23) | class XYZServicesRef(RootModel[list[str]]):
method resolve (line 34) | def resolve(self) -> TileProvider:
class GeoJSONLayer (line 39) | class GeoJSONLayer(BaseModel):
class LayerEntry (line 46) | class LayerEntry(BaseModel):
method thumbnail_filename (line 64) | def thumbnail_filename(self) -> str:
method _thumbnail_filename (line 69) | def _thumbnail_filename(val: str) -> str:
FILE: scripts/layer_gallery/layer_gallery/thumbnail.py
function generate_thumbnail (line 14) | def generate_thumbnail(
function _fetch_tile (line 59) | def _fetch_tile(
FILE: scripts/layer_gallery/layer_gallery/utils.py
function resolve_tile_provider (line 12) | def resolve_tile_provider(entry: LayerEntry) -> TileProvider | None:
function build_url_parameters (line 27) | def build_url_parameters(tile_provider: TileProvider) -> dict[str, Any]:
function dict_keys_to_camel (line 58) | def dict_keys_to_camel[T](obj: T) -> T:
function _snake_to_camel (line 73) | def _snake_to_camel(s: str) -> str:
FILE: scripts/layer_gallery/tests/conftest.py
class GalleryDirs (line 8) | class GalleryDirs:
function gallery_dirs (line 15) | def gallery_dirs(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> Gal...
FILE: scripts/layer_gallery/tests/helpers.py
function make_raster_entry (line 15) | def make_raster_entry(
function make_geojson_entry (line 43) | def make_geojson_entry() -> LayerEntry:
function fake_tile_response (line 57) | def fake_tile_response(
FILE: scripts/layer_gallery/tests/test_generate.py
class TestCheckMissingThumbnails (line 19) | class TestCheckMissingThumbnails:
method test_check_missing_thumbnails_all_present (line 24) | def test_check_missing_thumbnails_all_present(
method test_check_missing_thumbnails_reports_missing (line 35) | def test_check_missing_thumbnails_reports_missing(
method test_check_missing_thumbnails_includes_geojson (line 47) | def test_check_missing_thumbnails_includes_geojson(
class TestFindOrphanImages (line 59) | class TestFindOrphanImages:
method test_find_orphan_images_none (line 64) | def test_find_orphan_images_none(self, gallery_dirs: GalleryDirs) -> N...
method test_find_orphan_images_detects_extra_png (line 72) | def test_find_orphan_images_detects_extra_png(
method test_find_orphan_images_detects_non_png (line 87) | def test_find_orphan_images_detects_non_png(
method test_find_orphan_images_ignores_non_image_files (line 100) | def test_find_orphan_images_ignores_non_image_files(
class TestBuildGalleryEntry (line 109) | class TestBuildGalleryEntry:
method test_build_gallery_entry_tile_provider (line 125) | def test_build_gallery_entry_tile_provider(self) -> None:
method test_build_gallery_entry_geojson (line 145) | def test_build_gallery_entry_geojson(self) -> None:
method test_build_gallery_entry_vector_tile_default_layer_params (line 165) | def test_build_gallery_entry_vector_tile_default_layer_params(self) ->...
class TestRun (line 186) | class TestRun:
method test_run_build_mode_writes_json (line 205) | def test_run_build_mode_writes_json(self, gallery_dirs: GalleryDirs) -...
method test_run_build_mode_exits_on_missing_thumbnail (line 219) | def test_run_build_mode_exits_on_missing_thumbnail(
method test_run_thumbnails_mode_generates_missing (line 246) | def test_run_thumbnails_mode_generates_missing(
method test_run_thumbnails_mode_skips_geojson (line 263) | def test_run_thumbnails_mode_skips_geojson(self, gallery_dirs: Gallery...
FILE: scripts/layer_gallery/tests/test_models.py
class TestXYZServicesRef (line 6) | class TestXYZServicesRef:
method test_xyzservicesref_resolve (line 7) | def test_xyzservicesref_resolve(self) -> None:
class TestLayerEntry (line 12) | class TestLayerEntry:
method test_thumbnail_filename (line 21) | def test_thumbnail_filename(self, input_name: str, expected: str) -> N...
FILE: scripts/layer_gallery/tests/test_thumbnail.py
class TestGenerateThumbnail (line 11) | class TestGenerateThumbnail:
method test_generate_thumbnail_creates_256x256_png (line 12) | def test_generate_thumbnail_creates_256x256_png(self) -> None:
method test_url_parameter_is_substituted (line 32) | def test_url_parameter_is_substituted(self) -> None:
FILE: scripts/layer_gallery/tests/test_utils.py
class TestResolveTileProvider (line 13) | class TestResolveTileProvider:
method test_resolve_tile_provider_from_xyz_nested (line 27) | def test_resolve_tile_provider_from_xyz_nested(self) -> None:
method test_resolve_tile_provider_from_xyz_flat (line 44) | def test_resolve_tile_provider_from_xyz_flat(self) -> None:
method test_resolve_tile_provider_from_tile_provider (line 56) | def test_resolve_tile_provider_from_tile_provider(self) -> None:
method test_resolve_tile_provider_for_geojson_returns_none (line 62) | def test_resolve_tile_provider_for_geojson_returns_none(self) -> None:
class TestBuildUrlParameters (line 67) | class TestBuildUrlParameters:
method test_build_url_parameters_substitutes_yesterday_for_empty_time (line 68) | def test_build_url_parameters_substitutes_yesterday_for_empty_time(sel...
method test_build_url_parameters_passes_through_static_values (line 80) | def test_build_url_parameters_passes_through_static_values(self) -> None:
method test_build_url_parameters_raises_for_missing_placeholder (line 91) | def test_build_url_parameters_raises_for_missing_placeholder(self) -> ...
FILE: ui-tests/tests/geojson-layers.spec.ts
constant FILENAME (line 10) | const FILENAME = 'empty-france.jGIS';
FILE: ui-tests/tests/graduated-lines.spec.ts
constant FILENAME (line 5) | const FILENAME = 'graduated-lines-test.jGIS';
FILE: ui-tests/tests/layer-browser.spec.ts
constant TEST_REGISTRY (line 10) | const TEST_REGISTRY = {
function openLayerBrowser (line 76) | async function openLayerBrowser(
function getGridTiles (line 92) | async function getGridTiles(page: IJupyterLabPageFixture): Promise<Locat...
FILE: ui-tests/tests/left-panel.spec.ts
function openLayerTree (line 10) | async function openLayerTree(page: IJupyterLabPageFixture): Promise<Loca...
FILE: ui-tests/tests/mobile-panel.spec.ts
constant FILENAME (line 5) | const FILENAME = 'panel-test.jGIS';
constant MOBILE_VIEWPORT (line 6) | const MOBILE_VIEWPORT = { width: 390, height: 844 };
constant DESKTOP_VIEWPORT (line 7) | const DESKTOP_VIEWPORT = { width: 1280, height: 800 };
FILE: ui-tests/tests/notebook.spec.ts
constant FILENAME (line 5) | const FILENAME = 'eq.geojson';
Condensed preview — 551 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,781K chars).
[
{
"path": ".eslintignore",
"chars": 80,
"preview": "node_modules\ndist\ncoverage\n**/*.d.ts\n**/*.js\ntests\nui-tests\n**/build/\nexamples/\n"
},
{
"path": ".eslintrc.js",
"chars": 1704,
"preview": "module.exports = {\n extends: [\n \"eslint:recommended\",\n \"plugin:@typescript-eslint/eslint-recommended\",\n \"plugi"
},
{
"path": ".github/ISSUE_TEMPLATE/0-user-story.yml",
"chars": 1076,
"preview": "name: '📖 User story'\ndescription: |\n Share a workflow that you would like to see improve (faster, less\n frustrating, l"
},
{
"path": ".github/ISSUE_TEMPLATE/1-experience-report.yml",
"chars": 418,
"preview": "name: '🧪 Experience report'\ndescription: 'Share your experience using JupyterGIS; anything goes.'\nlabels:\n - 'experienc"
},
{
"path": ".github/ISSUE_TEMPLATE/2-bug.yml",
"chars": 1216,
"preview": "name: '🐞 Bug'\ndescription: 'Any behavior that is unexpected or differs from the documentation.'\nlabels:\n - 'bug'\nbody:\n"
},
{
"path": ".github/ISSUE_TEMPLATE/3-docs.yml",
"chars": 925,
"preview": "name: '📃 Documentation'\ndescription: 'Anything that could be improved about our documentation.'\nlabels:\n - 'documentati"
},
{
"path": ".github/ISSUE_TEMPLATE/4-feature-request.yml",
"chars": 692,
"preview": "name: '🚀 Feature Request'\ndescription: 'New features you would like to see.'\nlabels:\n - 'enhancement'\nbody:\n - type: '"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 265,
"preview": "blank_issues_enabled: true\ncontact_links:\n - name: '🌟 Community support'\n url: 'https://jupyter.zulipchat.com/#narro"
},
{
"path": ".github/dependabot.yml",
"chars": 225,
"preview": "version: 2\nupdates:\n - package-ecosystem: 'github-actions'\n directory: '/'\n schedule:\n interval: 'monthly'\n "
},
{
"path": ".github/pull_request_template.md",
"chars": 844,
"preview": "## Description\n\n<!--\nInsert Pull Request description here.\n\nWhat does this PR change? Why?\n-->\n\n## Checklist\n\n- [ ] PR h"
},
{
"path": ".github/workflows/binder-on-pr.yml",
"chars": 347,
"preview": "name: Binder Badge\non:\n pull_request_target:\n types: [opened]\n\njobs:\n binder:\n runs-on: ubuntu-latest\n permis"
},
{
"path": ".github/workflows/build-test-without-lockfile.yml",
"chars": 868,
"preview": "name: Test-build without lockfile\n\non:\n push:\n branches: main\n pull_request:\n branches: '*'\n\npermissions: {}\n\njo"
},
{
"path": ".github/workflows/build.yml",
"chars": 9924,
"preview": "name: Build\n\non:\n push:\n branches: main\n pull_request:\n branches: '*'\n workflow_dispatch:\n\njobs:\n build:\n n"
},
{
"path": ".github/workflows/check-links.yml",
"chars": 757,
"preview": "name: Check links\n\non:\n push:\n branches: main\n pull_request:\n branches: '*'\n\npermissions: {}\n\njobs:\n check_link"
},
{
"path": ".github/workflows/check-release.yml",
"chars": 975,
"preview": "name: Check Release\non:\n push:\n branches:\n - main\n pull_request:\n branches:\n - main\n\npermissions:\n co"
},
{
"path": ".github/workflows/draft-pdf.yml",
"chars": 704,
"preview": "name: Draft PDF\non:\n push:\n paths:\n - paper/**\n - .github/workflows/draft-pdf.yml\n\njobs:\n paper:\n runs"
},
{
"path": ".github/workflows/enforce-labels.yml",
"chars": 319,
"preview": "name: Enforce PR label\n\non:\n pull_request:\n types: [labeled, unlabeled, opened, edited, synchronize]\njobs:\n enforce"
},
{
"path": ".github/workflows/lint-js.yml",
"chars": 3203,
"preview": "name: Lint JavaScript\n\non:\n push:\n branches: main\n pull_request:\n branches: '*'\n\npermissions: {}\n\njobs:\n lint-j"
},
{
"path": ".github/workflows/pr-rtd-link.yml",
"chars": 865,
"preview": "# The ReadTheDocs preview link is \"hidden\" within the GitHub \"Checks\"\n# interface. For users who don't know this, findin"
},
{
"path": ".github/workflows/prep-release.yml",
"chars": 1723,
"preview": "name: 'Step 1: Prep Release'\non:\n workflow_dispatch:\n inputs:\n version_spec:\n description: 'New Version "
},
{
"path": ".github/workflows/publish-release.yml",
"chars": 1974,
"preview": "name: 'Step 2: Publish Release'\non:\n workflow_dispatch:\n inputs:\n branch:\n description: 'The target bran"
},
{
"path": ".github/workflows/triage-prs-to-board.yml",
"chars": 525,
"preview": "name: 'PR Triage Bot'\n\non:\n schedule:\n - cron: '0 * * * *'\n workflow_dispatch:\n\njobs:\n pr-triage:\n runs-on: 'ub"
},
{
"path": ".github/workflows/typecheck-python.yml",
"chars": 871,
"preview": "name: 'Typecheck Python (layer gallery script only)'\n\non:\n push:\n branches: 'main'\n pull_request:\n branches: '*'"
},
{
"path": ".github/workflows/unit-test-js.yml",
"chars": 1531,
"preview": "name: Unit test JavaScript\n\non:\n push:\n branches: main\n pull_request:\n branches: '*'\n\npermissions: {}\n\njobs:\n u"
},
{
"path": ".github/workflows/unit-test-python.yml",
"chars": 1327,
"preview": "name: Unit test Python\n\non:\n push:\n branches: main\n pull_request:\n branches: '*'\n\npermissions: {}\n\njobs:\n unit-"
},
{
"path": ".github/workflows/update_galata_references.yaml",
"chars": 1997,
"preview": "name: Update Galata References\n\non:\n issue_comment:\n types: [created, edited]\n\npermissions:\n contents: write\n pull"
},
{
"path": ".github/workflows/update_lite_galata_references.yaml",
"chars": 1545,
"preview": "name: Update Lite Galata References\n\non:\n issue_comment:\n types: [created, edited]\n\npermissions:\n contents: write\n "
},
{
"path": ".github/workflows/zizmor.yml",
"chars": 708,
"preview": "name: 'GitHub Actions Security Analysis with zizmor 🌈'\n\non:\n push:\n branches:\n - 'main'\n paths:\n - '.gi"
},
{
"path": ".gitignore",
"chars": 2140,
"preview": "*.bundle.*\nlib/\nnode_modules/\n.mamba\n*.egg-info/\n.ipynb_checkpoints\n*.tsbuildinfo\n\npython/**/labextension\npython/**/_ver"
},
{
"path": ".nblink/environment.yml",
"chars": 167,
"preview": "name: gis-nblink-environment\nchannels:\n - https://prefix.dev/emscripten-forge-4x\n - https://prefix.dev/conda-forge\ndep"
},
{
"path": ".nblink/nblink-lock.json",
"chars": 22934,
"preview": "{\n \"lockVersion\": \"1.0.3\",\n \"platform\": \"emscripten-wasm32\",\n \"specs\": [\"xeus-python\", \"jupytergis-lite\"],\n \"channel"
},
{
"path": ".pre-commit-config.yaml",
"chars": 1362,
"preview": "ci:\n # pre-commit.ci will open PRs updating our hooks once a month\n autoupdate_schedule: quarterly\n autofix_prs: fals"
},
{
"path": ".prettierignore",
"chars": 113,
"preview": "node_modules\n**/node_modules\n.mamba\n.jupyter-data\n**/lib\n**/*.d.ts\n**/*.js\nyarn.lock\n*.jGIS\nplaywright.config.js\n"
},
{
"path": ".prettierrc",
"chars": 101,
"preview": "{\n \"singleQuote\": true,\n \"trailingComma\": \"all\",\n \"arrowParens\": \"avoid\",\n \"endOfLine\": \"auto\"\n}\n"
},
{
"path": ".readthedocs.yaml",
"chars": 2052,
"preview": "# See https://docs.readthedocs.io/en/stable/config-file/v2.html\nversion: 2\n\nbuild:\n os: \"ubuntu-24.04\"\n tools:\n pyt"
},
{
"path": ".yarnrc.yml",
"chars": 77,
"preview": "nodeLinker: node-modules\nenableImmutableInstalls: false\nenableScripts: false\n"
},
{
"path": "CHANGELOG.md",
"chars": 150712,
"preview": "# Changelog\n\n<!-- <START NEW CHANGELOG ENTRY> -->\n\n## 0.15.0\n\n([Full Changelog](https://github.com/geojupyter/jupytergis"
},
{
"path": "CITATION.cff",
"chars": 4672,
"preview": "cff-version: 1.2.0\nmessage: >-\n If you use this software, please cite it using the metadata from this file.\n\ntitle: \"Ju"
},
{
"path": "CONTRIBUTING.md",
"chars": 133,
"preview": "Please check out [our documentation's contributing guide](https://jupytergis.readthedocs.io/en/latest/contributor_guide/"
},
{
"path": "LICENSE",
"chars": 1531,
"preview": "BSD 3-Clause License\n\nCopyright (c) 2024, JupyterGIS contributors\nAll rights reserved.\n\nRedistribution and use in source"
},
{
"path": "RELEASE.md",
"chars": 134,
"preview": "Please view our releasing guide on ReadTheDocs:\n\n<https://jupytergis.readthedocs.io/en/latest/contributor_guide/how-tos/"
},
{
"path": "binder/environment.yml",
"chars": 206,
"preview": "name: base\nchannels:\n - conda-forge\ndependencies:\n # runtime dependencies\n - python >=3.12\n - nodejs >=24,<25\n - ya"
},
{
"path": "binder/jupyter_config.json",
"chars": 48,
"preview": "{\n \"LabApp\": {\n \"collaborative\": true\n }\n}\n"
},
{
"path": "binder/postBuild",
"chars": 1429,
"preview": "#!/usr/bin/env python3\n\"\"\" perform a development install of jupytergis\n On Binder, this will run _after_ the environm"
},
{
"path": "binder/start",
"chars": 72,
"preview": "#!/bin/bash\n\nset -e\n\necho $@\n\nexec jupyter-lab --collaborative \"${@:4}\"\n"
},
{
"path": "docs/assets/css/custom.css",
"chars": 360,
"preview": ".try_examples_button {\n background-color: #f7dc1e;\n border: none;\n padding: 5px 10px;\n border-radius: 15px;\n font-f"
},
{
"path": "docs/build-on-change.sh",
"chars": 462,
"preview": "#!/usr/bin/env bash\n# NOTE: Requires `inotify-tools`. e.g. `apt install inotify-tools`.\n# TODO: MacOS support?\nset -euo "
},
{
"path": "docs/build.sh",
"chars": 343,
"preview": "#!/usr/bin/env bash\nset -euo pipefail\n\nTHIS_DIR=\"$( cd \"$(dirname \"$0\")\"; pwd -P )\"\n\n# Build can fail if certain artifac"
},
{
"path": "docs/changelog.md",
"chars": 87,
"preview": "<!-- prettier-ignore -->\n:::{include} ../CHANGELOG.md\n:parser: myst_parser.sphinx_\n:::\n"
},
{
"path": "docs/clean.sh",
"chars": 112,
"preview": "#!/usr/bin/env bash\nset -euo pipefail\n\nTHIS_DIR=\"$( cd \"$(dirname \"$0\")\"; pwd -P )\"\nrm -rf \"${THIS_DIR}/_build\"\n"
},
{
"path": "docs/conf.py",
"chars": 1285,
"preview": "import os\n\non_rtd = os.environ.get(\"READTHEDOCS\", None) == \"True\"\n\nhtml_theme = \"pydata_sphinx_theme\"\nhtml_theme_options"
},
{
"path": "docs/contributor_guide/development_setup.md",
"chars": 3121,
"preview": "# Development setup\n\n## Development install\n\n:::{note}\nYou will need [`Node.js`](https://nodejs.org/) to build the exten"
},
{
"path": "docs/contributor_guide/explanation/architecture.md",
"chars": 5768,
"preview": "# Architecture overview\n\nJupyterGIS is a JupyterLab extension (based on the structure defined by\n[jupyterlab/extensions-"
},
{
"path": "docs/contributor_guide/explanation/code-generation.md",
"chars": 3592,
"preview": "# Code generation\n\nJupyterGIS leverages code generation to share information about data structures across\nPython and Typ"
},
{
"path": "docs/contributor_guide/explanation/form-system.md",
"chars": 6828,
"preview": "# Form system\n\nThis document describes how layer, source, processing, and story-editor forms work, including how they ar"
},
{
"path": "docs/contributor_guide/explanation/index.md",
"chars": 55,
"preview": "# Explanation\n\n```{toctree}\n:maxdepth: 1\n:glob:\n\n*\n```\n"
},
{
"path": "docs/contributor_guide/explanation/security-and-npm-dependencies.md",
"chars": 4320,
"preview": "# Security & NPM dependencies\n\nIn late 2025, there were at least 4 major supply-chain attacks against NPM packages.\nYou "
},
{
"path": "docs/contributor_guide/explanation/ui-testing.md",
"chars": 1191,
"preview": "# UI testing\n\nJupyterGIS includes automated **user interface testing**, powered by\n[Playwright](https://playwright.dev/)"
},
{
"path": "docs/contributor_guide/how-tos/add-to-layer-gallery.md",
"chars": 3205,
"preview": "# Add to the layer gallery\n\nEdit **`scripts/layer_gallery/config.py`**. This is the only file you need to touch.\n\nThe `g"
},
{
"path": "docs/contributor_guide/how-tos/build-docs-locally.md",
"chars": 1196,
"preview": "# Build JupyterGIS documentation locally\n\n:::{tip}\nYou can use `conda` or `mamba` as drop-in replacements for `micromamb"
},
{
"path": "docs/contributor_guide/how-tos/code_quality.md",
"chars": 1542,
"preview": "# Check code quality\n\n```{seealso}\nComplete [dev install](/contributor_guide/development_setup) instructions before cont"
},
{
"path": "docs/contributor_guide/how-tos/commands/index.md",
"chars": 2696,
"preview": "# Add a command\n\nA [\"command\"](https://jupyterlab.readthedocs.io/en/stable/user/commands.html)\nis a behavior that can be"
},
{
"path": "docs/contributor_guide/how-tos/index.md",
"chars": 55,
"preview": "# How-tos\n\n```{toctree}\n:maxdepth: 1\n:glob:\n\n*/*\n*\n```\n"
},
{
"path": "docs/contributor_guide/how-tos/keybindings/index.md",
"chars": 1386,
"preview": "# Add a keybinding\n\n:::{admonition} Objectives\n:class: seealso\n\nBy the end of this tutorial, you will be able to add or "
},
{
"path": "docs/contributor_guide/how-tos/processing-operations/index.md",
"chars": 3343,
"preview": "# Add a processing operation\n\n:::{admonition} Objectives\n:class: seealso\n\nBy the end of this tutorial, you will be able "
},
{
"path": "docs/contributor_guide/how-tos/release.md",
"chars": 5714,
"preview": "# Release JupyterGIS packages\n\n## Automated Releases with `jupyter_releaser`\n\nWe use [`jupyter_releaser`](https://jupyte"
},
{
"path": "docs/contributor_guide/how-tos/schema-migration.md",
"chars": 4023,
"preview": "# Add a schema migration step\n\nWhen the `.jGIS` file format changes (field renames, restructured data, new\nrequired fiel"
},
{
"path": "docs/contributor_guide/how-tos/test.md",
"chars": 702,
"preview": "# Test JupyterGIS\n\n## Python unit tests\n\nInstall testing dependencies:\n\n```bash\npip install --group test\n```\n\nRun the te"
},
{
"path": "docs/contributor_guide/how-tos/ui-tests-debug-failures.md",
"chars": 2459,
"preview": "# UI tests: Debug failures\n\nIt can be difficult to debug failures in UI tests from the logs alone.\n[Playwright](https://"
},
{
"path": "docs/contributor_guide/how-tos/ui-tests-update-snapshots.md",
"chars": 4029,
"preview": "# UI tests: Update snapshots\n\nWe use \"snapshot\" (screenshot) testing to verify that the UI appears as expected when\ncert"
},
{
"path": "docs/contributor_guide/how-tos/write-tutorials.md",
"chars": 669,
"preview": "# Write tutorials\n\nThis guide provides best practices for writing tutorials for JupyterGIS. To keep tutorials consistent"
},
{
"path": "docs/contributor_guide/index.md",
"chars": 570,
"preview": "# Contributor guide\n\nWe're thrilled you're ready to contribute to JupyterGIS!\n\nThis documentation will help you get star"
},
{
"path": "docs/contributor_guide/troubleshooting.md",
"chars": 991,
"preview": "# Troubleshooting\n\n## Setup of development environment hangs indefinitely when running the `dev-install.py` step, specif"
},
{
"path": "docs/environment-docs.yml",
"chars": 714,
"preview": "name: jupytergis-docs\nchannels:\n - conda-forge\n - nodefaults\ndependencies:\n - python\n\n # Build docs & JupyterLite\n "
},
{
"path": "docs/environment.yml",
"chars": 448,
"preview": "name: xeus-python-kernel\nchannels:\n - https://prefix.dev/emscripten-forge-dev\n - conda-forge\ndependencies:\n - python="
},
{
"path": "docs/index.md",
"chars": 1489,
"preview": "# JupyterGIS\n\nJupyterGIS is a **collaborative** Geographical Information System (GIS) environment in\nJupyterLab.\n\n```{ra"
},
{
"path": "docs/jupyter-lite.json",
"chars": 213,
"preview": "{\n \"jupyter-lite-schema-version\": 0,\n \"jupyter-config-data\": {\n \"enableMemoryStorage\": true,\n \"settingsStorageDr"
},
{
"path": "docs/jupyter_lite_config.json",
"chars": 219,
"preview": "{\n \"LiteBuildConfig\": {\n \"extra_file_types\": {\n \"jgis\": {\n \"name\": \"jgis\",\n \"extensions\": [\".jgis"
},
{
"path": "docs/overview/features/collab.md",
"chars": 640,
"preview": "(collab)=\n\n# Collaborative Features\n\nOne of the standout features of JupyterGIS is its shared editing functionality, whi"
},
{
"path": "docs/overview/features/extension.md",
"chars": 443,
"preview": "(extension)=\n\n# JupyterLab Extension\n\nJupyterGIS comes with a JupyterLab extension that embeds QGIS features directly in"
},
{
"path": "docs/overview/features/index.md",
"chars": 68,
"preview": "# Features\n\n```{toctree}\n:maxdepth: 2\n\nextension.rst\ncollab.rst\n```\n"
},
{
"path": "docs/overview/index.md",
"chars": 1261,
"preview": "# Overview\n\n## 🤝 Real-time collaboration\n\nJupyterGIS is designed to allow multiple people to work on the same geospatial"
},
{
"path": "docs/overview/what-is-jgis.md",
"chars": 3044,
"preview": "# What is JupyterGIS? What is it _not_?\n\n## What is JupyterGIS?\n\n### A reimagination of traditional GIS paradigms\n\nJupyt"
},
{
"path": "docs/user_guide/how-tos/ai-skills.md",
"chars": 8156,
"preview": "(how-to-ai-skills)=\n\n# Teach the AI chat with Agent Skills\n\nJupyterGIS ships a growing set of commands (layer creation, "
},
{
"path": "docs/user_guide/how-tos/collab.md",
"chars": 3213,
"preview": "(how-to-collab)=\n\n# Create Collaborative JupyterGIS Sessions\n\n:::{important}\nPlease note that currently, real-time colla"
},
{
"path": "docs/user_guide/how-tos/index.md",
"chars": 51,
"preview": "# How-tos\n\n```{toctree}\n:maxdepth: 1\n:glob:\n\n*\n```\n"
},
{
"path": "docs/user_guide/how-tos/story-maps.md",
"chars": 7309,
"preview": "(how-to-story-map)=\n\n# Create and Edit Story Maps\n\n<video controls width=\"700\">\n <source src=\"https://github.com/user-a"
},
{
"path": "docs/user_guide/index.md",
"chars": 585,
"preview": "# User guide\n\nThanks for trying out JupyterGIS!\n\n```{jupyterlite}\n:new_tab: True\n:new_tab_button_text: Try it with Jupyt"
},
{
"path": "docs/user_guide/install.md",
"chars": 1013,
"preview": "# Installing JupyterGIS\n\n````{tab} Mamba (recommended)\n\n:::{note}\nIt is best to install JupyterGIS using `mamba`, `conda"
},
{
"path": "docs/user_guide/python_api.md",
"chars": 993,
"preview": "(python-api)=\n\n# Python API\n\n## Basic Usage\n\nJupyterGIS provides a Python API that can be used for opening QGIS projects"
},
{
"path": "docs/user_guide/tutorials/01-intro/index.md",
"chars": 10377,
"preview": "# Getting Started with JupyterGIS\n\nWelcome to the first tutorial in the JupyterGIS series! This guide will introduce you"
},
{
"path": "docs/user_guide/tutorials/02-collaboration/index.md",
"chars": 10460,
"preview": "# Collaborative Features in JupyterGIS\n\nWelcome to the JupyterGIS collaborative features tutorial. JupyterGIS enables se"
},
{
"path": "docs/user_guide/tutorials/index.md",
"chars": 55,
"preview": "# Tutorials\n\n```{toctree}\n:maxdepth: 1\n:glob:\n\n*/*\n```\n"
},
{
"path": "examples/01-Create_a_new_JGIS_document.ipynb",
"chars": 4559,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"id\": \"8dbc9440\",\n \"metadata\": {},\n \"source\": [\n \"## What is \\\"T"
},
{
"path": "examples/99-Explore_data_in_a_map.ipynb",
"chars": 3279,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"id\": \"c3f4096f-cbd3-43e8-a986-520681f03581\",\n \"metadata\": {\n \"edi"
},
{
"path": "examples/99-Open_an_existing_JGIS_Project_and_add_layers.ipynb",
"chars": 2922,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"id\": \"1008b547-f396-4960-8a80-118370f0fab1\",\n \"metadata\": {\n \"edi"
},
{
"path": "examples/99-Vector_styling.ipynb",
"chars": 1734,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": null,\n \"id\": \"1f5dc83a-eebe-4090-8c7a-79c92510dc73\",\n "
},
{
"path": "examples/buildings.jGIS",
"chars": 2631,
"preview": "{\n \"layerTree\": [\n \"f99eb7b0-5e38-4078-b310-36a0746472aa\",\n \"148f2fb3-3077-4dcb-8d70-831570d5021f\"\n ],\n \"layers"
},
{
"path": "examples/cloud_optimized_geotiff.jGIS",
"chars": 3532,
"preview": "{\n \"layerTree\": [\n \"6dd80360-2675-40cf-aaee-c7101ef1779a\",\n \"f75fd646-bc7d-478b-b65b-de34155b8efa\"\n ],\n \"layers"
},
{
"path": "examples/data/eq.geojson",
"chars": 1724313,
"preview": "{\n \"type\": \"FeatureCollection\",\n \"crs\": {\n \"type\": \"name\",\n \"properties\": { \"name\": \"urn:ogc:def:crs:OGC:1.3:CRS"
},
{
"path": "examples/data/france_regions.geojson",
"chars": 313292,
"preview": "{\n \"type\": \"FeatureCollection\",\n \"features\": [\n {\n \"type\": \"Feature\",\n \"geometry\": {\n \"type\": \"Pol"
},
{
"path": "examples/data/nyc/nyc_roads.prj",
"chars": 972,
"preview": "PROJCS[\"NAD83(HARN) / New York Long Island (ftUS)\", GEOGCS[\"NAD83(HARN)\", DATUM[\"NAD83 (High Accuracy Regional Network)\""
},
{
"path": "examples/data/temporal-test.geojson",
"chars": 394,
"preview": "{\n \"type\": \"FeatureCollection\",\n \"features\": [\n {\n \"type\": \"Feature\",\n \"geometry\": { \"type\": \"Point\", \"co"
},
{
"path": "examples/earthquakes.jGIS",
"chars": 2341,
"preview": "{\n \"layerTree\": [\n \"8de7c2c0-6024-4716-b542-031a89fb87f9\",\n \"ccf98385-bbe3-425b-9dde-fa64d31c196a\"\n ],\n \"layers"
},
{
"path": "examples/europe_demo.jGIS",
"chars": 3595,
"preview": "{\n \"layerTree\": [\n \"9b6eb933-a1d8-4f75-8c1a-e4570b6e5a0a\",\n \"cbc57272-9ee1-416f-aca9-16ea5b7542a1\"\n ],\n \"layers"
},
{
"path": "examples/france_hiking.jGIS",
"chars": 3311,
"preview": "{\n \"layerTree\": [\n \"4a0703b3-ed56-4158-8a2e-e008c3d0fee2\",\n \"7db81237-a579-4daa-938f-5e61fdfb17e7\",\n \"0bfee293"
},
{
"path": "examples/geopackage.jgis",
"chars": 9614,
"preview": "{\n \"layerTree\": [\n \"c3e1b470-fd4e-4c57-ac0a-5b4a24e602ac/tiles\",\n \"d090703f-5953-44b3-acde-c6286e125385/PointsOfI"
},
{
"path": "examples/geoparquet.jGIS",
"chars": 2338,
"preview": "{\n \"layerTree\": [\n \"9556ca29-a5ec-41af-bf14-4b543c52aafe\",\n \"d7a2ad84-0750-4e9b-82c0-542fcc6b3265\"\n ],\n \"layers"
},
{
"path": "examples/hillshade.jGIS",
"chars": 1878,
"preview": "{\n \"layerTree\": [\n \"a82ef521-e727-4209-a5a0-145d66f18a06\",\n \"f12a8dfe-4674-43e7-a649-cd49ee83eb34\"\n ],\n \"layers"
},
{
"path": "examples/image.jGIS",
"chars": 2047,
"preview": "{\n \"layerTree\": [\n \"acb76fb7-df6d-41da-8e08-0208a1c82136\",\n \"756cb737-f817-4ba6-b7c0-8da0b97b9778\"\n ],\n \"layers"
},
{
"path": "examples/local.jGIS",
"chars": 3151,
"preview": "{\n \"layerTree\": [\n \"f5e91204-3ce9-408e-b179-c6cf5f75f0f7\",\n \"66198b90-5d1c-4637-a15d-450b17c4fcb6\",\n \"aae4466d"
},
{
"path": "examples/pmtiles-raster.jGIS",
"chars": 1978,
"preview": "{\n \"layerTree\": [\n \"3d4563da-904d-4026-a06b-1e8cffbf536f\",\n \"2815540d-70c6-4eed-ba86-51596adf6863\"\n ],\n \"layers"
},
{
"path": "examples/pmtiles-vector.jGIS",
"chars": 2583,
"preview": "{\n \"layerTree\": [\n \"93077483-0e49-4135-aa1d-244e29e5cf97\",\n \"95523f4c-27ef-42db-b755-a226ca017a94\"\n ],\n \"layers"
},
{
"path": "examples/roads.jGIS",
"chars": 1652,
"preview": "{\n \"layerTree\": [\n \"95bfd9ba-f561-414d-8e2b-bc401dae0d7f\"\n ],\n \"layers\": {\n \"95bfd9ba-f561-414d-8e2b-bc401dae0d"
},
{
"path": "examples/shapefile.jGIS",
"chars": 3608,
"preview": "{\n \"layerTree\": [\n \"54e0ea1f-32fd-4ff2-90fb-ad449a38f902\",\n \"f909d9b9-bf07-42f6-8841-8d6470665dcb\",\n \"df947252"
},
{
"path": "examples/story_map.jGIS",
"chars": 6455,
"preview": "{\n \"layerTree\": [\n \"5d10a9ba-eeef-486d-9761-33ff1ba4106e\",\n \"5f790e80-230b-4c00-8426-b3a9385937a5\",\n \"8591b32f"
},
{
"path": "examples/test.jGIS",
"chars": 3080,
"preview": "{\n \"layerTree\": [\n \"a0044fd7-f167-445f-b3d1-620a8f94b498\",\n {\n \"layers\": [\n \"2467576f-b527-4cb7-998d-"
},
{
"path": "examples/wms-tile.jGIS",
"chars": 1072,
"preview": "{\n \"layerTree\": [\n \"54ae7d71-0dcc-427d-884f-74d7652e5ea3\"\n ],\n \"layers\": {\n \"54ae7d71-0dcc-427d-884f-74d7652e5e"
},
{
"path": "examples/world-epsg4326.jGIS",
"chars": 1388,
"preview": "{\n \"layerTree\": [\n \"6e55cdae-35b0-4bff-9dd1-c8aa9563b2a6\"\n ],\n \"layers\": {\n \"6e55cdae-35b0-4bff-9dd1-c8aa9563b2"
},
{
"path": "examples/world.jGIS",
"chars": 2704,
"preview": "{\n \"layerTree\": [\n \"6e55cdae-35b0-4bff-9dd1-c8aa9563b2a6\",\n \"f80d0fa2-3e2b-4922-b7d5-fefd4b085259\"\n ],\n \"layers"
},
{
"path": "lerna.json",
"chars": 242,
"preview": "{\n \"npmClient\": \"jlpm\",\n \"version\": \"independent\",\n \"$schema\": \"node_modules/lerna/schemas/lerna-schema.json\",\n \"pac"
},
{
"path": "lite/environment.yml",
"chars": 496,
"preview": "name: xeus-python-kernel\nchannels:\n - https://prefix.dev/emscripten-forge-dev\n - conda-forge\ndependencies:\n - python="
},
{
"path": "lite/jupyter-lite.json",
"chars": 124,
"preview": "{\n \"jupyter-lite-schema-version\": 0,\n \"jupyter-config-data\": {\n \"spectaConfig\": {\n \"hideTopbar\": true\n }\n "
},
{
"path": "lite/jupyter_lite_config.json",
"chars": 219,
"preview": "{\n \"LiteBuildConfig\": {\n \"extra_file_types\": {\n \"jgis\": {\n \"name\": \"jgis\",\n \"extensions\": [\".jgis"
},
{
"path": "nx.json",
"chars": 550,
"preview": "{\n \"namedInputs\": {\n \"default\": [\"{projectRoot}/**/*\"]\n },\n \"targetDefaults\": {\n \"build\": {\n \"cache\": true"
},
{
"path": "package.json",
"chars": 2696,
"preview": "{\n \"name\": \"@jupytergis/jupytergis-root\",\n \"version\": \"0.15.0\",\n \"private\": true,\n \"homepage\": \"https://github.com/g"
},
{
"path": "packages/base/jest.config.js",
"chars": 42,
"preview": "module.exports = require('../jest.base');\n"
},
{
"path": "packages/base/package.json",
"chars": 4269,
"preview": "{\n \"name\": \"@jupytergis/base\",\n \"version\": \"0.15.0\",\n \"description\": \"A JupyterLab extension for 3D modelling.\",\n \"k"
},
{
"path": "packages/base/src/__tests__/migrations.spec.ts",
"chars": 1758,
"preview": "/**\n * Migration tests.\n *\n * Each version pair is tested against all fixture files that exist in both\n * test-fixtures/"
},
{
"path": "packages/base/src/commands/BaseCommandIDs.ts",
"chars": 3396,
"preview": "/* This file is not an exhaustive list of commands.\n *\n * See the documentation for more details.\n */\n// Toolbar\nexport "
},
{
"path": "packages/base/src/commands/index.ts",
"chars": 57496,
"preview": "import {\n IDict,\n IJGISFormSchemaRegistry,\n IJGISLayerBrowserRegistry,\n IJGISLayerGroup,\n IJGISLayerItem,\n IJupyte"
},
{
"path": "packages/base/src/commands/operationCommands.ts",
"chars": 10496,
"preview": "import { IJupyterGISModel, IJGISLayer, IJGISSource } from '@jupytergis/schema';\nimport { IRenderMime } from '@jupyterlab"
},
{
"path": "packages/base/src/constants.ts",
"chars": 2755,
"preview": "import { ProcessingCommandIDs } from '@jupytergis/schema';\nimport { LabIcon, redoIcon, undoIcon } from '@jupyterlab/ui-c"
},
{
"path": "packages/base/src/declaration.d.ts",
"chars": 176,
"preview": "declare module \"*.svg\" {\n const value: string; // @ts-ignore\n export default value;\n}\n\ndeclare module '*.png'{\n const"
},
{
"path": "packages/base/src/features/annotations/AnnotationsPanel.tsx",
"chars": 1385,
"preview": "import { IAnnotationModel, IJupyterGISModel } from '@jupytergis/schema';\nimport React, { Component } from 'react';\n\nimpo"
},
{
"path": "packages/base/src/features/annotations/components/Annotation.tsx",
"chars": 3103,
"preview": "import {\n faTrash,\n faPaperPlane,\n faArrowsToDot,\n} from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIco"
},
{
"path": "packages/base/src/features/annotations/components/AnnotationFloater.tsx",
"chars": 1743,
"preview": "import { faWindowMinimize } from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/reac"
},
{
"path": "packages/base/src/features/annotations/components/Message.tsx",
"chars": 1068,
"preview": "import { User } from '@jupyterlab/services';\nimport React from 'react';\n\ninterface IProps {\n /*\n * The message conten"
},
{
"path": "packages/base/src/features/annotations/index.ts",
"chars": 150,
"preview": "export * from './model';\nexport * from './components/Annotation';\nexport * from './components/AnnotationFloater';\nexport"
},
{
"path": "packages/base/src/features/annotations/model.ts",
"chars": 2609,
"preview": "import {\n IAnnotation,\n IAnnotationContent,\n IAnnotationModel,\n IJupyterGISModel,\n} from '@jupytergis/schema';\nimpor"
},
{
"path": "packages/base/src/features/console/consoleview.ts",
"chars": 2485,
"preview": "import { IEditorMimeTypeService } from '@jupyterlab/codeeditor';\nimport { ConsolePanel } from '@jupyterlab/console';\nimp"
},
{
"path": "packages/base/src/features/console/index.ts",
"chars": 31,
"preview": "export * from './consoleview';\n"
},
{
"path": "packages/base/src/features/filter/Filter.tsx",
"chars": 7832,
"preview": "import {\n GeoJSONFeature1,\n IDict,\n IJGISFilterItem,\n IJupyterGISModel,\n} from '@jupytergis/schema';\nimport { Button"
},
{
"path": "packages/base/src/features/filter/FilterRow.tsx",
"chars": 4476,
"preview": "import { faTrash } from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawe"
},
{
"path": "packages/base/src/features/identify/IdentifyPanel.tsx",
"chars": 5834,
"preview": "import { faMagnifyingGlass } from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/rea"
},
{
"path": "packages/base/src/features/layer-browser/index.tsx",
"chars": 9812,
"preview": "import { faCheck, faPlus } from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/react"
},
{
"path": "packages/base/src/features/layers/forms/layer/heatmapLayerForm.tsx",
"chars": 4303,
"preview": "import { IDict, IGeoJSONSource, IHeatmapLayer } from '@jupytergis/schema';\nimport { UiSchema } from '@rjsf/utils';\nimpor"
},
{
"path": "packages/base/src/features/layers/forms/layer/hillshadeLayerForm.tsx",
"chars": 2116,
"preview": "import { IDict } from '@jupytergis/schema';\nimport { UiSchema } from '@rjsf/utils';\nimport React, { useMemo } from 'reac"
},
{
"path": "packages/base/src/features/layers/forms/layer/index.ts",
"chars": 213,
"preview": "export * from './heatmapLayerForm';\nexport * from './hillshadeLayerForm';\nexport * from './layerform';\nexport * from './"
},
{
"path": "packages/base/src/features/layers/forms/layer/layerform.tsx",
"chars": 2666,
"preview": "/**\n * Base (default) layer form and props.\n * Used for RasterLayer and any layer type without a dedicated form.\n */\nimp"
},
{
"path": "packages/base/src/features/layers/forms/layer/storySegmentLayerForm.tsx",
"chars": 4630,
"preview": "import { IDict } from '@jupytergis/schema';\nimport { RegistryFieldsType, UiSchema } from '@rjsf/utils';\nimport React, { "
},
{
"path": "packages/base/src/features/layers/forms/layer/vectorlayerform.tsx",
"chars": 2190,
"preview": "import { IDict } from '@jupytergis/schema';\nimport { UiSchema } from '@rjsf/utils';\nimport React, { useMemo } from 'reac"
},
{
"path": "packages/base/src/features/layers/forms/layer/webGlLayerForm.tsx",
"chars": 2190,
"preview": "import { IDict } from '@jupytergis/schema';\nimport { UiSchema } from '@rjsf/utils';\nimport React, { useMemo } from 'reac"
},
{
"path": "packages/base/src/features/layers/forms/source/geojsonsource.tsx",
"chars": 4921,
"preview": "import { IDict } from '@jupytergis/schema';\nimport * as geojson from '@jupytergis/schema/src/schema/geojson.json';\nimpor"
},
{
"path": "packages/base/src/features/layers/forms/source/geopackagesource.tsx",
"chars": 3985,
"preview": "import { IDict } from '@jupytergis/schema';\nimport { showErrorMessage } from '@jupyterlab/apputils';\nimport { RJSFSchema"
},
{
"path": "packages/base/src/features/layers/forms/source/geotiffsource.tsx",
"chars": 5369,
"preview": "import { IDict } from '@jupytergis/schema';\nimport { showErrorMessage } from '@jupyterlab/apputils';\nimport { RJSFSchema"
},
{
"path": "packages/base/src/features/layers/forms/source/index.ts",
"chars": 234,
"preview": "export * from './geojsonsource';\nexport * from './geopackagesource';\nexport * from './geotiffsource';\nexport * from './p"
},
{
"path": "packages/base/src/features/layers/forms/source/pathbasedsource.tsx",
"chars": 3955,
"preview": "import { IDict } from '@jupytergis/schema';\nimport { showErrorMessage } from '@jupyterlab/apputils';\nimport { RJSFSchema"
},
{
"path": "packages/base/src/features/layers/forms/source/sourceform.tsx",
"chars": 2306,
"preview": "/**\n * Base (default) source form and props.\n * Used for RasterSource and any source type without a dedicated form.\n */\n"
},
{
"path": "packages/base/src/features/layers/forms/source/tilesourceform.tsx",
"chars": 2952,
"preview": "import { IDict } from '@jupytergis/schema';\nimport { UiSchema } from '@rjsf/utils';\nimport React, { useMemo } from 'reac"
},
{
"path": "packages/base/src/features/layers/forms/source/wmsTileSource.tsx",
"chars": 4203,
"preview": "import { IDict } from '@jupytergis/schema';\nimport { UiSchema } from '@rjsf/utils';\nimport React, { ReactElement, useEff"
},
{
"path": "packages/base/src/features/layers/layerCreationFormDialog.tsx",
"chars": 4920,
"preview": "import { IDict } from '@jupytergis/schema';\nimport { Dialog } from '@jupyterlab/apputils';\nimport { PromiseDelegate } fr"
},
{
"path": "packages/base/src/features/layers/symbology/__tests__/classificationModes.spec.ts",
"chars": 4804,
"preview": "// geotiff pulls in quick-lru (ESM-only); mock it since GeoTIFF classification\n// is not under test here.\njest.mock('geo"
},
{
"path": "packages/base/src/features/layers/symbology/__tests__/styleBuilder.spec.ts",
"chars": 3766,
"preview": "// Type-only OL imports — mock to avoid loading ESM packages.\njest.mock('ol/expr/expression', () => ({}));\njest.mock('ol"
},
{
"path": "packages/base/src/features/layers/symbology/classificationModes.ts",
"chars": 10874,
"preview": "// Adapted from https://github.com/qgis/QGIS/blob/master/src/core/classification/\n\nimport { Pool, fromUrl, TypedArray } "
},
{
"path": "packages/base/src/features/layers/symbology/colorRampUtils.ts",
"chars": 6996,
"preview": "import colormap from 'colormap';\nimport colorScale from 'colormap/colorScale.js';\nimport * as d3Chromatic from 'd3-scale"
},
{
"path": "packages/base/src/features/layers/symbology/components/color_ramp/ColorRampControls.tsx",
"chars": 5124,
"preview": "/**\n * @module ColorRampControls\n *\n * This component provides the main UI controls for classifying raster layers\n * usi"
},
{
"path": "packages/base/src/features/layers/symbology/components/color_ramp/ColorRampSelector.tsx",
"chars": 4058,
"preview": "/**\n * @module ColorRampSelector\n *\n * Dropdown component for selecting a color ramp.\n * - Displays the currently select"
},
{
"path": "packages/base/src/features/layers/symbology/components/color_ramp/ColorRampSelectorEntry.tsx",
"chars": 1527,
"preview": "/**\n * @module ColorRampSelectorEntry\n *\n * Represents a single selectable color ramp option in the `ColorRampSelector`."
},
{
"path": "packages/base/src/features/layers/symbology/components/color_ramp/ModeSelectRow.tsx",
"chars": 1789,
"preview": "import React from 'react';\n\nimport { ClassificationMode } from '@/src/types';\ninterface IModeSelectRowProps {\n numberOf"
},
{
"path": "packages/base/src/features/layers/symbology/components/color_ramp/RgbaColorPicker.tsx",
"chars": 4681,
"preview": "import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { RgbaColorPicker as ReactColorfulRgba }"
},
{
"path": "packages/base/src/features/layers/symbology/components/color_ramp/cmocean.json",
"chars": 7959,
"preview": "{\n \"__license__\": \"The MIT License (MIT) Copyright (c) 2015 Kristen M. Thyng Permission is hereby granted, free of char"
},
{
"path": "packages/base/src/features/layers/symbology/components/color_stops/StopContainer.tsx",
"chars": 1737,
"preview": "import { Button } from '@jupyterlab/ui-components';\nimport { UUID } from '@lumino/coreutils';\nimport React from 'react';"
},
{
"path": "packages/base/src/features/layers/symbology/components/color_stops/StopRow.tsx",
"chars": 2890,
"preview": "import { faTrash } from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawe"
},
{
"path": "packages/base/src/features/layers/symbology/hooks/useEffectiveSymbologyParams.ts",
"chars": 1636,
"preview": "import { IJGISLayer, IJupyterGISModel } from '@jupytergis/schema';\nimport { useMemo, useRef } from 'react';\n\nimport {\n "
},
{
"path": "packages/base/src/features/layers/symbology/hooks/useGetBandInfo.ts",
"chars": 2211,
"preview": "import { IJGISLayer, IJupyterGISModel } from '@jupytergis/schema';\nimport { fromUrl, fromBlob } from 'geotiff';\nimport {"
},
{
"path": "packages/base/src/features/layers/symbology/hooks/useGetProperties.ts",
"chars": 3149,
"preview": "// import { GeoJSONFeature } from 'geojson';\n\nimport { GeoJSONFeature1, IJupyterGISModel } from '@jupytergis/schema';\nim"
},
{
"path": "packages/base/src/features/layers/symbology/hooks/useGetSymbology.ts",
"chars": 1925,
"preview": "import { IJupyterGISModel } from '@jupytergis/schema';\nimport { useEffect, useState } from 'react';\n\ninterface IUseGetSy"
},
{
"path": "packages/base/src/features/layers/symbology/hooks/useOkSignal.ts",
"chars": 812,
"preview": "import { Signal } from '@lumino/signaling';\nimport { useCallback, useEffect, useRef } from 'react';\n\ntype OkSignalPromis"
},
{
"path": "packages/base/src/features/layers/symbology/styleBuilder.ts",
"chars": 18090,
"preview": "import { IVectorLayer } from '@jupytergis/schema';\nimport colormap from 'colormap';\nimport { ExpressionValue } from 'ol/"
},
{
"path": "packages/base/src/features/layers/symbology/symbologyDialog.tsx",
"chars": 4253,
"preview": "import { IJupyterGISModel } from '@jupytergis/schema';\nimport { Dialog } from '@jupyterlab/apputils';\nimport { IStateDB "
},
{
"path": "packages/base/src/features/layers/symbology/symbologyUtils.ts",
"chars": 5435,
"preview": "import {\n IJGISLayer,\n IJupyterGISModel,\n IVectorLayer,\n IWebGlLayer,\n} from '@jupytergis/schema';\nimport { UUID } f"
},
{
"path": "packages/base/src/features/layers/symbology/tiff_layer/TiffRendering.tsx",
"chars": 2432,
"preview": "import React, { useEffect, useState } from 'react';\n\nimport { ISymbologyDialogProps } from '@/src/features/layers/symbol"
},
{
"path": "packages/base/src/features/layers/symbology/tiff_layer/components/BandRow.tsx",
"chars": 4058,
"preview": "import React, { useState } from 'react';\n\nimport { IBandRow } from '@/src/features/layers/symbology/hooks/useGetBandInfo"
},
{
"path": "packages/base/src/features/layers/symbology/tiff_layer/types/MultibandColor.tsx",
"chars": 4973,
"preview": "import { IWebGlLayer } from '@jupytergis/schema';\nimport { ExpressionValue } from 'ol/expr/expression';\nimport React, { "
},
{
"path": "packages/base/src/features/layers/symbology/tiff_layer/types/SingleBandPseudoColor.tsx",
"chars": 14274,
"preview": "import { IWebGlLayer } from '@jupytergis/schema';\nimport { Button } from '@jupyterlab/ui-components';\nimport { ReadonlyJ"
},
{
"path": "packages/base/src/features/layers/symbology/vector_layer/VectorRendering.tsx",
"chars": 6769,
"preview": "import { LayerType } from '@jupytergis/schema';\nimport React, { useEffect, useState } from 'react';\n\nimport FilterCompon"
},
{
"path": "packages/base/src/features/layers/symbology/vector_layer/components/ValueSelect.tsx",
"chars": 975,
"preview": "import React from 'react';\n\ninterface IValueSelectProps {\n featureProperties: any;\n selectedValue: string;\n setSelect"
},
{
"path": "packages/base/src/features/layers/symbology/vector_layer/types/Canonical.tsx",
"chars": 5431,
"preview": "import { IVectorLayer } from '@jupytergis/schema';\nimport React, { useEffect, useState } from 'react';\n\nimport {\n color"
},
{
"path": "packages/base/src/features/layers/symbology/vector_layer/types/Categorized.tsx",
"chars": 13466,
"preview": "import { IVectorLayer } from '@jupytergis/schema';\nimport { ReadonlyJSONObject, UUID } from '@lumino/coreutils';\nimport "
},
{
"path": "packages/base/src/features/layers/symbology/vector_layer/types/Graduated.tsx",
"chars": 18402,
"preview": "import { IVectorLayer } from '@jupytergis/schema';\nimport { UUID } from '@lumino/coreutils';\nimport React, { useEffect, "
},
{
"path": "packages/base/src/features/layers/symbology/vector_layer/types/Heatmap.tsx",
"chars": 5086,
"preview": "import colormap from 'colormap';\nimport React, { useEffect, useState } from 'react';\n\nimport ColorRampSelector from '@/s"
},
{
"path": "packages/base/src/features/layers/symbology/vector_layer/types/SimpleSymbol.tsx",
"chars": 6498,
"preview": "import { IVectorLayer } from '@jupytergis/schema';\nimport React, { useEffect, useState } from 'react';\n\nimport {\n color"
},
{
"path": "packages/base/src/features/objectproperties/index.tsx",
"chars": 3360,
"preview": "import {\n IJGISFormSchemaRegistry,\n IJupyterGISClientState,\n IJupyterGISModel,\n} from '@jupytergis/schema';\nimport { "
},
{
"path": "packages/base/src/features/processing/ProcessingFormDialog.tsx",
"chars": 5244,
"preview": "import { ProcessingType, IDict, IJupyterGISModel } from '@jupytergis/schema';\nimport { Dialog } from '@jupyterlab/apputi"
},
{
"path": "packages/base/src/features/processing/forms/dissolveProcessForm.tsx",
"chars": 3432,
"preview": "import { IDict, IGeoJSONSource, IJupyterGISModel } from '@jupytergis/schema';\nimport { Dialog } from '@jupyterlab/apputi"
},
{
"path": "packages/base/src/features/processing/forms/processingForm.tsx",
"chars": 2160,
"preview": "/**\n * Used by ProcessingFormDialog when processingType is not 'Dissolve'.\n */\nimport { Dialog } from '@jupyterlab/apput"
},
{
"path": "packages/base/src/features/processing/index.ts",
"chars": 8264,
"preview": "import {\n IDict,\n IJGISLayer,\n IJGISSource,\n IJupyterGISModel,\n IJGISFormSchemaRegistry,\n LayerType,\n processingL"
},
{
"path": "packages/base/src/features/processing/processingCommands.ts",
"chars": 3187,
"preview": "import {\n IDict,\n IJGISFormSchemaRegistry,\n ProcessingMerge,\n ProcessingLogicType,\n ProcessingType,\n} from '@jupyte"
},
{
"path": "packages/base/src/features/processing/processingFormToParam.ts",
"chars": 690,
"preview": "import {\n ProcessingType,\n processingList,\n ProcessingMerge,\n IDict,\n} from '@jupytergis/schema';\n\nexport function p"
}
]
// ... and 351 more files (download for full content)
About this extraction
This page contains the full source code of the geojupyter/jupytergis GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 551 files (5.9 MB), approximately 1.6M tokens, and a symbol index with 1138 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.