qwc2 2026.8.14 → 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.
@@ -414,22 +414,25 @@ var IdentifyViewer = /*#__PURE__*/function (_React$Component) {
414
414
  });
415
415
  });
416
416
  _defineProperty(_this, "setHighlightedFeatures", function (features) {
417
- if (isEmpty(features) && _this.props.highlightAllResults) {
418
- var resultTree = _this.state.selectedLayer !== '' ? _defineProperty({}, _this.state.selectedLayer, _this.state.resultTree[_this.state.selectedLayer]) : _this.state.resultTree;
419
- features = Object.values(resultTree).flat();
417
+ if (isEmpty(features)) {
418
+ if (!isEmpty(_this.state.tableSelection)) {
419
+ features = Object.values(_this.state.tableSelection).map(function (sel) {
420
+ return Object.values(sel);
421
+ }).flat();
422
+ } else if (_this.props.highlightAllResults) {
423
+ var resultTree = _this.state.selectedLayer !== '' ? _defineProperty({}, _this.state.selectedLayer, _this.state.resultTree[_this.state.selectedLayer]) : _this.state.resultTree;
424
+ features = Object.values(resultTree).flat();
425
+ }
420
426
  }
421
- features = (features || []).filter(function (feature) {
422
- return feature.type.toLowerCase() === "feature";
423
- }).map(function (feature) {
424
- var newFeature = _objectSpread(_objectSpread({}, feature), {}, {
425
- properties: {}
426
- });
427
- // Ensure selection style is used
428
- delete newFeature.styleName;
429
- delete newFeature.styleOptions;
430
- return newFeature;
431
- });
432
427
  if (!isEmpty(features)) {
428
+ features = features.filter(function (f) {
429
+ return f.geometry;
430
+ }).map(function (f) {
431
+ return {
432
+ id: f.id,
433
+ geometry: f.geometry
434
+ };
435
+ });
433
436
  var layer = {
434
437
  id: "__identifyviewerhighlight",
435
438
  role: LayerRole.SELECTION
@@ -882,18 +885,30 @@ var IdentifyViewer = /*#__PURE__*/function (_React$Component) {
882
885
  features: features,
883
886
  fields: Object.values(fields),
884
887
  hideIdColumn: true,
885
- highlightFeatures: _this.setHighlightedFeatures,
888
+ hoverChanged: _this.setHoveredFeature,
886
889
  renderField: _this.renderTableField,
887
890
  selectionChanged: function selectionChanged(sel) {
888
- return _this.setState(function (state) {
889
- return {
890
- tableSelection: _objectSpread(_objectSpread({}, state.tableSelection), {}, _defineProperty({}, layerid, sel))
891
- };
892
- });
891
+ return _this.setTableSelection(sel, layerid);
893
892
  }
894
893
  }) : null);
895
894
  }));
896
895
  });
896
+ _defineProperty(_this, "setTableSelection", function (sel, layerid) {
897
+ _this.setState(function (state) {
898
+ var newTableSelection = _objectSpread({}, state.tableSelection);
899
+ if (!isEmpty(sel)) {
900
+ newTableSelection[layerid] = sel;
901
+ } else {
902
+ delete newTableSelection[layerid];
903
+ }
904
+ return {
905
+ tableSelection: newTableSelection
906
+ };
907
+ });
908
+ });
909
+ _defineProperty(_this, "setHoveredFeature", function (feature) {
910
+ _this.setHighlightedFeatures(feature ? [feature] : null);
911
+ });
897
912
  _defineProperty(_this, "renderTableField", function (feature, field) {
898
913
  return _this.attribValue(feature.properties[field.name], field.name, feature.layername, feature);
899
914
  });
@@ -244,7 +244,7 @@ var QtDesignerForm = /*#__PURE__*/function (_React$Component) {
244
244
  var attr = widget.attribute || {};
245
245
  var fieldname = widget.name.replace(/kvrel__/, '').split("__")[isRelWidget ? 1 : 0];
246
246
  var field = fields[fieldname];
247
- var constraints = (field === null || field === void 0 ? void 0 : field.constraints) || {};
247
+ var constraints = _objectSpread({}, field === null || field === void 0 ? void 0 : field.constraints);
248
248
  constraints.readOnly = _this.props.readOnly || constraints.readOnly === true || String(prop.readOnly) === "true" || String(prop.enabled) === "false" || disabled;
249
249
  constraints.required = !constraints.readOnly && (constraints.required || String(prop.required) === "true");
250
250
  constraints.placeholder = prop.placeholderText || constraints.placeholder || "";
@@ -451,6 +451,9 @@ var ResizeableWindow = /*#__PURE__*/function (_React$Component) {
451
451
  });
452
452
  externalWindow.document.querySelector(':root').style.setProperty('--topbar-height', document.querySelector(':root').style.getPropertyValue('--topbar-height'));
453
453
  externalWindow.document.querySelector(':root').style.setProperty('--bottombar-height', document.querySelector(':root').style.getPropertyValue('--bottombar-height'));
454
+ if (_this.props.colorScheme) {
455
+ externalWindow.document.querySelector(':root').classList.add(_this.props.colorScheme);
456
+ }
454
457
  // Inherit API
455
458
  externalWindow.qwc2 = window.qwc2;
456
459
  _this.setState(function (state) {
@@ -534,6 +537,11 @@ var ResizeableWindow = /*#__PURE__*/function (_React$Component) {
534
537
  this.props.onGeometryChanged(this.state.geometry);
535
538
  WINDOW_GEOMETRIES[this.props.title] = this.state.geometry;
536
539
  }
540
+ if (this.props.colorScheme !== prevProps.colorScheme && this.state.externalWindow) {
541
+ var externalWindowRoot = this.state.externalWindow.document.querySelector(':root');
542
+ externalWindowRoot.classList.remove(prevProps.colorScheme);
543
+ externalWindowRoot.classList.add(this.props.colorScheme);
544
+ }
537
545
  if (this.props.splitScreenWhenDocked && (this.props.visible !== prevProps.visible || this.state.geometry !== prevState.geometry || this.state.externalWindow !== prevState.externalWindow)) {
538
546
  if (!this.props.visible && prevProps.visible || this.state.geometry.docked === false && prevState.geometry.docked !== false || this.state.geometry.maximized === true && prevState.geometry.maximized !== true || this.state.externalWindow && !prevState.externalWindow) {
539
547
  this.props.setSplitScreen(this.id, null, null, false);
@@ -563,6 +571,7 @@ _defineProperty(ResizeableWindow, "propTypes", {
563
571
  bottombarHeight: PropTypes.number,
564
572
  busyIcon: PropTypes.bool,
565
573
  children: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),
574
+ colorScheme: PropTypes.string,
566
575
  detachable: PropTypes.bool,
567
576
  dockable: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),
568
577
  extraControls: PropTypes.arrayOf(PropTypes.shape({
@@ -628,6 +637,7 @@ _defineProperty(ResizeableWindow, "defaultProps", {
628
637
  });
629
638
  export default connect(function (state) {
630
639
  return {
640
+ colorScheme: state.localConfig.colorScheme,
631
641
  windowStacking: state.windows.stacking,
632
642
  topbarHeight: state.windows.topbarHeight,
633
643
  bottombarHeight: state.windows.bottombarHeight,
@@ -18,6 +18,7 @@ div.map3d-titlebar > span.icon-remove {
18
18
 
19
19
  div.map3d-map {
20
20
  user-select: none;
21
+ touch-action: none;
21
22
  position: absolute;
22
23
  left: 0;
23
24
  right: 0;
@@ -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,
@@ -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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qwc2",
3
- "version": "2026.08.14",
3
+ "version": "2026.08.21",
4
4
  "description": "QGIS Web Client",
5
5
  "author": "Sourcepole AG",
6
6
  "license": "BSD-2-Clause",