@ds-mo/ui 13.6.0 → 13.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.package-ready.json +1 -1
- package/dist/agent-patterns.json +2 -2
- package/dist/agent.json +109 -371
- package/dist/angular/ds-card-chart.d.ts +18 -0
- package/dist/angular/{ds-card-data-viz.js → ds-card-chart.js} +10 -10
- package/dist/angular/ds-chart.d.ts +19 -0
- package/dist/angular/{ds-chart-donut.js → ds-chart.js} +15 -15
- package/dist/angular/ds-tooltip-chart.d.ts +12 -0
- package/dist/angular/{ds-chart-line.js → ds-tooltip-chart.js} +12 -12
- package/dist/angular/index.d.ts +1 -1
- package/dist/angular/index.js +3 -5
- package/dist/angular/proxies.d.ts +3 -5
- package/dist/angular/proxies.js +3 -5
- package/dist/components/ds-agent-activity.js +1 -1
- package/dist/components/ds-agent-response.js +1 -1
- package/dist/components/ds-agent-source-list.js +1 -1
- package/dist/components/ds-agent-tool-call.js +1 -1
- package/dist/components/ds-attachment-list.js +1 -1
- package/dist/components/ds-badge.js +1 -1
- package/dist/components/ds-banner.js +1 -1
- package/dist/components/ds-banner.js.map +1 -1
- package/dist/components/ds-bar-nav.js +1 -1
- package/dist/components/ds-bar-title.js +1 -1
- package/dist/components/ds-bar-workflow.js +1 -1
- package/dist/components/ds-breadcrumb.js +1 -1
- package/dist/components/ds-button-filled.js +1 -1
- package/dist/components/ds-button-unfilled.js +1 -1
- package/dist/components/{ds-chart-line.d.ts → ds-card-chart.d.ts} +4 -4
- package/dist/components/ds-card-chart.js +2 -0
- package/dist/components/ds-card-chart.js.map +1 -0
- package/dist/components/ds-card-overview.js +1 -1
- package/dist/components/ds-card-setting.js +1 -1
- package/dist/components/ds-card-setting.js.map +1 -1
- package/dist/components/ds-chart-legend.js +1 -1
- package/dist/components/ds-chart-legend.js.map +1 -1
- package/dist/components/{ds-chart-bar.d.ts → ds-chart.d.ts} +4 -4
- package/dist/components/ds-chart.js +2 -0
- package/dist/components/ds-chart.js.map +1 -0
- package/dist/components/ds-checkbox.js +1 -1
- package/dist/components/ds-chip.js +1 -1
- package/dist/components/ds-code-block.js +1 -1
- package/dist/components/ds-conversation-list-item.js +1 -1
- package/dist/components/ds-conversation-list-section.js +1 -1
- package/dist/components/ds-conversation-list.js +1 -1
- package/dist/components/ds-divider.js +1 -1
- package/dist/components/ds-empty-state.js +1 -1
- package/dist/components/ds-field.js +1 -1
- package/dist/components/ds-input.js +1 -1
- package/dist/components/ds-markdown.js +1 -1
- package/dist/components/ds-menu.js +1 -1
- package/dist/components/ds-message-actions.js +1 -1
- package/dist/components/ds-message-bubble.js +1 -1
- package/dist/components/ds-message-composer.js +1 -1
- package/dist/components/ds-message-composer.js.map +1 -1
- package/dist/components/ds-message-scroller.js +1 -1
- package/dist/components/ds-message.js +1 -1
- package/dist/components/ds-mobile-bar-nav.js +1 -1
- package/dist/components/ds-mobile-header.js +1 -1
- package/dist/components/ds-mobile-section-switcher.js +1 -1
- package/dist/components/ds-mobile-sheet-nav.js +1 -1
- package/dist/components/ds-modal.js +1 -1
- package/dist/components/ds-modal.js.map +1 -1
- package/dist/components/ds-panel-nav.js +1 -1
- package/dist/components/ds-panel-sub-nav.js +1 -1
- package/dist/components/ds-panel-tool-header.js +1 -1
- package/dist/components/ds-panel-tool-search.js +1 -1
- package/dist/components/ds-panel-tools.js +1 -1
- package/dist/components/ds-radio.js +1 -1
- package/dist/components/ds-scroll-overlay.js +1 -1
- package/dist/components/ds-scroll-overlay.js.map +1 -1
- package/dist/components/ds-select.js +1 -1
- package/dist/components/ds-select.js.map +1 -1
- package/dist/components/ds-shell-app.js +1 -1
- package/dist/components/ds-shell-page.js +1 -1
- package/dist/components/ds-shell-tools.js +1 -1
- package/dist/components/ds-skeleton.js +1 -1
- package/dist/components/ds-slider.js +1 -1
- package/dist/components/ds-swatch-picker.js +1 -1
- package/dist/components/ds-switch.js +1 -1
- package/dist/components/ds-tab-group.js +1 -1
- package/dist/components/ds-tag.js +1 -1
- package/dist/components/ds-text.js +1 -1
- package/dist/components/ds-toast.js +1 -1
- package/dist/components/ds-toast.js.map +1 -1
- package/dist/components/{ds-card-data-viz.d.ts → ds-tooltip-chart.d.ts} +4 -4
- package/dist/components/ds-tooltip-chart.js +2 -0
- package/dist/components/ds-tooltip.js +1 -1
- package/dist/components/ds-typing-indicator.js +1 -1
- package/dist/components/{p-IYy-jODg.js → p-1Zbh1MRy.js} +2 -2
- package/dist/components/{p-wOOAzVMC.js → p-BVsLc3t5.js} +2 -2
- package/dist/components/p-BZCUFHYa.js +2 -0
- package/dist/components/{p-D0bM3cKj.js.map → p-BZCUFHYa.js.map} +1 -1
- package/dist/components/{p-BBtjABBS.js → p-BjiRqLtB.js} +2 -2
- package/dist/components/p-Bk1A9jLm.js +2 -0
- package/dist/components/p-Bk1A9jLm.js.map +1 -0
- package/dist/components/{p-Bsfpxto1.js → p-BsBw-w1q.js} +2 -2
- package/dist/components/p-ByfXC1wu.js +2 -0
- package/dist/components/{p-1S9AW2MA.js.map → p-ByfXC1wu.js.map} +1 -1
- package/dist/components/{p-B6RrZQqw.js → p-C-ENnZzq.js} +2 -2
- package/dist/components/{p-BPyymeuR.js → p-C2U48kDH.js} +2 -2
- package/dist/components/{p-CKRJX0Y0.js → p-C7mCjS2t.js} +2 -2
- package/dist/components/{p-6B411hQA.js → p-CL8XL1eh.js} +2 -2
- package/dist/components/{p-DfvDNcoq.js → p-CMZVPEZ_.js} +2 -2
- package/dist/components/{p-BtuYufL3.js → p-CWL61nKt.js} +2 -2
- package/dist/components/p-CWL61nKt.js.map +1 -0
- package/dist/components/p-CWLrXsDQ.js +2 -0
- package/dist/components/{p-D2cjoj2r.js.map → p-CWLrXsDQ.js.map} +1 -1
- package/dist/components/{p-Di81y9Q2.js → p-CX7QIytv.js} +2 -2
- package/dist/components/p-CXduurfd.js +2 -0
- package/dist/components/p-CXduurfd.js.map +1 -0
- package/dist/components/p-CbAfTqlb.js +2 -0
- package/dist/components/{p-CuJ3J6OJ.js.map → p-CbAfTqlb.js.map} +1 -1
- package/dist/components/{p-DVuxzrCC.js → p-CfTThRNX.js} +2 -2
- package/dist/components/{p-BmNpPyzf.js → p-CkLffZGn.js} +2 -2
- package/dist/components/{p-B4_0Ys4w.js → p-CkyXU1YX.js} +2 -2
- package/dist/components/{p-iCjUWcp7.js → p-CywKWfgD.js} +2 -2
- package/dist/components/{p-BR_oMaas.js → p-D3UKwTEo.js} +2 -2
- package/dist/components/{p-Bl6A5AJq.js → p-D7z9bJ6n.js} +2 -2
- package/dist/components/{p-DaqFuVKZ.js → p-DAftUxvL.js} +2 -2
- package/dist/components/{p-BFfHIu6y.js → p-DQ94PkZA.js} +2 -2
- package/dist/components/{p-B-kRByho.js → p-DSpq7xQF.js} +2 -2
- package/dist/components/{p-og48Kh2i.js → p-DzM3TcyQ.js} +2 -2
- package/dist/components/p-GbTasczF.js +2 -0
- package/dist/components/{p-Ca6s5fLR.js → p-Mmr9b1bB.js} +2 -2
- package/dist/components/p-UH2AGfR0.js +2 -0
- package/dist/components/{p-DX4c3kZ1.js.map → p-UH2AGfR0.js.map} +1 -1
- package/dist/components/{p-CxgMUvqg.js → p-Z2zfShlF.js} +2 -2
- package/dist/components/{p-Bmo4T96l.js → p-_mClULFL.js} +2 -2
- package/dist/components/{p-Bb4f5SuF.js → p-jf1zCsuw.js} +2 -2
- package/dist/components/{p-Eep5mxtv.js → p-oiR4IoH1.js} +2 -2
- package/dist/components/{p-DHF5cLzr.js → p-u2OZHaLY.js} +2 -2
- package/dist/docs/components.json +180 -662
- package/dist/lib/utils/chart-grammar.d.ts +359 -0
- package/dist/lib/utils/index.d.ts +2 -0
- package/dist/lib/utils/index.js +504 -0
- package/dist/lib/utils/index.js.map +4 -4
- package/dist/lib/utils/token-defaults.d.ts +3 -0
- package/dist/mcp-data/registry/banner.json +2 -2
- package/dist/mcp-data/registry/card-chart.json +238 -0
- package/dist/mcp-data/registry/card-overview.json +2 -2
- package/dist/mcp-data/registry/card-setting.json +2 -2
- package/dist/mcp-data/registry/chart-legend.json +11 -18
- package/dist/mcp-data/registry/chart.json +258 -0
- package/dist/mcp-data/registry/mobile-bar-nav.json +3 -3
- package/dist/mcp-data/registry/registry.json +108 -376
- package/dist/mcp-data/registry/tooltip-chart.json +253 -0
- package/dist/mcp-data/registry/tooltip.json +2 -2
- package/dist/react/components.d.ts +3 -5
- package/dist/react/components.js +3 -5
- package/dist/react/ds-card-chart.d.ts +12 -0
- package/dist/react/ds-card-chart.js +12 -0
- package/dist/react/ds-chart.d.ts +12 -0
- package/dist/react/ds-chart.js +12 -0
- package/dist/react/{ds-chart-bar.d.ts → ds-tooltip-chart.d.ts} +3 -3
- package/dist/react/ds-tooltip-chart.js +12 -0
- package/dist/types/components/{CardDataViz/CardDataViz.d.ts → CardChart/CardChart.d.ts} +9 -13
- package/dist/types/components/CardChart/index.d.ts +2 -0
- package/dist/types/components/Chart/Chart.d.ts +66 -0
- package/dist/types/components/Chart/index.d.ts +2 -0
- package/dist/types/components/ChartLegend/ChartLegend.d.ts +1 -1
- package/dist/types/components/{TooltipDataViz/TooltipDataViz.d.ts → TooltipChart/TooltipChart.d.ts} +15 -6
- package/dist/types/components/TooltipChart/index.d.ts +2 -0
- package/dist/types/components.d.ts +129 -294
- package/dist/types/utils/chart-grammar.d.ts +360 -0
- package/dist/types/utils/chart-scene.d.ts +128 -0
- package/dist/types/utils/chart-theme.d.ts +27 -0
- package/dist/types/utils/chart-types.d.ts +0 -13
- package/dist/types/utils/index.d.ts +2 -0
- package/dist/types/utils/token-defaults.d.ts +3 -0
- package/package.json +1 -1
- package/dist/angular/ds-card-data-viz.d.ts +0 -18
- package/dist/angular/ds-chart-bar.d.ts +0 -12
- package/dist/angular/ds-chart-bar.js +0 -38
- package/dist/angular/ds-chart-donut.d.ts +0 -19
- package/dist/angular/ds-chart-line.d.ts +0 -12
- package/dist/angular/ds-tooltip-data-viz.d.ts +0 -12
- package/dist/angular/ds-tooltip-data-viz.js +0 -38
- package/dist/components/ds-card-data-viz.js +0 -2
- package/dist/components/ds-card-data-viz.js.map +0 -1
- package/dist/components/ds-chart-bar.js +0 -2
- package/dist/components/ds-chart-bar.js.map +0 -1
- package/dist/components/ds-chart-donut.d.ts +0 -11
- package/dist/components/ds-chart-donut.js +0 -2
- package/dist/components/ds-chart-donut.js.map +0 -1
- package/dist/components/ds-chart-line.js +0 -2
- package/dist/components/ds-chart-line.js.map +0 -1
- package/dist/components/ds-tooltip-data-viz.d.ts +0 -11
- package/dist/components/ds-tooltip-data-viz.js +0 -2
- package/dist/components/p-1S9AW2MA.js +0 -2
- package/dist/components/p-B6Vuayt6.js +0 -2
- package/dist/components/p-B6Vuayt6.js.map +0 -1
- package/dist/components/p-BBpASejH.js +0 -2
- package/dist/components/p-BBpASejH.js.map +0 -1
- package/dist/components/p-BtuYufL3.js.map +0 -1
- package/dist/components/p-BybqPD8K.js +0 -2
- package/dist/components/p-BybqPD8K.js.map +0 -1
- package/dist/components/p-C4uYvyq6.js +0 -2
- package/dist/components/p-C4uYvyq6.js.map +0 -1
- package/dist/components/p-CbjFUpOj.js +0 -2
- package/dist/components/p-CbjFUpOj.js.map +0 -1
- package/dist/components/p-CrCGIx8s.js +0 -2
- package/dist/components/p-CrCGIx8s.js.map +0 -1
- package/dist/components/p-CuJ3J6OJ.js +0 -2
- package/dist/components/p-D0bM3cKj.js +0 -2
- package/dist/components/p-D2cjoj2r.js +0 -2
- package/dist/components/p-DX4c3kZ1.js +0 -2
- package/dist/components/p-DXewjzkM.js +0 -2
- package/dist/components/p-DXewjzkM.js.map +0 -1
- package/dist/components/p-yhj1lIPx.js +0 -2
- package/dist/mcp-data/registry/card-data-viz.json +0 -241
- package/dist/mcp-data/registry/chart-bar.json +0 -245
- package/dist/mcp-data/registry/chart-donut.json +0 -344
- package/dist/mcp-data/registry/chart-line.json +0 -223
- package/dist/mcp-data/registry/tooltip-data-viz.json +0 -224
- package/dist/react/ds-card-data-viz.d.ts +0 -12
- package/dist/react/ds-card-data-viz.js +0 -12
- package/dist/react/ds-chart-bar.js +0 -12
- package/dist/react/ds-chart-donut.d.ts +0 -12
- package/dist/react/ds-chart-donut.js +0 -12
- package/dist/react/ds-chart-line.d.ts +0 -9
- package/dist/react/ds-chart-line.js +0 -12
- package/dist/react/ds-tooltip-data-viz.d.ts +0 -9
- package/dist/react/ds-tooltip-data-viz.js +0 -12
- package/dist/types/components/CardDataViz/index.d.ts +0 -2
- package/dist/types/components/ChartBar/ChartBar.d.ts +0 -31
- package/dist/types/components/ChartBar/index.d.ts +0 -3
- package/dist/types/components/ChartDonut/ChartDonut.d.ts +0 -72
- package/dist/types/components/ChartDonut/index.d.ts +0 -2
- package/dist/types/components/ChartLine/ChartLine.d.ts +0 -23
- package/dist/types/components/ChartLine/index.d.ts +0 -2
- package/dist/types/components/TooltipDataViz/index.d.ts +0 -2
- /package/dist/components/{ds-tooltip-data-viz.js.map → ds-tooltip-chart.js.map} +0 -0
- /package/dist/components/{p-IYy-jODg.js.map → p-1Zbh1MRy.js.map} +0 -0
- /package/dist/components/{p-wOOAzVMC.js.map → p-BVsLc3t5.js.map} +0 -0
- /package/dist/components/{p-BBtjABBS.js.map → p-BjiRqLtB.js.map} +0 -0
- /package/dist/components/{p-Bsfpxto1.js.map → p-BsBw-w1q.js.map} +0 -0
- /package/dist/components/{p-B6RrZQqw.js.map → p-C-ENnZzq.js.map} +0 -0
- /package/dist/components/{p-BPyymeuR.js.map → p-C2U48kDH.js.map} +0 -0
- /package/dist/components/{p-CKRJX0Y0.js.map → p-C7mCjS2t.js.map} +0 -0
- /package/dist/components/{p-6B411hQA.js.map → p-CL8XL1eh.js.map} +0 -0
- /package/dist/components/{p-DfvDNcoq.js.map → p-CMZVPEZ_.js.map} +0 -0
- /package/dist/components/{p-Di81y9Q2.js.map → p-CX7QIytv.js.map} +0 -0
- /package/dist/components/{p-DVuxzrCC.js.map → p-CfTThRNX.js.map} +0 -0
- /package/dist/components/{p-BmNpPyzf.js.map → p-CkLffZGn.js.map} +0 -0
- /package/dist/components/{p-B4_0Ys4w.js.map → p-CkyXU1YX.js.map} +0 -0
- /package/dist/components/{p-iCjUWcp7.js.map → p-CywKWfgD.js.map} +0 -0
- /package/dist/components/{p-BR_oMaas.js.map → p-D3UKwTEo.js.map} +0 -0
- /package/dist/components/{p-Bl6A5AJq.js.map → p-D7z9bJ6n.js.map} +0 -0
- /package/dist/components/{p-DaqFuVKZ.js.map → p-DAftUxvL.js.map} +0 -0
- /package/dist/components/{p-BFfHIu6y.js.map → p-DQ94PkZA.js.map} +0 -0
- /package/dist/components/{p-B-kRByho.js.map → p-DSpq7xQF.js.map} +0 -0
- /package/dist/components/{p-og48Kh2i.js.map → p-DzM3TcyQ.js.map} +0 -0
- /package/dist/components/{p-yhj1lIPx.js.map → p-GbTasczF.js.map} +0 -0
- /package/dist/components/{p-Ca6s5fLR.js.map → p-Mmr9b1bB.js.map} +0 -0
- /package/dist/components/{p-CxgMUvqg.js.map → p-Z2zfShlF.js.map} +0 -0
- /package/dist/components/{p-Bmo4T96l.js.map → p-_mClULFL.js.map} +0 -0
- /package/dist/components/{p-Bb4f5SuF.js.map → p-jf1zCsuw.js.map} +0 -0
- /package/dist/components/{p-Eep5mxtv.js.map → p-oiR4IoH1.js.map} +0 -0
- /package/dist/components/{p-DHF5cLzr.js.map → p-u2OZHaLY.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../src/wc/components/Icon/icon-cache.ts", "../../../src/wc/utils/resolve-css-length-px.ts", "../../../src/wc/utils/format-compact-number.ts", "../../../src/wc/utils/format-percentage.ts", "../../../src/wc/utils/metric-change.ts", "../../../src/wc/utils/truncate-svg-text.ts", "../../../src/wc/utils/resolve-css-time-ms.ts", "../../../src/wc/utils/scroll-edge-fade.ts", "../../../src/wc/utils/token-defaults.ts", "../../../src/wc/utils/required-validity.ts", "../../../src/wc/utils/form-association.ts", "../../../src/wc/utils/safe-url.ts", "../../../src/wc/utils/control-width.ts", "../../../src/wc/utils/control-text.ts", "../../../src/wc/utils/choice-popup-alignment.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Shared SVG glyph cache for ds-icon.\n *\n * Keyed on a global symbol so every module instance (the compiled Stencil chunk\n * inside dist/components and any direct source import, e.g. via `@ds-mo/ui/utils`)\n * reads and writes the same cache. Without this, `registerIcons` called from an\n * app would fill a different Map than the one ds-icon resolves from.\n */\nconst CACHE_KEY = Symbol.for('ds-mo.icon-svg-cache');\n\ntype IconCacheMap = Map<string, string>;\n\ntype GlobalWithIconCache = { [CACHE_KEY]?: IconCacheMap };\n\nexport function iconCacheKey(name: string, flag: boolean): string {\n return flag ? `flag:${name}` : `system:${name}`;\n}\n\nexport function iconCache(): IconCacheMap {\n const g = globalThis as GlobalWithIconCache;\n return (g[CACHE_KEY] ??= new Map());\n}\n\n/**\n * Pre-register glyphs so ds-icon renders them synchronously \u2014 no lazy-chunk\n * fetch, no first-paint pop-in. Import the SVG strings from `@ds-mo/icons`\n * in the app (statically, so they ship in the app's own bundle):\n *\n * ```ts\n * import { Bell } from '@ds-mo/icons/svg/Bell';\n * import { FlagUnitedStates } from '@ds-mo/icons/svg/flags/FlagUnitedStates';\n * import { registerIcons } from '@ds-mo/ui/utils';\n *\n * registerIcons({ Bell });\n * registerIcons({ FlagUnitedStates });\n * ```\n *\n * Icons that are not registered still work \u2014 they lazy-load on first render\n * and stay cached afterwards.\n */\nexport function registerIcons(icons: Record<string, string>, options?: { flag?: boolean }): void {\n const cache = iconCache();\n for (const [name, svg] of Object.entries(icons)) {\n const flag = options?.flag ?? name.startsWith('Flag');\n cache.set(iconCacheKey(name, flag), svg);\n }\n}\n", "const lengthPxCache = new Map<string, number>();\n\nlet probeEl: HTMLElement | null = null;\n\nfunction getProbeElement(): HTMLElement | null {\n if (typeof document === 'undefined') return null;\n\n if (!probeEl) {\n probeEl = document.createElement('div');\n probeEl.setAttribute('aria-hidden', 'true');\n probeEl.style.cssText =\n 'position:absolute;visibility:hidden;pointer-events:none;top:0;left:0;width:0;height:0;overflow:hidden;';\n document.documentElement.appendChild(probeEl);\n }\n\n return probeEl;\n}\n\n/** Clear session cache (tests only). */\nexport function clearCssLengthPxCache(): void {\n lengthPxCache.clear();\n}\n\n/**\n * Resolve a CSS length to pixels for layout math.\n * Numbers pass through; `var(--dimension-*)`, `calc(...)`, and `16px` resolve via a hidden probe.\n */\nexport function resolveCssLengthPx(\n value: number | string | undefined,\n fallback: number | string,\n): number {\n const resolved = value === undefined || value === null || value === '' ? fallback : value;\n if (typeof resolved === 'number') return resolved;\n\n const trimmed = resolved.trim();\n if (!trimmed) return resolveCssLengthPx(fallback, 0);\n\n const cached = lengthPxCache.get(trimmed);\n if (cached !== undefined) return cached;\n\n if (/^-?\\d+(\\.\\d+)?$/.test(trimmed)) {\n const n = Number(trimmed);\n lengthPxCache.set(trimmed, n);\n return n;\n }\n\n const pxMatch = trimmed.match(/^(-?\\d+(\\.\\d+)?)px$/);\n if (pxMatch) {\n const px = parseFloat(pxMatch[1]);\n lengthPxCache.set(trimmed, px);\n return px;\n }\n\n const cssLength = /^--[\\w-]+$/.test(trimmed) ? `var(${trimmed})` : trimmed;\n\n const probe = getProbeElement();\n if (!probe) {\n return typeof fallback === 'number' ? fallback : 0;\n }\n\n probe.style.width = cssLength;\n const px = probe.getBoundingClientRect().width;\n probe.style.width = '';\n // A stylesheet can finish loading after a custom element's first layout\n // pass (notably in WebKit). Do not permanently cache the probe's temporary\n // zero when the length depends on a custom property; a later call must be\n // able to resolve the now-available token.\n if (px !== 0 || !cssLength.includes('var(')) {\n lengthPxCache.set(trimmed, px);\n }\n return px;\n}\n", "const COMPACT_UNITS: { threshold: number; suffix: string }[] = [\n { threshold: 1_000_000_000, suffix: 'b' },\n { threshold: 1_000_000, suffix: 'm' },\n { threshold: 1_000, suffix: 'k' },\n];\n\n/** Compact large numbers for display: 1000 -> \"1k\", 1500 -> \"1.5k\", 110100 -> \"110.1k\", 1000000 -> \"1m\". */\nexport function formatCompactNumber(value: number, locale?: string): string {\n if (locale) {\n return new Intl.NumberFormat(locale, {\n notation: 'compact',\n compactDisplay: 'short',\n maximumFractionDigits: 1,\n }).format(value);\n }\n const sign = value < 0 ? '-' : '';\n const abs = Math.abs(value);\n if (abs < 1000) return String(value);\n\n for (let i = 0; i < COMPACT_UNITS.length; i++) {\n const unit = COMPACT_UNITS[i];\n if (abs < unit.threshold) continue;\n\n let scaled = Math.round((abs / unit.threshold) * 10) / 10;\n // Carry over, e.g. 999.96k rounds to \"1000k\" \u2014 bump to the next unit instead.\n if (scaled >= 1000 && i > 0) {\n const next = COMPACT_UNITS[i - 1];\n scaled = Math.round((abs / next.threshold) * 10) / 10;\n return `${sign}${scaled}${next.suffix}`;\n }\n return `${sign}${scaled}${unit.suffix}`;\n }\n return String(value);\n}\n", "export type PercentageDecimals = 1 | 2;\n\n/** Format a ratio as a locale-aware percentage with an exact, supported precision. */\nexport function formatPercentage(\n ratio: number,\n decimals: PercentageDecimals = 1,\n locale?: string,\n): string {\n const precision = decimals === 2 ? 2 : 1;\n const value = Number.isFinite(ratio) ? ratio : 0;\n\n return new Intl.NumberFormat(locale, {\n style: 'percent',\n minimumFractionDigits: precision,\n maximumFractionDigits: precision,\n }).format(value);\n}\n", "import { formatCompactNumber } from './format-compact-number';\n\nexport type MetricTrendDirection = 'up' | 'down';\n\n/**\n * How a change should read to the user. Deliberately separate from direction:\n * a metric can fall and read positive, or move and read neutral, so the arrow\n * and the sentiment are independent.\n */\nexport type MetricTrendTone = 'positive' | 'negative' | 'neutral';\n\n/** Display-ready trend for an overview score or metric. */\nexport interface MetricTrend {\n direction: MetricTrendDirection;\n /** Formatted change, for example `9` or `32%`. */\n value: string;\n tone: MetricTrendTone;\n}\n\nexport interface MetricChange {\n /** Signed difference, current minus previous. */\n delta: number;\n /** Magnitude of the difference. */\n absolute: number;\n /**\n * Magnitude as a share of the previous value, so `0.32` means 32 percent.\n * Zero when the previous value is zero, because the change has no base to\n * measure against and an infinite increase is not reportable.\n */\n ratio: number;\n /** `null` when the values match or either side is missing. */\n direction: MetricTrendDirection | null;\n}\n\nexport interface ResolveMetricTrendOptions {\n /** Lower is better, so a decrease reads positive. Collisions, costs, defects. */\n inverted?: boolean;\n /** Report the change without a positive or negative reading. */\n neutral?: boolean;\n /** Report the change as a share of the previous value rather than a magnitude. */\n display?: 'absolute' | 'percentage';\n locale?: string;\n}\n\nconst NO_CHANGE: MetricChange = { delta: 0, absolute: 0, ratio: 0, direction: null };\n\nfunction isUsable(value: number | null | undefined): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\n/**\n * Compare a metric against its previous period.\n *\n * Reports magnitudes only \u2014 whether a rise is good news is a product decision,\n * so callers pair this with `resolveMetricTrend` or map `direction` themselves.\n */\nexport function computeMetricChange(\n current: number | null | undefined,\n previous: number | null | undefined,\n): MetricChange {\n if (!isUsable(current) || !isUsable(previous)) return NO_CHANGE;\n\n // Trim floating-point noise so 0.3 - 0.1 does not report a change of 0.199\u2026\n const delta = Number.parseFloat((current - previous).toFixed(10));\n if (delta === 0) return NO_CHANGE;\n\n const absolute = Math.abs(delta);\n const ratio = previous === 0 ? 0 : Math.abs(delta / previous);\n\n return { delta, absolute, ratio, direction: delta > 0 ? 'up' : 'down' };\n}\n\n/**\n * Build a display-ready trend, or `null` when there is nothing to report so the\n * caller can omit the trend entirely rather than render a zero.\n *\n * Percentages are formatted without decimals to match the product's overview\n * bar; `formatPercentage` is not used because it requires one or two decimals.\n */\nexport function resolveMetricTrend(\n current: number | null | undefined,\n previous: number | null | undefined,\n options: ResolveMetricTrendOptions = {},\n): MetricTrend | null {\n const { inverted = false, neutral = false, display = 'absolute', locale } = options;\n const change = computeMetricChange(current, previous);\n if (!change.direction) return null;\n\n // A rise reads positive by default and negative when lower is better.\n const rose = change.direction === 'up';\n const tone: MetricTrendTone = neutral\n ? 'neutral'\n : rose !== inverted\n ? 'positive'\n : 'negative';\n\n const value = display === 'percentage'\n ? new Intl.NumberFormat(locale, { style: 'percent', maximumFractionDigits: 0 }).format(change.ratio)\n : formatCompactNumber(change.absolute, locale);\n\n return { direction: change.direction, value, tone };\n}\n", "/**\n * Binary-searches the longest prefix of `text` (plus an ellipsis) that fits within `maxWidth`\n * px when rendered by `el`, using the SVG `getComputedTextLength()` API for exact measurement \u2014\n * `text-overflow: ellipsis` doesn't apply to raw SVG `<text>` nodes.\n *\n * Mutates `el.textContent` during measurement; the caller's next render (driven by the\n * returned string going into state) overwrites it with the final value.\n */\nexport function truncateSvgTextToWidth(el: SVGTextElement, text: string, maxWidth: number): string {\n el.textContent = text;\n if (maxWidth <= 0 || el.getComputedTextLength() <= maxWidth) return text;\n\n let lo = 0;\n let hi = text.length;\n while (lo < hi) {\n const mid = Math.ceil((lo + hi) / 2);\n el.textContent = `${text.slice(0, mid)}\u2026`;\n if (el.getComputedTextLength() <= maxWidth) {\n lo = mid;\n } else {\n hi = mid - 1;\n }\n }\n return lo > 0 ? `${text.slice(0, lo)}\u2026` : '\u2026';\n}\n", "/** Parse a CSS <time> value (or motion shorthand's first token) to milliseconds. */\nexport function parseCssTimeMs(value: string, fallback: number): number {\n const firstToken = value.trim().split(/\\s+/)[0] ?? '';\n const num = parseFloat(firstToken);\n if (Number.isNaN(num)) return fallback;\n if (/ms\\s*$/.test(firstToken)) return num;\n if (/s\\s*$/.test(firstToken)) return num * 1000;\n return num;\n}\n\nfunction extractCssCustomProp(ref: string): string | null {\n const varMatch = ref.match(/^var\\(\\s*(--[^),]+)/);\n if (varMatch) return varMatch[1].trim();\n if (ref.startsWith('--')) return ref.trim();\n return null;\n}\n\nfunction readTokenTimeMs(token: string, fallback: number): number {\n if (typeof document === 'undefined') return fallback;\n\n const prop = extractCssCustomProp(token);\n if (!prop) return parseCssTimeMs(token, fallback);\n\n const raw = getComputedStyle(document.documentElement).getPropertyValue(prop).trim();\n return parseCssTimeMs(raw, fallback);\n}\n\n/**\n * Resolve a duration to milliseconds for JS timers aligned with CSS motion tokens.\n * Accepts numbers (ms), raw times (`200ms`, `0.75s`), or `var(--effect-*)` references.\n */\nexport function resolveCssTimeMs(\n value: number | string | undefined,\n fallbackToken: string,\n): number {\n if (typeof value === 'number') return value;\n\n const token = typeof value === 'string' && value.trim() ? value.trim() : fallbackToken;\n const prop = extractCssCustomProp(token);\n\n if (prop) {\n return readTokenTimeMs(token, readTokenTimeMs(fallbackToken, 200));\n }\n\n return parseCssTimeMs(token, readTokenTimeMs(fallbackToken, 200));\n}\n\n/** Whether the user has requested reduced non-essential motion. */\nexport function prefersReducedMotion(): boolean {\n return typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\n/**\n * Resolve an animation-coupled duration. Returns zero under reduced motion so\n * JS cleanup stays synchronized with CSS that removes the corresponding motion.\n */\nexport function resolveMotionTimeMs(\n value: number | string | undefined,\n fallbackToken: string,\n): number {\n return prefersReducedMotion() ? 0 : resolveCssTimeMs(value, fallbackToken);\n}\n", "/** CSS custom property for scroll-edge fade depth (dimension token or length). */\nexport const SCROLL_EDGE_FADE_SIZE_VAR = '--ds-scroll-edge-fade-size';\n\nexport const SCROLL_EDGE_FADE_DEFAULT_SIZE = 'var(--dimension-size-600)';\n\nexport type ScrollEdgeFadeEdge = 'top' | 'bottom' | 'left' | 'right';\n\nexport type ScrollEdgeFadeSizeToken =\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';\n\nexport type ScrollEdgeFadeSize = ScrollEdgeFadeSizeToken | (string & {});\n\nconst SIZE_VALUE: Record<ScrollEdgeFadeSizeToken, 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 SIZE_REF = `var(${SCROLL_EDGE_FADE_SIZE_VAR}, ${SCROLL_EDGE_FADE_DEFAULT_SIZE})`;\n\nexport interface ScrollEdgeFadeOptions {\n /** One or more edges to fade. */\n edges: ScrollEdgeFadeEdge | ScrollEdgeFadeEdge[];\n /**\n * Reveal and hide configured fades from the container's own scroll position.\n * Uses CSS scroll-driven animations with a static-fade fallback; no listener required.\n */\n scrollAware?: boolean;\n /**\n * When true, removes the complete mask. Pass a map to remove only configured\n * edges that are flush when scroll state already lives in JavaScript.\n */\n atEnd?: boolean | Partial<Record<ScrollEdgeFadeEdge, boolean>>;\n /** Force the mask off regardless of scroll position (`ds-fade` `visible={false}`). */\n hidden?: boolean;\n}\n\n/** Resolve a dimension size token name or raw CSS length for `--ds-scroll-edge-fade-size`. */\nexport function resolveScrollEdgeFadeSize(\n size: ScrollEdgeFadeSize = 'size-600',\n height?: string,\n): string {\n if (height) return height;\n return Object.prototype.hasOwnProperty.call(SIZE_VALUE, size)\n ? SIZE_VALUE[size as ScrollEdgeFadeSizeToken]\n : size;\n}\n\n/** Inline style map setting fade depth on a scroll container. */\nexport function scrollEdgeFadeSizeStyle(\n size: ScrollEdgeFadeSize = 'size-600',\n height?: string,\n): Record<string, string> {\n return {\n [SCROLL_EDGE_FADE_SIZE_VAR]: resolveScrollEdgeFadeSize(size, height),\n };\n}\n\n/**\n * Alpha mask for a scroll container edge \u2014 content fades to transparent so\n * textured backgrounds (shell gradients, images) show through.\n */\nexport function scrollEdgeFadeMaskImage(edge: ScrollEdgeFadeEdge): string {\n switch (edge) {\n case 'top':\n return `linear-gradient(to bottom, transparent 0, #000 ${SIZE_REF}, #000 100%)`;\n case 'bottom':\n return `linear-gradient(to bottom, #000 0, #000 calc(100% - ${SIZE_REF}), transparent 100%)`;\n case 'left':\n return `linear-gradient(to right, transparent 0, #000 ${SIZE_REF}, #000 100%)`;\n case 'right':\n return `linear-gradient(to right, #000 0, #000 calc(100% - ${SIZE_REF}), transparent 100%)`;\n }\n}\n\n/** Inline style map for a masked scroll region (single edge). */\nexport function scrollEdgeFadeMaskStyle(\n edge: ScrollEdgeFadeEdge,\n size: ScrollEdgeFadeSize = 'size-600',\n height?: string,\n): Record<string, string> {\n const mask = scrollEdgeFadeMaskImage(edge);\n return {\n ...scrollEdgeFadeSizeStyle(size, height),\n WebkitMaskImage: mask,\n maskImage: mask,\n WebkitMaskSize: '100% 100%',\n maskSize: '100% 100%',\n };\n}\n\n/** Class map for `scroll-edge-fade` modifiers \u2014 pair with `scroll-edge-fade.css`. */\nexport function scrollEdgeFadeClassMap(opts: ScrollEdgeFadeOptions): Record<string, boolean> {\n const edges = Array.isArray(opts.edges) ? opts.edges : [opts.edges];\n const classes: Record<string, boolean> = {\n 'scroll-edge-fade': true,\n 'scroll-edge-fade--scroll-aware': opts.scrollAware === true,\n 'scroll-edge-fade--hidden': opts.hidden === true,\n };\n\n for (const edge of edges) {\n classes[`scroll-edge-fade--${edge}`] = true;\n }\n\n const { atEnd } = opts;\n if (atEnd === true) {\n classes['scroll-edge-fade--at-end'] = true;\n } else if (atEnd && typeof atEnd === 'object') {\n for (const edge of edges) {\n if (atEnd[edge]) {\n classes[`scroll-edge-fade--${edge}-at-edge`] = true;\n }\n }\n }\n\n return classes;\n}\n\n/** Whether a scroll container is flush with the given edge (within `threshold` px). */\nexport function isScrollAtEdge(\n el: HTMLElement,\n edge: ScrollEdgeFadeEdge,\n threshold = 2,\n): boolean {\n switch (edge) {\n case 'top':\n return el.scrollTop <= threshold;\n case 'bottom':\n return el.scrollHeight - el.scrollTop - el.clientHeight <= threshold;\n case 'left':\n return el.scrollLeft <= threshold;\n case 'right':\n return el.scrollWidth - el.scrollLeft - el.clientWidth <= threshold;\n }\n}\n", "import {\n dimensionIconographyMd,\n dimensionIconographySm,\n dimensionIconographyXs,\n dimensionMenuWidthXs,\n dimensionPanelWidth2xs,\n dimensionPanelWidthLg,\n dimensionPanelWidthMd,\n dimensionRadius025,\n dimensionSize200,\n dimensionSize300,\n dimensionSize400,\n dimensionSize600,\n dimensionSize800,\n dimensionSpace100,\n dimensionSpace050,\n dimensionSpace200,\n dimensionSpace300,\n dimensionSpace400,\n typographyLineheightLg,\n typographyLineheightMd,\n typographyLineheightSm,\n typographyLineheightXl,\n typographyLineheightXs,\n effectAnimationDelayLong2,\n effectAnimationDelayMedium1,\n effectAnimationDelayMedium3,\n effectAnimationDelayInstant,\n effectAnimationDelayShort2,\n effectAnimationDurationMedium1,\n effectAnimationDurationShort3,\n effectMotionShort2,\n effectMotionShort3,\n} from '@ds-mo/tokens/ts';\n\n/** TokoMo CSS custom-property names for shared component defaults (runtime resolution). */\nexport const TOKEN_DEFAULTS = {\n space050: dimensionSpace050,\n space100: dimensionSpace100,\n space200: dimensionSpace200,\n space300: dimensionSpace300,\n space400: dimensionSpace400,\n radius025: dimensionRadius025,\n size200: dimensionSize200,\n size300: dimensionSize300,\n size400: dimensionSize400,\n size600: dimensionSize600,\n size800: dimensionSize800,\n iconographyMd: dimensionIconographyMd,\n iconographySm: dimensionIconographySm,\n iconographyXs: dimensionIconographyXs,\n panelWidth2xs: dimensionPanelWidth2xs,\n panelWidthMd: dimensionPanelWidthMd,\n panelWidthLg: dimensionPanelWidthLg,\n menuWidthXs: dimensionMenuWidthXs,\n lineheightLg: typographyLineheightLg,\n lineheightMd: typographyLineheightMd,\n lineheightSm: typographyLineheightSm,\n lineheightXl: typographyLineheightXl,\n lineheightXs: typographyLineheightXs,\n motionShort2: effectMotionShort2,\n motionShort3: effectMotionShort3,\n animationDurationShort3: effectAnimationDurationShort3,\n animationDurationMedium1: effectAnimationDurationMedium1,\n animationDelayInstant: effectAnimationDelayInstant,\n animationDelayMedium1: effectAnimationDelayMedium1,\n animationDelayMedium3: effectAnimationDelayMedium3,\n animationDelayShort2: effectAnimationDelayShort2,\n animationDelayLong2: effectAnimationDelayLong2,\n /** Unmeasured menu height fallback: 20\u00D7 base (160px at default scale). */\n menuFallbackHeight: 'calc(var(--dimension-size-base) * 20)',\n /** Unmeasured tooltip width fallback: size-800 + size-200 (80px). */\n tooltipFallbackWidth: 'calc(var(--dimension-size-800) + var(--dimension-size-200))',\n /** Fill-mode donut diameter floor: 16\u00D7 size-base (128px). */\n donutFillMin: 'calc(var(--dimension-size-base) * 16)',\n /** Fill-mode donut diameter ceiling: 24\u00D7 size-base (192px). */\n donutFillMax: 'calc(var(--dimension-size-base) * 24)',\n} as const;\n\nexport type TokenDefaultKey = keyof typeof TOKEN_DEFAULTS;\n\n/** Valid CSS length strings for overlay offset props \u2014 bind on `sideOffset` / `alignOffset` in hosts. */\nexport const TOKEN_CSS_LENGTHS = {\n space050: `var(${dimensionSpace050})`,\n space200: `var(${dimensionSpace200})`,\n menuWidthXs: `var(${dimensionMenuWidthXs})`,\n} as const;\n", "/**\n * Shared \"required field\" validity contract for form-associated custom\n * elements (Checkbox, Radio, Switch, Input, Select, \u2026).\n *\n * Each control computes its own `missing` condition (what counts as empty\n * differs: unchecked, no value, no selection, \u2026) and its own form value, then\n * calls `setRequiredValidity` instead of hand-rolling the `setValidity` call\n * and the default message string.\n *\n * @see AGENTS.md \u2014 \"Required-field validity\"\n */\n\nexport const DEFAULT_REQUIRED_MESSAGE = 'This field is required.';\n\n/** Sets or clears the `valueMissing` validity flag on a form-associated element. */\nexport function setRequiredValidity(\n internals: ElementInternals,\n missing: boolean,\n message: string,\n): void {\n internals.setValidity(missing ? { valueMissing: true } : {}, missing ? message : '');\n}\n", "export type FormControlState = File | FormData | string | null;\n\nexport interface SetFormControlValueOptions {\n inactive?: boolean;\n state?: FormControlState;\n}\n\nexport interface SetRepeatedFormControlValueOptions {\n inactive?: boolean;\n state?: FormControlState;\n}\n\n/**\n * Set one form-associated value while consistently omitting inactive controls.\n * Pass `state` only when restoration differs from the submitted value.\n */\nexport function setFormControlValue(\n internals: ElementInternals,\n value: File | string | null,\n options: SetFormControlValueOptions = {}\n): void {\n const submission = options.inactive ? null : value;\n if (options.state === undefined) {\n internals.setFormValue(submission);\n return;\n }\n internals.setFormValue(submission, options.state);\n}\n\n/**\n * Submit repeated values under one field name and preserve a serialized array\n * for browser form-state restoration.\n */\nexport function setRepeatedFormControlValue(\n internals: ElementInternals,\n name: string | null | undefined,\n values: readonly (number | string)[],\n options: SetRepeatedFormControlValueOptions = {}\n): void {\n if (options.inactive || !name || values.length === 0) {\n internals.setFormValue(null);\n return;\n }\n\n const data = new FormData();\n values.forEach(value => data.append(name, String(value)));\n internals.setFormValue(data, options.state ?? JSON.stringify(values));\n}\n\nexport function restoreStringFormState(\n state: FormControlState,\n fallback: string = ''\n): string {\n return typeof state === 'string' ? state : fallback;\n}\n\nexport function restoreStringArrayFormState(state: FormControlState): string[] {\n if (typeof state !== 'string') return [];\n try {\n const restored: unknown = JSON.parse(state);\n return Array.isArray(restored)\n ? restored.filter((value): value is string => typeof value === 'string')\n : [];\n } catch {\n return [];\n }\n}\n\nexport function restoreNumberArrayFormState(\n state: FormControlState,\n maximumValues?: number\n): number[] {\n if (typeof state !== 'string') return [];\n try {\n const restored: unknown = JSON.parse(state);\n if (!Array.isArray(restored)) return [];\n const values = restored\n .map(value => typeof value === 'number' ? value : Number(value))\n .filter(value => Number.isFinite(value));\n return maximumValues === undefined ? values : values.slice(0, maximumValues);\n } catch {\n return [];\n }\n}\n", "export type SafeUrlProtocol = 'blob:' | 'http:' | 'https:' | 'mailto:';\n\nexport interface ResolveSafeUrlOptions {\n protocols?: readonly SafeUrlProtocol[];\n baseUrl?: string | URL;\n}\n\nconst DEFAULT_PROTOCOLS: readonly SafeUrlProtocol[] = ['http:', 'https:'];\n\n/**\n * Resolve a consumer-authored URL only when its protocol is explicitly allowed.\n * Relative URLs use the current document base in browser rendering; server-side\n * callers can provide `baseUrl` when they intentionally support relative input.\n */\nexport function resolveSafeUrl(\n value: string | null | undefined,\n options: ResolveSafeUrlOptions = {}\n): string | undefined {\n const candidate = value?.trim();\n if (!candidate) return undefined;\n\n const baseUrl =\n options.baseUrl ??\n (typeof document === 'undefined' ? undefined : document.baseURI);\n\n try {\n const url = baseUrl === undefined\n ? new URL(candidate)\n : new URL(candidate, baseUrl);\n const protocols = options.protocols ?? DEFAULT_PROTOCOLS;\n return protocols.includes(url.protocol as SafeUrlProtocol) ? url.href : undefined;\n } catch {\n return undefined;\n }\n}\n", "/** Shared width fit for interactive controls (buttons, select, \u2026). */\nexport type ControlWidth = 'hug' | 'fill';\n\n/** Host / control class map for `width=\"hug\" | \"fill\"`. */\nexport function controlWidthClass(width: ControlWidth): Record<string, boolean> {\n return {\n 'ds-control-width--hug': width === 'hug',\n 'ds-control-width--fill': width === 'fill',\n };\n}\n", "import type { TextVariant } from '../components/Text/text-types';\n\n/** Shared public control sizes. Typography is derived; it is not a separate density API. */\nexport type ControlSize = 'lg' | 'md' | 'sm' | 'xs';\n\n/** Complete text variant selected internally by each control size. */\nexport const CONTROL_TEXT_VARIANT: Record<ControlSize, TextVariant> = {\n lg: 'text-body-large',\n md: 'text-body-medium',\n sm: 'text-body-small',\n xs: 'text-caption',\n};\n\n/** Supporting copy paired with each control density in two-line choice rows. */\nexport const CONTROL_SUPPORTING_TEXT_VARIANT: Record<ControlSize, TextVariant> = {\n lg: 'text-body-medium',\n md: 'text-body-small',\n sm: 'text-caption',\n xs: 'text-caption',\n};\n", "import type { AnchoredAlign } from './anchored-position';\n\n/**\n * `choice-cell` aligns the first/last interactive row edge with the anchor,\n * allowing the popup frame to extend by the section inset. `popup-frame`\n * aligns the popup frame itself and is reserved for deliberate custom geometry.\n */\nexport type ChoicePopupAnchorAlignment = 'choice-cell' | 'popup-frame';\n\nexport interface ChoicePopupAlignOffsetInput {\n align: AnchoredAlign;\n alignOffsetPx: number;\n sectionInsetPx: number;\n anchorAlignment?: ChoicePopupAnchorAlignment;\n}\n\n/**\n * Resolve the cross-axis offset for a choice popup. Authored `alignOffsetPx`\n * remains an additive nudge after the shared inner-cell alignment is applied.\n */\nexport function resolveChoicePopupAlignOffset({\n align,\n alignOffsetPx,\n sectionInsetPx,\n anchorAlignment = 'choice-cell',\n}: ChoicePopupAlignOffsetInput): number {\n if (anchorAlignment === 'popup-frame' || align === 'center') return alignOffsetPx;\n return alignOffsetPx + (align === 'start' ? -sectionInsetPx : sectionInsetPx);\n}\n\n/** Minimum popup width that keeps both choice-cell edges aligned to a trigger. */\nexport function choicePopupMinWidth(anchorWidth: number, sectionInsetPx: number): number {\n return anchorWidth + sectionInsetPx * 2;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["px"]
|
|
3
|
+
"sources": ["../../../src/wc/components/Icon/icon-cache.ts", "../../../src/wc/utils/resolve-css-length-px.ts", "../../../src/wc/utils/format-compact-number.ts", "../../../src/wc/utils/format-percentage.ts", "../../../src/wc/utils/metric-change.ts", "../../../src/wc/utils/truncate-svg-text.ts", "../../../src/wc/utils/resolve-css-time-ms.ts", "../../../src/wc/utils/scroll-edge-fade.ts", "../../../src/wc/utils/token-defaults.ts", "../../../src/wc/utils/required-validity.ts", "../../../src/wc/utils/form-association.ts", "../../../src/wc/utils/safe-url.ts", "../../../src/wc/utils/control-width.ts", "../../../node_modules/d3-array/src/ascending.js", "../../../node_modules/d3-array/src/descending.js", "../../../node_modules/d3-array/src/bisector.js", "../../../node_modules/d3-array/src/number.js", "../../../node_modules/d3-array/src/bisect.js", "../../../node_modules/d3-array/src/count.js", "../../../node_modules/d3-array/src/variance.js", "../../../node_modules/d3-array/src/deviation.js", "../../../node_modules/d3-array/src/extent.js", "../../../node_modules/d3-array/src/identity.js", "../../../node_modules/d3-array/src/array.js", "../../../node_modules/d3-array/src/constant.js", "../../../node_modules/d3-array/src/ticks.js", "../../../node_modules/d3-array/src/nice.js", "../../../node_modules/d3-array/src/threshold/sturges.js", "../../../node_modules/d3-array/src/bin.js", "../../../node_modules/d3-array/src/quantile.js", "../../../src/wc/utils/chart-grammar.ts", "../../../src/wc/utils/control-text.ts", "../../../src/wc/utils/choice-popup-alignment.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Shared SVG glyph cache for ds-icon.\n *\n * Keyed on a global symbol so every module instance (the compiled Stencil chunk\n * inside dist/components and any direct source import, e.g. via `@ds-mo/ui/utils`)\n * reads and writes the same cache. Without this, `registerIcons` called from an\n * app would fill a different Map than the one ds-icon resolves from.\n */\nconst CACHE_KEY = Symbol.for('ds-mo.icon-svg-cache');\n\ntype IconCacheMap = Map<string, string>;\n\ntype GlobalWithIconCache = { [CACHE_KEY]?: IconCacheMap };\n\nexport function iconCacheKey(name: string, flag: boolean): string {\n return flag ? `flag:${name}` : `system:${name}`;\n}\n\nexport function iconCache(): IconCacheMap {\n const g = globalThis as GlobalWithIconCache;\n return (g[CACHE_KEY] ??= new Map());\n}\n\n/**\n * Pre-register glyphs so ds-icon renders them synchronously \u2014 no lazy-chunk\n * fetch, no first-paint pop-in. Import the SVG strings from `@ds-mo/icons`\n * in the app (statically, so they ship in the app's own bundle):\n *\n * ```ts\n * import { Bell } from '@ds-mo/icons/svg/Bell';\n * import { FlagUnitedStates } from '@ds-mo/icons/svg/flags/FlagUnitedStates';\n * import { registerIcons } from '@ds-mo/ui/utils';\n *\n * registerIcons({ Bell });\n * registerIcons({ FlagUnitedStates });\n * ```\n *\n * Icons that are not registered still work \u2014 they lazy-load on first render\n * and stay cached afterwards.\n */\nexport function registerIcons(icons: Record<string, string>, options?: { flag?: boolean }): void {\n const cache = iconCache();\n for (const [name, svg] of Object.entries(icons)) {\n const flag = options?.flag ?? name.startsWith('Flag');\n cache.set(iconCacheKey(name, flag), svg);\n }\n}\n", "const lengthPxCache = new Map<string, number>();\n\nlet probeEl: HTMLElement | null = null;\n\nfunction getProbeElement(): HTMLElement | null {\n if (typeof document === 'undefined') return null;\n\n if (!probeEl) {\n probeEl = document.createElement('div');\n probeEl.setAttribute('aria-hidden', 'true');\n probeEl.style.cssText =\n 'position:absolute;visibility:hidden;pointer-events:none;top:0;left:0;width:0;height:0;overflow:hidden;';\n document.documentElement.appendChild(probeEl);\n }\n\n return probeEl;\n}\n\n/** Clear session cache (tests only). */\nexport function clearCssLengthPxCache(): void {\n lengthPxCache.clear();\n}\n\n/**\n * Resolve a CSS length to pixels for layout math.\n * Numbers pass through; `var(--dimension-*)`, `calc(...)`, and `16px` resolve via a hidden probe.\n */\nexport function resolveCssLengthPx(\n value: number | string | undefined,\n fallback: number | string,\n): number {\n const resolved = value === undefined || value === null || value === '' ? fallback : value;\n if (typeof resolved === 'number') return resolved;\n\n const trimmed = resolved.trim();\n if (!trimmed) return resolveCssLengthPx(fallback, 0);\n\n const cached = lengthPxCache.get(trimmed);\n if (cached !== undefined) return cached;\n\n if (/^-?\\d+(\\.\\d+)?$/.test(trimmed)) {\n const n = Number(trimmed);\n lengthPxCache.set(trimmed, n);\n return n;\n }\n\n const pxMatch = trimmed.match(/^(-?\\d+(\\.\\d+)?)px$/);\n if (pxMatch) {\n const px = parseFloat(pxMatch[1]);\n lengthPxCache.set(trimmed, px);\n return px;\n }\n\n const cssLength = /^--[\\w-]+$/.test(trimmed) ? `var(${trimmed})` : trimmed;\n\n const probe = getProbeElement();\n if (!probe) {\n return typeof fallback === 'number' ? fallback : 0;\n }\n\n probe.style.width = cssLength;\n const px = probe.getBoundingClientRect().width;\n probe.style.width = '';\n // A stylesheet can finish loading after a custom element's first layout\n // pass (notably in WebKit). Do not permanently cache the probe's temporary\n // zero when the length depends on a custom property; a later call must be\n // able to resolve the now-available token.\n if (px !== 0 || !cssLength.includes('var(')) {\n lengthPxCache.set(trimmed, px);\n }\n return px;\n}\n", "const COMPACT_UNITS: { threshold: number; suffix: string }[] = [\n { threshold: 1_000_000_000, suffix: 'b' },\n { threshold: 1_000_000, suffix: 'm' },\n { threshold: 1_000, suffix: 'k' },\n];\n\n/** Compact large numbers for display: 1000 -> \"1k\", 1500 -> \"1.5k\", 110100 -> \"110.1k\", 1000000 -> \"1m\". */\nexport function formatCompactNumber(value: number, locale?: string): string {\n if (locale) {\n return new Intl.NumberFormat(locale, {\n notation: 'compact',\n compactDisplay: 'short',\n maximumFractionDigits: 1,\n }).format(value);\n }\n const sign = value < 0 ? '-' : '';\n const abs = Math.abs(value);\n if (abs < 1000) return String(value);\n\n for (let i = 0; i < COMPACT_UNITS.length; i++) {\n const unit = COMPACT_UNITS[i];\n if (abs < unit.threshold) continue;\n\n let scaled = Math.round((abs / unit.threshold) * 10) / 10;\n // Carry over, e.g. 999.96k rounds to \"1000k\" \u2014 bump to the next unit instead.\n if (scaled >= 1000 && i > 0) {\n const next = COMPACT_UNITS[i - 1];\n scaled = Math.round((abs / next.threshold) * 10) / 10;\n return `${sign}${scaled}${next.suffix}`;\n }\n return `${sign}${scaled}${unit.suffix}`;\n }\n return String(value);\n}\n", "export type PercentageDecimals = 1 | 2;\n\n/** Format a ratio as a locale-aware percentage with an exact, supported precision. */\nexport function formatPercentage(\n ratio: number,\n decimals: PercentageDecimals = 1,\n locale?: string,\n): string {\n const precision = decimals === 2 ? 2 : 1;\n const value = Number.isFinite(ratio) ? ratio : 0;\n\n return new Intl.NumberFormat(locale, {\n style: 'percent',\n minimumFractionDigits: precision,\n maximumFractionDigits: precision,\n }).format(value);\n}\n", "import { formatCompactNumber } from './format-compact-number';\n\nexport type MetricTrendDirection = 'up' | 'down';\n\n/**\n * How a change should read to the user. Deliberately separate from direction:\n * a metric can fall and read positive, or move and read neutral, so the arrow\n * and the sentiment are independent.\n */\nexport type MetricTrendTone = 'positive' | 'negative' | 'neutral';\n\n/** Display-ready trend for an overview score or metric. */\nexport interface MetricTrend {\n direction: MetricTrendDirection;\n /** Formatted change, for example `9` or `32%`. */\n value: string;\n tone: MetricTrendTone;\n}\n\nexport interface MetricChange {\n /** Signed difference, current minus previous. */\n delta: number;\n /** Magnitude of the difference. */\n absolute: number;\n /**\n * Magnitude as a share of the previous value, so `0.32` means 32 percent.\n * Zero when the previous value is zero, because the change has no base to\n * measure against and an infinite increase is not reportable.\n */\n ratio: number;\n /** `null` when the values match or either side is missing. */\n direction: MetricTrendDirection | null;\n}\n\nexport interface ResolveMetricTrendOptions {\n /** Lower is better, so a decrease reads positive. Collisions, costs, defects. */\n inverted?: boolean;\n /** Report the change without a positive or negative reading. */\n neutral?: boolean;\n /** Report the change as a share of the previous value rather than a magnitude. */\n display?: 'absolute' | 'percentage';\n locale?: string;\n}\n\nconst NO_CHANGE: MetricChange = { delta: 0, absolute: 0, ratio: 0, direction: null };\n\nfunction isUsable(value: number | null | undefined): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\n/**\n * Compare a metric against its previous period.\n *\n * Reports magnitudes only \u2014 whether a rise is good news is a product decision,\n * so callers pair this with `resolveMetricTrend` or map `direction` themselves.\n */\nexport function computeMetricChange(\n current: number | null | undefined,\n previous: number | null | undefined,\n): MetricChange {\n if (!isUsable(current) || !isUsable(previous)) return NO_CHANGE;\n\n // Trim floating-point noise so 0.3 - 0.1 does not report a change of 0.199\u2026\n const delta = Number.parseFloat((current - previous).toFixed(10));\n if (delta === 0) return NO_CHANGE;\n\n const absolute = Math.abs(delta);\n const ratio = previous === 0 ? 0 : Math.abs(delta / previous);\n\n return { delta, absolute, ratio, direction: delta > 0 ? 'up' : 'down' };\n}\n\n/**\n * Build a display-ready trend, or `null` when there is nothing to report so the\n * caller can omit the trend entirely rather than render a zero.\n *\n * Percentages are formatted without decimals to match the product's overview\n * bar; `formatPercentage` is not used because it requires one or two decimals.\n */\nexport function resolveMetricTrend(\n current: number | null | undefined,\n previous: number | null | undefined,\n options: ResolveMetricTrendOptions = {},\n): MetricTrend | null {\n const { inverted = false, neutral = false, display = 'absolute', locale } = options;\n const change = computeMetricChange(current, previous);\n if (!change.direction) return null;\n\n // A rise reads positive by default and negative when lower is better.\n const rose = change.direction === 'up';\n const tone: MetricTrendTone = neutral\n ? 'neutral'\n : rose !== inverted\n ? 'positive'\n : 'negative';\n\n const value = display === 'percentage'\n ? new Intl.NumberFormat(locale, { style: 'percent', maximumFractionDigits: 0 }).format(change.ratio)\n : formatCompactNumber(change.absolute, locale);\n\n return { direction: change.direction, value, tone };\n}\n", "/**\n * Binary-searches the longest prefix of `text` (plus an ellipsis) that fits within `maxWidth`\n * px when rendered by `el`, using the SVG `getComputedTextLength()` API for exact measurement \u2014\n * `text-overflow: ellipsis` doesn't apply to raw SVG `<text>` nodes.\n *\n * Mutates `el.textContent` during measurement; the caller's next render (driven by the\n * returned string going into state) overwrites it with the final value.\n */\nexport function truncateSvgTextToWidth(el: SVGTextElement, text: string, maxWidth: number): string {\n el.textContent = text;\n if (maxWidth <= 0 || el.getComputedTextLength() <= maxWidth) return text;\n\n let lo = 0;\n let hi = text.length;\n while (lo < hi) {\n const mid = Math.ceil((lo + hi) / 2);\n el.textContent = `${text.slice(0, mid)}\u2026`;\n if (el.getComputedTextLength() <= maxWidth) {\n lo = mid;\n } else {\n hi = mid - 1;\n }\n }\n return lo > 0 ? `${text.slice(0, lo)}\u2026` : '\u2026';\n}\n", "/** Parse a CSS <time> value (or motion shorthand's first token) to milliseconds. */\nexport function parseCssTimeMs(value: string, fallback: number): number {\n const firstToken = value.trim().split(/\\s+/)[0] ?? '';\n const num = parseFloat(firstToken);\n if (Number.isNaN(num)) return fallback;\n if (/ms\\s*$/.test(firstToken)) return num;\n if (/s\\s*$/.test(firstToken)) return num * 1000;\n return num;\n}\n\nfunction extractCssCustomProp(ref: string): string | null {\n const varMatch = ref.match(/^var\\(\\s*(--[^),]+)/);\n if (varMatch) return varMatch[1].trim();\n if (ref.startsWith('--')) return ref.trim();\n return null;\n}\n\nfunction readTokenTimeMs(token: string, fallback: number): number {\n if (typeof document === 'undefined') return fallback;\n\n const prop = extractCssCustomProp(token);\n if (!prop) return parseCssTimeMs(token, fallback);\n\n const raw = getComputedStyle(document.documentElement).getPropertyValue(prop).trim();\n return parseCssTimeMs(raw, fallback);\n}\n\n/**\n * Resolve a duration to milliseconds for JS timers aligned with CSS motion tokens.\n * Accepts numbers (ms), raw times (`200ms`, `0.75s`), or `var(--effect-*)` references.\n */\nexport function resolveCssTimeMs(\n value: number | string | undefined,\n fallbackToken: string,\n): number {\n if (typeof value === 'number') return value;\n\n const token = typeof value === 'string' && value.trim() ? value.trim() : fallbackToken;\n const prop = extractCssCustomProp(token);\n\n if (prop) {\n return readTokenTimeMs(token, readTokenTimeMs(fallbackToken, 200));\n }\n\n return parseCssTimeMs(token, readTokenTimeMs(fallbackToken, 200));\n}\n\n/** Whether the user has requested reduced non-essential motion. */\nexport function prefersReducedMotion(): boolean {\n return typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\n/**\n * Resolve an animation-coupled duration. Returns zero under reduced motion so\n * JS cleanup stays synchronized with CSS that removes the corresponding motion.\n */\nexport function resolveMotionTimeMs(\n value: number | string | undefined,\n fallbackToken: string,\n): number {\n return prefersReducedMotion() ? 0 : resolveCssTimeMs(value, fallbackToken);\n}\n", "/** CSS custom property for scroll-edge fade depth (dimension token or length). */\nexport const SCROLL_EDGE_FADE_SIZE_VAR = '--ds-scroll-edge-fade-size';\n\nexport const SCROLL_EDGE_FADE_DEFAULT_SIZE = 'var(--dimension-size-600)';\n\nexport type ScrollEdgeFadeEdge = 'top' | 'bottom' | 'left' | 'right';\n\nexport type ScrollEdgeFadeSizeToken =\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';\n\nexport type ScrollEdgeFadeSize = ScrollEdgeFadeSizeToken | (string & {});\n\nconst SIZE_VALUE: Record<ScrollEdgeFadeSizeToken, 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 SIZE_REF = `var(${SCROLL_EDGE_FADE_SIZE_VAR}, ${SCROLL_EDGE_FADE_DEFAULT_SIZE})`;\n\nexport interface ScrollEdgeFadeOptions {\n /** One or more edges to fade. */\n edges: ScrollEdgeFadeEdge | ScrollEdgeFadeEdge[];\n /**\n * Reveal and hide configured fades from the container's own scroll position.\n * Uses CSS scroll-driven animations with a static-fade fallback; no listener required.\n */\n scrollAware?: boolean;\n /**\n * When true, removes the complete mask. Pass a map to remove only configured\n * edges that are flush when scroll state already lives in JavaScript.\n */\n atEnd?: boolean | Partial<Record<ScrollEdgeFadeEdge, boolean>>;\n /** Force the mask off regardless of scroll position (`ds-fade` `visible={false}`). */\n hidden?: boolean;\n}\n\n/** Resolve a dimension size token name or raw CSS length for `--ds-scroll-edge-fade-size`. */\nexport function resolveScrollEdgeFadeSize(\n size: ScrollEdgeFadeSize = 'size-600',\n height?: string,\n): string {\n if (height) return height;\n return Object.prototype.hasOwnProperty.call(SIZE_VALUE, size)\n ? SIZE_VALUE[size as ScrollEdgeFadeSizeToken]\n : size;\n}\n\n/** Inline style map setting fade depth on a scroll container. */\nexport function scrollEdgeFadeSizeStyle(\n size: ScrollEdgeFadeSize = 'size-600',\n height?: string,\n): Record<string, string> {\n return {\n [SCROLL_EDGE_FADE_SIZE_VAR]: resolveScrollEdgeFadeSize(size, height),\n };\n}\n\n/**\n * Alpha mask for a scroll container edge \u2014 content fades to transparent so\n * textured backgrounds (shell gradients, images) show through.\n */\nexport function scrollEdgeFadeMaskImage(edge: ScrollEdgeFadeEdge): string {\n switch (edge) {\n case 'top':\n return `linear-gradient(to bottom, transparent 0, #000 ${SIZE_REF}, #000 100%)`;\n case 'bottom':\n return `linear-gradient(to bottom, #000 0, #000 calc(100% - ${SIZE_REF}), transparent 100%)`;\n case 'left':\n return `linear-gradient(to right, transparent 0, #000 ${SIZE_REF}, #000 100%)`;\n case 'right':\n return `linear-gradient(to right, #000 0, #000 calc(100% - ${SIZE_REF}), transparent 100%)`;\n }\n}\n\n/** Inline style map for a masked scroll region (single edge). */\nexport function scrollEdgeFadeMaskStyle(\n edge: ScrollEdgeFadeEdge,\n size: ScrollEdgeFadeSize = 'size-600',\n height?: string,\n): Record<string, string> {\n const mask = scrollEdgeFadeMaskImage(edge);\n return {\n ...scrollEdgeFadeSizeStyle(size, height),\n WebkitMaskImage: mask,\n maskImage: mask,\n WebkitMaskSize: '100% 100%',\n maskSize: '100% 100%',\n };\n}\n\n/** Class map for `scroll-edge-fade` modifiers \u2014 pair with `scroll-edge-fade.css`. */\nexport function scrollEdgeFadeClassMap(opts: ScrollEdgeFadeOptions): Record<string, boolean> {\n const edges = Array.isArray(opts.edges) ? opts.edges : [opts.edges];\n const classes: Record<string, boolean> = {\n 'scroll-edge-fade': true,\n 'scroll-edge-fade--scroll-aware': opts.scrollAware === true,\n 'scroll-edge-fade--hidden': opts.hidden === true,\n };\n\n for (const edge of edges) {\n classes[`scroll-edge-fade--${edge}`] = true;\n }\n\n const { atEnd } = opts;\n if (atEnd === true) {\n classes['scroll-edge-fade--at-end'] = true;\n } else if (atEnd && typeof atEnd === 'object') {\n for (const edge of edges) {\n if (atEnd[edge]) {\n classes[`scroll-edge-fade--${edge}-at-edge`] = true;\n }\n }\n }\n\n return classes;\n}\n\n/** Whether a scroll container is flush with the given edge (within `threshold` px). */\nexport function isScrollAtEdge(\n el: HTMLElement,\n edge: ScrollEdgeFadeEdge,\n threshold = 2,\n): boolean {\n switch (edge) {\n case 'top':\n return el.scrollTop <= threshold;\n case 'bottom':\n return el.scrollHeight - el.scrollTop - el.clientHeight <= threshold;\n case 'left':\n return el.scrollLeft <= threshold;\n case 'right':\n return el.scrollWidth - el.scrollLeft - el.clientWidth <= threshold;\n }\n}\n", "import {\n dimensionIconographyMd,\n dimensionIconographySm,\n dimensionIconographyXs,\n dimensionMenuWidthXs,\n dimensionPanelWidth2xs,\n dimensionPanelWidthLg,\n dimensionPanelWidthMd,\n dimensionRadius025,\n dimensionSize200,\n dimensionSize300,\n dimensionSize400,\n dimensionSize600,\n dimensionSize800,\n dimensionSpace100,\n dimensionSpace050,\n dimensionSpace200,\n dimensionSpace300,\n dimensionSpace400,\n dimensionStrokeWidth012,\n dimensionStrokeWidth025,\n dimensionStrokeWidth037,\n typographyLineheightLg,\n typographyLineheightMd,\n typographyLineheightSm,\n typographyLineheightXl,\n typographyLineheightXs,\n effectAnimationDelayLong2,\n effectAnimationDelayMedium1,\n effectAnimationDelayMedium3,\n effectAnimationDelayInstant,\n effectAnimationDelayShort2,\n effectAnimationDurationMedium1,\n effectAnimationDurationShort3,\n effectMotionShort2,\n effectMotionShort3,\n} from '@ds-mo/tokens/ts';\n\n/** TokoMo CSS custom-property names for shared component defaults (runtime resolution). */\nexport const TOKEN_DEFAULTS = {\n space050: dimensionSpace050,\n space100: dimensionSpace100,\n space200: dimensionSpace200,\n space300: dimensionSpace300,\n space400: dimensionSpace400,\n radius025: dimensionRadius025,\n strokeWidth012: dimensionStrokeWidth012,\n strokeWidth025: dimensionStrokeWidth025,\n strokeWidth037: dimensionStrokeWidth037,\n size200: dimensionSize200,\n size300: dimensionSize300,\n size400: dimensionSize400,\n size600: dimensionSize600,\n size800: dimensionSize800,\n iconographyMd: dimensionIconographyMd,\n iconographySm: dimensionIconographySm,\n iconographyXs: dimensionIconographyXs,\n panelWidth2xs: dimensionPanelWidth2xs,\n panelWidthMd: dimensionPanelWidthMd,\n panelWidthLg: dimensionPanelWidthLg,\n menuWidthXs: dimensionMenuWidthXs,\n lineheightLg: typographyLineheightLg,\n lineheightMd: typographyLineheightMd,\n lineheightSm: typographyLineheightSm,\n lineheightXl: typographyLineheightXl,\n lineheightXs: typographyLineheightXs,\n motionShort2: effectMotionShort2,\n motionShort3: effectMotionShort3,\n animationDurationShort3: effectAnimationDurationShort3,\n animationDurationMedium1: effectAnimationDurationMedium1,\n animationDelayInstant: effectAnimationDelayInstant,\n animationDelayMedium1: effectAnimationDelayMedium1,\n animationDelayMedium3: effectAnimationDelayMedium3,\n animationDelayShort2: effectAnimationDelayShort2,\n animationDelayLong2: effectAnimationDelayLong2,\n /** Unmeasured menu height fallback: 20\u00D7 base (160px at default scale). */\n menuFallbackHeight: 'calc(var(--dimension-size-base) * 20)',\n /** Unmeasured tooltip width fallback: size-800 + size-200 (80px). */\n tooltipFallbackWidth: 'calc(var(--dimension-size-800) + var(--dimension-size-200))',\n /** Fill-mode donut diameter floor: 16\u00D7 size-base (128px). */\n donutFillMin: 'calc(var(--dimension-size-base) * 16)',\n /** Fill-mode donut diameter ceiling: 24\u00D7 size-base (192px). */\n donutFillMax: 'calc(var(--dimension-size-base) * 24)',\n} as const;\n\nexport type TokenDefaultKey = keyof typeof TOKEN_DEFAULTS;\n\n/** Valid CSS length strings for overlay offset props \u2014 bind on `sideOffset` / `alignOffset` in hosts. */\nexport const TOKEN_CSS_LENGTHS = {\n space050: `var(${dimensionSpace050})`,\n space200: `var(${dimensionSpace200})`,\n menuWidthXs: `var(${dimensionMenuWidthXs})`,\n} as const;\n", "/**\n * Shared \"required field\" validity contract for form-associated custom\n * elements (Checkbox, Radio, Switch, Input, Select, \u2026).\n *\n * Each control computes its own `missing` condition (what counts as empty\n * differs: unchecked, no value, no selection, \u2026) and its own form value, then\n * calls `setRequiredValidity` instead of hand-rolling the `setValidity` call\n * and the default message string.\n *\n * @see AGENTS.md \u2014 \"Required-field validity\"\n */\n\nexport const DEFAULT_REQUIRED_MESSAGE = 'This field is required.';\n\n/** Sets or clears the `valueMissing` validity flag on a form-associated element. */\nexport function setRequiredValidity(\n internals: ElementInternals,\n missing: boolean,\n message: string,\n): void {\n internals.setValidity(missing ? { valueMissing: true } : {}, missing ? message : '');\n}\n", "export type FormControlState = File | FormData | string | null;\n\nexport interface SetFormControlValueOptions {\n inactive?: boolean;\n state?: FormControlState;\n}\n\nexport interface SetRepeatedFormControlValueOptions {\n inactive?: boolean;\n state?: FormControlState;\n}\n\n/**\n * Set one form-associated value while consistently omitting inactive controls.\n * Pass `state` only when restoration differs from the submitted value.\n */\nexport function setFormControlValue(\n internals: ElementInternals,\n value: File | string | null,\n options: SetFormControlValueOptions = {}\n): void {\n const submission = options.inactive ? null : value;\n if (options.state === undefined) {\n internals.setFormValue(submission);\n return;\n }\n internals.setFormValue(submission, options.state);\n}\n\n/**\n * Submit repeated values under one field name and preserve a serialized array\n * for browser form-state restoration.\n */\nexport function setRepeatedFormControlValue(\n internals: ElementInternals,\n name: string | null | undefined,\n values: readonly (number | string)[],\n options: SetRepeatedFormControlValueOptions = {}\n): void {\n if (options.inactive || !name || values.length === 0) {\n internals.setFormValue(null);\n return;\n }\n\n const data = new FormData();\n values.forEach(value => data.append(name, String(value)));\n internals.setFormValue(data, options.state ?? JSON.stringify(values));\n}\n\nexport function restoreStringFormState(\n state: FormControlState,\n fallback: string = ''\n): string {\n return typeof state === 'string' ? state : fallback;\n}\n\nexport function restoreStringArrayFormState(state: FormControlState): string[] {\n if (typeof state !== 'string') return [];\n try {\n const restored: unknown = JSON.parse(state);\n return Array.isArray(restored)\n ? restored.filter((value): value is string => typeof value === 'string')\n : [];\n } catch {\n return [];\n }\n}\n\nexport function restoreNumberArrayFormState(\n state: FormControlState,\n maximumValues?: number\n): number[] {\n if (typeof state !== 'string') return [];\n try {\n const restored: unknown = JSON.parse(state);\n if (!Array.isArray(restored)) return [];\n const values = restored\n .map(value => typeof value === 'number' ? value : Number(value))\n .filter(value => Number.isFinite(value));\n return maximumValues === undefined ? values : values.slice(0, maximumValues);\n } catch {\n return [];\n }\n}\n", "export type SafeUrlProtocol = 'blob:' | 'http:' | 'https:' | 'mailto:';\n\nexport interface ResolveSafeUrlOptions {\n protocols?: readonly SafeUrlProtocol[];\n baseUrl?: string | URL;\n}\n\nconst DEFAULT_PROTOCOLS: readonly SafeUrlProtocol[] = ['http:', 'https:'];\n\n/**\n * Resolve a consumer-authored URL only when its protocol is explicitly allowed.\n * Relative URLs use the current document base in browser rendering; server-side\n * callers can provide `baseUrl` when they intentionally support relative input.\n */\nexport function resolveSafeUrl(\n value: string | null | undefined,\n options: ResolveSafeUrlOptions = {}\n): string | undefined {\n const candidate = value?.trim();\n if (!candidate) return undefined;\n\n const baseUrl =\n options.baseUrl ??\n (typeof document === 'undefined' ? undefined : document.baseURI);\n\n try {\n const url = baseUrl === undefined\n ? new URL(candidate)\n : new URL(candidate, baseUrl);\n const protocols = options.protocols ?? DEFAULT_PROTOCOLS;\n return protocols.includes(url.protocol as SafeUrlProtocol) ? url.href : undefined;\n } catch {\n return undefined;\n }\n}\n", "/** Shared width fit for interactive controls (buttons, select, \u2026). */\nexport type ControlWidth = 'hug' | 'fill';\n\n/** Host / control class map for `width=\"hug\" | \"fill\"`. */\nexport function controlWidthClass(width: ControlWidth): Record<string, boolean> {\n return {\n 'ds-control-width--hug': width === 'hug',\n 'ds-control-width--fill': width === 'fill',\n };\n}\n", "export default function ascending(a, b) {\n return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n", "export default function descending(a, b) {\n return a == null || b == null ? NaN\n : b < a ? -1\n : b > a ? 1\n : b >= a ? 0\n : NaN;\n}\n", "import ascending from \"./ascending.js\";\nimport descending from \"./descending.js\";\n\nexport default function bisector(f) {\n let compare1, compare2, delta;\n\n // If an accessor is specified, promote it to a comparator. In this case we\n // can test whether the search value is (self-) comparable. We can\u2019t do this\n // for a comparator (except for specific, known comparators) because we can\u2019t\n // tell if the comparator is symmetric, and an asymmetric comparator can\u2019t be\n // used to test whether a single value is comparable.\n if (f.length !== 2) {\n compare1 = ascending;\n compare2 = (d, x) => ascending(f(d), x);\n delta = (d, x) => f(d) - x;\n } else {\n compare1 = f === ascending || f === descending ? f : zero;\n compare2 = f;\n delta = f;\n }\n\n function left(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function right(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) <= 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function center(a, x, lo = 0, hi = a.length) {\n const i = left(a, x, lo, hi - 1);\n return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n }\n\n return {left, center, right};\n}\n\nfunction zero() {\n return 0;\n}\n", "export default function number(x) {\n return x === null ? NaN : +x;\n}\n\nexport function* numbers(values, valueof) {\n if (valueof === undefined) {\n for (let value of values) {\n if (value != null && (value = +value) >= value) {\n yield value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n yield value;\n }\n }\n }\n}\n", "import ascending from \"./ascending.js\";\nimport bisector from \"./bisector.js\";\nimport number from \"./number.js\";\n\nconst ascendingBisect = bisector(ascending);\nexport const bisectRight = ascendingBisect.right;\nexport const bisectLeft = ascendingBisect.left;\nexport const bisectCenter = bisector(number).center;\nexport default bisectRight;\n", "export default function count(values, valueof) {\n let count = 0;\n if (valueof === undefined) {\n for (let value of values) {\n if (value != null && (value = +value) >= value) {\n ++count;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n ++count;\n }\n }\n }\n return count;\n}\n", "export default function variance(values, valueof) {\n let count = 0;\n let delta;\n let mean = 0;\n let sum = 0;\n if (valueof === undefined) {\n for (let value of values) {\n if (value != null && (value = +value) >= value) {\n delta = value - mean;\n mean += delta / ++count;\n sum += delta * (value - mean);\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n delta = value - mean;\n mean += delta / ++count;\n sum += delta * (value - mean);\n }\n }\n }\n if (count > 1) return sum / (count - 1);\n}\n", "import variance from \"./variance.js\";\n\nexport default function deviation(values, valueof) {\n const v = variance(values, valueof);\n return v ? Math.sqrt(v) : v;\n}\n", "export default function extent(values, valueof) {\n let min;\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n return [min, max];\n}\n", "export default function identity(x) {\n return x;\n}\n", "var array = Array.prototype;\n\nexport var slice = array.slice;\nexport var map = array.map;\n", "export default function constant(x) {\n return () => x;\n}\n", "const e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\nfunction tickSpec(start, stop, count) {\n const step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log10(step)),\n error = step / Math.pow(10, power),\n factor = error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1;\n let i1, i2, inc;\n if (power < 0) {\n inc = Math.pow(10, -power) / factor;\n i1 = Math.round(start * inc);\n i2 = Math.round(stop * inc);\n if (i1 / inc < start) ++i1;\n if (i2 / inc > stop) --i2;\n inc = -inc;\n } else {\n inc = Math.pow(10, power) * factor;\n i1 = Math.round(start / inc);\n i2 = Math.round(stop / inc);\n if (i1 * inc < start) ++i1;\n if (i2 * inc > stop) --i2;\n }\n if (i2 < i1 && 0.5 <= count && count < 2) return tickSpec(start, stop, count * 2);\n return [i1, i2, inc];\n}\n\nexport default function ticks(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n if (!(count > 0)) return [];\n if (start === stop) return [start];\n const reverse = stop < start, [i1, i2, inc] = reverse ? tickSpec(stop, start, count) : tickSpec(start, stop, count);\n if (!(i2 >= i1)) return [];\n const n = i2 - i1 + 1, ticks = new Array(n);\n if (reverse) {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) * inc;\n } else {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) * inc;\n }\n return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n return tickSpec(start, stop, count)[2];\n}\n\nexport function tickStep(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n const reverse = stop < start, inc = reverse ? tickIncrement(stop, start, count) : tickIncrement(start, stop, count);\n return (reverse ? -1 : 1) * (inc < 0 ? 1 / -inc : inc);\n}\n", "import {tickIncrement} from \"./ticks.js\";\n\nexport default function nice(start, stop, count) {\n let prestep;\n while (true) {\n const step = tickIncrement(start, stop, count);\n if (step === prestep || step === 0 || !isFinite(step)) {\n return [start, stop];\n } else if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n } else if (step < 0) {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n }\n prestep = step;\n }\n}\n", "import count from \"../count.js\";\n\nexport default function thresholdSturges(values) {\n return Math.max(1, Math.ceil(Math.log(count(values)) / Math.LN2) + 1);\n}\n", "import {slice} from \"./array.js\";\nimport bisect from \"./bisect.js\";\nimport constant from \"./constant.js\";\nimport extent from \"./extent.js\";\nimport identity from \"./identity.js\";\nimport nice from \"./nice.js\";\nimport ticks, {tickIncrement} from \"./ticks.js\";\nimport sturges from \"./threshold/sturges.js\";\n\nexport default function bin() {\n var value = identity,\n domain = extent,\n threshold = sturges;\n\n function histogram(data) {\n if (!Array.isArray(data)) data = Array.from(data);\n\n var i,\n n = data.length,\n x,\n step,\n values = new Array(n);\n\n for (i = 0; i < n; ++i) {\n values[i] = value(data[i], i, data);\n }\n\n var xz = domain(values),\n x0 = xz[0],\n x1 = xz[1],\n tz = threshold(values, x0, x1);\n\n // Convert number of thresholds into uniform thresholds, and nice the\n // default domain accordingly.\n if (!Array.isArray(tz)) {\n const max = x1, tn = +tz;\n if (domain === extent) [x0, x1] = nice(x0, x1, tn);\n tz = ticks(x0, x1, tn);\n\n // If the domain is aligned with the first tick (which it will by\n // default), then we can use quantization rather than bisection to bin\n // values, which is substantially faster.\n if (tz[0] <= x0) step = tickIncrement(x0, x1, tn);\n\n // If the last threshold is coincident with the domain\u2019s upper bound, the\n // last bin will be zero-width. If the default domain is used, and this\n // last threshold is coincident with the maximum input value, we can\n // extend the niced upper bound by one tick to ensure uniform bin widths;\n // otherwise, we simply remove the last threshold. Note that we don\u2019t\n // coerce values or the domain to numbers, and thus must be careful to\n // compare order (>=) rather than strict equality (===)!\n if (tz[tz.length - 1] >= x1) {\n if (max >= x1 && domain === extent) {\n const step = tickIncrement(x0, x1, tn);\n if (isFinite(step)) {\n if (step > 0) {\n x1 = (Math.floor(x1 / step) + 1) * step;\n } else if (step < 0) {\n x1 = (Math.ceil(x1 * -step) + 1) / -step;\n }\n }\n } else {\n tz.pop();\n }\n }\n }\n\n // Remove any thresholds outside the domain.\n // Be careful not to mutate an array owned by the user!\n var m = tz.length, a = 0, b = m;\n while (tz[a] <= x0) ++a;\n while (tz[b - 1] > x1) --b;\n if (a || b < m) tz = tz.slice(a, b), m = b - a;\n\n var bins = new Array(m + 1),\n bin;\n\n // Initialize bins.\n for (i = 0; i <= m; ++i) {\n bin = bins[i] = [];\n bin.x0 = i > 0 ? tz[i - 1] : x0;\n bin.x1 = i < m ? tz[i] : x1;\n }\n\n // Assign data to bins by value, ignoring any outside the domain.\n if (isFinite(step)) {\n if (step > 0) {\n for (i = 0; i < n; ++i) {\n if ((x = values[i]) != null && x0 <= x && x <= x1) {\n bins[Math.min(m, Math.floor((x - x0) / step))].push(data[i]);\n }\n }\n } else if (step < 0) {\n for (i = 0; i < n; ++i) {\n if ((x = values[i]) != null && x0 <= x && x <= x1) {\n const j = Math.floor((x0 - x) * step);\n bins[Math.min(m, j + (tz[j] <= x))].push(data[i]); // handle off-by-one due to rounding\n }\n }\n }\n } else {\n for (i = 0; i < n; ++i) {\n if ((x = values[i]) != null && x0 <= x && x <= x1) {\n bins[bisect(tz, x, 0, m)].push(data[i]);\n }\n }\n }\n\n return bins;\n }\n\n histogram.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(_), histogram) : value;\n };\n\n histogram.domain = function(_) {\n return arguments.length ? (domain = typeof _ === \"function\" ? _ : constant([_[0], _[1]]), histogram) : domain;\n };\n\n histogram.thresholds = function(_) {\n return arguments.length ? (threshold = typeof _ === \"function\" ? _ : constant(Array.isArray(_) ? slice.call(_) : _), histogram) : threshold;\n };\n\n return histogram;\n}\n", "import max from \"./max.js\";\nimport maxIndex from \"./maxIndex.js\";\nimport min from \"./min.js\";\nimport minIndex from \"./minIndex.js\";\nimport quickselect from \"./quickselect.js\";\nimport number, {numbers} from \"./number.js\";\nimport {ascendingDefined} from \"./sort.js\";\nimport greatest from \"./greatest.js\";\n\nexport default function quantile(values, p, valueof) {\n values = Float64Array.from(numbers(values, valueof));\n if (!(n = values.length) || isNaN(p = +p)) return;\n if (p <= 0 || n < 2) return min(values);\n if (p >= 1) return max(values);\n var n,\n i = (n - 1) * p,\n i0 = Math.floor(i),\n value0 = max(quickselect(values, i0).subarray(0, i0 + 1)),\n value1 = min(values.subarray(i0 + 1));\n return value0 + (value1 - value0) * (i - i0);\n}\n\nexport function quantileSorted(values, p, valueof = number) {\n if (!(n = values.length) || isNaN(p = +p)) return;\n if (p <= 0 || n < 2) return +valueof(values[0], 0, values);\n if (p >= 1) return +valueof(values[n - 1], n - 1, values);\n var n,\n i = (n - 1) * p,\n i0 = Math.floor(i),\n value0 = +valueof(values[i0], i0, values),\n value1 = +valueof(values[i0 + 1], i0 + 1, values);\n return value0 + (value1 - value0) * (i - i0);\n}\n\nexport function quantileIndex(values, p, valueof = number) {\n if (isNaN(p = +p)) return;\n numbers = Float64Array.from(values, (_, i) => number(valueof(values[i], i, values)));\n if (p <= 0) return minIndex(numbers);\n if (p >= 1) return maxIndex(numbers);\n var numbers,\n index = Uint32Array.from(values, (_, i) => i),\n j = numbers.length - 1,\n i = Math.floor(j * p);\n quickselect(index, i, 0, j, (i, j) => ascendingDefined(numbers[i], numbers[j]));\n i = greatest(index.subarray(0, i + 1), (i) => numbers[i]);\n return i >= 0 ? i : -1;\n}\n", "import { bin as d3Bin, deviation, extent, quantileSorted, ticks } from 'd3-array';\nimport type { CurveFactory } from 'd3-shape';\n\nexport type ChartValue = string | number | Date;\nexport type ChartKey = string | number;\nexport type ChartDataIntent =\n | 'brand'\n | 'caution'\n | 'negative'\n | 'neutral'\n | 'positive'\n | 'warning';\n\nexport type ChartChannel<TDatum, TValue> =\n | Extract<keyof TDatum, string>\n | ((datum: TDatum, index: number, data: readonly TDatum[]) => TValue);\n\nexport type ChartVisual<TDatum, TValue> =\n | TValue\n | ((datum: TDatum, index: number, data: readonly TDatum[]) => TValue);\n\n/** Structural boundary accepted by the chart compiler for native D3 scales. */\nexport type ChartScale = ((value: ChartValue) => unknown) & {\n copy?: () => ChartScale;\n domain: (...values: unknown[]) => unknown;\n range: (...values: unknown[]) => unknown;\n bandwidth?: () => number;\n ticks?: (count?: number) => ChartValue[];\n tickFormat?: (count?: number) => (value: ChartValue) => string;\n nice?: (count?: number) => unknown;\n};\n\n/** A configured D3 scale or a zero-argument D3 scale factory. */\nexport type ChartScaleSource = ChartScale | (() => unknown);\n\nexport interface ChartTickOptions {\n count?: number;\n values?: readonly ChartValue[];\n format?: (value: ChartValue, locale: string) => string;\n /** Minimum measured gap between adjacent tick labels, in CSS pixels. */\n spacing?: number;\n /** Length of the tick stub extending away from the plot, in CSS pixels. */\n size?: number;\n /** Gap between the end of a tick stub and its label, in CSS pixels. */\n padding?: number;\n /** Rotation in degrees. Negative values rotate counter-clockwise. */\n rotate?: number;\n}\n\nexport interface ChartAxisPresentation {\n label?: string;\n /** Render the axis baseline. Defaults to true. */\n line?: boolean;\n ticks?: ChartTickOptions;\n}\n\nexport interface ChartAxisOptions {\n scale: ChartScaleSource;\n nice?: boolean;\n grid?: boolean;\n axis?: false | ChartAxisPresentation;\n}\n\nexport interface ChartMargin {\n top?: number;\n right?: number;\n bottom?: number;\n left?: number;\n}\n\nexport type ChartFocusMode =\n | 'none'\n | 'nearest'\n | 'nearest-x'\n | 'nearest-y'\n | 'group-x'\n | 'group-y';\n\nexport interface ChartPoint<TDatum = unknown> {\n key: ChartKey;\n sceneKey: string;\n markId: string;\n datum: TDatum;\n datumIndex: number;\n groupValue?: ChartValue;\n groupLabel?: string;\n xValue: ChartValue;\n yValue: ChartValue;\n /** Primary semantic value for polar, heatmap, and distribution marks. */\n value?: ChartValue;\n angleValue?: ChartValue;\n radiusValue?: ChartValue;\n x: number;\n y: number;\n color: string;\n}\n\nexport interface ChartTooltipItem {\n label: string;\n value: string;\n color?: string;\n}\n\nexport interface ChartTooltipContext<TDatum = unknown> {\n locale: string;\n primary: ChartPoint<TDatum>;\n points: readonly ChartPoint<TDatum>[];\n}\n\nexport interface ChartTooltipOptions<TDatum = unknown> {\n format?: (point: ChartPoint<TDatum>, locale: string) => string;\n formatGroupHeading?: (\n points: readonly ChartPoint<TDatum>[],\n locale: string,\n ) => string;\n formatGroupItem?: (\n point: ChartPoint<TDatum>,\n locale: string,\n ) => ChartTooltipItem;\n}\n\nexport type ChartTooltip<TDatum = unknown> = boolean | ChartTooltipOptions<TDatum>;\n\nexport interface ChartColorOptions {\n domain?: readonly ChartValue[];\n range?: readonly string[];\n}\n\nexport interface ChartBuildContext {\n width: number;\n height: number;\n}\n\nexport interface ChartCartesianCoordinate {\n type?: 'cartesian';\n}\n\nexport interface ChartPolarCoordinate {\n type: 'polar';\n /** Radians measured clockwise from twelve o'clock. */\n startAngle?: number;\n /** Radians measured clockwise from twelve o'clock. */\n endAngle?: number;\n /** Default inner radius as a fraction of the available radius. */\n innerRadius?: number;\n /** Outer radius as a fraction of the available radius. */\n outerRadius?: number;\n grid?: 'none' | 'polygon';\n}\n\nexport type ChartCoordinate = ChartCartesianCoordinate | ChartPolarCoordinate;\n\nexport interface ChartPolarAxisOptions {\n domain?: readonly ChartValue[];\n label?: string;\n ticks?: ChartTickOptions;\n grid?: boolean;\n}\n\nexport interface ChartCenterContent {\n value?: string;\n caption?: string;\n}\n\nexport interface ChartCenterOptions extends ChartCenterContent {\n /** Optional focused content. Authored content remains the default. */\n focused?: (point: ChartPoint, locale: string) => ChartCenterContent;\n}\n\nexport type ChartMarkKind =\n | 'polar'\n | 'line-y'\n | 'area-y'\n | 'bar-x'\n | 'bar-y'\n | 'box-y'\n | 'dot'\n | 'rule-x'\n | 'rule-y'\n | 'band-x'\n | 'band-y'\n | 'rect'\n | 'cell'\n | 'text'\n | 'arc'\n | 'radial-line'\n | 'radial-area'\n | 'radial-dot';\n\nexport interface ChartMark<TDatum = unknown> {\n kind: ChartMarkKind;\n data: readonly TDatum[];\n options: ChartMarkOptions<TDatum>;\n}\n\nexport interface ChartPolarContainerOptions {\n id?: string;\n marks: readonly ChartMark[];\n angle?: ChartPolarAxisOptions;\n radius?: ChartAxisOptions;\n /** Radians measured clockwise from twelve o'clock. */\n startAngle?: number;\n /** Radians measured clockwise from twelve o'clock. */\n endAngle?: number;\n innerRadius?: number;\n outerRadius?: number;\n grid?: 'none' | 'polygon';\n center?: ChartCenterOptions;\n}\n\nexport interface ChartBaseMarkOptions<TDatum> {\n id?: string;\n /** Exclude decorative layers from semantic focus while retaining rendering. */\n interactive?: boolean;\n key?: ChartChannel<TDatum, ChartKey>;\n z?: ChartChannel<TDatum, ChartValue | null | undefined>;\n color?: ChartChannel<TDatum, ChartValue | null | undefined>;\n value?: ChartChannel<TDatum, ChartValue | null | undefined>;\n fill?: ChartVisual<TDatum, string>;\n stroke?: ChartVisual<TDatum, string>;\n opacity?: ChartVisual<TDatum, number>;\n fillOpacity?: ChartVisual<TDatum, number>;\n strokeOpacity?: ChartVisual<TDatum, number>;\n strokeWidth?: ChartVisual<TDatum, number | string>;\n strokeDasharray?: ChartVisual<TDatum, string>;\n}\n\nexport interface ChartLineYOptions<TDatum> extends ChartBaseMarkOptions<TDatum> {\n x?: ChartChannel<TDatum, ChartValue | null | undefined>;\n y?: ChartChannel<TDatum, number | null | undefined>;\n curve?: CurveFactory;\n}\n\nexport interface ChartAreaYOptions<TDatum> extends ChartBaseMarkOptions<TDatum> {\n x?: ChartChannel<TDatum, ChartValue | null | undefined>;\n y?: ChartChannel<TDatum, number | null | undefined>;\n y1?: ChartChannel<TDatum, number | null | undefined>;\n y2?: ChartChannel<TDatum, number | null | undefined>;\n curve?: CurveFactory;\n}\n\nexport type ChartBarLayout = 'single' | 'grouped' | 'stacked';\n\nexport interface ChartBarOptions<TDatum> extends ChartBaseMarkOptions<TDatum> {\n x?: ChartChannel<TDatum, ChartValue | null | undefined>;\n y?: ChartChannel<TDatum, ChartValue | null | undefined>;\n x1?: ChartChannel<TDatum, number | null | undefined>;\n x2?: ChartChannel<TDatum, number | null | undefined>;\n y1?: ChartChannel<TDatum, number | null | undefined>;\n y2?: ChartChannel<TDatum, number | null | undefined>;\n layout?: ChartBarLayout;\n inset?: ChartVisual<TDatum, number>;\n radius?: ChartVisual<TDatum, number | string>;\n}\n\nexport interface ChartBoxYOptions<TDatum> extends ChartBaseMarkOptions<TDatum> {\n x?: ChartChannel<TDatum, ChartValue | null | undefined>;\n y?: ChartChannel<TDatum, number | null | undefined>;\n /** Tukey whisker multiplier. */\n whisker?: number;\n inset?: number;\n radius?: number | string;\n}\n\nexport interface ChartDotOptions<TDatum> extends ChartBaseMarkOptions<TDatum> {\n x?: ChartChannel<TDatum, ChartValue | null | undefined>;\n y?: ChartChannel<TDatum, ChartValue | null | undefined>;\n r?: ChartVisual<TDatum, number | string>;\n}\n\nexport interface ChartRuleOptions<TDatum> extends ChartBaseMarkOptions<TDatum> {\n x?: ChartChannel<TDatum, ChartValue | null | undefined>;\n y?: ChartChannel<TDatum, ChartValue | null | undefined>;\n}\n\nexport interface ChartBandOptions<TDatum> extends ChartBaseMarkOptions<TDatum> {\n x1?: ChartChannel<TDatum, number | null | undefined>;\n x2?: ChartChannel<TDatum, number | null | undefined>;\n y1?: ChartChannel<TDatum, number | null | undefined>;\n y2?: ChartChannel<TDatum, number | null | undefined>;\n}\n\nexport interface ChartRectOptions<TDatum> extends ChartBaseMarkOptions<TDatum> {\n x1?: ChartChannel<TDatum, number | null | undefined>;\n x2?: ChartChannel<TDatum, number | null | undefined>;\n y1?: ChartChannel<TDatum, number | null | undefined>;\n y2?: ChartChannel<TDatum, number | null | undefined>;\n radius?: ChartVisual<TDatum, number | string>;\n inset?: ChartVisual<TDatum, number>;\n}\n\nexport interface ChartCellOptions<TDatum> extends ChartBaseMarkOptions<TDatum> {\n x?: ChartChannel<TDatum, ChartValue | null | undefined>;\n y?: ChartChannel<TDatum, ChartValue | null | undefined>;\n intensity?: ChartChannel<TDatum, number | null | undefined>;\n intent?: ChartDataIntent;\n minimumOpacity?: number;\n maximumOpacity?: number;\n inset?: number;\n radius?: number | string;\n}\n\nexport interface ChartTextOptions<TDatum> extends ChartBaseMarkOptions<TDatum> {\n x?: ChartChannel<TDatum, ChartValue | null | undefined>;\n y?: ChartChannel<TDatum, ChartValue | null | undefined>;\n text?: ChartChannel<TDatum, string | number | null | undefined>;\n fontFamily?: ChartVisual<TDatum, string>;\n fontSize?: ChartVisual<TDatum, number | string>;\n fontWeight?: ChartVisual<TDatum, number | string>;\n textAnchor?: ChartVisual<TDatum, 'start' | 'middle' | 'end'>;\n dx?: ChartVisual<TDatum, number>;\n dy?: ChartVisual<TDatum, number>;\n}\n\nexport interface ChartArcOptions<TDatum> extends ChartBaseMarkOptions<TDatum> {\n theta1?: ChartChannel<TDatum, number | null | undefined>;\n theta2?: ChartChannel<TDatum, number | null | undefined>;\n innerRadius?: ChartVisual<TDatum, number>;\n outerRadius?: ChartVisual<TDatum, number>;\n cornerRadius?: ChartVisual<TDatum, number>;\n padAngle?: ChartVisual<TDatum, number>;\n label?: ChartChannel<TDatum, string | null | undefined>;\n}\n\nexport interface ChartRadialOptions<TDatum> extends ChartBaseMarkOptions<TDatum> {\n angle?: ChartChannel<TDatum, ChartValue | null | undefined>;\n radius?: ChartChannel<TDatum, number | null | undefined>;\n radius1?: ChartChannel<TDatum, number | null | undefined>;\n radius2?: ChartChannel<TDatum, number | null | undefined>;\n curve?: CurveFactory;\n r?: ChartVisual<TDatum, number | string>;\n}\n\nexport type ChartMarkOptions<TDatum> =\n | ChartLineYOptions<TDatum>\n | ChartAreaYOptions<TDatum>\n | ChartBarOptions<TDatum>\n | ChartBoxYOptions<TDatum>\n | ChartDotOptions<TDatum>\n | ChartRuleOptions<TDatum>\n | ChartBandOptions<TDatum>\n | ChartRectOptions<TDatum>\n | ChartCellOptions<TDatum>\n | ChartTextOptions<TDatum>\n | ChartArcOptions<TDatum>\n | ChartRadialOptions<TDatum>;\n\nexport interface ChartSpec<TDatum = unknown> {\n marks: readonly ChartMark<TDatum>[] | readonly ChartMark<unknown>[];\n coordinate?: ChartCoordinate;\n x?: ChartAxisOptions;\n y?: ChartAxisOptions;\n angle?: ChartPolarAxisOptions;\n radius?: ChartAxisOptions;\n center?: ChartCenterOptions;\n margin?: number | ChartMargin;\n guides?: boolean;\n /** Clip graphical marks to the solved plot rectangle. Defaults to true. */\n clip?: boolean;\n color?: ChartColorOptions;\n focus?: ChartFocusMode;\n tooltip?: ChartTooltip<TDatum>;\n maxFocusDistance?: number;\n}\n\nexport type ChartSpecBuilder<TDatum = unknown> = (\n context: ChartBuildContext,\n) => ChartSpec<TDatum>;\n\nexport interface ChartDefinition<TDatum = unknown> {\n chart: ChartSpec<TDatum> | ChartSpecBuilder<TDatum>;\n}\n\nexport interface NormalizedStackDatum<TDatum> {\n data: TDatum;\n group: ChartKey;\n series: ChartKey;\n value: number;\n proportion: number;\n}\n\nexport interface NormalizeStackOptions<TDatum> {\n group: ChartChannel<TDatum, ChartKey>;\n series: ChartChannel<TDatum, ChartKey>;\n value: ChartChannel<TDatum, number>;\n}\n\nexport interface ChartPieDatum<TDatum> {\n data: TDatum;\n index: number;\n key: ChartKey;\n label: string;\n value: number;\n theta1: number;\n theta2: number;\n}\n\nexport interface ChartPieOptions<TDatum> {\n value: ChartChannel<TDatum, number>;\n key?: ChartChannel<TDatum, ChartKey>;\n label?: ChartChannel<TDatum, string>;\n sort?: (a: TDatum, b: TDatum) => number;\n}\n\nexport interface ChartBinDatum<TDatum> {\n key: string;\n x1: number;\n x2: number;\n x: number;\n count: number;\n cumulative: number;\n rows: readonly TDatum[];\n}\n\nexport interface ChartBinOptions<TDatum> {\n value: ChartChannel<TDatum, number>;\n thresholds?: number | readonly number[];\n}\n\nexport interface ChartDensityDatum {\n key: string;\n x: number;\n density: number;\n}\n\nexport interface ChartDensityOptions<TDatum> {\n value: ChartChannel<TDatum, number>;\n samples?: number;\n bandwidth?: number;\n}\n\nexport function defineChart<TDatum>(\n chart: ChartSpec<TDatum> | ChartSpecBuilder<TDatum>,\n): ChartDefinition<TDatum> {\n return { chart };\n}\n\nfunction createMark<TDatum, TOptions extends ChartMarkOptions<TDatum>>(\n kind: ChartMarkKind,\n data: readonly TDatum[],\n options: TOptions,\n): ChartMark<TDatum> {\n return { kind, data, options };\n}\n\n/** Compose polar marks and guides inside the shared chart scene. */\nexport function polar(options: ChartPolarContainerOptions): ChartMark {\n return { kind: 'polar', data: [], options: options as unknown as ChartMarkOptions<unknown> };\n}\n\nconst identity = <TValue>(value: TValue): TValue => value;\n\nexport function lineY<TDatum>(data: readonly TDatum[], options: ChartLineYOptions<TDatum> = {}): ChartMark<TDatum> {\n return createMark('line-y', data, { x: options.x ?? ((_, index) => index), y: options.y ?? (identity as ChartChannel<TDatum, number>), ...options });\n}\n\nexport function areaY<TDatum>(data: readonly TDatum[], options: ChartAreaYOptions<TDatum> = {}): ChartMark<TDatum> {\n return createMark('area-y', data, { x: options.x ?? ((_, index) => index), y: options.y ?? (identity as ChartChannel<TDatum, number>), ...options });\n}\n\nexport function barY<TDatum>(data: readonly TDatum[], options: ChartBarOptions<TDatum> = {}): ChartMark<TDatum> {\n return createMark('bar-y', data, { x: options.x ?? ((_, index) => index), y: options.y ?? (identity as ChartChannel<TDatum, number>), ...options });\n}\n\nexport function barX<TDatum>(data: readonly TDatum[], options: ChartBarOptions<TDatum> = {}): ChartMark<TDatum> {\n return createMark('bar-x', data, { x: options.x ?? (identity as ChartChannel<TDatum, number>), y: options.y ?? ((_, index) => index), ...options });\n}\n\nexport function boxY<TDatum>(data: readonly TDatum[], options: ChartBoxYOptions<TDatum> = {}): ChartMark<TDatum> {\n return createMark('box-y', data, { x: options.x ?? (() => 'distribution'), y: options.y ?? (identity as ChartChannel<TDatum, number>), ...options });\n}\n\nexport function dot<TDatum>(data: readonly TDatum[], options: ChartDotOptions<TDatum> = {}): ChartMark<TDatum> {\n return createMark('dot', data, { x: options.x ?? ((_, index) => index), y: options.y ?? (identity as ChartChannel<TDatum, number>), ...options });\n}\n\nexport function ruleX<TDatum>(data: readonly TDatum[], options: ChartRuleOptions<TDatum> = {}): ChartMark<TDatum> {\n return createMark('rule-x', data, { x: options.x ?? (identity as ChartChannel<TDatum, ChartValue>), ...options });\n}\n\nexport function ruleY<TDatum>(data: readonly TDatum[], options: ChartRuleOptions<TDatum> = {}): ChartMark<TDatum> {\n return createMark('rule-y', data, { y: options.y ?? (identity as ChartChannel<TDatum, ChartValue>), ...options });\n}\n\nexport function bandX<TDatum>(data: readonly TDatum[], options: ChartBandOptions<TDatum>): ChartMark<TDatum> {\n return createMark('band-x', data, options);\n}\n\nexport function bandY<TDatum>(data: readonly TDatum[], options: ChartBandOptions<TDatum>): ChartMark<TDatum> {\n return createMark('band-y', data, options);\n}\n\nexport function rect<TDatum>(data: readonly TDatum[], options: ChartRectOptions<TDatum>): ChartMark<TDatum> {\n return createMark('rect', data, options);\n}\n\nexport function cell<TDatum>(data: readonly TDatum[], options: ChartCellOptions<TDatum>): ChartMark<TDatum> {\n return createMark('cell', data, options);\n}\n\nexport function textMark<TDatum>(data: readonly TDatum[], options: ChartTextOptions<TDatum> = {}): ChartMark<TDatum> {\n return createMark('text', data, { x: options.x ?? ((_, index) => index), y: options.y ?? ((_, index) => index), text: options.text ?? (identity as ChartChannel<TDatum, string>), ...options });\n}\n\nexport function arcMark<TDatum>(data: readonly TDatum[], options: ChartArcOptions<TDatum> = {}): ChartMark<TDatum> {\n return createMark('arc', data, { theta1: options.theta1 ?? ('theta1' as ChartChannel<TDatum, number>), theta2: options.theta2 ?? ('theta2' as ChartChannel<TDatum, number>), ...options });\n}\n\nexport function radialLine<TDatum>(data: readonly TDatum[], options: ChartRadialOptions<TDatum> = {}): ChartMark<TDatum> {\n return createMark('radial-line', data, { angle: options.angle ?? ((_, index) => index), radius: options.radius ?? (identity as ChartChannel<TDatum, number>), ...options });\n}\n\nexport function radialArea<TDatum>(data: readonly TDatum[], options: ChartRadialOptions<TDatum> = {}): ChartMark<TDatum> {\n return createMark('radial-area', data, { angle: options.angle ?? ((_, index) => index), radius: options.radius ?? (identity as ChartChannel<TDatum, number>), ...options });\n}\n\nexport function radialDot<TDatum>(data: readonly TDatum[], options: ChartRadialOptions<TDatum> = {}): ChartMark<TDatum> {\n return createMark('radial-dot', data, { angle: options.angle ?? ((_, index) => index), radius: options.radius ?? (identity as ChartChannel<TDatum, number>), ...options });\n}\n\nexport function channelValue<TDatum, TValue>(\n datum: TDatum,\n index: number,\n data: readonly TDatum[],\n channel: ChartChannel<TDatum, TValue> | undefined,\n): TValue | undefined {\n if (channel === undefined) return undefined;\n if (typeof channel === 'function') return channel(datum, index, data);\n if (datum == null || typeof datum !== 'object') return undefined;\n return (datum as Record<string, TValue>)[channel];\n}\n\nexport function visualValue<TDatum, TValue>(\n datum: TDatum,\n index: number,\n data: readonly TDatum[],\n value: ChartVisual<TDatum, TValue> | undefined,\n fallback: TValue,\n): TValue {\n return typeof value === 'function'\n ? (value as (datum: TDatum, index: number, data: readonly TDatum[]) => TValue)(datum, index, data)\n : (value ?? fallback);\n}\n\nexport function normalizeStack<TDatum>(\n data: readonly TDatum[],\n options: NormalizeStackOptions<TDatum>,\n): NormalizedStackDatum<TDatum>[] {\n const rows = data.map((datum, index) => {\n const group = channelValue(datum, index, data, options.group);\n const series = channelValue(datum, index, data, options.series);\n const value = channelValue(datum, index, data, options.value);\n if (group === undefined || series === undefined) throw new TypeError('normalizeStack requires a group and series key for every row.');\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) throw new RangeError('normalizeStack values must be finite, non-negative numbers.');\n return { data: datum, group, series, value };\n });\n const totals = new Map<string, number>();\n rows.forEach(row => totals.set(chartValueKey(row.group), (totals.get(chartValueKey(row.group)) ?? 0) + row.value));\n return rows.map(row => ({ ...row, proportion: (totals.get(chartValueKey(row.group)) ?? 0) > 0 ? row.value / (totals.get(chartValueKey(row.group)) as number) : 0 }));\n}\n\nexport function pieLayout<TDatum>(data: readonly TDatum[], options: ChartPieOptions<TDatum>): ChartPieDatum<TDatum>[] {\n const ordered = data.map((datum, index) => ({ datum, index }));\n if (options.sort) ordered.sort((a, b) => options.sort?.(a.datum, b.datum) ?? 0);\n const values = ordered.map(({ datum, index }) => {\n const value = channelValue(datum, index, data, options.value);\n return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : 0;\n });\n const total = values.reduce((sum, value) => sum + value, 0);\n let position = 0;\n return ordered.flatMap(({ datum, index }, orderedIndex) => {\n const value = values[orderedIndex] ?? 0;\n if (!(value > 0) || !(total > 0)) return [];\n const theta1 = position;\n position += value / total;\n const key = channelValue(datum, index, data, options.key) ?? index;\n const label = channelValue(datum, index, data, options.label) ?? String(key);\n return [{ data: datum, index, key, label, value, theta1, theta2: position }];\n });\n}\n\nexport function binX<TDatum>(data: readonly TDatum[], options: ChartBinOptions<TDatum>): ChartBinDatum<TDatum>[] {\n const generator = d3Bin<TDatum, number>().value((datum, index, rows) => channelValue(datum, index, Array.from(rows), options.value) ?? Number.NaN);\n if (typeof options.thresholds === 'number') generator.thresholds(options.thresholds);\n else if (options.thresholds !== undefined) generator.thresholds([...options.thresholds]);\n const bins = generator(data as TDatum[]);\n let cumulative = 0;\n return bins.flatMap(bin => {\n const x1 = bin.x0;\n const x2 = bin.x1;\n if (x1 === undefined || x2 === undefined) return [];\n cumulative += bin.length;\n return [{ key: `bin:${x1}:${x2}`, x1, x2, x: (x1 + x2) / 2, count: bin.length, cumulative, rows: [...bin] }];\n });\n}\n\nexport function cumulativeBins<TDatum>(bins: readonly ChartBinDatum<TDatum>[]): ChartBinDatum<TDatum>[] {\n let cumulative = 0;\n return bins.map(bin => ({ ...bin, cumulative: (cumulative += bin.count) }));\n}\n\nexport function densityX<TDatum>(data: readonly TDatum[], options: ChartDensityOptions<TDatum>): ChartDensityDatum[] {\n const values = data.map((datum, index) => channelValue(datum, index, data, options.value)).filter((value): value is number => typeof value === 'number' && Number.isFinite(value)).sort((a, b) => a - b);\n if (values.length === 0) return [];\n const [minimum = 0, maximum = minimum + 1] = extent(values);\n const span = Math.max(Number.EPSILON, maximum - minimum);\n const sampleCount = Math.max(8, options.samples ?? 48);\n const sampleValues = ticks(minimum, maximum, sampleCount);\n const sigma = deviation(values) ?? span / 6;\n const bandwidth = Math.max(Number.EPSILON, options.bandwidth ?? 1.06 * sigma * Math.pow(values.length, -0.2));\n const normalizer = 1 / (Math.sqrt(2 * Math.PI) * bandwidth * values.length);\n return sampleValues.map(x => ({\n key: `density:${x}`,\n x,\n density: values.reduce((sum, value) => {\n const u = (x - value) / bandwidth;\n return sum + Math.exp(-0.5 * u * u);\n }, 0) * normalizer,\n }));\n}\n\nexport function boxStatistics(values: readonly number[], whisker = 1.5) {\n const sorted = values.filter(Number.isFinite).sort((a, b) => a - b);\n if (sorted.length === 0) return undefined;\n const q1 = quantileSorted(sorted, 0.25) as number;\n const median = quantileSorted(sorted, 0.5) as number;\n const q3 = quantileSorted(sorted, 0.75) as number;\n const iqr = q3 - q1;\n const lowerFence = q1 - whisker * iqr;\n const upperFence = q3 + whisker * iqr;\n const lower = sorted.find(value => value >= lowerFence) ?? sorted[0];\n const upper = [...sorted].reverse().find(value => value <= upperFence) ?? sorted[sorted.length - 1];\n return { q1, median, q3, lower, upper, outliers: sorted.filter(value => value < lower || value > upper) };\n}\n\nexport function chartValueKey(value: unknown): string {\n if (value instanceof Date) return `date:${value.getTime()}`;\n return `${typeof value}:${String(value)}`;\n}\n", "import type { TextVariant } from '../components/Text/text-types';\n\n/** Shared public control sizes. Typography is derived; it is not a separate density API. */\nexport type ControlSize = 'lg' | 'md' | 'sm' | 'xs';\n\n/** Complete text variant selected internally by each control size. */\nexport const CONTROL_TEXT_VARIANT: Record<ControlSize, TextVariant> = {\n lg: 'text-body-large',\n md: 'text-body-medium',\n sm: 'text-body-small',\n xs: 'text-caption',\n};\n\n/** Supporting copy paired with each control density in two-line choice rows. */\nexport const CONTROL_SUPPORTING_TEXT_VARIANT: Record<ControlSize, TextVariant> = {\n lg: 'text-body-medium',\n md: 'text-body-small',\n sm: 'text-caption',\n xs: 'text-caption',\n};\n", "import type { AnchoredAlign } from './anchored-position';\n\n/**\n * `choice-cell` aligns the first/last interactive row edge with the anchor,\n * allowing the popup frame to extend by the section inset. `popup-frame`\n * aligns the popup frame itself and is reserved for deliberate custom geometry.\n */\nexport type ChoicePopupAnchorAlignment = 'choice-cell' | 'popup-frame';\n\nexport interface ChoicePopupAlignOffsetInput {\n align: AnchoredAlign;\n alignOffsetPx: number;\n sectionInsetPx: number;\n anchorAlignment?: ChoicePopupAnchorAlignment;\n}\n\n/**\n * Resolve the cross-axis offset for a choice popup. Authored `alignOffsetPx`\n * remains an additive nudge after the shared inner-cell alignment is applied.\n */\nexport function resolveChoicePopupAlignOffset({\n align,\n alignOffsetPx,\n sectionInsetPx,\n anchorAlignment = 'choice-cell',\n}: ChoicePopupAlignOffsetInput): number {\n if (anchorAlignment === 'popup-frame' || align === 'center') return alignOffsetPx;\n return alignOffsetPx + (align === 'start' ? -sectionInsetPx : sectionInsetPx);\n}\n\n/** Minimum popup width that keeps both choice-cell edges aligned to a trigger. */\nexport function choicePopupMinWidth(anchorWidth: number, sectionInsetPx: number): number {\n return anchorWidth + sectionInsetPx * 2;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["px", "count", "count", "count", "ticks", "count", "step", "bin", "identity", "bin"]
|
|
7
7
|
}
|
|
@@ -6,6 +6,9 @@ export declare const TOKEN_DEFAULTS: {
|
|
|
6
6
|
readonly space300: "--dimension-space-300";
|
|
7
7
|
readonly space400: "--dimension-space-400";
|
|
8
8
|
readonly radius025: "--dimension-radius-025";
|
|
9
|
+
readonly strokeWidth012: "--dimension-stroke-width-012";
|
|
10
|
+
readonly strokeWidth025: "--dimension-stroke-width-025";
|
|
11
|
+
readonly strokeWidth037: "--dimension-stroke-width-037";
|
|
9
12
|
readonly size200: "--dimension-size-200";
|
|
10
13
|
readonly size300: "--dimension-size-300";
|
|
11
14
|
readonly size400: "--dimension-size-400";
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"Banner has a real bottom boundary, no radius, no elevation, no icon, no timeout, and no internal queue."
|
|
60
60
|
],
|
|
61
61
|
"responsiveBehavior": [
|
|
62
|
-
"Applications select orientation explicitly. Horizontal keeps copy and actions in one row, with actions top-aligned to dismissal. Vertical puts actions below copy on the 16px text boundary and keeps controls 16px above the bottom boundary.",
|
|
62
|
+
"Applications select orientation explicitly. Horizontal keeps copy and actions in one row, with actions top-aligned to dismissal. Vertical puts actions below copy on the 16px text boundary and keeps controls 16px above the bottom boundary; without actions it reserves no trailing row and keeps the copy visually balanced between the top and bottom edges.",
|
|
63
63
|
"When placed in ShellApp's banner slot, the banner spans the complete application above navigation, workspace, and tools.",
|
|
64
64
|
"ShellApp reserves the mobile top safe area once above the banner and keeps the banner visible while mobile tools or navigation surfaces replace the routed stage."
|
|
65
65
|
],
|
|
@@ -321,7 +321,7 @@
|
|
|
321
321
|
"files": [
|
|
322
322
|
{
|
|
323
323
|
"path": "src/wc/components/Banner/Banner.css",
|
|
324
|
-
"content": "@import '../../utils/forced-colors.css';\n@import '../../utils/chrome-header.css';\n\n:host {\n display: grid;\n overflow: hidden;\n min-width: 0;\n grid-template-rows: 0fr;\n transition: grid-template-rows var(--effect-animation-duration-short-3)\n var(--_banner-motion-easing);\n\n --ds-banner-background: var(--color-background-faint-neutral);\n --ds-banner-heading: var(--color-foreground-primary);\n --ds-banner-description: var(--color-foreground-secondary);\n --ds-banner-border: var(--color-border-tertiary);\n --_banner-motion-easing: var(--effect-animation-easing-ease-in-out, ease);\n}\n\n:host(.banner--open) {\n grid-template-rows: 1fr;\n --_banner-motion-easing: var(--effect-animation-easing-ease-out, ease-out);\n}\n\n:host(.banner--closing) {\n --_banner-motion-easing: var(--effect-animation-easing-ease-in, ease-in);\n}\n\n:host(.banner--hidden) {\n display: none;\n}\n\n.banner-overflow {\n min-height: 0;\n overflow: visible;\n}\n\n.banner-surface {\n display: flex;\n position: relative;\n width: 100%;\n padding-inline-end: calc(var(--dimension-size-400) + var(--dimension-space-200));\n color: var(--ds-banner-description);\n background-color: var(--ds-banner-background);\n border-bottom: var(--dimension-stroke-width-012) solid var(--ds-banner-border);\n transform: translateY(-100%);\n transition: transform var(--effect-animation-duration-short-3) var(--_banner-motion-easing);\n}\n\n:host(.banner--open) .banner-surface {\n transform: translateY(0);\n}\n\n.banner-copy {\n flex-basis: var(--dimension-card-width-sm);\n}\n\n:host(.banner--orientation-horizontal) .banner-surface {\n flex-wrap: nowrap;\n}\n\n:host(.banner--orientation-vertical) .banner-copy {\n flex-basis: 100%;\n}\n\n.banner-copy-flow {\n box-sizing: border-box;\n min-width: 0;\n padding-inline: var(--ds-control-label-inset, var(--dimension-space-025));\n color: var(--ds-banner-description);\n}\n\n.banner-heading {\n display: inline-block;\n width: auto;\n max-width: 100%;\n margin-inline-end: var(--dimension-space-100);\n vertical-align: baseline;\n color: var(--ds-banner-heading);\n}\n\n.banner-description {\n color: var(--ds-banner-description);\n}\n\n.banner-actions {\n display: flex;\n align-items: center;\n flex: 0 0 auto;\n flex-wrap: nowrap;\n min-width: 0;\n gap: var(--dimension-space-100);\n}\n\n.banner-actions slot {\n display: contents;\n}\n\n.banner-actions ::slotted(:not(ds-button-unfilled)),\n.banner-actions ::slotted(ds-button-unfilled:nth-of-type(n + 3)) {\n display: none;\n}\n\n.banner-actions--empty {\n display: none;\n}\n\n.banner-trailing {\n align-self: flex-start;\n flex-wrap: nowrap;\n}\n\n:host(.banner--orientation-vertical.banner--has-actions) .banner-trailing {\n margin-inline: var(--dimension-space-100) auto;\n padding-block-end: var(--dimension-space-100);\n box-sizing: border-box;\n}\n\n:host(.banner--orientation-vertical) .banner-description {\n display: block;\n}\n\n:host(.banner--orientation-vertical) .banner-heading + .banner-description {\n margin-block-start: var(--dimension-space-050);\n}\n\n.banner-close {\n flex: 0 0 auto;\n}\n\n.banner-dismiss {\n position: absolute;\n inset-block-start: var(--dimension-space-100);\n inset-inline-end: var(--dimension-space-100);\n}\n\n:host(.banner--intent-neutral) {\n --ds-banner-faint-background: var(--color-background-faint-neutral);\n}\n\n:host(.banner--intent-brand) {\n --ds-banner-faint-background: var(--color-background-faint-brand);\n}\n\n:host(.banner--intent-positive) {\n --ds-banner-faint-background: var(--color-background-faint-positive);\n}\n\n:host(.banner--intent-warning) {\n --ds-banner-faint-background: var(--color-background-faint-warning);\n}\n\n:host(.banner--intent-caution) {\n --ds-banner-faint-background: var(--color-background-faint-caution);\n}\n\n:host(.banner--intent-negative) {\n --ds-banner-faint-background: var(--color-background-faint-negative);\n}\n\n:host(.banner--contrast-faint) {\n --ds-banner-background: var(--ds-banner-faint-background);\n --ds-banner-heading: var(--color-foreground-primary);\n --ds-banner-description: var(--color-foreground-secondary);\n --ds-banner-border: var(--color-border-tertiary);\n}\n\n:host(.banner--contrast-medium) {\n --ds-banner-background: var(--color-background-medium-neutral);\n --ds-banner-heading: var(--color-foreground-on-medium-background-primary);\n --ds-banner-description: var(--color-foreground-on-medium-background-secondary);\n --ds-banner-border: var(--color-border-on-medium-background-tertiary);\n}\n\n:host(.banner--intent-brand.banner--contrast-medium) { --ds-banner-background: var(--color-background-medium-brand); }\n:host(.banner--intent-positive.banner--contrast-medium) { --ds-banner-background: var(--color-background-medium-positive); }\n:host(.banner--intent-warning.banner--contrast-medium) { --ds-banner-background: var(--color-background-medium-warning); }\n:host(.banner--intent-caution.banner--contrast-medium) { --ds-banner-background: var(--color-background-medium-caution); }\n:host(.banner--intent-negative.banner--contrast-medium) { --ds-banner-background: var(--color-background-medium-negative); }\n\n:host(.banner--contrast-strong) {\n --ds-banner-background: var(--color-background-strong-neutral);\n --ds-banner-heading: var(--color-foreground-on-strong-background-primary);\n --ds-banner-description: var(--color-foreground-on-strong-background-secondary);\n --ds-banner-border: var(--color-border-on-strong-background-tertiary);\n}\n\n:host(.banner--intent-brand.banner--contrast-strong) { --ds-banner-background: var(--color-background-strong-brand); }\n:host(.banner--intent-positive.banner--contrast-strong) { --ds-banner-background: var(--color-background-strong-positive); }\n:host(.banner--intent-warning.banner--contrast-strong) { --ds-banner-background: var(--color-background-strong-warning); }\n:host(.banner--intent-caution.banner--contrast-strong) { --ds-banner-background: var(--color-background-strong-caution); }\n:host(.banner--intent-negative.banner--contrast-strong) { --ds-banner-background: var(--color-background-strong-negative); }\n\n:host(.banner--contrast-bold) {\n --ds-banner-background: var(--color-background-bold-neutral);\n --ds-banner-heading: var(--color-foreground-on-bold-background-primary);\n --ds-banner-description: var(--color-foreground-on-bold-background-secondary);\n --ds-banner-border: var(--color-border-on-bold-background-tertiary);\n}\n\n:host(.banner--intent-brand.banner--contrast-bold) { --ds-banner-background: var(--color-background-bold-brand); }\n:host(.banner--intent-positive.banner--contrast-bold) { --ds-banner-background: var(--color-background-bold-positive); }\n:host(.banner--intent-warning.banner--contrast-bold) { --ds-banner-background: var(--color-background-bold-warning); }\n:host(.banner--intent-caution.banner--contrast-bold) { --ds-banner-background: var(--color-background-bold-caution); }\n:host(.banner--intent-negative.banner--contrast-bold) { --ds-banner-background: var(--color-background-bold-negative); }\n\n@media (prefers-reduced-motion: reduce) {\n :host,\n .banner-surface {\n transition: none;\n }\n}\n\n@media (forced-colors: active) {\n .banner-surface {\n color: var(--ds-forced-color-content);\n background-color: var(--ds-forced-color-surface);\n border-bottom-color: var(--ds-forced-color-content);\n }\n\n .banner-heading,\n .banner-description {\n color: var(--ds-forced-color-content);\n }\n}\n",
|
|
324
|
+
"content": "@import '../../utils/forced-colors.css';\n@import '../../utils/chrome-header.css';\n\n:host {\n display: grid;\n overflow: hidden;\n min-width: 0;\n grid-template-rows: 0fr;\n transition: grid-template-rows var(--effect-animation-duration-short-3)\n var(--_banner-motion-easing);\n\n --ds-banner-background: var(--color-background-faint-neutral);\n --ds-banner-heading: var(--color-foreground-primary);\n --ds-banner-description: var(--color-foreground-secondary);\n --ds-banner-border: var(--color-border-tertiary);\n --_banner-motion-easing: var(--effect-animation-easing-ease-in-out, ease);\n}\n\n:host(.banner--open) {\n grid-template-rows: 1fr;\n --_banner-motion-easing: var(--effect-animation-easing-ease-out, ease-out);\n}\n\n:host(.banner--closing) {\n --_banner-motion-easing: var(--effect-animation-easing-ease-in, ease-in);\n}\n\n:host(.banner--hidden) {\n display: none;\n}\n\n.banner-overflow {\n min-height: 0;\n overflow: visible;\n}\n\n.banner-surface {\n display: flex;\n position: relative;\n width: 100%;\n padding-inline-end: calc(var(--dimension-size-400) + var(--dimension-space-200));\n color: var(--ds-banner-description);\n background-color: var(--ds-banner-background);\n border-bottom: var(--dimension-stroke-width-012) solid var(--ds-banner-border);\n transform: translateY(-100%);\n transition: transform var(--effect-animation-duration-short-3) var(--_banner-motion-easing);\n}\n\n:host(.banner--open) .banner-surface {\n transform: translateY(0);\n}\n\n.banner-copy {\n flex-basis: var(--dimension-card-width-sm);\n}\n\n:host(.banner--orientation-horizontal) .banner-surface {\n flex-wrap: nowrap;\n}\n\n:host(.banner--orientation-vertical) .banner-copy {\n flex-basis: 100%;\n}\n\n.banner-copy-flow {\n box-sizing: border-box;\n min-width: 0;\n padding-inline: var(--ds-control-label-inset, var(--dimension-space-025));\n color: var(--ds-banner-description);\n}\n\n.banner-heading {\n display: inline-block;\n width: auto;\n max-width: 100%;\n margin-inline-end: var(--dimension-space-100);\n vertical-align: baseline;\n color: var(--ds-banner-heading);\n}\n\n.banner-description {\n color: var(--ds-banner-description);\n}\n\n.banner-actions {\n display: flex;\n align-items: center;\n flex: 0 0 auto;\n flex-wrap: nowrap;\n min-width: 0;\n gap: var(--dimension-space-100);\n}\n\n.banner-actions slot {\n display: contents;\n}\n\n.banner-actions ::slotted(:not(ds-button-unfilled)),\n.banner-actions ::slotted(ds-button-unfilled:nth-of-type(n + 3)) {\n display: none;\n}\n\n.banner-actions--empty {\n display: none;\n}\n\n.banner-trailing {\n align-self: flex-start;\n flex-wrap: nowrap;\n}\n\n:host(.banner--orientation-vertical:not(.banner--has-actions)) .banner-trailing {\n display: contents;\n}\n\n:host(.banner--orientation-vertical.banner--has-actions) .banner-trailing {\n margin-inline: var(--dimension-space-100) auto;\n padding-block-end: var(--dimension-space-100);\n box-sizing: border-box;\n}\n\n:host(.banner--orientation-vertical) .banner-description {\n display: block;\n}\n\n:host(.banner--orientation-vertical) .banner-heading + .banner-description {\n margin-block-start: var(--dimension-space-050);\n}\n\n.banner-close {\n flex: 0 0 auto;\n}\n\n.banner-dismiss {\n position: absolute;\n inset-block-start: var(--dimension-space-100);\n inset-inline-end: var(--dimension-space-100);\n}\n\n:host(.banner--intent-neutral) {\n --ds-banner-faint-background: var(--color-background-faint-neutral);\n}\n\n:host(.banner--intent-brand) {\n --ds-banner-faint-background: var(--color-background-faint-brand);\n}\n\n:host(.banner--intent-positive) {\n --ds-banner-faint-background: var(--color-background-faint-positive);\n}\n\n:host(.banner--intent-warning) {\n --ds-banner-faint-background: var(--color-background-faint-warning);\n}\n\n:host(.banner--intent-caution) {\n --ds-banner-faint-background: var(--color-background-faint-caution);\n}\n\n:host(.banner--intent-negative) {\n --ds-banner-faint-background: var(--color-background-faint-negative);\n}\n\n:host(.banner--contrast-faint) {\n --ds-banner-background: var(--ds-banner-faint-background);\n --ds-banner-heading: var(--color-foreground-primary);\n --ds-banner-description: var(--color-foreground-secondary);\n --ds-banner-border: var(--color-border-tertiary);\n}\n\n:host(.banner--contrast-medium) {\n --ds-banner-background: var(--color-background-medium-neutral);\n --ds-banner-heading: var(--color-foreground-on-medium-background-primary);\n --ds-banner-description: var(--color-foreground-on-medium-background-secondary);\n --ds-banner-border: var(--color-border-on-medium-background-tertiary);\n}\n\n:host(.banner--intent-brand.banner--contrast-medium) { --ds-banner-background: var(--color-background-medium-brand); }\n:host(.banner--intent-positive.banner--contrast-medium) { --ds-banner-background: var(--color-background-medium-positive); }\n:host(.banner--intent-warning.banner--contrast-medium) { --ds-banner-background: var(--color-background-medium-warning); }\n:host(.banner--intent-caution.banner--contrast-medium) { --ds-banner-background: var(--color-background-medium-caution); }\n:host(.banner--intent-negative.banner--contrast-medium) { --ds-banner-background: var(--color-background-medium-negative); }\n\n:host(.banner--contrast-strong) {\n --ds-banner-background: var(--color-background-strong-neutral);\n --ds-banner-heading: var(--color-foreground-on-strong-background-primary);\n --ds-banner-description: var(--color-foreground-on-strong-background-secondary);\n --ds-banner-border: var(--color-border-on-strong-background-tertiary);\n}\n\n:host(.banner--intent-brand.banner--contrast-strong) { --ds-banner-background: var(--color-background-strong-brand); }\n:host(.banner--intent-positive.banner--contrast-strong) { --ds-banner-background: var(--color-background-strong-positive); }\n:host(.banner--intent-warning.banner--contrast-strong) { --ds-banner-background: var(--color-background-strong-warning); }\n:host(.banner--intent-caution.banner--contrast-strong) { --ds-banner-background: var(--color-background-strong-caution); }\n:host(.banner--intent-negative.banner--contrast-strong) { --ds-banner-background: var(--color-background-strong-negative); }\n\n:host(.banner--contrast-bold) {\n --ds-banner-background: var(--color-background-bold-neutral);\n --ds-banner-heading: var(--color-foreground-on-bold-background-primary);\n --ds-banner-description: var(--color-foreground-on-bold-background-secondary);\n --ds-banner-border: var(--color-border-on-bold-background-tertiary);\n}\n\n:host(.banner--intent-brand.banner--contrast-bold) { --ds-banner-background: var(--color-background-bold-brand); }\n:host(.banner--intent-positive.banner--contrast-bold) { --ds-banner-background: var(--color-background-bold-positive); }\n:host(.banner--intent-warning.banner--contrast-bold) { --ds-banner-background: var(--color-background-bold-warning); }\n:host(.banner--intent-caution.banner--contrast-bold) { --ds-banner-background: var(--color-background-bold-caution); }\n:host(.banner--intent-negative.banner--contrast-bold) { --ds-banner-background: var(--color-background-bold-negative); }\n\n@media (prefers-reduced-motion: reduce) {\n :host,\n .banner-surface {\n transition: none;\n }\n}\n\n@media (forced-colors: active) {\n .banner-surface {\n color: var(--ds-forced-color-content);\n background-color: var(--ds-forced-color-surface);\n border-bottom-color: var(--ds-forced-color-content);\n }\n\n .banner-heading,\n .banner-description {\n color: var(--ds-forced-color-content);\n }\n}\n",
|
|
325
325
|
"type": "registry:ui"
|
|
326
326
|
},
|
|
327
327
|
{
|