jupytergis-lab 0.4.4__tar.gz → 0.4.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/PKG-INFO +2 -1
  2. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/__init__.py +1 -0
  3. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/_version.py +1 -1
  4. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/labextension/package.json +4 -4
  5. jupytergis_lab-0.4.5/jupytergis_lab/labextension/static/432.bb0ae93e813eefae7236.js +1 -0
  6. jupytergis_lab-0.4.5/jupytergis_lab/labextension/static/484.8ba570bf2020ec490e49.js +1 -0
  7. jupytergis_lab-0.4.5/jupytergis_lab/labextension/static/remoteEntry.4b4db2d5f1ccde6ba0de.js +1 -0
  8. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/labextension/static/third-party-licenses.json +2 -2
  9. jupytergis_lab-0.4.5/jupytergis_lab/notebook/explore.py +127 -0
  10. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/gis_document.py +54 -53
  11. {jupytergis_lab-0.4.4/jupytergis_lab/notebook/objects/_schema/export → jupytergis_lab-0.4.5/jupytergis_lab/notebook/objects/_schema}/__init__.py +1 -1
  12. {jupytergis_lab-0.4.4/jupytergis_lab/notebook/objects/_schema/processing → jupytergis_lab-0.4.5/jupytergis_lab/notebook/objects/_schema/export}/__init__.py +1 -1
  13. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/objects/_schema/export/exportGeojson.py +1 -1
  14. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/objects/_schema/export/exportGeotiff.py +1 -1
  15. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/objects/_schema/geojson.py +1 -1
  16. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/objects/_schema/geojsonsource.py +1 -1
  17. {jupytergis_lab-0.4.4/jupytergis_lab/notebook/objects/_schema/project → jupytergis_lab-0.4.5/jupytergis_lab/notebook/objects/_schema/processing}/__init__.py +1 -1
  18. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/objects/_schema/processing/buffer.py +1 -1
  19. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/objects/_schema/processing/dissolve.py +1 -1
  20. {jupytergis_lab-0.4.4/jupytergis_lab/notebook/objects/_schema → jupytergis_lab-0.4.5/jupytergis_lab/notebook/objects/_schema/project}/__init__.py +1 -1
  21. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/objects/_schema/project/jgis.py +1 -1
  22. jupytergis_lab-0.4.5/jupytergis_lab/notebook/objects/_schema/project/layers/__init__.py +3 -0
  23. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/objects/_schema/project/layers/heatmapLayer.py +1 -1
  24. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/objects/_schema/project/layers/hillshadeLayer.py +1 -1
  25. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/objects/_schema/project/layers/imageLayer.py +1 -1
  26. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/objects/_schema/project/layers/rasterlayer.py +1 -1
  27. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/objects/_schema/project/layers/vectorTileLayer.py +1 -1
  28. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/objects/_schema/project/layers/vectorlayer.py +1 -1
  29. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/objects/_schema/project/layers/webGlLayer.py +1 -1
  30. jupytergis_lab-0.4.5/jupytergis_lab/notebook/objects/_schema/project/sources/__init__.py +3 -0
  31. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/objects/_schema/project/sources/geoTiffSource.py +1 -1
  32. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/objects/_schema/project/sources/imageSource.py +1 -1
  33. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/objects/_schema/project/sources/rasterDemSource.py +1 -1
  34. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/objects/_schema/project/sources/rastersource.py +1 -1
  35. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/objects/_schema/project/sources/shapefileSource.py +1 -1
  36. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/objects/_schema/project/sources/vectortilesource.py +1 -1
  37. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/objects/_schema/project/sources/videoSource.py +1 -1
  38. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/tests/test_api.py +0 -11
  39. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/package.json +3 -3
  40. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/pyproject.toml +1 -0
  41. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/style/base.css +44 -5
  42. jupytergis_lab-0.4.5/tsconfig.tsbuildinfo +1 -0
  43. jupytergis_lab-0.4.4/jupytergis_lab/labextension/static/432.febf6149ed25e4ffd72b.js +0 -1
  44. jupytergis_lab-0.4.4/jupytergis_lab/labextension/static/484.1c6c90a0cb08445648d8.js +0 -1
  45. jupytergis_lab-0.4.4/jupytergis_lab/labextension/static/remoteEntry.34c2a234101e54e44f1f.js +0 -1
  46. jupytergis_lab-0.4.4/jupytergis_lab/notebook/objects/_schema/project/layers/__init__.py +0 -3
  47. jupytergis_lab-0.4.4/jupytergis_lab/notebook/objects/_schema/project/sources/__init__.py +0 -3
  48. jupytergis_lab-0.4.4/tsconfig.tsbuildinfo +0 -1
  49. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/.gitignore +0 -0
  50. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/.prettierignore +0 -0
  51. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/LICENSE +0 -0
  52. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/README.md +0 -0
  53. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/install.json +0 -0
  54. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/labextension/static/234.c2d7ed33ae9ca2244b0d.js +0 -0
  55. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/labextension/static/style.js +0 -0
  56. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/__init__.py +0 -0
  57. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/objects/__init__.py +0 -0
  58. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/tests/__init__.py +0 -0
  59. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/utils.py +0 -0
  60. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/jupytergis_lab/notebook/y_connector.py +0 -0
  61. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/lib/index.d.ts +0 -0
  62. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/lib/index.js +0 -0
  63. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/lib/notebookrenderer.d.ts +0 -0
  64. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/lib/notebookrenderer.js +0 -0
  65. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/scripts/bump-version.py +0 -0
  66. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/setup.py +0 -0
  67. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/src/index.ts +0 -0
  68. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/src/notebookrenderer.ts +0 -0
  69. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/style/index.css +0 -0
  70. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/style/index.js +0 -0
  71. {jupytergis_lab-0.4.4 → jupytergis_lab-0.4.5}/tsconfig.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jupytergis_lab
3
- Version: 0.4.4
3
+ Version: 0.4.5
4
4
  Dynamic: Keywords
5
5
  Summary: JupyterGIS Lab extension.
6
6
  Project-URL: Homepage, https://github.com/geojupyter/jupytergis
@@ -56,6 +56,7 @@ Requires-Dist: jupyter-ydoc<4,>=2
56
56
  Requires-Dist: jupytergis-core<1,>=0.1.0
57
57
  Requires-Dist: pydantic<3,>=2
58
58
  Requires-Dist: requests
59
+ Requires-Dist: sidecar>=0.7.0
59
60
  Requires-Dist: yjs-widgets<0.5,>=0.4
60
61
  Requires-Dist: ypywidgets<0.10.0,>=0.9.0
61
62
  Description-Content-Type: text/markdown
@@ -9,6 +9,7 @@ except ImportError:
9
9
  __version__ = "dev"
10
10
 
11
11
  from .notebook import GISDocument # noqa
12
+ from .notebook.explore import explore
12
13
 
13
14
 
14
15
  def _jupyter_labextension_paths():
@@ -1,4 +1,4 @@
1
1
  # This file is auto-generated by Hatchling. As such, do not:
2
2
  # - modify
3
3
  # - track in version control e.g. be sure to add to .gitignore
4
- __version__ = VERSION = '0.4.4'
4
+ __version__ = VERSION = '0.4.5'
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jupytergis/jupytergis-lab",
3
- "version": "0.4.4",
3
+ "version": "0.4.5",
4
4
  "description": "JupyterGIS Lab extension.",
5
5
  "keywords": [
6
6
  "jupyter",
@@ -53,8 +53,8 @@
53
53
  },
54
54
  "dependencies": {
55
55
  "@jupyter/collaborative-drive": "^3.0.0",
56
- "@jupytergis/base": "^0.4.4",
57
- "@jupytergis/schema": "^0.4.4",
56
+ "@jupytergis/base": "^0.4.5",
57
+ "@jupytergis/schema": "^0.4.5",
58
58
  "@jupyterlab/application": "^4.3.0",
59
59
  "@jupyterlab/apputils": "^4.3.0",
60
60
  "@jupyterlab/completer": "^4.3.0",
@@ -124,7 +124,7 @@
124
124
  }
125
125
  },
126
126
  "_build": {
127
- "load": "static/remoteEntry.34c2a234101e54e44f1f.js",
127
+ "load": "static/remoteEntry.4b4db2d5f1ccde6ba0de.js",
128
128
  "extension": "./extension",
129
129
  "style": "./style"
130
130
  }
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunk_jupytergis_jupytergis_lab=self.webpackChunk_jupytergis_jupytergis_lab||[]).push([[432],{4:(n,o,e)=>{e.d(o,{A:()=>l});var r=e(758),t=e.n(r),i=e(935),a=e.n(i)()(t());a.push([n.id,':root,\n:host {\n --ol-background-color: white;\n --ol-accent-background-color: #F5F5F5;\n --ol-subtle-background-color: rgba(128, 128, 128, 0.25);\n --ol-partial-background-color: rgba(255, 255, 255, 0.75);\n --ol-foreground-color: #333333;\n --ol-subtle-foreground-color: #666666;\n --ol-brand-color: #00AAFF;\n}\n\n.ol-box {\n box-sizing: border-box;\n border-radius: 2px;\n border: 1.5px solid var(--ol-background-color);\n background-color: var(--ol-partial-background-color);\n}\n\n.ol-mouse-position {\n top: 8px;\n right: 8px;\n position: absolute;\n}\n\n.ol-scale-line {\n background: var(--ol-partial-background-color);\n border-radius: 4px;\n bottom: 8px;\n left: 8px;\n padding: 2px;\n position: absolute;\n}\n\n.ol-scale-line-inner {\n border: 1px solid var(--ol-subtle-foreground-color);\n border-top: none;\n color: var(--ol-foreground-color);\n font-size: 10px;\n text-align: center;\n margin: 1px;\n will-change: contents, width;\n transition: all 0.25s;\n}\n\n.ol-scale-bar {\n position: absolute;\n bottom: 8px;\n left: 8px;\n}\n\n.ol-scale-bar-inner {\n display: flex;\n}\n\n.ol-scale-step-marker {\n width: 1px;\n height: 15px;\n background-color: var(--ol-foreground-color);\n float: right;\n z-index: 10;\n}\n\n.ol-scale-step-text {\n position: absolute;\n bottom: -5px;\n font-size: 10px;\n z-index: 11;\n color: var(--ol-foreground-color);\n text-shadow: -1.5px 0 var(--ol-partial-background-color), 0 1.5px var(--ol-partial-background-color), 1.5px 0 var(--ol-partial-background-color), 0 -1.5px var(--ol-partial-background-color);\n}\n\n.ol-scale-text {\n position: absolute;\n font-size: 12px;\n text-align: center;\n bottom: 25px;\n color: var(--ol-foreground-color);\n text-shadow: -1.5px 0 var(--ol-partial-background-color), 0 1.5px var(--ol-partial-background-color), 1.5px 0 var(--ol-partial-background-color), 0 -1.5px var(--ol-partial-background-color);\n}\n\n.ol-scale-singlebar {\n position: relative;\n height: 10px;\n z-index: 9;\n box-sizing: border-box;\n border: 1px solid var(--ol-foreground-color);\n}\n\n.ol-scale-singlebar-even {\n background-color: var(--ol-subtle-foreground-color);\n}\n\n.ol-scale-singlebar-odd {\n background-color: var(--ol-background-color);\n}\n\n.ol-unsupported {\n display: none;\n}\n\n.ol-viewport,\n.ol-unselectable {\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ol-viewport canvas {\n all: unset;\n overflow: hidden;\n}\n\n.ol-viewport {\n touch-action: pan-x pan-y;\n}\n\n.ol-selectable {\n -webkit-touch-callout: default;\n -webkit-user-select: text;\n -moz-user-select: text;\n user-select: text;\n}\n\n.ol-grabbing {\n cursor: -webkit-grabbing;\n cursor: -moz-grabbing;\n cursor: grabbing;\n}\n\n.ol-grab {\n cursor: move;\n cursor: -webkit-grab;\n cursor: -moz-grab;\n cursor: grab;\n}\n\n.ol-control {\n position: absolute;\n background-color: var(--ol-subtle-background-color);\n border-radius: 4px;\n}\n\n.ol-zoom {\n top: .5em;\n left: .5em;\n}\n\n.ol-rotate {\n top: .5em;\n right: .5em;\n transition: opacity .25s linear, visibility 0s linear;\n}\n\n.ol-rotate.ol-hidden {\n opacity: 0;\n visibility: hidden;\n transition: opacity .25s linear, visibility 0s linear .25s;\n}\n\n.ol-zoom-extent {\n top: 4.643em;\n left: .5em;\n}\n\n.ol-full-screen {\n right: .5em;\n top: .5em;\n}\n\n.ol-control button {\n display: block;\n margin: 1px;\n padding: 0;\n color: var(--ol-subtle-foreground-color);\n font-weight: bold;\n text-decoration: none;\n font-size: inherit;\n text-align: center;\n height: 1.375em;\n width: 1.375em;\n line-height: .4em;\n background-color: var(--ol-background-color);\n border: none;\n border-radius: 2px;\n}\n\n.ol-control button::-moz-focus-inner {\n border: none;\n padding: 0;\n}\n\n.ol-zoom-extent button {\n line-height: 1.4em;\n}\n\n.ol-compass {\n display: block;\n font-weight: normal;\n will-change: transform;\n}\n\n.ol-touch .ol-control button {\n font-size: 1.5em;\n}\n\n.ol-touch .ol-zoom-extent {\n top: 5.5em;\n}\n\n.ol-control button:hover,\n.ol-control button:focus {\n text-decoration: none;\n outline: 1px solid var(--ol-subtle-foreground-color);\n color: var(--ol-foreground-color);\n}\n\n.ol-zoom .ol-zoom-in {\n border-radius: 2px 2px 0 0;\n}\n\n.ol-zoom .ol-zoom-out {\n border-radius: 0 0 2px 2px;\n}\n\n.ol-attribution {\n text-align: right;\n bottom: .5em;\n right: .5em;\n max-width: calc(100% - 1.3em);\n display: flex;\n flex-flow: row-reverse;\n align-items: center;\n}\n\n.ol-attribution a {\n color: var(--ol-subtle-foreground-color);\n text-decoration: none;\n}\n\n.ol-attribution ul {\n margin: 0;\n padding: 1px .5em;\n color: var(--ol-foreground-color);\n text-shadow: 0 0 2px var(--ol-background-color);\n font-size: 12px;\n}\n\n.ol-attribution li {\n display: inline;\n list-style: none;\n}\n\n.ol-attribution li:not(:last-child):after {\n content: " ";\n}\n\n.ol-attribution img {\n max-height: 2em;\n max-width: inherit;\n vertical-align: middle;\n}\n\n.ol-attribution button {\n flex-shrink: 0;\n}\n\n.ol-attribution.ol-collapsed ul {\n display: none;\n}\n\n.ol-attribution:not(.ol-collapsed) {\n background: var(--ol-partial-background-color);\n}\n\n.ol-attribution.ol-uncollapsible {\n bottom: 0;\n right: 0;\n border-radius: 4px 0 0;\n}\n\n.ol-attribution.ol-uncollapsible img {\n margin-top: -.2em;\n max-height: 1.6em;\n}\n\n.ol-attribution.ol-uncollapsible button {\n display: none;\n}\n\n.ol-zoomslider {\n top: 4.5em;\n left: .5em;\n height: 200px;\n}\n\n.ol-zoomslider button {\n position: relative;\n height: 10px;\n}\n\n.ol-touch .ol-zoomslider {\n top: 5.5em;\n}\n\n.ol-overviewmap {\n left: 0.5em;\n bottom: 0.5em;\n}\n\n.ol-overviewmap.ol-uncollapsible {\n bottom: 0;\n left: 0;\n border-radius: 0 4px 0 0;\n}\n\n.ol-overviewmap .ol-overviewmap-map,\n.ol-overviewmap button {\n display: block;\n}\n\n.ol-overviewmap .ol-overviewmap-map {\n border: 1px solid var(--ol-subtle-foreground-color);\n height: 150px;\n width: 150px;\n}\n\n.ol-overviewmap:not(.ol-collapsed) button {\n bottom: 0;\n left: 0;\n position: absolute;\n}\n\n.ol-overviewmap.ol-collapsed .ol-overviewmap-map,\n.ol-overviewmap.ol-uncollapsible button {\n display: none;\n}\n\n.ol-overviewmap:not(.ol-collapsed) {\n background: var(--ol-subtle-background-color);\n}\n\n.ol-overviewmap-box {\n border: 1.5px dotted var(--ol-subtle-foreground-color);\n}\n\n.ol-overviewmap .ol-overviewmap-box:hover {\n cursor: move;\n}\n\n.ol-overviewmap .ol-viewport:hover {\n cursor: pointer;\n}\n',""]);const l=a},51:n=>{n.exports=function(n){var o=document.createElement("style");return n.setAttributes(o,n.attributes),n.insert(o,n.options),o}},62:n=>{n.exports=function(n,o){return o||(o={}),n?(n=String(n.__esModule?n.default:n),/^['"].*['"]$/.test(n)&&(n=n.slice(1,-1)),o.hash&&(n+=o.hash),/["'() \t\n]|(%20)/.test(n)||o.needQuotes?'"'.concat(n.replace(/"/g,'\\"').replace(/\n/g,"\\n"),'"'):n):n}},79:(n,o,e)=>{e.d(o,{A:()=>m});var r=e(758),t=e.n(r),i=e(935),a=e.n(i),l=e(564),p=e(365),s=e(633),d=e(606),c=e(781),g=e(367),u=e(301),b=e(4),f=a()(t());f.i(l.A),f.i(p.A),f.i(s.A),f.i(d.A),f.i(c.A),f.i(g.A),f.i(u.A),f.i(b.A),f.push([n.id,"/* -----------------------------------------------------------------------------\n| Copyright (c) Jupyter Development Team.\n| Distributed under the terms of the Modified BSD License.\n|---------------------------------------------------------------------------- */\n\n.jGIS-Toolbar-GroupName {\n font-size: var(--jp-ui-font-size0);\n padding-left: 3px;\n}\n\n/* Overwrite forms CSS */\n.jGIS-property-panel .array-item-list {\n display: flex;\n gap: 1rem;\n}\n\n.jGIS-property-panel .rjsf .array-item:not(:last-child) {\n border-bottom: none;\n margin-bottom: unset;\n padding-bottom: unset;\n}\n\n.jGIS-property-panel .rjsf .array-item {\n flex: 1 0 0%;\n align-items: center;\n}\n\n.jGIS-property-panel .rjsf fieldset fieldset {\n padding-left: unset;\n border-left: none;\n}\n\n.jGIS-property-panel .rjsf .array-item-list:has(.field-array) {\n flex-direction: column;\n}\n\n.jp-gis-text-label {\n margin: 0;\n padding: 0;\n font-weight: bold;\n display: block;\n position: relative;\n}\n\n/*This is being upstreamed. Will remove once upstream's been fixed.*/\nbutton.jp-mod-styled.jp-mod-accept {\n background-color: var(--jp-brand-color1) !important;\n}\n\nbutton.jp-mod-styled.jp-mod-reject {\n background-color: var(--jp-layout-color4) !important;\n}\n",""]);const m=f},128:n=>{var o={};n.exports=function(n,e){var r=function(n){if(void 0===o[n]){var e=document.querySelector(n);if(window.HTMLIFrameElement&&e instanceof window.HTMLIFrameElement)try{e=e.contentDocument.head}catch(n){e=null}o[n]=e}return o[n]}(n);if(!r)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");r.appendChild(e)}},248:n=>{n.exports="data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2716%27 viewBox=%270 0 20 20%27%3e %3cg class=%27jp-icon3%27 fill=%27%23616161%27 shape-rendering=%27geometricPrecision%27%3e %3cpolygon class=%27st1%27 points=%279.9%2c13.6 3.6%2c7.4 4.4%2c6.6 9.9%2c12.2 15.4%2c6.7 16.1%2c7.4 %27/%3e %3c/g%3e %3c/svg%3e"},296:(n,o,e)=>{e.d(o,{A:()=>u});var r=e(758),t=e.n(r),i=e(935),a=e.n(i),l=e(997),p=e(62),s=e.n(p),d=new URL(e(248),e.b),c=a()(t());c.i(l.A);var g=s()(d);c.push([n.id,`.jGIS-Spinner {\n position: absolute;\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 10;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n outline: none;\n background: #00000075;\n}\n\n.jGIS-SpinnerContent {\n border: solid #f376269e;\n margin: 50px auto;\n text-indent: -9999em;\n width: 6em;\n height: 6em;\n border-radius: 50%;\n position: relative;\n animation:\n load3 1s infinite linear,\n fadeIn 1s;\n}\n\n.jGIS-SpinnerContent:before {\n width: 50%;\n height: 50%;\n background: #f3762605;\n border-radius: 100% 0 100% 0;\n box-shadow: inset 6px 5px 0 1px #f37626;\n position: absolute;\n top: 0;\n left: 0;\n content: '';\n}\n\n.jGIS-SpinnerContent:after {\n width: 75%;\n height: 75%;\n border-radius: 50%;\n content: '';\n margin: auto;\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n}\n\n.jGIS-camera-client {\n width: 15px;\n height: 15px;\n position: absolute;\n z-index: 10;\n background-color: var(--jp-private-notebook-active-color);\n border-radius: 50%;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.jGIS-control-panel {\n color: var(--jp-ui-font-color1);\n background: var(--jp-layout-color1);\n height: 100%;\n}\n\n.jGIS-control-panel * {\n font-family: var(--jp-ui-font-family);\n}\n\n.jGIS-control-panel-title {\n border-bottom: solid var(--jp-border-width) var(--jp-border-color1);\n box-shadow: var(--jp-toolbar-box-shadow);\n display: flex;\n flex-direction: row;\n align-items: center;\n min-height: 24px;\n height: var(--jp-debugger-header-height);\n background-color: var(--jp-layout-color2);\n}\n\n.jGIS-control-panel-title h2 {\n text-transform: uppercase;\n font-weight: 600;\n font-size: var(--jp-ui-font-size0);\n color: var(--jp-ui-font-color1);\n padding-left: 8px;\n padding-right: 4px;\n}\n\n.jGIS-sidepanel-widget {\n overflow: auto;\n height: 100%;\n}\n\n.jGIS-sidebar-treepanel {\n display: flex;\n flex-direction: column;\n min-height: 50px;\n padding-top: 3px;\n}\n\n.jGIS-sidebar-propertiespanel {\n display: flex;\n flex-direction: column;\n min-height: 50px;\n padding-top: 3px;\n}\n\n.jGIS-treeview-wrapper {\n overflow: auto;\n height: 100%;\n}\n\n.jGIS-treeview-wrapper > div {\n padding: 0 !important;\n}\n/* TODO: More robust selector */\n.jGIS-treeview-wrapper div[style*='align-items: center;']:first-of-type {\n flex-grow: 1;\n}\n\n.jGIS-control-panel-tree {\n flex-grow: 1;\n}\n\n.jGIS-sidebar-propertiespanel > div {\n overflow: auto;\n}\n\n.jGIS-property-outer {\n padding: 10px;\n flex-grow: 1;\n overflow: auto;\n}\n\n.jGIS-property-buttons {\n display: flex;\n justify-content: end;\n padding: 10px;\n}\n\n.jGIS-property-panel {\n display: flex;\n flex-flow: column;\n height: 100%;\n overflow: hidden;\n}\n\n.jGIS-hidden-field {\n display: none;\n}\n\ndiv.field.field-array > label + span {\n display: none;\n}\n\n.jGIS-layer-CreationFormDialog .jp-Dialog-content {\n width: 60%;\n}\n\n.jGIS-layer-CreationFormDialog form {\n padding: 10px;\n}\n\n/* TODO Upstream this to jupyterlab jrfs */\n.jGIS-property-panel .rjsf .control-label,\n.jGIS-property-panel .rjsf legend {\n position: inherit;\n text-transform: capitalize;\n}\n\ndiv.jGIS-toolbar-widget > div.jp-Toolbar-item:last-child {\n flex-grow: 1;\n}\n\n.jGIS-toolbar-usertoolbar {\n flex-grow: 1;\n display: flex;\n flex-direction: row-reverse;\n}\n.jGIS-toolbar-react-widget {\n display: flex;\n flex-direction: row;\n align-items: center;\n flex-grow: 1;\n}\n\n.jGIS-Toolbar-Separator {\n min-height: 25px;\n width: var(--jp-border-width);\n background-color: var(--jp-border-color1);\n padding-left: 0px !important;\n padding-right: 0px !important;\n}\n\n.jGIS-toolbar-usertoolbar .jp-MenuBar-anonymousIcon,\n.jGIS-toolbar-usertoolbar .jp-MenuBar-imageIcon {\n position: unset !important;\n margin-right: 2px;\n height: 22px;\n box-sizing: border-box;\n}\n\n.jGIS-toolbar-usertoolbar .jp-MenuBar-anonymousIcon.selected,\n.jGIS-toolbar-usertoolbar .jp-MenuBar-imageIcon.selected {\n border: solid 1.5px red;\n}\n\n.jGIS-Mainview-Container {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.jGIS-Mainview {\n width: 100%;\n box-sizing: border-box;\n flex: 1;\n}\n\n.jGIS-Popup-Wrapper {\n position: absolute;\n opacity: 1;\n transition: opacity 0.1s linear 0.15s;\n}\n\n.jGIS-Annotation {\n z-index: 1;\n margin-left: 1px;\n margin-top: 1px;\n padding: 1em;\n color: var(--jp-ui-font-color0);\n background: var(--jp-layout-color1);\n border-radius: 0.5em;\n font-size: 12px;\n line-height: 1.2;\n transition: opacity 0.5s;\n}\n\n.jGIS-FloatingAnnotation {\n position: absolute;\n width: 250px;\n box-shadow: var(--jp-elevation-z6);\n z-index: 40;\n max-height: 400px;\n overflow: auto;\n}\n\n.jGIS-Annotation-Card {\n max-height: 400px;\n overflow: auto;\n}\n\n.jGIS-Annotations-Separator {\n border-color: var(--jp-layout-color4);\n border-style: solid;\n border-width: 1px;\n}\n\n.jGIS-Annotation-Handler {\n position: absolute;\n top: -5px;\n left: -5px;\n width: 8px;\n height: 8px;\n border: 1px solid #ffffffc2;\n border-radius: 50%;\n background: rgb(0 0 0 / 63%);\n cursor: pointer;\n transition-property: width, height, left, top;\n transition-duration: 0.2s;\n z-index: 20;\n}\n\n.jGIS-Annotation-Handler:hover {\n top: -9px;\n left: -9px;\n width: 16px;\n height: 16px;\n}\n\n.jGIS-Annotation-Message {\n display: flex;\n margin-top: 10px;\n gap: 5px;\n align-items: center;\n justify-content: center;\n}\n\n.jGIS-Annotation-Message .jGIS-Annotation-User-Icon {\n border-radius: 100%;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n vertical-align: middle;\n color: var(--jp-ui-font-color1);\n}\n\n.jGIS-Annotation-Message textarea {\n border-radius: var(--jp-border-radius);\n background: var(--jp-layout-color2);\n color: var(--jp-ui-font-color2);\n flex-grow: 1;\n resize: none;\n border: none;\n padding: 0.5em;\n outline: thin solid var(--jp-border-color0);\n}\n\n.jGIS-Annotation-Message-Content {\n background: var(--jp-layout-color2);\n color: var(--jp-ui-font-color2);\n border-radius: var(--jp-border-radius);\n flex-grow: 1;\n}\n\n.jGIS-Popup-Topbar {\n display: flex;\n flex-direction: row-reverse;\n}\n\n.jGIS-Popup-TopBarIcon {\n cursor: pointer;\n transform: rotate(180deg);\n}\n\n.jGIS-Annotation-Submit > svg {\n width: 30px;\n height: 30px;\n}\n\n.jGIS-Annotation-Submit g {\n fill: #f6f7f8 !important;\n}\n\n.jGIS-Annotation-Submit:hover {\n opacity: 70%;\n cursor: pointer;\n}\n\n.jGIS-Annotation-Submit {\n background-color: var(--jp-brand-color1);\n border-radius: 100%;\n width: 30px;\n height: 30px;\n}\n\n.jGIS-Annotation-Buttons {\n display: flex;\n justify-content: space-around;\n padding-top: 1em;\n}\n\n.jGIS-Annotation-Buttons > button {\n border-radius: var(--jp-border-radius);\n flex-grow: 1;\n max-width: 68px;\n}\n\n.jGIS-Remote-Pointer {\n position: absolute;\n transition-property: left, top, width, height;\n transition-duration: 150ms;\n transition-timing-function: ease;\n z-index: 20;\n}\n\n.jGIS-Remote-Pointer-Icon:hover {\n scale: 1.3;\n}\n\n.jGIS-Floating-Pointer-Popup {\n position: absolute;\n width: 160px;\n box-shadow: var(--jp-elevation-z6);\n z-index: 40;\n max-height: 400px;\n overflow: auto;\n}\n\n.jGIS-Remote-Pointer-Popup {\n margin-left: 7px;\n margin-top: 14px;\n color: #fff;\n padding: 1em;\n border-radius: 0.5em;\n font-size: 12px;\n line-height: 1.2;\n}\n\n.jGIS-Remote-Pointer-Popup-Name {\n font-size: 16px;\n color: #333;\n}\n\n.jGIS-Remote-Pointer-Popup-Coordinates {\n font-size: 14px;\n}\n\n/* Hack to remove the malformed form button */\n.object-property-expand {\n display: none;\n}\n\n.highlight {\n background-color: var(--jp-layout-color2) !important;\n}\n.jupytergis-notebook-widget {\n height: 600px;\n width: 100%;\n}\n\n/* Support output views, created with "Create new view for cell output" context menu */\n.jp-LinkedOutputView .jp-OutputArea-child:only-child {\n /* NOTE: This will eventually be supported directly in JupyterLab\n * (https://github.com/jupyterlab/jupyterlab/pull/17487), but we should keep\n * it around for a while for backwards compatibility. */\n height: 100%;\n}\n.jp-LinkedOutputView .jupytergis-notebook-widget {\n height: 100%;\n}\n\n.jupytergis-notebook-widget > div {\n height: 100%;\n width: 100%;\n}\n\n.jGIS-property-panel .rjsf .control-label,\n.jGIS-property-panel .rjsf legend {\n width: 100%;\n}\n\n.jpgis-console {\n border-top: var(--jp-border-width) solid var(--jp-toolbar-border-color);\n}\n\n.jpgis-console .jp-CodeConsole-banner {\n display: none;\n}\n\n/* FormComponent CSS */\n.jGIS-property-panel .rjsf {\n color: var(--jp-ui-font-color1);\n}\n\n.jGIS-property-panel .rjsf > form {\n padding: var(--jp-ui-font-size1);\n}\n\n.jGIS-property-panel .rjsf fieldset {\n border: 0;\n margin: 0;\n padding: 0;\n}\n\n.jGIS-property-panel .rjsf button[type='submit'] {\n display: none;\n}\n\n.jGIS-property-panel .rjsf .control-label,\n.jGIS-property-panel .rjsf legend {\n margin: 0;\n padding: 0;\n font-weight: bold;\n position: relative;\n width: 100%;\n}\n\n.jGIS-property-panel .rjsf legend > :first-child,\n.jGIS-property-panel .rjsf .control-label > :first-child {\n margin-top: 0;\n padding-top: 0;\n}\n\n.jGIS-property-panel .rjsf .form-group .form-group {\n margin-bottom: var(--jp-ui-font-size1);\n}\n\n.jGIS-property-panel .rjsf .form-group:last-child {\n margin-bottom: 0;\n}\n\n.jGIS-property-panel .rjsf .jp-FormGroup-description,\n.jGIS-property-panel .rjsf .field-description,\n.jGIS-property-panel .rjsf .help-block {\n color: var(--jp-ui-font-color2);\n margin-top: 2px;\n margin-bottom: 2px;\n}\n\n.jGIS-property-panel\n .jp-FormGroup-content\n fieldset\n .jp-inputFieldWrapper\n > input {\n box-sizing: border-box;\n border: var(--jp-border-width) solid var(--jp-border-color1);\n background-color: var(--jp-layout-color0);\n color: var(--jp-ui-font-color0);\n font-size: var(--jp-ui-font-size2);\n min-width: 0;\n outline: none !important;\n padding: 2px 7px;\n width: 100%;\n max-width: 100%;\n}\n\n.jGIS-property-panel\n .jp-FormGroup-content\n fieldset\n .jp-inputFieldWrapper\n > input#root_Color,\n.jGIS-property-panel\n .jp-FormGroup-content\n fieldset\n .jp-inputFieldWrapper\n > input#root_shadowColor {\n height: revert;\n}\n\n.jGIS-property-panel .jp-FormGroup-contentNormal {\n display: flex;\n flex-direction: column;\n align-items: inherit;\n}\n\n.jGIS-property-panel .jp-FormGroup-contentNormal .jp-FormGroup-fieldLabel {\n font-weight: bold;\n order: 1;\n margin-top: 2px;\n margin-bottom: 2px;\n text-transform: capitalize;\n}\n\n.jGIS-property-panel\n .jp-FormGroup-content\n .jp-FormGroup-contentNormal\n .jp-FormGroup-description,\n.jGIS-property-panel .field-description {\n order: 2;\n color: var(--jp-ui-font-color2);\n}\n\n.jGIS-property-panel .jp-FormGroup-content .jp-inputFieldWrapper {\n order: 3;\n}\n\n.jGIS-property-panel .jp-FormGroup-contentNormal .validationErrors,\n.jGIS-property-panel .jp-FormGroup-contentNormal .validationErrors ul {\n order: 4;\n list-style: none;\n color: var(--jp-warn-color0);\n margin: 0;\n padding: 0;\n}\n\n.jGIS-property-panel .jp-objectFieldWrapper,\n.jGIS-property-panel .jp-arrayFieldWrapper {\n padding-left: var(--jp-notebook-padding);\n border-left: solid 4px var(--jp-border-color3);\n}\n\n.jGIS-property-panel .array-item {\n border: none;\n}\n\n.jGIS-property-panel\n .jp-FormGroup-content\n .jp-FormGroup-contentNormal\n .jp-arrayFieldWrapper\n + .jp-FormGroup-description {\n display: none;\n}\n\n.jGIS-property-panel .rjsf .errors {\n color: var(--jp-warn-color0);\n}\n\n.jGIS-property-panel .rjsf .errors ul,\n.jGIS-property-panel .rjsf .validationErrors ul,\n.jGIS-property-panel .rjsf .validationErrors li,\n.jGIS-property-panel .rjsf .errors li {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.jGIS-property-panel .rjsf .jp-ArrayOperationsButton {\n display: none;\n}\n\n/* Hide additional property fields with remove buttons that should not be displayed in the form */\n.jGIS-property-panel\n .form-group:has(.jp-FormGroup-removeButton):not(:has(.jp-root)) {\n display: none;\n}\n\n.jGIS-property-panel .jp-arrayFieldWrapper .array-item legend,\n.jGIS-property-panel\n .jp-arrayFieldWrapper\n .field-array-of-array\n .field-array-of-number\n legend,\n.jGIS-property-panel\n .jp-arrayFieldWrapper\n .field-array-of-array\n .field-array-of-number\n .jp-FormGroup-fieldLabel {\n display: none;\n}\n.jGIS-property-panel\n .jp-arrayFieldWrapper\n .field-array-of-array\n .array-item\n .form-group\n .field-array-of-number {\n display: flex;\n}\n\n.jGIS-property-panel\n .jp-arrayFieldWrapper\n .field-array-of-array\n .array-item\n .form-group\n .field-array-of-number\n > div:nth-child(1) {\n order: 2;\n}\n\n.jGIS-property-panel\n .jp-arrayFieldWrapper\n .field-array-of-array\n .array-item\n .form-group\n .field-array-of-number\n > div:nth-child(2) {\n order: 1;\n}\n\n.jGIS-property-panel .required {\n font-size: var(--jp-ui-font-size3);\n color: var(--jp-warn-color1);\n font-weight: 800;\n position: absolute;\n top: 0;\n right: 0;\n display: block;\n}\n\n.jGIS-property-panel\n .jp-FormGroup-content\n fieldset\n .jp-inputFieldWrapper\n select {\n width: 100%;\n font-size: var(--jp-ui-font-size1);\n background: var(--jp-input-background);\n color: var(--jp-ui-font-color0);\n padding: calc(var(--jp-ui-font-size1) / 2);\n padding-right: var(--jp-ui-font-size3);\n background-image: url(${g});\n background-repeat: no-repeat;\n background-position: 99% center;\n background-size: 18px;\n border: var(--jp-border-width) solid var(--jp-input-border-color);\n border-radius: 0;\n outline: none;\n appearance: none;\n}\n\n.jGIS-property-panel .jp-select-wrapper select {\n background-image: unset !important;\n}\n\n.lm-TabBar-tabIcon .jgis-main-logo[fill] {\n fill: var(--jp-inverse-layout-color3);\n}\n\n.jGIS-identify-tool {\n cursor: crosshair;\n}\n\n.jgis-identify-grid-item {\n display: grid;\n grid-template-columns: 1fr 1fr;\n grid-template-rows: auto auto;\n position: relative;\n gap: 1px;\n}\n\n.jgis-identify-grid-item-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n grid-column: span 2;\n font-weight: bold;\n font-size: var(--jp-ui-font-size1);\n padding: 2px 0;\n cursor: pointer;\n margin: 0 5px;\n line-height: 25px;\n}\n\n.jgis-identify-grid-item:not(:last-of-type)::after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n width: 90%;\n border-bottom: 1px solid var(--jp-border-color0);\n}\n\n.jgis-identify-grid-body {\n display: contents;\n}\n\n.jgis-identify-grid-body span a:link {\n color: var(--jp-content-link-color);\n cursor: pointer;\n text-decoration: underline;\n}\n\n.jgis-identify-grid-body span a:visited {\n color: var(--jp-content-link-visited-color);\n cursor: pointer;\n text-decoration: underline;\n}\n\n.jgis-identify-grid-body strong {\n grid-column: 1;\n text-transform: capitalize;\n margin-left: 21px;\n}\n\n.jgis-identify-grid-body span {\n grid-column: 2;\n}\n\n.jgis-identify-grid-body:last-of-type strong:last-of-type {\n padding-bottom: 8px;\n}\n\n.jgis-scrollable {\n overflow: auto;\n height: 100%;\n}\n\n/* Style the file path text */\n.file-container {\n display: flex;\n align-items: center;\n margin-bottom: 16px;\n gap: 10px;\n}\n\n.jgis-highlight-button {\n background: none;\n border: none;\n cursor: pointer;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n min-height: 28px;\n}\n\n.jgis-highlight-button:hover {\n color: var(--jp-brand-color1);\n}\n\n.jgis-highlight-button:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n pointer-events: auto;\n}\n`,""]);const u=c},301:(n,o,e)=>{e.d(o,{A:()=>l});var r=e(758),t=e.n(r),i=e(935),a=e.n(i)()(t());a.push([n.id,".jp-gis-temporal-slider-container {\n display: flex;\n flex-direction: column;\n gap: 0.2rem;\n padding: 0.5rem;\n background-color: var(--jp-layout-color1);\n border-bottom: 1px solid var(--jp-border-color1);\n}\n\n.jp-gis-temporal-slider-container span,\n.jp-gis-temporal-slider-container label {\n font-weight: bold;\n}\n\n.jp-gis-temporal-slider-row {\n display: flex;\n gap: 0.25rem;\n justify-content: space-between;\n align-items: center;\n}\n\n.jp-gis-temporal-slider-controls {\n display: flex;\n flex-grow: 1;\n justify-content: space-around;\n}\n\n.jp-gis-temporal-slider-sub-controls {\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 0.25rem;\n}\n\n.jp-gis-temporal-slider-sub-controls > input {\n width: 35px;\n}\n\nselect,\nselect option {\n text-transform: capitalize;\n}\n\n.jp-gis-temporal-slider {\n flex: 1 0 40%;\n min-width: 300px;\n}\n",""]);const l=a},365:(n,o,e)=>{e.d(o,{A:()=>l});var r=e(758),t=e.n(r),i=e(935),a=e.n(i)()(t());a.push([n.id,".jGIS-layerbrowser-FormDialog .jp-Dialog-header {\n padding: 0;\n}\n\n.jGIS-layerbrowser-FormDialog .jp-Dialog-content {\n width: calc(100% - 4rem);\n max-width: 100%;\n height: calc(100% - 2rem);\n max-height: 100%;\n}\n\n.jGIS-layerbrowser-FormDialog form {\n padding: 10px;\n}\n\n.jGIS-customlayer-form {\n height: 100%;\n overflow: auto;\n}\n\n.jGIS-layer-browser-container * {\n box-sizing: border-box;\n}\n\n.jGIS-layer-browser-container {\n display: flex;\n flex-direction: column;\n}\n\n.jGIS-layer-browser-header-container {\n position: sticky;\n top: 0;\n z-index: 40;\n background-color: var(--jp-layout-color1);\n}\n\n.jGIS-layer-browser-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 20px;\n padding: 1rem 2rem;\n}\n\n.jGIS-layer-browser-header-text {\n padding-right: 1rem;\n font-weight: bold;\n}\n\n.jGIS-layer-browser-header-search-container {\n display: flex;\n align-items: center;\n flex-grow: 1;\n position: relative;\n}\n\n.jGIS-layer-browser-header-search-icon {\n position: absolute;\n top: 50%;\n left: 0.75rem;\n transform: translateY(-50%);\n}\n\n.jGIS-layer-browser-header-search {\n box-shadow: none;\n flex: 1 1 0%;\n height: 40px;\n padding: 1rem 2rem;\n padding-left: 2.5rem;\n background-color: transparent;\n border: 1px solid var(--jp-border-color1);\n border-radius: 8px;\n color: var(--jp-ui-font-color1);\n}\n\n.jGIS-layer-browser-grid {\n display: grid;\n gap: 1.25rem;\n grid-template-rows: 1fr;\n grid-template-columns: repeat(3, minmax(0px, 1fr));\n padding: 1rem 2rem;\n}\n\n@media (min-width: 1400px) {\n .jGIS-layer-browser-grid {\n grid-template-columns: repeat(5, minmax(0px, 1fr));\n }\n}\n\n.jGIS-layer-browser-categories {\n display: flex;\n gap: 2rem;\n padding: 0 2rem;\n border-bottom: 2px solid var(--jp-border-color1);\n}\n\n.jGIS-layer-browser-category {\n position: relative;\n opacity: 0.7;\n padding: 4px 0 14px;\n cursor: pointer;\n text-decoration: none;\n}\n\n.jGIS-layer-browser-category::after {\n content: '';\n position: absolute;\n bottom: -2px;\n left: 0;\n width: 0px;\n height: 3px;\n transition:\n background-color 300ms ease-in,\n width 300ms ease-in,\n opacity 300ms ease-in;\n background-color: transparent;\n}\n\n.jGIS-layer-browser-category.jGIS-layer-browser-category-selected::after {\n width: 100%;\n background-color: var(--jp-inverse-layout-color2);\n}\n\n.jGIS-layer-browser-category.jGIS-layer-browser-category-selected {\n opacity: 1;\n font-weight: bold;\n}\n\n.jGIS-layer-browser-tile {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n position: relative;\n margin-top: 4px;\n padding: 8px;\n transition: transform 150ms ease-out;\n cursor: pointer;\n border: 1px solid var(--jp-border-color1);\n background-color: var(--jp-layout-color1);\n border-radius: 8px;\n}\n\n.jGIS-layer-browser-custom-tile {\n border: 1px solid var(--jp-border-color2);\n background-color: var(--jp-layout-color2);\n}\n\n.jGIS-layer-browser-tile:hover {\n box-shadow: var(--jp-layout-color2);\n transform: translateY(-4px);\n background-color: var(--jp-brand-color2);\n}\n\n.jGIS-layer-browser-tile-img-container {\n /* isolation: isolate; */\n /* border: medium; */\n /* background: transparent; */\n /* padding: 0px; */\n /* width: 100%; */\n aspect-ratio: 16 / 10;\n display: flex;\n justify-content: center;\n align-items: center;\n position: relative;\n overflow: hidden;\n border-radius: 8px;\n}\n\n.jGIS-layer-browser-img {\n /* position: absolute; */\n /* height: 100%; */\n /* object-fit: cover; */\n /* box-sizing: border-box; */\n width: 100%;\n}\n\n.jGIS-layer-browser-icon {\n padding-inline: 8px;\n display: inline-flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n overflow: hidden;\n box-sizing: border-box;\n width: 32px;\n height: 32px;\n transition:\n width 125ms ease-in-out,\n background-color 125ms ease-in-out,\n opacity 150ms ease-out;\n background-color: var(--jp-accent-color1);\n border-radius: 20px;\n}\n\n.jGIS-layer-browser-tile:not(.jGIS-layer-browser-tile:hover)\n .jGIS-layer-browser-icon {\n opacity: 0;\n}\n\n.jGIS-layer-browser-added {\n display: inline-flex;\n gap: 0.35rem;\n opacity: 1 !important;\n width: 7rem;\n color: var(--jp-ui-inverse-font-color1);\n}\n\n.jGIS-layer-browser-text-container {\n padding-inline: 4px;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n gap: 8px;\n flex: 1 1 0%;\n box-sizing: border-box;\n}\n\n.jGIS-layer-browser-text-info {\n display: flex;\n flex-direction: column;\n gap: 8px;\n box-sizing: border-box;\n}\n\n.jGIS-layer-browser-text-header {\n overflow: hidden;\n font-weight: bold;\n text-transform: capitalize;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.jGIS-layer-browser-text-p {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.jGIS-layer-browser-text-source {\n overflow: hidden;\n font-size: 0.75rem;\n font-weight: lighter;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.jGIS-layer-browser-text-description {\n -webkit-line-clamp: 2;\n -moz-box-orient: vertical;\n display: -webkit-box;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.jGIS-layer-browser-text-general {\n margin: 0;\n}\n",""]);const l=a},367:(n,o,e)=>{e.d(o,{A:()=>l});var r=e(758),t=e.n(r),i=e(935),a=e.n(i)()(t());a.push([n.id,".jgis-status-bar {\n display: flex;\n justify-content: space-around;\n align-items: center;\n height: 16px;\n background-color: var(--jp-layout-color1);\n font-size: var(--jp-ui-font-size0);\n}\n\n.jgis-status-bar-item {\n flex: 0 0 content;\n}\n\n.jgis-status-bar-coords {\n min-width: 160px;\n}\n",""]);const l=a},432:(n,o,e)=>{var r=e(591),t=e.n(r),i=e(740),a=e.n(i),l=e(128),p=e.n(l),s=e(855),d=e.n(s),c=e(51),g=e.n(c),u=e(656),b=e.n(u),f=e(296),m={};m.styleTagTransform=b(),m.setAttributes=d(),m.insert=p().bind(null,"head"),m.domAPI=a(),m.insertStyleElement=g(),t()(f.A,m),f.A&&f.A.locals&&f.A.locals},564:(n,o,e)=>{e.d(o,{A:()=>l});var r=e(758),t=e.n(r),i=e(935),a=e.n(i)()(t());a.push([n.id,"/* -----------------------------------------------------------------------------\n| Copyright (c) Jupyter Development Team.\n| Distributed under the terms of the Modified BSD License.\n|---------------------------------------------------------------------------- */\n\n.jGIS-property-panel .rjsf .jp-select-wrapper select {\n background-image: unset;\n}\n",""]);const l=a},591:n=>{var o=[];function e(n){for(var e=-1,r=0;r<o.length;r++)if(o[r].identifier===n){e=r;break}return e}function r(n,r){for(var i={},a=[],l=0;l<n.length;l++){var p=n[l],s=r.base?p[0]+r.base:p[0],d=i[s]||0,c="".concat(s," ").concat(d);i[s]=d+1;var g=e(c),u={css:p[1],media:p[2],sourceMap:p[3],supports:p[4],layer:p[5]};if(-1!==g)o[g].references++,o[g].updater(u);else{var b=t(u,r);r.byIndex=l,o.splice(l,0,{identifier:c,updater:b,references:1})}a.push(c)}return a}function t(n,o){var e=o.domAPI(o);return e.update(n),function(o){if(o){if(o.css===n.css&&o.media===n.media&&o.sourceMap===n.sourceMap&&o.supports===n.supports&&o.layer===n.layer)return;e.update(n=o)}else e.remove()}}n.exports=function(n,t){var i=r(n=n||[],t=t||{});return function(n){n=n||[];for(var a=0;a<i.length;a++){var l=e(i[a]);o[l].references--}for(var p=r(n,t),s=0;s<i.length;s++){var d=e(i[s]);0===o[d].references&&(o[d].updater(),o.splice(d,1))}i=p}}},606:(n,o,e)=>{e.d(o,{A:()=>l});var r=e(758),t=e.n(r),i=e(935),a=e.n(i)()(t());a.push([n.id,".jp-gis-filter-main {\n display: flex;\n flex-direction: column;\n padding: 10px;\n gap: 1rem;\n}\n\n.jp-gis-filter-list {\n display: flex;\n flex-direction: column;\n}\n\n.jp-gis-filter-button-container {\n display: flex;\n justify-content: space-between;\n}\n\n.jp-gis-filter-main > .jp-Dialog-button {\n width: fit-content;\n align-self: flex-end;\n}\n\n.jp-gis-logical-select {\n width: fit-content !important;\n padding: 0 8px !important;\n text-align: center;\n}\n\n.jp-gis-filter-select-container {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.jp-gis-filter-row {\n display: flex;\n justify-content: space-around;\n width: 100%;\n gap: 0.25rem;\n}\n\n.jp-gis-filter-row > select {\n text-transform: capitalize;\n padding: 0;\n text-align: center;\n}\n\n.jp-gis-filter-row > option {\n text-transform: capitalize;\n font-size: var(--jp-ui-font-size1);\n}\n\n.jp-gis-filter-row > button {\n color: var(--jp-ui-font-color0);\n background: none;\n}\n\n.jp-gis-filter-row > button:hover {\n color: var(--jp-warn-color-hover);\n}\n\n.jp-gis-filter-icon:hover {\n scale: 1.3;\n cursor: pointer;\n}\n\n.jp-gis-filter-icon > svg {\n height: 16px;\n width: 16px;\n}\n",""]);const l=a},633:(n,o,e)=>{e.d(o,{A:()=>l});var r=e(758),t=e.n(r),i=e(935),a=e.n(i)()(t());a.push([n.id,"/* -----------------------------------------------------------------------------\n| Copyright (c) Jupyter Development Team.\n| Distributed under the terms of the Modified BSD License.\n|---------------------------------------------------------------------------- */\n\n.jp-gis-sourcePanel,\n.jp-gis-layerPanel {\n min-height: 3em;\n}\n\n.jp-gis-layerItem,\n.jp-gis-source {\n padding: 2px 0 2px 12px;\n}\n\n.jp-gis-layerGroup {\n display: flex;\n flex-direction: column;\n}\n\n.jp-gis-layerGroupHeader {\n display: flex;\n margin-left: -2px;\n padding-bottom: 4px;\n}\n\n.jp-gis-layerGroupHeader:hover {\n cursor: pointer;\n}\n\n.jp-gis-layerGroupCollapser {\n transform: rotate(-90deg);\n margin: auto 0;\n height: 16px;\n}\n\n.jp-gis-layerGroupCollapser.jp-mod-expanded {\n transform: rotate(0deg);\n}\n\n.jp-gis-layer,\n.jp-gis-source {\n display: flex;\n flex-direction: row;\n align-items: center;\n color: var(--jp-ui-font-color1);\n}\n\n.jp-gis-layer.jp-mod-selected,\n.jp-gis-source.jp-mod-selected,\n.jp-gis-layerGroupHeader.jp-mod-selected {\n color: var(--jp-ui-inverse-font-color1);\n background: var(--jp-brand-color1);\n}\n\n.jp-gis-layer:hover:not(.jp-mod-selected),\n.jp-gis-source:hover:not(.jp-mod-selected) {\n cursor: pointer;\n background: var(--jp-layout-color2);\n}\n\n.jp-gis-layer.jp-mod-selected .jp-icon-selectable,\n.jp-gis-source.jp-mod-selected .jp-icon-selectable,\n.jp-gis-layerGroupHeader.jp-mod-selected .jp-icon-selectable {\n fill: var(--jp-ui-inverse-font-color1);\n}\n.jp-gis-layer.jp-mod-selected path,\n.jp-gis-source.jp-mod-selected path {\n fill: var(--jp-ui-inverse-font-color1);\n}\n.jp-gis-layer.jp-mod-selected button:hover,\n.jp-gis-source.jp-mod-selected button:hover {\n background: none;\n}\n\n.jp-gis-layer button,\n.jp-gis-source button {\n min-height: unset;\n min-width: unset;\n padding: unset;\n margin-right: 4px;\n}\n\n.jp-gis-layer.jp-mod-selected button:hover .jp-icon-selectable,\n.jp-gis-source.jp-mod-selected button:hover .jp-icon-selectable {\n fill: var(--jp-ui-font-color1);\n}\n\n.jp-gis-layerIcon,\n.jp-gis-sourceIcon {\n display: flex;\n align-items: center;\n}\n\n.jp-gis-layerIcon > svg,\n.jp-gis-sourceIcon > svg {\n height: 16px;\n width: 16px;\n}\n\n.jp-gis-layerTitle,\n.jp-gis-sourceTitle {\n display: flex;\n flex-grow: 1;\n align-items: center;\n}\n\n.jp-gis-layerText:focus,\n.jp-gis-sourceText:focus {\n outline: none;\n}\n\n.jp-gis-layerTitle .jp-gis-layerIcon,\n.jp-gis-sourceTitle .jp-gis-sourceIcon {\n padding-right: 4px;\n}\n\n.jp-gis-layerIcon.jp-gis-mod-hidden path,\n.jp-gis-sourceIcon.jp-gis-mod-hidden path {\n fill: var(--jp-warn-color0);\n}\n\n.jp-gis-left-panel-input {\n background-color: transparent;\n border: 1px solid var(--jp-border-color1);\n border-radius: 8px;\n color: var(--jp-ui-font-color1);\n flex-grow: 1;\n margin-right: 4px;\n outline: none;\n padding: 2px 7px;\n}\n\n.jp-gis-left-panel-input:focus {\n border: 1px solid var(--jp-brand-color1);\n}\n\n.jp-gis-layerText,\n.jp-gis-sourceText {\n padding: 3px 0;\n cursor: pointer;\n}\n\nli .lm-Menu-itemLabel {\n text-transform: capitalize;\n}\n\n.jp-gis-sourceInfo {\n font-size: var(--jp-ui-font-size0);\n font-style: italic;\n padding-left: 5px;\n color: var(--jp-ui-font-color2);\n}\n\n#jp-drag-indicator {\n top: calc(-1 * var(--jp-border-width) + 1px);\n left: calc(-1 * var(--jp-border-width));\n content: '';\n height: var(--jp-private-horizontal-tab-active-top-border);\n width: calc(100% + 2 * var(--jp-border-width));\n background: var(--jp-brand-color1);\n}\n",""]);const l=a},656:n=>{n.exports=function(n,o){if(o.styleSheet)o.styleSheet.cssText=n;else{for(;o.firstChild;)o.removeChild(o.firstChild);o.appendChild(document.createTextNode(n))}}},740:n=>{n.exports=function(n){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var o=n.insertStyleElement(n);return{update:function(e){!function(n,o,e){var r="";e.supports&&(r+="@supports (".concat(e.supports,") {")),e.media&&(r+="@media ".concat(e.media," {"));var t=void 0!==e.layer;t&&(r+="@layer".concat(e.layer.length>0?" ".concat(e.layer):""," {")),r+=e.css,t&&(r+="}"),e.media&&(r+="}"),e.supports&&(r+="}");var i=e.sourceMap;i&&"undefined"!=typeof btoa&&(r+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(i))))," */")),o.styleTagTransform(r,n,o.options)}(o,n,e)},remove:function(){!function(n){if(null===n.parentNode)return!1;n.parentNode.removeChild(n)}(o)}}}},758:n=>{n.exports=function(n){return n[1]}},781:(n,o,e)=>{e.d(o,{A:()=>l});var r=e(758),t=e.n(r),i=e(935),a=e.n(i)()(t());a.push([n.id,"select,\nselect option {\n text-transform: capitalize;\n}\n\n.jp-gis-symbology-dialog .jp-Dialog-header {\n font-weight: bold;\n}\n\n.jp-gis-symbology-dialog .jp-Dialog-content {\n width: calc(80% - 4rem);\n max-width: 80%;\n height: fit-content;\n max-height: 80%;\n}\n\n.jp-gis-symbology-row {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n gap: 2rem;\n}\n\n.jp-gis-symbology-row label {\n font-size: var(--jp-ui-font-size2);\n flex: 0 1 20%;\n}\n\n.jp-gis-symbology-row > .jp-select-wrapper,\n.jp-gis-symbology-row > .jp-mod-styled {\n flex: 1 0 50%;\n max-width: 50%;\n}\n\n.jp-gis-color-ramp-div {\n display: flex;\n flex: 1 1 50%;\n max-width: 50%;\n justify-content: space-between;\n align-items: baseline;\n}\n\n.jp-gis-color-ramp-div > .jp-select-wrapper {\n flex: 1 0 40%;\n}\n\n.jp-gis-color-ramp-div:last-child {\n flex-shrink: 0;\n}\n\n.jp-gis-color-ramp-div > input {\n max-width: 25%;\n}\n\n.jp-gis-band-container {\n display: flex;\n flex-direction: column;\n gap: 13px;\n}\n\n.jp-gis-layer-symbology-container {\n display: flex;\n flex-direction: column;\n gap: 13px;\n border-top: 1px solid var(--jp-border-color2);\n padding-top: 8px;\n}\n\n.jp-gis-layer-symbology-container .jp-select-wrapper {\n margin-bottom: unset;\n}\n\n.jp-gis-color-ramp-container {\n display: flex;\n flex-direction: column;\n gap: 13px;\n}\n\n.jp-gis-stop-container {\n display: flex;\n flex-direction: column;\n gap: 0.1rem;\n}\n\n.jp-gis-stop-labels {\n display: flex;\n font-weight: bold;\n font-size: var(--jp-ui-font-size1);\n gap: 0.25rem;\n padding-bottom: 0.25rem;\n}\n\n.jp-gis-stop-labels > span {\n flex: 0 0 18%;\n}\n\n.jp-gis-color-row {\n display: flex;\n width: 100%;\n gap: 0.25rem;\n height: 32px;\n}\n\n.jp-gis-color-row-value-input {\n flex: 0 1 18%;\n min-width: 0px;\n}\n\n.jp-gis-color-row-output-input {\n flex-grow: 1;\n}\n\n.jp-gis-color-row > button {\n color: var(--jp-ui-font-color0);\n background: none;\n padding-right: 0px;\n}\n\n.jp-gis-symbology-button-container {\n padding-top: 0.5rem;\n}\n\n.jp-gis-band-info-loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 2rem;\n margin: auto;\n}\n\n.jp-gis-loading-spinner {\n animation: spin 4s linear infinite;\n font-size: 1.5rem;\n padding: 1rem 0;\n margin: auto;\n}\n\n.jp-gis-band-info-loading-container > span {\n font-size: 1rem;\n}\n\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n.jp-gis-color-ramp-dropdown {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n position: absolute;\n overflow-x: hidden;\n overflow-y: auto;\n visibility: hidden;\n z-index: 40;\n flex: 1 1 auto;\n width: 97%;\n max-height: 20rem;\n background: var(--jp-input-background);\n padding-left: 8px;\n border: var(--jp-border-width) solid var(--jp-input-border-color);\n border-radius: 0;\n outline: none;\n appearance: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n}\n\n.jp-gis-open {\n visibility: visible;\n}\n\n.jp-gis-color-ramp-entry {\n display: flex;\n align-items: center;\n font-size: var(--jp-ui-font-size2);\n color: var(--jp-ui-font-color0);\n appearance: none;\n text-transform: capitalize;\n cursor: pointer;\n -webkit-appearance: none;\n -moz-appearance: none;\n}\n\n.jp-gis-color-label {\n color: white;\n position: absolute;\n transition: transform 0.3s ease;\n}\n\n.jp-gis-color-ramp-entry:hover .jp-gis-color-label {\n transform: scale(1.2);\n}\n\n.jp-gis-color-canvas {\n margin: 0 -7px;\n border-radius: 4px;\n width: 100%;\n max-height: 38px;\n}\n\n.jp-gis-color-canvas-display {\n width: 100%;\n height: 30px;\n visibility: initial;\n border-radius: var(--jp-border-radius);\n}\n\n.jp-Dialog-content:has(.jp-gis-heatmap),\n.jp-Dialog-body:has(.jp-gis-heatmap) {\n overflow: visible;\n}\n\n.jp-gis-canvas-button-wrapper {\n flex: 1 0 50%;\n max-width: 50%;\n position: relative;\n}\n\n#jp-gis-canvas-button.jp-gis-canvas-button {\n visibility: hidden;\n margin: 0;\n padding: 0 1px 0 0;\n width: 100%;\n}\n",""]);const l=a},855:(n,o,e)=>{n.exports=function(n){var o=e.nc;o&&n.setAttribute("nonce",o)}},935:n=>{n.exports=function(n){var o=[];return o.toString=function(){return this.map((function(o){var e="",r=void 0!==o[5];return o[4]&&(e+="@supports (".concat(o[4],") {")),o[2]&&(e+="@media ".concat(o[2]," {")),r&&(e+="@layer".concat(o[5].length>0?" ".concat(o[5]):""," {")),e+=n(o),r&&(e+="}"),o[2]&&(e+="}"),o[4]&&(e+="}"),e})).join("")},o.i=function(n,e,r,t,i){"string"==typeof n&&(n=[[null,n,void 0]]);var a={};if(r)for(var l=0;l<this.length;l++){var p=this[l][0];null!=p&&(a[p]=!0)}for(var s=0;s<n.length;s++){var d=[].concat(n[s]);r&&a[d[0]]||(void 0!==i&&(void 0===d[5]||(d[1]="@layer".concat(d[5].length>0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=i),e&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=e):d[2]=e),t&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=t):d[4]="".concat(t)),o.push(d))}},o}},997:(n,o,e)=>{e.d(o,{A:()=>s});var r=e(758),t=e.n(r),i=e(935),a=e.n(i),l=e(79),p=a()(t());p.i(l.A),p.push([n.id,"/* -----------------------------------------------------------------------------\n| Copyright (c) Jupyter Development Team.\n| Distributed under the terms of the Modified BSD License.\n|---------------------------------------------------------------------------- */\n",""]);const s=p}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunk_jupytergis_jupytergis_lab=self.webpackChunk_jupytergis_jupytergis_lab||[]).push([[484],{484:(e,t,o)=>{o.r(t),o.d(t,{default:()=>x});var n=o(464),a=o(894),r=o(611),d=o(280),s=o(895),m=o(144),i=o(828),c=o(256),l=o(903),u=o(594),g=o(378),p=o(335),I=o(970),y=o(230),h=o(173);class M extends h.JupyterYModel{}class j extends c.Panel{constructor(e){super(),this._buildWidget=e=>{const{commands:t,model:o,externalCommands:a,tracker:r}=e,d=new n.JupyterGISPanel({model:o,commandRegistry:t});let s;o.filePath&&(s=new n.ToolbarWidget({commands:t,model:o,externalCommands:(null==a?void 0:a.getCommands())||[]})),this._jgisWidget=new n.JupyterGISOutputWidget({model:o,content:d,toolbar:s}),this.addWidget(this._jgisWidget),null==r||r.add(this._jgisWidget)};const{model:t}=e;this.addClass("jupytergis-notebook-widget"),this._buildWidget(e),t.sharedModel.changed.connect(((t,o)=>{o.stateChange&&o.stateChange.forEach((t=>{var o;"path"===t.name&&(null===(o=this.layout)||void 0===o||o.removeWidget(this._jgisWidget),this._jgisWidget.dispose(),this._buildWidget(e))}))}))}get jgisWidget(){return this._jgisWidget}}const b={id:"jupytergis:yjswidget-plugin",autoStart:!0,optional:[a.IJGISExternalCommandRegistryToken,a.IJupyterGISDocTracker,h.IJupyterYWidgetManager,l.ICollaborativeDrive],activate:(e,t,o,n,r)=>{n?n.registerWidget("@jupytergis:widget",class extends M{async initialize(t){const{path:o,format:n,contentType:d}=t,s=n;if(!r)throw(0,u.showErrorMessage)("Error using the JupyterGIS Python API","You cannot use the JupyterGIS Python API without a collaborative drive. You need to install a package providing collaboration features (e.g. jupyter-collaboration)."),new Error("Failed to create the YDoc without a collaborative drive");let m="";const i=e.shell.currentWidget;(i instanceof I.NotebookPanel||i instanceof g.ConsolePanel)&&(m=i.sessionContext.path);let c="";if(o){c=p.PathExt.join(p.PathExt.dirname(m),o);try{await e.serviceManager.contents.get(c)}catch(t){await e.serviceManager.contents.save(c,{content:btoa("{}"),format:"base64"})}}else c=p.PathExt.join(p.PathExt.dirname(m),"unsaved_project");const l=r.sharedModelFactory.createNew({path:c,format:s,contentType:d,collaborative:!0});this.jupyterGISModel=new a.JupyterGISModel({sharedModel:l}),this.jupyterGISModel.contentsManager=e.serviceManager.contents,this.jupyterGISModel.filePath=c,this.ydoc=this.jupyterGISModel.sharedModel.ydoc,this.sharedModel=new h.JupyterYDoc(t,this.ydoc)}},class{constructor(n,a){this.yModel=n,this.node=a;const r=new j({commands:e.commands,model:n.jupyterGISModel,externalCommands:t,tracker:o});this._jgisWidget=r.jgisWidget,y.MessageLoop.sendMessage(r,c.Widget.Msg.BeforeAttach),a.appendChild(r.node),y.MessageLoop.sendMessage(r,c.Widget.Msg.AfterAttach)}dispose(){this._jgisWidget.dispose()}}):console.error("Missing IJupyterYWidgetManager token!")}},C="jupytergis",x=[{id:"jupytergis:lab:main-menu",autoStart:!0,requires:[a.IJupyterGISDocTracker,a.IJGISFormSchemaRegistryToken,a.IJGISLayerBrowserRegistryToken,m.IStateDB],optional:[s.IMainMenu,i.ITranslator,d.ICompletionProviderManager],activate:(e,t,o,a,r,d,s,m)=>{console.log("jupytergis:lab:main-menu is activated!"),s=null!=s?s:i.nullTranslator;(0,n.createDefaultLayerRegistry)(a),n.GlobalStateDbManager.getInstance().initialize(r),(0,n.addCommands)(e,t,s,o,a,r,m);const l=new c.Menu({commands:e.commands});l.title.label=s.load("jupyterlab").__("Add Source"),l.id="jp-gis-contextmenu-addSource",e.contextMenu.addItem({type:"submenu",selector:".jp-gis-sourcePanel",rank:3,submenu:l}),l.addItem({command:n.CommandIDs.newRasterSource,args:{from:"contextMenu"}}),l.addItem({command:n.CommandIDs.newVectorSource,args:{from:"contextMenu"}}),l.addItem({command:n.CommandIDs.newGeoJSONSource,args:{from:"contextMenu"}}),l.addItem({command:n.CommandIDs.newRasterDemSource,args:{from:"contextMenu"}}),l.addItem({command:n.CommandIDs.newImageSource,args:{from:"contextMenu"}}),e.contextMenu.addItem({type:"separator",selector:".jp-gis-sourcePanel",rank:2}),e.contextMenu.addItem({selector:".jp-gis-source.jp-gis-sourceUnused",rank:1,command:n.CommandIDs.removeSource}),e.contextMenu.addItem({selector:".jp-gis-source",rank:1,command:n.CommandIDs.renameSource}),e.contextMenu.addItem({command:n.CommandIDs.symbology,selector:".jp-gis-layerItem",rank:1}),e.contextMenu.addItem({type:"separator",selector:".jp-gis-layerPanel",rank:1}),e.contextMenu.addItem({command:n.CommandIDs.removeLayer,selector:".jp-gis-layerItem",rank:2}),e.contextMenu.addItem({command:n.CommandIDs.renameLayer,selector:".jp-gis-layerItem",rank:2}),e.contextMenu.addItem({command:n.CommandIDs.zoomToLayer,selector:".jp-gis-layerItem",rank:2});const u=new c.Menu({commands:e.commands});u.title.label=s.load("jupyterlab").__("Download"),u.id="jp-gis-contextmenu-download",u.addItem({command:n.CommandIDs.downloadGeoJSON}),e.contextMenu.addItem({type:"submenu",selector:".jp-gis-layerItem",rank:2,submenu:u});const g=new c.Menu({commands:e.commands});g.title.label=s.load("jupyterlab").__("Processing"),g.id="jp-gis-contextmenu-processing",g.addItem({command:n.CommandIDs.buffer}),g.addItem({command:n.CommandIDs.dissolve}),e.contextMenu.addItem({type:"submenu",selector:".jp-gis-layerItem",rank:2,submenu:g});const p=new c.Menu({commands:e.commands});p.title.label=s.load("jupyterlab").__("Move Selected Layers to Group"),p.id="jp-gis-contextmenu-movelayer",e.contextMenu.addItem({type:"submenu",selector:".jp-gis-layerItem",rank:2,submenu:p}),e.contextMenu.opened.connect((()=>function(e,t){var o,a,r,d;if(!(null===(o=t.currentWidget)||void 0===o?void 0:o.model))return;const s=null===(a=t.currentWidget)||void 0===a?void 0:a.model,m=null!==(d=null===(r=e.menu.items.find((e=>{var t;return"submenu"===e.type&&"jp-gis-contextmenu-movelayer"===(null===(t=e.submenu)||void 0===t?void 0:t.id)})))||void 0===r?void 0:r.submenu)&&void 0!==d?d:null;if(!m)return;m.clearItems();const i=function e(t){const o=[];for(const n of t)if("string"!=typeof n&&n.layers){o.push(n.name);const t=e(n.layers);o.push(...t)}return o}(s.getLayerTree());m.addItem({command:n.CommandIDs.moveLayersToGroup,args:{label:""}}),i.forEach((e=>{m.addItem({command:n.CommandIDs.moveLayersToGroup,args:{label:e}})})),m.addItem({command:n.CommandIDs.moveLayerToNewGroup})}(e.contextMenu,t))),e.contextMenu.addItem({command:n.CommandIDs.removeGroup,selector:".jp-gis-layerGroupHeader",rank:2}),e.contextMenu.addItem({command:n.CommandIDs.renameGroup,selector:".jp-gis-layerGroupHeader",rank:2}),e.contextMenu.addItem({type:"separator",selector:".jp-gis-layerPanel",rank:2});const I=new c.Menu({commands:e.commands});I.title.label=s.load("jupyterlab").__("Add Layer"),I.id="jp-gis-contextmenu-addLayer",e.contextMenu.addItem({type:"submenu",selector:".jp-gis-layerPanel",rank:3,submenu:I}),I.addItem({command:n.CommandIDs.newRasterLayer,args:{from:"contextMenu"}}),I.addItem({command:n.CommandIDs.newVectorLayer,args:{from:"contextMenu"}}),I.addItem({command:n.CommandIDs.newHillshadeLayer,args:{from:"contextMenu"}}),I.addItem({command:n.CommandIDs.newImageLayer,args:{from:"contextMenu"}}),I.addItem({command:n.CommandIDs.newHeatmapLayer,args:{from:"contextMenu"}}),d&&function(e,t){e.editMenu.undoers.redo.add({id:n.CommandIDs.redo,isEnabled:t}),e.editMenu.undoers.undo.add({id:n.CommandIDs.undo,isEnabled:t})}(d,(()=>null!==t.currentWidget&&t.currentWidget===e.shell.currentWidget))}},{id:"jupytergis:lab:controlpanel",autoStart:!0,requires:[r.ILayoutRestorer,a.IJupyterGISDocTracker,a.IJGISFormSchemaRegistryToken,m.IStateDB,a.IAnnotationToken],activate:(e,t,o,a,r,d)=>{const s=new n.ControlPanelModel({tracker:o}),m=new n.LeftPanelWidget({model:s,tracker:o,state:r,commands:e.commands});m.id="jupytergis::leftControlPanel",m.title.caption="JupyterGIS Control Panel",m.title.icon=n.logoMiniIcon;const i=new n.RightPanelWidget({model:s,tracker:o,formSchemaRegistry:a,annotationModel:d});i.id="jupytergis::rightControlPanel",i.title.caption="JupyterGIS Control Panel",i.title.icon=n.logoMiniIcon,t&&(t.add(m,C),t.add(i,C)),e.shell.add(m,"left",{rank:2e3}),e.shell.add(i,"right",{rank:2e3})}},b]}}]);
@@ -0,0 +1 @@
1
+ var _JUPYTERLAB;(()=>{"use strict";var e,r,t,n,a,o,i,u,l,s,f,d,p,c,h,v,b,g,y,m,j,w,S,k={450:(e,r,t)=>{var n={"./index":()=>t.e(484).then((()=>()=>t(484))),"./extension":()=>t.e(484).then((()=>()=>t(484))),"./style":()=>t.e(432).then((()=>()=>t(432)))},a=(e,r)=>(t.R=r,r=t.o(n,e)?n[e]():Promise.resolve().then((()=>{throw new Error('Module "'+e+'" does not exist in container.')})),t.R=void 0,r),o=(e,r)=>{if(t.S){var n="default",a=t.S[n];if(a&&a!==e)throw new Error("Container initialization failed as it has already been initialized with a different share scope");return t.S[n]=e,t.I(n,r)}};t.d(r,{get:()=>a,init:()=>o})}},E={};function P(e){var r=E[e];if(void 0!==r)return r.exports;var t=E[e]={id:e,exports:{}};return k[e](t,t.exports,P),t.exports}P.m=k,P.c=E,P.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return P.d(r,{a:r}),r},P.d=(e,r)=>{for(var t in r)P.o(r,t)&&!P.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},P.f={},P.e=e=>Promise.all(Object.keys(P.f).reduce(((r,t)=>(P.f[t](e,r),r)),[])),P.u=e=>e+"."+{234:"c2d7ed33ae9ca2244b0d",432:"bb0ae93e813eefae7236",484:"8ba570bf2020ec490e49"}[e]+".js?v="+{234:"c2d7ed33ae9ca2244b0d",432:"bb0ae93e813eefae7236",484:"8ba570bf2020ec490e49"}[e],P.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),P.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),e={},r="@jupytergis/jupytergis-lab:",P.l=(t,n,a,o)=>{if(e[t])e[t].push(n);else{var i,u;if(void 0!==a)for(var l=document.getElementsByTagName("script"),s=0;s<l.length;s++){var f=l[s];if(f.getAttribute("src")==t||f.getAttribute("data-webpack")==r+a){i=f;break}}i||(u=!0,(i=document.createElement("script")).charset="utf-8",i.timeout=120,P.nc&&i.setAttribute("nonce",P.nc),i.setAttribute("data-webpack",r+a),i.src=t),e[t]=[n];var d=(r,n)=>{i.onerror=i.onload=null,clearTimeout(p);var a=e[t];if(delete e[t],i.parentNode&&i.parentNode.removeChild(i),a&&a.forEach((e=>e(n))),r)return r(n)},p=setTimeout(d.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=d.bind(null,i.onerror),i.onload=d.bind(null,i.onload),u&&document.head.appendChild(i)}},P.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{P.S={};var e={},r={};P.I=(t,n)=>{n||(n=[]);var a=r[t];if(a||(a=r[t]={}),!(n.indexOf(a)>=0)){if(n.push(a),e[t])return e[t];P.o(P.S,t)||(P.S[t]={});var o=P.S[t],i="@jupytergis/jupytergis-lab",u=(e,r,t,n)=>{var a=o[e]=o[e]||{},u=a[r];(!u||!u.loaded&&(!n!=!u.eager?n:i>u.from))&&(a[r]={get:t,from:i,eager:!!n})},l=[];return"default"===t&&(u("@jupyter/collaborative-drive","3.1.2",(()=>P.e(234).then((()=>()=>P(234))))),u("@jupytergis/jupytergis-lab","0.4.5",(()=>P.e(484).then((()=>()=>P(484)))))),e[t]=l.length?Promise.all(l).then((()=>e[t]=1)):1}}})(),(()=>{var e;P.g.importScripts&&(e=P.g.location+"");var r=P.g.document;if(!e&&r&&(r.currentScript&&"SCRIPT"===r.currentScript.tagName.toUpperCase()&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var n=t.length-1;n>-1&&(!e||!/^http(s?):/.test(e));)e=t[n--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),P.p=e})(),t=e=>{var r=e=>e.split(".").map((e=>+e==e?+e:e)),t=/^([^-+]+)?(?:-([^+]+))?(?:\+(.+))?$/.exec(e),n=t[1]?r(t[1]):[];return t[2]&&(n.length++,n.push.apply(n,r(t[2]))),t[3]&&(n.push([]),n.push.apply(n,r(t[3]))),n},n=(e,r)=>{e=t(e),r=t(r);for(var n=0;;){if(n>=e.length)return n<r.length&&"u"!=(typeof r[n])[0];var a=e[n],o=(typeof a)[0];if(n>=r.length)return"u"==o;var i=r[n],u=(typeof i)[0];if(o!=u)return"o"==o&&"n"==u||"s"==u||"u"==o;if("o"!=o&&"u"!=o&&a!=i)return a<i;n++}},a=e=>{var r=e[0],t="";if(1===e.length)return"*";if(r+.5){t+=0==r?">=":-1==r?"<":1==r?"^":2==r?"~":r>0?"=":"!=";for(var n=1,o=1;o<e.length;o++)n--,t+="u"==(typeof(u=e[o]))[0]?"-":(n>0?".":"")+(n=2,u);return t}var i=[];for(o=1;o<e.length;o++){var u=e[o];i.push(0===u?"not("+l()+")":1===u?"("+l()+" || "+l()+")":2===u?i.pop()+" "+i.pop():a(u))}return l();function l(){return i.pop().replace(/^\((.+)\)$/,"$1")}},o=(e,r)=>{if(0 in e){r=t(r);var n=e[0],a=n<0;a&&(n=-n-1);for(var i=0,u=1,l=!0;;u++,i++){var s,f,d=u<e.length?(typeof e[u])[0]:"";if(i>=r.length||"o"==(f=(typeof(s=r[i]))[0]))return!l||("u"==d?u>n&&!a:""==d!=a);if("u"==f){if(!l||"u"!=d)return!1}else if(l)if(d==f)if(u<=n){if(s!=e[u])return!1}else{if(a?s>e[u]:s<e[u])return!1;s!=e[u]&&(l=!1)}else if("s"!=d&&"n"!=d){if(a||u<=n)return!1;l=!1,u--}else{if(u<=n||f<d!=a)return!1;l=!1}else"s"!=d&&"n"!=d&&(l=!1,u--)}}var p=[],c=p.pop.bind(p);for(i=1;i<e.length;i++){var h=e[i];p.push(1==h?c()|c():2==h?c()&c():h?o(h,r):!c())}return!!c()},i=(e,r)=>e&&P.o(e,r),u=e=>(e.loaded=1,e.get()),l=e=>Object.keys(e).reduce(((r,t)=>(e[t].eager&&(r[t]=e[t]),r)),{}),s=(e,r,t,a)=>{var i=a?l(e[r]):e[r];return(r=Object.keys(i).reduce(((e,r)=>!o(t,r)||e&&!n(e,r)?e:r),0))&&i[r]},f=(e,r,t)=>{var a=t?l(e[r]):e[r];return Object.keys(a).reduce(((e,r)=>!e||!a[e].loaded&&n(e,r)?r:e),0)},d=(e,r,t,n)=>"Unsatisfied version "+t+" from "+(t&&e[r][t].from)+" of shared singleton module "+r+" (required "+a(n)+")",p=(e,r,t,n,o)=>{var i=e[t];return"No satisfying version ("+a(n)+")"+(o?" for eager consumption":"")+" of shared module "+t+" found in shared scope "+r+".\nAvailable versions: "+Object.keys(i).map((e=>e+" from "+i[e].from)).join(", ")},c=e=>{throw new Error(e)},h=e=>{"undefined"!=typeof console&&console.warn&&console.warn(e)},b=(e,r,t)=>t?t():((e,r)=>c("Shared module "+r+" doesn't exist in shared scope "+e))(e,r),g=(v=e=>function(r,t,n,a,o){var i=P.I(r);return i&&i.then&&!n?i.then(e.bind(e,r,P.S[r],t,!1,a,o)):e(r,P.S[r],t,n,a,o)})(((e,r,t,n,a,o)=>{if(!i(r,t))return b(e,t,o);var l=s(r,t,a,n);return l?u(l):o?o():void c(p(r,e,t,a,n))})),y=v(((e,r,t,n,a,l)=>{if(!i(r,t))return b(e,t,l);var s=f(r,t,n);return o(a,s)||h(d(r,t,s,a)),u(r[t][s])})),m={},j={144:()=>y("default","@jupyterlab/statedb",!1,[1,4,4,1]),173:()=>y("default","yjs-widgets",!1,[2,0,4]),230:()=>y("default","@lumino/messaging",!1,[1,2,0,0]),256:()=>y("default","@lumino/widgets",!1,[1,2,3,1,,"alpha",0]),280:()=>y("default","@jupyterlab/completer",!1,[1,4,4,1]),335:()=>y("default","@jupyterlab/coreutils",!1,[1,6,4,1]),378:()=>y("default","@jupyterlab/console",!1,[1,4,4,1]),464:()=>y("default","@jupytergis/base",!1,[2,0,4,5]),594:()=>y("default","@jupyterlab/apputils",!1,[1,4,5,1]),611:()=>y("default","@jupyterlab/application",!1,[1,4,4,1]),828:()=>y("default","@jupyterlab/translation",!1,[1,4,4,1]),894:()=>y("default","@jupytergis/schema",!1,[2,0,4,5]),895:()=>y("default","@jupyterlab/mainmenu",!1,[1,4,4,1]),903:()=>g("default","@jupyter/collaborative-drive",!1,[1,3,0,0],(()=>P.e(234).then((()=>()=>P(234))))),970:()=>y("default","@jupyterlab/notebook",!1,[1,4,4,1]),262:()=>y("default","@lumino/coreutils",!1,[1,2,0,0])},w={234:[262],484:[144,173,230,256,280,335,378,464,594,611,828,894,895,903,970]},S={},P.f.consumes=(e,r)=>{P.o(w,e)&&w[e].forEach((e=>{if(P.o(m,e))return r.push(m[e]);if(!S[e]){var t=r=>{m[e]=0,P.m[e]=t=>{delete P.c[e],t.exports=r()}};S[e]=!0;var n=r=>{delete m[e],P.m[e]=t=>{throw delete P.c[e],r}};try{var a=j[e]();a.then?r.push(m[e]=a.then(t).catch(n)):t(a)}catch(e){n(e)}}}))},(()=>{P.b=document.baseURI||self.location.href;var e={738:0};P.f.j=(r,t)=>{var n=P.o(e,r)?e[r]:void 0;if(0!==n)if(n)t.push(n[2]);else{var a=new Promise(((t,a)=>n=e[r]=[t,a]));t.push(n[2]=a);var o=P.p+P.u(r),i=new Error;P.l(o,(t=>{if(P.o(e,r)&&(0!==(n=e[r])&&(e[r]=void 0),n)){var a=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;i.message="Loading chunk "+r+" failed.\n("+a+": "+o+")",i.name="ChunkLoadError",i.type=a,i.request=o,n[1](i)}}),"chunk-"+r,r)}};var r=(r,t)=>{var n,a,[o,i,u]=t,l=0;if(o.some((r=>0!==e[r]))){for(n in i)P.o(i,n)&&(P.m[n]=i[n]);u&&u(P)}for(r&&r(t);l<o.length;l++)a=o[l],P.o(e,a)&&e[a]&&e[a][0](),e[a]=0},t=self.webpackChunk_jupytergis_jupytergis_lab=self.webpackChunk_jupytergis_jupytergis_lab||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})(),P.nc=void 0;var _=P(450);(_JUPYTERLAB=void 0===_JUPYTERLAB?{}:_JUPYTERLAB)["@jupytergis/jupytergis-lab"]=_})();
@@ -2,13 +2,13 @@
2
2
  "packages": [
3
3
  {
4
4
  "name": "@jupyter/collaborative-drive",
5
- "versionInfo": "3.1.0",
5
+ "versionInfo": "3.1.2",
6
6
  "licenseId": "BSD-3-Clause",
7
7
  "extractedText": ""
8
8
  },
9
9
  {
10
10
  "name": "@jupytergis/base",
11
- "versionInfo": "0.4.4",
11
+ "versionInfo": "0.4.5",
12
12
  "licenseId": "BSD-3-Clause",
13
13
  "extractedText": ""
14
14
  },
@@ -0,0 +1,127 @@
1
+ from dataclasses import dataclass
2
+ from pathlib import Path
3
+ from typing import Any, Literal, Optional
4
+ import re
5
+
6
+ from jupytergis_lab import GISDocument
7
+
8
+
9
+ @dataclass
10
+ class Basemap:
11
+ name: str
12
+ url: str
13
+
14
+
15
+ BasemapChoice = Literal["light", "dark", "topo"]
16
+ _basemaps: dict[BasemapChoice, list[Basemap]] = {
17
+ "light": [
18
+ Basemap(
19
+ name="ArcGIS dark basemap",
20
+ url="https://services.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer/tile/{z}/{y}/{x}.pbf",
21
+ ),
22
+ Basemap(
23
+ name="ArcGIS dark basemap reference",
24
+ url="https://services.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Reference/MapServer/tile/{z}/{y}/{x}.pbf",
25
+ ),
26
+ ],
27
+ "dark": [
28
+ Basemap(
29
+ name="ArcGIS light basemap",
30
+ url="https://services.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Base/MapServer/tile/{z}/{y}/{x}.pbf",
31
+ ),
32
+ Basemap(
33
+ name="ArcGIS light basemap reference",
34
+ url="https://services.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Reference/MapServer/tile/{z}/{y}/{x}.pbf",
35
+ ),
36
+ ],
37
+ "topo": [
38
+ Basemap(
39
+ name="USGS topographic basemap",
40
+ url="https://basemap.nationalmap.gov/arcgis/rest/services/USGSTopo/MapServer/tile/{z}/{y}/{x}",
41
+ ),
42
+ ],
43
+ }
44
+
45
+
46
+ def explore(
47
+ data: str | Path | Any,
48
+ *,
49
+ layer_name: Optional[str] = "Exploration layer",
50
+ basemap: BasemapChoice = "topo",
51
+ ) -> GISDocument:
52
+ """Run a JupyterGIS data interaction interface alongside a Notebook.
53
+
54
+ :param data: A GeoDataFrame or path to a GeoJSON file.
55
+
56
+ :raises FileNotFoundError: Received a file path that doesn't exist.
57
+ :raises NotImplementedError: Received an input value that isn't supported yet.
58
+ :raises TypeError: Received an object type that isn't supported.
59
+ :raises ValueError: Received an input value that isn't supported.
60
+ """
61
+ doc = GISDocument()
62
+
63
+ for basemap_obj in _basemaps[basemap]:
64
+ doc.add_raster_layer(basemap_obj.url, name=basemap_obj.name)
65
+
66
+ _add_layer(doc=doc, data=data, name=layer_name)
67
+
68
+ # TODO: Zoom to layer. Currently not exposed in Python API.
69
+
70
+ doc.sidecar(title="JupyterGIS explorer")
71
+
72
+ # TODO: should we return `doc`? It enables the exploration environment more usable,
73
+ # but by default, `explore(...)` would display a widget in the notebook _and_ open a
74
+ # sidecar for the same widget. The user would need to append a semicolon to disable
75
+ # that behavior. We can't disable that behavior from within this function to the
76
+ # best of my knowlwedge.
77
+
78
+
79
+ def _add_layer(
80
+ *,
81
+ doc: GISDocument,
82
+ data: Any,
83
+ name: str,
84
+ ) -> str:
85
+ """Add a layer to the document, autodetecting its type.
86
+
87
+ This method currently supports only GeoDataFrames and GeoJSON files.
88
+
89
+ :param doc: A GISDocument to add the layer to.
90
+ :param data: A data object. Valid data objects include geopandas GeoDataFrames and paths to GeoJSON files.
91
+ :param name: The name that will be used for the layer.
92
+
93
+ :return: A layer ID string.
94
+
95
+ :raises FileNotFoundError: Received a file path that doesn't exist.
96
+ :raises NotImplementedError: Received an input value that isn't supported yet.
97
+ :raises TypeError: Received an object type that isn't supported.
98
+ :raises ValueError: Received an input value that isn't supported.
99
+ """
100
+ if isinstance(data, str):
101
+ if re.match(r"^(http|https)://", data) is not None:
102
+ raise NotImplementedError("URLs not yet supported.")
103
+ else:
104
+ data = Path(data)
105
+
106
+ if isinstance(data, Path):
107
+ if not data.exists():
108
+ raise FileNotFoundError(f"File not found: {data}")
109
+
110
+ ext = data.suffix.lower()
111
+
112
+ if ext in [".geojson", ".json"]:
113
+ return doc.add_geojson_layer(path=data, name=name)
114
+ elif ext in [".tif", ".tiff"]:
115
+ raise NotImplementedError("GeoTIFFs not yet supported.")
116
+ else:
117
+ raise ValueError(f"Unsupported file type: {data}")
118
+
119
+ try:
120
+ from geopandas import GeoDataFrame
121
+
122
+ if isinstance(data, GeoDataFrame):
123
+ return doc.add_geojson_layer(data=data.to_geo_dict(), name=name)
124
+ except ImportError:
125
+ pass
126
+
127
+ raise TypeError(f"Unsupported input type: {type(data)}")
@@ -2,13 +2,13 @@ from __future__ import annotations
2
2
 
3
3
  import json
4
4
  import logging
5
- import os
6
5
  from pathlib import Path
7
6
  from typing import Any, Dict, List, Literal, Optional, Union
8
7
  from uuid import uuid4
9
8
 
10
- from pycrdt import Array, Doc, Map
9
+ from pycrdt import Array, Map
11
10
  from pydantic import BaseModel
11
+ from sidecar import Sidecar
12
12
  from ypywidgets.comm import CommWidget
13
13
 
14
14
  from .objects import (
@@ -43,11 +43,9 @@ class GISDocument(CommWidget):
43
43
  """
44
44
  Create a new GISDocument object.
45
45
 
46
- :param path: the path to the file that you would like to open. If not provided, a new empty document will be created.
46
+ :param path: the path to the file that you would like to open. If not provided, a new ephemeral widget will be created.
47
47
  """
48
48
 
49
- path: Optional[Path]
50
-
51
49
  def __init__(
52
50
  self,
53
51
  path: Optional[str | Path] = None,
@@ -59,18 +57,14 @@ class GISDocument(CommWidget):
59
57
  pitch: Optional[float] = None,
60
58
  projection: Optional[str] = None,
61
59
  ):
62
- if isinstance(path, str):
63
- path = Path(path)
64
-
65
- self.path = path
66
-
67
- comm_metadata = GISDocument._path_to_comm(str(self.path) if self.path else None)
68
-
69
- ydoc = Doc()
60
+ if isinstance(path, Path):
61
+ path = str(path)
70
62
 
71
63
  super().__init__(
72
- comm_metadata=dict(ymodel_name="@jupytergis:widget", **comm_metadata),
73
- ydoc=ydoc,
64
+ comm_metadata={
65
+ "ymodel_name": "@jupytergis:widget",
66
+ **self._make_comm(path=path),
67
+ }
74
68
  )
75
69
 
76
70
  self.ydoc["layers"] = self._layers = Map()
@@ -79,21 +73,20 @@ class GISDocument(CommWidget):
79
73
  self.ydoc["layerTree"] = self._layerTree = Array()
80
74
  self.ydoc["metadata"] = self._metadata = Map()
81
75
 
82
- if path is None:
83
- if latitude is not None:
84
- self._options["latitude"] = latitude
85
- if longitude is not None:
86
- self._options["longitude"] = longitude
87
- if extent is not None:
88
- self._options["extent"] = extent
89
- if zoom is not None:
90
- self._options["zoom"] = zoom
91
- if bearing is not None:
92
- self._options["bearing"] = bearing
93
- if pitch is not None:
94
- self._options["pitch"] = pitch
95
- if projection is not None:
96
- self._options["projection"] = projection
76
+ if latitude is not None:
77
+ self._options["latitude"] = latitude
78
+ if longitude is not None:
79
+ self._options["longitude"] = longitude
80
+ if extent is not None:
81
+ self._options["extent"] = extent
82
+ if zoom is not None:
83
+ self._options["zoom"] = zoom
84
+ if bearing is not None:
85
+ self._options["bearing"] = bearing
86
+ if pitch is not None:
87
+ self._options["pitch"] = pitch
88
+ if projection is not None:
89
+ self._options["projection"] = projection
97
90
 
98
91
  @property
99
92
  def layers(self) -> Dict:
@@ -109,23 +102,29 @@ class GISDocument(CommWidget):
109
102
  """
110
103
  return self._layerTree.to_py()
111
104
 
112
- def save_as(self, path: str | Path) -> None:
113
- """Save the document at a new path."""
114
- if isinstance(path, str):
115
- path = Path(path)
116
-
117
- if path.name.lower().endswith(".qgz"):
118
- _export_to_qgis(path)
119
- self.path = path
120
- return
121
-
122
- if not path.name.lower().endswith(".jgis"):
123
- path = Path(str(path) + ".jGIS")
105
+ def sidecar(
106
+ self,
107
+ *,
108
+ title: str = "JupyterGIS sidecar",
109
+ anchor: Literal[
110
+ "split-right",
111
+ "split-left",
112
+ "split-top",
113
+ "split-bottom",
114
+ "tab-before",
115
+ "tab-after",
116
+ "right",
117
+ ] = "split-right",
118
+ ):
119
+ """Open the document in a new sidecar panel.
124
120
 
125
- path.write_text(json.dumps(self.to_py()))
126
- self.path = path
121
+ :param anchor: Where to position the new sidecar panel.
122
+ """
123
+ sidecar = Sidecar(title=title, anchor=anchor)
124
+ with sidecar:
125
+ display(self)
127
126
 
128
- def _export_to_qgis(self, path: str | Path) -> bool:
127
+ def export_to_qgis(self, path: str | Path) -> bool:
129
128
  # Lazy import, jupytergis_qgis of qgis may not be installed
130
129
  from jupytergis_qgis.qgis_loader import export_project_to_qgis
131
130
 
@@ -735,13 +734,13 @@ class GISDocument(CommWidget):
735
734
  layer["filters"]["appliedFilters"] = []
736
735
  self._layers[layer_id] = layer
737
736
 
738
- def _add_source(self, new_object: "JGISObject"):
739
- _id = str(uuid4())
737
+ def _add_source(self, new_object: "JGISObject", id: str | None = None) -> str:
738
+ _id = str(uuid4()) if id is None else id
740
739
  obj_dict = json.loads(new_object.json())
741
740
  self._sources[_id] = obj_dict
742
741
  return _id
743
742
 
744
- def _add_layer(self, new_object: "JGISObject"):
743
+ def _add_layer(self, new_object: "JGISObject") -> str:
745
744
  _id = str(uuid4())
746
745
  obj_dict = json.loads(new_object.json())
747
746
  self._layers[_id] = obj_dict
@@ -749,13 +748,11 @@ class GISDocument(CommWidget):
749
748
  return _id
750
749
 
751
750
  @classmethod
752
- def _path_to_comm(cls, filePath: Optional[str]) -> Dict:
753
- path = None
751
+ def _make_comm(cls, *, path: Optional[str]) -> Dict:
754
752
  format = None
755
753
  contentType = None
756
754
 
757
- if filePath is not None:
758
- path = filePath
755
+ if path is not None:
759
756
  file_name = Path(path).name
760
757
  try:
761
758
  ext = file_name.split(".")[1].lower()
@@ -773,8 +770,12 @@ class GISDocument(CommWidget):
773
770
  contentType = "QGS"
774
771
  else:
775
772
  raise ValueError("File extension is not supported!")
773
+
776
774
  return dict(
777
- path=path, format=format, contentType=contentType, create_ydoc=path is None
775
+ path=path,
776
+ format=format,
777
+ contentType=contentType,
778
+ create_ydoc=path is None,
778
779
  )
779
780
 
780
781
  def to_py(self) -> dict:
@@ -1,3 +1,3 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: schema
3
- # timestamp: 2025-04-08T07:03:18+00:00
3
+ # timestamp: 2025-04-25T14:14:35+00:00
@@ -1,3 +1,3 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: schema
3
- # timestamp: 2025-04-08T07:03:18+00:00
3
+ # timestamp: 2025-04-25T14:14:35+00:00
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: export/exportGeojson.json
3
- # timestamp: 2025-04-08T07:03:18+00:00
3
+ # timestamp: 2025-04-25T14:14:35+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: export/exportGeotiff.json
3
- # timestamp: 2025-04-08T07:03:18+00:00
3
+ # timestamp: 2025-04-25T14:14:35+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: geojson.json
3
- # timestamp: 2025-04-08T07:03:18+00:00
3
+ # timestamp: 2025-04-25T14:14:35+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: geojsonsource.json
3
- # timestamp: 2025-04-08T07:03:18+00:00
3
+ # timestamp: 2025-04-25T14:14:35+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,3 +1,3 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: schema
3
- # timestamp: 2025-04-08T07:03:18+00:00
3
+ # timestamp: 2025-04-25T14:14:35+00:00
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: processing/buffer.json
3
- # timestamp: 2025-04-08T07:03:18+00:00
3
+ # timestamp: 2025-04-25T14:14:35+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: processing/dissolve.json
3
- # timestamp: 2025-04-08T07:03:18+00:00
3
+ # timestamp: 2025-04-25T14:14:35+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,3 +1,3 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: schema
3
- # timestamp: 2025-04-08T07:03:18+00:00
3
+ # timestamp: 2025-04-25T14:14:35+00:00
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: project/jgis.json
3
- # timestamp: 2025-04-08T07:03:18+00:00
3
+ # timestamp: 2025-04-25T14:14:35+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -0,0 +1,3 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: schema
3
+ # timestamp: 2025-04-25T14:14:35+00:00