@ds-mo/ui 1.7.4 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/.build-stamp +1 -1
  2. package/dist/components/ds-app-shell.js +1 -1
  3. package/dist/components/ds-app-shell.js.map +1 -1
  4. package/dist/components/ds-badge.js +1 -1
  5. package/dist/components/ds-bar-nav-action.js +1 -1
  6. package/dist/components/ds-bar-nav.js +1 -1
  7. package/dist/components/ds-bar-nav.js.map +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-panel-nav.js +1 -1
  13. package/dist/components/ds-panel-nav.js.map +1 -1
  14. package/dist/components/ds-panel-tools.d.ts +11 -0
  15. package/dist/components/ds-panel-tools.js +2 -0
  16. package/dist/components/ds-panel-tools.js.map +1 -0
  17. package/dist/components/ds-slider.js +1 -1
  18. package/dist/components/ds-slider.js.map +1 -1
  19. package/dist/components/ds-tab-group-nav.js +1 -1
  20. package/dist/components/ds-tab-group.js +1 -1
  21. package/dist/components/ds-toggle.js +1 -1
  22. package/dist/components/p-B8VZmH43.js +2 -0
  23. package/dist/components/p-B8VZmH43.js.map +1 -0
  24. package/dist/components/p-BucV1U6A.js +2 -0
  25. package/dist/components/p-BucV1U6A.js.map +1 -0
  26. package/dist/components/p-CX7-_qOW.js +2 -0
  27. package/dist/components/p-CX7-_qOW.js.map +1 -0
  28. package/dist/components/{p-D7HuiVTa.js → p-DZDXwEMg.js} +2 -2
  29. package/dist/components/{p-CiQqF0cR.js → p-DrvpsLK6.js} +2 -2
  30. package/dist/components/p-TtnqbcnR.js +2 -0
  31. package/dist/components/p-TtnqbcnR.js.map +1 -0
  32. package/dist/types/components/BarNav/BarNav.d.ts +9 -2
  33. package/dist/types/components/Fade/Fade.d.ts +5 -0
  34. package/dist/types/components/PanelTools/PanelTools.d.ts +27 -0
  35. package/dist/types/components/PanelTools/index.d.ts +3 -0
  36. package/dist/types/components/PanelTools/panel-tools-types.d.ts +5 -0
  37. package/dist/types/components.d.ts +39 -0
  38. package/dist/types/nav/index.d.ts +1 -1
  39. package/dist/types/nav/shell-view-transition.d.ts +3 -0
  40. package/dist/types/utils/index.d.ts +2 -0
  41. package/dist/types/utils/scroll-edge-fade.d.ts +13 -0
  42. package/package.json +3 -3
  43. package/src/angular/index.ts +1 -0
  44. package/src/angular/proxies.ts +23 -0
  45. package/src/react/components.ts +1 -0
  46. package/src/react/ds-panel-tools.ts +26 -0
  47. package/src/wc/components/AppShell/AppShell.tsx +7 -2
  48. package/src/wc/components/BarNav/BarNav.tsx +75 -19
  49. package/src/wc/components/Fade/Fade.tsx +22 -1
  50. package/src/wc/components/PanelNav/PanelNav.tsx +10 -9
  51. package/src/wc/components/PanelTools/PanelTools.tsx +163 -0
  52. package/src/wc/components/PanelTools/index.ts +2 -0
  53. package/src/wc/components/PanelTools/panel-tools-types.ts +18 -0
  54. package/src/wc/components.d.ts +39 -0
  55. package/src/wc/nav/index.ts +2 -0
  56. package/src/wc/nav/shell-gradient.ts +2 -2
  57. package/src/wc/nav/shell-view-transition.ts +24 -5
  58. package/src/wc/utils/index.ts +7 -0
  59. package/src/wc/utils/scroll-edge-fade.css +73 -0
  60. package/src/wc/utils/scroll-edge-fade.ts +38 -0
  61. package/dist/components/p-CXkDP-ct.js +0 -2
  62. package/dist/components/p-CXkDP-ct.js.map +0 -1
  63. package/dist/components/p-DAycHO-h.js +0 -2
  64. package/dist/components/p-DAycHO-h.js.map +0 -1
  65. package/dist/components/p-DfL2MOso.js +0 -2
  66. package/dist/components/p-DfL2MOso.js.map +0 -1
  67. package/dist/components/p-vW9EMP8s.js +0 -2
  68. package/dist/components/p-vW9EMP8s.js.map +0 -1
  69. /package/dist/components/{p-D7HuiVTa.js.map → p-DZDXwEMg.js.map} +0 -0
  70. /package/dist/components/{p-CiQqF0cR.js.map → p-DrvpsLK6.js.map} +0 -0
@@ -7,6 +7,19 @@ export { parseCssTimeMs };
7
7
 
8
8
  const VT_STYLE_ID = 'ds-shell-nav-vt-style';
9
9
 
10
+ /** TokoMo tokens for the dashboard ↔ settings radial reveal (WAAPI). */
11
+ export const SHELL_NAV_REVEAL_DURATION_VAR = '--effect-animation-duration-medium-3';
12
+ export const SHELL_NAV_REVEAL_EASING_VAR = '--effect-animation-easing-ease-in-out';
13
+
14
+ const SHELL_NAV_REVEAL_DURATION_FALLBACK_MS = 500;
15
+ const SHELL_NAV_REVEAL_EASING_FALLBACK = 'ease-in-out';
16
+
17
+ function readCssCustomProperty(name: string, fallback: string): string {
18
+ if (typeof document === 'undefined') return fallback;
19
+ const value = getComputedStyle(document.documentElement).getPropertyValue(name).trim();
20
+ return value || fallback;
21
+ }
22
+
10
23
  /** Suppress default cross-fade and pin new snapshots to a 0px circle for WAAPI reveal. */
11
24
  export function ensureShellNavVtStyle(): void {
12
25
  if (typeof document === 'undefined') return;
@@ -53,10 +66,16 @@ export function animateShellNavRadialReveal(
53
66
  origin: ShellNavRevealOrigin,
54
67
  durationMs?: number,
55
68
  ): void {
56
- const durToken = getComputedStyle(document.documentElement)
57
- .getPropertyValue('--effect-animation-duration-long-1')
58
- .trim();
59
- const duration = durationMs ?? parseCssTimeMs(durToken, 750);
69
+ const duration =
70
+ durationMs ??
71
+ parseCssTimeMs(
72
+ readCssCustomProperty(SHELL_NAV_REVEAL_DURATION_VAR, '400ms'),
73
+ SHELL_NAV_REVEAL_DURATION_FALLBACK_MS,
74
+ );
75
+ const easing = readCssCustomProperty(
76
+ SHELL_NAV_REVEAL_EASING_VAR,
77
+ SHELL_NAV_REVEAL_EASING_FALLBACK,
78
+ );
60
79
  const keyframes = {
61
80
  clipPath: [
62
81
  `circle(0px at ${origin.x}px ${origin.y}px)`,
@@ -65,7 +84,7 @@ export function animateShellNavRadialReveal(
65
84
  };
66
85
  const options = {
67
86
  duration,
68
- easing: 'ease-in-out',
87
+ easing,
69
88
  fill: 'forwards' as const,
70
89
  };
71
90
 
@@ -1,4 +1,11 @@
1
1
  export { clearCssLengthPxCache, resolveCssLengthPx } from './resolve-css-length-px';
2
2
  export { parseCssTimeMs, resolveCssTimeMs } from './resolve-css-time-ms';
3
+ export {
4
+ SCROLL_EDGE_FADE_DEFAULT_SIZE,
5
+ SCROLL_EDGE_FADE_SIZE_VAR,
6
+ scrollEdgeFadeMaskImage,
7
+ scrollEdgeFadeMaskStyle,
8
+ } from './scroll-edge-fade';
9
+ export type { ScrollEdgeFadeEdge } from './scroll-edge-fade';
3
10
  export { TOKEN_DEFAULTS } from './token-defaults';
4
11
  export type { TokenDefaultKey } from './token-defaults';
@@ -0,0 +1,73 @@
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).
4
+ *
5
+ * @see scroll-edge-fade.ts for programmatic mask helpers.
6
+ */
7
+
8
+ .scroll-edge-fade {
9
+ --ds-scroll-edge-fade-size: var(--dimension-size-600);
10
+ }
11
+
12
+ .scroll-edge-fade--top {
13
+ -webkit-mask-image: linear-gradient(to bottom, #000 0, #000 50%, transparent 100%);
14
+ mask-image: linear-gradient(to bottom, #000 0, #000 50%, transparent 100%);
15
+ -webkit-mask-size: 100% 100%;
16
+ mask-size: 100% 100%;
17
+ }
18
+
19
+ .scroll-edge-fade--bottom {
20
+ -webkit-mask-image: linear-gradient(
21
+ to bottom,
22
+ #000 0,
23
+ #000 calc(100% - var(--ds-scroll-edge-fade-size)),
24
+ transparent 100%
25
+ );
26
+ mask-image: linear-gradient(
27
+ to bottom,
28
+ #000 0,
29
+ #000 calc(100% - var(--ds-scroll-edge-fade-size)),
30
+ transparent 100%
31
+ );
32
+ -webkit-mask-size: 100% 100%;
33
+ mask-size: 100% 100%;
34
+ }
35
+
36
+ .scroll-edge-fade--left {
37
+ -webkit-mask-image: linear-gradient(
38
+ to right,
39
+ #000 0,
40
+ #000 calc(100% - var(--ds-scroll-edge-fade-size)),
41
+ transparent 100%
42
+ );
43
+ mask-image: linear-gradient(
44
+ to right,
45
+ #000 0,
46
+ #000 calc(100% - var(--ds-scroll-edge-fade-size)),
47
+ transparent 100%
48
+ );
49
+ -webkit-mask-size: 100% 100%;
50
+ mask-size: 100% 100%;
51
+ }
52
+
53
+ .scroll-edge-fade--right {
54
+ -webkit-mask-image: linear-gradient(
55
+ to left,
56
+ #000 0,
57
+ #000 calc(100% - var(--ds-scroll-edge-fade-size)),
58
+ transparent 100%
59
+ );
60
+ mask-image: linear-gradient(
61
+ to left,
62
+ #000 0,
63
+ #000 calc(100% - var(--ds-scroll-edge-fade-size)),
64
+ transparent 100%
65
+ );
66
+ -webkit-mask-size: 100% 100%;
67
+ mask-size: 100% 100%;
68
+ }
69
+
70
+ .scroll-edge-fade--at-end {
71
+ -webkit-mask-image: none;
72
+ mask-image: none;
73
+ }
@@ -0,0 +1,38 @@
1
+ /** CSS custom property for scroll-edge fade depth (dimension token or length). */
2
+ export const SCROLL_EDGE_FADE_SIZE_VAR = '--ds-scroll-edge-fade-size';
3
+
4
+ export const SCROLL_EDGE_FADE_DEFAULT_SIZE = 'var(--dimension-size-600)';
5
+
6
+ export type ScrollEdgeFadeEdge = 'top' | 'bottom' | 'left' | 'right';
7
+
8
+ const SIZE_REF = `var(${SCROLL_EDGE_FADE_SIZE_VAR}, ${SCROLL_EDGE_FADE_DEFAULT_SIZE})`;
9
+
10
+ /**
11
+ * 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.
14
+ */
15
+ export function scrollEdgeFadeMaskImage(edge: ScrollEdgeFadeEdge): string {
16
+ switch (edge) {
17
+ case 'top':
18
+ return `linear-gradient(to bottom, #000 0, #000 50%, transparent 100%)`;
19
+ case 'bottom':
20
+ return `linear-gradient(to bottom, #000 0, #000 calc(100% - ${SIZE_REF}), transparent 100%)`;
21
+ case 'left':
22
+ return `linear-gradient(to right, #000 0, #000 calc(100% - ${SIZE_REF}), transparent 100%)`;
23
+ case 'right':
24
+ return `linear-gradient(to left, #000 0, #000 calc(100% - ${SIZE_REF}), transparent 100%)`;
25
+ }
26
+ }
27
+
28
+ /** Inline style map for a masked scroll region. */
29
+ export function scrollEdgeFadeMaskStyle(edge: ScrollEdgeFadeEdge): Record<string, string> {
30
+ const mask = scrollEdgeFadeMaskImage(edge);
31
+ return {
32
+ [SCROLL_EDGE_FADE_SIZE_VAR]: SCROLL_EDGE_FADE_DEFAULT_SIZE,
33
+ WebkitMaskImage: mask,
34
+ maskImage: mask,
35
+ WebkitMaskSize: '100% 100%',
36
+ maskSize: '100% 100%',
37
+ };
38
+ }
@@ -1,2 +0,0 @@
1
- const n="--ds-shell-gradient-image";const t="--ds-shell-gradient-size";const a="--ds-shell-gradient-position-panel";const r="--ds-shell-gradient-position-bar";const s="--ds-shell-gradient-opacity";const o="0.1";const e="128.57% 141.42% at 0% 0%";function c(){return`radial-gradient(${e}, var(--color-background-transparent) 0%, var(--color-color-intent-blue-medium-background) 50%, var(--color-color-intent-blue-strong-background) 100%)`}function i(n){return c()}function l(n){return`${Math.round(n.width)}px ${Math.round(n.height)}px`}function d(){return"0 0"}function u(n){return`${-Math.round(n)}px 0`}export{n as S,t as a,a as b,r as c,s as d,o as e,u as f,d as g,l as h,i as s};
2
- //# sourceMappingURL=p-CXkDP-ct.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["SHELL_GRADIENT_IMAGE_VAR","SHELL_GRADIENT_SIZE_VAR","SHELL_GRADIENT_POSITION_PANEL_VAR","SHELL_GRADIENT_POSITION_BAR_VAR","SHELL_GRADIENT_OPACITY_VAR","SHELL_GRADIENT_OPACITY","GRADIENT_GEOMETRY","buildShellRadialGradient","shellGradientImageForStyle","_style","shellGradientSize","layout","Math","round","width","height","shellGradientPositionPanel","shellGradientPositionBar","panelWidth"],"sources":["src/wc/nav/shell-gradient.ts"],"sourcesContent":["import type { NavChromeStyle } from './nav-chrome';\n\n/** CSS var names consumed by `ds-panel-nav` / `ds-bar-nav` inside `ds-app-shell`. */\nexport const SHELL_GRADIENT_IMAGE_VAR = '--ds-shell-gradient-image';\nexport const SHELL_GRADIENT_SIZE_VAR = '--ds-shell-gradient-size';\nexport const SHELL_GRADIENT_POSITION_PANEL_VAR = '--ds-shell-gradient-position-panel';\nexport const SHELL_GRADIENT_POSITION_BAR_VAR = '--ds-shell-gradient-position-bar';\nexport const SHELL_GRADIENT_OPACITY_VAR = '--ds-shell-gradient-opacity';\n\n/** Layer opacity for the nav gradient wash. */\nexport const SHELL_GRADIENT_OPACITY = '0.1';\n\nconst GRADIENT_GEOMETRY = '128.57% 141.42% at 0% 0%';\n\n/**\n * Unified shell radial — same wash for all nav chrome styles.\n * Tokens follow `data-theme` (light/dark blue intent).\n */\nexport function buildShellRadialGradient(): string {\n return `radial-gradient(${GRADIENT_GEOMETRY}, var(--color-background-transparent) 0%, var(--color-color-intent-blue-medium-background) 50%, var(--color-color-intent-blue-strong-background) 100%)`;\n}\n\n/** Built-in radial image (optional `gradientSrc` on shell overrides). */\nexport function shellGradientImageForStyle(_style: NavChromeStyle): string {\n return buildShellRadialGradient();\n}\n\nexport interface ShellGradientLayout {\n width: number;\n height: number;\n panelWidth: number;\n}\n\nexport function shellGradientSize(layout: ShellGradientLayout): string {\n return `${Math.round(layout.width)}px ${Math.round(layout.height)}px`;\n}\n\nexport function shellGradientPositionPanel(): string {\n return '0 0';\n}\n\nexport function shellGradientPositionBar(panelWidth: number): string {\n return `${-Math.round(panelWidth)}px 0`;\n}\n"],"mappings":"AAGO,MAAMA,EAA2B,4BACjC,MAAMC,EAA0B,2BAChC,MAAMC,EAAoC,qCAC1C,MAAMC,EAAkC,mCACxC,MAAMC,EAA6B,8BAGnC,MAAMC,EAAyB,MAEtC,MAAMC,EAAoB,2B,SAMVC,IACd,MAAO,mBAAmBD,yJAC5B,CAGM,SAAUE,EAA2BC,GACzC,OAAOF,GACT,CAQM,SAAUG,EAAkBC,GAChC,MAAO,GAAGC,KAAKC,MAAMF,EAAOG,YAAYF,KAAKC,MAAMF,EAAOI,WAC5D,C,SAEgBC,IACd,MAAO,KACT,CAEM,SAAUC,EAAyBC,GACvC,MAAO,IAAIN,KAAKC,MAAMK,QACxB,Q","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{p as e,H as n,h as a,a as t,t as r}from"./index.js";import{c as i,b as s}from"./p-CXkDP-ct.js";const d="--_badge-gradient-position";function o(e){const n=e.closest("ds-app-shell");return n?.hasAttribute("gradient")===true}function c(e){const n=e.closest("ds-bar-nav");if(n){const e=n.shadowRoot??n;const a=e.querySelector(".bar-nav");if(a){return{element:a,chromeHost:n,positionVar:i}}}const a=e.closest("ds-panel-nav");if(a){const e=a.shadowRoot??a;const n=e.querySelector(".panel-nav");if(n){return{element:n,chromeHost:a,positionVar:s}}}return null}function g(e){const n=e.trim();if(!n)return{x:0,y:0};const a=n.split(/\s+/);const t=b(a[0]??"0");const r=b(a[1]??"0");return{x:t,y:r}}function b(e){const n=e.match(/^(-?[\d.]+)px$/);if(n)return Number(n[1]);return 0}function l(e,n,a){const t=e.getBoundingClientRect();const r=n.element.getBoundingClientRect();const i=t.left+t.width/2-r.left;const s=t.top+t.height/2-r.top;const{x:d,y:o}=g(a);return`${Math.round(d-i)}px ${Math.round(o-s)}px`}function u(e){const n=getComputedStyle(e.chromeHost);return n.getPropertyValue(e.positionVar).trim()||"0 0"}const h=()=>`.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:var(--_badge-gradient-position, 0 0);background-repeat:no-repeat;opacity:var(--ds-shell-gradient-opacity, 1)}`;const f={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 m=e(class e extends n{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&&o(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 n=this.el.closest("ds-app-shell");if(n)this.gradientObserver.observe(n);const a=this.el.closest("ds-bar-nav");if(a)this.gradientObserver.observe(a);const t=this.el.closest("ds-panel-nav");if(t)this.gradientObserver.observe(t)}}unbindGradientRingSync(){if(this.gradientWindowListener){window.removeEventListener("resize",this.gradientWindowListener);this.gradientWindowListener=null}this.gradientObserver?.disconnect();this.gradientObserver=null}ringHostStyle(e){const n={"--_badge-ring":e};if(!this.gradientBackground)return n;const a=c(this.el);if(!a)return n;n[d]=l(this.el,a,u(a));return n}render(){const e=this.variant==="dot";if(!e&&this.count===0)return a(t,{style:{display:"none"}});const n=this.count>this.max?"+":String(this.count);const r=this.label??(e?"Notification":String(this.count));const i=this.background??f[this.surface];return a(t,{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(i)},a("span",{class:{badge__mark:true,"text-caption-emphasis":!e},"aria-hidden":"true"},!e&&n))}get el(){return this}static get watchers(){return{gradientBackground:[{gradientBackgroundChanged:0}]}}static get style(){return h()}},[2,"ds-badge",{variant:[1],count:[2],max:[2],surface:[1],background:[1],gradientBackground:[516,"on-gradient-background"],isSelected:[4,"is-selected"],label:[1],gradientLayoutVersion:[32]},undefined,{gradientBackground:[{gradientBackgroundChanged:0}]}]);function k(){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),m)}break}}))}k();export{m as B,k as d};
2
- //# sourceMappingURL=p-DAycHO-h.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["BADGE_GRADIENT_POSITION_VAR","isShellGradientActive","from","shell","closest","hasAttribute","findGradientSurface","barHost","root","shadowRoot","element","querySelector","chromeHost","positionVar","SHELL_GRADIENT_POSITION_BAR_VAR","panelHost","SHELL_GRADIENT_POSITION_PANEL_VAR","parseCssBackgroundPosition","value","trimmed","trim","x","y","parts","split","parseLength","token","px","match","Number","badgeGradientPosition","badgeHost","surface","shellPosition","badgeRect","getBoundingClientRect","surfaceRect","anchorX","left","width","anchorY","top","height","Math","round","readShellGradientPosition","styles","getComputedStyle","getPropertyValue","badgeCss","SURFACE_RING","default","primary","secondary","medium","bold","strong","navigation","Badge","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","variant","count","max","gradientBackground","isSelected","gradientLayoutVersion","gradientObserver","gradientWindowListener","componentDidLoad","enableShellGradientRingIfNeeded","disconnectedCallback","unbindGradientRingSync","gradientBackgroundChanged","bindGradientRingSync","el","update","window","addEventListener","ResizeObserver","observe","bar","panel","removeEventListener","disconnect","ringHostStyle","ring","style","render","isDot","h","Host","display","String","ariaLabel","label","background","class","badge","badge__mark"],"sources":["src/wc/nav/badge-gradient-ring.ts","src/wc/components/Badge/Badge.css?tag=ds-badge&encapsulation=scoped","src/wc/components/Badge/Badge.tsx"],"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 const shell = from.closest('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. */\nexport function syncBadgeGradientPosition(badgeHost: HTMLElement): void {\n const surface = findGradientSurface(badgeHost);\n if (!surface) {\n badgeHost.style.removeProperty(BADGE_GRADIENT_POSITION_VAR);\n return;\n }\n\n const shellPosition = readShellGradientPosition(surface);\n badgeHost.style.setProperty(\n BADGE_GRADIENT_POSITION_VAR,\n badgeGradientPosition(badgeHost, surface, shellPosition),\n );\n}\n",":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: var(--_badge-gradient-position, 0 0);\n background-repeat: no-repeat;\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 badgeGradientPosition,\n findGradientSurface,\n isShellGradientActive,\n readShellGradientPosition,\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 `on-gradient-background` to opt in/out explicitly.\n */\n @Prop({ attribute: 'on-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) return style;\n\n const surface = findGradientSurface(this.el);\n if (!surface) return style;\n\n style[BADGE_GRADIENT_POSITION_VAR] = badgeGradientPosition(\n this.el,\n surface,\n readShellGradientPosition(surface),\n );\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":"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","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{p as t}from"./p-BvmooLHV.js";const n="ds-shell-bar-nav";const o="ds-shell-nav-vt-style";function e(){if(typeof document==="undefined")return;if(document.getElementById(o))return;const t=document.createElement("style");t.id=o;t.textContent=["::view-transition-old(root),::view-transition-new(root){animation:none;mix-blend-mode:normal}",`::view-transition-old(${n}),::view-transition-new(${n}){animation:none;mix-blend-mode:normal}`,"::view-transition-new(root){clip-path:circle(0px at var(--vt-x,50%) var(--vt-y,50%))}",`::view-transition-new(${n}){clip-path:circle(0px at var(--vt-x,50%) var(--vt-y,50%))}`].join("\n");document.head.appendChild(t)}function i(t){const n=t??document.querySelector(".panel-nav__footer-btn");const o=n?.getBoundingClientRect();const e=o?Math.round(o.left+o.width/2):Math.round(window.innerWidth/2);const i=o?Math.round(o.top+o.height/2):Math.round(window.innerHeight/2);const a=Math.ceil(Math.hypot(Math.max(e,window.innerWidth-e),Math.max(i,window.innerHeight-i)));return{x:e,y:i,maxRadius:a}}function a(t){document.documentElement.style.setProperty("--vt-x",`${t.x}px`);document.documentElement.style.setProperty("--vt-y",`${t.y}px`)}function s(o,e){const i=getComputedStyle(document.documentElement).getPropertyValue("--effect-animation-duration-long-1").trim();const a=t(i,750);const s={clipPath:[`circle(0px at ${o.x}px ${o.y}px)`,`circle(${o.maxRadius}px at ${o.x}px ${o.y}px)`]};const c={duration:a,easing:"ease-in-out",fill:"forwards"};document.documentElement.animate(s,{...c,pseudoElement:"::view-transition-new(root)"});document.documentElement.animate(s,{...c,pseudoElement:`::view-transition-new(${n})`})}export{n as S,s as a,e,i as r,a as s};
2
- //# sourceMappingURL=p-DfL2MOso.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["SHELL_BAR_NAV_VT_NAME","VT_STYLE_ID","ensureShellNavVtStyle","document","getElementById","style","createElement","id","textContent","join","head","appendChild","resolveShellNavRevealOrigin","originEl","btn","querySelector","rect","getBoundingClientRect","x","Math","round","left","width","window","innerWidth","y","top","height","innerHeight","maxRadius","ceil","hypot","max","setShellNavRevealOriginVars","origin","documentElement","setProperty","animateShellNavRadialReveal","durationMs","durToken","getComputedStyle","getPropertyValue","trim","duration","parseCssTimeMs","keyframes","clipPath","options","easing","fill","animate","pseudoElement"],"sources":["src/wc/nav/shell-view-transition.ts"],"sourcesContent":["import { parseCssTimeMs } from '../utils/resolve-css-time-ms';\n\n/** `view-transition-name` on `ds-bar-nav` — pairs with root reveal in shell apps. */\nexport const SHELL_BAR_NAV_VT_NAME = 'ds-shell-bar-nav';\n\nexport { parseCssTimeMs };\n\nconst VT_STYLE_ID = 'ds-shell-nav-vt-style';\n\n/** Suppress default cross-fade and pin new snapshots to a 0px circle for WAAPI reveal. */\nexport function ensureShellNavVtStyle(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById(VT_STYLE_ID)) return;\n\n const style = document.createElement('style');\n style.id = VT_STYLE_ID;\n style.textContent = [\n '::view-transition-old(root),::view-transition-new(root){animation:none;mix-blend-mode:normal}',\n `::view-transition-old(${SHELL_BAR_NAV_VT_NAME}),::view-transition-new(${SHELL_BAR_NAV_VT_NAME}){animation:none;mix-blend-mode:normal}`,\n '::view-transition-new(root){clip-path:circle(0px at var(--vt-x,50%) var(--vt-y,50%))}',\n `::view-transition-new(${SHELL_BAR_NAV_VT_NAME}){clip-path:circle(0px at var(--vt-x,50%) var(--vt-y,50%))}`,\n ].join('\\n');\n document.head.appendChild(style);\n}\n\nexport interface ShellNavRevealOrigin {\n x: number;\n y: number;\n maxRadius: number;\n}\n\n/** Origin for the radial reveal — defaults to panel-nav footer gear, then viewport center. */\nexport function resolveShellNavRevealOrigin(originEl?: HTMLElement | null): ShellNavRevealOrigin {\n const btn =\n originEl ??\n document.querySelector<HTMLElement>('.panel-nav__footer-btn');\n const rect = btn?.getBoundingClientRect();\n const x = rect ? Math.round(rect.left + rect.width / 2) : Math.round(window.innerWidth / 2);\n const y = rect ? Math.round(rect.top + rect.height / 2) : Math.round(window.innerHeight / 2);\n const maxRadius = Math.ceil(\n Math.hypot(Math.max(x, window.innerWidth - x), Math.max(y, window.innerHeight - y)),\n );\n return { x, y, maxRadius };\n}\n\nexport function setShellNavRevealOriginVars(origin: ShellNavRevealOrigin): void {\n document.documentElement.style.setProperty('--vt-x', `${origin.x}px`);\n document.documentElement.style.setProperty('--vt-y', `${origin.y}px`);\n}\n\n/** Animate root + bar-nav snapshots with the same radial clip-path reveal. */\nexport function animateShellNavRadialReveal(\n origin: ShellNavRevealOrigin,\n durationMs?: number,\n): void {\n const durToken = getComputedStyle(document.documentElement)\n .getPropertyValue('--effect-animation-duration-long-1')\n .trim();\n const duration = durationMs ?? parseCssTimeMs(durToken, 750);\n const keyframes = {\n clipPath: [\n `circle(0px at ${origin.x}px ${origin.y}px)`,\n `circle(${origin.maxRadius}px at ${origin.x}px ${origin.y}px)`,\n ],\n };\n const options = {\n duration,\n easing: 'ease-in-out',\n fill: 'forwards' as const,\n };\n\n document.documentElement.animate(keyframes, {\n ...options,\n pseudoElement: '::view-transition-new(root)',\n });\n document.documentElement.animate(keyframes, {\n ...options,\n pseudoElement: `::view-transition-new(${SHELL_BAR_NAV_VT_NAME})`,\n });\n}\n\n/** Run radial reveal when a view transition's `ready` promise settles (app/router driver). */\nexport function runShellNavStyleRevealOnReady(\n transition: { ready: Promise<void> },\n originEl?: HTMLElement | null,\n): void {\n ensureShellNavVtStyle();\n const origin = resolveShellNavRevealOrigin(originEl);\n setShellNavRevealOriginVars(origin);\n\n transition.ready\n .then(() => animateShellNavRadialReveal(origin))\n .catch(() => {\n /* transition skipped or superseded */\n });\n}\n"],"mappings":"oCAGO,MAAMA,EAAwB,mBAIrC,MAAMC,EAAc,wB,SAGJC,IACd,UAAWC,WAAa,YAAa,OACrC,GAAIA,SAASC,eAAeH,GAAc,OAE1C,MAAMI,EAAQF,SAASG,cAAc,SACrCD,EAAME,GAAKN,EACXI,EAAMG,YAAc,CAClB,gGACA,yBAAyBR,4BAAgDA,2CACzE,wFACA,yBAAyBA,gEACzBS,KAAK,MACPN,SAASO,KAAKC,YAAYN,EAC5B,CASM,SAAUO,EAA4BC,GAC1C,MAAMC,EACJD,GACAV,SAASY,cAA2B,0BACtC,MAAMC,EAAOF,GAAKG,wBAClB,MAAMC,EAAIF,EAAOG,KAAKC,MAAMJ,EAAKK,KAAOL,EAAKM,MAAQ,GAAKH,KAAKC,MAAMG,OAAOC,WAAa,GACzF,MAAMC,EAAIT,EAAOG,KAAKC,MAAMJ,EAAKU,IAAMV,EAAKW,OAAS,GAAKR,KAAKC,MAAMG,OAAOK,YAAc,GAC1F,MAAMC,EAAYV,KAAKW,KACrBX,KAAKY,MAAMZ,KAAKa,IAAId,EAAGK,OAAOC,WAAaN,GAAIC,KAAKa,IAAIP,EAAGF,OAAOK,YAAcH,KAElF,MAAO,CAAEP,IAAGO,IAAGI,YACjB,CAEM,SAAUI,EAA4BC,GAC1C/B,SAASgC,gBAAgB9B,MAAM+B,YAAY,SAAU,GAAGF,EAAOhB,OAC/Df,SAASgC,gBAAgB9B,MAAM+B,YAAY,SAAU,GAAGF,EAAOT,MACjE,CAGM,SAAUY,EACdH,EACAI,GAEA,MAAMC,EAAWC,iBAAiBrC,SAASgC,iBACxCM,iBAAiB,sCACjBC,OACH,MAAMC,EAAyBC,EAAeL,EAAU,KACxD,MAAMM,EAAY,CAChBC,SAAU,CACR,iBAAiBZ,EAAOhB,OAAOgB,EAAOT,OACtC,UAAUS,EAAOL,kBAAkBK,EAAOhB,OAAOgB,EAAOT,SAG5D,MAAMsB,EAAU,CACdJ,WACAK,OAAQ,cACRC,KAAM,YAGR9C,SAASgC,gBAAgBe,QAAQL,EAAW,IACvCE,EACHI,cAAe,gCAEjBhD,SAASgC,gBAAgBe,QAAQL,EAAW,IACvCE,EACHI,cAAe,yBAAyBnD,MAE5C,Q","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{p as e,H as s,h as a,a as i,t as r}from"./index.js";const d=()=>`.sc-ds-fade-h{--ds-fade-size:var(--dimension-size-600);--ds-fade-bg:var(--color-background-secondary);--ds-fade-offset:0;position:absolute;pointer-events:none;z-index:10;opacity:1;transform:translateZ(0);backface-visibility:hidden;transition:opacity var(--effect-motion-short-3)}.fade--hidden.sc-ds-fade-h{opacity:0}.fade--vertical-edge.sc-ds-fade-h{height:var(--ds-fade-size)}.fade--horizontal-edge.sc-ds-fade-h{width:var(--ds-fade-size)}@media (prefers-reduced-motion: reduce){.sc-ds-fade-h{transition:none}}.fade--top.sc-ds-fade-h{top:var(--ds-fade-offset);left:0;right:0;background:linear-gradient(to bottom, var(--ds-fade-bg) 0%, var(--ds-fade-bg) 50%, transparent 100%)}.fade--bottom.sc-ds-fade-h{bottom:var(--ds-fade-offset);left:0;right:0;background:linear-gradient(to top, var(--ds-fade-bg) 0%, transparent 100%)}.fade--left.sc-ds-fade-h{top:0;bottom:0;left:var(--ds-fade-offset);background:linear-gradient(to right, var(--ds-fade-bg) 0%, transparent 100%)}.fade--right.sc-ds-fade-h{top:0;bottom:0;right:var(--ds-fade-offset);background:linear-gradient(to left, var(--ds-fade-bg) 0%, transparent 100%)}`;const t={"size-000":"var(--dimension-size-000)","size-050":"var(--dimension-size-050)","size-075":"var(--dimension-size-075)","size-100":"var(--dimension-size-100)","size-150":"var(--dimension-size-150)","size-200":"var(--dimension-size-200)","size-250":"var(--dimension-size-250)","size-300":"var(--dimension-size-300)","size-400":"var(--dimension-size-400)","size-500":"var(--dimension-size-500)","size-600":"var(--dimension-size-600)","size-800":"var(--dimension-size-800)"};const o={default:"var(--color-background-secondary)",primary:"var(--color-background-primary)",secondary:"var(--color-background-secondary)",navigation:"var(--color-navigation-background)",media:"var(--color-media-background)","always-dark":"var(--color-always-dark-background)",inverted:"var(--color-inverted-background)"};const n=e(class e extends s{constructor(e){super();if(e!==false){this.__registerHost()}this.side="bottom";this.size="size-600";this.surface="default";this.background="var(--color-background-secondary)";this.visible=true}resolveSize(){if(this.height)return this.height;return Object.prototype.hasOwnProperty.call(t,this.size)?t[this.size]:this.size}resolveBackground(){if(this.background!=="var(--color-background-secondary)")return this.background;return o[this.surface]}render(){const e=this.side==="top"||this.side==="bottom";return a(i,{key:"c529a9d0666b50ac14ab2091b50e296164e93202","aria-hidden":"true",class:{fade:true,"fade--hidden":!this.visible,"fade--vertical-edge":e,"fade--horizontal-edge":!e,[`fade--${this.side}`]:true},style:{"--ds-fade-size":this.resolveSize(),"--ds-fade-bg":this.resolveBackground()}})}static get style(){return d()}},[2,"ds-fade",{side:[1],size:[1],height:[1],surface:[1],background:[1],visible:[4]}]);function f(){if(typeof customElements==="undefined"){return}const e=["ds-fade"];e.forEach((e=>{switch(e){case"ds-fade":if(!customElements.get(r(e))){customElements.define(r(e),n)}break}}))}f();export{n as F,f as d};
2
- //# sourceMappingURL=p-vW9EMP8s.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["fadeCss","SIZE_VALUE","SURFACE_BACKGROUND","default","primary","secondary","navigation","media","inverted","Fade","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","side","size","surface","background","visible","resolveSize","height","Object","prototype","hasOwnProperty","call","resolveBackground","render","isVerticalEdge","h","Host","key","class","fade","style"],"sources":["src/wc/components/Fade/Fade.css?tag=ds-fade&encapsulation=scoped","src/wc/components/Fade/Fade.tsx"],"sourcesContent":[":host {\n --ds-fade-size: var(--dimension-size-600);\n --ds-fade-bg: var(--color-background-secondary);\n --ds-fade-offset: 0;\n\n position: absolute;\n pointer-events: none;\n z-index: 10;\n opacity: 1;\n transform: translateZ(0);\n backface-visibility: hidden;\n transition: opacity var(--effect-motion-short-3);\n}\n\n:host(.fade--hidden) {\n opacity: 0;\n}\n\n:host(.fade--vertical-edge) {\n height: var(--ds-fade-size);\n}\n\n:host(.fade--horizontal-edge) {\n width: var(--ds-fade-size);\n}\n\n@media (prefers-reduced-motion: reduce) {\n :host { transition: none; }\n}\n\n:host(.fade--top) {\n top: var(--ds-fade-offset); left: 0; right: 0;\n background: linear-gradient(to bottom, var(--ds-fade-bg) 0%, var(--ds-fade-bg) 50%, transparent 100%);\n}\n\n:host(.fade--bottom) {\n bottom: var(--ds-fade-offset); left: 0; right: 0;\n background: linear-gradient(to top, var(--ds-fade-bg) 0%, transparent 100%);\n}\n\n:host(.fade--left) {\n top: 0; bottom: 0; left: var(--ds-fade-offset);\n background: linear-gradient(to right, var(--ds-fade-bg) 0%, transparent 100%);\n}\n\n:host(.fade--right) {\n top: 0; bottom: 0; right: var(--ds-fade-offset);\n background: linear-gradient(to left, var(--ds-fade-bg) 0%, transparent 100%);\n}\n","import { Component, Prop, h, Host } from '@stencil/core';\n\nexport type FadeSide = 'top' | 'bottom' | 'left' | 'right';\nexport type FadeSurface =\n | 'default'\n | 'primary'\n | 'secondary'\n | 'navigation'\n | 'media'\n | 'always-dark'\n | 'inverted';\nexport type FadeSizeToken =\n | 'size-000'\n | 'size-050'\n | 'size-075'\n | 'size-100'\n | 'size-150'\n | 'size-200'\n | 'size-250'\n | 'size-300'\n | 'size-400'\n | 'size-500'\n | 'size-600'\n | 'size-800';\nexport type FadeSize = FadeSizeToken | (string & {});\n\nconst SIZE_VALUE: Record<FadeSizeToken, string> = {\n 'size-000': 'var(--dimension-size-000)',\n 'size-050': 'var(--dimension-size-050)',\n 'size-075': 'var(--dimension-size-075)',\n 'size-100': 'var(--dimension-size-100)',\n 'size-150': 'var(--dimension-size-150)',\n 'size-200': 'var(--dimension-size-200)',\n 'size-250': 'var(--dimension-size-250)',\n 'size-300': 'var(--dimension-size-300)',\n 'size-400': 'var(--dimension-size-400)',\n 'size-500': 'var(--dimension-size-500)',\n 'size-600': 'var(--dimension-size-600)',\n 'size-800': 'var(--dimension-size-800)',\n};\n\nconst SURFACE_BACKGROUND: Record<FadeSurface, string> = {\n default: 'var(--color-background-secondary)',\n primary: 'var(--color-background-primary)',\n secondary: 'var(--color-background-secondary)',\n navigation: 'var(--color-navigation-background)',\n media: 'var(--color-media-background)',\n 'always-dark': 'var(--color-always-dark-background)',\n inverted: 'var(--color-inverted-background)',\n};\n\n@Component({\n tag: 'ds-fade',\n styleUrl: 'Fade.css',\n scoped: true,\n})\nexport class Fade {\n /** Edge where the fade is anchored. */\n @Prop() side: FadeSide = 'bottom';\n\n /** Fade depth along the fade axis. Accepts dimension size token names or any CSS length. */\n @Prop() size: FadeSize = 'size-600';\n\n /**\n * Deprecated alias for size. Kept for existing consumers that pass a raw CSS length.\n * Prefer `size`.\n */\n @Prop() height: string | undefined;\n\n /** Surface context used to choose the fade target background token. */\n @Prop() surface: FadeSurface = 'default';\n\n /** Direct background override for contexts that already expose a resolved surface var. */\n @Prop() background: string = 'var(--color-background-secondary)';\n\n /** Controls visibility without removing the element from layout/positioning. */\n @Prop() visible: boolean = true;\n\n private resolveSize(): string {\n if (this.height) return this.height;\n\n return Object.prototype.hasOwnProperty.call(SIZE_VALUE, this.size)\n ? SIZE_VALUE[this.size as FadeSizeToken]\n : this.size;\n }\n\n private resolveBackground(): string {\n if (this.background !== 'var(--color-background-secondary)') return this.background;\n return SURFACE_BACKGROUND[this.surface];\n }\n\n render() {\n const isVerticalEdge = this.side === 'top' || this.side === 'bottom';\n\n return (\n <Host\n aria-hidden=\"true\"\n class={{\n fade: true,\n 'fade--hidden': !this.visible,\n 'fade--vertical-edge': isVerticalEdge,\n 'fade--horizontal-edge': !isVerticalEdge,\n [`fade--${this.side}`]: true,\n }}\n style={{\n '--ds-fade-size': this.resolveSize(),\n '--ds-fade-bg': this.resolveBackground(),\n } as Record<string, string>}\n />\n );\n }\n}\n"],"mappings":"2DAAA,MAAMA,EAAU,IAAM,0lCC0BtB,MAAMC,EAA4C,CAChD,WAAY,4BACZ,WAAY,4BACZ,WAAY,4BACZ,WAAY,4BACZ,WAAY,4BACZ,WAAY,4BACZ,WAAY,4BACZ,WAAY,4BACZ,WAAY,4BACZ,WAAY,4BACZ,WAAY,4BACZ,WAAY,6BAGd,MAAMC,EAAkD,CACtDC,QAAS,oCACTC,QAAS,kCACTC,UAAW,oCACXC,WAAY,qCACZC,MAAO,gCACP,cAAe,sCACfC,SAAU,oC,MAQCC,EAAIC,EAAA,MAAAD,UAAAE,EALjB,WAAAC,CAAAC,G,4CAOUC,KAAAC,KAAiB,SAGjBD,KAAAE,KAAiB,WASjBF,KAAAG,QAAuB,UAGvBH,KAAAI,WAAqB,oCAGrBJ,KAAAK,QAAmB,IAmC5B,CAjCS,WAAAC,GACN,GAAIN,KAAKO,OAAQ,OAAOP,KAAKO,OAE7B,OAAOC,OAAOC,UAAUC,eAAeC,KAAKxB,EAAYa,KAAKE,MACzDf,EAAWa,KAAKE,MAChBF,KAAKE,I,CAGH,iBAAAU,GACN,GAAIZ,KAAKI,aAAe,oCAAqC,OAAOJ,KAAKI,WACzE,OAAOhB,EAAmBY,KAAKG,Q,CAGjC,MAAAU,GACE,MAAMC,EAAiBd,KAAKC,OAAS,OAASD,KAAKC,OAAS,SAE5D,OACEc,EAACC,EAAI,CAAAC,IAAA,yDACS,OACZC,MAAO,CACLC,KAAM,KACN,gBAAiBnB,KAAKK,QACtB,sBAAuBS,EACvB,yBAA0BA,EAC1B,CAAC,SAASd,KAAKC,QAAS,MAE1BmB,MAAO,CACL,iBAAkBpB,KAAKM,cACvB,eAAgBN,KAAKY,sB","ignoreList":[]}