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