@ni/nimble-components 35.3.3 → 35.4.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 (76) hide show
  1. package/dist/all-components-bundle.js +1266 -487
  2. package/dist/all-components-bundle.js.map +1 -1
  3. package/dist/all-components-bundle.min.js +5835 -5229
  4. package/dist/all-components-bundle.min.js.map +1 -1
  5. package/dist/custom-elements.json +407 -37
  6. package/dist/custom-elements.md +55 -13
  7. package/dist/esm/anchor/styles.js +1 -1
  8. package/dist/esm/anchor/styles.js.map +1 -1
  9. package/dist/esm/anchor-step/index.d.ts +50 -2
  10. package/dist/esm/anchor-step/index.js +58 -3
  11. package/dist/esm/anchor-step/index.js.map +1 -1
  12. package/dist/esm/anchor-step/styles.js +8 -2
  13. package/dist/esm/anchor-step/styles.js.map +1 -1
  14. package/dist/esm/anchor-step/template.d.ts +3 -1
  15. package/dist/esm/anchor-step/template.js +71 -3
  16. package/dist/esm/anchor-step/template.js.map +1 -1
  17. package/dist/esm/anchor-step/types.d.ts +7 -0
  18. package/dist/esm/anchor-step/types.js +3 -0
  19. package/dist/esm/anchor-step/types.js.map +1 -0
  20. package/dist/esm/breadcrumb-item/styles.js +1 -1
  21. package/dist/esm/breadcrumb-item/styles.js.map +1 -1
  22. package/dist/esm/patterns/severity/styles.d.ts +1 -0
  23. package/dist/esm/patterns/severity/styles.js +33 -0
  24. package/dist/esm/patterns/severity/styles.js.map +1 -0
  25. package/dist/esm/patterns/severity/template.d.ts +2 -0
  26. package/dist/esm/patterns/severity/template.js +10 -0
  27. package/dist/esm/patterns/severity/template.js.map +1 -0
  28. package/dist/esm/patterns/severity/testing/severity-pattern.pageobject.d.ts +12 -0
  29. package/dist/esm/patterns/severity/testing/severity-pattern.pageobject.js +36 -0
  30. package/dist/esm/patterns/severity/testing/severity-pattern.pageobject.js.map +1 -0
  31. package/dist/esm/patterns/severity/types.d.ts +31 -0
  32. package/dist/esm/patterns/severity/types.js +28 -0
  33. package/dist/esm/patterns/severity/types.js.map +1 -0
  34. package/dist/esm/patterns/step/models/step-internals.d.ts +8 -0
  35. package/dist/esm/patterns/step/models/step-internals.js +19 -0
  36. package/dist/esm/patterns/step/models/step-internals.js.map +1 -0
  37. package/dist/esm/patterns/step/styles.d.ts +1 -0
  38. package/dist/esm/patterns/step/styles.js +429 -0
  39. package/dist/esm/patterns/step/styles.js.map +1 -0
  40. package/dist/esm/patterns/step/types.d.ts +20 -0
  41. package/dist/esm/patterns/step/types.js +2 -0
  42. package/dist/esm/patterns/step/types.js.map +1 -0
  43. package/dist/esm/step/index.d.ts +44 -2
  44. package/dist/esm/step/index.js +48 -3
  45. package/dist/esm/step/index.js.map +1 -1
  46. package/dist/esm/step/styles.js +10 -2
  47. package/dist/esm/step/styles.js.map +1 -1
  48. package/dist/esm/step/template.d.ts +3 -1
  49. package/dist/esm/step/template.js +75 -3
  50. package/dist/esm/step/template.js.map +1 -1
  51. package/dist/esm/step/types.d.ts +7 -0
  52. package/dist/esm/step/types.js +3 -0
  53. package/dist/esm/step/types.js.map +1 -0
  54. package/dist/esm/stepper/styles.js +6 -1
  55. package/dist/esm/stepper/styles.js.map +1 -1
  56. package/dist/esm/stepper/template.js +3 -1
  57. package/dist/esm/stepper/template.js.map +1 -1
  58. package/dist/esm/stepper/types.d.ts +5 -0
  59. package/dist/esm/stepper/types.js +7 -0
  60. package/dist/esm/stepper/types.js.map +1 -0
  61. package/dist/esm/theme-provider/design-token-comments.js +10 -8
  62. package/dist/esm/theme-provider/design-token-comments.js.map +1 -1
  63. package/dist/esm/theme-provider/design-token-names.js +2 -0
  64. package/dist/esm/theme-provider/design-token-names.js.map +1 -1
  65. package/dist/esm/theme-provider/design-token-values.d.ts +2 -0
  66. package/dist/esm/theme-provider/design-token-values.js +3 -1
  67. package/dist/esm/theme-provider/design-token-values.js.map +1 -1
  68. package/dist/esm/theme-provider/design-tokens.d.ts +2 -0
  69. package/dist/esm/theme-provider/design-tokens.js +2 -0
  70. package/dist/esm/theme-provider/design-tokens.js.map +1 -1
  71. package/dist/esm/utilities/models/device-pixel-ratio.d.ts +10 -0
  72. package/dist/esm/utilities/models/device-pixel-ratio.js +22 -0
  73. package/dist/esm/utilities/models/device-pixel-ratio.js.map +1 -0
  74. package/dist/tokens-internal.scss +12 -0
  75. package/dist/tokens.scss +14 -8
  76. package/package.json +2 -2
@@ -14768,6 +14768,7 @@
14768
14768
  actionRgbPartialColor: 'action-rgb-partial-color',
14769
14769
  applicationBackgroundColor: 'application-background-color',
14770
14770
  dividerBackgroundColor: 'divider-background-color',
14771
+ dividerBackgroundDynamicColor: 'divider-background-dynamic-color',
14771
14772
  headerBackgroundColor: 'header-background-color',
14772
14773
  sectionBackgroundColor: 'section-background-color',
14773
14774
  sectionBackgroundImage: 'section-background-image',
@@ -14787,6 +14788,7 @@
14787
14788
  borderRgbPartialColor: 'border-rgb-partial-color',
14788
14789
  failColor: 'fail-color',
14789
14790
  warningColor: 'warning-color',
14791
+ warningFontColor: 'warning-font-color',
14790
14792
  passColor: 'pass-color',
14791
14793
  informationColor: 'information-color',
14792
14794
  borderHoverColor: 'border-hover-color',
@@ -14901,7 +14903,7 @@
14901
14903
 
14902
14904
  const template$R = html `<slot></slot>`;
14903
14905
 
14904
- const styles$14 = css `
14906
+ const styles$16 = css `
14905
14907
  ${display('contents')}
14906
14908
  `;
14907
14909
 
@@ -15016,7 +15018,7 @@
15016
15018
  ], ThemeProvider.prototype, "theme", void 0);
15017
15019
  const nimbleDesignSystemProvider = ThemeProvider.compose({
15018
15020
  baseName: 'theme-provider',
15019
- styles: styles$14,
15021
+ styles: styles$16,
15020
15022
  template: template$R
15021
15023
  });
15022
15024
  DesignSystem.getOrCreate()
@@ -16141,6 +16143,7 @@
16141
16143
  const WarningDark20 = "#5e4635";
16142
16144
  const Pass100LightUi = "#009921";
16143
16145
  const Pass100DarkUi = "#00c12b";
16146
+ const WarningTypographyLightUi = "#d3440d";
16144
16147
  const Fail100LightUi = "#c4000c";
16145
16148
  const Fail100DarkUi = "#ff4663";
16146
16149
  const Black75 = "#818386";
@@ -16160,7 +16163,9 @@
16160
16163
  const BannerFail100DarkUi = "#d63434";
16161
16164
  const Warning100LightUi = "#ff4b00";
16162
16165
  const Black91V10 = "#e8e8e8";
16166
+ const Black30 = "#d3d5d6";
16163
16167
  const Black82V100 = "#6e6f70";
16168
+ const Black77V100 = "#6f7073";
16164
16169
  const DigitalGreenDark = "#008557";
16165
16170
  const DigitalGreenDark105 = "#00734b";
16166
16171
  const DigitalGreenDark110 = "#00613f";
@@ -16303,6 +16308,7 @@
16303
16308
  sectionBackgroundColor: createThemeColor(Black15, Black80, ForestGreen),
16304
16309
  sectionBackgroundImage: createThemeColor(`linear-gradient(${Black15}, ${hexToRgbaCssColor(Black15, 0)})`, `linear-gradient(${Black82}, ${hexToRgbaCssColor(Black82, 0)})`, `linear-gradient(${ForestGreen}, ${hexToRgbaCssColor(ForestGreen, 0)})`),
16305
16310
  dividerBackgroundColor: createThemeColor(Black15, Black80, ForestGreen),
16311
+ dividerBackgroundDynamicColor: createThemeColor(Black30, Black77V100, ForestGreen),
16306
16312
  fillSelectedColor: hexToRgbaCssThemeColor(alias.fillSelectedColor, 0.2, 0.2, 0.2),
16307
16313
  fillSelectedRgbPartialColor: hexToRgbPartialThemeColor(alias.fillSelectedColor),
16308
16314
  fillHoverSelectedColor: hexToRgbaCssThemeColor(alias.fillSelectedColor, 0.15, 0.15, 0.15),
@@ -16313,6 +16319,7 @@
16313
16319
  borderRgbPartialColor: hexToRgbPartialThemeColor(alias.lineColor),
16314
16320
  failColor: alias.failColor,
16315
16321
  warningColor: createThemeColor(Warning100LightUi, Warning100DarkUi, White),
16322
+ warningFontColor: createThemeColor(WarningTypographyLightUi, Warning100DarkUi, White),
16316
16323
  passColor: createThemeColor(Pass100LightUi, Pass100DarkUi, White),
16317
16324
  informationColor: createThemeColor(Information100LightUi, Information100DarkUi, White),
16318
16325
  borderHoverColor: createThemeColor(DigitalGreenLight, PowerGreen, White),
@@ -16474,6 +16481,7 @@
16474
16481
  createThemeColorToken(tokenNames.sectionBackgroundColor, tokenValues.sectionBackgroundColor);
16475
16482
  createThemeColorToken(tokenNames.sectionBackgroundImage, tokenValues.sectionBackgroundImage);
16476
16483
  createThemeColorToken(tokenNames.dividerBackgroundColor, tokenValues.dividerBackgroundColor);
16484
+ createThemeColorToken(tokenNames.dividerBackgroundDynamicColor, tokenValues.dividerBackgroundDynamicColor);
16477
16485
  const fillSelectedColor = createThemeColorToken(tokenNames.fillSelectedColor, tokenValues.fillSelectedColor);
16478
16486
  const fillSelectedRgbPartialColor = createThemeColorToken(tokenNames.fillSelectedRgbPartialColor, tokenValues.fillSelectedRgbPartialColor);
16479
16487
  const fillHoverSelectedColor = createThemeColorToken(tokenNames.fillHoverSelectedColor, tokenValues.fillHoverSelectedColor);
@@ -16484,6 +16492,7 @@
16484
16492
  const borderRgbPartialColor = createThemeColorToken(tokenNames.borderRgbPartialColor, tokenValues.borderRgbPartialColor);
16485
16493
  const failColor = createThemeColorToken(tokenNames.failColor, tokenValues.failColor);
16486
16494
  const warningColor = createThemeColorToken(tokenNames.warningColor, tokenValues.warningColor);
16495
+ const warningFontColor = createThemeColorToken(tokenNames.warningFontColor, tokenValues.warningFontColor);
16487
16496
  const passColor = createThemeColorToken(tokenNames.passColor, tokenValues.passColor);
16488
16497
  const informationColor = createThemeColorToken(tokenNames.informationColor, tokenValues.informationColor);
16489
16498
  const borderHoverColor = createThemeColorToken(tokenNames.borderHoverColor, tokenValues.borderHoverColor);
@@ -16652,8 +16661,8 @@
16652
16661
  }
16653
16662
  // #endregion
16654
16663
 
16655
- const styles$13 = css `
16656
- @layer base, hover, focusVisible, active, disabled;
16664
+ const styles$15 = css `
16665
+ @layer base, hover, focusVisible, active, disabled, top;
16657
16666
 
16658
16667
  @layer base {
16659
16668
  ${display('inline')}
@@ -16834,7 +16843,7 @@
16834
16843
  baseName: 'anchor',
16835
16844
  baseClass: Anchor$1,
16836
16845
  template: template$Q,
16837
- styles: styles$13,
16846
+ styles: styles$15,
16838
16847
  shadowOptions: {
16839
16848
  delegatesFocus: true
16840
16849
  }
@@ -16943,7 +16952,7 @@
16943
16952
  padding: 0;
16944
16953
  `;
16945
16954
 
16946
- const styles$12 = css `
16955
+ const styles$14 = css `
16947
16956
  @layer base, checked, hover, focusVisible, active, disabled, top;
16948
16957
 
16949
16958
  @layer base {
@@ -17227,8 +17236,8 @@
17227
17236
  }
17228
17237
  `));
17229
17238
 
17230
- const styles$11 = css `
17231
- ${styles$12}
17239
+ const styles$13 = css `
17240
+ ${styles$14}
17232
17241
  ${buttonAppearanceVariantStyles}
17233
17242
 
17234
17243
  .control {
@@ -17331,7 +17340,7 @@
17331
17340
  const nimbleAnchorButton = AnchorButton.compose({
17332
17341
  baseName: 'anchor-button',
17333
17342
  template: template$P,
17334
- styles: styles$11,
17343
+ styles: styles$13,
17335
17344
  shadowOptions: {
17336
17345
  delegatesFocus: true
17337
17346
  }
@@ -17339,7 +17348,7 @@
17339
17348
  DesignSystem.getOrCreate().withPrefix('nimble').register(nimbleAnchorButton());
17340
17349
  const anchorButtonTag = 'nimble-anchor-button';
17341
17350
 
17342
- const styles$10 = css `
17351
+ const styles$12 = css `
17343
17352
  ${display('grid')}
17344
17353
 
17345
17354
  :host {
@@ -17524,7 +17533,7 @@
17524
17533
  const nimbleAnchorMenuItem = AnchorMenuItem.compose({
17525
17534
  baseName: 'anchor-menu-item',
17526
17535
  template: template$O,
17527
- styles: styles$10,
17536
+ styles: styles$12,
17528
17537
  shadowOptions: {
17529
17538
  delegatesFocus: true
17530
17539
  }
@@ -17534,347 +17543,639 @@
17534
17543
  .register(nimbleAnchorMenuItem());
17535
17544
  const anchorMenuItemTag = 'nimble-anchor-menu-item';
17536
17545
 
17537
- const styles$$ = css `
17538
- ${display('flex')}
17546
+ // These styles end up inside a @layer block so must use the
17547
+ // cssPartial tag instead of the css tag
17548
+ const styles$11 = cssPartial `
17549
+ .severity-text {
17550
+ display: none;
17551
+ font: ${errorTextFont};
17552
+ color: ${buttonLabelFontColor};
17553
+ width: 100%;
17554
+ position: absolute;
17555
+ ${'' /* The -2px modifier of the bottom position is to intentionally have the severity text slightly overlap the control by 2px */}
17556
+ bottom: calc(-1 * (${errorTextFontLineHeight} - 2px));
17557
+ left: 0px;
17558
+ overflow: hidden;
17559
+ text-overflow: ellipsis;
17560
+ white-space: nowrap;
17561
+ }
17562
+
17563
+ :host([severity="error"]) .severity-text {
17564
+ display: block;
17565
+ color: ${failColor};
17566
+ }
17567
+
17568
+ :host([severity="warning"]) .severity-text {
17569
+ display: block;
17570
+ color: ${warningFontColor};
17571
+ }
17572
+ .severity-text:empty {
17573
+ display: none;
17574
+ }
17539
17575
  `;
17540
17576
 
17541
- const template$N = html `
17542
- <template>anchor step</template>
17577
+ /**
17578
+ * Set user-select: none in a way that works across all supported browsers.
17579
+ * https://developer.mozilla.org/en-US/docs/Web/CSS/user-select#browser_compatibility
17580
+ */
17581
+ const userSelectNone = cssPartial `
17582
+ user-select: none;
17583
+ -webkit-user-select: none;
17543
17584
  `;
17544
17585
 
17545
17586
  /**
17546
- * A nimble-styled anchor step for a stepper
17587
+ * Subscription for {@link ThemeStyleSheetBehavior}
17547
17588
  */
17548
- class AnchorStep extends FoundationElement {
17589
+ class ThemeStyleSheetBehaviorSubscription {
17590
+ constructor(value, styles, source) {
17591
+ this.value = value;
17592
+ this.styles = styles;
17593
+ this.source = source;
17594
+ }
17595
+ handleChange() {
17596
+ const theme$1 = theme.getValueFor(this.source);
17597
+ if (Array.isArray(this.value)
17598
+ ? this.value.includes(theme$1)
17599
+ : this.value === theme$1) {
17600
+ this.source.$fastController.addStyles(this.styles);
17601
+ }
17602
+ else {
17603
+ this.source.$fastController.removeStyles(this.styles);
17604
+ }
17605
+ }
17549
17606
  }
17550
- const nimbleAnchorStep = AnchorStep.compose({
17551
- baseName: 'anchor-step',
17552
- template: template$N,
17553
- styles: styles$$
17554
- });
17555
- DesignSystem.getOrCreate().withPrefix('nimble').register(nimbleAnchorStep());
17607
+ /**
17608
+ * Behavior to conditionally apply theme-based stylesheets.
17609
+ */
17610
+ class ThemeStyleSheetBehavior {
17611
+ constructor(theme, styles) {
17612
+ this.theme = theme;
17613
+ this.styles = styles;
17614
+ this.cache = new WeakMap();
17615
+ }
17616
+ /**
17617
+ * @internal
17618
+ */
17619
+ bind(source) {
17620
+ const subscriber = this.cache.get(source)
17621
+ || new ThemeStyleSheetBehaviorSubscription(this.theme, this.styles, source);
17622
+ // Currently subscriber from cache may have gone through unbind
17623
+ // but still be in cache so always resubscribe
17624
+ // See: https://github.com/microsoft/fast/issues/3246#issuecomment-1030424876
17625
+ theme.subscribe(subscriber, source);
17626
+ subscriber.handleChange();
17627
+ this.cache.set(source, subscriber);
17628
+ }
17629
+ /**
17630
+ * @internal
17631
+ */
17632
+ unbind(source) {
17633
+ const subscriber = this.cache.get(source);
17634
+ if (subscriber) {
17635
+ theme.unsubscribe(subscriber);
17636
+ }
17637
+ // Currently does not evict subscriber from cache
17638
+ // See: https://github.com/microsoft/fast/issues/3246#issuecomment-1030424876
17639
+ }
17640
+ }
17641
+ /**
17642
+ * Behavior to conditionally apply theme-based stylesheets. To determine which to apply,
17643
+ * the behavior will use the nearest ThemeProvider's 'theme' design system value.
17644
+ *
17645
+ * @public
17646
+ * @example
17647
+ * ```ts
17648
+ * css`
17649
+ * // ...
17650
+ * `.withBehaviors(
17651
+ * themeBehavior(Theme.light, css` ... `),
17652
+ * // Apply style for both dark and color theme
17653
+ * themeBehavior([Theme.dark, Theme.color], css` ... `)
17654
+ * )
17655
+ * ```
17656
+ */
17657
+ const themeBehavior = (theme, styles) => new ThemeStyleSheetBehavior(theme, styles);
17658
+ /* eslint-enable max-classes-per-file */
17556
17659
 
17557
- const styles$_ = css `
17558
- ${display('inline-flex')}
17660
+ const styles$10 = css `
17661
+ @layer base, hover, focusVisible, active, disabled, top;
17559
17662
 
17560
- :host {
17561
- position: relative;
17562
- font: ${buttonLabelFont};
17563
- height: ${controlHeight};
17564
- color: ${bodyFontColor};
17565
- align-items: center;
17566
- justify-content: center;
17567
- cursor: pointer;
17568
- text-wrap: nowrap;
17569
- --ni-private-active-indicator-width: 2px;
17570
- --ni-private-focus-indicator-width: 1px;
17571
- --ni-private-indicator-lines-gap: 1px;
17572
- --ni-private-focus-indicator-inset-width: 3px;
17573
- }
17663
+ @layer base {
17664
+ ${display('inline-flex')}
17665
+ ${styles$11}
17666
+ :host {
17667
+ ${'' /* Based on text layout: Top padding + title height + subtitle height + bottom padding */}
17668
+ height: calc(${smallPadding} + ${controlSlimHeight} + ${errorTextFontLineHeight} + ${smallPadding});
17669
+ width: ${menuMinWidth};
17670
+ color: ${buttonLabelFontColor};
17671
+ font: ${buttonLabelFont};
17672
+ white-space: nowrap;
17673
+ outline: none;
17674
+ border: none;
17675
+ }
17574
17676
 
17575
- :host(:hover) {
17576
- background-color: ${fillHoverColor};
17577
- }
17677
+ ${'' /* Container wrapper for severity text to position against */}
17678
+ .container {
17679
+ display: inline-flex;
17680
+ width: 100%;
17681
+ height: 100%;
17682
+ position: relative;
17683
+ }
17578
17684
 
17579
- :host(:hover[aria-current]) {
17580
- background-color: ${fillHoverSelectedColor};
17581
- }
17685
+ .control {
17686
+ display: inline-flex;
17687
+ align-items: start;
17688
+ justify-content: flex-start;
17689
+ height: 100%;
17690
+ width: 100%;
17691
+ color: inherit;
17692
+ background-color: transparent;
17693
+ gap: ${smallPadding};
17694
+ cursor: pointer;
17695
+ outline: none;
17696
+ margin: 0;
17697
+ padding: 0 ${smallPadding} 0 0;
17698
+ --ni-private-step-icon-background-full-size: 100% 100%;
17699
+ ${'' /* 6px = (2px icon border + 1px inset) * 2 sides */}
17700
+ --ni-private-step-icon-background-inset-size: calc(100% - 6px) calc(100% - 6px);
17701
+ --ni-private-step-icon-background-none-size: 0% 0%;
17702
+
17703
+ --ni-private-step-icon-color: ${buttonLabelFontColor};
17704
+ --ni-private-step-icon-border-color: transparent;
17705
+ --ni-private-step-icon-background-color: rgba(${borderRgbPartialColor}, 0.1);
17706
+ --ni-private-step-icon-background-size: var(--ni-private-step-icon-background-full-size);
17707
+ --ni-private-step-icon-outline-inset-color: transparent;
17708
+ --ni-private-step-line-color: rgba(${borderRgbPartialColor}, 0.1);
17709
+ }
17710
+
17711
+ :host([severity="error"]) .control {
17712
+ --ni-private-step-icon-color: ${failColor};
17713
+ --ni-private-step-icon-border-color: ${failColor};
17714
+ --ni-private-step-icon-background-color: rgb(from ${failColor} r g b / 30%);
17715
+ --ni-private-step-icon-background-size: var(--ni-private-step-icon-background-none-size);
17716
+ --ni-private-step-line-color: ${failColor};
17717
+ }
17718
+
17719
+ :host([severity="warning"]) .control {
17720
+ --ni-private-step-icon-color: ${warningColor};
17721
+ --ni-private-step-icon-border-color: ${warningColor};
17722
+ --ni-private-step-icon-background-color: rgb(from ${warningColor} r g b / 30%);
17723
+ --ni-private-step-icon-background-size: var(--ni-private-step-icon-background-none-size);
17724
+ --ni-private-step-line-color: ${warningColor};
17725
+ }
17726
+
17727
+ :host([severity="success"]) .control {
17728
+ --ni-private-step-icon-color: var(--ni-private-step-icon-inverse-color);
17729
+ --ni-private-step-icon-border-color: ${passColor};
17730
+ --ni-private-step-icon-background-color: ${passColor};
17731
+ --ni-private-step-icon-background-size: var(--ni-private-step-icon-background-full-size);
17732
+ --ni-private-step-line-color: rgba(${borderRgbPartialColor}, 0.1);
17733
+ }
17734
+
17735
+ :host([selected]) .control {
17736
+ --ni-private-step-icon-color: ${borderHoverColor};
17737
+ --ni-private-step-icon-border-color: ${borderHoverColor};
17738
+ --ni-private-step-icon-background-color: rgb(from ${borderHoverColor} r g b / 30%);
17739
+ --ni-private-step-icon-background-size: var(--ni-private-step-icon-background-none-size);
17740
+ --ni-private-step-line-color: ${borderHoverColor};
17741
+ }
17742
+
17743
+ .icon {
17744
+ display: inline-flex;
17745
+ align-items: center;
17746
+ justify-content: center;
17747
+ flex: none;
17748
+ height: ${controlHeight};
17749
+ width: ${controlHeight};
17750
+ ${userSelectNone};
17751
+ font: ${buttonLabelFont};
17752
+ color: var(--ni-private-step-icon-color);
17753
+ ${iconColor.cssCustomProperty}: var(--ni-private-step-icon-color);
17754
+ border-style: solid;
17755
+ border-radius: 100%;
17756
+ border-color: var(--ni-private-step-icon-border-color);
17757
+ border-width: 1px;
17758
+ background-image: radial-gradient(
17759
+ closest-side,
17760
+ ${'' /* Workaround to prevent aliasing on radial-gradient boundaries, see:
17761
+ https://frontendmasters.com/blog/obsessing-over-smooth-radial-gradient-disc-edges
17762
+ */}
17763
+ var(--ni-private-step-icon-background-color) calc(100% - 1px/var(--ni-private-device-resolution)),
17764
+ transparent 100%
17765
+ );
17766
+ background-origin: border-box;
17767
+ background-size: var(--ni-private-step-icon-background-size);
17768
+ background-repeat: no-repeat;
17769
+ background-position: center center;
17770
+ position: relative;
17771
+ transition:
17772
+ border-color ${smallDelay} ease-in-out,
17773
+ border-width ${smallDelay} ease-in-out,
17774
+ background-size ${smallDelay} ease-out;
17775
+ }
17582
17776
 
17583
- :host(:active) {
17584
- background: none;
17585
- }
17777
+ :host([selected]) .icon {
17778
+ border-width: 2px;
17779
+ }
17586
17780
 
17587
- :host([disabled]) {
17588
- cursor: default;
17589
- color: ${bodyDisabledFontColor};
17590
- background: none;
17591
- }
17781
+ .icon::before {
17782
+ content: '';
17783
+ position: absolute;
17784
+ width: 100%;
17785
+ height: 100%;
17786
+ pointer-events: none;
17787
+ outline-color: var(--ni-private-step-icon-outline-inset-color);
17788
+ outline-style: solid;
17789
+ outline-width: 0px;
17790
+ outline-offset: 0px;
17791
+ border: 1px solid transparent;
17792
+ border-radius: 100%;
17793
+ color: transparent;
17794
+ background-clip: border-box;
17795
+ transition:
17796
+ outline-color ${smallDelay} ease-in-out,
17797
+ outline-width ${smallDelay} ease-in-out,
17798
+ outline-offset ${smallDelay} ease-in-out;
17799
+ }
17592
17800
 
17593
- slot:not([name]) {
17594
- pointer-events: none;
17595
- display: block;
17596
- padding: ${mediumPadding} ${standardPadding}
17597
- calc(${mediumPadding} - ${borderWidth});
17598
- }
17801
+ .icon-slot {
17802
+ display: contents;
17803
+ }
17599
17804
 
17600
- a::before {
17601
- content: '';
17602
- position: absolute;
17603
- bottom: calc(
17604
- var(--ni-private-active-indicator-width) +
17605
- var(--ni-private-indicator-lines-gap)
17606
- );
17607
- width: 0px;
17608
- height: 0px;
17609
- border-bottom: ${borderHoverColor}
17610
- var(--ni-private-focus-indicator-width) solid;
17611
- transition: width ${smallDelay} ease-in;
17612
- }
17805
+ :host([severity="error"]) .icon-slot,
17806
+ :host([severity="warning"]) .icon-slot,
17807
+ :host([severity="success"]) .icon-slot {
17808
+ display: none;
17809
+ }
17613
17810
 
17614
- @media (prefers-reduced-motion) {
17615
- a::before {
17616
- transition-duration: 0s;
17811
+ :host([selected]) .icon-slot,
17812
+ :host([disabled]) .icon-slot {
17813
+ display: contents;
17617
17814
  }
17618
- }
17619
17815
 
17620
- a${focusVisible}::before {
17621
- width: calc(100% - 2 * var(--ni-private-focus-indicator-inset-width));
17622
- }
17816
+ .icon-severity {
17817
+ display: none;
17818
+ }
17623
17819
 
17624
- a {
17625
- display: inline-flex;
17626
- text-decoration: none;
17627
- color: inherit;
17628
- cursor: inherit;
17629
- outline: none;
17630
- align-items: center;
17631
- justify-content: center;
17632
- }
17820
+ :host([severity="error"]) .icon-severity,
17821
+ :host([severity="warning"]) .icon-severity,
17822
+ :host([severity="success"]) .icon-severity {
17823
+ display: contents;
17824
+ }
17633
17825
 
17634
- a::after {
17635
- content: '';
17636
- position: absolute;
17637
- bottom: 0px;
17638
- width: 0px;
17639
- height: 0px;
17640
- border-bottom: ${borderHoverColor}
17641
- var(--ni-private-active-indicator-width) solid;
17642
- transition: width ${smallDelay} ease-in;
17643
- }
17826
+ :host([selected]) .icon-severity,
17827
+ :host([disabled]) .icon-severity {
17828
+ display: none;
17829
+ }
17644
17830
 
17645
- @media (prefers-reduced-motion) {
17646
- a::after {
17647
- transition-duration: 0s;
17831
+ .content {
17832
+ display: inline-flex;
17833
+ ${'' /* Control width - icon size */}
17834
+ width: calc(100% - 32px);
17835
+ flex-direction: column;
17836
+ padding-top: ${smallPadding};
17837
+ padding-bottom: ${smallPadding};
17648
17838
  }
17649
- }
17650
17839
 
17651
- a${focusVisible}::after {
17652
- width: 100%;
17653
- border-bottom-width: var(--ni-private-focus-indicator-width);
17654
- }
17840
+ .title-wrapper {
17841
+ display: inline-flex;
17842
+ height: ${controlSlimHeight};
17843
+ flex-direction: row;
17844
+ align-items: center;
17845
+ justify-content: start;
17846
+ gap: ${smallPadding};
17847
+ font: ${bodyFont};
17848
+ }
17655
17849
 
17656
- :host([aria-current]) a::after {
17657
- width: 100%;
17658
- border-bottom-width: var(--ni-private-active-indicator-width);
17659
- }
17850
+ [part='start'] {
17851
+ display: none;
17852
+ }
17660
17853
 
17661
- :host([disabled][aria-current]) a::after {
17662
- border-bottom-color: rgba(${borderHoverColor}, 0.3);
17663
- }
17854
+ .title {
17855
+ display: inline-block;
17856
+ flex: none;
17857
+ white-space: nowrap;
17858
+ overflow: hidden;
17859
+ text-overflow: ellipsis;
17860
+ ${'' /* Content width - (gap + line min width) */}
17861
+ max-width: calc(100% - (${smallPadding} + ${standardPadding}));
17862
+ }
17664
17863
 
17665
- [part='start'] {
17666
- display: none;
17667
- }
17864
+ [part='end'] {
17865
+ display: none;
17866
+ }
17867
+
17868
+ .line {
17869
+ display: inline-block;
17870
+ flex: 1;
17871
+ min-width: ${standardPadding};
17872
+ height: 1px;
17873
+ background: var(--ni-private-step-line-color);
17874
+ transform: scale(1, 1);
17875
+ transition:
17876
+ background-color ${smallDelay} ease-in-out,
17877
+ transform ${smallDelay} ease-in-out;
17878
+ }
17668
17879
 
17669
- [part='end'] {
17670
- display: none;
17880
+ .subtitle {
17881
+ font: ${errorTextFont};
17882
+ white-space: nowrap;
17883
+ overflow: hidden;
17884
+ text-overflow: ellipsis;
17885
+ ${'' /* Content width */}
17886
+ max-width: 100%;
17887
+ }
17671
17888
  }
17672
- `;
17673
17889
 
17674
- const template$M = (context, definition) => html `
17675
- <template slot="anchortab" role="tab" aria-disabled="${x => x.disabled}">
17676
- <a
17677
- download="${x => x.download}"
17678
- href=${x => (x.disabled ? null : x.href)}
17679
- hreflang="${x => x.hreflang}"
17680
- ping="${x => x.ping}"
17681
- referrerpolicy="${x => x.referrerpolicy}"
17682
- rel="${x => x.rel}"
17683
- target="${x => x.target}"
17684
- type="${x => x.type}"
17685
- >
17686
- ${startSlotTemplate(context, definition)}
17687
- <slot></slot>
17688
- ${endSlotTemplate(context, definition)}
17689
- </a>
17690
- </template>
17691
- `;
17890
+ @layer hover {
17891
+ .control:hover {
17892
+ --ni-private-step-icon-border-color: ${borderHoverColor};
17893
+ --ni-private-step-icon-background-size: var(--ni-private-step-icon-background-inset-size);
17894
+ --ni-private-step-line-color: ${borderHoverColor};
17895
+ }
17692
17896
 
17693
- /**
17694
- * A nimble-styled link tab
17695
- */
17696
- class AnchorTab extends AnchorBase {
17697
- constructor() {
17698
- super(...arguments);
17699
- /**
17700
- * When true, the control will be immutable by user interaction. See {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/disabled | disabled HTML attribute} for more information.
17701
- * @public
17702
- * @remarks
17703
- * HTML Attribute: disabled
17704
- */
17705
- this.disabled = false;
17706
- /**
17707
- * Indicates the current "selected" state of various widgets.
17708
- * {@link https://www.w3.org/TR/wai-aria-1.1/#aria-selected}
17709
- *
17710
- * @public
17711
- * @remarks
17712
- * HTML Attribute: aria-selected
17713
- */
17714
- this.ariaSelected = 'false';
17715
- }
17716
- }
17717
- __decorate([
17718
- attr({ mode: 'boolean' })
17719
- ], AnchorTab.prototype, "disabled", void 0);
17720
- __decorate([
17721
- attr({ attribute: 'aria-selected' })
17722
- ], AnchorTab.prototype, "ariaSelected", void 0);
17723
- // FoundationAnchor already applies the StartEnd mixin, so we don't need to do it here.
17724
- const nimbleAnchorTab = AnchorTab.compose({
17725
- baseName: 'anchor-tab',
17726
- template: template$M,
17727
- styles: styles$_,
17728
- shadowOptions: {
17729
- delegatesFocus: true
17730
- }
17731
- });
17732
- DesignSystem.getOrCreate().withPrefix('nimble').register(nimbleAnchorTab());
17897
+ :host([severity="error"]) .control:hover {
17898
+ --ni-private-step-icon-border-color: ${failColor};
17899
+ --ni-private-step-icon-background-size: var(--ni-private-step-icon-background-none-size);
17900
+ --ni-private-step-line-color: ${failColor};
17901
+ }
17733
17902
 
17734
- const styles$Z = css `
17735
- ${display('flex')}
17903
+ :host([severity="warning"]) .control:hover {
17904
+ --ni-private-step-icon-border-color: ${warningColor};
17905
+ --ni-private-step-icon-background-size: var(--ni-private-step-icon-background-none-size);
17906
+ --ni-private-step-line-color: ${warningColor};
17907
+ }
17736
17908
 
17737
- :host {
17738
- flex-direction: column;
17739
- }
17909
+ :host([severity="success"]) .control:hover {
17910
+ --ni-private-step-icon-color: var(--ni-private-step-icon-inverse-color);
17911
+ --ni-private-step-icon-border-color: ${passColor};
17912
+ --ni-private-step-icon-background-size: var(--ni-private-step-icon-background-inset-size);
17913
+ --ni-private-step-line-color: ${passColor};
17914
+ }
17740
17915
 
17741
- .tab-bar {
17742
- display: flex;
17743
- }
17916
+ :host([selected]) .control:hover {
17917
+ --ni-private-step-icon-color: ${buttonLabelFontColor};
17918
+ --ni-private-step-icon-border-color: ${borderHoverColor};
17919
+ --ni-private-step-icon-background-size: var(--ni-private-step-icon-background-inset-size);
17920
+ --ni-private-step-line-color: ${borderHoverColor};
17921
+ }
17744
17922
 
17745
- [part='start'] {
17746
- display: none;
17747
- }
17923
+ .control:hover .icon {
17924
+ border-width: 2px;
17925
+ }
17748
17926
 
17749
- .scroll-button.left {
17750
- margin-right: ${smallPadding};
17927
+ .control:hover .line {
17928
+ transform: scale(1, 2);
17929
+ }
17751
17930
  }
17752
17931
 
17753
- .tablist {
17754
- display: flex;
17755
- width: max-content;
17756
- align-self: end;
17757
- overflow-x: scroll;
17758
- scrollbar-width: none;
17932
+ @layer focusVisible {
17933
+ .control${focusVisible} {
17934
+ --ni-private-step-icon-border-color: ${borderHoverColor};
17935
+ --ni-private-step-icon-outline-inset-color: ${borderHoverColor};
17936
+ --ni-private-step-icon-background-size: var(--ni-private-step-icon-background-inset-size);
17937
+ --ni-private-step-line-color: ${borderHoverColor};
17938
+ }
17939
+
17940
+ :host([severity="error"]) .control${focusVisible} {
17941
+ --ni-private-step-icon-border-color: ${failColor};
17942
+ --ni-private-step-icon-background-size: var(--ni-private-step-icon-background-none-size);
17943
+ --ni-private-step-icon-outline-inset-color: ${failColor};
17944
+ --ni-private-step-line-color: ${failColor};
17945
+ }
17946
+
17947
+ :host([severity="warning"]) .control${focusVisible} {
17948
+ --ni-private-step-icon-border-color: ${warningColor};
17949
+ --ni-private-step-icon-background-size: var(--ni-private-step-icon-background-none-size);
17950
+ --ni-private-step-icon-outline-inset-color: ${warningColor};
17951
+ --ni-private-step-line-color: ${warningColor};
17952
+ }
17953
+
17954
+ :host([severity="success"]) .control${focusVisible} {
17955
+ --ni-private-step-icon-color: var(--ni-private-step-icon-inverse-color);
17956
+ --ni-private-step-icon-border-color: ${passColor};
17957
+ --ni-private-step-icon-background-size: var(--ni-private-step-icon-background-inset-size);
17958
+ --ni-private-step-icon-outline-inset-color: transparent;
17959
+ --ni-private-step-line-color: ${passColor};
17960
+ }
17961
+
17962
+ :host([selected]) .control${focusVisible} {
17963
+ --ni-private-step-icon-color: ${borderHoverColor};
17964
+ --ni-private-step-icon-border-color: ${borderHoverColor};
17965
+ --ni-private-step-icon-background-size: var(--ni-private-step-icon-background-none-size);
17966
+ --ni-private-step-icon-outline-inset-color: ${borderHoverColor};
17967
+ --ni-private-step-line-color: ${borderHoverColor};
17968
+ }
17969
+
17970
+ .control${focusVisible} .icon {
17971
+ border-width: 2px;
17972
+ }
17973
+
17974
+ .control${focusVisible} .icon::before {
17975
+ outline-width: ${borderWidth};
17976
+ outline-offset: -2px;
17977
+ }
17978
+
17979
+ .control${focusVisible} .line {
17980
+ transform: scale(1, 2);
17981
+ }
17759
17982
  }
17760
17983
 
17761
- .scroll-button.right {
17762
- margin-left: ${smallPadding};
17984
+ @layer active {
17985
+ .control:active {
17986
+ --ni-private-step-icon-border-color: ${borderHoverColor};
17987
+ --ni-private-step-icon-background-color: ${fillSelectedColor};
17988
+ --ni-private-step-icon-background-size: var(--ni-private-step-icon-background-full-size);
17989
+ --ni-private-step-line-color: ${borderHoverColor};
17990
+ }
17991
+
17992
+ :host([severity="error"]) .control:active {
17993
+ --ni-private-step-icon-border-color: ${failColor};
17994
+ --ni-private-step-icon-background-color: rgb(from ${failColor} r g b / 30%);
17995
+ --ni-private-step-line-color: ${failColor};
17996
+ }
17997
+
17998
+ :host([severity="warning"]) .control:active {
17999
+ --ni-private-step-icon-border-color: ${warningColor};
18000
+ --ni-private-step-icon-background-color: rgb(from ${warningColor} r g b / 30%);
18001
+ --ni-private-step-line-color: ${warningColor};
18002
+ }
18003
+
18004
+ :host([severity="success"]) .control:active {
18005
+ --ni-private-step-icon-color: ${buttonLabelFontColor};
18006
+ --ni-private-step-icon-border-color: ${passColor};
18007
+ --ni-private-step-icon-background-color: rgb(from ${passColor} r g b / 30%);
18008
+ --ni-private-step-line-color: ${passColor};
18009
+ }
18010
+
18011
+ :host([selected]) .control:active {
18012
+ --ni-private-step-icon-color: ${buttonLabelFontColor};
18013
+ --ni-private-step-icon-border-color: ${borderHoverColor};
18014
+ --ni-private-step-icon-background-color: rgb(from ${borderHoverColor} r g b / 30%);
18015
+ --ni-private-step-line-color: ${borderHoverColor};
18016
+ }
18017
+
18018
+ .control:active .icon {
18019
+ border-width: 2px;
18020
+ }
18021
+
18022
+ .control:active .icon::before {
18023
+ outline-width: 0px;
18024
+ outline-offset: 0px;
18025
+ }
18026
+
18027
+ .control:active .line {
18028
+ transform: scale(1, 1);
18029
+ }
17763
18030
  }
17764
18031
 
17765
- [part='end'] {
17766
- flex: 1;
18032
+ @layer disabled {
18033
+ :host([disabled]) .control {
18034
+ cursor: default;
18035
+ color: ${buttonLabelDisabledFontColor};
18036
+ --ni-private-step-icon-color: rgb(from ${buttonLabelFontColor} r g b / 30%);
18037
+ --ni-private-step-icon-border-color: transparent;
18038
+ --ni-private-step-icon-background-color: rgba(${borderRgbPartialColor}, 0.1);
18039
+ --ni-private-step-icon-background-size: var(--ni-private-step-icon-background-full-size);
18040
+ --ni-private-step-icon-outline-inset-color: transparent;
18041
+ --ni-private-step-line-color: rgba(${borderRgbPartialColor}, 0.1);
18042
+ }
18043
+
18044
+ :host([disabled]) .line {
18045
+ transform: scale(1, 1);
18046
+ }
17767
18047
  }
17768
18048
 
17769
- [part='tabpanel'] {
17770
- flex: 1;
18049
+ @layer top {
18050
+ @media (prefers-reduced-motion) {
18051
+ .control {
18052
+ transition-duration: 0s;
18053
+ }
18054
+ }
17771
18055
  }
17772
- `;
18056
+ `.withBehaviors(themeBehavior(Theme.light, css `
18057
+ @layer base {
18058
+ .control {
18059
+ --ni-private-step-icon-inverse-color: ${White};
18060
+ }
18061
+ }
18062
+ `), themeBehavior(Theme.dark, css `
18063
+ @layer base {
18064
+ .control {
18065
+ --ni-private-step-icon-inverse-color: ${Black91};
18066
+ }
18067
+ }
18068
+ `), themeBehavior(Theme.color, css `
18069
+ @layer base {
18070
+ .control {
18071
+ --ni-private-step-icon-inverse-color: ${Black15};
18072
+ }
17773
18073
 
17774
- const styles$Y = css `
17775
- ${styles$12}
17776
- ${buttonAppearanceVariantStyles}
17777
- `;
18074
+ :host([severity="success"]) .control {
18075
+ --ni-private-step-icon-background-color: rgb(from ${passColor} r g b / 30%);
18076
+ }
18077
+ }
18078
+ `));
17778
18079
 
17779
- const template$L = (context, definition) => html `
17780
- <button
17781
- class="control"
17782
- part="control"
17783
- ?autofocus="${x => x.autofocus}"
17784
- ?disabled="${x => x.disabled}"
17785
- form="${x => x.formId}"
17786
- formaction="${x => x.formaction}"
17787
- formenctype="${x => x.formenctype}"
17788
- formmethod="${x => x.formmethod}"
17789
- formnovalidate="${x => x.formnovalidate}"
17790
- formtarget="${x => x.formtarget}"
17791
- name="${x => x.name}"
17792
- type="${x => x.type}"
17793
- value="${x => x.value}"
17794
- tabindex="${x => x.tabIndex}"
17795
- aria-atomic="${x => x.ariaAtomic}"
17796
- aria-busy="${x => x.ariaBusy}"
17797
- aria-controls="${x => x.ariaControls}"
17798
- aria-current="${x => x.ariaCurrent}"
17799
- aria-describedby="${x => x.ariaDescribedby}"
17800
- aria-details="${x => x.ariaDetails}"
17801
- aria-disabled="${x => x.ariaDisabled}"
17802
- aria-errormessage="${x => x.ariaErrormessage}"
17803
- aria-expanded="${x => x.ariaExpanded}"
17804
- aria-flowto="${x => x.ariaFlowto}"
17805
- aria-haspopup="${x => x.ariaHaspopup}"
17806
- aria-hidden="${x => x.ariaHidden}"
17807
- aria-invalid="${x => x.ariaInvalid}"
17808
- aria-keyshortcuts="${x => x.ariaKeyshortcuts}"
17809
- aria-label="${x => x.ariaLabel}"
17810
- aria-labelledby="${x => x.ariaLabelledby}"
17811
- aria-live="${x => x.ariaLive}"
17812
- aria-owns="${x => x.ariaOwns}"
17813
- aria-pressed="${x => x.ariaPressed}"
17814
- aria-relevant="${x => x.ariaRelevant}"
17815
- aria-roledescription="${x => x.ariaRoledescription}"
17816
- ${ref('control')}
17817
- >
17818
- ${startSlotTemplate(context, definition)}
17819
- <span class="content" part="content">
17820
- <slot ${slotted('defaultSlottedContent')}></slot>
17821
- </span>
17822
- ${endSlotTemplate(context, definition)}
17823
- </button>
18080
+ const styles$$ = css `
18081
+ ${styles$10}
18082
+ ${'' /* Anchor specific styles */}
18083
+ @layer base {
18084
+ .control {
18085
+ text-decoration: none;
18086
+ }
18087
+ }
17824
18088
  `;
17825
18089
 
17826
18090
  /**
17827
- * A nimble-styled HTML button
18091
+ * The runtime behavior for template overflow detection.
18092
+ * @public
17828
18093
  */
17829
- class Button extends Button$1 {
17830
- constructor() {
17831
- super(...arguments);
17832
- /**
17833
- * @public
17834
- * @remarks
17835
- * HTML Attribute: appearance
17836
- */
17837
- this.appearance = ButtonAppearance.outline;
17838
- /**
17839
- * @public
17840
- * @remarks
17841
- * HTML Attribute: content-hidden
17842
- */
17843
- this.contentHidden = false;
18094
+ class OverflowBehavior {
18095
+ /**
18096
+ * Creates an instance of OverflowBehavior.
18097
+ * @param target - The element to check for overflow.
18098
+ * @param propertyName - The name of the property to assign the overflow state to.
18099
+ */
18100
+ constructor(target, propertyName) {
18101
+ this.target = target;
18102
+ this.propertyName = propertyName;
18103
+ }
18104
+ /**
18105
+ * Bind this behavior to the source.
18106
+ * @param source - The source to bind to.
18107
+ * @param context - The execution context that the binding is operating within.
18108
+ */
18109
+ bind(source) {
18110
+ this.source = source;
18111
+ this.setSourceValue(false);
18112
+ this.mouseOverHandler = () => {
18113
+ const hasOverflow = this.target.offsetWidth < this.target.scrollWidth;
18114
+ this.setSourceValue(hasOverflow);
18115
+ };
18116
+ this.mouseOutHandler = () => {
18117
+ this.setSourceValue(false);
18118
+ };
18119
+ this.target.addEventListener('mouseover', this.mouseOverHandler);
18120
+ this.target.addEventListener('mouseout', this.mouseOutHandler);
18121
+ }
18122
+ /**
18123
+ * Unbinds this behavior from the source.
18124
+ * @param source - The source to unbind from.
18125
+ */
18126
+ unbind() {
18127
+ this.source = undefined;
18128
+ this.target.removeEventListener('mouseover', this.mouseOverHandler);
18129
+ this.target.removeEventListener('mouseout', this.mouseOutHandler);
18130
+ }
18131
+ setSourceValue(value) {
18132
+ // @ts-expect-error set property on source
18133
+ this.source[this.propertyName] = value;
17844
18134
  }
17845
18135
  }
17846
- __decorate([
17847
- attr
17848
- ], Button.prototype, "appearance", void 0);
17849
- __decorate([
17850
- attr({ attribute: 'appearance-variant' })
17851
- ], Button.prototype, "appearanceVariant", void 0);
17852
- __decorate([
17853
- attr({ attribute: 'content-hidden', mode: 'boolean' })
17854
- ], Button.prototype, "contentHidden", void 0);
17855
- __decorate([
17856
- attr({ attribute: 'tabindex', converter: nullableNumberConverter })
17857
- ], Button.prototype, "tabIndex", void 0);
17858
18136
  /**
17859
- * A function that returns a nimble-button registration for configuring the component with a DesignSystem.
17860
- * Implements {@link @ni/fast-foundation#buttonTemplate}
17861
- *
18137
+ * A directive that observes if an element has overflow and sets a flag.
18138
+ * @param propertyName - The name of the property to assign the overflow flag.
17862
18139
  * @public
17863
- * @remarks
17864
- * Generates HTML Element: \<nimble-button\>
17865
- *
17866
18140
  */
17867
- const nimbleButton = Button.compose({
17868
- baseName: 'button',
17869
- baseClass: Button$1,
17870
- template: template$L,
17871
- styles: styles$Y,
17872
- shadowOptions: {
17873
- delegatesFocus: true
18141
+ function overflow(propertyName) {
18142
+ return new AttachedBehaviorHTMLDirective('nimble-overflow', OverflowBehavior, propertyName);
18143
+ }
18144
+
18145
+ const severityTextTemplate = html `
18146
+ <div
18147
+ class="severity-text"
18148
+ ${overflow('severityHasOverflow')}
18149
+ title="${x => (x.severityHasOverflow && x.severityText ? x.severityText : undefined)}"
18150
+ aria-live="polite"
18151
+ >${x => x.severityText}</div>`;
18152
+
18153
+ const Severity = {
18154
+ default: undefined,
18155
+ error: 'error',
18156
+ warning: 'warning',
18157
+ success: 'success',
18158
+ };
18159
+ // As the returned class is internal to the function, we can't write a signature that uses is directly, so rely on inference
18160
+ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/explicit-function-return-type
18161
+ function mixinSeverityPattern(base) {
18162
+ /**
18163
+ * Mixin to provide severity text related properties to an element
18164
+ */
18165
+ class SeverityPatternElement extends base {
18166
+ constructor() {
18167
+ super(...arguments);
18168
+ /* @internal
18169
+ * Indicates if the severity text has overflowed its container. The value should not be
18170
+ * set directly. Instead, it is used with the `overflow` directive.
18171
+ */
18172
+ this.severityHasOverflow = false;
18173
+ }
17874
18174
  }
17875
- });
17876
- DesignSystem.getOrCreate().withPrefix('nimble').register(nimbleButton());
17877
- const buttonTag = 'nimble-button';
18175
+ attr({ attribute: 'severity-text' })(SeverityPatternElement.prototype, 'severityText');
18176
+ observable(SeverityPatternElement.prototype, 'severityHasOverflow');
18177
+ return SeverityPatternElement;
18178
+ }
17878
18179
 
17879
18180
  /* 🤖 this file was generated by svg-to-ts */
17880
18181
  const add16X16 = {
@@ -18815,22 +19116,13 @@
18815
19116
  };
18816
19117
 
18817
19118
  // Avoiding any whitespace in the template because this is an inline element
18818
- const template$K = html `<div
19119
+ const template$N = html `<div
18819
19120
  class="icon"
18820
19121
  aria-hidden="true"
18821
19122
  :innerHTML=${x => x.icon.data}
18822
19123
  ></div>`;
18823
19124
 
18824
- /**
18825
- * Set user-select: none in a way that works across all supported browsers.
18826
- * https://developer.mozilla.org/en-US/docs/Web/CSS/user-select#browser_compatibility
18827
- */
18828
- const userSelectNone = cssPartial `
18829
- user-select: none;
18830
- -webkit-user-select: none;
18831
- `;
18832
-
18833
- const styles$X = css `
19125
+ const styles$_ = css `
18834
19126
  ${display('inline-flex')}
18835
19127
 
18836
19128
  :host {
@@ -18893,12 +19185,524 @@
18893
19185
  const registerIconSvg = (baseName, iconClass) => {
18894
19186
  const composedIcon = iconClass.compose({
18895
19187
  baseName,
18896
- template: template$K,
18897
- styles: styles$X
19188
+ template: template$N,
19189
+ styles: styles$_
18898
19190
  });
18899
19191
  DesignSystem.getOrCreate().withPrefix('nimble').register(composedIcon());
18900
19192
  };
18901
19193
 
19194
+ // AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY
19195
+ // See generation source in nimble-components/build/generate-icons
19196
+ /**
19197
+ * The icon component for the 'exclamationMark' icon
19198
+ */
19199
+ class IconExclamationMark extends IconSvg {
19200
+ constructor() {
19201
+ super(exclamationMark16X16);
19202
+ }
19203
+ }
19204
+ registerIconSvg('icon-exclamation-mark', IconExclamationMark);
19205
+ const iconExclamationMarkTag = 'nimble-icon-exclamation-mark';
19206
+
19207
+ // AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY
19208
+ // See generation source in nimble-components/build/generate-icons
19209
+ /**
19210
+ * The icon component for the 'triangleFilled' icon
19211
+ */
19212
+ class IconTriangleFilled extends IconSvg {
19213
+ constructor() {
19214
+ super(triangleFilled16X16);
19215
+ }
19216
+ }
19217
+ registerIconSvg('icon-triangle-filled', IconTriangleFilled);
19218
+ const iconTriangleFilledTag = 'nimble-icon-triangle-filled';
19219
+
19220
+ // AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY
19221
+ // See generation source in nimble-components/build/generate-icons
19222
+ /**
19223
+ * The icon component for the 'check' icon
19224
+ */
19225
+ class IconCheck extends IconSvg {
19226
+ constructor() {
19227
+ super(check16X16);
19228
+ }
19229
+ }
19230
+ registerIconSvg('icon-check', IconCheck);
19231
+ const iconCheckTag = 'nimble-icon-check';
19232
+
19233
+ const template$M = (context, definition) => html `
19234
+ <template slot="step">
19235
+ <div class="
19236
+ container
19237
+ ${x => (x.stepInternals.orientation === 'vertical' ? 'vertical' : '')}
19238
+ ${x => (x.stepInternals.last ? 'last' : '')}
19239
+ ">
19240
+ <a
19241
+ class="control"
19242
+ part="control"
19243
+ download="${x => x.download}"
19244
+ href=${x => (x.disabled ? null : x.href)}
19245
+ hreflang="${x => x.hreflang}"
19246
+ ping="${x => x.ping}"
19247
+ referrerpolicy="${x => x.referrerpolicy}"
19248
+ rel="${x => x.rel}"
19249
+ target="${x => x.target}"
19250
+ type="${x => x.type}"
19251
+ tabindex="${x => x.tabIndex}"
19252
+ aria-atomic="${x => x.ariaAtomic}"
19253
+ aria-busy="${x => x.ariaBusy}"
19254
+ aria-controls="${x => x.ariaControls}"
19255
+ aria-current="${x => x.ariaCurrent}"
19256
+ aria-describedby="${x => x.ariaDescribedby}"
19257
+ aria-details="${x => x.ariaDetails}"
19258
+ aria-disabled="${x => x.ariaDisabled}"
19259
+ aria-errormessage="${x => x.ariaErrormessage}"
19260
+ aria-expanded="${x => x.ariaExpanded}"
19261
+ aria-flowto="${x => x.ariaFlowto}"
19262
+ aria-haspopup="${x => x.ariaHaspopup}"
19263
+ aria-hidden="${x => x.ariaHidden}"
19264
+ aria-invalid="${x => x.ariaInvalid}"
19265
+ aria-keyshortcuts="${x => x.ariaKeyshortcuts}"
19266
+ aria-label="${x => x.ariaLabel}"
19267
+ aria-labelledby="${x => x.ariaLabelledby}"
19268
+ aria-live="${x => x.ariaLive}"
19269
+ aria-owns="${x => x.ariaOwns}"
19270
+ aria-relevant="${x => x.ariaRelevant}"
19271
+ aria-roledescription="${x => x.ariaRoledescription}"
19272
+ ${ref('control')}
19273
+ >
19274
+ <div class="icon">
19275
+ <div class="icon-slot"><slot ${slotted('defaultSlottedContent')}></slot></div>
19276
+ <div class="icon-severity">
19277
+ ${when(x => x.severity === Severity.error, html `<${iconExclamationMarkTag}></${iconExclamationMarkTag}>`)}
19278
+ ${when(x => x.severity === Severity.warning, html `<${iconTriangleFilledTag}></${iconTriangleFilledTag}>`)}
19279
+ ${when(x => x.severity === Severity.success, html `<${iconCheckTag}></${iconCheckTag}>`)}
19280
+ </div>
19281
+ </div>
19282
+ <div class="content">
19283
+ <div class="title-wrapper">
19284
+ ${startSlotTemplate(context, definition)}
19285
+ <div class="title"><slot name="title"></slot></div>
19286
+ ${endSlotTemplate(context, definition)}
19287
+ <div class="line"></div>
19288
+ </div>
19289
+ <div class="subtitle">
19290
+ <slot name="subtitle"></slot>
19291
+ </div>
19292
+ </div>
19293
+ </a>
19294
+ ${severityTextTemplate}
19295
+ </div>
19296
+ </template>
19297
+ `;
19298
+
19299
+ /**
19300
+ * Orientation of steppers.
19301
+ * @public
19302
+ */
19303
+ const StepperOrientation = Orientation;
19304
+
19305
+ /**
19306
+ * Internal properties configurable for a step
19307
+ */
19308
+ class StepInternals {
19309
+ constructor() {
19310
+ this.orientation = StepperOrientation.horizontal;
19311
+ this.last = false;
19312
+ }
19313
+ }
19314
+ __decorate([
19315
+ observable
19316
+ ], StepInternals.prototype, "orientation", void 0);
19317
+ __decorate([
19318
+ observable
19319
+ ], StepInternals.prototype, "last", void 0);
19320
+
19321
+ const AnchorStepSeverity = Severity;
19322
+
19323
+ /**
19324
+ * A nimble-styled anchor step for a stepper
19325
+ */
19326
+ class AnchorStep extends mixinSeverityPattern(AnchorBase) {
19327
+ constructor() {
19328
+ super(...arguments);
19329
+ /**
19330
+ * @public
19331
+ * @remarks
19332
+ * HTML Attribute: disabled
19333
+ */
19334
+ this.severity = AnchorStepSeverity.default;
19335
+ /**
19336
+ * @public
19337
+ * @remarks
19338
+ * HTML Attribute: disabled
19339
+ */
19340
+ this.disabled = false;
19341
+ /**
19342
+ * @public
19343
+ * @remarks
19344
+ * HTML Attribute: readonly
19345
+ */
19346
+ this.readOnly = false;
19347
+ /**
19348
+ * @public
19349
+ * @remarks
19350
+ * HTML Attribute: selected
19351
+ */
19352
+ this.selected = false;
19353
+ /**
19354
+ * @internal
19355
+ */
19356
+ this.stepInternals = new StepInternals();
19357
+ }
19358
+ }
19359
+ __decorate([
19360
+ attr()
19361
+ ], AnchorStep.prototype, "severity", void 0);
19362
+ __decorate([
19363
+ attr({ mode: 'boolean' })
19364
+ ], AnchorStep.prototype, "disabled", void 0);
19365
+ __decorate([
19366
+ attr({ attribute: 'readonly', mode: 'boolean' })
19367
+ ], AnchorStep.prototype, "readOnly", void 0);
19368
+ __decorate([
19369
+ attr({ mode: 'boolean' })
19370
+ ], AnchorStep.prototype, "selected", void 0);
19371
+ __decorate([
19372
+ attr({ attribute: 'tabindex', converter: nullableNumberConverter })
19373
+ ], AnchorStep.prototype, "tabIndex", void 0);
19374
+ const nimbleAnchorStep = AnchorStep.compose({
19375
+ baseName: 'anchor-step',
19376
+ template: template$M,
19377
+ styles: styles$$,
19378
+ shadowOptions: {
19379
+ delegatesFocus: true
19380
+ }
19381
+ });
19382
+ DesignSystem.getOrCreate().withPrefix('nimble').register(nimbleAnchorStep());
19383
+
19384
+ const styles$Z = css `
19385
+ ${display('inline-flex')}
19386
+
19387
+ :host {
19388
+ position: relative;
19389
+ font: ${buttonLabelFont};
19390
+ height: ${controlHeight};
19391
+ color: ${bodyFontColor};
19392
+ align-items: center;
19393
+ justify-content: center;
19394
+ cursor: pointer;
19395
+ text-wrap: nowrap;
19396
+ --ni-private-active-indicator-width: 2px;
19397
+ --ni-private-focus-indicator-width: 1px;
19398
+ --ni-private-indicator-lines-gap: 1px;
19399
+ --ni-private-focus-indicator-inset-width: 3px;
19400
+ }
19401
+
19402
+ :host(:hover) {
19403
+ background-color: ${fillHoverColor};
19404
+ }
19405
+
19406
+ :host(:hover[aria-current]) {
19407
+ background-color: ${fillHoverSelectedColor};
19408
+ }
19409
+
19410
+ :host(:active) {
19411
+ background: none;
19412
+ }
19413
+
19414
+ :host([disabled]) {
19415
+ cursor: default;
19416
+ color: ${bodyDisabledFontColor};
19417
+ background: none;
19418
+ }
19419
+
19420
+ slot:not([name]) {
19421
+ pointer-events: none;
19422
+ display: block;
19423
+ padding: ${mediumPadding} ${standardPadding}
19424
+ calc(${mediumPadding} - ${borderWidth});
19425
+ }
19426
+
19427
+ a::before {
19428
+ content: '';
19429
+ position: absolute;
19430
+ bottom: calc(
19431
+ var(--ni-private-active-indicator-width) +
19432
+ var(--ni-private-indicator-lines-gap)
19433
+ );
19434
+ width: 0px;
19435
+ height: 0px;
19436
+ border-bottom: ${borderHoverColor}
19437
+ var(--ni-private-focus-indicator-width) solid;
19438
+ transition: width ${smallDelay} ease-in;
19439
+ }
19440
+
19441
+ @media (prefers-reduced-motion) {
19442
+ a::before {
19443
+ transition-duration: 0s;
19444
+ }
19445
+ }
19446
+
19447
+ a${focusVisible}::before {
19448
+ width: calc(100% - 2 * var(--ni-private-focus-indicator-inset-width));
19449
+ }
19450
+
19451
+ a {
19452
+ display: inline-flex;
19453
+ text-decoration: none;
19454
+ color: inherit;
19455
+ cursor: inherit;
19456
+ outline: none;
19457
+ align-items: center;
19458
+ justify-content: center;
19459
+ }
19460
+
19461
+ a::after {
19462
+ content: '';
19463
+ position: absolute;
19464
+ bottom: 0px;
19465
+ width: 0px;
19466
+ height: 0px;
19467
+ border-bottom: ${borderHoverColor}
19468
+ var(--ni-private-active-indicator-width) solid;
19469
+ transition: width ${smallDelay} ease-in;
19470
+ }
19471
+
19472
+ @media (prefers-reduced-motion) {
19473
+ a::after {
19474
+ transition-duration: 0s;
19475
+ }
19476
+ }
19477
+
19478
+ a${focusVisible}::after {
19479
+ width: 100%;
19480
+ border-bottom-width: var(--ni-private-focus-indicator-width);
19481
+ }
19482
+
19483
+ :host([aria-current]) a::after {
19484
+ width: 100%;
19485
+ border-bottom-width: var(--ni-private-active-indicator-width);
19486
+ }
19487
+
19488
+ :host([disabled][aria-current]) a::after {
19489
+ border-bottom-color: rgba(${borderHoverColor}, 0.3);
19490
+ }
19491
+
19492
+ [part='start'] {
19493
+ display: none;
19494
+ }
19495
+
19496
+ [part='end'] {
19497
+ display: none;
19498
+ }
19499
+ `;
19500
+
19501
+ const template$L = (context, definition) => html `
19502
+ <template slot="anchortab" role="tab" aria-disabled="${x => x.disabled}">
19503
+ <a
19504
+ download="${x => x.download}"
19505
+ href=${x => (x.disabled ? null : x.href)}
19506
+ hreflang="${x => x.hreflang}"
19507
+ ping="${x => x.ping}"
19508
+ referrerpolicy="${x => x.referrerpolicy}"
19509
+ rel="${x => x.rel}"
19510
+ target="${x => x.target}"
19511
+ type="${x => x.type}"
19512
+ >
19513
+ ${startSlotTemplate(context, definition)}
19514
+ <slot></slot>
19515
+ ${endSlotTemplate(context, definition)}
19516
+ </a>
19517
+ </template>
19518
+ `;
19519
+
19520
+ /**
19521
+ * A nimble-styled link tab
19522
+ */
19523
+ class AnchorTab extends AnchorBase {
19524
+ constructor() {
19525
+ super(...arguments);
19526
+ /**
19527
+ * When true, the control will be immutable by user interaction. See {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/disabled | disabled HTML attribute} for more information.
19528
+ * @public
19529
+ * @remarks
19530
+ * HTML Attribute: disabled
19531
+ */
19532
+ this.disabled = false;
19533
+ /**
19534
+ * Indicates the current "selected" state of various widgets.
19535
+ * {@link https://www.w3.org/TR/wai-aria-1.1/#aria-selected}
19536
+ *
19537
+ * @public
19538
+ * @remarks
19539
+ * HTML Attribute: aria-selected
19540
+ */
19541
+ this.ariaSelected = 'false';
19542
+ }
19543
+ }
19544
+ __decorate([
19545
+ attr({ mode: 'boolean' })
19546
+ ], AnchorTab.prototype, "disabled", void 0);
19547
+ __decorate([
19548
+ attr({ attribute: 'aria-selected' })
19549
+ ], AnchorTab.prototype, "ariaSelected", void 0);
19550
+ // FoundationAnchor already applies the StartEnd mixin, so we don't need to do it here.
19551
+ const nimbleAnchorTab = AnchorTab.compose({
19552
+ baseName: 'anchor-tab',
19553
+ template: template$L,
19554
+ styles: styles$Z,
19555
+ shadowOptions: {
19556
+ delegatesFocus: true
19557
+ }
19558
+ });
19559
+ DesignSystem.getOrCreate().withPrefix('nimble').register(nimbleAnchorTab());
19560
+
19561
+ const styles$Y = css `
19562
+ ${display('flex')}
19563
+
19564
+ :host {
19565
+ flex-direction: column;
19566
+ }
19567
+
19568
+ .tab-bar {
19569
+ display: flex;
19570
+ }
19571
+
19572
+ [part='start'] {
19573
+ display: none;
19574
+ }
19575
+
19576
+ .scroll-button.left {
19577
+ margin-right: ${smallPadding};
19578
+ }
19579
+
19580
+ .tablist {
19581
+ display: flex;
19582
+ width: max-content;
19583
+ align-self: end;
19584
+ overflow-x: scroll;
19585
+ scrollbar-width: none;
19586
+ }
19587
+
19588
+ .scroll-button.right {
19589
+ margin-left: ${smallPadding};
19590
+ }
19591
+
19592
+ [part='end'] {
19593
+ flex: 1;
19594
+ }
19595
+
19596
+ [part='tabpanel'] {
19597
+ flex: 1;
19598
+ }
19599
+ `;
19600
+
19601
+ const styles$X = css `
19602
+ ${styles$14}
19603
+ ${buttonAppearanceVariantStyles}
19604
+ `;
19605
+
19606
+ const template$K = (context, definition) => html `
19607
+ <button
19608
+ class="control"
19609
+ part="control"
19610
+ ?autofocus="${x => x.autofocus}"
19611
+ ?disabled="${x => x.disabled}"
19612
+ form="${x => x.formId}"
19613
+ formaction="${x => x.formaction}"
19614
+ formenctype="${x => x.formenctype}"
19615
+ formmethod="${x => x.formmethod}"
19616
+ formnovalidate="${x => x.formnovalidate}"
19617
+ formtarget="${x => x.formtarget}"
19618
+ name="${x => x.name}"
19619
+ type="${x => x.type}"
19620
+ value="${x => x.value}"
19621
+ tabindex="${x => x.tabIndex}"
19622
+ aria-atomic="${x => x.ariaAtomic}"
19623
+ aria-busy="${x => x.ariaBusy}"
19624
+ aria-controls="${x => x.ariaControls}"
19625
+ aria-current="${x => x.ariaCurrent}"
19626
+ aria-describedby="${x => x.ariaDescribedby}"
19627
+ aria-details="${x => x.ariaDetails}"
19628
+ aria-disabled="${x => x.ariaDisabled}"
19629
+ aria-errormessage="${x => x.ariaErrormessage}"
19630
+ aria-expanded="${x => x.ariaExpanded}"
19631
+ aria-flowto="${x => x.ariaFlowto}"
19632
+ aria-haspopup="${x => x.ariaHaspopup}"
19633
+ aria-hidden="${x => x.ariaHidden}"
19634
+ aria-invalid="${x => x.ariaInvalid}"
19635
+ aria-keyshortcuts="${x => x.ariaKeyshortcuts}"
19636
+ aria-label="${x => x.ariaLabel}"
19637
+ aria-labelledby="${x => x.ariaLabelledby}"
19638
+ aria-live="${x => x.ariaLive}"
19639
+ aria-owns="${x => x.ariaOwns}"
19640
+ aria-pressed="${x => x.ariaPressed}"
19641
+ aria-relevant="${x => x.ariaRelevant}"
19642
+ aria-roledescription="${x => x.ariaRoledescription}"
19643
+ ${ref('control')}
19644
+ >
19645
+ ${startSlotTemplate(context, definition)}
19646
+ <span class="content" part="content">
19647
+ <slot ${slotted('defaultSlottedContent')}></slot>
19648
+ </span>
19649
+ ${endSlotTemplate(context, definition)}
19650
+ </button>
19651
+ `;
19652
+
19653
+ /**
19654
+ * A nimble-styled HTML button
19655
+ */
19656
+ class Button extends Button$1 {
19657
+ constructor() {
19658
+ super(...arguments);
19659
+ /**
19660
+ * @public
19661
+ * @remarks
19662
+ * HTML Attribute: appearance
19663
+ */
19664
+ this.appearance = ButtonAppearance.outline;
19665
+ /**
19666
+ * @public
19667
+ * @remarks
19668
+ * HTML Attribute: content-hidden
19669
+ */
19670
+ this.contentHidden = false;
19671
+ }
19672
+ }
19673
+ __decorate([
19674
+ attr
19675
+ ], Button.prototype, "appearance", void 0);
19676
+ __decorate([
19677
+ attr({ attribute: 'appearance-variant' })
19678
+ ], Button.prototype, "appearanceVariant", void 0);
19679
+ __decorate([
19680
+ attr({ attribute: 'content-hidden', mode: 'boolean' })
19681
+ ], Button.prototype, "contentHidden", void 0);
19682
+ __decorate([
19683
+ attr({ attribute: 'tabindex', converter: nullableNumberConverter })
19684
+ ], Button.prototype, "tabIndex", void 0);
19685
+ /**
19686
+ * A function that returns a nimble-button registration for configuring the component with a DesignSystem.
19687
+ * Implements {@link @ni/fast-foundation#buttonTemplate}
19688
+ *
19689
+ * @public
19690
+ * @remarks
19691
+ * Generates HTML Element: \<nimble-button\>
19692
+ *
19693
+ */
19694
+ const nimbleButton = Button.compose({
19695
+ baseName: 'button',
19696
+ baseClass: Button$1,
19697
+ template: template$K,
19698
+ styles: styles$X,
19699
+ shadowOptions: {
19700
+ delegatesFocus: true
19701
+ }
19702
+ });
19703
+ DesignSystem.getOrCreate().withPrefix('nimble').register(nimbleButton());
19704
+ const buttonTag = 'nimble-button';
19705
+
18902
19706
  // AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY
18903
19707
  // See generation source in nimble-components/build/generate-icons
18904
19708
  /**
@@ -19291,7 +20095,7 @@
19291
20095
  const nimbleAnchorTabs = AnchorTabs.compose({
19292
20096
  baseName: 'anchor-tabs',
19293
20097
  template: template$J,
19294
- styles: styles$Z,
20098
+ styles: styles$Y,
19295
20099
  shadowOptions: {
19296
20100
  delegatesFocus: false
19297
20101
  }
@@ -19595,80 +20399,6 @@
19595
20399
  .register(nimbleAnchoredRegion());
19596
20400
  const anchoredRegionTag = 'nimble-anchored-region';
19597
20401
 
19598
- /**
19599
- * Subscription for {@link ThemeStyleSheetBehavior}
19600
- */
19601
- class ThemeStyleSheetBehaviorSubscription {
19602
- constructor(value, styles, source) {
19603
- this.value = value;
19604
- this.styles = styles;
19605
- this.source = source;
19606
- }
19607
- handleChange() {
19608
- const theme$1 = theme.getValueFor(this.source);
19609
- if (Array.isArray(this.value)
19610
- ? this.value.includes(theme$1)
19611
- : this.value === theme$1) {
19612
- this.source.$fastController.addStyles(this.styles);
19613
- }
19614
- else {
19615
- this.source.$fastController.removeStyles(this.styles);
19616
- }
19617
- }
19618
- }
19619
- /**
19620
- * Behavior to conditionally apply theme-based stylesheets.
19621
- */
19622
- class ThemeStyleSheetBehavior {
19623
- constructor(theme, styles) {
19624
- this.theme = theme;
19625
- this.styles = styles;
19626
- this.cache = new WeakMap();
19627
- }
19628
- /**
19629
- * @internal
19630
- */
19631
- bind(source) {
19632
- const subscriber = this.cache.get(source)
19633
- || new ThemeStyleSheetBehaviorSubscription(this.theme, this.styles, source);
19634
- // Currently subscriber from cache may have gone through unbind
19635
- // but still be in cache so always resubscribe
19636
- // See: https://github.com/microsoft/fast/issues/3246#issuecomment-1030424876
19637
- theme.subscribe(subscriber, source);
19638
- subscriber.handleChange();
19639
- this.cache.set(source, subscriber);
19640
- }
19641
- /**
19642
- * @internal
19643
- */
19644
- unbind(source) {
19645
- const subscriber = this.cache.get(source);
19646
- if (subscriber) {
19647
- theme.unsubscribe(subscriber);
19648
- }
19649
- // Currently does not evict subscriber from cache
19650
- // See: https://github.com/microsoft/fast/issues/3246#issuecomment-1030424876
19651
- }
19652
- }
19653
- /**
19654
- * Behavior to conditionally apply theme-based stylesheets. To determine which to apply,
19655
- * the behavior will use the nearest ThemeProvider's 'theme' design system value.
19656
- *
19657
- * @public
19658
- * @example
19659
- * ```ts
19660
- * css`
19661
- * // ...
19662
- * `.withBehaviors(
19663
- * themeBehavior(Theme.light, css` ... `),
19664
- * // Apply style for both dark and color theme
19665
- * themeBehavior([Theme.dark, Theme.color], css` ... `)
19666
- * )
19667
- * ```
19668
- */
19669
- const themeBehavior = (theme, styles) => new ThemeStyleSheetBehavior(theme, styles);
19670
- /* eslint-enable max-classes-per-file */
19671
-
19672
20402
  const styles$U = css `
19673
20403
  ${display('flex')}
19674
20404
 
@@ -19784,19 +20514,6 @@
19784
20514
  }
19785
20515
  `));
19786
20516
 
19787
- // AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY
19788
- // See generation source in nimble-components/build/generate-icons
19789
- /**
19790
- * The icon component for the 'exclamationMark' icon
19791
- */
19792
- class IconExclamationMark extends IconSvg {
19793
- constructor() {
19794
- super(exclamationMark16X16);
19795
- }
19796
- }
19797
- registerIconSvg('icon-exclamation-mark', IconExclamationMark);
19798
- const iconExclamationMarkTag = 'nimble-icon-exclamation-mark';
19799
-
19800
20517
  // AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY
19801
20518
  // See generation source in nimble-components/build/generate-icons
19802
20519
  /**
@@ -19810,19 +20527,6 @@
19810
20527
  registerIconSvg('icon-info', IconInfo);
19811
20528
  const iconInfoTag = 'nimble-icon-info';
19812
20529
 
19813
- // AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY
19814
- // See generation source in nimble-components/build/generate-icons
19815
- /**
19816
- * The icon component for the 'triangleFilled' icon
19817
- */
19818
- class IconTriangleFilled extends IconSvg {
19819
- constructor() {
19820
- super(triangleFilled16X16);
19821
- }
19822
- }
19823
- registerIconSvg('icon-triangle-filled', IconTriangleFilled);
19824
- const iconTriangleFilledTag = 'nimble-icon-triangle-filled';
19825
-
19826
20530
  // AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY
19827
20531
  // See generation source in nimble-components/build/generate-icons
19828
20532
  /**
@@ -20116,7 +20820,7 @@
20116
20820
  DesignSystem.getOrCreate().withPrefix('nimble').register(nimbleBreadcrumb());
20117
20821
 
20118
20822
  const styles$S = css `
20119
- @layer base, hover, focusVisible, active, disabled;
20823
+ @layer base, hover, focusVisible, active, disabled, top;
20120
20824
 
20121
20825
  @layer base {
20122
20826
  ${display('inline-flex')}
@@ -20592,61 +21296,6 @@ so this becomes the fallback color for the slot */ ''}
20592
21296
  }
20593
21297
  `;
20594
21298
 
20595
- /**
20596
- * The runtime behavior for template overflow detection.
20597
- * @public
20598
- */
20599
- class OverflowBehavior {
20600
- /**
20601
- * Creates an instance of OverflowBehavior.
20602
- * @param target - The element to check for overflow.
20603
- * @param propertyName - The name of the property to assign the overflow state to.
20604
- */
20605
- constructor(target, propertyName) {
20606
- this.target = target;
20607
- this.propertyName = propertyName;
20608
- }
20609
- /**
20610
- * Bind this behavior to the source.
20611
- * @param source - The source to bind to.
20612
- * @param context - The execution context that the binding is operating within.
20613
- */
20614
- bind(source) {
20615
- this.source = source;
20616
- this.setSourceValue(false);
20617
- this.mouseOverHandler = () => {
20618
- const hasOverflow = this.target.offsetWidth < this.target.scrollWidth;
20619
- this.setSourceValue(hasOverflow);
20620
- };
20621
- this.mouseOutHandler = () => {
20622
- this.setSourceValue(false);
20623
- };
20624
- this.target.addEventListener('mouseover', this.mouseOverHandler);
20625
- this.target.addEventListener('mouseout', this.mouseOutHandler);
20626
- }
20627
- /**
20628
- * Unbinds this behavior from the source.
20629
- * @param source - The source to unbind from.
20630
- */
20631
- unbind() {
20632
- this.source = undefined;
20633
- this.target.removeEventListener('mouseover', this.mouseOverHandler);
20634
- this.target.removeEventListener('mouseout', this.mouseOutHandler);
20635
- }
20636
- setSourceValue(value) {
20637
- // @ts-expect-error set property on source
20638
- this.source[this.propertyName] = value;
20639
- }
20640
- }
20641
- /**
20642
- * A directive that observes if an element has overflow and sets a flag.
20643
- * @param propertyName - The name of the property to assign the overflow flag.
20644
- * @public
20645
- */
20646
- function overflow(propertyName) {
20647
- return new AttachedBehaviorHTMLDirective('nimble-overflow', OverflowBehavior, propertyName);
20648
- }
20649
-
20650
21299
  const errorTextTemplate = html `
20651
21300
  <div
20652
21301
  class="error-text"
@@ -20752,7 +21401,7 @@ so this becomes the fallback color for the slot */ ''}
20752
21401
  const checkboxTag = 'nimble-checkbox';
20753
21402
 
20754
21403
  const styles$N = css `
20755
- ${styles$12}
21404
+ ${styles$14}
20756
21405
  ${buttonAppearanceVariantStyles}
20757
21406
 
20758
21407
  @layer checked {
@@ -23399,18 +24048,6 @@ so this becomes the fallback color for the slot */ ''}
23399
24048
  }
23400
24049
  registerIconSvg('icon-chart-diagram-parent-focus-two-child', IconChartDiagramParentFocusTwoChild);
23401
24050
 
23402
- // AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY
23403
- // See generation source in nimble-components/build/generate-icons
23404
- /**
23405
- * The icon component for the 'check' icon
23406
- */
23407
- class IconCheck extends IconSvg {
23408
- constructor() {
23409
- super(check16X16);
23410
- }
23411
- }
23412
- registerIconSvg('icon-check', IconCheck);
23413
-
23414
24051
  // AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY
23415
24052
  // See generation source in nimble-components/build/generate-icons
23416
24053
  /**
@@ -65533,31 +66170,173 @@ ${nextLine.slice(indentLevel + 2)}`;
65533
66170
  DesignSystem.getOrCreate().withPrefix('nimble').register(nimbleSelect());
65534
66171
 
65535
66172
  const styles$r = css `
65536
- ${display('flex')}
66173
+ ${styles$10}
66174
+ ${'' /* Button specific styles */}
66175
+ @layer base {
66176
+ .control {
66177
+ font: inherit;
66178
+ border: none;
66179
+ text-align: start;
66180
+ }
66181
+ }
65537
66182
  `;
65538
66183
 
65539
- const template$o = html `
65540
- <template>step</template>
66184
+ const template$o = (context, definition) => html `
66185
+ <template slot="step">
66186
+ <div class="
66187
+ container
66188
+ ${x => (x.stepInternals.orientation === 'vertical' ? 'vertical' : '')}
66189
+ ${x => (x.stepInternals.last ? 'last' : '')}
66190
+ ">
66191
+ <button
66192
+ class="control"
66193
+ part="control"
66194
+ ?autofocus="${x => x.autofocus}"
66195
+ ?disabled="${x => x.disabled}"
66196
+ form="${x => x.formId}"
66197
+ formaction="${x => x.formaction}"
66198
+ formenctype="${x => x.formenctype}"
66199
+ formmethod="${x => x.formmethod}"
66200
+ formnovalidate="${x => x.formnovalidate}"
66201
+ formtarget="${x => x.formtarget}"
66202
+ name="${x => x.name}"
66203
+ type="${x => x.type}"
66204
+ value="${x => x.value}"
66205
+ tabindex="${x => x.tabIndex}"
66206
+ aria-atomic="${x => x.ariaAtomic}"
66207
+ aria-busy="${x => x.ariaBusy}"
66208
+ aria-controls="${x => x.ariaControls}"
66209
+ aria-current="${x => x.ariaCurrent}"
66210
+ aria-describedby="${x => x.ariaDescribedby}"
66211
+ aria-details="${x => x.ariaDetails}"
66212
+ aria-disabled="${x => x.ariaDisabled}"
66213
+ aria-errormessage="${x => x.ariaErrormessage}"
66214
+ aria-expanded="${x => x.ariaExpanded}"
66215
+ aria-flowto="${x => x.ariaFlowto}"
66216
+ aria-haspopup="${x => x.ariaHaspopup}"
66217
+ aria-hidden="${x => x.ariaHidden}"
66218
+ aria-invalid="${x => x.ariaInvalid}"
66219
+ aria-keyshortcuts="${x => x.ariaKeyshortcuts}"
66220
+ aria-label="${x => x.ariaLabel}"
66221
+ aria-labelledby="${x => x.ariaLabelledby}"
66222
+ aria-live="${x => x.ariaLive}"
66223
+ aria-owns="${x => x.ariaOwns}"
66224
+ aria-pressed="${x => x.ariaPressed}"
66225
+ aria-relevant="${x => x.ariaRelevant}"
66226
+ aria-roledescription="${x => x.ariaRoledescription}"
66227
+ ${ref('control')}
66228
+ >
66229
+ <div class="icon">
66230
+ <div class="icon-slot"><slot ${slotted('defaultSlottedContent')}></slot></div>
66231
+ <div class="icon-severity">
66232
+ ${when(x => x.severity === Severity.error, html `<${iconExclamationMarkTag}></${iconExclamationMarkTag}>`)}
66233
+ ${when(x => x.severity === Severity.warning, html `<${iconTriangleFilledTag}></${iconTriangleFilledTag}>`)}
66234
+ ${when(x => x.severity === Severity.success, html `<${iconCheckTag}></${iconCheckTag}>`)}
66235
+ </div>
66236
+ </div>
66237
+ <div class="content">
66238
+ <div class="title-wrapper">
66239
+ ${startSlotTemplate(context, definition)}
66240
+ <div class="title"><slot name="title"></slot></div>
66241
+ ${endSlotTemplate(context, definition)}
66242
+ <div class="line"></div>
66243
+ </div>
66244
+ <div class="subtitle">
66245
+ <slot name="subtitle"></slot>
66246
+ </div>
66247
+ </div>
66248
+ </button>
66249
+ ${severityTextTemplate}
66250
+ </div>
66251
+ </template>
65541
66252
  `;
65542
66253
 
66254
+ const StepSeverity = Severity;
66255
+
65543
66256
  /**
65544
66257
  * A nimble-styled step for a stepper
65545
66258
  */
65546
- class Step extends FoundationElement {
66259
+ class Step extends mixinSeverityPattern(Button$1) {
66260
+ constructor() {
66261
+ super(...arguments);
66262
+ /**
66263
+ * @public
66264
+ * @remarks
66265
+ * HTML Attribute: disabled
66266
+ */
66267
+ this.severity = StepSeverity.default;
66268
+ /**
66269
+ * @public
66270
+ * @remarks
66271
+ * HTML Attribute: readonly
66272
+ */
66273
+ this.readOnly = false;
66274
+ /**
66275
+ * @public
66276
+ * @remarks
66277
+ * HTML Attribute: selected
66278
+ */
66279
+ this.selected = false;
66280
+ /**
66281
+ * @internal
66282
+ */
66283
+ this.stepInternals = new StepInternals();
66284
+ }
65547
66285
  }
66286
+ __decorate([
66287
+ attr()
66288
+ ], Step.prototype, "severity", void 0);
66289
+ __decorate([
66290
+ attr({ attribute: 'readonly', mode: 'boolean' })
66291
+ ], Step.prototype, "readOnly", void 0);
66292
+ __decorate([
66293
+ attr({ mode: 'boolean' })
66294
+ ], Step.prototype, "selected", void 0);
66295
+ __decorate([
66296
+ attr({ attribute: 'tabindex', converter: nullableNumberConverter })
66297
+ ], Step.prototype, "tabIndex", void 0);
65548
66298
  const nimbleStep = Step.compose({
65549
66299
  baseName: 'step',
65550
66300
  template: template$o,
65551
- styles: styles$r
66301
+ styles: styles$r,
66302
+ shadowOptions: {
66303
+ delegatesFocus: true
66304
+ }
65552
66305
  });
65553
66306
  DesignSystem.getOrCreate().withPrefix('nimble').register(nimbleStep());
65554
66307
 
65555
66308
  const styles$q = css `
65556
- ${display('flex')}
66309
+ ${display('inline-flex')}
66310
+
66311
+ :host {
66312
+ border: none;
66313
+ gap: 0px;
66314
+ }
65557
66315
  `;
65558
66316
 
66317
+ /**
66318
+ * Observable class to subscribe to changes in the page's device pixel ratio
66319
+ * Based on: https://frontendmasters.com/blog/obsessing-over-smooth-radial-gradient-disc-edges/#the-less-code-and-more-flexible-js-solution
66320
+ */
66321
+ class DevicePixelRatio {
66322
+ constructor() {
66323
+ const update = () => {
66324
+ this.current = window.devicePixelRatio;
66325
+ window
66326
+ .matchMedia(`(resolution: ${this.current}x)`)
66327
+ .addEventListener('change', update, { once: true });
66328
+ };
66329
+ update();
66330
+ }
66331
+ }
66332
+ __decorate([
66333
+ observable
66334
+ ], DevicePixelRatio.prototype, "current", void 0);
66335
+ const devicePixelRatio = new DevicePixelRatio();
66336
+
65559
66337
  const template$n = html `
65560
- <template>stepper: <slot></slot></template>
66338
+ <style>:host{--ni-private-device-resolution: ${() => devicePixelRatio.current};}</style>
66339
+ <slot name="step"></slot>
65561
66340
  `;
65562
66341
 
65563
66342
  /**
@@ -77905,7 +78684,7 @@ focus outline in that case.
77905
78684
  .register(nimbleTableColumnText());
77906
78685
 
77907
78686
  const styles$8 = css `
77908
- ${styles$Z}
78687
+ ${styles$Y}
77909
78688
 
77910
78689
  .tabpanel {
77911
78690
  overflow: auto;