@toolbox-web/grid 0.3.3 → 0.4.1

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 (148) hide show
  1. package/all.d.ts +19 -19
  2. package/all.d.ts.map +1 -1
  3. package/all.js +1798 -1201
  4. package/all.js.map +1 -1
  5. package/index.js +2215 -2026
  6. package/index.js.map +1 -1
  7. package/lib/core/grid.d.ts +22 -12
  8. package/lib/core/grid.d.ts.map +1 -1
  9. package/lib/core/internal/columns.d.ts +0 -9
  10. package/lib/core/internal/columns.d.ts.map +1 -1
  11. package/lib/core/internal/config-manager.d.ts +236 -0
  12. package/lib/core/internal/config-manager.d.ts.map +1 -0
  13. package/lib/core/internal/editing.d.ts +3 -3
  14. package/lib/core/internal/editing.d.ts.map +1 -1
  15. package/lib/core/internal/event-delegation.d.ts.map +1 -1
  16. package/lib/core/internal/header.d.ts.map +1 -1
  17. package/lib/core/internal/keyboard.d.ts.map +1 -1
  18. package/lib/core/internal/render-scheduler.d.ts +123 -0
  19. package/lib/core/internal/render-scheduler.d.ts.map +1 -0
  20. package/lib/core/internal/rows.d.ts +8 -3
  21. package/lib/core/internal/rows.d.ts.map +1 -1
  22. package/lib/core/internal/sanitize.d.ts +2 -2
  23. package/lib/core/internal/sanitize.d.ts.map +1 -1
  24. package/lib/core/internal/shell.d.ts +40 -2
  25. package/lib/core/internal/shell.d.ts.map +1 -1
  26. package/lib/core/internal/validate-config.d.ts +25 -0
  27. package/lib/core/internal/validate-config.d.ts.map +1 -0
  28. package/lib/core/plugin/base-plugin.d.ts +118 -0
  29. package/lib/core/plugin/base-plugin.d.ts.map +1 -1
  30. package/lib/core/plugin/index.d.ts +1 -0
  31. package/lib/core/plugin/index.d.ts.map +1 -1
  32. package/lib/core/plugin/plugin-manager.d.ts +13 -2
  33. package/lib/core/plugin/plugin-manager.d.ts.map +1 -1
  34. package/lib/core/plugin/types.d.ts +17 -3
  35. package/lib/core/plugin/types.d.ts.map +1 -1
  36. package/lib/core/types.d.ts +112 -12
  37. package/lib/core/types.d.ts.map +1 -1
  38. package/lib/plugins/clipboard/ClipboardPlugin.d.ts +7 -1
  39. package/lib/plugins/clipboard/ClipboardPlugin.d.ts.map +1 -1
  40. package/lib/plugins/clipboard/index.js +78 -22
  41. package/lib/plugins/clipboard/index.js.map +1 -1
  42. package/lib/plugins/column-virtualization/index.js +72 -21
  43. package/lib/plugins/column-virtualization/index.js.map +1 -1
  44. package/lib/plugins/context-menu/index.js +53 -2
  45. package/lib/plugins/context-menu/index.js.map +1 -1
  46. package/lib/plugins/editing/EditingPlugin.d.ts +117 -0
  47. package/lib/plugins/editing/EditingPlugin.d.ts.map +1 -0
  48. package/lib/{core/internal → plugins/editing}/editors.d.ts +1 -1
  49. package/lib/plugins/editing/editors.d.ts.map +1 -0
  50. package/lib/plugins/editing/index.d.ts +8 -0
  51. package/lib/plugins/editing/index.d.ts.map +1 -0
  52. package/lib/plugins/editing/index.js +721 -0
  53. package/lib/plugins/editing/index.js.map +1 -0
  54. package/lib/plugins/editing/types.d.ts +45 -0
  55. package/lib/plugins/editing/types.d.ts.map +1 -0
  56. package/lib/plugins/export/ExportPlugin.d.ts.map +1 -1
  57. package/lib/plugins/export/index.js +68 -17
  58. package/lib/plugins/export/index.js.map +1 -1
  59. package/lib/plugins/filtering/FilteringPlugin.d.ts.map +1 -1
  60. package/lib/plugins/filtering/index.js +103 -50
  61. package/lib/plugins/filtering/index.js.map +1 -1
  62. package/lib/plugins/grouping-columns/grouping-columns.d.ts +4 -4
  63. package/lib/plugins/grouping-columns/grouping-columns.d.ts.map +1 -1
  64. package/lib/plugins/grouping-columns/index.js +80 -29
  65. package/lib/plugins/grouping-columns/index.js.map +1 -1
  66. package/lib/plugins/grouping-rows/GroupingRowsPlugin.d.ts.map +1 -1
  67. package/lib/plugins/grouping-rows/grouping-rows.d.ts.map +1 -1
  68. package/lib/plugins/grouping-rows/index.js +62 -11
  69. package/lib/plugins/grouping-rows/index.js.map +1 -1
  70. package/lib/plugins/master-detail/MasterDetailPlugin.d.ts +2 -2
  71. package/lib/plugins/master-detail/MasterDetailPlugin.d.ts.map +1 -1
  72. package/lib/plugins/master-detail/index.js +156 -102
  73. package/lib/plugins/master-detail/index.js.map +1 -1
  74. package/lib/plugins/master-detail/types.d.ts +12 -2
  75. package/lib/plugins/master-detail/types.d.ts.map +1 -1
  76. package/lib/plugins/multi-sort/MultiSortPlugin.d.ts.map +1 -1
  77. package/lib/plugins/multi-sort/index.js +75 -22
  78. package/lib/plugins/multi-sort/index.js.map +1 -1
  79. package/lib/plugins/pinned-columns/index.js +57 -6
  80. package/lib/plugins/pinned-columns/index.js.map +1 -1
  81. package/lib/plugins/pinned-rows/PinnedRowsPlugin.d.ts.map +1 -1
  82. package/lib/plugins/pinned-rows/index.js +61 -9
  83. package/lib/plugins/pinned-rows/index.js.map +1 -1
  84. package/lib/plugins/pivot/index.js +58 -7
  85. package/lib/plugins/pivot/index.js.map +1 -1
  86. package/lib/plugins/reorder/ReorderPlugin.d.ts.map +1 -1
  87. package/lib/plugins/reorder/index.js +75 -19
  88. package/lib/plugins/reorder/index.js.map +1 -1
  89. package/lib/plugins/selection/index.js +57 -6
  90. package/lib/plugins/selection/index.js.map +1 -1
  91. package/lib/plugins/server-side/index.js +60 -9
  92. package/lib/plugins/server-side/index.js.map +1 -1
  93. package/lib/plugins/tree/TreePlugin.d.ts +3 -3
  94. package/lib/plugins/tree/TreePlugin.d.ts.map +1 -1
  95. package/lib/plugins/tree/index.js +181 -126
  96. package/lib/plugins/tree/index.js.map +1 -1
  97. package/lib/plugins/tree/tree-data.d.ts +6 -6
  98. package/lib/plugins/tree/tree-data.d.ts.map +1 -1
  99. package/lib/plugins/tree/tree-detect.d.ts +5 -9
  100. package/lib/plugins/tree/tree-detect.d.ts.map +1 -1
  101. package/lib/plugins/tree/types.d.ts +16 -4
  102. package/lib/plugins/tree/types.d.ts.map +1 -1
  103. package/lib/plugins/undo-redo/UndoRedoPlugin.d.ts +7 -1
  104. package/lib/plugins/undo-redo/UndoRedoPlugin.d.ts.map +1 -1
  105. package/lib/plugins/undo-redo/index.js +65 -6
  106. package/lib/plugins/undo-redo/index.js.map +1 -1
  107. package/lib/plugins/visibility/VisibilityPlugin.d.ts +7 -1
  108. package/lib/plugins/visibility/VisibilityPlugin.d.ts.map +1 -1
  109. package/lib/plugins/visibility/index.js +61 -2
  110. package/lib/plugins/visibility/index.js.map +1 -1
  111. package/package.json +1 -1
  112. package/public.d.ts +104 -13
  113. package/public.d.ts.map +1 -1
  114. package/umd/grid.all.umd.js +37 -19
  115. package/umd/grid.all.umd.js.map +1 -1
  116. package/umd/grid.umd.js +25 -7
  117. package/umd/grid.umd.js.map +1 -1
  118. package/umd/plugins/clipboard.umd.js +2 -2
  119. package/umd/plugins/clipboard.umd.js.map +1 -1
  120. package/umd/plugins/editing.umd.js +2 -0
  121. package/umd/plugins/editing.umd.js.map +1 -0
  122. package/umd/plugins/export.umd.js +2 -2
  123. package/umd/plugins/export.umd.js.map +1 -1
  124. package/umd/plugins/filtering.umd.js +1 -1
  125. package/umd/plugins/filtering.umd.js.map +1 -1
  126. package/umd/plugins/grouping-columns.umd.js +1 -1
  127. package/umd/plugins/grouping-columns.umd.js.map +1 -1
  128. package/umd/plugins/grouping-rows.umd.js +1 -1
  129. package/umd/plugins/grouping-rows.umd.js.map +1 -1
  130. package/umd/plugins/master-detail.umd.js +1 -1
  131. package/umd/plugins/master-detail.umd.js.map +1 -1
  132. package/umd/plugins/multi-sort.umd.js +1 -1
  133. package/umd/plugins/multi-sort.umd.js.map +1 -1
  134. package/umd/plugins/pinned-rows.umd.js +1 -1
  135. package/umd/plugins/pinned-rows.umd.js.map +1 -1
  136. package/umd/plugins/reorder.umd.js +1 -1
  137. package/umd/plugins/reorder.umd.js.map +1 -1
  138. package/umd/plugins/tree.umd.js +1 -1
  139. package/umd/plugins/tree.umd.js.map +1 -1
  140. package/umd/plugins/undo-redo.umd.js +1 -1
  141. package/umd/plugins/undo-redo.umd.js.map +1 -1
  142. package/umd/plugins/visibility.umd.js +1 -1
  143. package/umd/plugins/visibility.umd.js.map +1 -1
  144. package/lib/core/internal/column-state.d.ts +0 -124
  145. package/lib/core/internal/column-state.d.ts.map +0 -1
  146. package/lib/core/internal/editors.d.ts.map +0 -1
  147. package/lib/core/internal/grid-internals.d.ts +0 -83
  148. package/lib/core/internal/grid-internals.d.ts.map +0 -1
@@ -15,7 +15,7 @@ export declare function computeColumnGroups<T>(columns: ColumnConfig<T>[]): Colu
15
15
  * @param groups - The computed column groups
16
16
  * @param columns - The column configurations
17
17
  */
18
- export declare function applyGroupedHeaderCellClasses(headerRowEl: HTMLElement | null, groups: ColumnGroup[], columns: ColumnConfig<any>[]): void;
18
+ export declare function applyGroupedHeaderCellClasses(headerRowEl: HTMLElement | null, groups: ColumnGroup[], columns: ColumnConfig[]): void;
19
19
  /**
20
20
  * Build the group header row element.
21
21
  *
@@ -23,19 +23,19 @@ export declare function applyGroupedHeaderCellClasses(headerRowEl: HTMLElement |
23
23
  * @param columns - The column configurations
24
24
  * @returns The group header row element, or null if no groups
25
25
  */
26
- export declare function buildGroupHeaderRow(groups: ColumnGroup[], columns: ColumnConfig<any>[]): HTMLElement | null;
26
+ export declare function buildGroupHeaderRow(groups: ColumnGroup[], columns: ColumnConfig[]): HTMLElement | null;
27
27
  /**
28
28
  * Check if any columns have group configuration.
29
29
  *
30
30
  * @param columns - The column configurations
31
31
  * @returns True if at least one column has a group
32
32
  */
33
- export declare function hasColumnGroups(columns: ColumnConfig<any>[]): boolean;
33
+ export declare function hasColumnGroups(columns: ColumnConfig[]): boolean;
34
34
  /**
35
35
  * Get group ID for a specific column.
36
36
  *
37
37
  * @param column - The column configuration
38
38
  * @returns The group ID, or undefined if not grouped
39
39
  */
40
- export declare function getColumnGroupId(column: ColumnConfig<any>): string | undefined;
40
+ export declare function getColumnGroupId(column: ColumnConfig): string | undefined;
41
41
  //# sourceMappingURL=grouping-columns.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"grouping-columns.d.ts","sourceRoot":"","sources":["../../../../../../libs/grid/src/lib/plugins/grouping-columns/grouping-columns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAuB,MAAM,SAAS,CAAC;AAEhE;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,CAmEnF;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,WAAW,EAAE,WAAW,GAAG,IAAI,EAC/B,MAAM,EAAE,WAAW,EAAE,EACrB,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,GAC3B,IAAI,CA8BN;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,WAAW,EAAE,EACrB,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,GAC3B,WAAW,GAAG,IAAI,CA0BpB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,CAErE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,SAAS,CAI9E"}
1
+ {"version":3,"file":"grouping-columns.d.ts","sourceRoot":"","sources":["../../../../../../libs/grid/src/lib/plugins/grouping-columns/grouping-columns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,WAAW,EAAuB,MAAM,SAAS,CAAC;AAEhE;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,CA+DnF;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,WAAW,EAAE,WAAW,GAAG,IAAI,EAC/B,MAAM,EAAE,WAAW,EAAE,EACrB,OAAO,EAAE,YAAY,EAAE,GACtB,IAAI,CA8BN;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,WAAW,GAAG,IAAI,CAuBtG;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAIzE"}
@@ -1,4 +1,4 @@
1
- const c = {
1
+ const g = {
2
2
  expand: "▶",
3
3
  collapse: "▼",
4
4
  sortAsc: "▲",
@@ -9,6 +9,22 @@ const c = {
9
9
  toolPanel: "☰"
10
10
  };
11
11
  class a {
12
+ /**
13
+ * Plugin dependencies - declare other plugins this one requires.
14
+ *
15
+ * Dependencies are validated when the plugin is attached.
16
+ * Required dependencies throw an error if missing.
17
+ * Optional dependencies log an info message if missing.
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * static readonly dependencies: PluginDependency[] = [
22
+ * { name: 'editing', required: true, reason: 'Tracks cell edits for undo/redo' },
23
+ * { name: 'selection', required: false, reason: 'Enables selection-based undo' },
24
+ * ];
25
+ * ```
26
+ */
27
+ static dependencies;
12
28
  /** Plugin version - override in subclass if needed */
13
29
  version = "1.0.0";
14
30
  /** CSS styles to inject into the grid's shadow DOM */
@@ -25,6 +41,12 @@ class a {
25
41
  config;
26
42
  /** User-provided configuration from constructor */
27
43
  userConfig;
44
+ /**
45
+ * Plugin-level AbortController for event listener cleanup.
46
+ * Created fresh in attach(), aborted in detach().
47
+ * This ensures event listeners are properly cleaned up when plugins are re-attached.
48
+ */
49
+ #e;
28
50
  /**
29
51
  * Default configuration - subclasses should override this getter.
30
52
  * Note: This must be a getter (not property initializer) for proper inheritance
@@ -39,19 +61,48 @@ class a {
39
61
  /**
40
62
  * Called when the plugin is attached to a grid.
41
63
  * Override to set up event listeners, initialize state, etc.
64
+ *
65
+ * @example
66
+ * ```ts
67
+ * attach(grid: GridElement): void {
68
+ * super.attach(grid);
69
+ * // Set up document-level listeners with auto-cleanup
70
+ * document.addEventListener('keydown', this.handleEscape, {
71
+ * signal: this.disconnectSignal
72
+ * });
73
+ * }
74
+ * ```
42
75
  */
43
76
  attach(e) {
44
- this.grid = e, this.config = { ...this.defaultConfig, ...this.userConfig };
77
+ this.#e?.abort(), this.#e = new AbortController(), this.grid = e, this.config = { ...this.defaultConfig, ...this.userConfig };
45
78
  }
46
79
  /**
47
80
  * Called when the plugin is detached from a grid.
48
81
  * Override to clean up event listeners, timers, etc.
82
+ *
83
+ * @example
84
+ * ```ts
85
+ * detach(): void {
86
+ * // Clean up any state not handled by disconnectSignal
87
+ * this.selectedRows.clear();
88
+ * this.cache = null;
89
+ * }
90
+ * ```
49
91
  */
50
92
  detach() {
93
+ this.#e?.abort(), this.#e = void 0;
51
94
  }
52
95
  /**
53
96
  * Get another plugin instance from the same grid.
54
97
  * Use for inter-plugin communication.
98
+ *
99
+ * @example
100
+ * ```ts
101
+ * const selection = this.getPlugin(SelectionPlugin);
102
+ * if (selection) {
103
+ * const selectedRows = selection.getSelectedRows();
104
+ * }
105
+ * ```
55
106
  */
56
107
  getPlugin(e) {
57
108
  return this.grid?.getPlugin(e);
@@ -125,7 +176,7 @@ class a {
125
176
  * document.addEventListener('keydown', handler, { signal: this.disconnectSignal });
126
177
  */
127
178
  get disconnectSignal() {
128
- return this.grid?.disconnectSignal;
179
+ return this.#e?.signal ?? this.grid?.disconnectSignal;
129
180
  }
130
181
  /**
131
182
  * Get the grid-level icons configuration.
@@ -133,7 +184,7 @@ class a {
133
184
  */
134
185
  get gridIcons() {
135
186
  const e = this.grid?.gridConfig?.icons ?? {};
136
- return { ...c, ...e };
187
+ return { ...g, ...e };
137
188
  }
138
189
  /**
139
190
  * Resolve an icon value to string or HTMLElement.
@@ -164,13 +215,13 @@ class a {
164
215
  }
165
216
  // #endregion
166
217
  }
167
- function h(l) {
168
- if (!l.length) return [];
218
+ function h(u) {
219
+ if (!u.length) return [];
169
220
  const e = /* @__PURE__ */ new Map(), r = [], t = (o, n) => {
170
221
  if (!n.length) return;
171
- const u = r[r.length - 1];
172
- if (u && u.implicit && u.firstIndex + u.columns.length === o) {
173
- u.columns.push(...n);
222
+ const l = r[r.length - 1];
223
+ if (l && l.implicit && l.firstIndex + l.columns.length === o) {
224
+ l.columns.push(...n);
174
225
  return;
175
226
  }
176
227
  r.push({
@@ -182,51 +233,51 @@ function h(l) {
182
233
  });
183
234
  };
184
235
  let i = [], s = 0;
185
- return l.forEach((o, n) => {
186
- const u = o.group;
187
- if (!u) {
236
+ return u.forEach((o, n) => {
237
+ const l = o.group;
238
+ if (!l) {
188
239
  i.length === 0 && (s = n), i.push(o);
189
240
  return;
190
241
  }
191
242
  i.length && (t(s, i.slice()), i = []);
192
- const g = typeof u == "string" ? u : u.id;
193
- let d = e.get(g);
243
+ const c = typeof l == "string" ? l : l.id;
244
+ let d = e.get(c);
194
245
  d || (d = {
195
- id: g,
196
- label: typeof u == "string" ? void 0 : u.label,
246
+ id: c,
247
+ label: typeof l == "string" ? void 0 : l.label,
197
248
  columns: [],
198
249
  firstIndex: n
199
- }, e.set(g, d), r.push(d)), d.columns.push(o);
200
- }), i.length && t(s, i), r.length === 1 && r[0].implicit && r[0].columns.length === l.length ? [] : r;
250
+ }, e.set(c, d), r.push(d)), d.columns.push(o);
251
+ }), i.length && t(s, i), r.length === 1 && r[0].implicit && r[0].columns.length === u.length ? [] : r;
201
252
  }
202
- function p(l, e, r) {
203
- if (!e.length || !l) return;
253
+ function p(u, e, r) {
254
+ if (!e.length || !u) return;
204
255
  const t = /* @__PURE__ */ new Map();
205
256
  for (const s of e)
206
257
  for (const o of s.columns)
207
- o?.field && t.set(o.field, s.id);
208
- const i = Array.from(l.querySelectorAll(".cell[data-field]"));
258
+ o.field && t.set(o.field, s.id);
259
+ const i = Array.from(u.querySelectorAll(".cell[data-field]"));
209
260
  i.forEach((s) => {
210
261
  const o = s.getAttribute("data-field") || "", n = t.get(o);
211
262
  n && (s.classList.add("grouped"), s.getAttribute("data-group") || s.setAttribute("data-group", n));
212
263
  });
213
264
  for (const s of e) {
214
- const o = s.columns[s.columns.length - 1], n = i.find((u) => u.getAttribute("data-field") === o.field);
265
+ const o = s.columns[s.columns.length - 1], n = i.find((l) => l.getAttribute("data-field") === o.field);
215
266
  n && n.classList.add("group-end");
216
267
  }
217
268
  }
218
- function f(l, e) {
219
- if (l.length === 0) return null;
269
+ function f(u, e) {
270
+ if (u.length === 0) return null;
220
271
  const r = document.createElement("div");
221
272
  r.className = "header-group-row", r.setAttribute("role", "row");
222
- for (const t of l) {
223
- const i = t.firstIndex != null ? t.firstIndex : e.findIndex((u) => t.columns.includes(u)), s = String(t.id).startsWith("__implicit__"), o = s ? "" : t.label || t.id, n = document.createElement("div");
273
+ for (const t of u) {
274
+ const i = t.firstIndex != null ? t.firstIndex : e.findIndex((l) => t.columns.includes(l)), s = String(t.id).startsWith("__implicit__"), o = s ? "" : t.label || t.id, n = document.createElement("div");
224
275
  n.className = "cell header-group-cell", s && n.classList.add("implicit-group"), n.setAttribute("data-group", String(t.id)), n.style.gridColumn = `${i + 1} / span ${t.columns.length}`, n.textContent = o, r.appendChild(n);
225
276
  }
226
277
  return r;
227
278
  }
228
- function m(l) {
229
- return l.some((e) => e.group != null);
279
+ function m(u) {
280
+ return u.some((e) => e.group != null);
230
281
  }
231
282
  const b = ".header-group-row{display:grid;grid-auto-flow:column;background:var(--tbw-grouping-columns-header-bg, var(--tbw-color-header-bg));border-bottom:1px solid var(--tbw-grouping-columns-border, var(--tbw-color-border))}.header-group-cell{display:flex;align-items:center;justify-content:center;padding:4px 8px;font-weight:600;font-size:.9em;text-transform:uppercase;letter-spacing:.5px;border-right:1px solid var(--tbw-grouping-columns-border, var(--tbw-color-border))}.header-group-cell:last-child{border-right:none}.header-row .cell.grouped{border-top:none}.header-row .cell.group-end{border-right:2px solid var(--tbw-grouping-columns-separator, var(--tbw-color-border-strong))}.header-row .cell.group-end:last-child{border-right:none}.header-group-row.no-borders{border-bottom:none}.header-group-row.no-borders .header-group-cell{border-right:none}.header-row.no-group-borders .cell.group-end{border-right:1px solid var(--tbw-color-border)}";
232
283
  class w extends a {