@ds-mo/ui 1.8.1 → 1.9.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 (79) 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-banner.js +1 -1
  6. package/dist/components/ds-bar-nav-action.js +1 -1
  7. package/dist/components/ds-bar-nav.js +1 -1
  8. package/dist/components/ds-bar-nav.js.map +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-menu.js +1 -1
  12. package/dist/components/ds-modal.js +1 -1
  13. package/dist/components/ds-panel-nav.js +1 -1
  14. package/dist/components/ds-panel-nav.js.map +1 -1
  15. package/dist/components/ds-panel-tools.js +1 -1
  16. package/dist/components/ds-panel-tools.js.map +1 -1
  17. package/dist/components/ds-select.js +1 -1
  18. package/dist/components/ds-slider.js +1 -1
  19. package/dist/components/ds-slider.js.map +1 -1
  20. package/dist/components/ds-tab-group-nav.js +1 -1
  21. package/dist/components/ds-tab-group.js +1 -1
  22. package/dist/components/ds-toast-provider.js +1 -1
  23. package/dist/components/ds-toggle.js +1 -1
  24. package/dist/components/ds-tooltip.js +1 -1
  25. package/dist/components/{p-BvmooLHV.js → p-C1cBr-Ri.js} +2 -2
  26. package/dist/components/{p-DrvpsLK6.js → p-CCZFMcLe.js} +2 -2
  27. package/dist/components/p-CiEc8Nwx.js +2 -0
  28. package/dist/components/p-CiEc8Nwx.js.map +1 -0
  29. package/dist/components/{p-C4VSrrAB.js → p-CuuuDjJJ.js} +2 -2
  30. package/dist/components/p-Dl1GvZQ2.js +2 -0
  31. package/dist/components/p-Dl1GvZQ2.js.map +1 -0
  32. package/dist/components/{p-DZDXwEMg.js → p-DlsexsFg.js} +2 -2
  33. package/dist/components/p-g6MCxfm4.js +2 -0
  34. package/dist/components/p-g6MCxfm4.js.map +1 -0
  35. package/dist/types/components/AppShell/AppShell.d.ts +7 -5
  36. package/dist/types/components/BarNav/BarNav.d.ts +2 -4
  37. package/dist/types/components/PanelNav/PanelNav.d.ts +4 -13
  38. package/dist/types/components/PanelNav/index.d.ts +1 -1
  39. package/dist/types/components/PanelNav/panel-nav-utils.d.ts +0 -9
  40. package/dist/types/components/PanelTools/PanelTools.d.ts +29 -11
  41. package/dist/types/components/PanelTools/index.d.ts +2 -2
  42. package/dist/types/components/PanelTools/panel-tools-types.d.ts +15 -2
  43. package/dist/types/components/PanelTools/panel-tools-utils.d.ts +4 -0
  44. package/dist/types/components.d.ts +67 -21
  45. package/dist/types/nav/badge-gradient-ring.d.ts +1 -1
  46. package/dist/types/nav/index.d.ts +1 -1
  47. package/dist/types/nav/nav-chrome.d.ts +4 -8
  48. package/dist/types/nav/shell-gradient.d.ts +6 -3
  49. package/package.json +1 -1
  50. package/src/angular/proxies.ts +12 -3
  51. package/src/react/ds-panel-tools.ts +4 -3
  52. package/src/wc/components/AppShell/AppShell.tsx +54 -38
  53. package/src/wc/components/Badge/Badge.tsx +3 -12
  54. package/src/wc/components/BarNav/BarNav.tsx +6 -18
  55. package/src/wc/components/PanelNav/PanelNav.tsx +23 -103
  56. package/src/wc/components/PanelNav/index.ts +0 -1
  57. package/src/wc/components/PanelNav/panel-nav-utils.ts +0 -13
  58. package/src/wc/components/PanelTools/PanelTools.tsx +162 -80
  59. package/src/wc/components/PanelTools/index.ts +6 -2
  60. package/src/wc/components/PanelTools/panel-tools-types.ts +18 -3
  61. package/src/wc/components/PanelTools/panel-tools-utils.ts +31 -0
  62. package/src/wc/components.d.ts +67 -21
  63. package/src/wc/nav/badge-gradient-ring.ts +3 -8
  64. package/src/wc/nav/index.ts +3 -1
  65. package/src/wc/nav/nav-chrome.ts +19 -17
  66. package/src/wc/nav/shell-gradient.ts +9 -4
  67. package/src/wc/nav/shell-view-transition.ts +13 -6
  68. package/dist/components/p-B8VZmH43.js +0 -2
  69. package/dist/components/p-B8VZmH43.js.map +0 -1
  70. package/dist/components/p-BucV1U6A.js +0 -2
  71. package/dist/components/p-BucV1U6A.js.map +0 -1
  72. package/dist/components/p-CX7-_qOW.js +0 -2
  73. package/dist/components/p-CX7-_qOW.js.map +0 -1
  74. package/dist/components/p-TtnqbcnR.js +0 -2
  75. package/dist/components/p-TtnqbcnR.js.map +0 -1
  76. /package/dist/components/{p-BvmooLHV.js.map → p-C1cBr-Ri.js.map} +0 -0
  77. /package/dist/components/{p-DrvpsLK6.js.map → p-CCZFMcLe.js.map} +0 -0
  78. /package/dist/components/{p-C4VSrrAB.js.map → p-CuuuDjJJ.js.map} +0 -0
  79. /package/dist/components/{p-DZDXwEMg.js.map → p-DlsexsFg.js.map} +0 -0
@@ -1,16 +1,14 @@
1
- /** Visual chrome family for primary/secondary navigation surfaces. */
2
- export type NavChromeStyle = 'navigation' | 'default';
1
+ /** Nav chrome style slot — dashboard vs settings. Colors unified for now; texture hooks use the class. */
2
+ export type NavChromeStyle = 'dashboard' | 'settings';
3
3
 
4
- /** `document.documentElement` attribute for pre-bootstrap style hints (SPA hard reload). */
4
+ /** Document hint for first paint before framework props land. */
5
5
  export const NAV_STYLE_HINT_ATTR = 'data-nav-style';
6
6
 
7
- /** Parse `nav-style` from a host or document hint attribute value. */
8
7
  export function readNavStyleAttr(attr: string | null): NavChromeStyle | undefined {
9
- if (attr === 'navigation' || attr === 'default') return attr;
8
+ if (attr === 'dashboard' || attr === 'settings') return attr;
10
9
  return undefined;
11
10
  }
12
11
 
13
- /** Set a document-level style hint before nav custom elements upgrade (hard reload). */
14
12
  export function setNavStyleHint(style: NavChromeStyle): void {
15
13
  if (typeof document === 'undefined') return;
16
14
  document.documentElement.setAttribute(NAV_STYLE_HINT_ATTR, style);
@@ -21,22 +19,26 @@ export function clearNavStyleHint(): void {
21
19
  document.documentElement.removeAttribute(NAV_STYLE_HINT_ATTR);
22
20
  }
23
21
 
24
- /** Resolve initial nav chrome style — host attr, then document hint, then prop default. */
25
22
  export function resolveNavChromeStyle(
26
23
  styleProp: NavChromeStyle,
27
- styleAttr: string | null,
28
- documentStyleAttr: string | null = typeof document !== 'undefined'
29
- ? document.documentElement.getAttribute(NAV_STYLE_HINT_ATTR)
30
- : null,
24
+ hostAttr: string | null,
25
+ docHint?: string | null,
31
26
  ): NavChromeStyle {
32
- return (
33
- readNavStyleAttr(styleAttr) ??
34
- readNavStyleAttr(documentStyleAttr) ??
35
- styleProp
36
- );
27
+ const fromHost = readNavStyleAttr(hostAttr);
28
+ if (fromHost) return fromHost;
29
+
30
+ const hint =
31
+ docHint !== undefined
32
+ ? docHint
33
+ : typeof document !== 'undefined'
34
+ ? document.documentElement.getAttribute(NAV_STYLE_HINT_ATTR)
35
+ : null;
36
+ const fromHint = readNavStyleAttr(hint);
37
+ if (fromHint) return fromHint;
38
+
39
+ return styleProp;
37
40
  }
38
41
 
39
- /** True when internal rendered surface lags the host `style` prop. */
40
42
  export function shouldResyncNavChromeStyle(
41
43
  renderedStyle: NavChromeStyle,
42
44
  style: NavChromeStyle,
@@ -1,11 +1,11 @@
1
- import type { NavChromeStyle } from './nav-chrome';
2
-
3
1
  /** CSS var names consumed by `ds-panel-nav` / `ds-bar-nav` inside `ds-app-shell`. */
4
2
  export const SHELL_GRADIENT_IMAGE_VAR = '--ds-shell-gradient-image';
5
3
  export const SHELL_GRADIENT_SIZE_VAR = '--ds-shell-gradient-size';
6
4
  export const SHELL_GRADIENT_POSITION_PANEL_VAR = '--ds-shell-gradient-position-panel';
7
5
  export const SHELL_GRADIENT_POSITION_BAR_VAR = '--ds-shell-gradient-position-bar';
8
6
  export const SHELL_GRADIENT_OPACITY_VAR = '--ds-shell-gradient-opacity';
7
+ /** Per chrome-surface background-position — offsets wash + grid to shell row origin. */
8
+ export const SHELL_CHROME_SURFACE_POSITION_VAR = '--ds-shell-chrome-surface-position';
9
9
 
10
10
  /** Layer opacity for the nav gradient wash. */
11
11
  export const SHELL_GRADIENT_OPACITY = '0.1';
@@ -13,7 +13,7 @@ export const SHELL_GRADIENT_OPACITY = '0.1';
13
13
  const GRADIENT_GEOMETRY = '100% 100% at 0% 0%';
14
14
 
15
15
  /**
16
- * Unified shell radial — same wash for all nav chrome styles.
16
+ * Shell radial wash — same for panel and bar nav.
17
17
  * Tokens follow `data-theme` (light/dark blue intent).
18
18
  */
19
19
  export function buildShellRadialGradient(): string {
@@ -21,7 +21,7 @@ export function buildShellRadialGradient(): string {
21
21
  }
22
22
 
23
23
  /** Built-in radial image (optional `gradientSrc` on shell overrides). */
24
- export function shellGradientImageForStyle(_style: NavChromeStyle): string {
24
+ export function shellGradientImage(): string {
25
25
  return buildShellRadialGradient();
26
26
  }
27
27
 
@@ -42,3 +42,8 @@ export function shellGradientPositionPanel(): string {
42
42
  export function shellGradientPositionBar(panelWidth: number): string {
43
43
  return `${-Math.round(panelWidth)}px 0`;
44
44
  }
45
+
46
+ /** Phase-lock a chrome rect to the shell row coordinate system (wash + grid). */
47
+ export function shellChromeSurfacePosition(leftPx: number, topPx: number): string {
48
+ return `${-Math.round(leftPx)}px ${-Math.round(topPx)}px`;
49
+ }
@@ -10,7 +10,6 @@ const VT_STYLE_ID = 'ds-shell-nav-vt-style';
10
10
  /** TokoMo tokens for the dashboard ↔ settings radial reveal (WAAPI). */
11
11
  export const SHELL_NAV_REVEAL_DURATION_VAR = '--effect-animation-duration-medium-3';
12
12
  export const SHELL_NAV_REVEAL_EASING_VAR = '--effect-animation-easing-ease-in-out';
13
-
14
13
  const SHELL_NAV_REVEAL_DURATION_FALLBACK_MS = 500;
15
14
  const SHELL_NAV_REVEAL_EASING_FALLBACK = 'ease-in-out';
16
15
 
@@ -23,16 +22,24 @@ function readCssCustomProperty(name: string, fallback: string): string {
23
22
  /** Suppress default cross-fade and pin new snapshots to a 0px circle for WAAPI reveal. */
24
23
  export function ensureShellNavVtStyle(): void {
25
24
  if (typeof document === 'undefined') return;
26
- if (document.getElementById(VT_STYLE_ID)) return;
27
25
 
28
- const style = document.createElement('style');
29
- style.id = VT_STYLE_ID;
30
- style.textContent = [
26
+ const content = [
31
27
  '::view-transition-old(root),::view-transition-new(root){animation:none;mix-blend-mode:normal}',
32
28
  `::view-transition-old(${SHELL_BAR_NAV_VT_NAME}),::view-transition-new(${SHELL_BAR_NAV_VT_NAME}){animation:none;mix-blend-mode:normal}`,
29
+ `::view-transition-old(${SHELL_BAR_NAV_VT_NAME}){z-index:1}`,
30
+ `::view-transition-new(${SHELL_BAR_NAV_VT_NAME}){z-index:2;clip-path:circle(0px at var(--vt-x,50%) var(--vt-y,50%))}`,
33
31
  '::view-transition-new(root){clip-path:circle(0px at var(--vt-x,50%) var(--vt-y,50%))}',
34
- `::view-transition-new(${SHELL_BAR_NAV_VT_NAME}){clip-path:circle(0px at var(--vt-x,50%) var(--vt-y,50%))}`,
35
32
  ].join('\n');
33
+
34
+ const existing = document.getElementById(VT_STYLE_ID) as HTMLStyleElement | null;
35
+ if (existing) {
36
+ if (existing.textContent !== content) existing.textContent = content;
37
+ return;
38
+ }
39
+
40
+ const style = document.createElement('style');
41
+ style.id = VT_STYLE_ID;
42
+ style.textContent = content;
36
43
  document.head.appendChild(style);
37
44
  }
38
45
 
@@ -1,2 +0,0 @@
1
- import{p as n}from"./p-BvmooLHV.js";const t="ds-shell-bar-nav";const o="ds-shell-nav-vt-style";const e="--effect-animation-duration-medium-3";const i="--effect-animation-easing-ease-in-out";const a=500;const s="ease-in-out";function c(n,t){if(typeof document==="undefined")return t;const o=getComputedStyle(document.documentElement).getPropertyValue(n).trim();return o||t}function r(){if(typeof document==="undefined")return;if(document.getElementById(o))return;const n=document.createElement("style");n.id=o;n.textContent=["::view-transition-old(root),::view-transition-new(root){animation:none;mix-blend-mode:normal}",`::view-transition-old(${t}),::view-transition-new(${t}){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(${t}){clip-path:circle(0px at var(--vt-x,50%) var(--vt-y,50%))}`].join("\n");document.head.appendChild(n)}function d(n){const t=n??document.querySelector(".panel-nav__footer-btn");const o=t?.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 u(n){document.documentElement.style.setProperty("--vt-x",`${n.x}px`);document.documentElement.style.setProperty("--vt-y",`${n.y}px`)}function m(o,r){const d=n(c(e,"400ms"),a);const u=c(i,s);const m={clipPath:[`circle(0px at ${o.x}px ${o.y}px)`,`circle(${o.maxRadius}px at ${o.x}px ${o.y}px)`]};const l={duration:d,easing:u,fill:"forwards"};document.documentElement.animate(m,{...l,pseudoElement:"::view-transition-new(root)"});document.documentElement.animate(m,{...l,pseudoElement:`::view-transition-new(${t})`})}export{t as S,m as a,r as e,d as r,u as s};
2
- //# sourceMappingURL=p-B8VZmH43.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["SHELL_BAR_NAV_VT_NAME","VT_STYLE_ID","SHELL_NAV_REVEAL_DURATION_VAR","SHELL_NAV_REVEAL_EASING_VAR","SHELL_NAV_REVEAL_DURATION_FALLBACK_MS","SHELL_NAV_REVEAL_EASING_FALLBACK","readCssCustomProperty","name","fallback","document","value","getComputedStyle","documentElement","getPropertyValue","trim","ensureShellNavVtStyle","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","setProperty","animateShellNavRadialReveal","durationMs","duration","parseCssTimeMs","easing","keyframes","clipPath","options","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/** TokoMo tokens for the dashboard ↔ settings radial reveal (WAAPI). */\nexport const SHELL_NAV_REVEAL_DURATION_VAR = '--effect-animation-duration-medium-3';\nexport const SHELL_NAV_REVEAL_EASING_VAR = '--effect-animation-easing-ease-in-out';\n\nconst SHELL_NAV_REVEAL_DURATION_FALLBACK_MS = 500;\nconst SHELL_NAV_REVEAL_EASING_FALLBACK = 'ease-in-out';\n\nfunction readCssCustomProperty(name: string, fallback: string): string {\n if (typeof document === 'undefined') return fallback;\n const value = getComputedStyle(document.documentElement).getPropertyValue(name).trim();\n return value || fallback;\n}\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 duration =\n durationMs ??\n parseCssTimeMs(\n readCssCustomProperty(SHELL_NAV_REVEAL_DURATION_VAR, '400ms'),\n SHELL_NAV_REVEAL_DURATION_FALLBACK_MS,\n );\n const easing = readCssCustomProperty(\n SHELL_NAV_REVEAL_EASING_VAR,\n SHELL_NAV_REVEAL_EASING_FALLBACK,\n );\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,\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,wBAGb,MAAMC,EAAgC,uCACtC,MAAMC,EAA8B,wCAE3C,MAAMC,EAAwC,IAC9C,MAAMC,EAAmC,cAEzC,SAASC,EAAsBC,EAAcC,GAC3C,UAAWC,WAAa,YAAa,OAAOD,EAC5C,MAAME,EAAQC,iBAAiBF,SAASG,iBAAiBC,iBAAiBN,GAAMO,OAChF,OAAOJ,GAASF,CAClB,C,SAGgBO,IACd,UAAWN,WAAa,YAAa,OACrC,GAAIA,SAASO,eAAef,GAAc,OAE1C,MAAMgB,EAAQR,SAASS,cAAc,SACrCD,EAAME,GAAKlB,EACXgB,EAAMG,YAAc,CAClB,gGACA,yBAAyBpB,4BAAgDA,2CACzE,wFACA,yBAAyBA,gEACzBqB,KAAK,MACPZ,SAASa,KAAKC,YAAYN,EAC5B,CASM,SAAUO,EAA4BC,GAC1C,MAAMC,EACJD,GACAhB,SAASkB,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,GAC1CrC,SAASG,gBAAgBK,MAAM8B,YAAY,SAAU,GAAGD,EAAOhB,OAC/DrB,SAASG,gBAAgBK,MAAM8B,YAAY,SAAU,GAAGD,EAAOT,MACjE,CAGM,SAAUW,EACdF,EACAG,GAEA,MAAMC,EAEJC,EACE7C,EAAsBJ,EAA+B,SACrDE,GAEJ,MAAMgD,EAAS9C,EACbH,EACAE,GAEF,MAAMgD,EAAY,CAChBC,SAAU,CACR,iBAAiBR,EAAOhB,OAAOgB,EAAOT,OACtC,UAAUS,EAAOL,kBAAkBK,EAAOhB,OAAOgB,EAAOT,SAG5D,MAAMkB,EAAU,CACdL,WACAE,SACAI,KAAM,YAGR/C,SAASG,gBAAgB6C,QAAQJ,EAAW,IACvCE,EACHG,cAAe,gCAEjBjD,SAASG,gBAAgB6C,QAAQJ,EAAW,IACvCE,EACHG,cAAe,yBAAyB1D,MAE5C,Q","ignoreList":[]}
@@ -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 s="--ds-shell-gradient-position-bar";const r="--ds-shell-gradient-opacity";const o="0.1";const e="100% 100% at 0% 0%";function i(){return`radial-gradient(${e}, var(--color-background-transparent) 0%, var(--color-color-intent-blue-strong-background) 100%)`}function c(n){return i()}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{s as S,a,n as b,t as c,r as d,o as e,u as f,d as g,l as h,c as s};
2
- //# sourceMappingURL=p-BucV1U6A.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 = '100% 100% 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-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,qB,SAMVC,IACd,MAAO,mBAAmBD,mGAC5B,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 a,h as i,a as n,t as r}from"./index.js";import{i as s,f as d,b as t,B as o,r as g}from"./p-TtnqbcnR.js";const c=()=>`.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 b={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 l=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&&s(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)return a;const i=d(this.el);if(!i)return a;a[o]=t(this.el,i,g(i));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 s=this.background??b[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(s)},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 c()}},[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 h(){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),l)}break}}))}h();export{l as B,h as d};
2
- //# sourceMappingURL=p-CX7-_qOW.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","findGradientSurface","BADGE_GRADIENT_POSITION_VAR","badgeGradientPosition","readShellGradientPosition","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: 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":"2HAAA,MAAMA,EAAW,IAAM,8mECoBvB,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,UAU8BJ,KAAAK,mBAA8B,MAGpFL,KAAAM,WAAsB,MAMbN,KAAAO,sBAAwB,EAEjCP,KAAAQ,iBAA0C,KAC1CR,KAAAS,uBAA8C,IAkHvD,CAhHC,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,mBAAoB,OAAO0B,EAErC,MAAM3B,EAAU4B,EAAoBhC,KAAKiB,IACzC,IAAKb,EAAS,OAAO2B,EAErBA,EAAME,GAA+BC,EACnClC,KAAKiB,GACLb,EACA+B,EAA0B/B,IAE5B,OAAO2B,C,CAGT,MAAAK,GACE,MAAMC,EAAQrC,KAAKC,UAAY,MAE/B,IAAKoC,GAASrC,KAAKE,QAAU,EAAG,OAAOoC,EAACC,EAAI,CAACR,MAAO,CAAES,QAAS,UAE/D,MAAMA,EAAUxC,KAAKE,MAAQF,KAAKG,IAAM,IAAMsC,OAAOzC,KAAKE,OAC1D,MAAMwC,EAAY1C,KAAK2C,QAAUN,EAAQ,eAAiBI,OAAOzC,KAAKE,QACtE,MAAM4B,EAAO9B,KAAK4C,YAAczD,EAAaa,KAAKI,SAElD,OACEkC,EAACC,EAAI,CACHM,MAAO,CACLC,MAAO,KACP,kBAAmBT,EACnB,aAAcA,EACd,kBAAmBrC,KAAKM,WACxB,gCAAiCN,KAAKK,oBACvC,aACWqC,EACZX,MAAO/B,KAAK6B,cAAcC,IAE1BQ,EAAA,QACEO,MAAO,CACLE,YAAe,KACf,yBAA0BV,GAC3B,cACW,SAEVA,GAASG,G","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{S as n,a as t}from"./p-BucV1U6A.js";const o="--_badge-gradient-position";function s(n){const t=n.closest("ds-app-shell");return t?.hasAttribute("gradient")===true}function r(o){const s=o.closest("ds-bar-nav");if(s){const t=s.shadowRoot??s;const o=t.querySelector(".bar-nav");if(o){return{element:o,chromeHost:s,positionVar:n}}}const r=o.closest("ds-panel-nav");if(r){const n=r.shadowRoot??r;const o=n.querySelector(".panel-nav");if(o){return{element:o,chromeHost:r,positionVar:t}}}return null}function e(n){const t=n.trim();if(!t)return{x:0,y:0};const o=t.split(/\s+/);const s=c(o[0]??"0");const r=c(o[1]??"0");return{x:s,y:r}}function c(n){const t=n.match(/^(-?[\d.]+)px$/);if(t)return Number(t[1]);return 0}function a(n,t,o){const s=n.getBoundingClientRect();const r=t.element.getBoundingClientRect();const c=s.left+s.width/2-r.left;const a=s.top+s.height/2-r.top;const{x:i,y:u}=e(o);return`${Math.round(i-c)}px ${Math.round(u-a)}px`}function i(n){const t=getComputedStyle(n.chromeHost);return t.getPropertyValue(n.positionVar).trim()||"0 0"}export{o as B,a as b,r as f,s as i,i as r};
2
- //# sourceMappingURL=p-TtnqbcnR.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"],"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 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"],"mappings":"2CAMO,MAAMA,EAA8B,6BASrC,SAAUC,EAAsBC,GACpC,MAAMC,EAAQD,EAAKE,QAAQ,gBAC3B,OAAOD,GAAOE,aAAa,cAAgB,IAC7C,CAGM,SAAUC,EAAoBJ,GAClC,MAAMK,EAAUL,EAAKE,QAAQ,cAC7B,GAAIG,EAAS,CACX,MAAMC,EAAOD,EAAQE,YAAcF,EACnC,MAAMG,EAAUF,EAAKG,cAAc,YACnC,GAAID,EAAS,CACX,MAAO,CACLA,QAASA,EACTE,WAAYL,EACZM,YAAaC,E,EAKnB,MAAMC,EAAYb,EAAKE,QAAQ,gBAC/B,GAAIW,EAAW,CACb,MAAMP,EAAOO,EAAUN,YAAcM,EACrC,MAAML,EAAUF,EAAKG,cAAc,cACnC,GAAID,EAAS,CACX,MAAO,CACLA,QAASA,EACTE,WAAYG,EACZF,YAAaG,E,EAKnB,OAAO,IACT,CAQM,SAAUC,EAA2BC,GACzC,MAAMC,EAAUD,EAAME,OACtB,IAAKD,EAAS,MAAO,CAAEE,EAAG,EAAGC,EAAG,GAEhC,MAAMC,EAAQJ,EAAQK,MAAM,OAC5B,MAAMH,EAAII,EAAYF,EAAM,IAAM,KAClC,MAAMD,EAAIG,EAAYF,EAAM,IAAM,KAClC,MAAO,CAAEF,IAAGC,IACd,CAEA,SAASG,EAAYC,GACnB,MAAMC,EAAKD,EAAME,MAAM,kBACvB,GAAID,EAAI,OAAOE,OAAOF,EAAG,IACzB,OAAO,CACT,C,SAMgBG,EACdC,EACAC,EACAC,GAEA,MAAMC,EAAYH,EAAUI,wBAC5B,MAAMC,EAAcJ,EAAQtB,QAAQyB,wBACpC,MAAME,EAAUH,EAAUI,KAAOJ,EAAUK,MAAQ,EAAIH,EAAYE,KACnE,MAAME,EAAUN,EAAUO,IAAMP,EAAUQ,OAAS,EAAIN,EAAYK,IACnE,MAAMpB,EAAEA,EAACC,EAAEA,GAAML,EAA2BgB,GAE5C,MAAO,GAAGU,KAAKC,MAAMvB,EAAIgB,QAAcM,KAAKC,MAAMtB,EAAIkB,MACxD,CAGM,SAAUK,EAA0Bb,GACxC,MAAMc,EAASC,iBAAiBf,EAAQpB,YACxC,OAAOkC,EAAOE,iBAAiBhB,EAAQnB,aAAaO,QAAU,KAChE,Q","ignoreList":[]}