@ni/nimble-components 19.4.5 → 19.6.0

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 (62) hide show
  1. package/README.md +27 -3
  2. package/dist/all-components-bundle.js +197 -8
  3. package/dist/all-components-bundle.js.map +1 -1
  4. package/dist/all-components-bundle.min.js +1700 -1685
  5. package/dist/all-components-bundle.min.js.map +1 -1
  6. package/dist/esm/all-components.d.ts +2 -0
  7. package/dist/esm/all-components.js +2 -0
  8. package/dist/esm/all-components.js.map +1 -1
  9. package/dist/esm/banner/template.js +2 -1
  10. package/dist/esm/banner/template.js.map +1 -1
  11. package/dist/esm/icons/all-icons.d.ts +1 -0
  12. package/dist/esm/icons/all-icons.js +1 -0
  13. package/dist/esm/icons/all-icons.js.map +1 -1
  14. package/dist/esm/icons/clock-exclamation.d.ts +13 -0
  15. package/dist/esm/icons/clock-exclamation.js +16 -0
  16. package/dist/esm/icons/clock-exclamation.js.map +1 -0
  17. package/dist/esm/label-provider/base/index.d.ts +19 -0
  18. package/dist/esm/label-provider/base/index.js +55 -0
  19. package/dist/esm/label-provider/base/index.js.map +1 -0
  20. package/dist/esm/label-provider/core/index.d.ts +26 -0
  21. package/dist/esm/label-provider/core/index.js +36 -0
  22. package/dist/esm/label-provider/core/index.js.map +1 -0
  23. package/dist/esm/label-provider/core/label-token-defaults.d.ts +6 -0
  24. package/dist/esm/label-provider/core/label-token-defaults.js +6 -0
  25. package/dist/esm/label-provider/core/label-token-defaults.js.map +1 -0
  26. package/dist/esm/label-provider/core/label-tokens.d.ts +4 -0
  27. package/dist/esm/label-provider/core/label-tokens.js +15 -0
  28. package/dist/esm/label-provider/core/label-tokens.js.map +1 -0
  29. package/dist/esm/label-provider/table/index.d.ts +32 -0
  30. package/dist/esm/label-provider/table/index.js +44 -0
  31. package/dist/esm/label-provider/table/index.js.map +1 -0
  32. package/dist/esm/label-provider/table/label-token-defaults.d.ts +6 -0
  33. package/dist/esm/label-provider/table/label-token-defaults.js +8 -0
  34. package/dist/esm/label-provider/table/label-token-defaults.js.map +1 -0
  35. package/dist/esm/label-provider/table/label-tokens.d.ts +6 -0
  36. package/dist/esm/label-provider/table/label-tokens.js +23 -0
  37. package/dist/esm/label-provider/table/label-tokens.js.map +1 -0
  38. package/dist/esm/label-provider/table/name-utils.d.ts +6 -0
  39. package/dist/esm/label-provider/table/name-utils.js +10 -0
  40. package/dist/esm/label-provider/table/name-utils.js.map +1 -0
  41. package/dist/esm/number-field/index.js +3 -2
  42. package/dist/esm/number-field/index.js.map +1 -1
  43. package/dist/esm/src/all-components.d.ts +2 -0
  44. package/dist/esm/src/icons/all-icons.d.ts +1 -0
  45. package/dist/esm/src/icons/clock-exclamation.d.ts +13 -0
  46. package/dist/esm/src/label-provider/base/index.d.ts +19 -0
  47. package/dist/esm/src/label-provider/core/index.d.ts +26 -0
  48. package/dist/esm/src/label-provider/core/label-token-defaults.d.ts +6 -0
  49. package/dist/esm/src/label-provider/core/label-tokens.d.ts +4 -0
  50. package/dist/esm/src/label-provider/table/index.d.ts +32 -0
  51. package/dist/esm/src/label-provider/table/label-token-defaults.d.ts +6 -0
  52. package/dist/esm/src/label-provider/table/label-tokens.d.ts +6 -0
  53. package/dist/esm/src/label-provider/table/name-utils.d.ts +6 -0
  54. package/dist/esm/table/components/cell/template.js +2 -1
  55. package/dist/esm/table/components/cell/template.js.map +1 -1
  56. package/dist/esm/table/components/group-row/template.js +2 -0
  57. package/dist/esm/table/components/group-row/template.js.map +1 -1
  58. package/dist/esm/table/components/header/template.js +3 -2
  59. package/dist/esm/table/components/header/template.js.map +1 -1
  60. package/dist/esm/table/template.js +3 -0
  61. package/dist/esm/table/template.js.map +1 -1
  62. package/package.json +2 -2
package/README.md CHANGED
@@ -23,8 +23,8 @@ If you have an existing application that incorporates a module bundler like [Web
23
23
 
24
24
  1. Install the package from [the public NPM registry](https://www.npmjs.com/package/@ni/nimble-components) by running `npm install @ni/nimble-components`.
25
25
  2. Import the component you want to use from the file you want to use it in. For example: `import '@ni/nimble-components/dist/esm/icons/succeeded';`
26
- 3. Add the HTML for the component to your page. You can see sample code for each component in the [Nimble Storybook](https://ni.github.io/nimble/storybook/) by going to the **Docs** tab for the component and clicking **Show code**. For example: `<nimble-icon-succeeded></nimble-icon-succeeded>`.
27
- 4. Nimble components are [standard web components (custom elements)](https://developer.mozilla.org/en-US/docs/Web/Web_Components) so you can configure them via normal DOM APIs like attributes, properties, events, and methods. The [Storybook documentation](https://ni.github.io/nimble/storybook/) for each component describes its custom API.
26
+ 3. Add the HTML for the component to your page. You can see sample code for each component in the [Nimble Storybook](https://nimble.ni.dev/storybook/) by going to the **Docs** page for the component and clicking **Show code**. For example: `<nimble-icon-succeeded></nimble-icon-succeeded>`.
27
+ 4. Nimble components are [standard web components (custom elements)](https://developer.mozilla.org/en-US/docs/Web/Web_Components) so you can configure them via normal DOM APIs like attributes, properties, events, and methods. The [Storybook documentation](https://nimble.ni.dev/storybook/) for each component describes its custom API.
28
28
 
29
29
  ### Prototyping in a static webpage
30
30
 
@@ -96,9 +96,33 @@ The theming system is composed of:
96
96
 
97
97
  The goal of the Nimble design system is to provide a consistent style for applications. If you find that Nimble does not expose colors, fonts, sizes, etc. that you need in an application get in touch with the Nimble squad.
98
98
 
99
+ ## Localization
100
+
101
+ Most user-visible strings displayed by Nimble components are provided by the client application and are expected to be localized by the application if necessary. However, some strings are built into Nimble components and are provided only in English. An application can provide localized versions of these strings by using design tokens set on label provider elements.
102
+
103
+ There are currently 2 label providers:
104
+
105
+ - `nimble-label-provider-core`: Used for labels for all components besides the table
106
+ - `nimble-label-provider-table`: Used for labels for the table (and table sub-components / column types)
107
+
108
+ If a client is localized, it should:
109
+
110
+ - Add the `label-provider` element(s) as children of their root theme provider:
111
+ ```html
112
+ <body>
113
+ <nimble-theme-provider theme="light">
114
+ <nimble-label-provider-core></nimble-label-provider-core>
115
+ <!-- if using nimble-table, include nimble-label-provider-table: -->
116
+ <nimble-label-provider-table></nimble-label-provider-table>
117
+ <!-- everything else -->
118
+ </nimble-theme-provider>
119
+ </body>
120
+ ```
121
+ - For each label token on the label provider API, localize the English string, and set the corresponding HTML attribute or JS property on the label provider to the localized values. A list of all label tokens for each label provider (and their corresponding attribute/property names and English strings) can be found in the [Tokens/Label Providers section of Storybook](http://nimble.ni.dev/storybook/?path=/docs/tokens-label-providers--docs).
122
+
99
123
  ## Accessibility
100
124
 
101
- For accessibility information related to nimble components, see [ACCESSIBILITY.md](docs/ACCESSIBILITY.md).
125
+ For accessibility information related to nimble components, see [accessibility.md](/packages/nimble-components/docs/accessibility.md).
102
126
 
103
127
  ## Contributing
104
128
 
@@ -16232,7 +16232,7 @@
16232
16232
 
16233
16233
  /**
16234
16234
  * Do not edit directly
16235
- * Generated on Thu, 13 Jul 2023 16:36:04 GMT
16235
+ * Generated on Fri, 14 Jul 2023 20:41:52 GMT
16236
16236
  */
16237
16237
  const Information100DarkUi = "#a46eff";
16238
16238
  const Information100LightUi = "#804ad9";
@@ -16668,7 +16668,7 @@
16668
16668
  DesignSystem.getOrCreate()
16669
16669
  .withPrefix('nimble')
16670
16670
  .register(nimbleDesignSystemProvider());
16671
- DesignSystem.tagFor(ThemeProvider);
16671
+ const themeProviderTag = DesignSystem.tagFor(ThemeProvider);
16672
16672
 
16673
16673
  /* eslint-disable @typescript-eslint/naming-convention */
16674
16674
  const Headline1FallbackFontFamily = 'Noto Serif Fallback';
@@ -18836,6 +18836,10 @@
18836
18836
  name: 'clock_cog_16_x_16',
18837
18837
  data: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path class="cls-1" d="m8.108 7.392.955-.957a1.004 1.004 0 0 1 .516-.157 1.215 1.215 0 0 1-.14.486c-.072.1-.834.866-.966.999a.785.785 0 0 1 0 .666l1.341 1.344a.981.981 0 0 1 .281.658.996.996 0 0 1-.75-.376c-.28-.28-1.073-1.088-1.237-1.255a.783.783 0 1 1 0-1.408m5.69 2.292L14 7.324l-1.327-.113a4.76 4.76 0 0 0-.402-1.26l1.02-.86-1.527-1.811-1.019.86a4.726 4.726 0 0 0-.563-.344 4.61 4.61 0 0 0-.612-.265l.114-1.329L7.324 2l-.113 1.329a4.77 4.77 0 0 0-1.26.401l-.86-1.02L3.28 4.237l.858 1.02A4.771 4.771 0 0 0 3.53 6.43l-1.329-.114L2 8.676l1.329.114a4.69 4.69 0 0 0 .401 1.26l-1.02.86 1.526 1.811 1.02-.859a4.666 4.666 0 0 0 1.175.608l-.113 1.33 2.358.2.114-1.328a4.688 4.688 0 0 0 1.26-.4l.86 1.02 1.81-1.527-.858-1.02a4.687 4.687 0 0 0 .608-1.175ZM8 11.45A3.45 3.45 0 1 1 11.45 8 3.45 3.45 0 0 1 8 11.45Z"/></svg>`
18838
18838
  };
18839
+ const clockExclamation16X16 = {
18840
+ name: 'clock_exclamation_16_x_16',
18841
+ data: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path class="cls-1" d="M2.821 5.114h1.357V6H2.82v-.886ZM2.798 1l.155 3.56h1.094L4.202 1H2.798Zm7.481 2.575h.001l-.013-.007a4.92 4.92 0 0 0-.606-.262 5.015 5.015 0 0 0-.523-.163 4.948 4.948 0 0 0-.286-.055A4.654 4.654 0 0 0 8 3c-.016 0-.03.004-.045.005a4.706 4.706 0 0 0-.785.079c-.097.016-.194.03-.29.052a5.078 5.078 0 0 0-.575.179c-.48.174-.907.438-1.305.74V7H3.109l-.017.092a4.903 4.903 0 0 0-.088.87C3.004 7.974 3 7.986 3 8c0 .293.036.575.088.852.016.096.033.19.055.285.045.182.101.359.165.532.074.206.16.403.259.595l.007.016h.001c.83 1.608 2.49 2.72 4.426 2.72C10.762 13 13 10.762 13 8c0-1.935-1.112-3.594-2.72-4.425Zm-.275 7.041c-.38-.38-1.454-1.473-1.675-1.699a1.06 1.06 0 0 1-1.523-.953 1.06 1.06 0 0 1 1.523-.954l1.293-1.296c.117-.117.509-.213.7-.213 0 .128-.085.51-.191.658-.097.136-1.128 1.173-1.308 1.353a1.064 1.064 0 0 1 0 .903l1.816 1.82s.445.466.382.89c-.297 0-.594-.085-1.017-.509Z"/></svg>`
18842
+ };
18839
18843
  const clockTriangle16X16 = {
18840
18844
  name: 'clock_triangle_16_x_16',
18841
18845
  data: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path class="cls-1" d="M8 3a4.951 4.951 0 0 0-2.152.505L7.096 6H3.422A4.997 4.997 0 1 0 8 3Zm2.003 7.616a453.75 453.75 0 0 1-1.675-1.7 1.061 1.061 0 1 1 0-1.907l1.294-1.297a1.36 1.36 0 0 1 .699-.212 1.646 1.646 0 0 1-.19.658c-.097.136-1.13 1.173-1.309 1.353a1.063 1.063 0 0 1 0 .903l1.817 1.82a1.33 1.33 0 0 1 .381.891 1.35 1.35 0 0 1-1.017-.51Z"/><path class="cls-2" d="M5.477 5H1.522L3.5 1.045 5.477 5z"/></svg>`
@@ -19438,6 +19442,25 @@
19438
19442
  information: 'information'
19439
19443
  };
19440
19444
 
19445
+ const coreLabelDefaults = {
19446
+ popupDismissLabel: 'Close',
19447
+ numericIncrementLabel: 'Increment',
19448
+ numericDecrementLabel: 'Decrement'
19449
+ };
19450
+
19451
+ const popupDismissLabel = DesignToken.create({
19452
+ name: 'popup-dismiss-label',
19453
+ cssCustomPropertyName: null
19454
+ }).withDefault(coreLabelDefaults.popupDismissLabel);
19455
+ const numericDecrementLabel = DesignToken.create({
19456
+ name: 'numeric-decrement-label',
19457
+ cssCustomPropertyName: null
19458
+ }).withDefault(coreLabelDefaults.numericDecrementLabel);
19459
+ const numericIncrementLabel = DesignToken.create({
19460
+ name: 'numeric-increment-label',
19461
+ cssCustomPropertyName: null
19462
+ }).withDefault(coreLabelDefaults.numericIncrementLabel);
19463
+
19441
19464
  // prettier-ignore
19442
19465
  const template$n = html `
19443
19466
  <div class="container"
@@ -19484,7 +19507,7 @@
19484
19507
  ${when(x => !x.preventDismiss, html `
19485
19508
  <${buttonTag} appearance="ghost" content-hidden @click="${x => x.dismissBanner()}">
19486
19509
  <${iconXmarkTag} slot="start"></${iconXmarkTag}>
19487
- ${x => x.dismissButtonLabel ?? 'Close'}
19510
+ ${x => x.dismissButtonLabel ?? popupDismissLabel.getValueFor(x)}
19488
19511
  </${buttonTag}>
19489
19512
  `)}
19490
19513
  </div>
@@ -21795,6 +21818,18 @@
21795
21818
  registerIcon('icon-clock-cog', IconClockCog);
21796
21819
  DesignSystem.tagFor(IconClockCog);
21797
21820
 
21821
+ // AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY
21822
+ /**
21823
+ * The icon component for the 'clockExclamation' icon
21824
+ */
21825
+ class IconClockExclamation extends Icon {
21826
+ constructor() {
21827
+ super(clockExclamation16X16);
21828
+ }
21829
+ }
21830
+ registerIcon('icon-clock-exclamation', IconClockExclamation);
21831
+ DesignSystem.tagFor(IconClockExclamation);
21832
+
21798
21833
  // AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY
21799
21834
  /**
21800
21835
  * The icon component for the 'clockTriangle' icon
@@ -23175,6 +23210,157 @@
23175
23210
  registerIcon('icon-xmark-check', IconXmarkCheck);
23176
23211
  DesignSystem.tagFor(IconXmarkCheck);
23177
23212
 
23213
+ /**
23214
+ * Base class for label providers
23215
+ */
23216
+ class LabelProviderBase extends FoundationElement {
23217
+ constructor() {
23218
+ super(...arguments);
23219
+ this.propertyNotifier = Observable.getNotifier(this);
23220
+ }
23221
+ connectedCallback() {
23222
+ super.connectedCallback();
23223
+ this.initializeThemeProvider();
23224
+ this.propertyNotifier.subscribe(this);
23225
+ }
23226
+ disconnectedCallback() {
23227
+ this.propertyNotifier.unsubscribe(this);
23228
+ if (this.themeProvider) {
23229
+ for (const token of Object.values(this.supportedLabels)) {
23230
+ token.deleteValueFor(this.themeProvider);
23231
+ }
23232
+ this.themeProvider = undefined;
23233
+ }
23234
+ }
23235
+ handleChange(_element, property) {
23236
+ if (this.supportedLabels[property]) {
23237
+ const token = this.supportedLabels[property];
23238
+ const value = this[property];
23239
+ if (this.themeProvider) {
23240
+ if (value === null || value === undefined) {
23241
+ token.deleteValueFor(this.themeProvider);
23242
+ }
23243
+ else {
23244
+ token.setValueFor(this.themeProvider, value);
23245
+ }
23246
+ }
23247
+ }
23248
+ }
23249
+ initializeThemeProvider() {
23250
+ this.themeProvider = this.closest(themeProviderTag) ?? undefined;
23251
+ if (this.themeProvider) {
23252
+ for (const [property, token] of Object.entries(this.supportedLabels)) {
23253
+ const value = this[property];
23254
+ if (value === null || value === undefined) {
23255
+ token.deleteValueFor(this.themeProvider);
23256
+ }
23257
+ else {
23258
+ token.setValueFor(this.themeProvider, value);
23259
+ }
23260
+ }
23261
+ }
23262
+ }
23263
+ }
23264
+
23265
+ const supportedLabels$1 = {
23266
+ popupDismiss: popupDismissLabel,
23267
+ numericDecrement: numericDecrementLabel,
23268
+ numericIncrement: numericIncrementLabel
23269
+ };
23270
+ /**
23271
+ * Core label provider for Nimble
23272
+ */
23273
+ class LabelProviderCore extends LabelProviderBase {
23274
+ constructor() {
23275
+ super(...arguments);
23276
+ this.supportedLabels = supportedLabels$1;
23277
+ }
23278
+ }
23279
+ __decorate$1([
23280
+ attr({ attribute: 'popup-dismiss' })
23281
+ ], LabelProviderCore.prototype, "popupDismiss", void 0);
23282
+ __decorate$1([
23283
+ attr({ attribute: 'numeric-decrement' })
23284
+ ], LabelProviderCore.prototype, "numericDecrement", void 0);
23285
+ __decorate$1([
23286
+ attr({ attribute: 'numeric-increment' })
23287
+ ], LabelProviderCore.prototype, "numericIncrement", void 0);
23288
+ const nimbleLabelProviderCore = LabelProviderCore.compose({
23289
+ baseName: 'label-provider-core'
23290
+ });
23291
+ DesignSystem.getOrCreate()
23292
+ .withPrefix('nimble')
23293
+ .register(nimbleLabelProviderCore());
23294
+ DesignSystem.tagFor(LabelProviderCore);
23295
+
23296
+ const tableLabelDefaults = {
23297
+ tableGroupCollapseLabel: 'Collapse group',
23298
+ tableGroupExpandLabel: 'Expand group',
23299
+ tableGroupsCollapseAllLabel: 'Collapse all groups',
23300
+ tableCellActionMenuLabel: 'Options',
23301
+ tableColumnHeaderGroupedIndicatorLabel: 'Grouped'
23302
+ };
23303
+
23304
+ const tableGroupCollapseLabel = DesignToken.create({
23305
+ name: 'table-group-collapse-label',
23306
+ cssCustomPropertyName: null
23307
+ }).withDefault(tableLabelDefaults.tableGroupCollapseLabel);
23308
+ const tableGroupExpandLabel = DesignToken.create({
23309
+ name: 'table-group-expand-label',
23310
+ cssCustomPropertyName: null
23311
+ }).withDefault(tableLabelDefaults.tableGroupExpandLabel);
23312
+ const tableGroupsCollapseAllLabel = DesignToken.create({
23313
+ name: 'table-groups-collapse-all-label',
23314
+ cssCustomPropertyName: null
23315
+ }).withDefault(tableLabelDefaults.tableGroupsCollapseAllLabel);
23316
+ const tableCellActionMenuLabel = DesignToken.create({
23317
+ name: 'table-cell-action-menu-label',
23318
+ cssCustomPropertyName: null
23319
+ }).withDefault(tableLabelDefaults.tableCellActionMenuLabel);
23320
+ const tableColumnHeaderGroupedIndicatorLabel = DesignToken.create({
23321
+ name: 'table-column-header-grouped-indicator-label',
23322
+ cssCustomPropertyName: null
23323
+ }).withDefault(tableLabelDefaults.tableColumnHeaderGroupedIndicatorLabel);
23324
+
23325
+ const supportedLabels = {
23326
+ groupCollapse: tableGroupCollapseLabel,
23327
+ groupExpand: tableGroupExpandLabel,
23328
+ groupsCollapseAll: tableGroupsCollapseAllLabel,
23329
+ cellActionMenu: tableCellActionMenuLabel,
23330
+ columnHeaderGroupedIndicator: tableColumnHeaderGroupedIndicatorLabel
23331
+ };
23332
+ /**
23333
+ * Label provider for the Nimble table (and its sub-components and columns)
23334
+ */
23335
+ class LabelProviderTable extends LabelProviderBase {
23336
+ constructor() {
23337
+ super(...arguments);
23338
+ this.supportedLabels = supportedLabels;
23339
+ }
23340
+ }
23341
+ __decorate$1([
23342
+ attr({ attribute: 'group-collapse' })
23343
+ ], LabelProviderTable.prototype, "groupCollapse", void 0);
23344
+ __decorate$1([
23345
+ attr({ attribute: 'group-expand' })
23346
+ ], LabelProviderTable.prototype, "groupExpand", void 0);
23347
+ __decorate$1([
23348
+ attr({ attribute: 'groups-collapse-all' })
23349
+ ], LabelProviderTable.prototype, "groupsCollapseAll", void 0);
23350
+ __decorate$1([
23351
+ attr({ attribute: 'cell-action-menu' })
23352
+ ], LabelProviderTable.prototype, "cellActionMenu", void 0);
23353
+ __decorate$1([
23354
+ attr({ attribute: 'column-header-grouped-indicator' })
23355
+ ], LabelProviderTable.prototype, "columnHeaderGroupedIndicator", void 0);
23356
+ const nimbleLabelProviderTable = LabelProviderTable.compose({
23357
+ baseName: 'label-provider-table'
23358
+ });
23359
+ DesignSystem.getOrCreate()
23360
+ .withPrefix('nimble')
23361
+ .register(nimbleLabelProviderTable());
23362
+ DesignSystem.tagFor(LabelProviderTable);
23363
+
23178
23364
  const styles$t = css `
23179
23365
  ${display('flex')}
23180
23366
 
@@ -23955,7 +24141,7 @@
23955
24141
  content-hidden
23956
24142
  tabindex="-1"
23957
24143
  >
23958
- "Decrement"
24144
+ ${x => numericDecrementLabel.getValueFor(x)}
23959
24145
  <${iconMinusWideTag}
23960
24146
  slot="start"
23961
24147
  >
@@ -23969,7 +24155,7 @@
23969
24155
  content-hidden
23970
24156
  tabindex="-1"
23971
24157
  >
23972
- "Increment"
24158
+ ${x => numericIncrementLabel.getValueFor(x)}
23973
24159
  <${iconAddTag}
23974
24160
  slot="start">
23975
24161
  </${iconAddTag}>
@@ -28575,7 +28761,7 @@
28575
28761
  @mousedown="${(_x, c) => !(c.event.detail > 1)}"
28576
28762
  >
28577
28763
  <slot></slot>
28578
-
28764
+ ${'' /* Omit title attribute for sort indicators because aria-sort is set on the 1st sorted column */}
28579
28765
  ${when(x => x.sortDirection === TableColumnSortDirection.ascending, html `
28580
28766
  <${iconArrowUpTag} class="sort-indicator" aria-hidden="true"></${iconArrowUpTag}>
28581
28767
  `)}
@@ -28583,7 +28769,7 @@
28583
28769
  <${iconArrowDownTag} class="sort-indicator" aria-hidden="true"></${iconArrowDownTag}>
28584
28770
  `)}
28585
28771
  ${when(x => x.isGrouped, html `
28586
- <${iconTwoSquaresInBracketsTag} class="grouped-indicator"></${iconTwoSquaresInBracketsTag}>
28772
+ <${iconTwoSquaresInBracketsTag} class="grouped-indicator" title="${x => tableColumnHeaderGroupedIndicatorLabel.getValueFor(x)}"></${iconTwoSquaresInBracketsTag}>
28587
28773
  `)}
28588
28774
  </template>
28589
28775
  `;
@@ -28770,7 +28956,7 @@
28770
28956
  class="action-menu"
28771
28957
  >
28772
28958
  <${iconThreeDotsLineTag} slot="start"></${iconThreeDotsLineTag}>
28773
- ${x => x.actionMenuLabel}
28959
+ ${x => x.actionMenuLabel ?? tableCellActionMenuLabel.getValueFor(x)}
28774
28960
  <slot name="cellActionMenu" slot="menu"></slot>
28775
28961
  </${menuButtonTag}>
28776
28962
  `)}
@@ -29156,6 +29342,7 @@
29156
29342
  tabindex="-1"
29157
29343
  >
29158
29344
  <${iconArrowExpanderRightTag} ${ref('expandIcon')} slot="start" class="expander-icon ${x => x.animationClass}"></${iconArrowExpanderRightTag}>
29345
+ ${x => (x.expanded ? tableGroupCollapseLabel.getValueFor(x) : tableGroupExpandLabel.getValueFor(x))}
29159
29346
  </${buttonTag}>
29160
29347
  </span>
29161
29348
 
@@ -29301,9 +29488,11 @@
29301
29488
  class="collapse-all-button ${x => `${x.showCollapseAll ? 'visible' : ''}`}"
29302
29489
  content-hidden
29303
29490
  appearance="${ButtonAppearance.ghost}"
29491
+ title="${x => tableGroupsCollapseAllLabel.getValueFor(x)}"
29304
29492
  @click="${x => x.handleCollapseAllGroupRows()}"
29305
29493
  >
29306
29494
  <${iconTriangleTwoLinesHorizontalTag} slot="start"></${iconTriangleTwoLinesHorizontalTag}>
29495
+ ${x => tableGroupsCollapseAllLabel.getValueFor(x)}
29307
29496
  </${buttonTag}>
29308
29497
  </span>
29309
29498
  <span class="column-header-container">