qwc2 2026.8.13 → 2026.8.21

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 (46) hide show
  1. package/README.md +1 -1
  2. package/components/AttributeTableWidget.js +121 -285
  3. package/components/BookmarkPanel.js +3 -2
  4. package/components/IdentifyViewer.js +39 -20
  5. package/components/ImportLayer.js +6 -392
  6. package/components/QtDesignerForm.js +1 -1
  7. package/components/ResizeableWindow.js +10 -0
  8. package/components/map3d/style/Map3D.css +1 -0
  9. package/components/style/AttributeTableWidget.css +1 -140
  10. package/components/widgets/FeaturesTable.js +30 -31
  11. package/components/widgets/MenuButton.js +10 -10
  12. package/components/widgets/TextInput.js +0 -10
  13. package/components/widgets/style/FeaturesTable.css +46 -19
  14. package/icons/public.svg +63 -0
  15. package/package.json +1 -1
  16. package/plugins/BottomBar.js +123 -111
  17. package/plugins/MapDropImport.js +135 -0
  18. package/plugins/map3d/Viewshed3D.js +171 -52
  19. package/plugins/map3d/style/Viewshed3D.css +4 -0
  20. package/plugins/style/BottomBar.css +10 -3
  21. package/plugins/style/MapDropImport.css +19 -0
  22. package/static/translations/bg-BG.json +8 -0
  23. package/static/translations/ca-ES.json +8 -0
  24. package/static/translations/cs-CZ.json +8 -0
  25. package/static/translations/de-CH.json +8 -0
  26. package/static/translations/de-DE.json +8 -0
  27. package/static/translations/en-US.json +8 -0
  28. package/static/translations/es-ES.json +8 -0
  29. package/static/translations/fi-FI.json +8 -0
  30. package/static/translations/fr-FR.json +8 -0
  31. package/static/translations/hu-HU.json +8 -0
  32. package/static/translations/it-IT.json +8 -0
  33. package/static/translations/ja-JP.json +8 -0
  34. package/static/translations/nl-NL.json +8 -0
  35. package/static/translations/no-NO.json +8 -0
  36. package/static/translations/pl-PL.json +8 -0
  37. package/static/translations/pt-BR.json +8 -0
  38. package/static/translations/pt-PT.json +8 -0
  39. package/static/translations/ro-RO.json +8 -0
  40. package/static/translations/ru-RU.json +8 -0
  41. package/static/translations/sv-SE.json +8 -0
  42. package/static/translations/tr-TR.json +8 -0
  43. package/static/translations/tsconfig.json +4 -0
  44. package/static/translations/uk-UA.json +8 -0
  45. package/utils/FileImportUtils.js +390 -0
  46. package/utils/LayerUtils.js +2 -2
@@ -36,132 +36,12 @@ div.attribtable-toolbar > * {
36
36
 
37
37
  div.attribtable-contents {
38
38
  flex: 1 1 auto;
39
+ height: 0;
39
40
  background-color: var(--list-bg-color);
40
- overflow: auto;
41
41
  border: 1px solid var(--border-color);
42
42
  position: relative;
43
43
  }
44
44
 
45
- table.attribtable-table th {
46
- position: sticky;
47
- top: 0;
48
- z-index: 2;
49
- padding: 0;
50
- background-color: var(--button-bg-color);
51
- color: var(--button-text-color);
52
- box-shadow: inset -1px 0 0 var(--border-color),
53
- inset 0 -1px 0 var(--border-color);
54
- overflow: hidden;
55
- }
56
-
57
- table.attribtable-table th:first-child {
58
- position: sticky;
59
- left: 0;
60
- z-index: 3;
61
- width: 2em;
62
- }
63
-
64
- table.attribtable-table th > span {
65
- margin: 0 0 -1px -1px;
66
- padding: 0.25em;
67
- display: flex;
68
- align-items: center;
69
- position: relative;
70
- }
71
-
72
- table.attribtable-table th > span > span.icon {
73
- position: absolute;
74
- right: 1px;
75
- background-color: var(--button-bg-color);
76
- flex: 0 0 auto;
77
- margin-left: 0.5em;
78
- }
79
-
80
- span.attribtable-table-headername {
81
- flex: 1 1 auto;
82
- text-align: left;
83
- display: flex;
84
- align-items: center;
85
- }
86
-
87
- table.attribtable-table tr:nth-child(even) {
88
- background-color: var(--list-item-bg-color-even);
89
- }
90
-
91
- table.attribtable-table tr:hover:not(.row-disabled) {
92
- background-color: var(--list-item-bg-color-hover);
93
- color: var(--list-item-text-color-hover);
94
- }
95
-
96
- table.attribtable-table td:first-child {
97
- background-color: var(--button-bg-color);
98
- color: var(--button-text-color);
99
- align-items: center;
100
- padding: 0.25em 0.5em;
101
- background-clip: padding-box;
102
- position: sticky;
103
- left: 0;
104
- z-index: 1;
105
- width: 2.5em;
106
- }
107
-
108
- table.attribtable-table td {
109
- min-width: 2.5em;;
110
- }
111
-
112
- span.attribtable-table-ldraghandle,
113
- span.attribtable-table-rdraghandle {
114
- touch-action: none;
115
- display: block;
116
- position: absolute;
117
- width: 4px;
118
- top: 0;
119
- bottom: 0;
120
- cursor: ew-resize;
121
- }
122
-
123
- span.attribtable-table-ldraghandle {
124
- left: -1px;
125
- }
126
-
127
- span.attribtable-table-rdraghandle {
128
- right: 0px;
129
- }
130
-
131
- span.attribtable-table-tdraghandle,
132
- span.attribtable-table-bdraghandle {
133
- touch-action: none;
134
- display: block;
135
- position: absolute;
136
- height: 4px;
137
- left: 0;
138
- right: 0;
139
- cursor: ns-resize;
140
- }
141
-
142
- span.attribtable-table-tdraghandle {
143
- top: -1px;
144
- }
145
-
146
- span.attribtable-table-bdraghandle {
147
- bottom: 0px;
148
- }
149
-
150
- table.attribtable-table {
151
- table-layout: fixed;
152
- min-width: 100%;
153
- }
154
-
155
- table.attribtable-table td {
156
- border: 1px solid var(--border-color);
157
- text-align: center;
158
- height: 2em;
159
- }
160
-
161
- table.attribtable-table td:first-child {
162
- border-left-width: 0;
163
- }
164
-
165
45
  table.attribtable-table td > input:not([type=checkbox]),
166
46
  table.attribtable-table td > select,
167
47
  table.attribtable-table td > div.TextInput,
@@ -219,22 +99,3 @@ body.nsresizing, body.nsresizing * {
219
99
  cursor: ns-resize!important;
220
100
  user-select: none;
221
101
  }
222
-
223
- div.attribtable-resize-line-vert,
224
- div.attribtable-resize-line-horiz {
225
- position: absolute;
226
- z-index: 2;
227
- background-color: var(--border-color);
228
- }
229
-
230
- div.attribtable-resize-line-vert {
231
- width: 4px;
232
- top: 0;
233
- bottom: 0;
234
- }
235
-
236
- div.attribtable-resize-line-horiz {
237
- height: 4px;
238
- left: 0;
239
- right: 0;
240
- }
@@ -41,7 +41,7 @@ import LocaleUtils from '../../utils/LocaleUtils';
41
41
  import MiscUtils from '../../utils/MiscUtils';
42
42
  import Icon from '../Icon';
43
43
  import './style/FeaturesTable.css';
44
- var FeaturesTable = /*#__PURE__*/function (_React$Component) {
44
+ var FeaturesTable = /*#__PURE__*/function (_React$PureComponent) {
45
45
  function FeaturesTable(props) {
46
46
  var _this;
47
47
  _classCallCheck(this, FeaturesTable);
@@ -49,7 +49,6 @@ var FeaturesTable = /*#__PURE__*/function (_React$Component) {
49
49
  _defineProperty(_this, "state", {
50
50
  sortField: null,
51
51
  sortedFeatures: null,
52
- hoveredFeature: null,
53
52
  selectedFeatures: {}
54
53
  });
55
54
  _defineProperty(_this, "sortBy", function (field) {
@@ -122,11 +121,13 @@ var FeaturesTable = /*#__PURE__*/function (_React$Component) {
122
121
  var origin = contentsEl.getBoundingClientRect()[resizeCol ? "left" : "top"];
123
122
  var resizeLine = document.createElement('div');
124
123
  if (resizeCol) {
125
- resizeLine.className = 'attribtable-resize-line-vert';
124
+ resizeLine.className = 'featurestable-resize-line-vert';
126
125
  resizeLine.style.left = resize.anchor - origin + contentsEl.scrollLeft + "px";
126
+ resizeLine.style.height = contentsEl.scrollHeight + "px";
127
127
  } else {
128
- resizeLine.className = 'attribtable-resize-line-horiz';
128
+ resizeLine.className = 'featurestable-resize-line-horiz';
129
129
  resizeLine.style.top = resize.anchor - origin + contentsEl.scrollTop + "px";
130
+ resizeLine.style.width = contentsEl.scrollWidth + "px";
130
131
  }
131
132
  contentsEl.appendChild(resizeLine);
132
133
  var resizeDo = resizeCol ? function (event) {
@@ -207,21 +208,20 @@ var FeaturesTable = /*#__PURE__*/function (_React$Component) {
207
208
  });
208
209
  });
209
210
  _defineProperty(_this, "onFeatureHoverIn", function (feature) {
210
- _this.setState({
211
- hoveredFeature: feature
212
- });
211
+ _this.hoveredFeature = feature;
212
+ _this.props.hoverChanged(feature);
213
213
  });
214
214
  _defineProperty(_this, "onFeatureHoverLeave", function (feature) {
215
- _this.setState(function (state) {
216
- return {
217
- hoveredFeature: state.hoveredFeature === feature ? null : state.hoveredFeature
218
- };
219
- });
215
+ if (_this.hoveredFeature === feature) {
216
+ _this.hoveredFeature = null;
217
+ _this.props.hoverChanged(null);
218
+ }
220
219
  });
221
220
  _this.table = null;
221
+ _this.hoveredFeature = null;
222
222
  return _this;
223
223
  }
224
- _inherits(FeaturesTable, _React$Component);
224
+ _inherits(FeaturesTable, _React$PureComponent);
225
225
  return _createClass(FeaturesTable, [{
226
226
  key: "componentDidUpdate",
227
227
  value: function componentDidUpdate(prevProps, prevState) {
@@ -245,9 +245,6 @@ var FeaturesTable = /*#__PURE__*/function (_React$Component) {
245
245
  return newState;
246
246
  });
247
247
  }
248
- if (this.state.hoveredFeature !== prevState.hoveredFeature || this.state.selectedFeatures !== prevState.selectedFeatures) {
249
- this.props.highlightFeatures(this.state.hoveredFeature ? [this.state.hoveredFeature] : Object.values(this.state.selectedFeatures));
250
- }
251
248
  if (this.state.selectedFeatures !== prevState.selectedFeatures) {
252
249
  var _this$props$selection, _this$props;
253
250
  (_this$props$selection = (_this$props = this.props).selectionChanged) === null || _this$props$selection === void 0 || _this$props$selection.call(_this$props, this.state.selectedFeatures);
@@ -259,17 +256,18 @@ var FeaturesTable = /*#__PURE__*/function (_React$Component) {
259
256
  var _this$state$sortedFea,
260
257
  _this3 = this;
261
258
  var features = (_this$state$sortedFea = this.state.sortedFeatures) !== null && _this$state$sortedFea !== void 0 ? _this$state$sortedFea : this.props.features;
262
- var fields = this.props.fields;
263
- var primaryKey = this.props.primaryKey;
264
- var showSelColumn = this.props.allowSelect;
265
- var showIdColumn = !this.props.hideIdColumn;
259
+ var fields = this.props.fields.filter(function (field) {
260
+ return field.id !== _this3.props.primaryKey;
261
+ });
266
262
  var pkfield = this.props.fields.find(function (field) {
267
- return field.name === pkfield;
263
+ return field.id === _this3.props.primaryKey;
268
264
  });
269
- var className = classNames({
265
+ var showSelColumn = this.props.allowSelect;
266
+ var showIdColumn = !this.props.hideIdColumn;
267
+ var className = classNames(_defineProperty({
270
268
  "featurestable": true,
271
269
  "featurestable-selectable": showSelColumn
272
- });
270
+ }, this.props.className, !!this.props.className));
273
271
  var selectAll = null;
274
272
  if (this.props.allowSelectAll) {
275
273
  var icon;
@@ -296,14 +294,14 @@ var FeaturesTable = /*#__PURE__*/function (_React$Component) {
296
294
  style: this.props.style
297
295
  }, /*#__PURE__*/React.createElement("thead", null, /*#__PURE__*/React.createElement("tr", null, showSelColumn ? /*#__PURE__*/React.createElement("th", null, selectAll) : null, showIdColumn ? /*#__PURE__*/React.createElement("th", {
298
296
  onClick: function onClick() {
299
- return _this3.sortBy(primaryKey);
297
+ return _this3.sortBy(pkfield.name);
300
298
  },
301
299
  onKeyDown: MiscUtils.checkKeyActivate,
302
300
  tabIndex: 0,
303
301
  title: pkfield.name
304
302
  }, /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement("span", {
305
303
  className: "featurestable-headername"
306
- }, pkfield.name), this.renderSortIndicator(primaryKey), this.renderColumnResizeHandle(showSelColumn, 'r'))) : null, fields.map(function (field, idx) {
304
+ }, pkfield.name), this.renderSortIndicator(pkfield.name), this.renderColumnResizeHandle(showSelColumn, 'r'))) : null, fields.map(function (field, idx) {
307
305
  return /*#__PURE__*/React.createElement("th", {
308
306
  key: field.id,
309
307
  onClick: function onClick() {
@@ -319,11 +317,11 @@ var FeaturesTable = /*#__PURE__*/function (_React$Component) {
319
317
  title: LocaleUtils.tr("attribtable.calculatedfield")
320
318
  }) : null), _this3.renderSortIndicator(field.id), idx < fields.length - 1 ? _this3.renderColumnResizeHandle(idx + showSelColumn + showIdColumn, 'r') : null));
321
319
  }))), /*#__PURE__*/React.createElement("tbody", null, features.map(function (feature, idx) {
322
- var _this3$props$rowIsDis, _this3$props;
320
+ var _this3$props$rowIsDis, _this3$props, _feature$id2;
323
321
  var disabled = _this3.props.readOnly || ((_this3$props$rowIsDis = (_this3$props = _this3.props).rowIsDisabled) === null || _this3$props$rowIsDis === void 0 ? void 0 : _this3$props$rowIsDis.call(_this3$props, idx));
324
322
  return /*#__PURE__*/React.createElement("tr", {
325
323
  className: disabled && !_this3.props.readOnly ? "row-disabled" : "",
326
- key: feature.id,
324
+ key: (_feature$id2 = feature.id) !== null && _feature$id2 !== void 0 ? _feature$id2 : "new",
327
325
  onMouseEnter: function onMouseEnter() {
328
326
  return _this3.onFeatureHoverIn(feature);
329
327
  },
@@ -335,22 +333,23 @@ var FeaturesTable = /*#__PURE__*/function (_React$Component) {
335
333
  onClick: function onClick() {
336
334
  return _this3.toggleFeatureSelected(feature);
337
335
  }
338
- }), _this3.renderRowResizeHandle(idx + 1, 'b'))) : null, showIdColumn ? /*#__PURE__*/React.createElement("td", null, feature.id) : null, fields.map(function (field) {
336
+ }), _this3.renderRowResizeHandle(idx + 1, 'b'))) : null, showIdColumn ? /*#__PURE__*/React.createElement("td", null, _this3.props.renderField(feature, pkfield, idx, disabled)) : null, fields.map(function (field) {
339
337
  return /*#__PURE__*/React.createElement("td", {
340
338
  key: field.id
341
- }, _this3.props.renderField(feature, field));
339
+ }, _this3.props.renderField(feature, field, idx, disabled));
342
340
  }));
343
341
  }))));
344
342
  }
345
343
  }]);
346
- }(React.Component);
344
+ }(React.PureComponent);
347
345
  _defineProperty(FeaturesTable, "propTypes", {
348
346
  allowSelect: PropTypes.bool,
349
347
  allowSelectAll: PropTypes.bool,
348
+ className: PropTypes.string,
350
349
  features: PropTypes.array,
351
350
  fields: PropTypes.array,
352
351
  hideIdColumn: PropTypes.bool,
353
- highlightFeatures: PropTypes.func,
352
+ hoverChanged: PropTypes.func,
354
353
  onSort: PropTypes.func,
355
354
  primaryKey: PropTypes.string,
356
355
  readOnly: PropTypes.bool,
@@ -28,13 +28,15 @@ var MenuButton = /*#__PURE__*/function (_React$Component) {
28
28
  popup: false,
29
29
  selected: null
30
30
  });
31
- _defineProperty(_this, "onMenuClicked", function () {
31
+ _defineProperty(_this, "onMenuClicked", function (ev) {
32
32
  if (!_this.props.disabled) {
33
- _this.setState(function (state) {
34
- return {
35
- popup: !state.popup
36
- };
37
- });
33
+ if (!_this.state.selected || !ev.currentTarget.querySelector('.menubutton-button-content').contains(ev.target)) {
34
+ _this.setState(function (state) {
35
+ return {
36
+ popup: !state.popup
37
+ };
38
+ });
39
+ }
38
40
  }
39
41
  });
40
42
  _defineProperty(_this, "onButtonClicked", function () {
@@ -44,8 +46,6 @@ var MenuButton = /*#__PURE__*/function (_React$Component) {
44
46
  _this.setState({
45
47
  popup: false
46
48
  });
47
- } else {
48
- _this.onMenuClicked();
49
49
  }
50
50
  });
51
51
  _defineProperty(_this, "onChildClicked", function (ev, child) {
@@ -111,6 +111,7 @@ var MenuButton = /*#__PURE__*/function (_React$Component) {
111
111
  className: classes
112
112
  }, /*#__PURE__*/React.createElement("div", {
113
113
  className: buttonClassnames,
114
+ onClick: this.onMenuClicked,
114
115
  onKeyDown: MiscUtils.checkKeyActivate,
115
116
  ref: function ref(el) {
116
117
  _this2.el = el;
@@ -120,8 +121,7 @@ var MenuButton = /*#__PURE__*/function (_React$Component) {
120
121
  className: "menubutton-button-content",
121
122
  onClick: this.onButtonClicked
122
123
  }, buttonContents), /*#__PURE__*/React.createElement("span", {
123
- className: "menubotton-button-arrow",
124
- onClick: this.onMenuClicked
124
+ className: "menubotton-button-arrow"
125
125
  }, /*#__PURE__*/React.createElement(Icon, {
126
126
  icon: "chevron-down"
127
127
  })), this.props.tooltip ? /*#__PURE__*/React.createElement("span", {
@@ -30,7 +30,6 @@ import LocaleUtils from '../../utils/LocaleUtils';
30
30
  import MiscUtils from '../../utils/MiscUtils';
31
31
  import Icon from '../Icon';
32
32
  import './style/TextInput.css';
33
- export var TextInputInitContext = /*#__PURE__*/React.createContext(null);
34
33
  var TextInput = /*#__PURE__*/function (_React$Component) {
35
34
  function TextInput(props) {
36
35
  var _this;
@@ -51,10 +50,8 @@ var TextInput = /*#__PURE__*/function (_React$Component) {
51
50
  });
52
51
  _defineProperty(_this, "storeRef", function (el) {
53
52
  if (el) {
54
- var _this$context, _this$context$notifyR;
55
53
  _this.input = el;
56
54
  _this.setDefaultValue(_this.state.value, _this.state.valueRev, -1);
57
- (_this$context = _this.context) === null || _this$context === void 0 || (_this$context$notifyR = _this$context.notifyReady) === null || _this$context$notifyR === void 0 || _this$context$notifyR.call(_this$context, _this.id);
58
55
  if (_this.props.focusOnRef) {
59
56
  el.focus();
60
57
  }
@@ -224,12 +221,6 @@ var TextInput = /*#__PURE__*/function (_React$Component) {
224
221
  }
225
222
  _inherits(TextInput, _React$Component);
226
223
  return _createClass(TextInput, [{
227
- key: "componentDidMount",
228
- value: function componentDidMount() {
229
- var _this$context2, _this$context2$regist;
230
- (_this$context2 = this.context) === null || _this$context2 === void 0 || (_this$context2$regist = _this$context2.register) === null || _this$context2$regist === void 0 || _this$context2$regist.call(_this$context2, this.id);
231
- }
232
- }, {
233
224
  key: "componentDidUpdate",
234
225
  value: function componentDidUpdate(prevProps, prevState) {
235
226
  this.setDefaultValue(this.state.value, this.state.valueRev, prevState.valueRev);
@@ -313,7 +304,6 @@ var TextInput = /*#__PURE__*/function (_React$Component) {
313
304
  }
314
305
  }]);
315
306
  }(React.Component);
316
- _defineProperty(TextInput, "contextType", TextInputInitContext);
317
307
  _defineProperty(TextInput, "propTypes", {
318
308
  addLinkAnchors: PropTypes.bool,
319
309
  className: PropTypes.string,
@@ -3,6 +3,12 @@ div.featurestable-frame {
3
3
  overflow: auto;
4
4
  border: 1px solid var(--border-color);
5
5
  position: relative;
6
+ height: 100%;
7
+ }
8
+
9
+ table.featurestable {
10
+ table-layout: fixed;
11
+ min-width: 100%;
6
12
  }
7
13
 
8
14
  table.featurestable th {
@@ -12,11 +18,19 @@ table.featurestable th {
12
18
  padding: 0;
13
19
  background-color: var(--button-bg-color);
14
20
  color: var(--button-text-color);
15
- box-shadow: inset -1px 0 0 var(--border-color),
16
- inset 0 -1px 0 var(--border-color);
21
+ border: 1px solid var(--border-color);
17
22
  overflow: hidden;
18
23
  }
19
24
 
25
+ table.featurestable th::after {
26
+ content: "";
27
+ position: absolute;
28
+ bottom: 0;
29
+ left: 0;
30
+ right: 0;
31
+ border-bottom: 1px solid var(--border-color);
32
+ }
33
+
20
34
  table.featurestable-selectable th:first-child {
21
35
  position: sticky;
22
36
  left: 0;
@@ -36,7 +50,6 @@ table.featurestable th > span > span.icon {
36
50
  position: absolute;
37
51
  right: 1px;
38
52
  background-color: var(--button-bg-color);
39
- height: 100%;
40
53
  flex: 0 0 auto;
41
54
  margin-left: 0.5em;
42
55
  }
@@ -60,17 +73,28 @@ table.featurestable tr:hover:not(.row-disabled) {
60
73
  table.featurestable-selectable td:first-child {
61
74
  background-color: var(--button-bg-color);
62
75
  color: var(--button-text-color);
63
- align-items: center;
64
76
  padding: 0.25em 0.5em;
65
- background-clip: padding-box;
66
77
  position: sticky;
67
78
  left: 0;
68
79
  z-index: 1;
69
80
  width: 2.5em;
70
81
  }
71
82
 
83
+ table.featurestable-selectable th:first-child::after,
84
+ table.featurestable-selectable td:first-child::after {
85
+ content: "";
86
+ position: absolute;
87
+ right: 0;
88
+ top: 0;
89
+ bottom: 0;
90
+ border-right: 1px solid var(--border-color);
91
+ }
92
+
72
93
  table.featurestable td {
73
- min-width: 2.5em;;
94
+ min-width: 2.5em;
95
+ border: 1px solid var(--border-color);
96
+ text-align: center;
97
+ height: 2em;
74
98
  }
75
99
 
76
100
  span.featurestable-ldraghandle,
@@ -111,23 +135,26 @@ span.featurestable-bdraghandle {
111
135
  bottom: 0px;
112
136
  }
113
137
 
114
- table.featurestable {
115
- table-layout: fixed;
116
- min-width: 100%;
138
+ table.featurestable span.icon-checked::before,
139
+ table.featurestable span.icon-unchecked::before,
140
+ table.featurestable span.icon-tristate::before {
141
+ background-color: white;
117
142
  }
118
143
 
119
- table.featurestable td {
120
- border: 1px solid var(--border-color);
121
- text-align: center;
122
- height: 2em;
144
+
145
+ div.featurestable-resize-line-vert,
146
+ div.featurestable-resize-line-horiz {
147
+ position: absolute;
148
+ z-index: 2;
149
+ background-color: var(--border-color);
123
150
  }
124
151
 
125
- table.featurestable td:first-child {
126
- border-left-width: 0;
152
+ div.featurestable-resize-line-vert {
153
+ width: 4px;
154
+ top: 0;
127
155
  }
128
156
 
129
- table.featurestable span.icon-checked::before,
130
- table.featurestable span.icon-unchecked::before,
131
- table.featurestable span.icon-tristate::before {
132
- background-color: white;
157
+ div.featurestable-resize-line-horiz {
158
+ height: 4px;
159
+ left: 0;
133
160
  }
@@ -0,0 +1,63 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Svg Vector Icons : http://www.onlinewebfonts.com/icon -->
3
+
4
+ <svg
5
+ version="1.1"
6
+ x="0px"
7
+ y="0px"
8
+ viewBox="0 0 24 24"
9
+ enable-background="new 0 0 1000 1000"
10
+ xml:space="preserve"
11
+ id="svg10"
12
+ sodipodi:docname="public.svg"
13
+ width="24"
14
+ height="24"
15
+ inkscape:version="1.4.4 (dcaf3e7d9e, 2026-05-05)"
16
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
17
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
18
+ xmlns="http://www.w3.org/2000/svg"
19
+ xmlns:svg="http://www.w3.org/2000/svg"
20
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
21
+ xmlns:cc="http://creativecommons.org/ns#"
22
+ xmlns:dc="http://purl.org/dc/elements/1.1/"><defs
23
+ id="defs14" /><sodipodi:namedview
24
+ pagecolor="#ffffff"
25
+ bordercolor="#666666"
26
+ borderopacity="1"
27
+ objecttolerance="10"
28
+ gridtolerance="10"
29
+ guidetolerance="10"
30
+ inkscape:pageopacity="0"
31
+ inkscape:pageshadow="2"
32
+ inkscape:window-width="1920"
33
+ inkscape:window-height="1172"
34
+ id="namedview12"
35
+ showgrid="true"
36
+ inkscape:zoom="15.104"
37
+ inkscape:cx="17.545021"
38
+ inkscape:cy="20.292638"
39
+ inkscape:window-x="0"
40
+ inkscape:window-y="0"
41
+ inkscape:window-maximized="1"
42
+ inkscape:current-layer="g8"
43
+ inkscape:showpageshadow="2"
44
+ inkscape:pagecheckerboard="0"
45
+ inkscape:deskcolor="#d1d1d1"><inkscape:grid
46
+ type="xygrid"
47
+ id="grid821"
48
+ originx="0"
49
+ originy="0"
50
+ spacingy="1"
51
+ spacingx="1"
52
+ units="px" /></sodipodi:namedview>
53
+ <metadata
54
+ id="metadata2"> Svg Vector Icons : http://www.onlinewebfonts.com/icon <rdf:RDF><cc:Work
55
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
56
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata>
57
+ <g
58
+ id="g8"
59
+ transform="translate(0,-976)"><path
60
+ id="path4"
61
+ style="stroke-width:0.00890515"
62
+ d="m 12,982.4707 c -1.447087,0 -2.6207179,1.17365 -2.6207179,2.62072 0,0.96214 0.518379,1.80295 1.2911829,2.25851 -1.2543529,0.36766 -2.3875996,1.23637 -2.8337839,2.45879 -0.2319085,-0.0991 -0.4710048,-0.18357 -0.7137728,-0.25355 0.9617368,-0.5705 1.6057828,-1.61736 1.6065213,-2.81675 0,-1.80885 -1.4659728,-3.27483 -3.274832,-3.27483 -1.8088591,0 -3.274832,1.46598 -3.274832,3.27483 0,1.20267 0.6490386,2.2537 1.615044,2.82313 C 1.8004602,990.14614 0.04729618,991.7456 9.5281617e-5,993.9763 -0.00546872,994.27795 0.23322998,994.52786 0.53489228,994.53453 H 10.374303 c 0.300549,-0.007 0.540362,-0.25658 0.534796,-0.55823 -0.02179,-1.02952 -0.400043,-1.92529 -0.9971499,-2.64842 h 4.1910169 c -0.604313,0.72313 -0.990281,1.61891 -1.012066,2.64842 -0.0056,0.30163 0.233135,0.55158 0.534797,0.55823 h 9.839411 c 0.300549,-0.0109 0.540363,-0.2566 0.534797,-0.55823 -0.04732,-2.23657 -1.771795,-3.84033 -3.786192,-4.42113 0.961737,-0.57054 1.607914,-1.61741 1.608652,-2.81675 0,-1.80885 -1.468103,-3.27483 -3.276962,-3.27483 -1.808859,0 -3.274832,1.46598 -3.274832,3.27483 0,1.20261 0.649039,2.25368 1.615044,2.82313 -0.242685,0.0711 -0.483027,0.1573 -0.715903,0.25782 -0.438011,-1.23111 -1.562927,-2.10732 -2.833786,-2.4737 0.76939,-0.4564 1.284202,-1.29473 1.284792,-2.25425 0,-1.44707 -1.173631,-2.62072 -2.620718,-2.62072 z" /></g>
63
+ </svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qwc2",
3
- "version": "2026.08.13",
3
+ "version": "2026.08.21",
4
4
  "description": "QGIS Web Client",
5
5
  "author": "Sourcepole AG",
6
6
  "license": "BSD-2-Clause",