@cloudscape-design/components-themeable 3.0.1308 → 3.0.1310

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 (195) hide show
  1. package/lib/internal/manifest.json +1 -1
  2. package/lib/internal/scss/badge/styles.scss +19 -6
  3. package/lib/internal/scss/collection-preferences/content-display/content-display-list.scss +10 -0
  4. package/lib/internal/scss/collection-preferences/content-display/content-display-option.scss +12 -0
  5. package/lib/internal/scss/expandable-section/styles.scss +2 -2
  6. package/lib/internal/scss/icon/mixins.scss +7 -0
  7. package/lib/internal/scss/internal/generated/custom-css-properties/index.scss +1 -1
  8. package/lib/internal/scss/table/header-cell/styles.scss +42 -5
  9. package/lib/internal/scss/table/resizer/styles.scss +26 -13
  10. package/lib/internal/scss/table/styles.scss +9 -0
  11. package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/global-ai-drawer.d.ts.map +1 -1
  12. package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/global-ai-drawer.js +4 -2
  13. package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/global-ai-drawer.js.map +1 -1
  14. package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/global-bottom-drawer.d.ts.map +1 -1
  15. package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/global-bottom-drawer.js +4 -2
  16. package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/global-bottom-drawer.js.map +1 -1
  17. package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/global-drawer.d.ts.map +1 -1
  18. package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/global-drawer.js +3 -2
  19. package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/global-drawer.js.map +1 -1
  20. package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/local-drawer.d.ts.map +1 -1
  21. package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/local-drawer.js +2 -2
  22. package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/local-drawer.js.map +1 -1
  23. package/lib/internal/template/app-layout/visual-refresh-toolbar/interfaces.d.ts +1 -0
  24. package/lib/internal/template/app-layout/visual-refresh-toolbar/interfaces.d.ts.map +1 -1
  25. package/lib/internal/template/app-layout/visual-refresh-toolbar/interfaces.js.map +1 -1
  26. package/lib/internal/template/app-layout/visual-refresh-toolbar/state/use-app-layout.d.ts.map +1 -1
  27. package/lib/internal/template/app-layout/visual-refresh-toolbar/state/use-app-layout.js +12 -1
  28. package/lib/internal/template/app-layout/visual-refresh-toolbar/state/use-app-layout.js.map +1 -1
  29. package/lib/internal/template/badge/styles.css.js +10 -10
  30. package/lib/internal/template/badge/styles.scoped.css +29 -16
  31. package/lib/internal/template/badge/styles.selectors.js +10 -10
  32. package/lib/internal/template/collection-preferences/content-display/content-display-option.js +1 -1
  33. package/lib/internal/template/collection-preferences/content-display/content-display-option.js.map +1 -1
  34. package/lib/internal/template/collection-preferences/content-display/index.d.ts +1 -1
  35. package/lib/internal/template/collection-preferences/content-display/index.d.ts.map +1 -1
  36. package/lib/internal/template/collection-preferences/content-display/index.js +63 -27
  37. package/lib/internal/template/collection-preferences/content-display/index.js.map +1 -1
  38. package/lib/internal/template/collection-preferences/content-display/utils.d.ts +40 -1
  39. package/lib/internal/template/collection-preferences/content-display/utils.d.ts.map +1 -1
  40. package/lib/internal/template/collection-preferences/content-display/utils.js +107 -13
  41. package/lib/internal/template/collection-preferences/content-display/utils.js.map +1 -1
  42. package/lib/internal/template/collection-preferences/index.d.ts.map +1 -1
  43. package/lib/internal/template/collection-preferences/index.js +2 -2
  44. package/lib/internal/template/collection-preferences/index.js.map +1 -1
  45. package/lib/internal/template/collection-preferences/interfaces.d.ts +30 -2
  46. package/lib/internal/template/collection-preferences/interfaces.d.ts.map +1 -1
  47. package/lib/internal/template/collection-preferences/interfaces.js.map +1 -1
  48. package/lib/internal/template/collection-preferences/styles.css.js +38 -36
  49. package/lib/internal/template/collection-preferences/styles.scoped.css +81 -37
  50. package/lib/internal/template/collection-preferences/styles.selectors.js +38 -36
  51. package/lib/internal/template/collection-preferences/utils.d.ts +1 -0
  52. package/lib/internal/template/collection-preferences/utils.d.ts.map +1 -1
  53. package/lib/internal/template/collection-preferences/utils.js +14 -0
  54. package/lib/internal/template/collection-preferences/utils.js.map +1 -1
  55. package/lib/internal/template/expandable-section/styles.css.js +35 -35
  56. package/lib/internal/template/expandable-section/styles.scoped.css +68 -68
  57. package/lib/internal/template/expandable-section/styles.selectors.js +35 -35
  58. package/lib/internal/template/i18n/messages/all.all.js +1 -1
  59. package/lib/internal/template/i18n/messages/all.all.json +1 -1
  60. package/lib/internal/template/i18n/messages/all.en.js +1 -1
  61. package/lib/internal/template/i18n/messages/all.en.json +1 -1
  62. package/lib/internal/template/i18n/messages-types.d.ts +4 -0
  63. package/lib/internal/template/i18n/messages-types.d.ts.map +1 -1
  64. package/lib/internal/template/i18n/messages-types.js.map +1 -1
  65. package/lib/internal/template/icon/interfaces.d.ts +1 -1
  66. package/lib/internal/template/icon/interfaces.d.ts.map +1 -1
  67. package/lib/internal/template/icon/interfaces.js.map +1 -1
  68. package/lib/internal/template/icon/internal.js +2 -2
  69. package/lib/internal/template/icon/internal.js.map +1 -1
  70. package/lib/internal/template/icon/styles.css.js +41 -39
  71. package/lib/internal/template/icon/styles.scoped.css +104 -85
  72. package/lib/internal/template/icon/styles.selectors.js +41 -39
  73. package/lib/internal/template/internal/base-component/styles.scoped.css +57 -5
  74. package/lib/internal/template/internal/environment.js +2 -2
  75. package/lib/internal/template/internal/environment.json +2 -2
  76. package/lib/internal/template/internal/generated/styles/tokens.d.ts +23 -1
  77. package/lib/internal/template/internal/generated/styles/tokens.js +23 -1
  78. package/lib/internal/template/internal/generated/theming/index.cjs +476 -4
  79. package/lib/internal/template/internal/generated/theming/index.cjs.d.ts +216 -0
  80. package/lib/internal/template/internal/generated/theming/index.d.ts +216 -0
  81. package/lib/internal/template/internal/generated/theming/index.js +476 -4
  82. package/lib/internal/template/internal/hooks/use-width-change/index.d.ts +13 -0
  83. package/lib/internal/template/internal/hooks/use-width-change/index.d.ts.map +1 -0
  84. package/lib/internal/template/internal/hooks/use-width-change/index.js +33 -0
  85. package/lib/internal/template/internal/hooks/use-width-change/index.js.map +1 -0
  86. package/lib/internal/template/pagination/internal.d.ts.map +1 -1
  87. package/lib/internal/template/pagination/internal.js +4 -1
  88. package/lib/internal/template/pagination/internal.js.map +1 -1
  89. package/lib/internal/template/prompt-input/internal.d.ts.map +1 -1
  90. package/lib/internal/template/prompt-input/internal.js +9 -2
  91. package/lib/internal/template/prompt-input/internal.js.map +1 -1
  92. package/lib/internal/template/prompt-input/tokens/use-token-mode.d.ts.map +1 -1
  93. package/lib/internal/template/prompt-input/tokens/use-token-mode.js +0 -9
  94. package/lib/internal/template/prompt-input/tokens/use-token-mode.js.map +1 -1
  95. package/lib/internal/template/table/column-groups/col-group.d.ts +8 -0
  96. package/lib/internal/template/table/column-groups/col-group.d.ts.map +1 -0
  97. package/lib/internal/template/table/column-groups/col-group.js +24 -0
  98. package/lib/internal/template/table/column-groups/col-group.js.map +1 -0
  99. package/lib/internal/template/table/column-groups/split-utils.d.ts +27 -0
  100. package/lib/internal/template/table/column-groups/split-utils.d.ts.map +1 -0
  101. package/lib/internal/template/table/column-groups/split-utils.js +43 -0
  102. package/lib/internal/template/table/column-groups/split-utils.js.map +1 -0
  103. package/lib/internal/template/table/column-groups/use-column-groups.d.ts +8 -0
  104. package/lib/internal/template/table/column-groups/use-column-groups.d.ts.map +1 -0
  105. package/lib/internal/template/table/column-groups/use-column-groups.js +23 -0
  106. package/lib/internal/template/table/column-groups/use-column-groups.js.map +1 -0
  107. package/lib/internal/template/table/column-groups/utils.d.ts +55 -0
  108. package/lib/internal/template/table/column-groups/utils.d.ts.map +1 -0
  109. package/lib/internal/template/table/column-groups/utils.js +204 -0
  110. package/lib/internal/template/table/column-groups/utils.js.map +1 -0
  111. package/lib/internal/template/table/header-cell/common-props.d.ts +24 -0
  112. package/lib/internal/template/table/header-cell/common-props.d.ts.map +1 -0
  113. package/lib/internal/template/table/header-cell/common-props.js +4 -0
  114. package/lib/internal/template/table/header-cell/common-props.js.map +1 -0
  115. package/lib/internal/template/table/header-cell/group-header-cell.d.ts +18 -0
  116. package/lib/internal/template/table/header-cell/group-header-cell.d.ts.map +1 -0
  117. package/lib/internal/template/table/header-cell/group-header-cell.js +44 -0
  118. package/lib/internal/template/table/header-cell/group-header-cell.js.map +1 -0
  119. package/lib/internal/template/table/header-cell/index.d.ts +8 -23
  120. package/lib/internal/template/table/header-cell/index.d.ts.map +1 -1
  121. package/lib/internal/template/table/header-cell/index.js +3 -3
  122. package/lib/internal/template/table/header-cell/index.js.map +1 -1
  123. package/lib/internal/template/table/header-cell/styles.css.js +33 -30
  124. package/lib/internal/template/table/header-cell/styles.scoped.css +92 -68
  125. package/lib/internal/template/table/header-cell/styles.selectors.js +33 -30
  126. package/lib/internal/template/table/header-cell/th-element.d.ts +10 -1
  127. package/lib/internal/template/table/header-cell/th-element.d.ts.map +1 -1
  128. package/lib/internal/template/table/header-cell/th-element.js +6 -4
  129. package/lib/internal/template/table/header-cell/th-element.js.map +1 -1
  130. package/lib/internal/template/table/index.d.ts.map +1 -1
  131. package/lib/internal/template/table/index.js +5 -2
  132. package/lib/internal/template/table/index.js.map +1 -1
  133. package/lib/internal/template/table/interfaces.d.ts +37 -1
  134. package/lib/internal/template/table/interfaces.d.ts.map +1 -1
  135. package/lib/internal/template/table/interfaces.js.map +1 -1
  136. package/lib/internal/template/table/internal.d.ts.map +1 -1
  137. package/lib/internal/template/table/internal.js +17 -5
  138. package/lib/internal/template/table/internal.js.map +1 -1
  139. package/lib/internal/template/table/resizer/index.d.ts +6 -2
  140. package/lib/internal/template/table/resizer/index.d.ts.map +1 -1
  141. package/lib/internal/template/table/resizer/index.js +5 -5
  142. package/lib/internal/template/table/resizer/index.js.map +1 -1
  143. package/lib/internal/template/table/resizer/styles.css.js +16 -13
  144. package/lib/internal/template/table/resizer/styles.scoped.css +36 -26
  145. package/lib/internal/template/table/resizer/styles.selectors.js +16 -13
  146. package/lib/internal/template/table/sticky-header.d.ts +3 -0
  147. package/lib/internal/template/table/sticky-header.d.ts.map +1 -1
  148. package/lib/internal/template/table/sticky-header.js +7 -2
  149. package/lib/internal/template/table/sticky-header.js.map +1 -1
  150. package/lib/internal/template/table/sticky-scrolling.d.ts.map +1 -1
  151. package/lib/internal/template/table/sticky-scrolling.js +6 -1
  152. package/lib/internal/template/table/sticky-scrolling.js.map +1 -1
  153. package/lib/internal/template/table/styles.css.js +35 -34
  154. package/lib/internal/template/table/styles.scoped.css +47 -41
  155. package/lib/internal/template/table/styles.selectors.js +35 -34
  156. package/lib/internal/template/table/table-role/grid-navigation.d.ts.map +1 -1
  157. package/lib/internal/template/table/table-role/grid-navigation.js +5 -7
  158. package/lib/internal/template/table/table-role/grid-navigation.js.map +1 -1
  159. package/lib/internal/template/table/table-role/table-role-helper.d.ts +3 -0
  160. package/lib/internal/template/table/table-role/table-role-helper.d.ts.map +1 -1
  161. package/lib/internal/template/table/table-role/table-role-helper.js +9 -4
  162. package/lib/internal/template/table/table-role/table-role-helper.js.map +1 -1
  163. package/lib/internal/template/table/table-role/utils.d.ts +19 -0
  164. package/lib/internal/template/table/table-role/utils.d.ts.map +1 -1
  165. package/lib/internal/template/table/table-role/utils.js +86 -7
  166. package/lib/internal/template/table/table-role/utils.js.map +1 -1
  167. package/lib/internal/template/table/thead.d.ts +5 -0
  168. package/lib/internal/template/table/thead.d.ts.map +1 -1
  169. package/lib/internal/template/table/thead.js +145 -18
  170. package/lib/internal/template/table/thead.js.map +1 -1
  171. package/lib/internal/template/table/use-column-widths.d.ts +4 -1
  172. package/lib/internal/template/table/use-column-widths.d.ts.map +1 -1
  173. package/lib/internal/template/table/use-column-widths.js +68 -18
  174. package/lib/internal/template/table/use-column-widths.js.map +1 -1
  175. package/lib/internal/template/table/use-sticky-header.d.ts.map +1 -1
  176. package/lib/internal/template/table/use-sticky-header.js +4 -1
  177. package/lib/internal/template/table/use-sticky-header.js.map +1 -1
  178. package/lib/internal/template/table/utils.d.ts.map +1 -1
  179. package/lib/internal/template/table/utils.js +14 -4
  180. package/lib/internal/template/table/utils.js.map +1 -1
  181. package/lib/internal/template/test-utils/dom/collection-preferences/content-display-preference.d.ts +28 -2
  182. package/lib/internal/template/test-utils/dom/collection-preferences/content-display-preference.js +60 -2
  183. package/lib/internal/template/test-utils/dom/collection-preferences/content-display-preference.js.map +1 -1
  184. package/lib/internal/template/test-utils/dom/table/index.d.ts +18 -1
  185. package/lib/internal/template/test-utils/dom/table/index.js +22 -3
  186. package/lib/internal/template/test-utils/dom/table/index.js.map +1 -1
  187. package/lib/internal/template/test-utils/selectors/collection-preferences/content-display-preference.d.ts +28 -2
  188. package/lib/internal/template/test-utils/selectors/collection-preferences/content-display-preference.js +52 -2
  189. package/lib/internal/template/test-utils/selectors/collection-preferences/content-display-preference.js.map +1 -1
  190. package/lib/internal/template/test-utils/selectors/table/index.d.ts +18 -1
  191. package/lib/internal/template/test-utils/selectors/table/index.js +22 -3
  192. package/lib/internal/template/test-utils/selectors/table/index.js.map +1 -1
  193. package/lib/internal/template/wizard/wizard-step-list.js +4 -4
  194. package/lib/internal/template/wizard/wizard-step-list.js.map +1 -1
  195. package/package.json +1 -1
@@ -0,0 +1,204 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { warnOnce } from '@cloudscape-design/component-toolkit/internal';
4
+ import { getVisibleColumnDefinitions } from '../utils';
5
+ /**
6
+ * A node in the table header tree.
7
+ * - Column nodes map to column definitions.
8
+ * - Internal nodes map to group definitions.
9
+ * - The root is a virtual container (never rendered).
10
+ */
11
+ export class TableHeaderNode {
12
+ constructor(id, props = {}) {
13
+ var _a, _b, _c, _d, _e;
14
+ this.subTreeHeight = 1;
15
+ this.children = [];
16
+ this.id = id;
17
+ this.isRoot = (_a = props.isRoot) !== null && _a !== void 0 ? _a : false;
18
+ this.columnDefinition = props.columnDefinition;
19
+ this.groupDefinition = props.groupDefinition;
20
+ this.colSpan = (_b = props.colSpan) !== null && _b !== void 0 ? _b : 1;
21
+ this.rowSpan = (_c = props.rowSpan) !== null && _c !== void 0 ? _c : 1;
22
+ this.rowIndex = (_d = props.rowIndex) !== null && _d !== void 0 ? _d : -1;
23
+ this.colIndex = (_e = props.colIndex) !== null && _e !== void 0 ? _e : -1;
24
+ }
25
+ get isGroup() {
26
+ return !!this.groupDefinition;
27
+ }
28
+ get isColumn() {
29
+ return !this.isRoot && this.children.length === 0;
30
+ }
31
+ addChild(child) {
32
+ this.children.push(child);
33
+ child.parent = this;
34
+ }
35
+ }
36
+ /**
37
+ * Builds the tree from the nested columnDisplay structure.
38
+ * Groups are only attached if they contain at least one visible descendant.
39
+ */
40
+ function buildTreeFromColumnDisplay(displayItems, nodeMap, parent) {
41
+ for (const item of displayItems) {
42
+ if (item.type === 'group') {
43
+ const groupNode = nodeMap.get(item.id);
44
+ if (!groupNode) {
45
+ warnOnce('[Table]', `Group "${item.id}" referenced in columnDisplay not found in groupDefinitions. Skipping.`);
46
+ continue;
47
+ }
48
+ buildTreeFromColumnDisplay(item.children, nodeMap, groupNode);
49
+ // Only attach group if it has visible descendants. The recursive call above
50
+ // only adds children that are either visible columns or nested groups with
51
+ // their own visible descendants, so this check handles all nesting levels.
52
+ if (groupNode.children.length > 0) {
53
+ parent.addChild(groupNode);
54
+ }
55
+ }
56
+ else {
57
+ if (!item.visible) {
58
+ continue;
59
+ }
60
+ const colNode = nodeMap.get(item.id);
61
+ if (colNode) {
62
+ parent.addChild(colNode);
63
+ }
64
+ }
65
+ }
66
+ }
67
+ /**
68
+ * Fallback when no columnDisplay is provided: all visible columns attach directly to root.
69
+ */
70
+ function buildTreeFromVisibleColumns(visibleColumns, nodeMap, root) {
71
+ for (const col of visibleColumns) {
72
+ // Columns without IDs cannot participate in grouping, they have no key
73
+ // to match against columnDisplay entries or groupDefinitions.
74
+ if (!col.id) {
75
+ continue;
76
+ }
77
+ const node = nodeMap.get(col.id);
78
+ if (node) {
79
+ root.addChild(node);
80
+ }
81
+ }
82
+ }
83
+ function computeSubTreeHeights(node) {
84
+ if (node.isColumn || node.children.length === 0) {
85
+ node.subTreeHeight = 1;
86
+ return 1;
87
+ }
88
+ const maxChildHeight = Math.max(...node.children.map(child => computeSubTreeHeights(child)));
89
+ node.subTreeHeight = maxChildHeight + 1;
90
+ return node.subTreeHeight;
91
+ }
92
+ function computeRowSpansAndIndices(node, treeHeight, ancestorRows = 0) {
93
+ const maxChildHeight = Math.max(...node.children.map(c => c.subTreeHeight), 0);
94
+ node.rowSpan = treeHeight - ancestorRows - maxChildHeight;
95
+ if (node.parent) {
96
+ node.rowIndex = node.parent.rowIndex + node.parent.rowSpan;
97
+ }
98
+ for (const child of node.children) {
99
+ computeRowSpansAndIndices(child, treeHeight, ancestorRows + node.rowSpan);
100
+ }
101
+ }
102
+ function computeColSpansAndIndices(node, startCol = 0) {
103
+ node.colIndex = startCol;
104
+ if (node.isColumn) {
105
+ node.colSpan = 1;
106
+ return startCol + 1;
107
+ }
108
+ let nextCol = startCol;
109
+ for (const child of node.children) {
110
+ nextCol = computeColSpansAndIndices(child, nextCol);
111
+ }
112
+ node.colSpan = nextCol - startCol;
113
+ return nextCol;
114
+ }
115
+ export function calculateHierarchyTree(columnDefinitions, visibleColumnIds, groupDefinitions, columnDisplay) {
116
+ const visibleColumns = getVisibleColumnDefinitions({
117
+ columnDisplay,
118
+ visibleColumns: visibleColumnIds,
119
+ columnDefinitions,
120
+ });
121
+ const nodeMap = new Map();
122
+ for (const col of visibleColumns) {
123
+ if (col.id) {
124
+ nodeMap.set(col.id, new TableHeaderNode(col.id, { columnDefinition: col }));
125
+ }
126
+ }
127
+ for (const group of groupDefinitions) {
128
+ nodeMap.set(group.id, new TableHeaderNode(group.id, { groupDefinition: group }));
129
+ }
130
+ const root = new TableHeaderNode('*', { isRoot: true });
131
+ if (columnDisplay && columnDisplay.length > 0) {
132
+ buildTreeFromColumnDisplay(columnDisplay, nodeMap, root);
133
+ }
134
+ else {
135
+ buildTreeFromVisibleColumns(visibleColumns, nodeMap, root);
136
+ }
137
+ computeSubTreeHeights(root);
138
+ const treeHeight = root.subTreeHeight - 1;
139
+ root.rowIndex = -1;
140
+ root.rowSpan = 1;
141
+ root.colSpan = visibleColumns.length;
142
+ for (const child of root.children) {
143
+ computeRowSpansAndIndices(child, treeHeight);
144
+ }
145
+ computeColSpansAndIndices(root);
146
+ return buildOutput(root, treeHeight);
147
+ }
148
+ function getParentChain(node) {
149
+ const chain = [];
150
+ let current = node.parent;
151
+ while (current && !current.isRoot) {
152
+ chain.unshift(current.id);
153
+ current = current.parent;
154
+ }
155
+ return chain;
156
+ }
157
+ function buildOutput(root, maxDepth) {
158
+ var _a, _b, _c;
159
+ const rowsMap = new Map();
160
+ const columnToParentIds = new Map();
161
+ const queue = [...root.children];
162
+ while (queue.length > 0) {
163
+ const node = queue.shift();
164
+ const parentChain = getParentChain(node);
165
+ const entry = {
166
+ id: node.id,
167
+ header: (_b = (_a = node.groupDefinition) === null || _a === void 0 ? void 0 : _a.header) !== null && _b !== void 0 ? _b : (_c = node.columnDefinition) === null || _c === void 0 ? void 0 : _c.header,
168
+ colSpan: node.colSpan,
169
+ rowSpan: node.rowSpan,
170
+ isGroup: node.isGroup,
171
+ columnDefinition: node.columnDefinition,
172
+ groupDefinition: node.groupDefinition,
173
+ parentGroupIds: parentChain,
174
+ colIndex: node.colIndex,
175
+ };
176
+ if (!rowsMap.has(node.rowIndex)) {
177
+ rowsMap.set(node.rowIndex, []);
178
+ }
179
+ rowsMap.get(node.rowIndex).push(entry);
180
+ if (node.isColumn && node.columnDefinition && parentChain.length > 0) {
181
+ columnToParentIds.set(node.id, parentChain);
182
+ }
183
+ queue.push(...node.children);
184
+ }
185
+ // Sort row indices to ensure rows are ordered top-to-bottom,
186
+ // then sort columns within each row by their horizontal position.
187
+ const rows = Array.from(rowsMap.keys())
188
+ .sort((a, b) => a - b)
189
+ .map(key => ({ columns: rowsMap.get(key).sort((a, b) => a.colIndex - b.colIndex) }));
190
+ return { rows, maxDepth, columnToParentIds };
191
+ }
192
+ export function getColumnGroupsDepth(columnDisplay) {
193
+ if (!columnDisplay) {
194
+ return 0;
195
+ }
196
+ let maxDepth = 0;
197
+ for (const item of columnDisplay) {
198
+ if (item.type === 'group') {
199
+ maxDepth = Math.max(maxDepth, 1 + getColumnGroupsDepth(item.children));
200
+ }
201
+ }
202
+ return maxDepth;
203
+ }
204
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/table/column-groups/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { warnOnce } from '@cloudscape-design/component-toolkit/internal';\n\nimport { TableProps } from '../interfaces';\nimport { getVisibleColumnDefinitions } from '../utils';\n\nexport interface HeaderRowColumn<T> {\n id: string;\n header?: React.ReactNode;\n colSpan: number;\n rowSpan: number;\n isGroup: boolean;\n columnDefinition?: TableProps.ColumnDefinition<T>;\n groupDefinition?: TableProps.GroupDefinition;\n parentGroupIds: string[];\n colIndex: number;\n}\n\nexport interface HeaderRow<T> {\n columns: HeaderRowColumn<T>[];\n}\n\nexport interface ColumnGroupsLayout<T> {\n rows: HeaderRow<T>[];\n maxDepth: number;\n columnToParentIds: Map<string, string[]>;\n}\n\nexport interface TableHeaderNodeProps<T> {\n columnDefinition?: TableProps.ColumnDefinition<T>;\n groupDefinition?: TableProps.GroupDefinition;\n isRoot?: boolean;\n colSpan?: number;\n rowSpan?: number;\n rowIndex?: number;\n colIndex?: number;\n}\n\n/**\n * A node in the table header tree.\n * - Column nodes map to column definitions.\n * - Internal nodes map to group definitions.\n * - The root is a virtual container (never rendered).\n */\nexport class TableHeaderNode<T> {\n public readonly id: string;\n public readonly isRoot: boolean;\n public readonly columnDefinition?: TableProps.ColumnDefinition<T>;\n public readonly groupDefinition?: TableProps.GroupDefinition;\n\n public colSpan: number;\n public rowSpan: number;\n public rowIndex: number;\n public colIndex: number;\n public subTreeHeight: number = 1;\n\n public children: TableHeaderNode<T>[] = [];\n public parent?: TableHeaderNode<T>;\n\n constructor(id: string, props: TableHeaderNodeProps<T> = {}) {\n this.id = id;\n this.isRoot = props.isRoot ?? false;\n this.columnDefinition = props.columnDefinition;\n this.groupDefinition = props.groupDefinition;\n this.colSpan = props.colSpan ?? 1;\n this.rowSpan = props.rowSpan ?? 1;\n this.rowIndex = props.rowIndex ?? -1;\n this.colIndex = props.colIndex ?? -1;\n }\n\n get isGroup(): boolean {\n return !!this.groupDefinition;\n }\n\n get isColumn(): boolean {\n return !this.isRoot && this.children.length === 0;\n }\n\n addChild(child: TableHeaderNode<T>): void {\n this.children.push(child);\n child.parent = this;\n }\n}\n\n/**\n * Builds the tree from the nested columnDisplay structure.\n * Groups are only attached if they contain at least one visible descendant.\n */\nfunction buildTreeFromColumnDisplay<T>(\n displayItems: ReadonlyArray<TableProps.ColumnDisplayProperties>,\n nodeMap: Map<string, TableHeaderNode<T>>,\n parent: TableHeaderNode<T>\n): void {\n for (const item of displayItems) {\n if (item.type === 'group') {\n const groupNode = nodeMap.get(item.id);\n if (!groupNode) {\n warnOnce('[Table]', `Group \"${item.id}\" referenced in columnDisplay not found in groupDefinitions. Skipping.`);\n continue;\n }\n buildTreeFromColumnDisplay(item.children, nodeMap, groupNode);\n // Only attach group if it has visible descendants. The recursive call above\n // only adds children that are either visible columns or nested groups with\n // their own visible descendants, so this check handles all nesting levels.\n if (groupNode.children.length > 0) {\n parent.addChild(groupNode);\n }\n } else {\n if (!item.visible) {\n continue;\n }\n const colNode = nodeMap.get(item.id);\n if (colNode) {\n parent.addChild(colNode);\n }\n }\n }\n}\n\n/**\n * Fallback when no columnDisplay is provided: all visible columns attach directly to root.\n */\nfunction buildTreeFromVisibleColumns<T>(\n visibleColumns: Readonly<TableProps.ColumnDefinition<T>[]>,\n nodeMap: Map<string, TableHeaderNode<T>>,\n root: TableHeaderNode<T>\n): void {\n for (const col of visibleColumns) {\n // Columns without IDs cannot participate in grouping, they have no key\n // to match against columnDisplay entries or groupDefinitions.\n if (!col.id) {\n continue;\n }\n const node = nodeMap.get(col.id);\n if (node) {\n root.addChild(node);\n }\n }\n}\n\nfunction computeSubTreeHeights<T>(node: TableHeaderNode<T>): number {\n if (node.isColumn || node.children.length === 0) {\n node.subTreeHeight = 1;\n return 1;\n }\n const maxChildHeight = Math.max(...node.children.map(child => computeSubTreeHeights(child)));\n node.subTreeHeight = maxChildHeight + 1;\n return node.subTreeHeight;\n}\n\nfunction computeRowSpansAndIndices<T>(node: TableHeaderNode<T>, treeHeight: number, ancestorRows: number = 0): void {\n const maxChildHeight = Math.max(...node.children.map(c => c.subTreeHeight), 0);\n node.rowSpan = treeHeight - ancestorRows - maxChildHeight;\n\n if (node.parent) {\n node.rowIndex = node.parent.rowIndex + node.parent.rowSpan;\n }\n\n for (const child of node.children) {\n computeRowSpansAndIndices(child, treeHeight, ancestorRows + node.rowSpan);\n }\n}\n\nfunction computeColSpansAndIndices<T>(node: TableHeaderNode<T>, startCol: number = 0): number {\n node.colIndex = startCol;\n\n if (node.isColumn) {\n node.colSpan = 1;\n return startCol + 1;\n }\n\n let nextCol = startCol;\n for (const child of node.children) {\n nextCol = computeColSpansAndIndices(child, nextCol);\n }\n\n node.colSpan = nextCol - startCol;\n return nextCol;\n}\n\nexport function calculateHierarchyTree<T>(\n columnDefinitions: ReadonlyArray<TableProps.ColumnDefinition<T>>,\n visibleColumnIds: readonly string[],\n groupDefinitions: ReadonlyArray<TableProps.GroupDefinition>,\n columnDisplay?: ReadonlyArray<TableProps.ColumnDisplayProperties>\n): ColumnGroupsLayout<T> {\n const visibleColumns = getVisibleColumnDefinitions({\n columnDisplay,\n visibleColumns: visibleColumnIds,\n columnDefinitions,\n });\n\n const nodeMap = new Map<string, TableHeaderNode<T>>();\n\n for (const col of visibleColumns) {\n if (col.id) {\n nodeMap.set(col.id, new TableHeaderNode<T>(col.id, { columnDefinition: col }));\n }\n }\n\n for (const group of groupDefinitions) {\n nodeMap.set(group.id, new TableHeaderNode<T>(group.id, { groupDefinition: group }));\n }\n\n const root = new TableHeaderNode<T>('*', { isRoot: true });\n\n if (columnDisplay && columnDisplay.length > 0) {\n buildTreeFromColumnDisplay(columnDisplay, nodeMap, root);\n } else {\n buildTreeFromVisibleColumns(visibleColumns, nodeMap, root);\n }\n\n computeSubTreeHeights(root);\n\n const treeHeight = root.subTreeHeight - 1;\n root.rowIndex = -1;\n root.rowSpan = 1;\n root.colSpan = visibleColumns.length;\n\n for (const child of root.children) {\n computeRowSpansAndIndices(child, treeHeight);\n }\n\n computeColSpansAndIndices(root);\n\n return buildOutput(root, treeHeight);\n}\n\nfunction getParentChain<T>(node: TableHeaderNode<T>): string[] {\n const chain: string[] = [];\n let current = node.parent;\n while (current && !current.isRoot) {\n chain.unshift(current.id);\n current = current.parent;\n }\n return chain;\n}\n\nfunction buildOutput<T>(root: TableHeaderNode<T>, maxDepth: number): ColumnGroupsLayout<T> {\n const rowsMap = new Map<number, HeaderRowColumn<T>[]>();\n const columnToParentIds = new Map<string, string[]>();\n\n const queue: TableHeaderNode<T>[] = [...root.children];\n\n while (queue.length > 0) {\n const node = queue.shift()!;\n const parentChain = getParentChain(node);\n\n const entry: HeaderRowColumn<T> = {\n id: node.id,\n header: node.groupDefinition?.header ?? node.columnDefinition?.header,\n colSpan: node.colSpan,\n rowSpan: node.rowSpan,\n isGroup: node.isGroup,\n columnDefinition: node.columnDefinition,\n groupDefinition: node.groupDefinition,\n parentGroupIds: parentChain,\n colIndex: node.colIndex,\n };\n\n if (!rowsMap.has(node.rowIndex)) {\n rowsMap.set(node.rowIndex, []);\n }\n rowsMap.get(node.rowIndex)!.push(entry);\n\n if (node.isColumn && node.columnDefinition && parentChain.length > 0) {\n columnToParentIds.set(node.id, parentChain);\n }\n\n queue.push(...node.children);\n }\n\n // Sort row indices to ensure rows are ordered top-to-bottom,\n // then sort columns within each row by their horizontal position.\n const rows: HeaderRow<T>[] = Array.from(rowsMap.keys())\n .sort((a, b) => a - b)\n .map(key => ({ columns: rowsMap.get(key)!.sort((a, b) => a.colIndex - b.colIndex) }));\n\n return { rows, maxDepth, columnToParentIds };\n}\n\nexport function getColumnGroupsDepth(columnDisplay?: ReadonlyArray<TableProps.ColumnDisplayProperties>): number {\n if (!columnDisplay) {\n return 0;\n }\n let maxDepth = 0;\n for (const item of columnDisplay) {\n if (item.type === 'group') {\n maxDepth = Math.max(maxDepth, 1 + getColumnGroupsDepth(item.children));\n }\n }\n return maxDepth;\n}\n"]}
@@ -0,0 +1,24 @@
1
+ import { ColumnWidthStyle } from '../column-widths-utils';
2
+ import { TableProps } from '../interfaces';
3
+ import { StickyColumnsModel } from '../sticky-columns';
4
+ import { TableRole } from '../table-role';
5
+ export interface BaseHeaderCellProps {
6
+ tabIndex: number;
7
+ colIndex: number;
8
+ focusedComponent?: null | string;
9
+ resizableColumns?: boolean;
10
+ resizableStyle?: ColumnWidthStyle;
11
+ onResizeFinish: () => void;
12
+ sticky?: boolean;
13
+ hidden?: boolean;
14
+ stripedRows?: boolean;
15
+ stickyState: StickyColumnsModel;
16
+ cellRef: React.RefCallback<HTMLElement>;
17
+ tableRole: TableRole;
18
+ resizerRoleDescription?: string;
19
+ resizerTooltipText?: string;
20
+ variant: TableProps.Variant;
21
+ tableVariant?: TableProps.Variant;
22
+ wrapLines?: boolean;
23
+ }
24
+ //# sourceMappingURL=common-props.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common-props.d.ts","sourceRoot":"","sources":["../../../../src/table/header-cell/common-props.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IACjC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,kBAAkB,CAAC;IAChC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IACxC,SAAS,EAAE,SAAS,CAAC;IACrB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC;IAC5B,YAAY,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB"}
@@ -0,0 +1,4 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export {};
4
+ //# sourceMappingURL=common-props.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common-props.js","sourceRoot":"","sources":["../../../../src/table/header-cell/common-props.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { ColumnWidthStyle } from '../column-widths-utils';\nimport { TableProps } from '../interfaces';\nimport { StickyColumnsModel } from '../sticky-columns';\nimport { TableRole } from '../table-role';\n\nexport interface BaseHeaderCellProps {\n tabIndex: number;\n colIndex: number;\n focusedComponent?: null | string;\n resizableColumns?: boolean;\n resizableStyle?: ColumnWidthStyle;\n onResizeFinish: () => void;\n sticky?: boolean;\n hidden?: boolean;\n stripedRows?: boolean;\n stickyState: StickyColumnsModel;\n cellRef: React.RefCallback<HTMLElement>;\n tableRole: TableRole;\n resizerRoleDescription?: string;\n resizerTooltipText?: string;\n variant: TableProps.Variant;\n tableVariant?: TableProps.Variant;\n wrapLines?: boolean;\n}\n"]}
@@ -0,0 +1,18 @@
1
+ import { TableProps } from '../interfaces';
2
+ import { BaseHeaderCellProps } from './common-props';
3
+ export interface TableGroupHeaderCellProps extends BaseHeaderCellProps {
4
+ group: TableProps.GroupDefinition;
5
+ colspan: number;
6
+ rowspan: number;
7
+ groupId: string;
8
+ updateGroupWidth: (groupId: PropertyKey, newWidth: number) => void;
9
+ childColumnIds: PropertyKey[];
10
+ firstChildColumnId?: PropertyKey;
11
+ lastChildColumnId?: PropertyKey;
12
+ columnGroupId?: string;
13
+ stickyColumnId?: PropertyKey;
14
+ stickyBoundaryColumnId?: PropertyKey;
15
+ isLast?: boolean;
16
+ }
17
+ export declare function TableGroupHeaderCell({ group, colspan, rowspan, colIndex, groupId, resizableColumns, resizableStyle, onResizeFinish, updateGroupWidth, childColumnIds, focusedComponent, tabIndex, sticky, hidden, stripedRows, stickyState, cellRef, tableRole, resizerRoleDescription, resizerTooltipText, variant, tableVariant, columnGroupId, stickyColumnId, stickyBoundaryColumnId, isLast, wrapLines, }: TableGroupHeaderCellProps): JSX.Element;
18
+ //# sourceMappingURL=group-header-cell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-header-cell.d.ts","sourceRoot":"","sources":["../../../../src/table/header-cell/group-header-cell.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAK3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAKrD,MAAM,WAAW,yBAA0B,SAAQ,mBAAmB;IACpE,KAAK,EAAE,UAAU,CAAC,eAAe,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACnE,cAAc,EAAE,WAAW,EAAE,CAAC;IAC9B,kBAAkB,CAAC,EAAE,WAAW,CAAC;IACjC,iBAAiB,CAAC,EAAE,WAAW,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,WAAW,CAAC;IAC7B,sBAAsB,CAAC,EAAE,WAAW,CAAC;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,OAAO,EACP,OAAO,EACP,QAAQ,EACR,OAAO,EACP,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,QAAQ,EACR,MAAM,EACN,MAAM,EACN,WAAW,EACX,WAAW,EACX,OAAO,EACP,SAAS,EACT,sBAAsB,EACtB,kBAAkB,EAClB,OAAO,EACP,YAAY,EACZ,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,MAAM,EACN,SAAS,GACV,EAAE,yBAAyB,eAmF3B"}
@@ -0,0 +1,44 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import React, { useRef } from 'react';
4
+ import clsx from 'clsx';
5
+ import { useSingleTabStopNavigation } from '@cloudscape-design/component-toolkit/internal';
6
+ import { useUniqueId } from '@cloudscape-design/component-toolkit/internal';
7
+ import { Divider, Resizer } from '../resizer';
8
+ import { useStickyCellStyles } from '../sticky-columns';
9
+ import { DEFAULT_COLUMN_WIDTH, useColumnWidths } from '../use-column-widths';
10
+ import { getStickyClassNames } from '../utils';
11
+ import { TableThElement } from './th-element';
12
+ import styles from './styles.css.js';
13
+ export function TableGroupHeaderCell({ group, colspan, rowspan, colIndex, groupId, resizableColumns, resizableStyle, onResizeFinish, updateGroupWidth, childColumnIds, focusedComponent, tabIndex, sticky, hidden, stripedRows, stickyState, cellRef, tableRole, resizerRoleDescription, resizerTooltipText, variant, tableVariant, columnGroupId, stickyColumnId, stickyBoundaryColumnId, isLast, wrapLines, }) {
14
+ var _a, _b;
15
+ const headerId = useUniqueId('table-group-header-');
16
+ const { columnWidths } = useColumnWidths();
17
+ // Effective min = sum of non-rightmost children's current widths (fixed) + rightmost child's minWidth
18
+ const lastChild = childColumnIds[childColumnIds.length - 1];
19
+ const groupMinWidth = childColumnIds.reduce((sum, id) => {
20
+ if (id === lastChild) {
21
+ return sum + DEFAULT_COLUMN_WIDTH;
22
+ }
23
+ return sum + (columnWidths.get(id) || DEFAULT_COLUMN_WIDTH);
24
+ }, 0);
25
+ const clickableHeaderRef = useRef(null);
26
+ const { tabIndex: clickableHeaderTabIndex } = useSingleTabStopNavigation(clickableHeaderRef, { tabIndex });
27
+ // Subscribe to the boundary column's sticky state to inherit shadow/clip-path classes.
28
+ // The offset/position comes from stickyColumnId (first child); this only adds boundary classes.
29
+ const boundaryStyles = useStickyCellStyles({
30
+ stickyColumns: stickyState,
31
+ columnId: (_a = stickyBoundaryColumnId !== null && stickyBoundaryColumnId !== void 0 ? stickyBoundaryColumnId : stickyColumnId) !== null && _a !== void 0 ? _a : groupId,
32
+ getClassName: props => getStickyClassNames(styles, props),
33
+ });
34
+ // boundaryStyles.className is populated by scroll/intersection observers in the browser.
35
+ // In JSDOM these observers don't fire, so this branch is only exercised in integration tests.
36
+ const boundaryClassName = stickyBoundaryColumnId && boundaryStyles.className ? boundaryStyles.className : undefined;
37
+ return (React.createElement(TableThElement, { resizableStyle: resizableStyle, cellRef: cellRef, focusedComponent: focusedComponent, sticky: sticky, resizable: resizableColumns, hidden: hidden, stripedRows: stripedRows, colIndex: colIndex, columnId: stickyColumnId !== null && stickyColumnId !== void 0 ? stickyColumnId : groupId, stickyState: stickyState, tableRole: tableRole, variant: variant, tableVariant: tableVariant, colSpan: colspan, rowSpan: rowspan, scope: "colgroup", isLast: isLast, columnGroupId: columnGroupId, className: boundaryClassName, boundaryRef: stickyBoundaryColumnId ? boundaryStyles.ref : undefined },
38
+ React.createElement("div", { ref: clickableHeaderRef, "data-focus-id": `group-header-${groupId}`, className: clsx(styles['header-cell-content'], {
39
+ [styles['header-cell-fake-focus']]: focusedComponent === `group-header-${groupId}`,
40
+ }), "aria-label": (_b = group.ariaLabel) === null || _b === void 0 ? void 0 : _b.call(group, { sorted: false, descending: false, disabled: true }), tabIndex: clickableHeaderTabIndex },
41
+ React.createElement("div", { className: clsx(styles['header-cell-text'], wrapLines && styles['header-cell-text-wrap']), id: headerId }, group.header)),
42
+ resizableColumns ? (React.createElement(Resizer, { tabIndex: tabIndex, focusId: `resize-group-${groupId}`, showFocusRing: focusedComponent === `resize-group-${groupId}`, onWidthUpdate: newWidth => updateGroupWidth(groupId, newWidth), onWidthUpdateCommit: onResizeFinish, ariaLabelledby: headerId, minWidth: groupMinWidth, roleDescription: resizerRoleDescription, tooltipText: resizerTooltipText, isBorderless: variant === 'full-page' || variant === 'embedded' || variant === 'borderless', isLast: isLast, dividerPosition: columnGroupId ? 'full' : 'bottom' })) : (React.createElement(Divider, { position: columnGroupId ? 'full' : 'bottom' }))));
43
+ }
44
+ //# sourceMappingURL=group-header-cell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-header-cell.js","sourceRoot":"","sources":["../../../../src/table/header-cell/group-header-cell.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport React, { useRef } from 'react';\nimport clsx from 'clsx';\n\nimport { useSingleTabStopNavigation } from '@cloudscape-design/component-toolkit/internal';\nimport { useUniqueId } from '@cloudscape-design/component-toolkit/internal';\n\nimport { TableProps } from '../interfaces';\nimport { Divider, Resizer } from '../resizer';\nimport { useStickyCellStyles } from '../sticky-columns';\nimport { DEFAULT_COLUMN_WIDTH, useColumnWidths } from '../use-column-widths';\nimport { getStickyClassNames } from '../utils';\nimport { BaseHeaderCellProps } from './common-props';\nimport { TableThElement } from './th-element';\n\nimport styles from './styles.css.js';\n\nexport interface TableGroupHeaderCellProps extends BaseHeaderCellProps {\n group: TableProps.GroupDefinition;\n colspan: number;\n rowspan: number;\n groupId: string;\n updateGroupWidth: (groupId: PropertyKey, newWidth: number) => void;\n childColumnIds: PropertyKey[];\n firstChildColumnId?: PropertyKey;\n lastChildColumnId?: PropertyKey;\n columnGroupId?: string;\n stickyColumnId?: PropertyKey;\n stickyBoundaryColumnId?: PropertyKey;\n isLast?: boolean;\n}\n\nexport function TableGroupHeaderCell({\n group,\n colspan,\n rowspan,\n colIndex,\n groupId,\n resizableColumns,\n resizableStyle,\n onResizeFinish,\n updateGroupWidth,\n childColumnIds,\n focusedComponent,\n tabIndex,\n sticky,\n hidden,\n stripedRows,\n stickyState,\n cellRef,\n tableRole,\n resizerRoleDescription,\n resizerTooltipText,\n variant,\n tableVariant,\n columnGroupId,\n stickyColumnId,\n stickyBoundaryColumnId,\n isLast,\n wrapLines,\n}: TableGroupHeaderCellProps) {\n const headerId = useUniqueId('table-group-header-');\n const { columnWidths } = useColumnWidths();\n\n // Effective min = sum of non-rightmost children's current widths (fixed) + rightmost child's minWidth\n const lastChild = childColumnIds[childColumnIds.length - 1];\n const groupMinWidth = childColumnIds.reduce<number>((sum, id) => {\n if (id === lastChild) {\n return sum + DEFAULT_COLUMN_WIDTH;\n }\n return sum + (columnWidths.get(id) || DEFAULT_COLUMN_WIDTH);\n }, 0);\n const clickableHeaderRef = useRef<HTMLDivElement>(null);\n const { tabIndex: clickableHeaderTabIndex } = useSingleTabStopNavigation(clickableHeaderRef, { tabIndex });\n\n // Subscribe to the boundary column's sticky state to inherit shadow/clip-path classes.\n // The offset/position comes from stickyColumnId (first child); this only adds boundary classes.\n const boundaryStyles = useStickyCellStyles({\n stickyColumns: stickyState,\n columnId: stickyBoundaryColumnId ?? stickyColumnId ?? groupId,\n getClassName: props => getStickyClassNames(styles, props),\n });\n\n // boundaryStyles.className is populated by scroll/intersection observers in the browser.\n // In JSDOM these observers don't fire, so this branch is only exercised in integration tests.\n const boundaryClassName = stickyBoundaryColumnId && boundaryStyles.className ? boundaryStyles.className : undefined;\n\n return (\n <TableThElement\n resizableStyle={resizableStyle}\n cellRef={cellRef}\n focusedComponent={focusedComponent}\n sticky={sticky}\n resizable={resizableColumns}\n hidden={hidden}\n stripedRows={stripedRows}\n colIndex={colIndex}\n columnId={stickyColumnId ?? groupId}\n stickyState={stickyState}\n tableRole={tableRole}\n variant={variant}\n tableVariant={tableVariant}\n colSpan={colspan}\n rowSpan={rowspan}\n scope=\"colgroup\"\n isLast={isLast}\n columnGroupId={columnGroupId}\n className={boundaryClassName}\n boundaryRef={stickyBoundaryColumnId ? boundaryStyles.ref : undefined}\n >\n <div\n ref={clickableHeaderRef}\n data-focus-id={`group-header-${groupId}`}\n className={clsx(styles['header-cell-content'], {\n [styles['header-cell-fake-focus']]: focusedComponent === `group-header-${groupId}`,\n })}\n aria-label={group.ariaLabel?.({ sorted: false, descending: false, disabled: true })}\n tabIndex={clickableHeaderTabIndex}\n >\n <div className={clsx(styles['header-cell-text'], wrapLines && styles['header-cell-text-wrap'])} id={headerId}>\n {group.header}\n </div>\n </div>\n {resizableColumns ? (\n <Resizer\n tabIndex={tabIndex}\n focusId={`resize-group-${groupId}`}\n showFocusRing={focusedComponent === `resize-group-${groupId}`}\n onWidthUpdate={newWidth => updateGroupWidth(groupId, newWidth)}\n onWidthUpdateCommit={onResizeFinish}\n ariaLabelledby={headerId}\n minWidth={groupMinWidth}\n roleDescription={resizerRoleDescription}\n tooltipText={resizerTooltipText}\n isBorderless={variant === 'full-page' || variant === 'embedded' || variant === 'borderless'}\n isLast={isLast}\n dividerPosition={columnGroupId ? 'full' : 'bottom'}\n />\n ) : (\n <Divider position={columnGroupId ? 'full' : 'bottom'} />\n )}\n </TableThElement>\n );\n}\n"]}
@@ -1,37 +1,22 @@
1
- import React from 'react';
2
- import { ColumnWidthStyle } from '../column-widths-utils';
3
1
  import { TableProps } from '../interfaces';
4
- import { StickyColumnsModel } from '../sticky-columns';
5
- import { TableRole } from '../table-role';
6
- export interface TableHeaderCellProps<ItemType> {
7
- tabIndex: number;
2
+ import { BaseHeaderCellProps } from './common-props';
3
+ export interface TableHeaderCellProps<ItemType> extends BaseHeaderCellProps {
8
4
  column: TableProps.ColumnDefinition<ItemType>;
9
5
  activeSortingColumn?: TableProps.SortingColumn<ItemType>;
10
6
  sortingDescending?: boolean;
11
7
  sortingDisabled?: boolean;
12
- wrapLines?: boolean;
13
8
  stuck?: boolean;
14
- sticky?: boolean;
15
- hidden?: boolean;
16
- stripedRows?: boolean;
17
9
  onClick(detail: TableProps.SortingState<any>): void;
18
- onResizeFinish: () => void;
19
- colIndex: number;
20
10
  updateColumn: (columnId: PropertyKey, newWidth: number) => void;
21
- resizableColumns?: boolean;
22
- resizableStyle?: ColumnWidthStyle;
23
11
  isEditable?: boolean;
24
12
  columnId: PropertyKey;
25
- stickyState: StickyColumnsModel;
26
- cellRef: React.RefCallback<HTMLElement>;
27
- focusedComponent?: null | string;
28
- tableRole: TableRole;
29
- resizerRoleDescription?: string;
30
- resizerTooltipText?: string;
31
13
  isExpandable?: boolean;
32
14
  hasDynamicContent?: boolean;
33
- variant: TableProps.Variant;
34
- tableVariant?: TableProps.Variant;
15
+ colSpan?: number;
16
+ rowSpan?: number;
17
+ columnGroupId?: string;
18
+ isLastChildOfGroup?: boolean;
19
+ isLast?: boolean;
35
20
  }
36
- export declare function TableHeaderCell<ItemType>({ tabIndex, column, activeSortingColumn, sortingDescending, sortingDisabled, wrapLines, focusedComponent, stuck, sticky, hidden, stripedRows, onClick, colIndex, updateColumn, resizableColumns, resizableStyle, onResizeFinish, isEditable, columnId, stickyState, cellRef, tableRole, resizerRoleDescription, resizerTooltipText, isExpandable, hasDynamicContent, variant, tableVariant, }: TableHeaderCellProps<ItemType>): JSX.Element;
21
+ export declare function TableHeaderCell<ItemType>({ tabIndex, column, activeSortingColumn, sortingDescending, sortingDisabled, wrapLines, focusedComponent, stuck, sticky, hidden, stripedRows, onClick, colIndex, updateColumn, resizableColumns, resizableStyle, onResizeFinish, isEditable, columnId, stickyState, cellRef, tableRole, resizerRoleDescription, resizerTooltipText, isExpandable, hasDynamicContent, variant, colSpan, rowSpan, columnGroupId, isLastChildOfGroup, isLast, tableVariant, }: TableHeaderCellProps<ItemType>): JSX.Element;
37
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/table/header-cell/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAiB,MAAM,OAAO,CAAC;AAWtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAO1C,MAAM,WAAW,oBAAoB,CAAC,QAAQ;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC9C,mBAAmB,CAAC,EAAE,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACzD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACpD,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,WAAW,CAAC;IACtB,WAAW,EAAE,kBAAkB,CAAC;IAChC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IACxC,gBAAgB,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IACjC,SAAS,EAAE,SAAS,CAAC;IACrB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC;IAC5B,YAAY,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC;CACnC;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,EACxC,QAAQ,EACR,MAAM,EACN,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,gBAAgB,EAChB,KAAK,EACL,MAAM,EACN,MAAM,EACN,WAAW,EACX,OAAO,EACP,QAAQ,EACR,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,UAAU,EACV,QAAQ,EACR,WAAW,EACX,OAAO,EACP,SAAS,EACT,sBAAsB,EACtB,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,OAAO,EACP,YAAY,GACb,EAAE,oBAAoB,CAAC,QAAQ,CAAC,eA0IhC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/table/header-cell/index.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAOrD,MAAM,WAAW,oBAAoB,CAAC,QAAQ,CAAE,SAAQ,mBAAmB;IACzE,MAAM,EAAE,UAAU,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC9C,mBAAmB,CAAC,EAAE,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACzD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACpD,YAAY,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,WAAW,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,EACxC,QAAQ,EACR,MAAM,EACN,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,gBAAgB,EAChB,KAAK,EACL,MAAM,EACN,MAAM,EACN,WAAW,EACX,OAAO,EACP,QAAQ,EACR,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,UAAU,EACV,QAAQ,EACR,WAAW,EACX,OAAO,EACP,SAAS,EACT,sBAAsB,EACtB,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,OAAO,EACP,OAAO,EACP,OAAO,EACP,aAAa,EACb,kBAAkB,EAClB,MAAM,EACN,YAAY,GACb,EAAE,oBAAoB,CAAC,QAAQ,CAAC,eAgJhC"}
@@ -13,7 +13,7 @@ import { TableThElement } from './th-element';
13
13
  import { getSortingIconName, getSortingStatus, isSorted } from './utils';
14
14
  import analyticsSelectors from '../analytics-metadata/styles.css.js';
15
15
  import styles from './styles.css.js';
16
- export function TableHeaderCell({ tabIndex, column, activeSortingColumn, sortingDescending, sortingDisabled, wrapLines, focusedComponent, stuck, sticky, hidden, stripedRows, onClick, colIndex, updateColumn, resizableColumns, resizableStyle, onResizeFinish, isEditable, columnId, stickyState, cellRef, tableRole, resizerRoleDescription, resizerTooltipText, isExpandable, hasDynamicContent, variant, tableVariant, }) {
16
+ export function TableHeaderCell({ tabIndex, column, activeSortingColumn, sortingDescending, sortingDisabled, wrapLines, focusedComponent, stuck, sticky, hidden, stripedRows, onClick, colIndex, updateColumn, resizableColumns, resizableStyle, onResizeFinish, isEditable, columnId, stickyState, cellRef, tableRole, resizerRoleDescription, resizerTooltipText, isExpandable, hasDynamicContent, variant, colSpan, rowSpan, columnGroupId, isLastChildOfGroup, isLast, tableVariant, }) {
17
17
  var _a;
18
18
  const i18n = useInternalI18n('table');
19
19
  const sortable = !!column.sortingComparator || !!column.sortingField;
@@ -46,7 +46,7 @@ export function TableHeaderCell({ tabIndex, column, activeSortingColumn, sorting
46
46
  useResizeObserver(hasDynamicContent ? cellRefObject : () => null, entry => {
47
47
  updateColumn(columnId, entry.borderBoxWidth);
48
48
  });
49
- return (React.createElement(TableThElement, { resizableStyle: resizableStyle, cellRef: cellRefCombined, sortingStatus: sortingStatus, sortingDisabled: sortingDisabled, focusedComponent: focusedComponent, stuck: stuck, sticky: sticky, resizable: resizableColumns, hidden: hidden, stripedRows: stripedRows, colIndex: colIndex, columnId: columnId, stickyState: stickyState, tableRole: tableRole, variant: variant, tableVariant: tableVariant, ...(sortingDisabled
49
+ return (React.createElement(TableThElement, { resizableStyle: resizableStyle, cellRef: cellRefCombined, sortingStatus: sortingStatus, sortingDisabled: sortingDisabled, focusedComponent: focusedComponent, stuck: stuck, sticky: sticky, resizable: resizableColumns, hidden: hidden, stripedRows: stripedRows, colIndex: colIndex, columnId: columnId, stickyState: stickyState, tableRole: tableRole, variant: variant, tableVariant: tableVariant, colSpan: colSpan, rowSpan: rowSpan, columnGroupId: columnGroupId, isLast: isLast, ...(sortingDisabled
50
50
  ? {}
51
51
  : getAnalyticsMetadataAttribute({
52
52
  action: 'sort',
@@ -83,6 +83,6 @@ export function TableHeaderCell({ tabIndex, column, activeSortingColumn, sorting
83
83
  resizableColumns ? (React.createElement(Resizer, { tabIndex: tabIndex, focusId: `resize-control-${String(columnId)}`, showFocusRing: focusedComponent === `resize-control-${String(columnId)}`, onWidthUpdate: newWidth => updateColumn(columnId, newWidth), onWidthUpdateCommit: onResizeFinish, ariaLabelledby: headerId, minWidth: typeof column.minWidth === 'string' ? parseInt(column.minWidth) : column.minWidth, roleDescription: i18n('ariaLabels.resizerRoleDescription', resizerRoleDescription),
84
84
  // TODO: Replace with this when strings are available
85
85
  // tooltipText={i18n('ariaLabels.resizerTooltipText', resizerTooltipText)}
86
- tooltipText: resizerTooltipText, isBorderless: variant === 'full-page' || variant === 'embedded' || variant === 'borderless' })) : (React.createElement(Divider, { className: styles['resize-divider'] }))));
86
+ tooltipText: resizerTooltipText, isBorderless: variant === 'full-page' || variant === 'embedded' || variant === 'borderless', isLast: isLast, dividerPosition: isLastChildOfGroup ? 'top' : undefined })) : (React.createElement(Divider, { className: styles['resize-divider'], position: isLastChildOfGroup ? 'top' : undefined }))));
87
87
  }
88
88
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/table/header-cell/index.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport React, { useRef } from 'react';\nimport clsx from 'clsx';\n\nimport { useMergeRefs, useResizeObserver, useUniqueId } from '@cloudscape-design/component-toolkit/internal';\nimport { useSingleTabStopNavigation } from '@cloudscape-design/component-toolkit/internal';\nimport { getAnalyticsMetadataAttribute } from '@cloudscape-design/component-toolkit/internal/analytics-metadata';\n\nimport { useInternalI18n } from '../../i18n/context';\nimport InternalIcon from '../../icon/internal';\nimport { KeyCode } from '../../internal/keycode';\nimport { GeneratedAnalyticsMetadataTableSort } from '../analytics-metadata/interfaces';\nimport { ColumnWidthStyle } from '../column-widths-utils';\nimport { TableProps } from '../interfaces';\nimport { Divider, Resizer } from '../resizer';\nimport { StickyColumnsModel } from '../sticky-columns';\nimport { TableRole } from '../table-role';\nimport { TableThElement } from './th-element';\nimport { getSortingIconName, getSortingStatus, isSorted } from './utils';\n\nimport analyticsSelectors from '../analytics-metadata/styles.css.js';\nimport styles from './styles.css.js';\n\nexport interface TableHeaderCellProps<ItemType> {\n tabIndex: number;\n column: TableProps.ColumnDefinition<ItemType>;\n activeSortingColumn?: TableProps.SortingColumn<ItemType>;\n sortingDescending?: boolean;\n sortingDisabled?: boolean;\n wrapLines?: boolean;\n stuck?: boolean;\n sticky?: boolean;\n hidden?: boolean;\n stripedRows?: boolean;\n onClick(detail: TableProps.SortingState<any>): void;\n onResizeFinish: () => void;\n colIndex: number;\n updateColumn: (columnId: PropertyKey, newWidth: number) => void;\n resizableColumns?: boolean;\n resizableStyle?: ColumnWidthStyle;\n isEditable?: boolean;\n columnId: PropertyKey;\n stickyState: StickyColumnsModel;\n cellRef: React.RefCallback<HTMLElement>;\n focusedComponent?: null | string;\n tableRole: TableRole;\n resizerRoleDescription?: string;\n resizerTooltipText?: string;\n isExpandable?: boolean;\n hasDynamicContent?: boolean;\n variant: TableProps.Variant;\n tableVariant?: TableProps.Variant;\n}\n\nexport function TableHeaderCell<ItemType>({\n tabIndex,\n column,\n activeSortingColumn,\n sortingDescending,\n sortingDisabled,\n wrapLines,\n focusedComponent,\n stuck,\n sticky,\n hidden,\n stripedRows,\n onClick,\n colIndex,\n updateColumn,\n resizableColumns,\n resizableStyle,\n onResizeFinish,\n isEditable,\n columnId,\n stickyState,\n cellRef,\n tableRole,\n resizerRoleDescription,\n resizerTooltipText,\n isExpandable,\n hasDynamicContent,\n variant,\n tableVariant,\n}: TableHeaderCellProps<ItemType>) {\n const i18n = useInternalI18n('table');\n const sortable = !!column.sortingComparator || !!column.sortingField;\n const sorted = !!activeSortingColumn && isSorted(column, activeSortingColumn);\n const sortingStatus = getSortingStatus(sortable, sorted, !!sortingDescending, !!sortingDisabled);\n const handleClick = () =>\n onClick({\n sortingColumn: column,\n isDescending: sorted ? !sortingDescending : false,\n });\n\n // Elements with role=\"button\" do not have the default behavior of <button>, where pressing\n // Enter or Space will trigger a click event. Therefore we need to add this ourselves.\n // The native <button> element cannot be used due to a misaligned implementation in Firefox:\n // https://bugzilla.mozilla.org/show_bug.cgi?id=843003\n const handleKeyPress = ({ nativeEvent: e }: React.KeyboardEvent) => {\n if (e.keyCode === KeyCode.enter || e.keyCode === KeyCode.space) {\n e.preventDefault();\n handleClick();\n }\n };\n\n const headerId = useUniqueId('table-header-');\n\n const clickableHeaderRef = useRef<HTMLDivElement>(null);\n const { tabIndex: clickableHeaderTabIndex } = useSingleTabStopNavigation(clickableHeaderRef, { tabIndex });\n\n const cellRefObject = useRef<HTMLElement>(null);\n const cellRefCombined = useMergeRefs(cellRef, cellRefObject);\n\n // Keep sticky and non-sticky headers in sync for dynamic cell\n // content changes. This is only needed when:\n // - Column has dynamic content\n // - This is the non-sticky version of a sticky header (hidden === true)\n // - Columns are not resizable\n useResizeObserver(hasDynamicContent ? cellRefObject : () => null, entry => {\n updateColumn(columnId, entry.borderBoxWidth);\n });\n\n return (\n <TableThElement\n resizableStyle={resizableStyle}\n cellRef={cellRefCombined}\n sortingStatus={sortingStatus}\n sortingDisabled={sortingDisabled}\n focusedComponent={focusedComponent}\n stuck={stuck}\n sticky={sticky}\n resizable={resizableColumns}\n hidden={hidden}\n stripedRows={stripedRows}\n colIndex={colIndex}\n columnId={columnId}\n stickyState={stickyState}\n tableRole={tableRole}\n variant={variant}\n tableVariant={tableVariant}\n {...(sortingDisabled\n ? {}\n : getAnalyticsMetadataAttribute({\n action: 'sort',\n detail: {\n position: `${colIndex + 1}`,\n columnId: column.id ? `${column.id}` : '',\n label: `.${analyticsSelectors['header-cell-text']}`,\n sortingDescending: `${!sortingDescending}`,\n },\n } as GeneratedAnalyticsMetadataTableSort))}\n >\n <div\n ref={clickableHeaderRef}\n data-focus-id={`sorting-control-${String(columnId)}`}\n className={clsx(styles['header-cell-content'], {\n [styles['header-cell-fake-focus']]: focusedComponent === `sorting-control-${String(columnId)}`,\n [styles['header-cell-content-expandable']]: isExpandable,\n })}\n aria-label={\n column.ariaLabel\n ? column.ariaLabel({\n sorted: sorted,\n descending: sorted && !!sortingDescending,\n disabled: !!sortingDisabled,\n })\n : undefined\n }\n {...(sortingStatus && !sortingDisabled\n ? {\n onKeyPress: handleKeyPress,\n tabIndex: clickableHeaderTabIndex,\n role: 'button',\n onClick: handleClick,\n }\n : {})}\n >\n <div\n className={clsx(\n styles['header-cell-text'],\n analyticsSelectors['header-cell-text'],\n wrapLines && styles['header-cell-text-wrap']\n )}\n id={headerId}\n >\n {column.header}\n {isEditable ? (\n <span className={styles['edit-icon']}>\n <InternalIcon\n name=\"edit\"\n ariaLabel={i18n('columnDefinitions.editConfig.editIconAriaLabel', column.editConfig?.editIconAriaLabel)}\n />\n </span>\n ) : null}\n </div>\n {sortingStatus && (\n <span className={styles['sorting-icon']}>\n <InternalIcon name={getSortingIconName(sortingStatus)} />\n </span>\n )}\n </div>\n {resizableColumns ? (\n <Resizer\n tabIndex={tabIndex}\n focusId={`resize-control-${String(columnId)}`}\n showFocusRing={focusedComponent === `resize-control-${String(columnId)}`}\n onWidthUpdate={newWidth => updateColumn(columnId, newWidth)}\n onWidthUpdateCommit={onResizeFinish}\n ariaLabelledby={headerId}\n minWidth={typeof column.minWidth === 'string' ? parseInt(column.minWidth) : column.minWidth}\n roleDescription={i18n('ariaLabels.resizerRoleDescription', resizerRoleDescription)}\n // TODO: Replace with this when strings are available\n // tooltipText={i18n('ariaLabels.resizerTooltipText', resizerTooltipText)}\n tooltipText={resizerTooltipText}\n isBorderless={variant === 'full-page' || variant === 'embedded' || variant === 'borderless'}\n />\n ) : (\n <Divider className={styles['resize-divider']} />\n )}\n </TableThElement>\n );\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/table/header-cell/index.tsx"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AACtC,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAC7G,OAAO,EAAE,0BAA0B,EAAE,MAAM,+CAA+C,CAAC;AAC3F,OAAO,EAAE,6BAA6B,EAAE,MAAM,kEAAkE,CAAC;AAEjH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,YAAY,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGjD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEzE,OAAO,kBAAkB,MAAM,qCAAqC,CAAC;AACrE,OAAO,MAAM,MAAM,iBAAiB,CAAC;AAqBrC,MAAM,UAAU,eAAe,CAAW,EACxC,QAAQ,EACR,MAAM,EACN,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,gBAAgB,EAChB,KAAK,EACL,MAAM,EACN,MAAM,EACN,WAAW,EACX,OAAO,EACP,QAAQ,EACR,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,UAAU,EACV,QAAQ,EACR,WAAW,EACX,OAAO,EACP,SAAS,EACT,sBAAsB,EACtB,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,OAAO,EACP,OAAO,EACP,OAAO,EACP,aAAa,EACb,kBAAkB,EAClB,MAAM,EACN,YAAY,GACmB;;IAC/B,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,iBAAiB,IAAI,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;IACrE,MAAM,MAAM,GAAG,CAAC,CAAC,mBAAmB,IAAI,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC9E,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC;IACjG,MAAM,WAAW,GAAG,GAAG,EAAE,CACvB,OAAO,CAAC;QACN,aAAa,EAAE,MAAM;QACrB,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK;KAClD,CAAC,CAAC;IAEL,2FAA2F;IAC3F,sFAAsF;IACtF,4FAA4F;IAC5F,sDAAsD;IACtD,MAAM,cAAc,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC,EAAuB,EAAE,EAAE;QACjE,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC;YAC/D,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,WAAW,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,WAAW,CAAC,eAAe,CAAC,CAAC;IAE9C,MAAM,kBAAkB,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACxD,MAAM,EAAE,QAAQ,EAAE,uBAAuB,EAAE,GAAG,0BAA0B,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE3G,MAAM,aAAa,GAAG,MAAM,CAAc,IAAI,CAAC,CAAC;IAChD,MAAM,eAAe,GAAG,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAE7D,8DAA8D;IAC9D,6CAA6C;IAC7C,+BAA+B;IAC/B,wEAAwE;IACxE,8BAA8B;IAC9B,iBAAiB,CAAC,iBAAiB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE;QACxE,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,oBAAC,cAAc,IACb,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,eAAe,EACxB,aAAa,EAAE,aAAa,EAC5B,eAAe,EAAE,eAAe,EAChC,gBAAgB,EAAE,gBAAgB,EAClC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,gBAAgB,EAC3B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,MAAM,KACV,CAAC,eAAe;YAClB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,6BAA6B,CAAC;gBAC5B,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE;oBACN,QAAQ,EAAE,GAAG,QAAQ,GAAG,CAAC,EAAE;oBAC3B,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;oBACzC,KAAK,EAAE,IAAI,kBAAkB,CAAC,kBAAkB,CAAC,EAAE;oBACnD,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,EAAE;iBAC3C;aACqC,CAAC,CAAC;QAE9C,6BACE,GAAG,EAAE,kBAAkB,mBACR,mBAAmB,MAAM,CAAC,QAAQ,CAAC,EAAE,EACpD,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,EAAE;gBAC7C,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,EAAE,gBAAgB,KAAK,mBAAmB,MAAM,CAAC,QAAQ,CAAC,EAAE;gBAC9F,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC,EAAE,YAAY;aACzD,CAAC,gBAEA,MAAM,CAAC,SAAS;gBACd,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;oBACf,MAAM,EAAE,MAAM;oBACd,UAAU,EAAE,MAAM,IAAI,CAAC,CAAC,iBAAiB;oBACzC,QAAQ,EAAE,CAAC,CAAC,eAAe;iBAC5B,CAAC;gBACJ,CAAC,CAAC,SAAS,KAEX,CAAC,aAAa,IAAI,CAAC,eAAe;gBACpC,CAAC,CAAC;oBACE,UAAU,EAAE,cAAc;oBAC1B,QAAQ,EAAE,uBAAuB;oBACjC,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,WAAW;iBACrB;gBACH,CAAC,CAAC,EAAE,CAAC;YAEP,6BACE,SAAS,EAAE,IAAI,CACb,MAAM,CAAC,kBAAkB,CAAC,EAC1B,kBAAkB,CAAC,kBAAkB,CAAC,EACtC,SAAS,IAAI,MAAM,CAAC,uBAAuB,CAAC,CAC7C,EACD,EAAE,EAAE,QAAQ;gBAEX,MAAM,CAAC,MAAM;gBACb,UAAU,CAAC,CAAC,CAAC,CACZ,8BAAM,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC;oBAClC,oBAAC,YAAY,IACX,IAAI,EAAC,MAAM,EACX,SAAS,EAAE,IAAI,CAAC,gDAAgD,EAAE,MAAA,MAAM,CAAC,UAAU,0CAAE,iBAAiB,CAAC,GACvG,CACG,CACR,CAAC,CAAC,CAAC,IAAI,CACJ;YACL,aAAa,IAAI,CAChB,8BAAM,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC;gBACrC,oBAAC,YAAY,IAAC,IAAI,EAAE,kBAAkB,CAAC,aAAa,CAAC,GAAI,CACpD,CACR,CACG;QACL,gBAAgB,CAAC,CAAC,CAAC,CAClB,oBAAC,OAAO,IACN,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,kBAAkB,MAAM,CAAC,QAAQ,CAAC,EAAE,EAC7C,aAAa,EAAE,gBAAgB,KAAK,kBAAkB,MAAM,CAAC,QAAQ,CAAC,EAAE,EACxE,aAAa,EAAE,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAC3D,mBAAmB,EAAE,cAAc,EACnC,cAAc,EAAE,QAAQ,EACxB,QAAQ,EAAE,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAC3F,eAAe,EAAE,IAAI,CAAC,mCAAmC,EAAE,sBAAsB,CAAC;YAClF,qDAAqD;YACrD,0EAA0E;YAC1E,WAAW,EAAE,kBAAkB,EAC/B,YAAY,EAAE,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,YAAY,EAC3F,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,GACvD,CACH,CAAC,CAAC,CAAC,CACF,oBAAC,OAAO,IAAC,SAAS,EAAE,MAAM,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,GAAI,CACnG,CACc,CAClB,CAAC;AACJ,CAAC","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport React, { useRef } from 'react';\nimport clsx from 'clsx';\n\nimport { useMergeRefs, useResizeObserver, useUniqueId } from '@cloudscape-design/component-toolkit/internal';\nimport { useSingleTabStopNavigation } from '@cloudscape-design/component-toolkit/internal';\nimport { getAnalyticsMetadataAttribute } from '@cloudscape-design/component-toolkit/internal/analytics-metadata';\n\nimport { useInternalI18n } from '../../i18n/context';\nimport InternalIcon from '../../icon/internal';\nimport { KeyCode } from '../../internal/keycode';\nimport { GeneratedAnalyticsMetadataTableSort } from '../analytics-metadata/interfaces';\nimport { TableProps } from '../interfaces';\nimport { Divider, Resizer } from '../resizer';\nimport { BaseHeaderCellProps } from './common-props';\nimport { TableThElement } from './th-element';\nimport { getSortingIconName, getSortingStatus, isSorted } from './utils';\n\nimport analyticsSelectors from '../analytics-metadata/styles.css.js';\nimport styles from './styles.css.js';\n\nexport interface TableHeaderCellProps<ItemType> extends BaseHeaderCellProps {\n column: TableProps.ColumnDefinition<ItemType>;\n activeSortingColumn?: TableProps.SortingColumn<ItemType>;\n sortingDescending?: boolean;\n sortingDisabled?: boolean;\n stuck?: boolean;\n onClick(detail: TableProps.SortingState<any>): void;\n updateColumn: (columnId: PropertyKey, newWidth: number) => void;\n isEditable?: boolean;\n columnId: PropertyKey;\n isExpandable?: boolean;\n hasDynamicContent?: boolean;\n colSpan?: number;\n rowSpan?: number;\n columnGroupId?: string;\n isLastChildOfGroup?: boolean;\n isLast?: boolean;\n}\n\nexport function TableHeaderCell<ItemType>({\n tabIndex,\n column,\n activeSortingColumn,\n sortingDescending,\n sortingDisabled,\n wrapLines,\n focusedComponent,\n stuck,\n sticky,\n hidden,\n stripedRows,\n onClick,\n colIndex,\n updateColumn,\n resizableColumns,\n resizableStyle,\n onResizeFinish,\n isEditable,\n columnId,\n stickyState,\n cellRef,\n tableRole,\n resizerRoleDescription,\n resizerTooltipText,\n isExpandable,\n hasDynamicContent,\n variant,\n colSpan,\n rowSpan,\n columnGroupId,\n isLastChildOfGroup,\n isLast,\n tableVariant,\n}: TableHeaderCellProps<ItemType>) {\n const i18n = useInternalI18n('table');\n const sortable = !!column.sortingComparator || !!column.sortingField;\n const sorted = !!activeSortingColumn && isSorted(column, activeSortingColumn);\n const sortingStatus = getSortingStatus(sortable, sorted, !!sortingDescending, !!sortingDisabled);\n const handleClick = () =>\n onClick({\n sortingColumn: column,\n isDescending: sorted ? !sortingDescending : false,\n });\n\n // Elements with role=\"button\" do not have the default behavior of <button>, where pressing\n // Enter or Space will trigger a click event. Therefore we need to add this ourselves.\n // The native <button> element cannot be used due to a misaligned implementation in Firefox:\n // https://bugzilla.mozilla.org/show_bug.cgi?id=843003\n const handleKeyPress = ({ nativeEvent: e }: React.KeyboardEvent) => {\n if (e.keyCode === KeyCode.enter || e.keyCode === KeyCode.space) {\n e.preventDefault();\n handleClick();\n }\n };\n\n const headerId = useUniqueId('table-header-');\n\n const clickableHeaderRef = useRef<HTMLDivElement>(null);\n const { tabIndex: clickableHeaderTabIndex } = useSingleTabStopNavigation(clickableHeaderRef, { tabIndex });\n\n const cellRefObject = useRef<HTMLElement>(null);\n const cellRefCombined = useMergeRefs(cellRef, cellRefObject);\n\n // Keep sticky and non-sticky headers in sync for dynamic cell\n // content changes. This is only needed when:\n // - Column has dynamic content\n // - This is the non-sticky version of a sticky header (hidden === true)\n // - Columns are not resizable\n useResizeObserver(hasDynamicContent ? cellRefObject : () => null, entry => {\n updateColumn(columnId, entry.borderBoxWidth);\n });\n\n return (\n <TableThElement\n resizableStyle={resizableStyle}\n cellRef={cellRefCombined}\n sortingStatus={sortingStatus}\n sortingDisabled={sortingDisabled}\n focusedComponent={focusedComponent}\n stuck={stuck}\n sticky={sticky}\n resizable={resizableColumns}\n hidden={hidden}\n stripedRows={stripedRows}\n colIndex={colIndex}\n columnId={columnId}\n stickyState={stickyState}\n tableRole={tableRole}\n variant={variant}\n tableVariant={tableVariant}\n colSpan={colSpan}\n rowSpan={rowSpan}\n columnGroupId={columnGroupId}\n isLast={isLast}\n {...(sortingDisabled\n ? {}\n : getAnalyticsMetadataAttribute({\n action: 'sort',\n detail: {\n position: `${colIndex + 1}`,\n columnId: column.id ? `${column.id}` : '',\n label: `.${analyticsSelectors['header-cell-text']}`,\n sortingDescending: `${!sortingDescending}`,\n },\n } as GeneratedAnalyticsMetadataTableSort))}\n >\n <div\n ref={clickableHeaderRef}\n data-focus-id={`sorting-control-${String(columnId)}`}\n className={clsx(styles['header-cell-content'], {\n [styles['header-cell-fake-focus']]: focusedComponent === `sorting-control-${String(columnId)}`,\n [styles['header-cell-content-expandable']]: isExpandable,\n })}\n aria-label={\n column.ariaLabel\n ? column.ariaLabel({\n sorted: sorted,\n descending: sorted && !!sortingDescending,\n disabled: !!sortingDisabled,\n })\n : undefined\n }\n {...(sortingStatus && !sortingDisabled\n ? {\n onKeyPress: handleKeyPress,\n tabIndex: clickableHeaderTabIndex,\n role: 'button',\n onClick: handleClick,\n }\n : {})}\n >\n <div\n className={clsx(\n styles['header-cell-text'],\n analyticsSelectors['header-cell-text'],\n wrapLines && styles['header-cell-text-wrap']\n )}\n id={headerId}\n >\n {column.header}\n {isEditable ? (\n <span className={styles['edit-icon']}>\n <InternalIcon\n name=\"edit\"\n ariaLabel={i18n('columnDefinitions.editConfig.editIconAriaLabel', column.editConfig?.editIconAriaLabel)}\n />\n </span>\n ) : null}\n </div>\n {sortingStatus && (\n <span className={styles['sorting-icon']}>\n <InternalIcon name={getSortingIconName(sortingStatus)} />\n </span>\n )}\n </div>\n {resizableColumns ? (\n <Resizer\n tabIndex={tabIndex}\n focusId={`resize-control-${String(columnId)}`}\n showFocusRing={focusedComponent === `resize-control-${String(columnId)}`}\n onWidthUpdate={newWidth => updateColumn(columnId, newWidth)}\n onWidthUpdateCommit={onResizeFinish}\n ariaLabelledby={headerId}\n minWidth={typeof column.minWidth === 'string' ? parseInt(column.minWidth) : column.minWidth}\n roleDescription={i18n('ariaLabels.resizerRoleDescription', resizerRoleDescription)}\n // TODO: Replace with this when strings are available\n // tooltipText={i18n('ariaLabels.resizerTooltipText', resizerTooltipText)}\n tooltipText={resizerTooltipText}\n isBorderless={variant === 'full-page' || variant === 'embedded' || variant === 'borderless'}\n isLast={isLast}\n dividerPosition={isLastChildOfGroup ? 'top' : undefined}\n />\n ) : (\n <Divider className={styles['resize-divider']} position={isLastChildOfGroup ? 'top' : undefined} />\n )}\n </TableThElement>\n );\n}\n"]}
@@ -1,35 +1,38 @@
1
1
 
2
2
  import './styles.scoped.css';
3
3
  export default {
4
- "header-cell": "awsui_header-cell_1spae_1so90_149",
5
- "header-cell-fake-focus": "awsui_header-cell-fake-focus_1spae_1so90_183",
6
- "header-cell-sticky": "awsui_header-cell-sticky_1spae_1so90_204",
7
- "header-cell-stuck": "awsui_header-cell-stuck_1spae_1so90_207",
8
- "header-cell-variant-full-page": "awsui_header-cell-variant-full-page_1spae_1so90_207",
9
- "header-cell-hidden": "awsui_header-cell-hidden_1spae_1so90_213",
10
- "header-cell-variant-embedded": "awsui_header-cell-variant-embedded_1spae_1so90_216",
11
- "is-visual-refresh": "awsui_is-visual-refresh_1spae_1so90_216",
12
- "sticky-cell": "awsui_sticky-cell_1spae_1so90_216",
13
- "header-cell-variant-borderless": "awsui_header-cell-variant-borderless_1spae_1so90_216",
14
- "header-cell-sortable": "awsui_header-cell-sortable_1spae_1so90_219",
15
- "table-variant-full-page": "awsui_table-variant-full-page_1spae_1so90_240",
16
- "sticky-cell-pad-left": "awsui_sticky-cell-pad-left_1spae_1so90_243",
17
- "has-selection": "awsui_has-selection_1spae_1so90_243",
18
- "sticky-cell-last-inline-start": "awsui_sticky-cell-last-inline-start_1spae_1so90_246",
19
- "resize-divider": "awsui_resize-divider_1spae_1so90_251",
20
- "sticky-cell-last-inline-end": "awsui_sticky-cell-last-inline-end_1spae_1so90_258",
21
- "sorting-icon": "awsui_sorting-icon_1spae_1so90_268",
22
- "edit-icon": "awsui_edit-icon_1spae_1so90_276",
23
- "header-cell-content": "awsui_header-cell-content_1spae_1so90_282",
24
- "header-cell-content-expandable": "awsui_header-cell-content-expandable_1spae_1so90_288",
25
- "header-cell-disabled": "awsui_header-cell-disabled_1spae_1so90_340",
26
- "header-cell-sorted": "awsui_header-cell-sorted_1spae_1so90_340",
27
- "header-cell-text": "awsui_header-cell-text_1spae_1so90_354",
28
- "header-cell-text-wrap": "awsui_header-cell-text-wrap_1spae_1so90_358",
29
- "header-cell-ascending": "awsui_header-cell-ascending_1spae_1so90_364",
30
- "header-cell-descending": "awsui_header-cell-descending_1spae_1so90_365",
31
- "has-striped-rows": "awsui_has-striped-rows_1spae_1so90_479",
32
- "sticky-cell-pad-inline-start": "awsui_sticky-cell-pad-inline-start_1spae_1so90_479",
33
- "header-cell-resizable": "awsui_header-cell-resizable_1spae_1so90_491"
4
+ "header-cell": "awsui_header-cell_1spae_1map5_149",
5
+ "header-cell-fake-focus": "awsui_header-cell-fake-focus_1spae_1map5_183",
6
+ "header-cell-group": "awsui_header-cell-group_1spae_1map5_204",
7
+ "header-cell-grouped": "awsui_header-cell-grouped_1spae_1map5_204",
8
+ "header-cell-spans-rows": "awsui_header-cell-spans-rows_1spae_1map5_204",
9
+ "header-cell-sticky": "awsui_header-cell-sticky_1spae_1map5_208",
10
+ "header-cell-stuck": "awsui_header-cell-stuck_1spae_1map5_211",
11
+ "header-cell-variant-full-page": "awsui_header-cell-variant-full-page_1spae_1map5_211",
12
+ "header-cell-hidden": "awsui_header-cell-hidden_1spae_1map5_217",
13
+ "header-cell-variant-embedded": "awsui_header-cell-variant-embedded_1spae_1map5_220",
14
+ "is-visual-refresh": "awsui_is-visual-refresh_1spae_1map5_220",
15
+ "sticky-cell": "awsui_sticky-cell_1spae_1map5_220",
16
+ "header-cell-variant-borderless": "awsui_header-cell-variant-borderless_1spae_1map5_220",
17
+ "header-cell-sortable": "awsui_header-cell-sortable_1spae_1map5_223",
18
+ "table-variant-full-page": "awsui_table-variant-full-page_1spae_1map5_244",
19
+ "sticky-cell-pad-left": "awsui_sticky-cell-pad-left_1spae_1map5_247",
20
+ "has-selection": "awsui_has-selection_1spae_1map5_247",
21
+ "sticky-cell-last-inline-start": "awsui_sticky-cell-last-inline-start_1spae_1map5_250",
22
+ "resize-divider": "awsui_resize-divider_1spae_1map5_255",
23
+ "sticky-cell-last-inline-end": "awsui_sticky-cell-last-inline-end_1spae_1map5_262",
24
+ "sorting-icon": "awsui_sorting-icon_1spae_1map5_272",
25
+ "edit-icon": "awsui_edit-icon_1spae_1map5_280",
26
+ "header-cell-content": "awsui_header-cell-content_1spae_1map5_286",
27
+ "header-cell-content-expandable": "awsui_header-cell-content-expandable_1spae_1map5_292",
28
+ "header-cell-disabled": "awsui_header-cell-disabled_1spae_1map5_347",
29
+ "header-cell-sorted": "awsui_header-cell-sorted_1spae_1map5_347",
30
+ "header-cell-text": "awsui_header-cell-text_1spae_1map5_378",
31
+ "header-cell-text-wrap": "awsui_header-cell-text-wrap_1spae_1map5_382",
32
+ "header-cell-ascending": "awsui_header-cell-ascending_1spae_1map5_388",
33
+ "header-cell-descending": "awsui_header-cell-descending_1spae_1map5_389",
34
+ "has-striped-rows": "awsui_has-striped-rows_1spae_1map5_503",
35
+ "sticky-cell-pad-inline-start": "awsui_sticky-cell-pad-inline-start_1spae_1map5_503",
36
+ "header-cell-resizable": "awsui_header-cell-resizable_1spae_1map5_515"
34
37
  };
35
38