@ds-mo/ui 2.10.1 → 2.10.2

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 (80) hide show
  1. package/dist/.build-stamp +1 -1
  2. package/dist/components/ds-app-shell.js +1 -1
  3. package/dist/components/ds-badge.js +1 -1
  4. package/dist/components/ds-bar-nav.js +1 -1
  5. package/dist/components/ds-button-filled.js +1 -1
  6. package/dist/components/ds-button-unfilled-icon.js +1 -1
  7. package/dist/components/ds-card-setting.js +1 -1
  8. package/dist/components/ds-checkbox.js +1 -1
  9. package/dist/components/ds-fade.js +1 -1
  10. package/dist/components/ds-fade.js.map +1 -1
  11. package/dist/components/ds-field.js +1 -1
  12. package/dist/components/ds-field.js.map +1 -1
  13. package/dist/components/ds-header.js +1 -1
  14. package/dist/components/ds-header.js.map +1 -1
  15. package/dist/components/ds-icon.js +1 -1
  16. package/dist/components/ds-input.js +1 -1
  17. package/dist/components/ds-menu.js +1 -1
  18. package/dist/components/ds-modal.js +1 -1
  19. package/dist/components/ds-panel-nav.js +1 -1
  20. package/dist/components/ds-panel-nav.js.map +1 -1
  21. package/dist/components/ds-panel-tools.js +1 -1
  22. package/dist/components/ds-radio-group.js +1 -1
  23. package/dist/components/ds-scrollbar.js +1 -1
  24. package/dist/components/ds-select.js +1 -1
  25. package/dist/components/ds-shell-gradient-picker.js +1 -1
  26. package/dist/components/ds-shell-gradient-swatch.js +1 -1
  27. package/dist/components/ds-slider.js +1 -1
  28. package/dist/components/ds-surface.js +1 -1
  29. package/dist/components/ds-tab-group-nav.js +1 -1
  30. package/dist/components/ds-tab-group.js +1 -1
  31. package/dist/components/ds-table.js +1 -1
  32. package/dist/components/ds-table.js.map +1 -1
  33. package/dist/components/ds-tag.js +1 -1
  34. package/dist/components/ds-text.js +1 -1
  35. package/dist/components/ds-toast-provider.js +1 -1
  36. package/dist/components/ds-toggle.js +1 -1
  37. package/dist/components/ds-tooltip.js +1 -1
  38. package/dist/components/{p-BqOChY2z.js → p-B46PyZkE.js} +2 -2
  39. package/dist/components/{p-Dul5eGGE.js → p-BOLhoDYO.js} +2 -2
  40. package/dist/components/{p-DSTK6-QR.js → p-BUKwjW6E.js} +2 -2
  41. package/dist/components/{p-CJubWt1F.js → p-BVg6jstc.js} +2 -2
  42. package/dist/components/{p-j_GdU4Aa.js → p-ChDonLAn.js} +2 -2
  43. package/dist/components/p-CkFkSpa6.js +2 -0
  44. package/dist/components/p-CkFkSpa6.js.map +1 -0
  45. package/dist/components/{p-evjnuLjj.js → p-CpfTDXDO.js} +2 -2
  46. package/dist/components/{p-Cynjsv-P.js → p-D3Jehaex.js} +2 -2
  47. package/dist/components/{p-w2Wrf0jC.js → p-DnaPMGPJ.js} +2 -2
  48. package/dist/components/p-EK1hOP19.js +2 -0
  49. package/dist/components/p-EK1hOP19.js.map +1 -0
  50. package/dist/lib/utils/index.d.ts +2 -2
  51. package/dist/lib/utils/index.js +62 -3
  52. package/dist/lib/utils/index.js.map +2 -2
  53. package/dist/lib/utils/scroll-edge-fade.d.ts +24 -4
  54. package/dist/types/components/Fade/Fade.d.ts +13 -15
  55. package/dist/types/components/Fade/index.d.ts +1 -1
  56. package/dist/types/components/PanelNav/PanelNav.d.ts +0 -3
  57. package/dist/types/components.d.ts +6 -28
  58. package/dist/types/utils/index.d.ts +2 -2
  59. package/dist/types/utils/scroll-edge-fade.d.ts +24 -4
  60. package/package.json +1 -1
  61. package/src/angular/proxies.ts +2 -2
  62. package/src/wc/components/Fade/Fade.tsx +40 -94
  63. package/src/wc/components/Fade/index.ts +1 -1
  64. package/src/wc/components/PanelNav/PanelNav.tsx +2 -20
  65. package/src/wc/components.d.ts +6 -28
  66. package/src/wc/utils/index.ts +10 -1
  67. package/src/wc/utils/scroll-edge-fade.css +6 -4
  68. package/src/wc/utils/scroll-edge-fade.ts +115 -5
  69. package/dist/components/p-BFPfyJ8Z.js +0 -2
  70. package/dist/components/p-BFPfyJ8Z.js.map +0 -1
  71. package/dist/components/p-BOpHKDOG.js +0 -2
  72. package/dist/components/p-BOpHKDOG.js.map +0 -1
  73. /package/dist/components/{p-BqOChY2z.js.map → p-B46PyZkE.js.map} +0 -0
  74. /package/dist/components/{p-Dul5eGGE.js.map → p-BOLhoDYO.js.map} +0 -0
  75. /package/dist/components/{p-DSTK6-QR.js.map → p-BUKwjW6E.js.map} +0 -0
  76. /package/dist/components/{p-CJubWt1F.js.map → p-BVg6jstc.js.map} +0 -0
  77. /package/dist/components/{p-j_GdU4Aa.js.map → p-ChDonLAn.js.map} +0 -0
  78. /package/dist/components/{p-evjnuLjj.js.map → p-CpfTDXDO.js.map} +0 -0
  79. /package/dist/components/{p-Cynjsv-P.js.map → p-D3Jehaex.js.map} +0 -0
  80. /package/dist/components/{p-w2Wrf0jC.js.map → p-DnaPMGPJ.js.map} +0 -0
@@ -1,54 +1,21 @@
1
- import { Component, Prop, Element, State, h, Host } from '@stencil/core';
2
- import { isShellGradientActive } from '../../nav/badge-gradient-ring';
1
+ import { Component, Element, Prop, State, Watch, h, Host } from '@stencil/core';
2
+ import {
3
+ isScrollAtEdge,
4
+ scrollEdgeFadeClassMap,
5
+ scrollEdgeFadeSizeStyle,
6
+ type ScrollEdgeFadeEdge,
7
+ type ScrollEdgeFadeSize,
8
+ type ScrollEdgeFadeSizeToken,
9
+ } from '../../utils/scroll-edge-fade';
3
10
 
4
- export type FadeSide = 'top' | 'bottom' | 'left' | 'right';
5
- export type FadeSurface =
6
- | 'default'
7
- | 'primary'
8
- | 'secondary'
9
- | 'navigation'
10
- | 'media'
11
- | 'always-dark'
12
- | 'inverted';
13
- export type FadeSizeToken =
14
- | 'size-000'
15
- | 'size-050'
16
- | 'size-075'
17
- | 'size-100'
18
- | 'size-150'
19
- | 'size-200'
20
- | 'size-250'
21
- | 'size-300'
22
- | 'size-400'
23
- | 'size-500'
24
- | 'size-600'
25
- | 'size-800';
26
- export type FadeSize = FadeSizeToken | (string & {});
11
+ /** @deprecated Use `ScrollEdgeFadeEdge` from `@ds-mo/ui/utils`. */
12
+ export type FadeSide = ScrollEdgeFadeEdge;
27
13
 
28
- const SIZE_VALUE: Record<FadeSizeToken, string> = {
29
- 'size-000': 'var(--dimension-size-000)',
30
- 'size-050': 'var(--dimension-size-050)',
31
- 'size-075': 'var(--dimension-size-075)',
32
- 'size-100': 'var(--dimension-size-100)',
33
- 'size-150': 'var(--dimension-size-150)',
34
- 'size-200': 'var(--dimension-size-200)',
35
- 'size-250': 'var(--dimension-size-250)',
36
- 'size-300': 'var(--dimension-size-300)',
37
- 'size-400': 'var(--dimension-size-400)',
38
- 'size-500': 'var(--dimension-size-500)',
39
- 'size-600': 'var(--dimension-size-600)',
40
- 'size-800': 'var(--dimension-size-800)',
41
- };
14
+ /** @deprecated Use `ScrollEdgeFadeSizeToken` from `@ds-mo/ui/utils`. */
15
+ export type FadeSizeToken = ScrollEdgeFadeSizeToken;
42
16
 
43
- const SURFACE_BACKGROUND: Record<FadeSurface, string> = {
44
- default: 'var(--color-background-secondary)',
45
- primary: 'var(--color-background-primary)',
46
- secondary: 'var(--color-background-secondary)',
47
- navigation: 'var(--color-navigation-background)',
48
- media: 'var(--color-media-background)',
49
- 'always-dark': 'var(--color-always-dark-background)',
50
- inverted: 'var(--color-inverted-background)',
51
- };
17
+ /** @deprecated Use `ScrollEdgeFadeSize` from `@ds-mo/ui/utils`. */
18
+ export type FadeSize = ScrollEdgeFadeSize;
52
19
 
53
20
  @Component({
54
21
  tag: 'ds-fade',
@@ -58,10 +25,7 @@ const SURFACE_BACKGROUND: Record<FadeSurface, string> = {
58
25
  export class Fade {
59
26
  @Element() el!: HTMLElement;
60
27
 
61
- /** When under `ds-app-shell[gradient]`, composites the shell wash over the base fade. */
62
- @State() private shellGradientChrome: 'panel' | 'bar' | null = null;
63
-
64
- /** Edge where the fade is anchored. */
28
+ /** Edge where content fades as it approaches the scroll boundary. */
65
29
  @Prop() side: FadeSide = 'bottom';
66
30
 
67
31
  /** Fade depth along the fade axis. Accepts dimension size token names or any CSS length. */
@@ -73,61 +37,43 @@ export class Fade {
73
37
  */
74
38
  @Prop() height: string | undefined;
75
39
 
76
- /** Surface context used to choose the fade target background token. */
77
- @Prop() surface: FadeSurface = 'default';
78
-
79
- /** Direct background override for contexts that already expose a resolved surface var. */
80
- @Prop() background: string = 'var(--color-background-secondary)';
81
-
82
- /** Controls visibility without removing the element from layout/positioning. */
40
+ /** Controls the mask without removing the scroll container from layout. */
83
41
  @Prop() visible: boolean = true;
84
42
 
85
- componentDidLoad() {
86
- this.syncShellGradient();
87
- }
43
+ @State() private atEnd = false;
88
44
 
89
- private syncShellGradient() {
90
- if (!isShellGradientActive(this.el)) {
91
- this.shellGradientChrome = null;
92
- return;
93
- }
94
- this.shellGradientChrome = this.el.closest('ds-bar-nav') ? 'bar' : 'panel';
45
+ @Watch('side')
46
+ @Watch('visible')
47
+ protected onFadeConfigChange() {
48
+ this.syncAtEnd();
95
49
  }
96
50
 
97
- private resolveSize(): string {
98
- if (this.height) return this.height;
51
+ componentDidLoad() {
52
+ this.syncAtEnd();
53
+ }
99
54
 
100
- return Object.prototype.hasOwnProperty.call(SIZE_VALUE, this.size)
101
- ? SIZE_VALUE[this.size as FadeSizeToken]
102
- : this.size;
55
+ private syncAtEnd() {
56
+ this.atEnd = isScrollAtEdge(this.el, this.side);
103
57
  }
104
58
 
105
- private resolveBackground(): string {
106
- if (this.background !== 'var(--color-background-secondary)') return this.background;
107
- return SURFACE_BACKGROUND[this.surface];
59
+ private handleScroll(e: Event) {
60
+ const target = e.currentTarget as HTMLElement;
61
+ this.atEnd = isScrollAtEdge(target, this.side);
108
62
  }
109
63
 
110
64
  render() {
111
- const isVerticalEdge = this.side === 'top' || this.side === 'bottom';
112
-
113
65
  return (
114
66
  <Host
115
- aria-hidden="true"
116
- class={{
117
- fade: true,
118
- 'fade--hidden': !this.visible,
119
- 'fade--vertical-edge': isVerticalEdge,
120
- 'fade--horizontal-edge': !isVerticalEdge,
121
- 'fade--shell-gradient': this.shellGradientChrome !== null,
122
- 'fade--shell-gradient-panel': this.shellGradientChrome === 'panel',
123
- 'fade--shell-gradient-bar': this.shellGradientChrome === 'bar',
124
- [`fade--${this.side}`]: true,
125
- }}
126
- style={{
127
- '--ds-fade-size': this.resolveSize(),
128
- '--ds-fade-bg': this.resolveBackground(),
129
- } as Record<string, string>}
130
- />
67
+ class={scrollEdgeFadeClassMap({
68
+ edges: this.side,
69
+ atEnd: { [this.side]: this.atEnd },
70
+ hidden: !this.visible,
71
+ })}
72
+ style={scrollEdgeFadeSizeStyle(this.size, this.height) as Record<string, string>}
73
+ onScroll={(e: Event) => this.handleScroll(e)}
74
+ >
75
+ <slot />
76
+ </Host>
131
77
  );
132
78
  }
133
79
  }
@@ -1 +1 @@
1
- export type { FadeSide, FadeSize, FadeSizeToken, FadeSurface } from './Fade';
1
+ export type { FadeSide, FadeSize, FadeSizeToken } from './Fade';
@@ -17,6 +17,7 @@ import {
17
17
  type PanelNavRouterMode,
18
18
  type PanelNavUserActionDetail,
19
19
  } from './panel-nav-types';
20
+ import { scrollEdgeFadeClassMap } from '../../utils/scroll-edge-fade';
20
21
 
21
22
  @Component({
22
23
  tag: 'ds-panel-nav',
@@ -88,7 +89,6 @@ export class PanelNav {
88
89
 
89
90
  @State() private renderedStyle: NavChromeStyle = 'dashboard';
90
91
  @State() private parsedGroups: PanelNavGroup[] = [];
91
- @State() private atBottom = false;
92
92
  @State() private isAnimating = false;
93
93
  @State() private rovingIndex: number = 0;
94
94
  @State() private viewportNarrow: boolean = false;
@@ -179,7 +179,6 @@ export class PanelNav {
179
179
  componentDidLoad() {
180
180
  this.syncHostPropsIfNeeded();
181
181
  this.scheduleDeferredHostPropSync();
182
- this.checkScroll();
183
182
  if (this.breakpoint > 0) this.connectResizeObserver();
184
183
  }
185
184
 
@@ -389,19 +388,6 @@ export class PanelNav {
389
388
  this.focusRovingAt(next);
390
389
  }
391
390
 
392
- private checkScroll() {
393
- const body = this.el.querySelector('.panel-nav__body') as HTMLElement | null;
394
- if (!body) return;
395
- const remaining = body.scrollHeight - body.scrollTop - body.clientHeight;
396
- this.atBottom = remaining < 2;
397
- }
398
-
399
- private handleBodyScroll(e: Event) {
400
- const body = e.target as HTMLElement;
401
- const remaining = body.scrollHeight - body.scrollTop - body.clientHeight;
402
- this.atBottom = remaining < 2;
403
- }
404
-
405
391
  private handleItemClick(id: string) {
406
392
  this.dsNavSelect.emit(id);
407
393
  }
@@ -558,7 +544,6 @@ export class PanelNav {
558
544
  'panel-nav--settings': !isDashboard,
559
545
  'panel-nav--collapsed': collapsed,
560
546
  'panel-nav--animating': this.isAnimating,
561
- 'panel-nav--at-bottom': this.atBottom,
562
547
  };
563
548
 
564
549
  return (
@@ -601,11 +586,8 @@ export class PanelNav {
601
586
  <div
602
587
  class={{
603
588
  'panel-nav__body': true,
604
- 'scroll-edge-fade': true,
605
- 'scroll-edge-fade--bottom': true,
606
- 'scroll-edge-fade--at-end': this.atBottom,
589
+ ...scrollEdgeFadeClassMap({ edges: 'bottom' }),
607
590
  }}
608
- onScroll={e => this.handleBodyScroll(e)}
609
591
  >
610
592
  {(() => {
611
593
  let flatIdx = 0;
@@ -19,7 +19,7 @@ import { CardSettingWidth } from "./components/CardSetting/CardSetting";
19
19
  import { ChipBackground, ChipContrast, ChipElevation, ChipIntent, ChipSize } from "./components/Chip/Chip";
20
20
  import { DividerInset, DividerLength, DividerOrientation, DividerSurface } from "./components/Divider/Divider";
21
21
  import { EmptyStateType } from "./components/EmptyState/EmptyState";
22
- import { FadeSide, FadeSize, FadeSurface } from "./components/Fade/Fade";
22
+ import { FadeSide, FadeSize } from "./components/Fade/Fade";
23
23
  import { HeaderBackground } from "./components/Header/Header";
24
24
  import { IconColor, IconSize } from "./components/Icon/Icon";
25
25
  import { InputType } from "./components/Input/Input";
@@ -57,7 +57,7 @@ export { CardSettingWidth } from "./components/CardSetting/CardSetting";
57
57
  export { ChipBackground, ChipContrast, ChipElevation, ChipIntent, ChipSize } from "./components/Chip/Chip";
58
58
  export { DividerInset, DividerLength, DividerOrientation, DividerSurface } from "./components/Divider/Divider";
59
59
  export { EmptyStateType } from "./components/EmptyState/EmptyState";
60
- export { FadeSide, FadeSize, FadeSurface } from "./components/Fade/Fade";
60
+ export { FadeSide, FadeSize } from "./components/Fade/Fade";
61
61
  export { HeaderBackground } from "./components/Header/Header";
62
62
  export { IconColor, IconSize } from "./components/Icon/Icon";
63
63
  export { InputType } from "./components/Input/Input";
@@ -445,17 +445,12 @@ export namespace Components {
445
445
  "type": EmptyStateType;
446
446
  }
447
447
  interface DsFade {
448
- /**
449
- * Direct background override for contexts that already expose a resolved surface var.
450
- * @default 'var(--color-background-secondary)'
451
- */
452
- "background": string;
453
448
  /**
454
449
  * Deprecated alias for size. Kept for existing consumers that pass a raw CSS length. Prefer `size`.
455
450
  */
456
451
  "height": string | undefined;
457
452
  /**
458
- * Edge where the fade is anchored.
453
+ * Edge where content fades as it approaches the scroll boundary.
459
454
  * @default 'bottom'
460
455
  */
461
456
  "side": FadeSide;
@@ -465,12 +460,7 @@ export namespace Components {
465
460
  */
466
461
  "size": FadeSize;
467
462
  /**
468
- * Surface context used to choose the fade target background token.
469
- * @default 'default'
470
- */
471
- "surface": FadeSurface;
472
- /**
473
- * Controls visibility without removing the element from layout/positioning.
463
+ * Controls the mask without removing the scroll container from layout.
474
464
  * @default true
475
465
  */
476
466
  "visible": boolean;
@@ -2134,17 +2124,12 @@ declare namespace LocalJSX {
2134
2124
  "type"?: EmptyStateType;
2135
2125
  }
2136
2126
  interface DsFade {
2137
- /**
2138
- * Direct background override for contexts that already expose a resolved surface var.
2139
- * @default 'var(--color-background-secondary)'
2140
- */
2141
- "background"?: string;
2142
2127
  /**
2143
2128
  * Deprecated alias for size. Kept for existing consumers that pass a raw CSS length. Prefer `size`.
2144
2129
  */
2145
2130
  "height"?: string | undefined;
2146
2131
  /**
2147
- * Edge where the fade is anchored.
2132
+ * Edge where content fades as it approaches the scroll boundary.
2148
2133
  * @default 'bottom'
2149
2134
  */
2150
2135
  "side"?: FadeSide;
@@ -2154,12 +2139,7 @@ declare namespace LocalJSX {
2154
2139
  */
2155
2140
  "size"?: FadeSize;
2156
2141
  /**
2157
- * Surface context used to choose the fade target background token.
2158
- * @default 'default'
2159
- */
2160
- "surface"?: FadeSurface;
2161
- /**
2162
- * Controls visibility without removing the element from layout/positioning.
2142
+ * Controls the mask without removing the scroll container from layout.
2163
2143
  * @default true
2164
2144
  */
2165
2145
  "visible"?: boolean;
@@ -2916,8 +2896,6 @@ declare namespace LocalJSX {
2916
2896
  "side": FadeSide;
2917
2897
  "size": FadeSize;
2918
2898
  "height": string | undefined;
2919
- "surface": FadeSurface;
2920
- "background": string;
2921
2899
  "visible": boolean;
2922
2900
  }
2923
2901
  interface DsFieldAttributes {
@@ -4,9 +4,18 @@ export { parseCssTimeMs, resolveCssTimeMs } from './resolve-css-time-ms';
4
4
  export {
5
5
  SCROLL_EDGE_FADE_DEFAULT_SIZE,
6
6
  SCROLL_EDGE_FADE_SIZE_VAR,
7
+ isScrollAtEdge,
8
+ resolveScrollEdgeFadeSize,
9
+ scrollEdgeFadeClassMap,
7
10
  scrollEdgeFadeMaskImage,
8
11
  scrollEdgeFadeMaskStyle,
12
+ scrollEdgeFadeSizeStyle,
13
+ } from './scroll-edge-fade';
14
+ export type {
15
+ ScrollEdgeFadeEdge,
16
+ ScrollEdgeFadeOptions,
17
+ ScrollEdgeFadeSize,
18
+ ScrollEdgeFadeSizeToken,
9
19
  } from './scroll-edge-fade';
10
- export type { ScrollEdgeFadeEdge } from './scroll-edge-fade';
11
20
  export { TOKEN_DEFAULTS, TOKEN_CSS_LENGTHS } from './token-defaults';
12
21
  export type { TokenDefaultKey } from './token-defaults';
@@ -1,8 +1,9 @@
1
1
  /**
2
- * Scroll-edge alpha fade — apply to overflow scroll containers.
3
- * Pair with `.scroll-edge-fade--at-end` when the relevant edge is flush (no fade).
2
+ * Scroll-edge alpha fade — the single edge-fade utility for overflow containers.
3
+ * Masks scrolling content to transparent so flat surfaces, shell gradients, and
4
+ * images show through. Pair with `.scroll-edge-fade--at-end` when flush.
4
5
  *
5
- * @see scroll-edge-fade.ts for programmatic mask helpers.
6
+ * @see scroll-edge-fade.ts `scrollEdgeFadeClassMap`, `isScrollAtEdge`, size helpers.
6
7
  */
7
8
 
8
9
  .scroll-edge-fade {
@@ -67,7 +68,8 @@
67
68
  mask-size: 100% 100%;
68
69
  }
69
70
 
70
- .scroll-edge-fade--at-end {
71
+ .scroll-edge-fade--at-end,
72
+ .scroll-edge-fade--hidden {
71
73
  -webkit-mask-image: none;
72
74
  mask-image: none;
73
75
  }
@@ -5,12 +5,75 @@ export const SCROLL_EDGE_FADE_DEFAULT_SIZE = 'var(--dimension-size-600)';
5
5
 
6
6
  export type ScrollEdgeFadeEdge = 'top' | 'bottom' | 'left' | 'right';
7
7
 
8
+ export type ScrollEdgeFadeSizeToken =
9
+ | 'size-000'
10
+ | 'size-050'
11
+ | 'size-075'
12
+ | 'size-100'
13
+ | 'size-150'
14
+ | 'size-200'
15
+ | 'size-250'
16
+ | 'size-300'
17
+ | 'size-400'
18
+ | 'size-500'
19
+ | 'size-600'
20
+ | 'size-800';
21
+
22
+ export type ScrollEdgeFadeSize = ScrollEdgeFadeSizeToken | (string & {});
23
+
24
+ const SIZE_VALUE: Record<ScrollEdgeFadeSizeToken, string> = {
25
+ 'size-000': 'var(--dimension-size-000)',
26
+ 'size-050': 'var(--dimension-size-050)',
27
+ 'size-075': 'var(--dimension-size-075)',
28
+ 'size-100': 'var(--dimension-size-100)',
29
+ 'size-150': 'var(--dimension-size-150)',
30
+ 'size-200': 'var(--dimension-size-200)',
31
+ 'size-250': 'var(--dimension-size-250)',
32
+ 'size-300': 'var(--dimension-size-300)',
33
+ 'size-400': 'var(--dimension-size-400)',
34
+ 'size-500': 'var(--dimension-size-500)',
35
+ 'size-600': 'var(--dimension-size-600)',
36
+ 'size-800': 'var(--dimension-size-800)',
37
+ };
38
+
8
39
  const SIZE_REF = `var(${SCROLL_EDGE_FADE_SIZE_VAR}, ${SCROLL_EDGE_FADE_DEFAULT_SIZE})`;
9
40
 
41
+ export interface ScrollEdgeFadeOptions {
42
+ /** One or more edges to fade. */
43
+ edges: ScrollEdgeFadeEdge | ScrollEdgeFadeEdge[];
44
+ /**
45
+ * When true, or when every listed edge is at its scroll limit, removes the mask.
46
+ * Pass a per-edge map to hide only the edges that are flush (panel-nav bottom fade).
47
+ */
48
+ atEnd?: boolean | Partial<Record<ScrollEdgeFadeEdge, boolean>>;
49
+ /** Force the mask off regardless of scroll position (`ds-fade` `visible={false}`). */
50
+ hidden?: boolean;
51
+ }
52
+
53
+ /** Resolve a dimension size token name or raw CSS length for `--ds-scroll-edge-fade-size`. */
54
+ export function resolveScrollEdgeFadeSize(
55
+ size: ScrollEdgeFadeSize = 'size-600',
56
+ height?: string,
57
+ ): string {
58
+ if (height) return height;
59
+ return Object.prototype.hasOwnProperty.call(SIZE_VALUE, size)
60
+ ? SIZE_VALUE[size as ScrollEdgeFadeSizeToken]
61
+ : size;
62
+ }
63
+
64
+ /** Inline style map setting fade depth on a scroll container. */
65
+ export function scrollEdgeFadeSizeStyle(
66
+ size: ScrollEdgeFadeSize = 'size-600',
67
+ height?: string,
68
+ ): Record<string, string> {
69
+ return {
70
+ [SCROLL_EDGE_FADE_SIZE_VAR]: resolveScrollEdgeFadeSize(size, height),
71
+ };
72
+ }
73
+
10
74
  /**
11
75
  * Alpha mask for a scroll container edge — content fades to transparent so
12
- * textured backgrounds (gradients, images) show through. Prefer over painted
13
- * `ds-fade` overlays on non-flat surfaces.
76
+ * textured backgrounds (shell gradients, images) show through.
14
77
  */
15
78
  export function scrollEdgeFadeMaskImage(edge: ScrollEdgeFadeEdge): string {
16
79
  switch (edge) {
@@ -25,14 +88,61 @@ export function scrollEdgeFadeMaskImage(edge: ScrollEdgeFadeEdge): string {
25
88
  }
26
89
  }
27
90
 
28
- /** Inline style map for a masked scroll region. */
29
- export function scrollEdgeFadeMaskStyle(edge: ScrollEdgeFadeEdge): Record<string, string> {
91
+ /** Inline style map for a masked scroll region (single edge). */
92
+ export function scrollEdgeFadeMaskStyle(
93
+ edge: ScrollEdgeFadeEdge,
94
+ size: ScrollEdgeFadeSize = 'size-600',
95
+ height?: string,
96
+ ): Record<string, string> {
30
97
  const mask = scrollEdgeFadeMaskImage(edge);
31
98
  return {
32
- [SCROLL_EDGE_FADE_SIZE_VAR]: SCROLL_EDGE_FADE_DEFAULT_SIZE,
99
+ ...scrollEdgeFadeSizeStyle(size, height),
33
100
  WebkitMaskImage: mask,
34
101
  maskImage: mask,
35
102
  WebkitMaskSize: '100% 100%',
36
103
  maskSize: '100% 100%',
37
104
  };
38
105
  }
106
+
107
+ /** Class map for `scroll-edge-fade` modifiers — pair with `scroll-edge-fade.css`. */
108
+ export function scrollEdgeFadeClassMap(opts: ScrollEdgeFadeOptions): Record<string, boolean> {
109
+ const edges = Array.isArray(opts.edges) ? opts.edges : [opts.edges];
110
+ const classes: Record<string, boolean> = {
111
+ 'scroll-edge-fade': true,
112
+ 'scroll-edge-fade--hidden': opts.hidden === true,
113
+ };
114
+
115
+ for (const edge of edges) {
116
+ classes[`scroll-edge-fade--${edge}`] = true;
117
+ }
118
+
119
+ const { atEnd } = opts;
120
+ if (atEnd === true) {
121
+ classes['scroll-edge-fade--at-end'] = true;
122
+ } else if (atEnd && typeof atEnd === 'object') {
123
+ const allAtEnd = edges.every(edge => atEnd[edge]);
124
+ if (allAtEnd) {
125
+ classes['scroll-edge-fade--at-end'] = true;
126
+ }
127
+ }
128
+
129
+ return classes;
130
+ }
131
+
132
+ /** Whether a scroll container is flush with the given edge (within `threshold` px). */
133
+ export function isScrollAtEdge(
134
+ el: HTMLElement,
135
+ edge: ScrollEdgeFadeEdge,
136
+ threshold = 2,
137
+ ): boolean {
138
+ switch (edge) {
139
+ case 'top':
140
+ return el.scrollTop <= threshold;
141
+ case 'bottom':
142
+ return el.scrollHeight - el.scrollTop - el.clientHeight <= threshold;
143
+ case 'left':
144
+ return el.scrollLeft <= threshold;
145
+ case 'right':
146
+ return el.scrollWidth - el.scrollLeft - el.clientWidth <= threshold;
147
+ }
148
+ }
@@ -1,2 +0,0 @@
1
- const t="--_badge-gradient-position";function n(t){const n=t.closest("ds-app-shell");return n?.hasAttribute("gradient")===true}export{t as B,n as i};
2
- //# sourceMappingURL=p-BFPfyJ8Z.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["BADGE_GRADIENT_POSITION_VAR","isShellGradientActive","from","shell","closest","hasAttribute"],"sources":["src/wc/nav/badge-gradient-ring.ts"],"sourcesContent":["import {\n SHELL_GRADIENT_POSITION_BAR_VAR,\n SHELL_GRADIENT_POSITION_PANEL_VAR,\n} from './shell-gradient';\n\n/** Per-badge background-position for shell gradient ring sampling. */\nexport const BADGE_GRADIENT_POSITION_VAR = '--_badge-gradient-position';\n\nexport interface GradientSurface {\n element: HTMLElement;\n chromeHost: HTMLElement;\n positionVar: string;\n}\n\n/** Whether the badge sits under `ds-app-shell[gradient]`. */\nexport function isShellGradientActive(from: HTMLElement): boolean {\n // Explicit <HTMLElement>: the inferred HTMLDsAppShellElement type only\n // resolves where @stencil/core types are installed — consumers importing\n // `@ds-mo/ui/nav` (raw TS) compile this without them.\n const shell = from.closest<HTMLElement>('ds-app-shell');\n return shell?.hasAttribute('gradient') === true;\n}\n\n/** Bar or panel chrome surface that owns the shell gradient stack. */\nexport function findGradientSurface(from: HTMLElement): GradientSurface | null {\n const barHost = from.closest('ds-bar-nav') as HTMLElement | null;\n if (barHost) {\n const root = barHost.shadowRoot ?? barHost;\n const element = root.querySelector('.bar-nav');\n if (element) {\n return {\n element: element as HTMLElement,\n chromeHost: barHost,\n positionVar: SHELL_GRADIENT_POSITION_BAR_VAR,\n };\n }\n }\n\n const panelHost = from.closest('ds-panel-nav') as HTMLElement | null;\n if (panelHost) {\n const root = panelHost.shadowRoot ?? panelHost;\n const element = root.querySelector('.panel-nav');\n if (element) {\n return {\n element: element as HTMLElement,\n chromeHost: panelHost,\n positionVar: SHELL_GRADIENT_POSITION_PANEL_VAR,\n };\n }\n }\n\n return null;\n}\n\ninterface ParsedPosition {\n x: number;\n y: number;\n}\n\n/** Parse a two-value CSS background-position (e.g. `-200px 0`). */\nexport function parseCssBackgroundPosition(value: string): ParsedPosition {\n const trimmed = value.trim();\n if (!trimmed) return { x: 0, y: 0 };\n\n const parts = trimmed.split(/\\s+/);\n const x = parseLength(parts[0] ?? '0');\n const y = parseLength(parts[1] ?? '0');\n return { x, y };\n}\n\nfunction parseLength(token: string): number {\n const px = token.match(/^(-?[\\d.]+)px$/);\n if (px) return Number(px[1]);\n return 0;\n}\n\n/**\n * Background position for a badge ring so the shell gradient aligns with nav chrome.\n * Uses badge center relative to the painted chrome surface.\n */\nexport function badgeGradientPosition(\n badgeHost: HTMLElement,\n surface: GradientSurface,\n shellPosition: string,\n): string {\n const badgeRect = badgeHost.getBoundingClientRect();\n const surfaceRect = surface.element.getBoundingClientRect();\n const anchorX = badgeRect.left + badgeRect.width / 2 - surfaceRect.left;\n const anchorY = badgeRect.top + badgeRect.height / 2 - surfaceRect.top;\n const { x, y } = parseCssBackgroundPosition(shellPosition);\n\n return `${Math.round(x - anchorX)}px ${Math.round(y - anchorY)}px`;\n}\n\n/** Resolve shell gradient position from chrome host custom properties. */\nexport function readShellGradientPosition(surface: GradientSurface): string {\n const styles = getComputedStyle(surface.chromeHost);\n return styles.getPropertyValue(surface.positionVar).trim() || '0 0';\n}\n\n/** Stamp `--_badge-gradient-position` on the badge host (fixed viewport chrome). */\nexport function syncBadgeGradientPosition(badgeHost: HTMLElement): void {\n if (!isShellGradientActive(badgeHost)) {\n badgeHost.style.removeProperty(BADGE_GRADIENT_POSITION_VAR);\n return;\n }\n\n badgeHost.style.setProperty(BADGE_GRADIENT_POSITION_VAR, '0 0');\n}\n"],"mappings":"AAMO,MAAMA,EAA8B,6BASrC,SAAUC,EAAsBC,GAIpC,MAAMC,EAAQD,EAAKE,QAAqB,gBACxC,OAAOD,GAAOE,aAAa,cAAgB,IAC7C,Q","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{p as e,H as a,h as i,a as n,t as r}from"./index.js";import{i as d,B as t}from"./p-BFPfyJ8Z.js";const s=()=>`.sc-ds-badge-h{display:inline-flex;align-items:center;justify-content:center;pointer-events:none;vertical-align:middle;--_badge-bg:var(--color-background-bold-brand);--_badge-fg:var(--color-foreground-on-bold-background-primary);--_badge-ring:var(--color-background-secondary);--_badge-ring-width:var(--dimension-stroke-width-018)}.badge__mark.sc-ds-badge{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;box-sizing:border-box;color:var(--_badge-fg);background:var(--_badge-bg);box-shadow:0 0 0 var(--_badge-ring-width) var(--_badge-ring);white-space:nowrap}.badge--dot.sc-ds-badge-h .badge__mark.sc-ds-badge{width:var(--dimension-size-075);height:var(--dimension-size-075);border-radius:var(--dimension-radius-half)}.badge--counter.sc-ds-badge-h .badge__mark.sc-ds-badge{width:var(--dimension-size-150);height:var(--dimension-size-150);padding:0;border-radius:var(--dimension-radius-half);font-size:var(--typography-fontsize-xs);line-height:1}.badge--selected.sc-ds-badge-h{--_badge-bg:var(--color-foreground-primary)}.badge--on-gradient-background.sc-ds-badge-h .badge__mark.sc-ds-badge{position:relative;z-index:0;box-shadow:none;isolation:isolate}.badge--on-gradient-background.sc-ds-badge-h .badge__mark.sc-ds-badge::before,.badge--on-gradient-background.sc-ds-badge-h .badge__mark.sc-ds-badge::after{content:'';position:absolute;inset:calc(-1 * var(--_badge-ring-width));border-radius:inherit;box-sizing:border-box;padding:var(--_badge-ring-width);pointer-events:none;-webkit-mask:linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);mask-composite:exclude}.badge--on-gradient-background.sc-ds-badge-h .badge__mark.sc-ds-badge::before{z-index:-2;background-color:var(--_badge-ring)}.badge--on-gradient-background.sc-ds-badge-h .badge__mark.sc-ds-badge::after{z-index:-1;background-image:var(--ds-shell-gradient-image, none);background-size:var(--ds-shell-gradient-size, auto);background-position:0 0;background-repeat:no-repeat;background-attachment:fixed;opacity:var(--ds-shell-gradient-opacity, 1)}`;const o={default:"var(--color-background-secondary)",primary:"var(--color-background-primary)",secondary:"var(--color-background-secondary)",medium:"var(--color-background-medium-neutral)",bold:"var(--color-background-bold-neutral)",strong:"var(--color-background-strong-neutral)",navigation:"var(--color-navigation-background)","always-dark":"var(--color-always-dark-background)"};const g=e(class e extends a{constructor(e){super();if(e!==false){this.__registerHost()}this.variant="counter";this.count=0;this.max=9;this.surface="default";this.gradientBackground=false;this.isSelected=false;this.gradientLayoutVersion=0;this.gradientObserver=null;this.gradientWindowListener=null}componentDidLoad(){this.enableShellGradientRingIfNeeded()}disconnectedCallback(){this.unbindGradientRingSync()}gradientBackgroundChanged(){this.bindGradientRingSync()}enableShellGradientRingIfNeeded(){if(!this.gradientBackground&&d(this.el)){this.gradientBackground=true}if(this.gradientBackground){this.bindGradientRingSync()}}bindGradientRingSync(){this.unbindGradientRingSync();if(!this.gradientBackground)return;const e=()=>{this.gradientLayoutVersion+=1};e();this.gradientWindowListener=e;window.addEventListener("resize",e);if(typeof ResizeObserver!=="undefined"){this.gradientObserver=new ResizeObserver(e);this.gradientObserver.observe(this.el);const a=this.el.closest("ds-app-shell");if(a)this.gradientObserver.observe(a);const i=this.el.closest("ds-bar-nav");if(i)this.gradientObserver.observe(i);const n=this.el.closest("ds-panel-nav");if(n)this.gradientObserver.observe(n)}}unbindGradientRingSync(){if(this.gradientWindowListener){window.removeEventListener("resize",this.gradientWindowListener);this.gradientWindowListener=null}this.gradientObserver?.disconnect();this.gradientObserver=null}ringHostStyle(e){const a={"--_badge-ring":e};if(!this.gradientBackground||!d(this.el))return a;a[t]="0 0";return a}render(){const e=this.variant==="dot";if(!e&&this.count===0)return i(n,{style:{display:"none"}});const a=this.count>this.max?"+":String(this.count);const r=this.label??(e?"Notification":String(this.count));const d=this.background??o[this.surface];return i(n,{class:{badge:true,"badge--counter":!e,"badge--dot":e,"badge--selected":this.isSelected,"badge--on-gradient-background":this.gradientBackground},"aria-label":r,style:this.ringHostStyle(d)},i("span",{class:{badge__mark:true,"text-caption-emphasis":!e},"aria-hidden":"true"},!e&&a))}get el(){return this}static get watchers(){return{gradientBackground:[{gradientBackgroundChanged:0}]}}static get style(){return s()}},[2,"ds-badge",{variant:[1],count:[2],max:[2],surface:[1],background:[1],gradientBackground:[516,"gradient-background"],isSelected:[4,"is-selected"],label:[1],gradientLayoutVersion:[32]},undefined,{gradientBackground:[{gradientBackgroundChanged:0}]}]);function c(){if(typeof customElements==="undefined"){return}const e=["ds-badge"];e.forEach((e=>{switch(e){case"ds-badge":if(!customElements.get(r(e))){customElements.define(r(e),g)}break}}))}c();export{g as B,c as d};
2
- //# sourceMappingURL=p-BOpHKDOG.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["badgeCss","SURFACE_RING","default","primary","secondary","medium","bold","strong","navigation","Badge","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","variant","count","max","surface","gradientBackground","isSelected","gradientLayoutVersion","gradientObserver","gradientWindowListener","componentDidLoad","enableShellGradientRingIfNeeded","disconnectedCallback","unbindGradientRingSync","gradientBackgroundChanged","bindGradientRingSync","isShellGradientActive","el","update","window","addEventListener","ResizeObserver","observe","shell","closest","bar","panel","removeEventListener","disconnect","ringHostStyle","ring","style","BADGE_GRADIENT_POSITION_VAR","render","isDot","h","Host","display","String","ariaLabel","label","background","class","badge","badge__mark"],"sources":["src/wc/components/Badge/Badge.css?tag=ds-badge&encapsulation=scoped","src/wc/components/Badge/Badge.tsx"],"sourcesContent":[":host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n vertical-align: middle;\n\n --_badge-bg: var(--color-background-bold-brand);\n --_badge-fg: var(--color-foreground-on-bold-background-primary);\n --_badge-ring: var(--color-background-secondary);\n --_badge-ring-width: var(--dimension-stroke-width-018);\n}\n\n.badge__mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n box-sizing: border-box;\n color: var(--_badge-fg);\n background: var(--_badge-bg);\n box-shadow: 0 0 0 var(--_badge-ring-width) var(--_badge-ring);\n white-space: nowrap;\n}\n\n:host(.badge--dot) .badge__mark {\n width: var(--dimension-size-075);\n height: var(--dimension-size-075);\n border-radius: var(--dimension-radius-half);\n}\n\n:host(.badge--counter) .badge__mark {\n width: var(--dimension-size-150);\n height: var(--dimension-size-150);\n padding: 0;\n border-radius: var(--dimension-radius-half);\n font-size: var(--typography-fontsize-xs);\n line-height: 1;\n}\n\n:host(.badge--selected) {\n --_badge-bg: var(--color-foreground-primary);\n}\n\n/* Shell gradient ring — base fill + wash donut (option 3). */\n:host(.badge--on-gradient-background) .badge__mark {\n position: relative;\n z-index: 0;\n box-shadow: none;\n isolation: isolate;\n}\n\n:host(.badge--on-gradient-background) .badge__mark::before,\n:host(.badge--on-gradient-background) .badge__mark::after {\n content: '';\n position: absolute;\n inset: calc(-1 * var(--_badge-ring-width));\n border-radius: inherit;\n box-sizing: border-box;\n padding: var(--_badge-ring-width);\n pointer-events: none;\n -webkit-mask:\n linear-gradient(#fff 0 0) content-box,\n linear-gradient(#fff 0 0);\n -webkit-mask-composite: xor;\n mask:\n linear-gradient(#fff 0 0) content-box,\n linear-gradient(#fff 0 0);\n mask-composite: exclude;\n}\n\n:host(.badge--on-gradient-background) .badge__mark::before {\n z-index: -2;\n background-color: var(--_badge-ring);\n}\n\n:host(.badge--on-gradient-background) .badge__mark::after {\n z-index: -1;\n background-image: var(--ds-shell-gradient-image, none);\n background-size: var(--ds-shell-gradient-size, auto);\n background-position: 0 0;\n background-repeat: no-repeat;\n background-attachment: fixed;\n opacity: var(--ds-shell-gradient-opacity, 1);\n}\n","import { Component, Prop, Element, State, Watch, h, Host } from '@stencil/core';\nimport {\n BADGE_GRADIENT_POSITION_VAR,\n isShellGradientActive,\n} from '../../nav/badge-gradient-ring';\n\nexport type BadgeVariant = 'counter' | 'dot';\nexport type BadgeSurface =\n | 'default'\n | 'primary'\n | 'secondary'\n | 'medium'\n | 'bold'\n | 'strong'\n | 'navigation'\n | 'always-dark';\n\nconst SURFACE_RING: Record<BadgeSurface, string> = {\n default: 'var(--color-background-secondary)',\n primary: 'var(--color-background-primary)',\n secondary: 'var(--color-background-secondary)',\n medium: 'var(--color-background-medium-neutral)',\n bold: 'var(--color-background-bold-neutral)',\n strong: 'var(--color-background-strong-neutral)',\n navigation: 'var(--color-navigation-background)',\n 'always-dark': 'var(--color-always-dark-background)',\n};\n\n@Component({\n tag: 'ds-badge',\n styleUrl: 'Badge.css',\n scoped: true,\n})\nexport class Badge {\n @Element() el!: HTMLElement;\n\n /** Render as a compact counter or notification dot. */\n @Prop() variant: BadgeVariant = 'counter';\n\n /** Count shown for counter badges. Count 0 hides the badge. */\n @Prop() count: number = 0;\n\n /** Highest count shown before compacting to \"+\". */\n @Prop() max: number = 9;\n\n /** Surface context for the ring around dots. */\n @Prop() surface: BadgeSurface = 'default';\n\n /** Direct ring background override for component-local surfaces. */\n @Prop() background: string | undefined;\n\n /**\n * Ring samples the shell gradient stack (base fill + wash) instead of a flat\n * `box-shadow`. Auto-enabled in `componentDidLoad` under `ds-app-shell[gradient]`;\n * set `gradient-background` to opt in/out explicitly.\n *\n * The attribute must NOT start with `on` — Stencil's setAccessor routes any\n * unknown `on*` member down the event-listener path during attribute\n * reflection, calling addEventListener with a non-listener and throwing.\n */\n @Prop({ attribute: 'gradient-background', reflect: true }) gradientBackground: boolean = false;\n\n /** Deprecated alias for selected counter styling. Prefer context-specific color in the parent. */\n @Prop() isSelected: boolean = false;\n\n /** Accessible label. Defaults to the count as a string. */\n @Prop() label: string | undefined;\n\n /** Bumps on resize/layout so render recomputes gradient ring position. */\n @State() private gradientLayoutVersion = 0;\n\n private gradientObserver: ResizeObserver | null = null;\n private gradientWindowListener: (() => void) | null = null;\n\n componentDidLoad() {\n this.enableShellGradientRingIfNeeded();\n }\n\n disconnectedCallback() {\n this.unbindGradientRingSync();\n }\n\n @Watch('gradientBackground')\n gradientBackgroundChanged() {\n this.bindGradientRingSync();\n }\n\n /** Imperative opt-in avoids Stencil aborting parent render for nested badges. */\n private enableShellGradientRingIfNeeded() {\n if (!this.gradientBackground && isShellGradientActive(this.el)) {\n this.gradientBackground = true;\n }\n\n if (this.gradientBackground) {\n this.bindGradientRingSync();\n }\n }\n\n private bindGradientRingSync() {\n this.unbindGradientRingSync();\n\n if (!this.gradientBackground) return;\n\n const update = () => {\n this.gradientLayoutVersion += 1;\n };\n update();\n\n this.gradientWindowListener = update;\n window.addEventListener('resize', update);\n\n if (typeof ResizeObserver !== 'undefined') {\n this.gradientObserver = new ResizeObserver(update);\n this.gradientObserver.observe(this.el);\n\n const shell = this.el.closest('ds-app-shell');\n if (shell) this.gradientObserver.observe(shell);\n\n const bar = this.el.closest('ds-bar-nav');\n if (bar) this.gradientObserver.observe(bar);\n\n const panel = this.el.closest('ds-panel-nav');\n if (panel) this.gradientObserver.observe(panel);\n }\n }\n\n private unbindGradientRingSync() {\n if (this.gradientWindowListener) {\n window.removeEventListener('resize', this.gradientWindowListener);\n this.gradientWindowListener = null;\n }\n\n this.gradientObserver?.disconnect();\n this.gradientObserver = null;\n }\n\n private ringHostStyle(ring: string): Record<string, string> {\n void this.gradientLayoutVersion;\n\n const style: Record<string, string> = { '--_badge-ring': ring };\n if (!this.gradientBackground || !isShellGradientActive(this.el)) return style;\n\n /* Shell chrome wash uses background-attachment: fixed at viewport origin. */\n style[BADGE_GRADIENT_POSITION_VAR] = '0 0';\n return style;\n }\n\n render() {\n const isDot = this.variant === 'dot';\n\n if (!isDot && this.count === 0) return <Host style={{ display: 'none' }} />;\n\n const display = this.count > this.max ? '+' : String(this.count);\n const ariaLabel = this.label ?? (isDot ? 'Notification' : String(this.count));\n const ring = this.background ?? SURFACE_RING[this.surface];\n\n return (\n <Host\n class={{\n badge: true,\n 'badge--counter': !isDot,\n 'badge--dot': isDot,\n 'badge--selected': this.isSelected,\n 'badge--on-gradient-background': this.gradientBackground,\n }}\n aria-label={ariaLabel}\n style={this.ringHostStyle(ring)}\n >\n <span\n class={{\n 'badge__mark': true,\n 'text-caption-emphasis': !isDot,\n }}\n aria-hidden=\"true\"\n >\n {!isDot && display}\n </span>\n </Host>\n );\n }\n}\n"],"mappings":"sGAAA,MAAMA,EAAW,IAAM,ymECiBvB,MAAMC,EAA6C,CACjDC,QAAS,oCACTC,QAAS,kCACTC,UAAW,oCACXC,OAAQ,yCACRC,KAAM,uCACNC,OAAQ,yCACRC,WAAY,qCACZ,cAAe,uC,MAQJC,EAAKC,EAAA,MAAAD,UAAAE,EALlB,WAAAC,CAAAC,G,4CASUC,KAAAC,QAAwB,UAGxBD,KAAAE,MAAgB,EAGhBF,KAAAG,IAAc,EAGdH,KAAAI,QAAwB,UAc2BJ,KAAAK,mBAA8B,MAGjFL,KAAAM,WAAsB,MAMbN,KAAAO,sBAAwB,EAEjCP,KAAAQ,iBAA0C,KAC1CR,KAAAS,uBAA8C,IA4GvD,CA1GC,gBAAAC,GACEV,KAAKW,iC,CAGP,oBAAAC,GACEZ,KAAKa,wB,CAIP,yBAAAC,GACEd,KAAKe,sB,CAIC,+BAAAJ,GACN,IAAKX,KAAKK,oBAAsBW,EAAsBhB,KAAKiB,IAAK,CAC9DjB,KAAKK,mBAAqB,I,CAG5B,GAAIL,KAAKK,mBAAoB,CAC3BL,KAAKe,sB,EAID,oBAAAA,GACNf,KAAKa,yBAEL,IAAKb,KAAKK,mBAAoB,OAE9B,MAAMa,EAAS,KACblB,KAAKO,uBAAyB,CAAC,EAEjCW,IAEAlB,KAAKS,uBAAyBS,EAC9BC,OAAOC,iBAAiB,SAAUF,GAElC,UAAWG,iBAAmB,YAAa,CACzCrB,KAAKQ,iBAAmB,IAAIa,eAAeH,GAC3ClB,KAAKQ,iBAAiBc,QAAQtB,KAAKiB,IAEnC,MAAMM,EAAQvB,KAAKiB,GAAGO,QAAQ,gBAC9B,GAAID,EAAOvB,KAAKQ,iBAAiBc,QAAQC,GAEzC,MAAME,EAAMzB,KAAKiB,GAAGO,QAAQ,cAC5B,GAAIC,EAAKzB,KAAKQ,iBAAiBc,QAAQG,GAEvC,MAAMC,EAAQ1B,KAAKiB,GAAGO,QAAQ,gBAC9B,GAAIE,EAAO1B,KAAKQ,iBAAiBc,QAAQI,E,EAIrC,sBAAAb,GACN,GAAIb,KAAKS,uBAAwB,CAC/BU,OAAOQ,oBAAoB,SAAU3B,KAAKS,wBAC1CT,KAAKS,uBAAyB,I,CAGhCT,KAAKQ,kBAAkBoB,aACvB5B,KAAKQ,iBAAmB,I,CAGlB,aAAAqB,CAAcC,GAGpB,MAAMC,EAAgC,CAAE,gBAAiBD,GACzD,IAAK9B,KAAKK,qBAAuBW,EAAsBhB,KAAKiB,IAAK,OAAOc,EAGxEA,EAAMC,GAA+B,MACrC,OAAOD,C,CAGT,MAAAE,GACE,MAAMC,EAAQlC,KAAKC,UAAY,MAE/B,IAAKiC,GAASlC,KAAKE,QAAU,EAAG,OAAOiC,EAACC,EAAI,CAACL,MAAO,CAAEM,QAAS,UAE/D,MAAMA,EAAUrC,KAAKE,MAAQF,KAAKG,IAAM,IAAMmC,OAAOtC,KAAKE,OAC1D,MAAMqC,EAAYvC,KAAKwC,QAAUN,EAAQ,eAAiBI,OAAOtC,KAAKE,QACtE,MAAM4B,EAAO9B,KAAKyC,YAActD,EAAaa,KAAKI,SAElD,OACE+B,EAACC,EAAI,CACHM,MAAO,CACLC,MAAO,KACP,kBAAmBT,EACnB,aAAcA,EACd,kBAAmBlC,KAAKM,WACxB,gCAAiCN,KAAKK,oBACvC,aACWkC,EACZR,MAAO/B,KAAK6B,cAAcC,IAE1BK,EAAA,QACEO,MAAO,CACLE,YAAe,KACf,yBAA0BV,GAC3B,cACW,SAEVA,GAASG,G","ignoreList":[]}