@jupytergis/base 0.13.2 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/lib/commands/BaseCommandIDs.d.ts +14 -13
  2. package/lib/commands/BaseCommandIDs.js +14 -14
  3. package/lib/commands/index.js +528 -130
  4. package/lib/commands/operationCommands.d.ts +22 -0
  5. package/lib/commands/operationCommands.js +305 -0
  6. package/lib/constants.js +11 -9
  7. package/lib/dialogs/ProcessingFormDialog.d.ts +1 -1
  8. package/lib/dialogs/ProcessingFormDialog.js +2 -2
  9. package/lib/dialogs/layerBrowserDialog.d.ts +2 -0
  10. package/lib/dialogs/layerBrowserDialog.js +12 -5
  11. package/lib/dialogs/layerCreationFormDialog.d.ts +7 -0
  12. package/lib/dialogs/layerCreationFormDialog.js +10 -2
  13. package/lib/dialogs/symbology/components/color_ramp/ColorRampControls.d.ts +2 -1
  14. package/lib/dialogs/symbology/components/color_ramp/ColorRampControls.js +21 -19
  15. package/lib/dialogs/symbology/components/color_ramp/ColorRampSelector.d.ts +3 -1
  16. package/lib/dialogs/symbology/components/color_ramp/ColorRampSelector.js +13 -5
  17. package/lib/dialogs/symbology/tiff_layer/types/SingleBandPseudoColor.js +6 -4
  18. package/lib/dialogs/symbology/vector_layer/types/Categorized.js +7 -11
  19. package/lib/dialogs/symbology/vector_layer/types/Graduated.js +7 -10
  20. package/lib/dialogs/symbology/vector_layer/types/Heatmap.js +7 -8
  21. package/lib/formbuilder/creationform.d.ts +8 -8
  22. package/lib/formbuilder/creationform.js +130 -85
  23. package/lib/formbuilder/editform.d.ts +1 -7
  24. package/lib/formbuilder/editform.js +64 -52
  25. package/lib/formbuilder/formselectors.d.ts +5 -4
  26. package/lib/formbuilder/index.d.ts +1 -1
  27. package/lib/formbuilder/index.js +1 -1
  28. package/lib/formbuilder/objectform/SchemaForm.d.ts +36 -0
  29. package/lib/formbuilder/objectform/SchemaForm.js +77 -0
  30. package/lib/formbuilder/objectform/StoryEditorForm.d.ts +3 -9
  31. package/lib/formbuilder/objectform/StoryEditorForm.js +20 -14
  32. package/lib/formbuilder/objectform/components/LayerSelect.js +3 -8
  33. package/lib/formbuilder/objectform/components/SegmentFormSymbology.js +23 -10
  34. package/lib/formbuilder/objectform/components/SourcePropertiesField.d.ts +7 -0
  35. package/lib/formbuilder/objectform/components/SourcePropertiesField.js +29 -0
  36. package/lib/formbuilder/objectform/components/StorySegmentReset.js +1 -1
  37. package/lib/formbuilder/objectform/fileselectorwidget.js +1 -1
  38. package/lib/formbuilder/objectform/layer/heatmapLayerForm.d.ts +3 -12
  39. package/lib/formbuilder/objectform/layer/heatmapLayerForm.js +87 -55
  40. package/lib/formbuilder/objectform/layer/hillshadeLayerForm.d.ts +3 -8
  41. package/lib/formbuilder/objectform/layer/hillshadeLayerForm.js +36 -10
  42. package/lib/formbuilder/objectform/layer/layerform.d.ts +7 -9
  43. package/lib/formbuilder/objectform/layer/layerform.js +33 -20
  44. package/lib/formbuilder/objectform/layer/storySegmentLayerForm.d.ts +3 -5
  45. package/lib/formbuilder/objectform/layer/storySegmentLayerForm.js +73 -29
  46. package/lib/formbuilder/objectform/layer/vectorlayerform.d.ts +3 -14
  47. package/lib/formbuilder/objectform/layer/vectorlayerform.js +36 -29
  48. package/lib/formbuilder/objectform/layer/webGlLayerForm.d.ts +3 -10
  49. package/lib/formbuilder/objectform/layer/webGlLayerForm.js +37 -13
  50. package/lib/formbuilder/objectform/process/dissolveProcessForm.d.ts +8 -18
  51. package/lib/formbuilder/objectform/process/dissolveProcessForm.js +68 -56
  52. package/lib/formbuilder/objectform/processingForm.d.ts +12 -0
  53. package/lib/formbuilder/objectform/processingForm.js +33 -0
  54. package/lib/formbuilder/objectform/schemaUtils.d.ts +16 -0
  55. package/lib/formbuilder/objectform/schemaUtils.js +59 -0
  56. package/lib/formbuilder/objectform/source/geojsonsource.d.ts +3 -19
  57. package/lib/formbuilder/objectform/source/geojsonsource.js +94 -53
  58. package/lib/formbuilder/objectform/source/geotiffsource.d.ts +3 -20
  59. package/lib/formbuilder/objectform/source/geotiffsource.js +73 -74
  60. package/lib/formbuilder/objectform/source/pathbasedsource.d.ts +3 -19
  61. package/lib/formbuilder/objectform/source/pathbasedsource.js +76 -75
  62. package/lib/formbuilder/objectform/source/sourceform.d.ts +7 -8
  63. package/lib/formbuilder/objectform/source/sourceform.js +28 -11
  64. package/lib/formbuilder/objectform/source/tilesourceform.d.ts +3 -7
  65. package/lib/formbuilder/objectform/source/tilesourceform.js +63 -53
  66. package/lib/formbuilder/objectform/useSchemaFormState.d.ts +48 -0
  67. package/lib/formbuilder/objectform/useSchemaFormState.js +35 -0
  68. package/lib/index.d.ts +0 -1
  69. package/lib/index.js +0 -1
  70. package/lib/keybindings.json +10 -10
  71. package/lib/mainview/mainView.d.ts +11 -7
  72. package/lib/mainview/mainView.js +63 -36
  73. package/lib/mainview/mainviewmodel.js +2 -2
  74. package/lib/menus.js +8 -8
  75. package/lib/panelview/components/layers.js +5 -2
  76. package/lib/panelview/objectproperties.js +2 -2
  77. package/lib/panelview/rightpanel.js +17 -2
  78. package/lib/panelview/story-maps/SpectaPanel.d.ts +15 -0
  79. package/lib/panelview/story-maps/SpectaPanel.js +35 -0
  80. package/lib/panelview/story-maps/StoryViewerPanel.d.ts +24 -9
  81. package/lib/panelview/story-maps/StoryViewerPanel.js +22 -268
  82. package/lib/panelview/story-maps/{PreviewModeSwitch.js → components/PreviewModeSwitch.js} +1 -1
  83. package/lib/panelview/story-maps/components/SpectaDesktopView.d.ts +21 -0
  84. package/lib/panelview/story-maps/components/SpectaDesktopView.js +49 -0
  85. package/lib/panelview/story-maps/components/SpectaMobileView.d.ts +17 -0
  86. package/lib/panelview/story-maps/{MobileSpectaPanel.js → components/SpectaMobileView.js} +8 -22
  87. package/lib/panelview/story-maps/{StoryNavBar.d.ts → components/StoryNavBar.d.ts} +1 -1
  88. package/lib/panelview/story-maps/{StoryNavBar.js → components/StoryNavBar.js} +2 -4
  89. package/lib/panelview/story-maps/hooks/useStoryMap.d.ts +39 -0
  90. package/lib/panelview/story-maps/hooks/useStoryMap.js +252 -0
  91. package/lib/processing/index.d.ts +2 -2
  92. package/lib/processing/index.js +62 -35
  93. package/lib/processing/processingCommands.d.ts +1 -1
  94. package/lib/processing/processingCommands.js +26 -6
  95. package/lib/shared/components/Collapsible.d.ts +6 -0
  96. package/lib/shared/components/Collapsible.js +26 -0
  97. package/lib/statusbar/SpectaPresentationProgressBar.d.ts +7 -0
  98. package/lib/statusbar/SpectaPresentationProgressBar.js +40 -0
  99. package/lib/toolbar/widget.js +4 -2
  100. package/lib/tools.d.ts +6 -0
  101. package/lib/tools.js +9 -0
  102. package/lib/types.d.ts +29 -2
  103. package/lib/widget.js +14 -2
  104. package/package.json +2 -4
  105. package/style/base.css +23 -1
  106. package/style/dialog.css +5 -0
  107. package/style/leftPanel.css +14 -37
  108. package/style/shared/button.css +0 -10
  109. package/style/shared/switch.css +8 -7
  110. package/style/spectaProgressBar.css +144 -0
  111. package/style/storyPanel.css +33 -0
  112. package/style/symbologyDialog.css +2 -2
  113. package/lib/formbuilder/objectform/baseform.d.ts +0 -91
  114. package/lib/formbuilder/objectform/baseform.js +0 -231
  115. package/lib/panelview/story-maps/MobileSpectaPanel.d.ts +0 -7
  116. /package/lib/panelview/story-maps/{PreviewModeSwitch.d.ts → components/PreviewModeSwitch.d.ts} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jupytergis/base",
3
- "version": "0.13.2",
3
+ "version": "0.14.0",
4
4
  "description": "A JupyterLab extension for 3D modelling.",
5
5
  "keywords": [
6
6
  "jupyter",
@@ -44,7 +44,7 @@
44
44
  "@jupyter/collaboration": "^4",
45
45
  "@jupyter/react-components": "^0.16.6",
46
46
  "@jupyter/ydoc": "^2.0.0 || ^3.0.0",
47
- "@jupytergis/schema": "^0.13.2",
47
+ "@jupytergis/schema": "^0.14.0",
48
48
  "@jupyterlab/application": "^4.3.0",
49
49
  "@jupyterlab/apputils": "^4.3.0",
50
50
  "@jupyterlab/completer": "^4.3.0",
@@ -93,7 +93,6 @@
93
93
  "styled-components": "^5.3.6",
94
94
  "three": "^0.135.0",
95
95
  "three-mesh-bvh": "^0.5.17",
96
- "uuid": "^11.0.3",
97
96
  "vaul": "^1.1.2"
98
97
  },
99
98
  "devDependencies": {
@@ -103,7 +102,6 @@
103
102
  "@types/node": "^18.15.11",
104
103
  "@types/proj4": "2.19.0",
105
104
  "@types/shpjs": "^3.4.7",
106
- "@types/uuid": "^10.0.0",
107
105
  "rimraf": "^3.0.2",
108
106
  "ts-patch": "^3.3.0",
109
107
  "typescript": "^5",
package/style/base.css CHANGED
@@ -10,6 +10,7 @@
10
10
  @import url('./filterPanel.css');
11
11
  @import url('./symbologyDialog.css');
12
12
  @import url('./statusBar.css');
13
+ @import url('./spectaProgressBar.css');
13
14
  @import url('./temporalSlider.css');
14
15
  @import url('./tabPanel.css');
15
16
  @import url('./stacBrowser.css');
@@ -141,7 +142,7 @@ button.jp-mod-styled.jp-mod-reject {
141
142
  gap: 0.5rem;
142
143
  position: absolute;
143
144
  bottom: 0.125rem;
144
- z-index: 1000;
145
+ z-index: 1;
145
146
  padding: 0 0.125rem;
146
147
  }
147
148
 
@@ -185,3 +186,24 @@ button.jp-mod-styled.jp-mod-reject {
185
186
  body[data-notebook='specta'] #main.jp-ThemedContainer {
186
187
  overflow: visible;
187
188
  }
189
+
190
+ .jgis-center-content {
191
+ text-align: center;
192
+ }
193
+
194
+ .jgis-bg-transparent {
195
+ background-color: transparent;
196
+ }
197
+
198
+ .jgis-bg-transparent:hover {
199
+ background-color: transparent;
200
+ }
201
+
202
+ .jgis-rotate-90 {
203
+ rotate: 0deg;
204
+ transition: rotate 150ms ease;
205
+ }
206
+
207
+ [data-state='open'] > .jgis-rotate-90 {
208
+ rotate: 90deg;
209
+ }
package/style/dialog.css CHANGED
@@ -6,3 +6,8 @@
6
6
  .jGIS-property-panel .rjsf .jp-select-wrapper select {
7
7
  background-image: unset;
8
8
  }
9
+
10
+ /* Collapse the form-group row that contains our hidden field marker */
11
+ .jp-root .form-group:has(.jGIS-hidden-field) {
12
+ display: none !important;
13
+ }
@@ -7,8 +7,7 @@
7
7
  min-height: 3em;
8
8
  }
9
9
 
10
- .jp-gis-layerItem,
11
- .jp-gis-source {
10
+ .jp-gis-layerItem {
12
11
  padding: 2px 0 2px 12px;
13
12
  }
14
13
 
@@ -37,8 +36,7 @@
37
36
  transform: rotate(0deg);
38
37
  }
39
38
 
40
- .jp-gis-layer,
41
- .jp-gis-source {
39
+ .jp-gis-layer {
42
40
  display: flex;
43
41
  flex-direction: row;
44
42
  /* align-items: center; */
@@ -46,76 +44,63 @@
46
44
  }
47
45
 
48
46
  .jp-gis-layer.jp-mod-selected,
49
- .jp-gis-source.jp-mod-selected,
50
47
  .jp-gis-layerGroupHeader.jp-mod-selected {
51
48
  color: var(--jp-ui-inverse-font-color1);
52
49
  background: var(--jp-brand-color1);
53
50
  }
54
51
 
55
- .jp-gis-layer:hover:not(.jp-mod-selected),
56
- .jp-gis-source:hover:not(.jp-mod-selected) {
52
+ .jp-gis-layer:hover:not(.jp-mod-selected) {
57
53
  cursor: pointer;
58
54
  background: var(--jp-layout-color2);
59
55
  }
60
56
 
61
57
  .jp-gis-layer.jp-mod-selected .jp-icon-selectable,
62
- .jp-gis-source.jp-mod-selected .jp-icon-selectable,
63
58
  .jp-gis-layerGroupHeader.jp-mod-selected .jp-icon-selectable {
64
59
  fill: var(--jp-ui-inverse-font-color1);
65
60
  }
66
- .jp-gis-layer.jp-mod-selected path,
67
- .jp-gis-source.jp-mod-selected path {
61
+ .jp-gis-layer.jp-mod-selected path {
68
62
  fill: var(--jp-ui-inverse-font-color1);
69
63
  }
70
- .jp-gis-layer.jp-mod-selected button:hover,
71
- .jp-gis-source.jp-mod-selected button:hover {
64
+ .jp-gis-layer.jp-mod-selected button:hover {
72
65
  background: none;
73
66
  }
74
67
 
75
- .jp-gis-layer button,
76
- .jp-gis-source button {
68
+ .jp-gis-layer button {
77
69
  min-height: unset;
78
70
  min-width: unset;
79
71
  padding: unset;
80
72
  margin-right: 4px;
81
73
  }
82
74
 
83
- .jp-gis-layer.jp-mod-selected button:hover .jp-icon-selectable,
84
- .jp-gis-source.jp-mod-selected button:hover .jp-icon-selectable {
75
+ .jp-gis-layer.jp-mod-selected button:hover .jp-icon-selectable {
85
76
  fill: var(--jp-ui-font-color1);
86
77
  }
87
78
 
88
- .jp-gis-layerIcon,
89
- .jp-gis-sourceIcon {
79
+ .jp-gis-layerIcon {
90
80
  display: flex;
91
81
  align-items: center;
92
82
  }
93
83
 
94
- .jp-gis-layerIcon > svg,
95
- .jp-gis-sourceIcon > svg {
84
+ .jp-gis-layerIcon > svg {
96
85
  height: 16px;
97
86
  width: 16px;
98
87
  }
99
88
 
100
- .jp-gis-layerTitle,
101
- .jp-gis-sourceTitle {
89
+ .jp-gis-layerTitle {
102
90
  display: flex;
103
91
  flex-grow: 1;
104
92
  align-items: center;
105
93
  }
106
94
 
107
- .jp-gis-layerText:focus,
108
- .jp-gis-sourceText:focus {
95
+ .jp-gis-layerText:focus {
109
96
  outline: none;
110
97
  }
111
98
 
112
- .jp-gis-layerTitle .jp-gis-layerIcon,
113
- .jp-gis-sourceTitle .jp-gis-sourceIcon {
99
+ .jp-gis-layerTitle .jp-gis-layerIcon {
114
100
  padding-right: 4px;
115
101
  }
116
102
 
117
- .jp-gis-layerIcon.jp-gis-mod-hidden path,
118
- .jp-gis-sourceIcon.jp-gis-mod-hidden path {
103
+ .jp-gis-layerIcon.jp-gis-mod-hidden path {
119
104
  fill: var(--jp-warn-color0);
120
105
  }
121
106
 
@@ -134,8 +119,7 @@
134
119
  border: 1px solid var(--jp-brand-color1);
135
120
  }
136
121
 
137
- .jp-gis-layerText,
138
- .jp-gis-sourceText {
122
+ .jp-gis-layerText {
139
123
  padding: 3px 0;
140
124
  cursor: pointer;
141
125
  flex-grow: 1;
@@ -162,13 +146,6 @@ li .lm-Menu-itemLabel {
162
146
  text-transform: capitalize;
163
147
  }
164
148
 
165
- .jp-gis-sourceInfo {
166
- font-size: var(--jp-ui-font-size0);
167
- font-style: italic;
168
- padding-left: 5px;
169
- color: var(--jp-ui-font-color2);
170
- }
171
-
172
149
  #jp-drag-indicator {
173
150
  top: calc(-1 * var(--jp-border-width) + 1px);
174
151
  left: calc(-1 * var(--jp-border-width));
@@ -124,9 +124,7 @@
124
124
  }
125
125
 
126
126
  .jgis-button[data-variant='icon'] {
127
- background-color: var(--jp-ui-font-color0);
128
127
  border: none;
129
- color: var(--jp-layout-color0);
130
128
  display: flex;
131
129
  align-items: center;
132
130
  justify-content: center;
@@ -136,14 +134,6 @@
136
134
  border-radius: 9999px;
137
135
  }
138
136
 
139
- .jgis-button[data-variant='icon']:hover {
140
- background-color: color-mix(
141
- in srgb,
142
- var(--jp-accent-color0),
143
- transparent 20%
144
- );
145
- }
146
-
147
137
  /* sizing */
148
138
  .jgis-button[data-size='sm'] {
149
139
  height: 2.25rem;
@@ -1,7 +1,8 @@
1
1
  .jgis-switch {
2
2
  display: inline-flex;
3
3
  height: 1.15rem;
4
- width: 2rem;
4
+ width: 2.5rem;
5
+ padding: 2px;
5
6
  flex-shrink: 0;
6
7
  align-items: center;
7
8
  border-radius: 9999px !important;
@@ -25,19 +26,19 @@
25
26
  }
26
27
 
27
28
  .jgis-switch[data-state='checked'] {
28
- background-color: var(--jp-accent-color0);
29
+ background-color: var(--jp-accent-color1);
29
30
  }
30
31
 
31
32
  .jgis-switch[data-state='unchecked'] {
32
- background-color: var(--jp-layout-color2);
33
+ background-color: var(--jp-layout-color3);
33
34
  }
34
35
 
35
36
  .jgis-switch-thumb {
36
37
  background-color: var(--jp-layout-color1);
37
38
  pointer-events: none;
38
39
  display: block;
39
- width: 1rem;
40
- height: 1rem;
40
+ width: 0.75rem;
41
+ height: 0.75rem;
41
42
  border-radius: 9999px;
42
43
  box-shadow: none;
43
44
  transition: transform 150ms cubic-bezier(0.4, 0, 0.2, 1);
@@ -45,11 +46,11 @@
45
46
  }
46
47
 
47
48
  .jgis-switch-thumb[data-state='checked'] {
48
- transform: translateX(calc(100% - 6px));
49
+ transform: translateX(1.4rem);
49
50
  }
50
51
 
51
52
  .jgis-switch-thumb[data-state='unchecked'] {
52
- transform: translateX(-2px);
53
+ transform: translateX(0);
53
54
  }
54
55
 
55
56
  @media (prefers-color-scheme: dark) {
@@ -0,0 +1,144 @@
1
+ /* Specta presentation progress bar (segment stepper) */
2
+
3
+ :root {
4
+ --jgis-specta-dot-fill-outer: var(--jp-accent-color0);
5
+ --jgis-specta-dot-fill-inner: var(--jp-accent-color3);
6
+ --jgis-specta-track-fill: color-mix(
7
+ in srgb,
8
+ var(--jp-accent-color1) 80%,
9
+ transparent
10
+ );
11
+ --jgis-specta-track-default: var(--jp-border-color0);
12
+ --jgis-specta-smooth: cubic-bezier(0, 0.72, 0.58, 1);
13
+ }
14
+
15
+ .jgis-specta-progress .jgis-specta-progress-bar {
16
+ display: flex;
17
+ flex-direction: row-reverse;
18
+ margin: auto auto 0;
19
+ width: 31.25rem;
20
+ max-width: 40%;
21
+ }
22
+
23
+ .jgis-specta-progress .jgis-specta-bar-segment {
24
+ display: flex;
25
+ flex-grow: 1;
26
+ position: relative;
27
+ align-items: center;
28
+ justify-content: center;
29
+ }
30
+
31
+ /* Track fill line; :not(:last-child) below adds width/position for the connector */
32
+ .jgis-specta-progress .jgis-specta-bar-segment::after {
33
+ content: '';
34
+ position: absolute;
35
+ height: 0.25rem;
36
+ top: calc(50% - 0.125rem);
37
+ transition: transform var(--jgis-specta-transition-duration, 0.06s)
38
+ var(--jgis-specta-smooth);
39
+ transform: scaleX(0);
40
+ background: var(--jgis-specta-track-fill);
41
+ transform-origin: left;
42
+ z-index: 5;
43
+ }
44
+
45
+ /* Filled state: track line + dot */
46
+ .jgis-specta-progress .jgis-specta-bar-segment[data-filled]::after {
47
+ transform: scaleX(1);
48
+ }
49
+
50
+ /* Connector bar only when there is a segment to the right */
51
+ .jgis-specta-progress .jgis-specta-bar-segment:not(:last-child)::before,
52
+ .jgis-specta-progress .jgis-specta-bar-segment:not(:last-child)::after {
53
+ content: '';
54
+ width: calc(100% - 1.5rem);
55
+ position: absolute;
56
+ right: calc(50% + 0.75rem);
57
+ }
58
+
59
+ .jgis-specta-progress .jgis-specta-bar-segment:not(:last-child)::before {
60
+ height: 0.5rem;
61
+ top: calc(50% - 0.25rem);
62
+ background: var(--jgis-specta-track-default);
63
+ }
64
+
65
+ .jgis-specta-progress .jgis-specta-bar-segment:not(:last-child)::after {
66
+ transition-delay: 0s;
67
+ }
68
+
69
+ /* Button = dot */
70
+ .jgis-specta-progress .jgis-specta-progress-input {
71
+ position: absolute;
72
+ top: 50%;
73
+ left: 50%;
74
+ transform: translate(-50%, -50%);
75
+ width: 1.875rem;
76
+ height: 1.875rem;
77
+ margin: 0;
78
+ padding: 0;
79
+ border: 3px solid var(--jgis-specta-track-default);
80
+ border-radius: 50%;
81
+ background: transparent;
82
+ cursor: pointer;
83
+ box-shadow:
84
+ inset 2px 2px 4px rgba(0, 0, 0, 0.3),
85
+ 2px 2px 8px rgba(0, 0, 0, 0.1);
86
+ box-sizing: border-box;
87
+ z-index: 2;
88
+ }
89
+
90
+ .jgis-specta-progress .jgis-specta-progress-input:focus-visible {
91
+ outline: 2px solid var(--jp-brand-color1);
92
+ outline-offset: 2px;
93
+ }
94
+
95
+ .jgis-specta-progress .jgis-specta-progress-input::before {
96
+ content: '';
97
+ position: absolute;
98
+ inset: 0;
99
+ border-radius: 50%;
100
+ background: radial-gradient(
101
+ circle at center,
102
+ var(--jgis-specta-dot-fill-inner),
103
+ var(--jgis-specta-dot-fill-outer)
104
+ );
105
+ transform: scale(0.3);
106
+ opacity: 0;
107
+ transition:
108
+ transform 0.2s var(--jgis-specta-smooth),
109
+ opacity 0.2s var(--jgis-specta-smooth);
110
+ pointer-events: none;
111
+ }
112
+
113
+ .jgis-specta-progress
114
+ .jgis-specta-bar-segment[data-filled]
115
+ .jgis-specta-progress-input::before {
116
+ transform: none;
117
+ opacity: 1;
118
+ }
119
+
120
+ /* Dot fill delay: 0 when going prev; after track duration when data-direction="next" */
121
+ .jgis-specta-progress
122
+ .jgis-specta-bar-segment:not(:last-child)
123
+ .jgis-specta-progress-input::before {
124
+ transition-delay: 0s;
125
+ }
126
+ .jgis-specta-progress[data-direction='next']
127
+ .jgis-specta-bar-segment:not(:last-child)
128
+ .jgis-specta-progress-input::before {
129
+ transition-delay: var(--jgis-specta-transition-duration, 0.3s);
130
+ }
131
+
132
+ .jgis-specta-progress {
133
+ box-sizing: border-box;
134
+ position: fixed;
135
+ bottom: 1.125rem;
136
+ width: 100%;
137
+ z-index: 40;
138
+ }
139
+
140
+ .jgis-specta-progress *,
141
+ .jgis-specta-progress *::before,
142
+ .jgis-specta-progress *::after {
143
+ box-sizing: inherit;
144
+ }
@@ -213,3 +213,36 @@
213
213
  bottom: 0.125rem;
214
214
  right: 0.125rem;
215
215
  }
216
+
217
+ /* Hierarchy: .form-group > .jp-FormGroup-content > .jp-objectFieldWrapper > #jgis-source-properties-field */
218
+ .form-group:has(
219
+ .jp-FormGroup-content .jp-objectFieldWrapper #jgis-source-properties-field
220
+ ) {
221
+ padding: 0;
222
+ }
223
+
224
+ /* #jgis-source-properties-field and .jGIS-property-panel are siblings; remove padding on the panel's outer wrapper */
225
+ .form-group:has(
226
+ .jp-FormGroup-content .jp-objectFieldWrapper #jgis-source-properties-field
227
+ ):has(.jGIS-property-panel)
228
+ .jGIS-property-panel
229
+ .jGIS-property-outer {
230
+ padding: 0;
231
+ }
232
+
233
+ .jp-arrayFieldWrapper legend {
234
+ border-bottom: none;
235
+ }
236
+
237
+ .jgis-symbology-override-list {
238
+ display: flex;
239
+ flex-direction: column;
240
+ gap: 1rem;
241
+ }
242
+
243
+ .jgis-symbology-override-collapsible-trigger {
244
+ display: flex;
245
+ gap: 1rem;
246
+ align-items: center;
247
+ cursor: pointer;
248
+ }
@@ -23,7 +23,7 @@ select option {
23
23
 
24
24
  .jp-gis-symbology-row label {
25
25
  font-size: var(--jp-ui-font-size2);
26
- flex: 0 1 20%;
26
+ flex: 0 1 auto;
27
27
  }
28
28
 
29
29
  .jp-gis-symbology-row > .jp-select-wrapper,
@@ -191,7 +191,7 @@ select option {
191
191
  }
192
192
 
193
193
  .jp-gis-color-ramp-entry:not(.jp-gis-selected-entry):hover .jp-gis-color-label {
194
- transform: scale(1.2);
194
+ transform: translateX(6px);
195
195
  }
196
196
 
197
197
  .jp-gis-color-canvas {
@@ -1,91 +0,0 @@
1
- import { IJupyterGISModel } from '@jupytergis/schema';
2
- import { Dialog } from '@jupyterlab/apputils';
3
- import { Signal } from '@lumino/signaling';
4
- import { IChangeEvent, ISubmitEvent } from '@rjsf/core';
5
- import { RJSFSchema, UiSchema } from '@rjsf/utils';
6
- import * as React from 'react';
7
- import { IDict } from "../../types";
8
- export interface IJupyterGISFormContext<TFormData = IDict | undefined> {
9
- model: IJupyterGISModel;
10
- formData: TFormData;
11
- }
12
- export interface IBaseFormStates {
13
- schema?: RJSFSchema;
14
- extraErrors?: any;
15
- }
16
- export interface IBaseFormProps {
17
- /**
18
- * The context of the form, whether it's for creating an object or updating its properties. This will have the effect of showing or not inputs for readonly properties.
19
- */
20
- formContext: 'update' | 'create';
21
- /**
22
- * The source data for filling the form
23
- */
24
- sourceData: IDict | undefined;
25
- /**
26
- * Path to the file
27
- */
28
- filePath?: string;
29
- /**
30
- * Current GIS model
31
- */
32
- model: IJupyterGISModel;
33
- /**
34
- * callback for syncing back the data into the model upon form submit
35
- * @param properties
36
- */
37
- syncData: (properties: IDict) => void;
38
- /**
39
- * The schema for the rjsf formk
40
- */
41
- schema?: IDict;
42
- /**
43
- * Ok signal. This is the signal sent by the parent dialog upon "Ok" button click. No ok button will be displayed if defined.
44
- */
45
- ok?: Signal<Dialog<any>, number>;
46
- /**
47
- * Cancel callback
48
- */
49
- cancel?: () => void;
50
- /**
51
- * A signal emitting when the form changed
52
- */
53
- formChangedSignal?: Signal<any, IDict<any>>;
54
- /**
55
- * A signal emitting when the form has extra errors, with a boolean whether there are some
56
- * extra errors or not.
57
- */
58
- formErrorSignal?: Signal<Dialog<any>, boolean>;
59
- }
60
- /**
61
- * Generate a form to edit a layer/source type. This class is meant to be sub-classed to create more refined forms for specific layers/sources.
62
- *
63
- * It will be up to the user of this class to actually perform the creation/edit using syncdata.
64
- */
65
- export declare class BaseForm extends React.Component<IBaseFormProps, IBaseFormStates> {
66
- /** Skip syncData for the initial onChange (RJSF populating form), only sync on user edits. */
67
- private isInitialLoadRef;
68
- constructor(props: IBaseFormProps);
69
- componentDidUpdate(prevProps: IBaseFormProps, prevState: IBaseFormStates): void;
70
- componentDidMount(): void;
71
- /**
72
- * Fills null/undefined values in data with schema defaults (mutates data).
73
- * @returns true if any null/undefined was replaced by a default
74
- */
75
- protected applySchemaDefaults(data: IDict<any> | undefined, schema: RJSFSchema): boolean;
76
- protected processSchema(data: IDict<any> | undefined, schema: RJSFSchema, uiSchema: UiSchema): void;
77
- /**
78
- * Remove a specific entry from the form. Can be used in subclasses if needed while under processSchema.
79
- * @param entry The entry name
80
- * @param data The form data
81
- * @param schema The form schema
82
- * @param uiSchema The form uiSchema
83
- */
84
- protected removeFormEntry(entry: string, data: IDict<any> | undefined, schema: RJSFSchema, uiSchema: UiSchema): void;
85
- protected syncData(properties: IDict<any> | undefined): void;
86
- protected onFormChange(e: IChangeEvent): void;
87
- protected onFormBlur(id: string, value: any): void;
88
- protected onFormSubmit(e: ISubmitEvent<any>): void;
89
- render(): React.ReactNode;
90
- protected currentFormData: IDict<any> | undefined;
91
- }