@geogirafe/lib-geoportal 1.2.0-dev.2813242211 → 1.2.0-dev.2829121016

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 (85) hide show
  1. package/api/apicontext.d.ts +4 -0
  2. package/api/apicontext.js +8 -0
  3. package/api/apigeogirafeapp.js +7 -5
  4. package/api/style.css +18 -1
  5. package/assets/i18n/de.json +1 -0
  6. package/assets/i18n/en.json +1 -0
  7. package/assets/i18n/fr.json +1 -0
  8. package/assets/i18n/it.json +1 -0
  9. package/assets/icons/theme-checked.svg +1 -0
  10. package/components/drawing/component.d.ts +9 -2
  11. package/components/drawing/component.js +27 -10
  12. package/components/drawing-toolbar/component.js +2 -2
  13. package/components/extlayers/component.d.ts +0 -1
  14. package/components/extlayers/component.js +1 -6
  15. package/components/main.d.ts +3 -1
  16. package/components/main.js +3 -1
  17. package/components/{map → map-2d}/component.d.ts +9 -24
  18. package/components/{map → map-2d}/component.js +28 -260
  19. package/components/map-2d/deprecatedmapcomponent.d.ts +15 -0
  20. package/components/map-2d/deprecatedmapcomponent.js +24 -0
  21. package/components/{map → map-2d}/style.css +0 -30
  22. package/components/{map → map-2d}/tools/swipemanager.d.ts +1 -1
  23. package/components/map-3d/component.d.ts +50 -0
  24. package/components/map-3d/component.js +139 -0
  25. package/components/map-3d/style.css +34 -0
  26. package/components/map-3d/tools/globe.d.ts +42 -0
  27. package/components/map-3d/tools/globe.js +198 -0
  28. package/components/search/component.d.ts +5 -0
  29. package/components/search/component.js +71 -19
  30. package/components/search/style.css +36 -9
  31. package/components/selectiontool/component.d.ts +2 -2
  32. package/components/selectiontool/component.js +2 -2
  33. package/components/treeview/style.css +4 -0
  34. package/components/treeview/treeviewgroup/component.js +1 -1
  35. package/components/treeview/treeviewitem/component.js +1 -1
  36. package/components/treeview/treeviewtheme/component.d.ts +2 -0
  37. package/components/treeview/treeviewtheme/component.js +18 -3
  38. package/package.json +1 -1
  39. package/styles/iframe.css +18 -1
  40. package/styles/index.css +18 -1
  41. package/styles/mobile.css +18 -1
  42. package/templates/iframe.html +4 -1
  43. package/templates/index.html +4 -1
  44. package/templates/mobile.html +4 -1
  45. package/templates/public/about.json +1 -1
  46. package/templates/vite.config.js +43 -25
  47. package/tools/app/geogirafeapp-mobile.js +7 -2
  48. package/tools/app/geogirafeapp.js +7 -2
  49. package/tools/context/context.d.ts +4 -0
  50. package/tools/context/context.js +8 -0
  51. package/tools/context/icontext.d.ts +4 -0
  52. package/tools/drawing/cesiumDrawing.d.ts +9 -5
  53. package/tools/drawing/cesiumDrawing.js +8 -8
  54. package/tools/drawing/olDrawing.d.ts +2 -2
  55. package/tools/drawing/olDrawing.js +1 -1
  56. package/tools/main.d.ts +2 -0
  57. package/tools/main.js +2 -0
  58. package/tools/selection/selectionmanager.d.ts +19 -0
  59. package/tools/selection/selectionmanager.js +80 -0
  60. package/tools/state/componentManager.d.ts +1 -1
  61. package/tools/tests/mockcontext.d.ts +4 -0
  62. package/tools/tests/mockcontext.js +8 -0
  63. package/tools/themes/themeshelper.d.ts +44 -1
  64. package/tools/themes/themeshelper.js +149 -16
  65. package/{components/map/tools → tools/wmts}/wmtsmanager.d.ts +4 -7
  66. package/{components/map/tools → tools/wmts}/wmtsmanager.js +7 -10
  67. /package/components/{map → map-2d}/tools/cogmanager.d.ts +0 -0
  68. /package/components/{map → map-2d}/tools/cogmanager.js +0 -0
  69. /package/components/{map → map-2d}/tools/contextmenu.d.ts +0 -0
  70. /package/components/{map → map-2d}/tools/contextmenu.js +0 -0
  71. /package/components/{map → map-2d}/tools/drawingmanager.d.ts +0 -0
  72. /package/components/{map → map-2d}/tools/drawingmanager.js +0 -0
  73. /package/components/{map → map-2d}/tools/focusfeature.d.ts +0 -0
  74. /package/components/{map → map-2d}/tools/focusfeature.js +0 -0
  75. /package/components/{map → map-2d}/tools/osmmanager.d.ts +0 -0
  76. /package/components/{map → map-2d}/tools/osmmanager.js +0 -0
  77. /package/components/{map → map-2d}/tools/swipemanager.js +0 -0
  78. /package/components/{map → map-2d}/tools/vectortilesmanager.d.ts +0 -0
  79. /package/components/{map → map-2d}/tools/vectortilesmanager.js +0 -0
  80. /package/components/{map → map-2d}/tools/viewmanager.d.ts +0 -0
  81. /package/components/{map → map-2d}/tools/viewmanager.js +0 -0
  82. /package/components/{map → map-2d}/tools/xyzmanager.d.ts +0 -0
  83. /package/components/{map → map-2d}/tools/xyzmanager.js +0 -0
  84. /package/components/{map → map-3d}/tools/wmsmanager3d.d.ts +0 -0
  85. /package/components/{map → map-3d}/tools/wmsmanager3d.js +0 -0
@@ -35,6 +35,7 @@
35
35
 
36
36
  .search-icon,
37
37
  .close-icon,
38
+ .theme-icon,
38
39
  .select-color-icon {
39
40
  width: 14px;
40
41
  color: var(--text-color);
@@ -70,6 +71,15 @@
70
71
  color: var(--text-color);
71
72
  }
72
73
 
74
+ .entry img {
75
+ margin-right: 1rem;
76
+ width: 0.8em;
77
+ }
78
+
79
+ .entry span {
80
+ text-transform: uppercase;
81
+ }
82
+
73
83
  .provider,
74
84
  .group {
75
85
  font-weight: 600;
@@ -88,26 +98,43 @@
88
98
  }
89
99
 
90
100
  .result {
101
+ border-top: solid 1px #ccc;
102
+ background: transparent;
103
+ width: 100%;
104
+ display: flex;
105
+ align-items: stretch;
106
+ padding: 0;
107
+ }
108
+
109
+ .result button {
110
+ padding: 0.3rem 1rem;
91
111
  cursor: pointer;
92
112
  border: none;
93
- border-top: solid 1px #ccc;
94
113
  background: transparent;
95
114
  text-align: left;
96
115
  width: 100%;
116
+ color: var(--text-color);
97
117
  }
98
118
 
99
- .entry img {
100
- margin-right: 1rem;
101
- width: 0.8em;
119
+ .result button:hover {
120
+ background-color: var(--bkg-color-grad2) !important;
121
+ color: var(--text-color);
102
122
  }
103
123
 
104
- .entry span {
105
- text-transform: uppercase;
124
+ .result .tools {
125
+ width: 1.3rem;
126
+ margin: 0;
106
127
  }
107
128
 
108
- .result.selected {
109
- background-color: var(--bkg-color-grad2) !important;
110
- color: var(--text-color);
129
+ .result .tools button {
130
+ margin: 0;
131
+ padding: 0 0.3rem;
132
+ height: -webkit-fill-available;
133
+ }
134
+
135
+ .result .tools button img {
136
+ margin: 0;
137
+ padding: 0;
111
138
  }
112
139
 
113
140
  #no-result {
@@ -1,7 +1,7 @@
1
1
  import GirafeHTMLElement from '../../base/GirafeHTMLElement.js';
2
2
  import { SelectionMode, SelectionTool } from '../../models/selection.js';
3
3
  import { Draw, Interaction } from 'ol/interaction.js';
4
- import MapComponent from '../map/component.js';
4
+ import Map2dComponent from '../map-2d/component.js';
5
5
  import { Style } from 'ol/style.js';
6
6
  import { FeatureLike } from 'ol/Feature.js';
7
7
  import IGirafePanel from '../../tools/state/igirafepanel.js';
@@ -31,7 +31,7 @@ export default class SelectionToolComponent extends GirafeHTMLElement implements
31
31
  defaultVertexStrokeWidth: number;
32
32
  };
33
33
  get map(): import("ol").Map;
34
- get mapComponent(): MapComponent;
34
+ get mapComponent(): Map2dComponent;
35
35
  private defaultStyle;
36
36
  private labelStyle;
37
37
  styleFunction: (featureLike: FeatureLike) => Style[];
@@ -3,7 +3,7 @@ import { html as uHtml } from 'uhtml';
3
3
  import GirafeHTMLElement from '../../base/GirafeHTMLElement.js';
4
4
  import { SelectionMode, SelectionTool } from '../../models/selection.js';
5
5
  import { Draw, Interaction } from 'ol/interaction.js';
6
- import MapComponent from '../map/component.js';
6
+ import Map2dComponent from '../map-2d/component.js';
7
7
  import { createBox } from 'ol/interaction/Draw.js';
8
8
  import { Circle, Fill, RegularShape, Stroke, Style, Text } from 'ol/style.js';
9
9
  import { LineString, Point } from 'ol/geom.js';
@@ -49,7 +49,7 @@ ${this.htmlUnsafe(this.feedbackTemplateHtml ?? '')}`;
49
49
  return this.context.mapManager.getMap();
50
50
  }
51
51
  get mapComponent() {
52
- return this.context.componentManager.getComponents(MapComponent)[0];
52
+ return this.context.componentManager.getComponents(Map2dComponent)[0];
53
53
  }
54
54
  defaultStyle;
55
55
  labelStyle;
@@ -10,6 +10,10 @@ header {
10
10
  display: none !important;
11
11
  }
12
12
 
13
+ .tool.visible {
14
+ display: flex !important;
15
+ }
16
+
13
17
  header:hover .tool {
14
18
  display: flex !important;
15
19
  }
@@ -8,7 +8,7 @@ class TreeViewGroupComponent extends TreeViewGroupElement {
8
8
  styleUrls = null;
9
9
  template = () => {
10
10
  return uHtml `<style>
11
- header{border-top:1px solid #ddd;align-items:center;height:2rem;display:flex}.tool{display:none!important}header:hover .tool{display:flex!important}.tool.active{order:100;opacity:1!important;display:flex!important}.label-container{flex-grow:1;align-items:center;display:flex;overflow:auto}.label-out-resolution span{font-style:italic}.resolution-tool{margin-left:.5rem}.legend{display:flex}.legend img{background:var(--svg-legend-bkg);height:fit-content;filter:var(--svg-map-filter)}.legend-icon{background:var(--svg-legend-bkg);max-height:1.5rem;filter:var(--svg-map-filter);margin-left:.5rem}.children{flex-basis:100%;order:10;padding-left:1.3rem}.dragAfter{border-bottom:1rem dashed #ccc}.dragBefore{border-top:1rem dashed #ccc}.gg-checkbox{width:1.2rem}.gg-caret,.gg-spacer{text-align:center;width:1.5rem;padding:0}.gg-caret{transform:scale(1.3)}.gg-caret.gg-rotate90{transform:scale(1.3)rotate(90deg)}.gg-small.gg-lock{min-width:1rem}.gg-opacity.gg-lock:hover{opacity:.5!important}.gg-tree-label{text-align:left;white-space:nowrap;text-overflow:ellipsis;padding-left:0;overflow:hidden}.gg-grab:hover{cursor:grab}.gg-selected{opacity:1}.legend-file{color:var(--text-color);font-style:italic;display:flex}@keyframes headerFade{0%{background-color:var(--highlight-color)}to{background-color:#0000}}.highlight{animation:3s ease-in-out forwards headerFade}
11
+ header{border-top:1px solid #ddd;align-items:center;height:2rem;display:flex}.tool{display:none!important}.tool.visible,header:hover .tool{display:flex!important}.tool.active{order:100;opacity:1!important;display:flex!important}.label-container{flex-grow:1;align-items:center;display:flex;overflow:auto}.label-out-resolution span{font-style:italic}.resolution-tool{margin-left:.5rem}.legend{display:flex}.legend img{background:var(--svg-legend-bkg);height:fit-content;filter:var(--svg-map-filter)}.legend-icon{background:var(--svg-legend-bkg);max-height:1.5rem;filter:var(--svg-map-filter);margin-left:.5rem}.children{flex-basis:100%;order:10;padding-left:1.3rem}.dragAfter{border-bottom:1rem dashed #ccc}.dragBefore{border-top:1rem dashed #ccc}.gg-checkbox{width:1.2rem}.gg-caret,.gg-spacer{text-align:center;width:1.5rem;padding:0}.gg-caret{transform:scale(1.3)}.gg-caret.gg-rotate90{transform:scale(1.3)rotate(90deg)}.gg-small.gg-lock{min-width:1rem}.gg-opacity.gg-lock:hover{opacity:.5!important}.gg-tree-label{text-align:left;white-space:nowrap;text-overflow:ellipsis;padding-left:0;overflow:hidden}.gg-grab:hover{cursor:grab}.gg-selected{opacity:1}.legend-file{color:var(--text-color);font-style:italic;display:flex}@keyframes headerFade{0%{background-color:var(--highlight-color)}to{background-color:#0000}}.highlight{animation:3s ease-in-out forwards headerFade}
12
12
  </style><style>
13
13
  .hidden{display:none!important}.gg-rotate90{transform:rotate(90deg)}.gg-rotate180{transform:rotate(180deg)}.gg-rotate270{transform:rotate(270deg)}img{filter:var(--svg-filter)}img.legend-image{filter:var(--svg-map-filter);background:var(--svg-legend-bkg)}div{scrollbar-width:thin}a,a:visited{color:var(--link-color)}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes spin-wait{0%{transform:rotate(0)}7%{transform:rotate(360deg)}to{transform:rotate(360deg)}}.gg-spin{animation-name:spin;animation-duration:2s;animation-timing-function:linear;animation-iteration-count:infinite}.gg-spin-wait{animation-name:spin-wait;animation-duration:10s;animation-timing-function:linear;animation-iteration-count:infinite}::-webkit-scrollbar{width:5px}::-webkit-scrollbar-thumb{background:#999}button,input,select,textarea{font:inherit}.gg-button,.gg-select,.gg-input,.gg-textarea{background-color:var(--bkg-color);color:var(--text-color);border:var(--app-standard-border);box-sizing:border-box;cursor:pointer;border-radius:3px;outline:0;margin:0;padding:0 0 0 .5rem;display:inline-block}.gg-label{background-color:var(--bkg-color);color:var(--text-color);border:none;align-items:center;margin:0;padding:0;display:flex}.gg-button,.gg-select,.gg-input,.gg-label{min-height:calc(var(--app-standard-height) / 1.5)}.gg-textarea{max-height:initial;resize:vertical;height:6rem;padding:.5rem;line-height:1.3rem}.gg-input{cursor:text}.gg-checkbox{accent-color:var(--text-color);width:1.2rem}.gg-range{accent-color:var(--text-color)}.gg-button{padding:0 .5rem}.gg-button.active{border:solid 1px var(--text-color-grad1);background-color:var(--bkg-color-grad2)}.gg-button:disabled{background-color:var(--bkg-color-grad1);color:var(--text-color-grad2);cursor:not-allowed;border:none}.gg-button:disabled img{filter:opacity(.6)}.gg-input:disabled,.gg-select:disabled,.gg-textarea:disabled{background-color:var(--bkg-color-grad1);color:var(--text-color-grad2);cursor:not-allowed}.gg-button>img{vertical-align:middle}.gg-icon-button{color:var(--text-color);cursor:pointer;background-color:#0000;border:none;flex-direction:column;justify-content:center;align-items:center;padding:0;display:flex}.gg-icon{justify-content:center;align-items:center;display:flex}.gg-big,.gg-big-withtext{min-width:var(--app-standard-height);min-height:var(--app-standard-height);max-height:var(--app-standard-height)}.gg-big img,.gg-big-withtext img{width:calc(var(--app-standard-height) - 1.5rem);margin:0}.gg-big-withtext span{font-variant:small-caps;padding:0 1rem;font-size:.9rem}.gg-medium,.gg-medium-withtext{min-width:calc(var(--app-standard-height) / 1.2);min-height:calc(var(--app-standard-height) / 1.2);max-height:calc(var(--app-standard-height) / 1.2);flex-direction:row}.gg-medium img{width:calc(var(--app-standard-height) / 2.4);margin:0}.gg-medium-withtext img{width:calc(var(--app-standard-height) / 2.4);margin-left:.5rem}.gg-medium-withtext span{padding:0 1rem 0 .5rem;font-size:.9rem}.gg-small,.gg-small-withtext{min-width:calc(var(--app-standard-height) / 2);min-height:calc(var(--app-standard-height) / 2);max-height:calc(var(--app-standard-height) / 2);flex-direction:row}.gg-small img{width:calc(var(--app-standard-height) / 3);margin:0}.gg-small-withtext img{width:calc(var(--app-standard-height) / 3);margin-left:.5rem}.gg-small-withtext span{padding:0 .5rem 0 .3rem;font-size:.9rem}.gg-button:hover:not(:disabled),.gg-select:hover:not(:disabled),.gg-input:hover:not(:disabled),.gg-textarea:hover:not(:disabled),.gg-icon-button:hover:not(:disabled){background-color:var(--bkg-color-grad1)}.gg-opacity{opacity:.5}.gg-opacity:hover{opacity:1;background-color:#0000}.gg-tabs{cursor:pointer;grid-auto-flow:column;padding-bottom:1rem;font-size:1rem;display:grid}.gg-tab{border:none;border-bottom:var(--app-standard-border);cursor:pointer;color:var(--text-color);background:0 0;padding:.5rem}.gg-tab.active{border-bottom:solid 1px var(--text-color)}.girafe-button-big,.girafe-button-large,.girafe-button-small,.girafe-button-tiny{color:var(--text-color);background-color:#0000;border:none;flex-direction:column;display:flex}.girafe-button-big:hover,.girafe-button-large:hover,.girafe-button-small:hover,.girafe-button-tiny:hover{background-color:var(--bkg-color-grad1);cursor:pointer}.girafe-button-big.dark,.girafe-button-large.dark,.girafe-button-small.dark,.girafe-button-tiny.dark{background-color:var(--bkg-color);filter:invert()}.girafe-button-big{width:var(--app-standard-height);height:var(--app-standard-height);align-items:center;padding:1rem}.girafe-button-big img{overflow:hidden}.girafe-button-large{flex-direction:row}.girafe-button-large img{height:2rem;margin:.3rem}.girafe-button-large span{height:2rem;margin:.3rem;line-height:2rem}.girafe-button-small{min-width:calc(var(--app-standard-height) / 2);height:calc(var(--app-standard-height) / 2);align-items:center;padding:.5rem}.girafe-button-small img{overflow:hidden}.girafe-button-small span{text-align:left;text-overflow:ellipsis;width:100%;overflow:hidden}.girafe-button-tiny{align-items:center;width:1rem;height:1rem;padding:0}.girafe-button-tiny img{overflow:hidden}.girafe-onboarding-theme{background-color:var(--bkg-color)!important;color:var(--text-color)!important}.girafe-onboarding-theme button{background-color:var(--bkg-color)!important;color:var(--text-color)!important;text-shadow:none!important}.girafe-onboarding-theme button.driver-popover-close-btn{z-index:10000}.tippy-box{background-color:var(--bkg-color)!important;border:var(--app-standard-border)!important}.tippy-content{color:var(--text-color)!important}.tippy-arrow{color:var(--bkg-color)!important}.tippy-box[data-theme~=error]{background-color:var(--error-color);white-space:pre-line}div.tippy-box[data-theme=image-popup]{border:var(--app-standard-border)!important;& div.tippy-content{background-color:var(--bkg-color)!important;& img{max-width:20rem;max-height:20rem}}& div.tippy-arrow{color:var(--bkg-color)!important}}
14
14
  </style>
@@ -14,7 +14,7 @@ class TreeViewItemComponent extends TreeViewElement {
14
14
  styleUrls = null;
15
15
  template = () => {
16
16
  return uHtml `<style>
17
- header{border-top:1px solid #ddd;align-items:center;height:2rem;display:flex}.tool{display:none!important}header:hover .tool{display:flex!important}.tool.active{order:100;opacity:1!important;display:flex!important}.label-container{flex-grow:1;align-items:center;display:flex;overflow:auto}.label-out-resolution span{font-style:italic}.resolution-tool{margin-left:.5rem}.legend{display:flex}.legend img{background:var(--svg-legend-bkg);height:fit-content;filter:var(--svg-map-filter)}.legend-icon{background:var(--svg-legend-bkg);max-height:1.5rem;filter:var(--svg-map-filter);margin-left:.5rem}.children{flex-basis:100%;order:10;padding-left:1.3rem}.dragAfter{border-bottom:1rem dashed #ccc}.dragBefore{border-top:1rem dashed #ccc}.gg-checkbox{width:1.2rem}.gg-caret,.gg-spacer{text-align:center;width:1.5rem;padding:0}.gg-caret{transform:scale(1.3)}.gg-caret.gg-rotate90{transform:scale(1.3)rotate(90deg)}.gg-small.gg-lock{min-width:1rem}.gg-opacity.gg-lock:hover{opacity:.5!important}.gg-tree-label{text-align:left;white-space:nowrap;text-overflow:ellipsis;padding-left:0;overflow:hidden}.gg-grab:hover{cursor:grab}.gg-selected{opacity:1}.legend-file{color:var(--text-color);font-style:italic;display:flex}@keyframes headerFade{0%{background-color:var(--highlight-color)}to{background-color:#0000}}.highlight{animation:3s ease-in-out forwards headerFade}
17
+ header{border-top:1px solid #ddd;align-items:center;height:2rem;display:flex}.tool{display:none!important}.tool.visible,header:hover .tool{display:flex!important}.tool.active{order:100;opacity:1!important;display:flex!important}.label-container{flex-grow:1;align-items:center;display:flex;overflow:auto}.label-out-resolution span{font-style:italic}.resolution-tool{margin-left:.5rem}.legend{display:flex}.legend img{background:var(--svg-legend-bkg);height:fit-content;filter:var(--svg-map-filter)}.legend-icon{background:var(--svg-legend-bkg);max-height:1.5rem;filter:var(--svg-map-filter);margin-left:.5rem}.children{flex-basis:100%;order:10;padding-left:1.3rem}.dragAfter{border-bottom:1rem dashed #ccc}.dragBefore{border-top:1rem dashed #ccc}.gg-checkbox{width:1.2rem}.gg-caret,.gg-spacer{text-align:center;width:1.5rem;padding:0}.gg-caret{transform:scale(1.3)}.gg-caret.gg-rotate90{transform:scale(1.3)rotate(90deg)}.gg-small.gg-lock{min-width:1rem}.gg-opacity.gg-lock:hover{opacity:.5!important}.gg-tree-label{text-align:left;white-space:nowrap;text-overflow:ellipsis;padding-left:0;overflow:hidden}.gg-grab:hover{cursor:grab}.gg-selected{opacity:1}.legend-file{color:var(--text-color);font-style:italic;display:flex}@keyframes headerFade{0%{background-color:var(--highlight-color)}to{background-color:#0000}}.highlight{animation:3s ease-in-out forwards headerFade}
18
18
  </style><style>
19
19
  .hidden{display:none!important}.gg-rotate90{transform:rotate(90deg)}.gg-rotate180{transform:rotate(180deg)}.gg-rotate270{transform:rotate(270deg)}img{filter:var(--svg-filter)}img.legend-image{filter:var(--svg-map-filter);background:var(--svg-legend-bkg)}div{scrollbar-width:thin}a,a:visited{color:var(--link-color)}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes spin-wait{0%{transform:rotate(0)}7%{transform:rotate(360deg)}to{transform:rotate(360deg)}}.gg-spin{animation-name:spin;animation-duration:2s;animation-timing-function:linear;animation-iteration-count:infinite}.gg-spin-wait{animation-name:spin-wait;animation-duration:10s;animation-timing-function:linear;animation-iteration-count:infinite}::-webkit-scrollbar{width:5px}::-webkit-scrollbar-thumb{background:#999}button,input,select,textarea{font:inherit}.gg-button,.gg-select,.gg-input,.gg-textarea{background-color:var(--bkg-color);color:var(--text-color);border:var(--app-standard-border);box-sizing:border-box;cursor:pointer;border-radius:3px;outline:0;margin:0;padding:0 0 0 .5rem;display:inline-block}.gg-label{background-color:var(--bkg-color);color:var(--text-color);border:none;align-items:center;margin:0;padding:0;display:flex}.gg-button,.gg-select,.gg-input,.gg-label{min-height:calc(var(--app-standard-height) / 1.5)}.gg-textarea{max-height:initial;resize:vertical;height:6rem;padding:.5rem;line-height:1.3rem}.gg-input{cursor:text}.gg-checkbox{accent-color:var(--text-color);width:1.2rem}.gg-range{accent-color:var(--text-color)}.gg-button{padding:0 .5rem}.gg-button.active{border:solid 1px var(--text-color-grad1);background-color:var(--bkg-color-grad2)}.gg-button:disabled{background-color:var(--bkg-color-grad1);color:var(--text-color-grad2);cursor:not-allowed;border:none}.gg-button:disabled img{filter:opacity(.6)}.gg-input:disabled,.gg-select:disabled,.gg-textarea:disabled{background-color:var(--bkg-color-grad1);color:var(--text-color-grad2);cursor:not-allowed}.gg-button>img{vertical-align:middle}.gg-icon-button{color:var(--text-color);cursor:pointer;background-color:#0000;border:none;flex-direction:column;justify-content:center;align-items:center;padding:0;display:flex}.gg-icon{justify-content:center;align-items:center;display:flex}.gg-big,.gg-big-withtext{min-width:var(--app-standard-height);min-height:var(--app-standard-height);max-height:var(--app-standard-height)}.gg-big img,.gg-big-withtext img{width:calc(var(--app-standard-height) - 1.5rem);margin:0}.gg-big-withtext span{font-variant:small-caps;padding:0 1rem;font-size:.9rem}.gg-medium,.gg-medium-withtext{min-width:calc(var(--app-standard-height) / 1.2);min-height:calc(var(--app-standard-height) / 1.2);max-height:calc(var(--app-standard-height) / 1.2);flex-direction:row}.gg-medium img{width:calc(var(--app-standard-height) / 2.4);margin:0}.gg-medium-withtext img{width:calc(var(--app-standard-height) / 2.4);margin-left:.5rem}.gg-medium-withtext span{padding:0 1rem 0 .5rem;font-size:.9rem}.gg-small,.gg-small-withtext{min-width:calc(var(--app-standard-height) / 2);min-height:calc(var(--app-standard-height) / 2);max-height:calc(var(--app-standard-height) / 2);flex-direction:row}.gg-small img{width:calc(var(--app-standard-height) / 3);margin:0}.gg-small-withtext img{width:calc(var(--app-standard-height) / 3);margin-left:.5rem}.gg-small-withtext span{padding:0 .5rem 0 .3rem;font-size:.9rem}.gg-button:hover:not(:disabled),.gg-select:hover:not(:disabled),.gg-input:hover:not(:disabled),.gg-textarea:hover:not(:disabled),.gg-icon-button:hover:not(:disabled){background-color:var(--bkg-color-grad1)}.gg-opacity{opacity:.5}.gg-opacity:hover{opacity:1;background-color:#0000}.gg-tabs{cursor:pointer;grid-auto-flow:column;padding-bottom:1rem;font-size:1rem;display:grid}.gg-tab{border:none;border-bottom:var(--app-standard-border);cursor:pointer;color:var(--text-color);background:0 0;padding:.5rem}.gg-tab.active{border-bottom:solid 1px var(--text-color)}.girafe-button-big,.girafe-button-large,.girafe-button-small,.girafe-button-tiny{color:var(--text-color);background-color:#0000;border:none;flex-direction:column;display:flex}.girafe-button-big:hover,.girafe-button-large:hover,.girafe-button-small:hover,.girafe-button-tiny:hover{background-color:var(--bkg-color-grad1);cursor:pointer}.girafe-button-big.dark,.girafe-button-large.dark,.girafe-button-small.dark,.girafe-button-tiny.dark{background-color:var(--bkg-color);filter:invert()}.girafe-button-big{width:var(--app-standard-height);height:var(--app-standard-height);align-items:center;padding:1rem}.girafe-button-big img{overflow:hidden}.girafe-button-large{flex-direction:row}.girafe-button-large img{height:2rem;margin:.3rem}.girafe-button-large span{height:2rem;margin:.3rem;line-height:2rem}.girafe-button-small{min-width:calc(var(--app-standard-height) / 2);height:calc(var(--app-standard-height) / 2);align-items:center;padding:.5rem}.girafe-button-small img{overflow:hidden}.girafe-button-small span{text-align:left;text-overflow:ellipsis;width:100%;overflow:hidden}.girafe-button-tiny{align-items:center;width:1rem;height:1rem;padding:0}.girafe-button-tiny img{overflow:hidden}.girafe-onboarding-theme{background-color:var(--bkg-color)!important;color:var(--text-color)!important}.girafe-onboarding-theme button{background-color:var(--bkg-color)!important;color:var(--text-color)!important;text-shadow:none!important}.girafe-onboarding-theme button.driver-popover-close-btn{z-index:10000}.tippy-box{background-color:var(--bkg-color)!important;border:var(--app-standard-border)!important}.tippy-content{color:var(--text-color)!important}.tippy-arrow{color:var(--bkg-color)!important}.tippy-box[data-theme~=error]{background-color:var(--error-color);white-space:pre-line}div.tippy-box[data-theme=image-popup]{border:var(--app-standard-border)!important;& div.tippy-content{background-color:var(--bkg-color)!important;& img{max-width:20rem;max-height:20rem}}& div.tippy-arrow{color:var(--bkg-color)!important}}
20
20
  </style>
@@ -10,5 +10,7 @@ declare class TreeViewThemeComponent extends TreeViewGroupElement {
10
10
  registerEvents(): void;
11
11
  protected connectedCallback(): void;
12
12
  deleteTheme(): void;
13
+ isThemeComplete(): boolean;
14
+ completeTheme(): void;
13
15
  }
14
16
  export default TreeViewThemeComponent;
@@ -12,12 +12,12 @@ class TreeViewThemeComponent extends TreeViewGroupElement {
12
12
  return uHtml `<style>
13
13
  .hidden{display:none!important}.gg-rotate90{transform:rotate(90deg)}.gg-rotate180{transform:rotate(180deg)}.gg-rotate270{transform:rotate(270deg)}img{filter:var(--svg-filter)}img.legend-image{filter:var(--svg-map-filter);background:var(--svg-legend-bkg)}div{scrollbar-width:thin}a,a:visited{color:var(--link-color)}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes spin-wait{0%{transform:rotate(0)}7%{transform:rotate(360deg)}to{transform:rotate(360deg)}}.gg-spin{animation-name:spin;animation-duration:2s;animation-timing-function:linear;animation-iteration-count:infinite}.gg-spin-wait{animation-name:spin-wait;animation-duration:10s;animation-timing-function:linear;animation-iteration-count:infinite}::-webkit-scrollbar{width:5px}::-webkit-scrollbar-thumb{background:#999}button,input,select,textarea{font:inherit}.gg-button,.gg-select,.gg-input,.gg-textarea{background-color:var(--bkg-color);color:var(--text-color);border:var(--app-standard-border);box-sizing:border-box;cursor:pointer;border-radius:3px;outline:0;margin:0;padding:0 0 0 .5rem;display:inline-block}.gg-label{background-color:var(--bkg-color);color:var(--text-color);border:none;align-items:center;margin:0;padding:0;display:flex}.gg-button,.gg-select,.gg-input,.gg-label{min-height:calc(var(--app-standard-height) / 1.5)}.gg-textarea{max-height:initial;resize:vertical;height:6rem;padding:.5rem;line-height:1.3rem}.gg-input{cursor:text}.gg-checkbox{accent-color:var(--text-color);width:1.2rem}.gg-range{accent-color:var(--text-color)}.gg-button{padding:0 .5rem}.gg-button.active{border:solid 1px var(--text-color-grad1);background-color:var(--bkg-color-grad2)}.gg-button:disabled{background-color:var(--bkg-color-grad1);color:var(--text-color-grad2);cursor:not-allowed;border:none}.gg-button:disabled img{filter:opacity(.6)}.gg-input:disabled,.gg-select:disabled,.gg-textarea:disabled{background-color:var(--bkg-color-grad1);color:var(--text-color-grad2);cursor:not-allowed}.gg-button>img{vertical-align:middle}.gg-icon-button{color:var(--text-color);cursor:pointer;background-color:#0000;border:none;flex-direction:column;justify-content:center;align-items:center;padding:0;display:flex}.gg-icon{justify-content:center;align-items:center;display:flex}.gg-big,.gg-big-withtext{min-width:var(--app-standard-height);min-height:var(--app-standard-height);max-height:var(--app-standard-height)}.gg-big img,.gg-big-withtext img{width:calc(var(--app-standard-height) - 1.5rem);margin:0}.gg-big-withtext span{font-variant:small-caps;padding:0 1rem;font-size:.9rem}.gg-medium,.gg-medium-withtext{min-width:calc(var(--app-standard-height) / 1.2);min-height:calc(var(--app-standard-height) / 1.2);max-height:calc(var(--app-standard-height) / 1.2);flex-direction:row}.gg-medium img{width:calc(var(--app-standard-height) / 2.4);margin:0}.gg-medium-withtext img{width:calc(var(--app-standard-height) / 2.4);margin-left:.5rem}.gg-medium-withtext span{padding:0 1rem 0 .5rem;font-size:.9rem}.gg-small,.gg-small-withtext{min-width:calc(var(--app-standard-height) / 2);min-height:calc(var(--app-standard-height) / 2);max-height:calc(var(--app-standard-height) / 2);flex-direction:row}.gg-small img{width:calc(var(--app-standard-height) / 3);margin:0}.gg-small-withtext img{width:calc(var(--app-standard-height) / 3);margin-left:.5rem}.gg-small-withtext span{padding:0 .5rem 0 .3rem;font-size:.9rem}.gg-button:hover:not(:disabled),.gg-select:hover:not(:disabled),.gg-input:hover:not(:disabled),.gg-textarea:hover:not(:disabled),.gg-icon-button:hover:not(:disabled){background-color:var(--bkg-color-grad1)}.gg-opacity{opacity:.5}.gg-opacity:hover{opacity:1;background-color:#0000}.gg-tabs{cursor:pointer;grid-auto-flow:column;padding-bottom:1rem;font-size:1rem;display:grid}.gg-tab{border:none;border-bottom:var(--app-standard-border);cursor:pointer;color:var(--text-color);background:0 0;padding:.5rem}.gg-tab.active{border-bottom:solid 1px var(--text-color)}.girafe-button-big,.girafe-button-large,.girafe-button-small,.girafe-button-tiny{color:var(--text-color);background-color:#0000;border:none;flex-direction:column;display:flex}.girafe-button-big:hover,.girafe-button-large:hover,.girafe-button-small:hover,.girafe-button-tiny:hover{background-color:var(--bkg-color-grad1);cursor:pointer}.girafe-button-big.dark,.girafe-button-large.dark,.girafe-button-small.dark,.girafe-button-tiny.dark{background-color:var(--bkg-color);filter:invert()}.girafe-button-big{width:var(--app-standard-height);height:var(--app-standard-height);align-items:center;padding:1rem}.girafe-button-big img{overflow:hidden}.girafe-button-large{flex-direction:row}.girafe-button-large img{height:2rem;margin:.3rem}.girafe-button-large span{height:2rem;margin:.3rem;line-height:2rem}.girafe-button-small{min-width:calc(var(--app-standard-height) / 2);height:calc(var(--app-standard-height) / 2);align-items:center;padding:.5rem}.girafe-button-small img{overflow:hidden}.girafe-button-small span{text-align:left;text-overflow:ellipsis;width:100%;overflow:hidden}.girafe-button-tiny{align-items:center;width:1rem;height:1rem;padding:0}.girafe-button-tiny img{overflow:hidden}.girafe-onboarding-theme{background-color:var(--bkg-color)!important;color:var(--text-color)!important}.girafe-onboarding-theme button{background-color:var(--bkg-color)!important;color:var(--text-color)!important;text-shadow:none!important}.girafe-onboarding-theme button.driver-popover-close-btn{z-index:10000}.tippy-box{background-color:var(--bkg-color)!important;border:var(--app-standard-border)!important}.tippy-content{color:var(--text-color)!important}.tippy-arrow{color:var(--bkg-color)!important}.tippy-box[data-theme~=error]{background-color:var(--error-color);white-space:pre-line}div.tippy-box[data-theme=image-popup]{border:var(--app-standard-border)!important;& div.tippy-content{background-color:var(--bkg-color)!important;& img{max-width:20rem;max-height:20rem}}& div.tippy-arrow{color:var(--bkg-color)!important}}
14
14
  </style><style>
15
- header{border-top:1px solid #ddd;align-items:center;height:2rem;display:flex}.tool{display:none!important}header:hover .tool{display:flex!important}.tool.active{order:100;opacity:1!important;display:flex!important}.label-container{flex-grow:1;align-items:center;display:flex;overflow:auto}.label-out-resolution span{font-style:italic}.resolution-tool{margin-left:.5rem}.legend{display:flex}.legend img{background:var(--svg-legend-bkg);height:fit-content;filter:var(--svg-map-filter)}.legend-icon{background:var(--svg-legend-bkg);max-height:1.5rem;filter:var(--svg-map-filter);margin-left:.5rem}.children{flex-basis:100%;order:10;padding-left:1.3rem}.dragAfter{border-bottom:1rem dashed #ccc}.dragBefore{border-top:1rem dashed #ccc}.gg-checkbox{width:1.2rem}.gg-caret,.gg-spacer{text-align:center;width:1.5rem;padding:0}.gg-caret{transform:scale(1.3)}.gg-caret.gg-rotate90{transform:scale(1.3)rotate(90deg)}.gg-small.gg-lock{min-width:1rem}.gg-opacity.gg-lock:hover{opacity:.5!important}.gg-tree-label{text-align:left;white-space:nowrap;text-overflow:ellipsis;padding-left:0;overflow:hidden}.gg-grab:hover{cursor:grab}.gg-selected{opacity:1}.legend-file{color:var(--text-color);font-style:italic;display:flex}@keyframes headerFade{0%{background-color:var(--highlight-color)}to{background-color:#0000}}.highlight{animation:3s ease-in-out forwards headerFade}
15
+ header{border-top:1px solid #ddd;align-items:center;height:2rem;display:flex}.tool{display:none!important}.tool.visible,header:hover .tool{display:flex!important}.tool.active{order:100;opacity:1!important;display:flex!important}.label-container{flex-grow:1;align-items:center;display:flex;overflow:auto}.label-out-resolution span{font-style:italic}.resolution-tool{margin-left:.5rem}.legend{display:flex}.legend img{background:var(--svg-legend-bkg);height:fit-content;filter:var(--svg-map-filter)}.legend-icon{background:var(--svg-legend-bkg);max-height:1.5rem;filter:var(--svg-map-filter);margin-left:.5rem}.children{flex-basis:100%;order:10;padding-left:1.3rem}.dragAfter{border-bottom:1rem dashed #ccc}.dragBefore{border-top:1rem dashed #ccc}.gg-checkbox{width:1.2rem}.gg-caret,.gg-spacer{text-align:center;width:1.5rem;padding:0}.gg-caret{transform:scale(1.3)}.gg-caret.gg-rotate90{transform:scale(1.3)rotate(90deg)}.gg-small.gg-lock{min-width:1rem}.gg-opacity.gg-lock:hover{opacity:.5!important}.gg-tree-label{text-align:left;white-space:nowrap;text-overflow:ellipsis;padding-left:0;overflow:hidden}.gg-grab:hover{cursor:grab}.gg-selected{opacity:1}.legend-file{color:var(--text-color);font-style:italic;display:flex}@keyframes headerFade{0%{background-color:var(--highlight-color)}to{background-color:#0000}}.highlight{animation:3s ease-in-out forwards headerFade}
16
16
  </style><style>
17
17
  header{border:none;flex-direction:row-reverse;margin-top:.5rem;margin-bottom:.5rem;position:relative}.theme-button{font-size:1.2rem;font-weight:600}.theme-button span{margin-left:.5rem}.theme-button:hover{cursor:default;background-color:#0000;border:none}.children{padding-left:.5rem}.children:first-child{border:none}.label-container{position:absolute;inset:0}.label-container button{text-align:center;flex-grow:1}.tool{z-index:1}
18
18
  </style>
19
19
  <style>${this.customStyle}</style>
20
- <link rel="stylesheet" href="lib/tippy.js/tippy.css"><link rel="stylesheet" href="lib/tippy.js/backdrop.css"><link rel="stylesheet" href="lib/tippy.js/border.css"><link rel="stylesheet" href="lib/tippy.js/svg-arrow.css"><div id="container"><header><div class="label-container"><button class="gg-icon-button gg-small theme-button" onclick="${() => this.layer.isExpanded = !this.layer.isExpanded}"><img alt="theme-icon" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NDAgNjQwIj48IS0tIUZvbnQgQXdlc29tZSBGcmVlIHY3LjAuMSBieSBAZm9udGF3ZXNvbWUgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbSBMaWNlbnNlIC0gaHR0cHM6Ly9mb250YXdlc29tZS5jb20vbGljZW5zZS9mcmVlIENvcHlyaWdodCAyMDI1IEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik01NzYgMTEyQzU3NiAxMDMuNyA1NzEuNyA5NiA1NjQuNyA5MS42QzU1Ny43IDg3LjIgNTQ4LjggODYuOCA1NDEuNCA5MC41TDQxNi41IDE1Mi4xTDI0NCA5My40QzIzMC4zIDg4LjcgMjE1LjMgODkuNiAyMDIuMSA5NS43TDc3LjggMTU0LjNDNjkuNCAxNTguMiA2NCAxNjYuNyA2NCAxNzZMNjQgNTI4QzY0IDUzNi4yIDY4LjIgNTQzLjkgNzUuMSA1NDguM0M4MiA1NTIuNyA5MC43IDU1My4yIDk4LjIgNTQ5LjdMMjI1LjUgNDg5LjhMMzk2LjIgNTQ2LjdDNDA5LjkgNTUxLjMgNDI0LjcgNTUwLjQgNDM3LjggNTQ0LjJMNTYyLjIgNDg1LjdDNTcwLjYgNDgxLjcgNTc2IDQ3My4zIDU3NiA0NjRMNTc2IDExMnpNMjA4IDE0Ni4xTDIwOCA0NDUuMUwxMTIgNDkwLjNMMTEyIDE5MS4zTDIwOCAxNDYuMXpNMjU2IDQ0OS40TDI1NiAxNDguM0wzODQgMTkxLjhMMzg0IDQ5Mi4xTDI1NiA0NDkuNHpNNDMyIDE5OEw1MjggMTUwLjZMNTI4IDQ0OC44TDQzMiA0OTRMNDMyIDE5OHoiLz48L3N2Zz4="> <span i18n="${this.layer.name}" class="gg-tree-label">${this.layer.name}</span></button></div><button class="${this.getButtonClass('removable')}" tip="Remove theme" onclick="${() => this.deleteTheme()}"><img alt="Remove theme" src="icons/trash.svg"></button> <button id="drag-button" class="${this.getButtonClass('draggable')}" tip="Move"><img alt="Move layer" src="icons/drag.svg"></button></header><div class="${((this.layer.isExpanded && this.layer.isVisible) ? 'children' : 'hidden')}">${this.sortedChildren().filter(layer => layer.isVisible).map(layer => (layer instanceof GroupLayer) ? uHtmlFor(layer, layer.treeItemId) `<girafe-tree-view-group groupid="${layer.treeItemId}"></girafe-tree-view-group>` : uHtmlFor(layer, layer.treeItemId) `<girafe-tree-view-item layerid="${layer.treeItemId}"></girafe-tree-view-item>`)}</div></div>
20
+ <link rel="stylesheet" href="lib/tippy.js/tippy.css"><link rel="stylesheet" href="lib/tippy.js/backdrop.css"><link rel="stylesheet" href="lib/tippy.js/border.css"><link rel="stylesheet" href="lib/tippy.js/svg-arrow.css"><div id="container"><header><div class="label-container"><button class="gg-icon-button gg-small theme-button" onclick="${() => this.layer.isExpanded = !this.layer.isExpanded}"><img alt="theme-icon" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NDAgNjQwIj48IS0tIUZvbnQgQXdlc29tZSBGcmVlIHY3LjAuMSBieSBAZm9udGF3ZXNvbWUgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbSBMaWNlbnNlIC0gaHR0cHM6Ly9mb250YXdlc29tZS5jb20vbGljZW5zZS9mcmVlIENvcHlyaWdodCAyMDI1IEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik01NzYgMTEyQzU3NiAxMDMuNyA1NzEuNyA5NiA1NjQuNyA5MS42QzU1Ny43IDg3LjIgNTQ4LjggODYuOCA1NDEuNCA5MC41TDQxNi41IDE1Mi4xTDI0NCA5My40QzIzMC4zIDg4LjcgMjE1LjMgODkuNiAyMDIuMSA5NS43TDc3LjggMTU0LjNDNjkuNCAxNTguMiA2NCAxNjYuNyA2NCAxNzZMNjQgNTI4QzY0IDUzNi4yIDY4LjIgNTQzLjkgNzUuMSA1NDguM0M4MiA1NTIuNyA5MC43IDU1My4yIDk4LjIgNTQ5LjdMMjI1LjUgNDg5LjhMMzk2LjIgNTQ2LjdDNDA5LjkgNTUxLjMgNDI0LjcgNTUwLjQgNDM3LjggNTQ0LjJMNTYyLjIgNDg1LjdDNTcwLjYgNDgxLjcgNTc2IDQ3My4zIDU3NiA0NjRMNTc2IDExMnpNMjA4IDE0Ni4xTDIwOCA0NDUuMUwxMTIgNDkwLjNMMTEyIDE5MS4zTDIwOCAxNDYuMXpNMjU2IDQ0OS40TDI1NiAxNDguM0wzODQgMTkxLjhMMzg0IDQ5Mi4xTDI1NiA0NDkuNHpNNDMyIDE5OEw1MjggMTUwLjZMNTI4IDQ0OC44TDQzMiA0OTRMNDMyIDE5OHoiLz48L3N2Zz4="> <span i18n="${this.layer.name}" class="gg-tree-label">${this.layer.name}</span></button></div>${this.isThemeComplete() ? '' : uHtml ` <button class="gg-icon-button gg-small tool visible theme-button" tip="Complete the theme" onclick="${() => this.completeTheme()}"><img alt="Complete the theme" src="icons/theme-checked.svg"></button> `} <button class="${this.getButtonClass('removable')}" tip="Remove theme" onclick="${() => this.deleteTheme()}"><img alt="Remove theme" src="icons/trash.svg"></button> <button id="drag-button" class="${this.getButtonClass('draggable')}" tip="Move"><img alt="Move layer" src="icons/drag.svg"></button></header><div class="${((this.layer.isExpanded && this.layer.isVisible) ? 'children' : 'hidden')}">${this.sortedChildren().filter(layer => layer.isVisible).map(layer => (layer instanceof GroupLayer) ? uHtmlFor(layer, layer.treeItemId) `<girafe-tree-view-group groupid="${layer.treeItemId}"></girafe-tree-view-group>` : uHtmlFor(layer, layer.treeItemId) `<girafe-tree-view-item layerid="${layer.treeItemId}"></girafe-tree-view-item>`)}</div></div>
21
21
  ${this.htmlUnsafe(this.feedbackTemplateHtml ?? '')}`;
22
22
  };
23
23
  layer;
@@ -37,7 +37,10 @@ ${this.htmlUnsafe(this.feedbackTemplateHtml ?? '')}`;
37
37
  registerEvents() {
38
38
  this.subscribe(/layers\.layersList\..*\.isExpanded/, (_oldValue, _newValue, theme) => this.refreshRender(theme));
39
39
  this.subscribe(/layers\.layersList\..*\.activeState/, (_oldValue, _newValue, theme) => this.refreshRender(theme));
40
- this.subscribe(/layers\.layersList\..*\.children/, (_oldValue, _newValue, group) => this.refreshRender(group));
40
+ this.subscribe(/layers\.layersList\..*\.children/, (_oldValue, _newValue, group) => {
41
+ this.refreshRender(group);
42
+ this.refreshRender(group.parent);
43
+ });
41
44
  this.subscribe(/layers\.layersList\..*\.filter/, (_oldValue, _newValue, layer) => this.refreshRender(layer));
42
45
  this.subscribe(/layers\.layersList\..*\.order/, (_oldValue, _newValue, layer) => {
43
46
  this.refreshRender(layer);
@@ -58,5 +61,17 @@ ${this.htmlUnsafe(this.feedbackTemplateHtml ?? '')}`;
58
61
  this.removeFromParent();
59
62
  this.state.themes.lastSelectedTheme = null;
60
63
  }
64
+ isThemeComplete() {
65
+ return this.context.themesHelper.isThemeComplete(this.layer);
66
+ }
67
+ completeTheme() {
68
+ const originalTheme = this.context.themesHelper.getOriginalTheme(this.layer);
69
+ if (originalTheme) {
70
+ this.context.themesHelper.completeTheme(originalTheme);
71
+ }
72
+ else {
73
+ console.error('Cannot complete theme, original theme not found.');
74
+ }
75
+ }
61
76
  }
62
77
  export default TreeViewThemeComponent;
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "name": "GeoGirafe PSC",
6
6
  "url": "https://doc.geogirafe.org"
7
7
  },
8
- "version": "1.2.0-dev.2813242211",
8
+ "version": "1.2.0-dev.2829121016",
9
9
  "type": "module",
10
10
  "engines": {
11
11
  "node": ">=20.19.0"
package/styles/iframe.css CHANGED
@@ -39,10 +39,27 @@ body {
39
39
  overflow-y: hidden;
40
40
  }
41
41
 
42
- girafe-map {
42
+ #maps {
43
43
  position: relative;
44
44
  width: 100%;
45
45
  height: 100%;
46
+ overflow: hidden;
47
+ }
48
+
49
+ girafe-map-2d {
50
+ display: block;
51
+ position: relative;
52
+ width: 100%;
53
+ height: 100%;
54
+ }
55
+
56
+ girafe-map-3d {
57
+ display: none;
58
+ position: absolute;
59
+ top: 0;
60
+ height: 100%;
61
+ overflow: hidden;
62
+ border-left: solid 3px #444;
46
63
  }
47
64
 
48
65
  girafe-basemap {
package/styles/index.css CHANGED
@@ -187,10 +187,27 @@ girafe-lr-panel > * {
187
187
  height: 100%;
188
188
  }
189
189
 
190
- girafe-map {
190
+ #maps {
191
191
  position: relative;
192
192
  width: 100%;
193
193
  flex-grow: 1;
194
+ overflow: hidden;
195
+ }
196
+
197
+ girafe-map-2d {
198
+ display: block;
199
+ position: relative;
200
+ width: 100%;
201
+ height: 100%;
202
+ }
203
+
204
+ girafe-map-3d {
205
+ display: none;
206
+ position: absolute;
207
+ top: 0;
208
+ height: 100%;
209
+ overflow: hidden;
210
+ border-left: solid 3px #444;
194
211
  }
195
212
 
196
213
  .info-area {
package/styles/mobile.css CHANGED
@@ -91,10 +91,27 @@ girafe-search {
91
91
  right: 0;
92
92
  }
93
93
 
94
- girafe-map {
94
+ #maps {
95
95
  position: relative;
96
96
  width: 100%;
97
97
  height: 100%;
98
+ overflow: hidden;
99
+ }
100
+
101
+ girafe-map-2d {
102
+ display: block;
103
+ position: relative;
104
+ width: 100%;
105
+ height: 100%;
106
+ }
107
+
108
+ girafe-map-3d {
109
+ display: none;
110
+ position: absolute;
111
+ top: 0;
112
+ height: 100%;
113
+ overflow: hidden;
114
+ border-left: solid 3px #444;
98
115
  }
99
116
 
100
117
  girafe-infobox {
@@ -111,7 +111,10 @@
111
111
 
112
112
  <div id="content">
113
113
  <div id="main">
114
- <girafe-map></girafe-map>
114
+ <div id="maps">
115
+ <girafe-map-2d></girafe-map-2d>
116
+ <girafe-map-3d></girafe-map-3d>
117
+ </div>
115
118
  <girafe-basemap></girafe-basemap>
116
119
  <girafe-search id="search"></girafe-search>
117
120
  </div>
@@ -134,7 +134,10 @@
134
134
  <girafe-tree-view slot="main"></girafe-tree-view>
135
135
  </girafe-lr-panel>
136
136
  <div id="content-map">
137
- <girafe-map></girafe-map>
137
+ <div id="maps">
138
+ <girafe-map-2d></girafe-map-2d>
139
+ <girafe-map-3d></girafe-map-3d>
140
+ </div>
138
141
  <div class="info-area">
139
142
  <girafe-basemap data-tour="basemap-selection"></girafe-basemap>
140
143
  <girafe-infobox></girafe-infobox>
@@ -92,7 +92,10 @@
92
92
  <girafe-search></girafe-search>
93
93
  <girafe-modals></girafe-modals>
94
94
  <div id="content">
95
- <girafe-map></girafe-map>
95
+ <div id="maps">
96
+ <girafe-map-2d></girafe-map-2d>
97
+ <girafe-map-3d></girafe-map-3d>
98
+ </div>
96
99
  <girafe-infobox></girafe-infobox>
97
100
  </div>
98
101
  <girafe-swipe-up-panel>
@@ -1 +1 @@
1
- {"version":"1.2.0-dev.2813242211", "build":"2813242211", "date":"02/09/2026"}
1
+ {"version":"1.2.0-dev.2829121016", "build":"2829121016", "date":"08/09/2026"}
@@ -74,31 +74,49 @@ export default defineConfig(({ command, mode }) => {
74
74
  api: resolve(__dirname, 'api.html')
75
75
  },
76
76
  output: {
77
- manualChunks: (id) => {
78
- // lazy loading for not priritary libraries
79
- const lazyDependencies = [
80
- '@geoblocks/mapfishprint',
81
- '@geoblocks/print',
82
- 'buffer',
83
- 'd3',
84
- 'error-stack-parser',
85
- 'file-saver',
86
- 'tabulator-tables',
87
- 'lz-string',
88
- 'qr-code-styling',
89
- 'source-map-js',
90
- 'tippy.js',
91
- 'vanilla-picker',
92
- 'driver.js'
93
- ];
94
- if (lazyDependencies.some((dep) => id.includes(`node_modules/${dep}`))) {
95
- return 'lazy';
96
- }
97
- // lazy loading for cesium dependencies
98
- const cesiumDependencies = ['cesium', 'olcs/OLCesium'];
99
- if (cesiumDependencies.some((dep) => id.includes(`node_modules/${dep}`))) {
100
- return 'cesium';
101
- }
77
+ codeSplitting: {
78
+ groups: [
79
+ // Dependencies that the application needs on startup and on which Cesium also depends
80
+ // (OpenLayers and dompurify). They need their own chunk, otherwise they end up in the
81
+ // (huge) cesium chunk, which would then have to be loaded on startup and would defeat
82
+ // the lazy loading of Cesium below.
83
+ // minSize: 0 prevents the group from being merged back into another chunk.
84
+ {
85
+ name: 'shared',
86
+ test: (id) => ['dompurify', 'ol'].some((dep) => id.includes(`node_modules/${dep}/`)),
87
+ priority: 30,
88
+ minSize: 0
89
+ },
90
+ // lazy loading for cesium dependencies
91
+ {
92
+ name: 'cesium',
93
+ test: (id) => ['cesium', 'olcs/OLCesium'].some((dep) => id.includes(`node_modules/${dep}`)),
94
+ priority: 20,
95
+ minSize: 0
96
+ },
97
+ // lazy loading for not priritary libraries
98
+ {
99
+ name: 'lazy',
100
+ test: (id) =>
101
+ [
102
+ '@geoblocks/mapfishprint',
103
+ '@geoblocks/print',
104
+ 'buffer',
105
+ 'd3',
106
+ 'error-stack-parser',
107
+ 'file-saver',
108
+ 'tabulator-tables',
109
+ 'lz-string',
110
+ 'qr-code-styling',
111
+ 'source-map-js',
112
+ 'tippy.js',
113
+ 'vanilla-picker',
114
+ 'driver.js'
115
+ ].some((dep) => id.includes(`node_modules/${dep}`)),
116
+ priority: 10,
117
+ minSize: 0
118
+ }
119
+ ]
102
120
  },
103
121
  entryFileNames: (chunkInfo) => {
104
122
  if (chunkInfo.name === 'api') {
@@ -8,7 +8,9 @@ import DrawingContainerMobile from '../../components/drawing-container-mobile/co
8
8
  import DrawingComponentMobile from '../../components/drawing/component-mobile.js';
9
9
  import GeolocationMobile from '../../components/geolocation-mobile/component.js';
10
10
  import InfoboxComponent from '../../components/infobox/component.js';
11
- import MapComponent from '../../components/map/component.js';
11
+ import Map2dComponent from '../../components/map-2d/component.js';
12
+ import DeprecatedMapComponent from '../../components/map-2d/deprecatedmapcomponent.js';
13
+ import Map3dComponent from '../../components/map-3d/component.js';
12
14
  import MenuMobile3dButton from '../../components/menu-buttons-mobile/MenuMobile3dButton.js';
13
15
  import MenuMobileDrawingButton from '../../components/menu-buttons-mobile/MenuMobileDrawingButton.js';
14
16
  import MenuMobileOfflineButton from '../../components/menu-buttons-mobile/MenuMobileOfflineButton.js';
@@ -44,7 +46,10 @@ export default class GeoGirafeAppMobile extends GeoGirafeApp {
44
46
  }
45
47
  defineCoreComponents() {
46
48
  customElements.define('girafe-infobox', InfoboxComponent);
47
- customElements.define('girafe-map', MapComponent);
49
+ customElements.define('girafe-map-2d', Map2dComponent);
50
+ customElements.define('girafe-map-3d', Map3dComponent);
51
+ // Deprecated alias of <girafe-map-2d>, kept for the applications that were not migrated yet.
52
+ customElements.define('girafe-map', DeprecatedMapComponent);
48
53
  customElements.define('girafe-search', MobileSearchComponent);
49
54
  customElements.define('girafe-offline', OfflineComponent);
50
55
  customElements.define('girafe-theme-select', MobileThemeComponent);
@@ -17,7 +17,9 @@ import InfoboxComponent from '../../components/infobox/component.js';
17
17
  import InfoWindowComponent from '../../components/infowindow/component.js';
18
18
  import LayoutComponent from '../../components/layout/component.js';
19
19
  import LRPanelComponent from '../../components/lr-panel/component.js';
20
- import MapComponent from '../../components/map/component.js';
20
+ import Map2dComponent from '../../components/map-2d/component.js';
21
+ import DeprecatedMapComponent from '../../components/map-2d/deprecatedmapcomponent.js';
22
+ import Map3dComponent from '../../components/map-3d/component.js';
21
23
  import MenuButtonComponent from '../../components/menubutton/component.js';
22
24
  import ModalsComponent from '../../components/modals/component.js';
23
25
  import NavigationComponent from '../../components/navigation/component.js';
@@ -116,7 +118,10 @@ export default class GeoGirafeApp {
116
118
  customElements.define('girafe-cross-section-settings', CrossSectionSettingsComponent);
117
119
  customElements.define('girafe-cross-section-view', CrossSectionViewComponent);
118
120
  customElements.define('girafe-lr-panel', LRPanelComponent);
119
- customElements.define('girafe-map', MapComponent);
121
+ customElements.define('girafe-map-2d', Map2dComponent);
122
+ customElements.define('girafe-map-3d', Map3dComponent);
123
+ // Deprecated alias of <girafe-map-2d>, kept for the applications that were not migrated yet.
124
+ customElements.define('girafe-map', DeprecatedMapComponent);
120
125
  customElements.define('girafe-menu-button', MenuButtonComponent);
121
126
  customElements.define('girafe-modals', ModalsComponent);
122
127
  customElements.define('girafe-nav-history', NavigationComponent);
@@ -29,6 +29,8 @@ import UrlManager from '../url/urlmanager.js';
29
29
  import UserDataManager from '../userdata/userdatamanager.js';
30
30
  import WfsManager from '../wfs/wfsmanager.js';
31
31
  import WmsManager from '../wms/wmsmanager.js';
32
+ import WmtsManager from '../wmts/wmtsmanager.js';
33
+ import SelectionManager from '../selection/selectionmanager.js';
32
34
  import IGirafeContext from './icontext.js';
33
35
  import ThemeFavoritesManager from '../themes/themefavoritesmanager.js';
34
36
  import SearchManager from '../search/searchmanager.js';
@@ -62,6 +64,8 @@ export default class GirafeContext implements IGirafeContext {
62
64
  readonly orderingManager: OrderingManager;
63
65
  readonly userLayerManager: UserLayerManager;
64
66
  readonly wmsManager: WmsManager;
67
+ readonly wmtsManager: WmtsManager;
68
+ readonly selectionManager: SelectionManager;
65
69
  readonly ogcApiFeaturesManager: OgcApiFeaturesManager;
66
70
  readonly localFileManager: LocalFileManager;
67
71
  readonly onBoardingManager: OnBoardingManager;
@@ -30,6 +30,8 @@ import UrlManager from '../url/urlmanager.js';
30
30
  import UserDataManager from '../userdata/userdatamanager.js';
31
31
  import WfsManager from '../wfs/wfsmanager.js';
32
32
  import WmsManager from '../wms/wmsmanager.js';
33
+ import WmtsManager from '../wmts/wmtsmanager.js';
34
+ import SelectionManager from '../selection/selectionmanager.js';
33
35
  import ThemeFavoritesManager from '../themes/themefavoritesmanager.js';
34
36
  import SearchManager from '../search/searchmanager.js';
35
37
  import FeedbackManager from '../feedback/feedbackmanager.js';
@@ -62,6 +64,8 @@ export default class GirafeContext {
62
64
  orderingManager;
63
65
  userLayerManager;
64
66
  wmsManager;
67
+ wmtsManager;
68
+ selectionManager;
65
69
  ogcApiFeaturesManager;
66
70
  localFileManager;
67
71
  onBoardingManager;
@@ -97,6 +101,8 @@ export default class GirafeContext {
97
101
  this.customThemesManager = new CustomThemesManager(this);
98
102
  this.themesManager = new ThemesManager(this);
99
103
  this.wmsManager = new WmsManager(this);
104
+ this.wmtsManager = new WmtsManager(this);
105
+ this.selectionManager = new SelectionManager(this);
100
106
  this.localFileManager = new LocalFileManager(this);
101
107
  this.ogcApiFeaturesManager = new OgcApiFeaturesManager(this);
102
108
  this.onBoardingManager = new OnBoardingManager(this);
@@ -136,7 +142,9 @@ export default class GirafeContext {
136
142
  this.customThemesManager.initializeSingleton();
137
143
  this.themesManager.initializeSingleton();
138
144
  this.wmsManager.initializeSingleton();
145
+ this.wmtsManager.initializeSingleton();
139
146
  this.localFileManager.initializeSingleton();
147
+ this.selectionManager.initializeSingleton();
140
148
  this.ogcApiFeaturesManager.initializeSingleton();
141
149
  this.onBoardingManager.initializeSingleton();
142
150
  this.themeFavoritesManager.initializeSingleton();
@@ -29,6 +29,8 @@ import UrlManager from '../url/urlmanager.js';
29
29
  import UserDataManager from '../userdata/userdatamanager.js';
30
30
  import WfsManager from '../wfs/wfsmanager.js';
31
31
  import WmsManager from '../wms/wmsmanager.js';
32
+ import WmtsManager from '../wmts/wmtsmanager.js';
33
+ import SelectionManager from '../selection/selectionmanager.js';
32
34
  import ThemeFavoritesManager from '../themes/themefavoritesmanager.js';
33
35
  import SearchManager from '../search/searchmanager.js';
34
36
  import FeedbackManager from '../feedback/feedbackmanager.js';
@@ -61,6 +63,8 @@ export default interface IGirafeContext {
61
63
  readonly orderingManager: OrderingManager;
62
64
  readonly userLayerManager: UserLayerManager;
63
65
  readonly wmsManager: WmsManager;
66
+ readonly wmtsManager: WmtsManager;
67
+ readonly selectionManager: SelectionManager;
64
68
  readonly ogcApiFeaturesManager: OgcApiFeaturesManager;
65
69
  readonly localFileManager: LocalFileManager;
66
70
  readonly onBoardingManager: OnBoardingManager;
@@ -1,20 +1,24 @@
1
- import MapComponent from '../../components/map/component.js';
1
+ import Map3dComponent from '../../components/map-3d/component.js';
2
2
  import IGirafeContext from '../context/icontext.js';
3
3
  export default class CesiumDrawing {
4
4
  private readonly stateLocation;
5
5
  private activeShapePoints;
6
6
  private activeShapes;
7
7
  private floatingPoint;
8
- private scene;
9
- private handler;
10
- private entities;
8
+ private readonly scene;
9
+ private readonly handler;
10
+ private readonly entities;
11
11
  private fixedLineLength;
12
12
  private drawingText;
13
13
  private readonly context;
14
14
  private get state();
15
15
  private get drawingState();
16
16
  private get config();
17
- constructor(map: MapComponent, stateLocation: string, context: IGirafeContext);
17
+ /**
18
+ * The 3D Map has to be loaded before creating a CesiumDrawing.
19
+ * This class is loaded on demand, so that Cesium stays out of the initial bundle.
20
+ */
21
+ constructor(map: Map3dComponent, stateLocation: string, context: IGirafeContext);
18
22
  setFixedLineLength(length: number): void;
19
23
  setDrawingText(text: string): void;
20
24
  /**