@ds-mo/ui 13.4.0 → 13.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +1 -1
  3. package/dist/agent.json +19 -21
  4. package/dist/components/ds-card-overview.js +1 -1
  5. package/dist/components/ds-card-overview.js.map +1 -1
  6. package/dist/components/ds-input.js +1 -1
  7. package/dist/components/ds-input.js.map +1 -1
  8. package/dist/components/ds-select.js +1 -1
  9. package/dist/components/ds-select.js.map +1 -1
  10. package/dist/docs/components.json +10 -16
  11. package/dist/mcp-data/registry/agent-activity.json +1 -1
  12. package/dist/mcp-data/registry/agent-response.json +1 -1
  13. package/dist/mcp-data/registry/agent-source-list.json +1 -1
  14. package/dist/mcp-data/registry/agent-tool-call.json +1 -1
  15. package/dist/mcp-data/registry/attachment-list.json +1 -1
  16. package/dist/mcp-data/registry/avatar.json +1 -1
  17. package/dist/mcp-data/registry/badge.json +1 -1
  18. package/dist/mcp-data/registry/bar-nav.json +1 -1
  19. package/dist/mcp-data/registry/bar-title.json +1 -1
  20. package/dist/mcp-data/registry/bar-workflow.json +1 -1
  21. package/dist/mcp-data/registry/breadcrumb.json +1 -1
  22. package/dist/mcp-data/registry/button-filled.json +1 -1
  23. package/dist/mcp-data/registry/button-unfilled.json +1 -1
  24. package/dist/mcp-data/registry/card-data-viz.json +1 -1
  25. package/dist/mcp-data/registry/card-overview.json +33 -35
  26. package/dist/mcp-data/registry/card-setting.json +1 -1
  27. package/dist/mcp-data/registry/chart-bar.json +1 -1
  28. package/dist/mcp-data/registry/chart-donut.json +1 -1
  29. package/dist/mcp-data/registry/chart-legend.json +1 -1
  30. package/dist/mcp-data/registry/chart-line.json +1 -1
  31. package/dist/mcp-data/registry/checkbox.json +1 -1
  32. package/dist/mcp-data/registry/chip.json +1 -1
  33. package/dist/mcp-data/registry/code-block.json +1 -1
  34. package/dist/mcp-data/registry/conversation-list-item.json +1 -1
  35. package/dist/mcp-data/registry/conversation-list-section.json +1 -1
  36. package/dist/mcp-data/registry/conversation-list.json +1 -1
  37. package/dist/mcp-data/registry/divider.json +1 -1
  38. package/dist/mcp-data/registry/empty-state.json +1 -1
  39. package/dist/mcp-data/registry/field.json +1 -1
  40. package/dist/mcp-data/registry/icon.json +1 -1
  41. package/dist/mcp-data/registry/input.json +6 -6
  42. package/dist/mcp-data/registry/loader.json +1 -1
  43. package/dist/mcp-data/registry/markdown.json +1 -1
  44. package/dist/mcp-data/registry/menu.json +1 -1
  45. package/dist/mcp-data/registry/message-actions.json +1 -1
  46. package/dist/mcp-data/registry/message-bubble.json +1 -1
  47. package/dist/mcp-data/registry/message-composer.json +1 -1
  48. package/dist/mcp-data/registry/message-scroller.json +1 -1
  49. package/dist/mcp-data/registry/message.json +1 -1
  50. package/dist/mcp-data/registry/mobile-bar-nav.json +1 -1
  51. package/dist/mcp-data/registry/mobile-header.json +1 -1
  52. package/dist/mcp-data/registry/mobile-section-switcher.json +1 -1
  53. package/dist/mcp-data/registry/mobile-sheet-nav.json +1 -1
  54. package/dist/mcp-data/registry/modal.json +1 -1
  55. package/dist/mcp-data/registry/panel-nav.json +1 -1
  56. package/dist/mcp-data/registry/panel-sub-nav.json +1 -1
  57. package/dist/mcp-data/registry/panel-tool-header.json +1 -1
  58. package/dist/mcp-data/registry/panel-tool-search.json +1 -1
  59. package/dist/mcp-data/registry/panel-tools.json +1 -1
  60. package/dist/mcp-data/registry/radio.json +1 -1
  61. package/dist/mcp-data/registry/registry.json +19 -21
  62. package/dist/mcp-data/registry/scroll-overlay.json +1 -1
  63. package/dist/mcp-data/registry/select.json +5 -5
  64. package/dist/mcp-data/registry/shell-app.json +1 -1
  65. package/dist/mcp-data/registry/shell-page.json +1 -1
  66. package/dist/mcp-data/registry/shell-tools.json +1 -1
  67. package/dist/mcp-data/registry/skeleton.json +1 -1
  68. package/dist/mcp-data/registry/slider.json +1 -1
  69. package/dist/mcp-data/registry/swatch-picker.json +1 -1
  70. package/dist/mcp-data/registry/switch.json +1 -1
  71. package/dist/mcp-data/registry/tab-group.json +1 -1
  72. package/dist/mcp-data/registry/tag.json +1 -1
  73. package/dist/mcp-data/registry/text.json +1 -1
  74. package/dist/mcp-data/registry/toast.json +1 -1
  75. package/dist/mcp-data/registry/tooltip-data-viz.json +1 -1
  76. package/dist/mcp-data/registry/tooltip.json +1 -1
  77. package/dist/mcp-data/registry/typing-indicator.json +1 -1
  78. package/dist/types/components/CardOverview/CardOverview.d.ts +10 -9
  79. package/dist/types/components/CardOverview/card-overview-controller.d.ts +13 -1
  80. package/dist/types/components/CardOverview/card-overview-types.d.ts +8 -2
  81. package/dist/types/components/CardOverview/index.d.ts +1 -1
  82. package/dist/types/components/Input/Input.d.ts +1 -1
  83. package/dist/types/components/Select/Select.d.ts +1 -1
  84. package/dist/types/components.d.ts +16 -16
  85. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"names":["resolveChoiceSections","options","sections","length","flattenChoiceSections","flatMap","section","choiceListUsesIcons","every","option","Boolean","icon","choiceListUsesSubtext","some","subtext","trim","filterChoiceSections","searchTerm","normalized","toLocaleLowerCase","map","sectionMatches","header","includes","filter","label","enabledChoiceIndexes","index","isInactive","moveChoiceIndex","currentIndex","direction","enabled","currentEnabledIndex","indexOf","start","findChoiceTypeaheadMatch","query","offset","Math","max","startsWith","choiceBackgroundClassMap","background","SelectController","constructor","state","this","triggerEl","popupEl","searchEl","typeahead","typeaheadTimer","outsideHandler","setTriggerElement","element","setPopupElement","setSearchElement","handleTriggerKeyDown","event","open","key","preventDefault","openPopup","isTypeaheadKey","searchable","handleTypeahead","handleListKeyDown","focusRingVisible","activeIndex","target","selectOption","closePopup","position","AnchoredPositionController","getAnchor","getPopup","measure","trigger","popup","isConnected","host","contains","sectionPadding","resolveCssLengthPx","TOKEN_DEFAULTS","space050","style","minWidth","choicePopupMinWidth","offsetWidth","anchorRect","getBoundingClientRect","popupWidth","popupHeight","offsetHeight","side","align","sideOffsetPx","alignOffsetPx","resolveChoicePopupAlignOffset","sectionInsetPx","viewportPadPx","viewportWidth","window","innerWidth","viewportHeight","innerHeight","apply","x","y","positionReady","topLayer","activeOptionId","isLoading","generatedId","undefined","connect","openChanged","disconnect","cancelPositionRetry","unbindPopupListeners","clearTimeout","setFocus","focus","optionsChanged","requestAnimationFrame","updatePosition","loadingChanged","bindPopupListeners","schedulePositionUpdate","scrollActiveOptionIntoView","searchChanged","activeIndexChanged","focusVisible","edge","isDisabled","preferredIndex","restoreFocus","focusSearchOrTrigger","metaKey","ctrlKey","altKey","repeatedCharacter","character","match","resetMs","resolveCssTimeMs","animationDurationMedium1","setTimeout","querySelector","scrollIntoView","block","inline","document","addEventListener","observe","removeEventListener","unobserve","cancel","onReady","schedule","update","selectCss","ICON_SIZE","lg","md","sm","xs","selectId","Select","__stencil_proxyCustomElement","HTMLElement","registerHost","multiple","value","disabled","required","requiredMessage","DEFAULT_REQUIRED_MESSAGE","placeholder","size","width","activeFill","hasBorder","allowClear","clearLabel","selectedLabel","searchPlaceholder","noResultsText","loadingLabel","error","ariaLabel","formDisabled","listboxId","errorId","initialValue","controller","createController","clearSelection","stopPropagation","dsChange","emit","dsClear","visibleOptions","owner","el","findIndex","scalarValue","componentWillLoad","normalizeValueForMode","Array","isArray","syncFormValue","componentDidLoad","disconnectedCallback","inactive","values","resolvedValues","setRepeatedFormControlValue","internals","name","hasSelection","setFormControlValue","missing","setRequiredValidity","onLoadingChange","onOpenChange","dsOpenChange","onSearchTermChange","onActiveIndexChange","formDisabledCallback","formResetCallback","formStateRestoreCallback","restoreStringFormState","restoreStringArrayFormState","allSections","allOptions","visibleSections","valid","Set","has","selectedOption","find","current","next","renderOption","usesIcons","usesSubtext","selected","active","h","ChoiceOptionRow","id","leading","class","checked","presentation","color","onHover","onSelect","render","showPlaceholder","count","textVariant","CONTROL_TEXT_VARIANT","iconSize","usesOptionIcons","usesOptionSubtext","showError","errorMessage","describedBy","ariaDescribedby","join","popupStyle","left","top","transform","round","zIndex","visibility","flatIndex","Host","controlWidthClass","ref","inputId","type","role","String","ariaLabelledby","onClick","onKeyDown","as","variant","lineTruncation","popover","ChoiceSearch","controls","activeDescendant","inputRef","onValueChange","body","divider","CONTROL_SUPPORTING_TEXT_VARIANT","emphasis","ChoiceFooter","summary","onClear","textId"],"sources":["src/wc/utils/choice-list.ts","src/wc/utils/select-controller.ts","src/wc/components/Select/Select.css?tag=ds-select&encapsulation=scoped","src/wc/components/Select/Select.tsx"],"sourcesContent":["export interface ChoiceOption {\n label: string;\n value: string;\n subtext?: string;\n /** Rendered only when every option in the complete list supplies an icon. */\n icon?: string;\n isInactive?: boolean;\n}\n\nexport interface ChoiceSection {\n header?: string;\n options: ChoiceOption[];\n divider?: boolean;\n}\n\nexport type ChoiceBackground =\n | 'faint'\n | 'medium'\n | 'bold'\n | 'strong'\n | 'translucent'\n | 'inverted'\n | 'media'\n | 'always-dark';\n\nexport function resolveChoiceSections(\n options: ChoiceOption[],\n sections: ChoiceSection[],\n): ChoiceSection[] {\n return sections.length > 0 ? sections : [{ options }];\n}\n\nexport function flattenChoiceSections(sections: ChoiceSection[]): ChoiceOption[] {\n return sections.flatMap(section => section.options);\n}\n\n/** A choice list has one stable row layout: every option has an icon, or none do. */\nexport function choiceListUsesIcons(options: ChoiceOption[]): boolean {\n return options.length > 0 && options.every(option => Boolean(option.icon));\n}\n\n/** Once one option needs supporting text, every row keeps the same two-line structure. */\nexport function choiceListUsesSubtext(options: ChoiceOption[]): boolean {\n return options.some(option => Boolean(option.subtext?.trim()));\n}\n\nexport function filterChoiceSections(\n sections: ChoiceSection[],\n searchTerm: string,\n): ChoiceSection[] {\n const normalized = searchTerm.trim().toLocaleLowerCase();\n if (!normalized) return sections;\n\n return sections\n .map(section => {\n const sectionMatches = section.header?.toLocaleLowerCase().includes(normalized);\n return {\n ...section,\n options: sectionMatches\n ? section.options\n : section.options.filter(option =>\n `${option.label} ${option.subtext ?? ''}`.toLocaleLowerCase().includes(normalized),\n ),\n };\n })\n .filter(section => section.options.length > 0);\n}\n\nexport function enabledChoiceIndexes(options: ChoiceOption[]): number[] {\n return options\n .map((option, index) => ({ option, index }))\n .filter(({ option }) => !option.isInactive)\n .map(({ index }) => index);\n}\n\nexport function moveChoiceIndex(\n options: ChoiceOption[],\n currentIndex: number,\n direction: 1 | -1,\n): number {\n const enabled = enabledChoiceIndexes(options);\n if (!enabled.length) return -1;\n\n const currentEnabledIndex = enabled.indexOf(currentIndex);\n const start = currentEnabledIndex >= 0 ? currentEnabledIndex : direction === 1 ? -1 : 0;\n return enabled[(start + direction + enabled.length) % enabled.length];\n}\n\nexport function findChoiceTypeaheadMatch(\n options: ChoiceOption[],\n query: string,\n currentIndex: number,\n): number {\n const normalized = query.toLocaleLowerCase();\n if (!normalized) return -1;\n\n for (let offset = 1; offset <= options.length; offset += 1) {\n const index = (Math.max(currentIndex, -1) + offset) % options.length;\n const option = options[index];\n if (!option.isInactive && option.label.toLocaleLowerCase().startsWith(normalized)) return index;\n }\n return -1;\n}\n\nexport function choiceBackgroundClassMap(\n background: ChoiceBackground | undefined,\n): Record<string, boolean> {\n return {\n 'ds-interaction-fill--on-faint': background === 'faint',\n 'ds-interaction-fill--on-medium': background === 'medium',\n 'ds-interaction-fill--on-bold': background === 'bold',\n 'ds-interaction-fill--on-strong': background === 'strong',\n 'ds-interaction-fill--on-translucent': background === 'translucent',\n 'ds-interaction-fill--on-inverted': background === 'inverted',\n 'ds-interaction-fill--on-media': background === 'media',\n 'ds-interaction-fill--on-always-dark': background === 'always-dark',\n };\n}\n","import { AnchoredPositionController } from './anchored-position-controller';\nimport {\n enabledChoiceIndexes,\n findChoiceTypeaheadMatch,\n moveChoiceIndex,\n type ChoiceOption,\n} from './choice-list';\nimport { choicePopupMinWidth, resolveChoicePopupAlignOffset } from './choice-popup-alignment';\nimport { resolveCssLengthPx } from './resolve-css-length-px';\nimport { resolveCssTimeMs } from './resolve-css-time-ms';\nimport { TOKEN_DEFAULTS } from './token-defaults';\n\ntype PopupPosition = { x: number; y: number };\n\nexport interface SelectControllerState<T extends ChoiceOption> {\n readonly host: HTMLElement;\n readonly generatedId: string;\n readonly options: T[];\n readonly searchable: boolean;\n readonly isLoading: boolean;\n readonly isDisabled: boolean;\n readonly preferredIndex: number;\n open: boolean;\n activeIndex: number;\n searchTerm: string;\n focusRingVisible: boolean;\n position: PopupPosition;\n positionReady: boolean;\n selectOption(option: T): void;\n}\n\n/**\n * Shared single/multiple Select interaction controller.\n *\n * Decorated Stencil state and scalar/array selection remain in each component;\n * this controller owns only popup lifecycle, focus, positioning, typeahead,\n * and listbox keyboard traversal. Anchored placement is delegated to\n * `AnchoredPositionController`; only the choice-cell measurement stays here.\n */\nexport class SelectController<T extends ChoiceOption> {\n private triggerEl: HTMLButtonElement | null = null;\n private popupEl: HTMLDivElement | null = null;\n private searchEl: HTMLInputElement | null = null;\n private typeahead = '';\n private typeaheadTimer: ReturnType<typeof setTimeout> | null = null;\n private outsideHandler: ((event: MouseEvent) => void) | null = null;\n private readonly position: AnchoredPositionController;\n\n constructor(private readonly state: SelectControllerState<T>) {\n this.position = new AnchoredPositionController({\n getAnchor: () => this.triggerEl,\n getPopup: () => this.popupEl,\n measure: (trigger, popup) => {\n if (!this.state.open || !popup.isConnected || !this.state.host.contains(popup)) return null;\n\n const sectionPadding = resolveCssLengthPx(TOKEN_DEFAULTS.space050, TOKEN_DEFAULTS.space050);\n popup.style.minWidth = `${choicePopupMinWidth(trigger.offsetWidth, sectionPadding)}px`;\n\n return {\n anchorRect: trigger.getBoundingClientRect(),\n popupWidth: popup.offsetWidth,\n popupHeight: popup.offsetHeight,\n side: 'bottom',\n align: 'start',\n sideOffsetPx: sectionPadding,\n alignOffsetPx: resolveChoicePopupAlignOffset({\n align: 'start',\n alignOffsetPx: 0,\n sectionInsetPx: sectionPadding,\n }),\n viewportPadPx: sectionPadding,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n };\n },\n apply: ({ x, y }) => {\n this.state.position = { x, y };\n this.state.positionReady = true;\n },\n topLayer: true,\n });\n }\n\n get activeOptionId(): string | undefined {\n return !this.state.isLoading && this.state.activeIndex >= 0\n ? `${this.state.generatedId}-option-${this.state.activeIndex}`\n : undefined;\n }\n\n setTriggerElement = (element: HTMLButtonElement | null) => {\n this.triggerEl = element;\n };\n\n setPopupElement = (element: HTMLDivElement | null) => {\n this.popupEl = element;\n };\n\n setSearchElement = (element: HTMLInputElement | null) => {\n this.searchEl = element;\n };\n\n connect() {\n if (this.state.open) this.openChanged(true);\n }\n\n disconnect() {\n this.cancelPositionRetry();\n this.unbindPopupListeners();\n if (this.typeaheadTimer) clearTimeout(this.typeaheadTimer);\n }\n\n setFocus() {\n this.triggerEl?.focus();\n }\n\n optionsChanged() {\n if (!this.state.open) return;\n const enabled = enabledChoiceIndexes(this.state.options);\n if (!enabled.includes(this.state.activeIndex)) this.state.activeIndex = enabled[0] ?? -1;\n requestAnimationFrame(() => this.updatePosition());\n }\n\n loadingChanged() {\n if (this.state.open) requestAnimationFrame(() => this.updatePosition());\n }\n\n openChanged(open: boolean) {\n if (open) {\n this.bindPopupListeners();\n this.schedulePositionUpdate(() => {\n this.scrollActiveOptionIntoView();\n if (this.state.searchable) this.searchEl?.focus();\n });\n return;\n }\n this.cancelPositionRetry();\n this.unbindPopupListeners();\n this.state.searchTerm = '';\n this.state.positionReady = false;\n }\n\n searchChanged() {\n this.state.activeIndex = enabledChoiceIndexes(this.state.options)[0] ?? -1;\n requestAnimationFrame(() => {\n this.updatePosition();\n this.scrollActiveOptionIntoView();\n });\n }\n\n activeIndexChanged() {\n requestAnimationFrame(() => this.scrollActiveOptionIntoView());\n }\n\n openPopup(focusVisible: boolean, edge?: 'first' | 'last') {\n if (this.state.isDisabled || (!this.state.options.length && !this.state.isLoading)) return;\n const enabled = enabledChoiceIndexes(this.state.options);\n this.state.activeIndex =\n edge === 'last'\n ? (enabled[enabled.length - 1] ?? -1)\n : this.state.preferredIndex >= 0\n ? this.state.preferredIndex\n : (enabled[0] ?? -1);\n this.state.focusRingVisible = focusVisible;\n this.state.open = true;\n }\n\n closePopup(restoreFocus = false) {\n if (!this.state.open) return;\n this.state.open = false;\n if (restoreFocus) requestAnimationFrame(() => this.triggerEl?.focus());\n }\n\n focusSearchOrTrigger() {\n requestAnimationFrame(() =>\n this.state.searchable ? this.searchEl?.focus() : this.triggerEl?.focus()\n );\n }\n\n handleTriggerKeyDown = (event: KeyboardEvent) => {\n if (!this.state.open) {\n if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n this.openPopup(true, event.key === 'ArrowUp' ? 'last' : 'first');\n } else if (this.isTypeaheadKey(event)) {\n event.preventDefault();\n this.openPopup(true);\n if (this.state.searchable) this.state.searchTerm = event.key;\n else this.handleTypeahead(event.key);\n }\n return;\n }\n this.handleListKeyDown(event);\n };\n\n handleListKeyDown = (event: KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.state.focusRingVisible = true;\n this.state.activeIndex = moveChoiceIndex(this.state.options, this.state.activeIndex, 1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.state.focusRingVisible = true;\n this.state.activeIndex = moveChoiceIndex(this.state.options, this.state.activeIndex, -1);\n break;\n case 'Home':\n event.preventDefault();\n this.state.focusRingVisible = true;\n this.state.activeIndex = enabledChoiceIndexes(this.state.options)[0] ?? -1;\n break;\n case 'End': {\n event.preventDefault();\n this.state.focusRingVisible = true;\n const enabled = enabledChoiceIndexes(this.state.options);\n this.state.activeIndex = enabled[enabled.length - 1] ?? -1;\n break;\n }\n case 'Enter':\n case ' ': {\n if (event.key === ' ' && this.state.searchable && event.target === this.searchEl) break;\n event.preventDefault();\n const option = this.state.options[this.state.activeIndex];\n if (option) this.state.selectOption(option);\n break;\n }\n case 'Escape':\n event.preventDefault();\n this.closePopup(true);\n break;\n case 'Tab':\n this.closePopup();\n break;\n default:\n if (!this.state.searchable && this.isTypeaheadKey(event)) {\n this.handleTypeahead(event.key);\n }\n }\n };\n\n private isTypeaheadKey(event: KeyboardEvent) {\n return event.key.length === 1 && !event.metaKey && !event.ctrlKey && !event.altKey;\n }\n\n private handleTypeahead(key: string) {\n if (this.typeaheadTimer) clearTimeout(this.typeaheadTimer);\n this.state.focusRingVisible = true;\n const normalized = key.toLocaleLowerCase();\n const repeatedCharacter =\n this.typeahead.length > 0 && [...this.typeahead].every(character => character === normalized);\n this.typeahead = repeatedCharacter ? normalized : `${this.typeahead}${normalized}`;\n const match = findChoiceTypeaheadMatch(\n this.state.options,\n this.typeahead,\n this.state.activeIndex\n );\n if (match >= 0) this.state.activeIndex = match;\n const resetMs = resolveCssTimeMs(\n TOKEN_DEFAULTS.animationDurationMedium1,\n TOKEN_DEFAULTS.animationDurationMedium1\n );\n this.typeaheadTimer = setTimeout(() => {\n this.typeahead = '';\n this.typeaheadTimer = null;\n }, resetMs);\n }\n\n private scrollActiveOptionIntoView() {\n if (!this.state.open || !this.activeOptionId) return;\n this.state.host\n .querySelector<HTMLElement>(`#${this.activeOptionId}`)\n ?.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n }\n\n private bindPopupListeners() {\n this.unbindPopupListeners();\n this.outsideHandler = event => {\n if (this.state.host.contains(event.target as Node)) return;\n this.closePopup();\n };\n document.addEventListener('mousedown', this.outsideHandler, true);\n this.position.observe();\n }\n\n private unbindPopupListeners() {\n if (this.outsideHandler) {\n document.removeEventListener('mousedown', this.outsideHandler, true);\n this.outsideHandler = null;\n }\n this.position.unobserve();\n }\n\n private cancelPositionRetry() {\n this.position.cancel();\n }\n\n private schedulePositionUpdate(onReady?: () => void) {\n if (!this.state.open) return;\n this.state.positionReady = false;\n this.position.schedule(onReady);\n }\n\n private updatePosition(): boolean {\n return this.position.update();\n }\n}\n","@import '../../utils/choice-list.css';\n@import '../../utils/control-parts.css';\n@import '../../utils/control-width.css';\n@import '../../utils/field-stack.css';\n@import '../../utils/search-control.css';\n@import '../../utils/typography.css';\n\n:host(.select-host) {\n display: inline-flex;\n position: relative;\n outline: none;\n --ds-select-fg: var(--color-foreground-secondary);\n --ds-select-fg-active: var(--color-foreground-primary);\n --ds-select-prefix-fg: var(--ds-select-fg);\n --ds-select-chevron-fg: var(--ds-select-fg);\n --ds-select-border: var(--color-border-secondary);\n}\n\n:host(.ds-control-width--fill),\n:host(.ds-control-width--fill) .trigger {\n width: 100%;\n}\n\n.trigger {\n justify-content: flex-start;\n background: transparent;\n border: none;\n border-radius: var(--ds-control-radius, var(--dimension-radius-025));\n color: var(--ds-select-fg);\n cursor: default;\n font-family: inherit;\n -webkit-user-select: none;\n user-select: none;\n overflow: hidden;\n transition: color var(--effect-motion-short-2);\n}\n\n.trigger--bordered {\n --ds-interaction-border-width: var(--dimension-stroke-width-012);\n --ds-interaction-border-color: var(--ds-select-border);\n}\n\n.trigger--has-value .trigger__label {\n color: var(--ds-select-fg-active);\n}\n\n.wrapper--error {\n --ds-interaction-border-width: var(--dimension-stroke-width-018);\n --ds-interaction-border-color: var(--color-border-bold-negative);\n}\n\n.trigger__prefix,\n.trigger__chevron {\n position: relative;\n z-index: 2;\n}\n\n.trigger__prefix {\n color: var(--ds-select-prefix-fg);\n}\n\n.trigger__chevron {\n color: var(--ds-select-chevron-fg);\n}\n\n.trigger__label {\n position: relative;\n z-index: 2;\n flex: 1 1 auto;\n text-align: left;\n color: inherit;\n transition: color var(--effect-motion-short-2);\n}\n\n.select-popup {\n color: var(--color-foreground-secondary);\n}\n\n.select-option[aria-selected='true'] .ds-choice-item__icon {\n color: var(--color-foreground-primary);\n}\n\n.error-text {\n width: 100%;\n}\n\n:host(.select-host--background-medium) {\n --ds-select-fg: var(--color-foreground-on-medium-background-secondary);\n --ds-select-fg-active: var(--color-foreground-on-medium-background-primary);\n --ds-select-border: var(--color-border-on-medium-background-secondary);\n}\n\n:host(.select-host--background-bold) {\n --ds-select-fg: var(--color-foreground-on-bold-background-secondary);\n --ds-select-fg-active: var(--color-foreground-on-bold-background-primary);\n --ds-select-border: var(--color-border-on-bold-background-secondary);\n}\n\n:host(.select-host--background-strong) {\n --ds-select-fg: var(--color-foreground-on-strong-background-secondary);\n --ds-select-fg-active: var(--color-foreground-on-strong-background-primary);\n --ds-select-border: var(--color-border-on-strong-background-secondary);\n}\n\n:host(.select-host--background-translucent) {\n --ds-select-fg: var(--color-translucent-foreground-secondary);\n --ds-select-fg-active: var(--color-translucent-foreground-primary);\n --ds-select-border: var(--color-translucent-border-secondary);\n}\n\n:host(.select-host--background-inverted) {\n --ds-select-fg: var(--color-inverted-foreground-secondary);\n --ds-select-fg-active: var(--color-inverted-foreground-primary);\n --ds-select-border: var(--color-inverted-border-secondary);\n}\n\n:host(.select-host--background-media) {\n --ds-select-fg: var(--color-media-foreground-secondary);\n --ds-select-fg-active: var(--color-media-foreground-primary);\n --ds-select-border: var(--color-media-border-secondary);\n}\n\n:host(.select-host--background-always-dark) {\n --ds-select-fg: var(--color-always-dark-foreground-secondary);\n --ds-select-fg-active: var(--color-always-dark-foreground-primary);\n --ds-select-border: var(--color-always-dark-border-secondary);\n}\n","import {\n AttachInternals,\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport {\n controlWidthClass,\n CONTROL_SUPPORTING_TEXT_VARIANT,\n CONTROL_TEXT_VARIANT,\n DEFAULT_REQUIRED_MESSAGE,\n restoreStringArrayFormState,\n restoreStringFormState,\n setFormControlValue,\n setRepeatedFormControlValue,\n setRequiredValidity,\n type ControlWidth,\n} from '../../utils';\nimport { ChoiceFooter, ChoiceOptionRow, ChoiceSearch } from '../../utils/choice-list-parts';\nimport {\n choiceBackgroundClassMap,\n choiceListUsesIcons,\n choiceListUsesSubtext,\n enabledChoiceIndexes,\n filterChoiceSections,\n flattenChoiceSections,\n resolveChoiceSections,\n type ChoiceBackground,\n type ChoiceOption,\n type ChoiceSection,\n} from '../../utils/choice-list';\nimport { SelectController } from '../../utils/select-controller';\n\nexport type SelectOption = ChoiceOption;\nexport type SelectSection = ChoiceSection;\nexport type SelectBackground = ChoiceBackground;\nexport type SelectSize = 'lg' | 'md' | 'sm' | 'xs';\nexport type SelectWidth = ControlWidth;\nexport type SelectValue = string | string[];\n\nconst ICON_SIZE: Record<SelectSize, 'lg' | 'md' | 'sm' | 'xs'> = {\n lg: 'lg',\n md: 'md',\n sm: 'sm',\n xs: 'xs',\n};\n\nlet selectId = 0;\n\n@Component({\n tag: 'ds-select',\n styleUrl: 'Select.css',\n scoped: true,\n formAssociated: true,\n})\nexport class Select {\n @Element() el!: HTMLElement;\n @AttachInternals() internals!: ElementInternals;\n\n /** Flat choices. Assign arrays through the JavaScript property. */\n @Prop() options: SelectOption[] = [];\n /** Grouped choices; takes precedence over options. Assign through JavaScript. */\n @Prop() sections: SelectSection[] = [];\n /** Enable independent multi-value selection while keeping the popup open. */\n @Prop({ reflect: true }) multiple: boolean = false;\n /** Selected scalar or array value according to `multiple`. */\n @Prop({ mutable: true }) value: SelectValue = '';\n /** Controlled popup visibility. */\n @Prop({ mutable: true, reflect: true }) open: boolean = false;\n /** Native form field name. */\n @Prop({ reflect: true }) name: string | undefined;\n /** Native disabled state. */\n @Prop({ reflect: true }) disabled: boolean = false;\n /** Require one valid selected value. */\n @Prop({ reflect: true }) required: boolean = false;\n /** Validation message used when required is missing. */\n @Prop() requiredMessage: string = DEFAULT_REQUIRED_MESSAGE;\n /** Trigger text shown when no valid value is selected. */\n @Prop() placeholder: string = 'Select';\n /** Control density. */\n @Prop() size: SelectSize = 'md';\n /** Width fit — hug content (default) or fill the parent. */\n @Prop() width: SelectWidth = 'hug';\n /** Shared inactive treatment; removes interaction and form submission. */\n @Prop() isInactive: boolean = false;\n /** Replace the prefix with a loader and disable option interaction. */\n @Prop() isLoading: boolean = false;\n /** Show the selected interaction fill when a valid value exists. */\n @Prop() activeFill: boolean = true;\n /** Show the surface-aware inset border. */\n @Prop() hasBorder: boolean = true;\n /** Optional trigger prefix icon name. */\n @Prop() icon: string | undefined;\n /** Show the clear footer action when a value exists. */\n @Prop() allowClear: boolean = true;\n /** Localized clear action label. */\n @Prop() clearLabel: string = 'Clear';\n /** Localized noun displayed after the selected count in multiple mode. */\n @Prop() selectedLabel: string = 'selected';\n /** Show immediate local filtering over option labels, subtext, and section headings. */\n @Prop() searchable: boolean = false;\n /** Localized search-field placeholder and accessible name. */\n @Prop() searchPlaceholder: string = 'Search';\n /** Localized empty-filter result text. */\n @Prop() noResultsText: string = 'No results found';\n /** Accessible loading status label. */\n @Prop() loadingLabel: string = 'Loading';\n /** Actual parent surface context; omit on primary and secondary surfaces. */\n @Prop() background: SelectBackground | undefined;\n /** Show invalid visual state. */\n @Prop() error: boolean = false;\n /** Error text rendered below the trigger when error is true. */\n @Prop() errorMessage: string | undefined;\n /** ID applied to the internal combobox trigger for external labels. */\n @Prop() inputId: string | undefined;\n /** Direct accessible name when no external label is available. */\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | null = null;\n /** IDs of elements that label the combobox. */\n @Prop({ attribute: 'aria-labelledby' }) ariaLabelledby: string | undefined;\n /** Additional IDs that describe the combobox. */\n @Prop({ attribute: 'aria-describedby' }) ariaDescribedby: string | undefined;\n\n /** Emitted after selection or clearing with the next scalar or array value. */\n @Event() dsChange!: EventEmitter<SelectValue>;\n /** Emitted after the footer clear action. */\n @Event() dsClear!: EventEmitter<void>;\n /** Emitted whenever popup visibility changes. */\n @Event() dsOpenChange!: EventEmitter<boolean>;\n\n @State() private activeIndex = -1;\n @State() private searchTerm = '';\n @State() private formDisabled = false;\n @State() private position = { x: 0, y: 0 };\n @State() private positionReady = false;\n @State() private focusRingVisible = false;\n\n private readonly generatedId = `ds-select-${++selectId}`;\n private readonly listboxId = `${this.generatedId}-listbox`;\n private readonly errorId = `${this.generatedId}-error`;\n private initialValue: SelectValue = '';\n private readonly controller = this.createController();\n\n private createController() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias -- adapter getters preserve reactive component ownership without inheritance.\n const owner = this;\n return new SelectController<SelectOption>({\n get host() {\n return owner.el;\n },\n generatedId: owner.generatedId,\n get options() {\n return owner.visibleOptions;\n },\n get searchable() {\n return owner.searchable;\n },\n get isLoading() {\n return owner.isLoading;\n },\n get isDisabled() {\n return owner.isDisabled;\n },\n get preferredIndex() {\n if (owner.multiple) return -1;\n return owner.visibleOptions.findIndex(\n option => option.value === owner.scalarValue && !option.isInactive\n );\n },\n get open() {\n return owner.open;\n },\n set open(value) {\n owner.open = value;\n },\n get activeIndex() {\n return owner.activeIndex;\n },\n set activeIndex(value) {\n owner.activeIndex = value;\n },\n get searchTerm() {\n return owner.searchTerm;\n },\n set searchTerm(value) {\n owner.searchTerm = value;\n },\n get focusRingVisible() {\n return owner.focusRingVisible;\n },\n set focusRingVisible(value) {\n owner.focusRingVisible = value;\n },\n get position() {\n return owner.position;\n },\n set position(value) {\n owner.position = value;\n },\n get positionReady() {\n return owner.positionReady;\n },\n set positionReady(value) {\n owner.positionReady = value;\n },\n selectOption: option => owner.selectOption(option),\n });\n }\n\n componentWillLoad() {\n this.value = this.normalizeValueForMode(this.value);\n this.initialValue = Array.isArray(this.value) ? [...this.value] : this.value;\n this.syncFormValue();\n }\n\n componentDidLoad() {\n this.controller.connect();\n }\n\n disconnectedCallback() {\n this.controller.disconnect();\n }\n\n @Watch('value')\n @Watch('multiple')\n @Watch('disabled')\n @Watch('isInactive')\n @Watch('required')\n @Watch('name')\n @Watch('options')\n @Watch('sections')\n syncFormValue() {\n if (\n (this.multiple && !Array.isArray(this.value)) ||\n (!this.multiple && Array.isArray(this.value))\n ) {\n this.value = this.normalizeValueForMode(this.value);\n }\n const inactive = this.isDisabled;\n if (this.multiple) {\n const values = this.resolvedValues;\n setRepeatedFormControlValue(this.internals, this.name, values, { inactive });\n } else {\n const value = this.hasSelection ? this.scalarValue : '';\n setFormControlValue(this.internals, value, { inactive });\n }\n const missing = this.required && !inactive && !this.hasSelection;\n setRequiredValidity(this.internals, missing, this.requiredMessage);\n this.controller.optionsChanged();\n }\n\n @Watch('isLoading')\n onLoadingChange() {\n this.controller.loadingChanged();\n }\n\n @Watch('open')\n onOpenChange(open: boolean) {\n this.dsOpenChange.emit(open);\n this.controller.openChanged(open);\n }\n\n @Watch('searchTerm')\n onSearchTermChange() {\n this.controller.searchChanged();\n }\n\n @Watch('activeIndex')\n onActiveIndexChange() {\n this.controller.activeIndexChanged();\n }\n\n formDisabledCallback(disabled: boolean) {\n this.formDisabled = disabled;\n this.syncFormValue();\n }\n\n formResetCallback() {\n this.value = this.normalizeValueForMode(this.initialValue);\n this.closePopup();\n }\n\n formStateRestoreCallback(state: string | File | FormData | null) {\n if (!this.multiple) {\n this.value = restoreStringFormState(state);\n return;\n }\n this.value = restoreStringArrayFormState(state);\n }\n\n @Method()\n async setFocus() {\n this.controller.setFocus();\n }\n\n private get isDisabled(): boolean {\n return this.disabled || this.isInactive || this.formDisabled;\n }\n\n private normalizeValueForMode(value: SelectValue): SelectValue {\n if (this.multiple) {\n return Array.isArray(value) ? [...value] : value ? [value] : [];\n }\n return Array.isArray(value) ? value[0] ?? '' : value;\n }\n\n private get allSections(): SelectSection[] {\n return resolveChoiceSections(this.options, this.sections);\n }\n\n private get allOptions(): SelectOption[] {\n return flattenChoiceSections(this.allSections);\n }\n\n private get visibleSections(): SelectSection[] {\n return this.searchable\n ? filterChoiceSections(this.allSections, this.searchTerm)\n : this.allSections;\n }\n\n private get visibleOptions(): SelectOption[] {\n return flattenChoiceSections(this.visibleSections);\n }\n\n private get scalarValue(): string {\n return typeof this.value === 'string' ? this.value : '';\n }\n\n private get resolvedValues(): string[] {\n if (!this.multiple || !Array.isArray(this.value)) return [];\n const valid = new Set(this.allOptions.map(option => option.value));\n return [...new Set(this.value.filter(value => valid.has(value)))];\n }\n\n private get selectedOption(): SelectOption | undefined {\n if (this.multiple) return undefined;\n return this.allOptions.find(option => option.value === this.scalarValue);\n }\n\n private get hasSelection(): boolean {\n return this.multiple ? this.resolvedValues.length > 0 : Boolean(this.selectedOption);\n }\n\n private get activeOptionId(): string | undefined {\n return this.controller.activeOptionId;\n }\n\n private closePopup(restoreFocus = false) {\n this.controller.closePopup(restoreFocus);\n }\n\n private openPopup(focusVisible: boolean, edge?: 'first' | 'last') {\n this.controller.openPopup(focusVisible, edge);\n }\n\n private selectOption(option: SelectOption) {\n if (option.isInactive || this.isLoading) return;\n if (this.multiple) {\n const current = this.resolvedValues;\n const next = current.includes(option.value)\n ? current.filter(value => value !== option.value)\n : [...current, option.value];\n this.value = next;\n this.dsChange.emit([...next]);\n return;\n }\n this.value = option.value;\n this.dsChange.emit(option.value);\n this.controller.closePopup(true);\n }\n\n private clearSelection = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n this.value = this.multiple ? [] : '';\n this.dsChange.emit(this.multiple ? [] : '');\n this.dsClear.emit();\n if (!this.multiple) {\n const enabled = enabledChoiceIndexes(this.visibleOptions);\n this.activeIndex = enabled[0] ?? -1;\n }\n this.controller.focusSearchOrTrigger();\n };\n\n private readonly handleListKeyDown = this.controller.handleListKeyDown;\n private readonly handleTriggerKeyDown = this.controller.handleTriggerKeyDown;\n\n private renderOption(\n option: SelectOption,\n index: number,\n usesIcons: boolean,\n usesSubtext: boolean\n ) {\n const selected = this.multiple\n ? this.resolvedValues.includes(option.value)\n : option.value === this.scalarValue;\n const active = index === this.activeIndex;\n return (\n <ChoiceOptionRow\n size={this.size}\n id={`${this.generatedId}-option-${index}`}\n option={option}\n selected={selected}\n active={active}\n focusRingVisible={this.focusRingVisible}\n usesSubtext={usesSubtext}\n leading={\n this.multiple ? (\n <span\n class=\"ds-choice-item__icon ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-checkbox\n class=\"select-option__checkbox\"\n label=\"\"\n size={this.size}\n checked={selected}\n presentation\n />\n </span>\n ) : usesIcons && option.icon ? (\n <span\n class=\"ds-choice-item__icon ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-icon name={option.icon} size={this.size} color=\"inherit\" />\n </span>\n ) : undefined\n }\n onHover={() => {\n this.focusRingVisible = false;\n this.activeIndex = index;\n }}\n onSelect={() => this.selectOption(option)}\n />\n );\n }\n\n render() {\n const inactive = this.isDisabled;\n const showPlaceholder = !this.hasSelection;\n const count = this.resolvedValues.length;\n const label = this.multiple\n ? `${this.placeholder}${count > 0 ? ` · ${count}` : ''}`\n : showPlaceholder\n ? this.placeholder\n : this.selectedOption?.label;\n const textVariant = CONTROL_TEXT_VARIANT[this.size];\n const iconSize = ICON_SIZE[this.size];\n const usesOptionIcons = !this.multiple && choiceListUsesIcons(this.allOptions);\n const usesOptionSubtext = choiceListUsesSubtext(this.allOptions);\n const showError = this.error && Boolean(this.errorMessage);\n const describedBy =\n [this.ariaDescribedby, showError ? this.errorId : undefined].filter(Boolean).join(' ') ||\n undefined;\n const popupStyle = {\n position: 'fixed',\n left: '0',\n top: '0',\n transform: `translate(${Math.round(this.position.x)}px, ${Math.round(this.position.y)}px)`,\n zIndex: 'var(--dimension-z-index-floating)',\n visibility: this.positionReady ? 'visible' : 'hidden',\n };\n let flatIndex = 0;\n\n return (\n <Host\n class={{\n 'select-host': true,\n 'select-host--multiple': this.multiple,\n 'ds-field-stack': true,\n 'ds-control-inactive': inactive,\n [`ds-control--${this.size}`]: true,\n ...controlWidthClass(this.width),\n [`select-host--background-${this.background}`]: !!this.background,\n }}\n >\n <button\n ref={element => {\n this.controller.setTriggerElement((element as HTMLButtonElement) ?? null);\n }}\n id={this.inputId ?? this.generatedId}\n type=\"button\"\n class={{\n trigger: true,\n 'ds-control-frame': true,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--selected': !inactive && this.activeFill && this.hasSelection,\n 'trigger--bordered': this.hasBorder || this.error,\n 'trigger--placeholder': showPlaceholder && !this.multiple,\n 'trigger--has-value': this.hasSelection,\n 'wrapper--error': this.error,\n [`ds-control--${this.size}`]: true,\n ...choiceBackgroundClassMap(this.background),\n }}\n disabled={inactive}\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={String(this.open)}\n aria-controls={this.open ? this.listboxId : undefined}\n aria-activedescendant={this.open && !this.searchable ? this.activeOptionId : undefined}\n aria-label={this.ariaLabel}\n aria-labelledby={this.ariaLabelledby}\n aria-describedby={describedBy}\n aria-invalid={this.error ? 'true' : undefined}\n aria-required={this.required || undefined}\n aria-busy={this.isLoading ? 'true' : undefined}\n onClick={() => (this.open ? this.closePopup() : this.openPopup(false))}\n onKeyDown={this.handleTriggerKeyDown}\n >\n {(this.icon || this.isLoading) && (\n <span\n class=\"trigger__prefix ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n {this.isLoading ? (\n <ds-loader size={iconSize} color=\"inherit\" />\n ) : (\n <ds-icon name={this.icon} size={iconSize} color=\"inherit\" />\n )}\n </span>\n )}\n <ds-text\n class=\"trigger__label ds-control-label-box ds-interaction-fill__content\"\n as=\"span\"\n variant={textVariant}\n color=\"inherit\"\n lineTruncation={1}\n >\n {label}\n </ds-text>\n <span\n class=\"trigger__chevron ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-icon name=\"ChevronDown\" size={iconSize} color=\"inherit\" />\n </span>\n </button>\n\n {this.open && (\n <div\n popover=\"manual\"\n ref={element => {\n this.controller.setPopupElement((element as HTMLDivElement) ?? null);\n }}\n class=\"select-popup ds-choice-popup\"\n style={popupStyle}\n >\n {this.searchable && (\n <ChoiceSearch\n size={this.size}\n value={this.searchTerm}\n placeholder={this.searchPlaceholder}\n controls={this.listboxId}\n activeDescendant={this.activeOptionId}\n inputRef={this.controller.setSearchElement}\n clearLabel={this.clearLabel}\n onValueChange={value => {\n this.searchTerm = value;\n }}\n onKeyDown={event => this.handleListKeyDown(event)}\n />\n )}\n <div\n id={this.listboxId}\n class=\"ds-choice-list\"\n role=\"listbox\"\n aria-multiselectable={this.multiple ? 'true' : undefined}\n aria-label={this.ariaLabel ?? this.placeholder}\n aria-busy={this.isLoading ? 'true' : undefined}\n >\n {this.isLoading ? (\n <div\n class=\"ds-choice-loading ds-empty-region\"\n role=\"option\"\n aria-selected=\"false\"\n aria-disabled=\"true\"\n aria-label={this.loadingLabel}\n aria-live=\"polite\"\n >\n <ds-loader size={this.size} color=\"inherit\" />\n </div>\n ) : this.visibleOptions.length === 0 ? (\n <div\n class=\"ds-choice-empty ds-empty-region\"\n role=\"option\"\n aria-selected=\"false\"\n aria-disabled=\"true\"\n aria-label={this.noResultsText}\n aria-live=\"polite\"\n >\n <ds-empty-state body={this.noResultsText} />\n </div>\n ) : (\n this.visibleSections.map(section => (\n <div\n class={{\n 'ds-choice-section': true,\n 'ds-chrome-column': true,\n 'ds-chrome-space--sm': true,\n 'ds-choice-section--divided': !!section.divider,\n }}\n role={section.header ? 'group' : undefined}\n aria-label={section.header}\n >\n {section.header && (\n <ds-text\n class={`ds-choice-section__header ds-control--${this.size}`}\n as=\"span\"\n variant={CONTROL_SUPPORTING_TEXT_VARIANT[this.size]}\n emphasis\n color=\"primary\"\n aria-hidden=\"true\"\n >\n {section.header}\n </ds-text>\n )}\n {section.options.map(option =>\n this.renderOption(option, flatIndex++, usesOptionIcons, usesOptionSubtext)\n )}\n </div>\n ))\n )}\n </div>\n {this.allowClear && this.hasSelection && !this.isLoading && (\n <ChoiceFooter\n size={this.size}\n summary={\n this.multiple ? `${count} ${this.selectedLabel}` : undefined\n }\n clearLabel={this.clearLabel}\n onClear={this.clearSelection}\n />\n )}\n </div>\n )}\n\n {showError && (\n <ds-text\n class=\"error-text\"\n as=\"div\"\n variant=\"text-body-small\"\n color=\"negative\"\n textId={this.errorId}\n role=\"alert\"\n >\n {this.errorMessage}\n </ds-text>\n )}\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["resolveChoiceSections","options","sections","length","flattenChoiceSections","flatMap","section","choiceListUsesIcons","every","option","Boolean","icon","choiceListUsesSubtext","some","subtext","trim","filterChoiceSections","searchTerm","normalized","toLocaleLowerCase","map","sectionMatches","header","includes","filter","label","enabledChoiceIndexes","index","isInactive","moveChoiceIndex","currentIndex","direction","enabled","currentEnabledIndex","indexOf","start","findChoiceTypeaheadMatch","query","offset","Math","max","startsWith","choiceBackgroundClassMap","background","SelectController","constructor","state","this","triggerEl","popupEl","searchEl","typeahead","typeaheadTimer","outsideHandler","setTriggerElement","element","setPopupElement","setSearchElement","handleTriggerKeyDown","event","open","key","preventDefault","openPopup","isTypeaheadKey","searchable","handleTypeahead","handleListKeyDown","focusRingVisible","activeIndex","target","selectOption","closePopup","position","AnchoredPositionController","getAnchor","getPopup","measure","trigger","popup","isConnected","host","contains","sectionPadding","resolveCssLengthPx","TOKEN_DEFAULTS","space050","style","minWidth","choicePopupMinWidth","offsetWidth","anchorRect","getBoundingClientRect","popupWidth","popupHeight","offsetHeight","side","align","sideOffsetPx","alignOffsetPx","resolveChoicePopupAlignOffset","sectionInsetPx","viewportPadPx","viewportWidth","window","innerWidth","viewportHeight","innerHeight","apply","x","y","positionReady","topLayer","activeOptionId","isLoading","generatedId","undefined","connect","openChanged","disconnect","cancelPositionRetry","unbindPopupListeners","clearTimeout","setFocus","focus","optionsChanged","requestAnimationFrame","updatePosition","loadingChanged","bindPopupListeners","schedulePositionUpdate","scrollActiveOptionIntoView","searchChanged","activeIndexChanged","focusVisible","edge","isDisabled","preferredIndex","restoreFocus","focusSearchOrTrigger","metaKey","ctrlKey","altKey","repeatedCharacter","character","match","resetMs","resolveCssTimeMs","animationDurationMedium1","setTimeout","querySelector","scrollIntoView","block","inline","document","addEventListener","observe","removeEventListener","unobserve","cancel","onReady","schedule","update","selectCss","ICON_SIZE","lg","md","sm","xs","selectId","Select","__stencil_proxyCustomElement","HTMLElement","registerHost","multiple","value","disabled","required","requiredMessage","DEFAULT_REQUIRED_MESSAGE","placeholder","size","width","activeFill","hasBorder","allowClear","clearLabel","selectedLabel","searchPlaceholder","noResultsText","loadingLabel","error","ariaLabel","formDisabled","listboxId","errorId","initialValue","controller","createController","clearSelection","stopPropagation","dsChange","emit","dsClear","visibleOptions","owner","el","findIndex","scalarValue","componentWillLoad","normalizeValueForMode","Array","isArray","syncFormValue","componentDidLoad","disconnectedCallback","inactive","values","resolvedValues","setRepeatedFormControlValue","internals","name","hasSelection","setFormControlValue","missing","setRequiredValidity","onLoadingChange","onOpenChange","dsOpenChange","onSearchTermChange","onActiveIndexChange","formDisabledCallback","formResetCallback","formStateRestoreCallback","restoreStringFormState","restoreStringArrayFormState","allSections","allOptions","visibleSections","valid","Set","has","selectedOption","find","current","next","renderOption","usesIcons","usesSubtext","selected","active","h","ChoiceOptionRow","id","leading","class","checked","presentation","color","onHover","onSelect","render","showPlaceholder","count","textVariant","CONTROL_TEXT_VARIANT","iconSize","usesOptionIcons","usesOptionSubtext","showError","errorMessage","describedBy","ariaDescribedby","join","popupStyle","left","top","transform","round","zIndex","visibility","flatIndex","Host","controlWidthClass","ref","inputId","type","role","String","ariaLabelledby","onClick","onKeyDown","as","variant","lineTruncation","popover","ChoiceSearch","controls","activeDescendant","inputRef","onValueChange","body","divider","CONTROL_SUPPORTING_TEXT_VARIANT","emphasis","ChoiceFooter","summary","onClear","textId"],"sources":["src/wc/utils/choice-list.ts","src/wc/utils/select-controller.ts","src/wc/components/Select/Select.css?tag=ds-select&encapsulation=scoped","src/wc/components/Select/Select.tsx"],"sourcesContent":["export interface ChoiceOption {\n label: string;\n value: string;\n subtext?: string;\n /** Rendered only when every option in the complete list supplies an icon. */\n icon?: string;\n isInactive?: boolean;\n}\n\nexport interface ChoiceSection {\n header?: string;\n options: ChoiceOption[];\n divider?: boolean;\n}\n\nexport type ChoiceBackground =\n | 'faint'\n | 'medium'\n | 'bold'\n | 'strong'\n | 'translucent'\n | 'inverted'\n | 'media'\n | 'always-dark';\n\nexport function resolveChoiceSections(\n options: ChoiceOption[],\n sections: ChoiceSection[],\n): ChoiceSection[] {\n return sections.length > 0 ? sections : [{ options }];\n}\n\nexport function flattenChoiceSections(sections: ChoiceSection[]): ChoiceOption[] {\n return sections.flatMap(section => section.options);\n}\n\n/** A choice list has one stable row layout: every option has an icon, or none do. */\nexport function choiceListUsesIcons(options: ChoiceOption[]): boolean {\n return options.length > 0 && options.every(option => Boolean(option.icon));\n}\n\n/** Once one option needs supporting text, every row keeps the same two-line structure. */\nexport function choiceListUsesSubtext(options: ChoiceOption[]): boolean {\n return options.some(option => Boolean(option.subtext?.trim()));\n}\n\nexport function filterChoiceSections(\n sections: ChoiceSection[],\n searchTerm: string,\n): ChoiceSection[] {\n const normalized = searchTerm.trim().toLocaleLowerCase();\n if (!normalized) return sections;\n\n return sections\n .map(section => {\n const sectionMatches = section.header?.toLocaleLowerCase().includes(normalized);\n return {\n ...section,\n options: sectionMatches\n ? section.options\n : section.options.filter(option =>\n `${option.label} ${option.subtext ?? ''}`.toLocaleLowerCase().includes(normalized),\n ),\n };\n })\n .filter(section => section.options.length > 0);\n}\n\nexport function enabledChoiceIndexes(options: ChoiceOption[]): number[] {\n return options\n .map((option, index) => ({ option, index }))\n .filter(({ option }) => !option.isInactive)\n .map(({ index }) => index);\n}\n\nexport function moveChoiceIndex(\n options: ChoiceOption[],\n currentIndex: number,\n direction: 1 | -1,\n): number {\n const enabled = enabledChoiceIndexes(options);\n if (!enabled.length) return -1;\n\n const currentEnabledIndex = enabled.indexOf(currentIndex);\n const start = currentEnabledIndex >= 0 ? currentEnabledIndex : direction === 1 ? -1 : 0;\n return enabled[(start + direction + enabled.length) % enabled.length];\n}\n\nexport function findChoiceTypeaheadMatch(\n options: ChoiceOption[],\n query: string,\n currentIndex: number,\n): number {\n const normalized = query.toLocaleLowerCase();\n if (!normalized) return -1;\n\n for (let offset = 1; offset <= options.length; offset += 1) {\n const index = (Math.max(currentIndex, -1) + offset) % options.length;\n const option = options[index];\n if (!option.isInactive && option.label.toLocaleLowerCase().startsWith(normalized)) return index;\n }\n return -1;\n}\n\nexport function choiceBackgroundClassMap(\n background: ChoiceBackground | undefined,\n): Record<string, boolean> {\n return {\n 'ds-interaction-fill--on-faint': background === 'faint',\n 'ds-interaction-fill--on-medium': background === 'medium',\n 'ds-interaction-fill--on-bold': background === 'bold',\n 'ds-interaction-fill--on-strong': background === 'strong',\n 'ds-interaction-fill--on-translucent': background === 'translucent',\n 'ds-interaction-fill--on-inverted': background === 'inverted',\n 'ds-interaction-fill--on-media': background === 'media',\n 'ds-interaction-fill--on-always-dark': background === 'always-dark',\n };\n}\n","import { AnchoredPositionController } from './anchored-position-controller';\nimport {\n enabledChoiceIndexes,\n findChoiceTypeaheadMatch,\n moveChoiceIndex,\n type ChoiceOption,\n} from './choice-list';\nimport { choicePopupMinWidth, resolveChoicePopupAlignOffset } from './choice-popup-alignment';\nimport { resolveCssLengthPx } from './resolve-css-length-px';\nimport { resolveCssTimeMs } from './resolve-css-time-ms';\nimport { TOKEN_DEFAULTS } from './token-defaults';\n\ntype PopupPosition = { x: number; y: number };\n\nexport interface SelectControllerState<T extends ChoiceOption> {\n readonly host: HTMLElement;\n readonly generatedId: string;\n readonly options: T[];\n readonly searchable: boolean;\n readonly isLoading: boolean;\n readonly isDisabled: boolean;\n readonly preferredIndex: number;\n open: boolean;\n activeIndex: number;\n searchTerm: string;\n focusRingVisible: boolean;\n position: PopupPosition;\n positionReady: boolean;\n selectOption(option: T): void;\n}\n\n/**\n * Shared single/multiple Select interaction controller.\n *\n * Decorated Stencil state and scalar/array selection remain in each component;\n * this controller owns only popup lifecycle, focus, positioning, typeahead,\n * and listbox keyboard traversal. Anchored placement is delegated to\n * `AnchoredPositionController`; only the choice-cell measurement stays here.\n */\nexport class SelectController<T extends ChoiceOption> {\n private triggerEl: HTMLButtonElement | null = null;\n private popupEl: HTMLDivElement | null = null;\n private searchEl: HTMLInputElement | null = null;\n private typeahead = '';\n private typeaheadTimer: ReturnType<typeof setTimeout> | null = null;\n private outsideHandler: ((event: MouseEvent) => void) | null = null;\n private readonly position: AnchoredPositionController;\n\n constructor(private readonly state: SelectControllerState<T>) {\n this.position = new AnchoredPositionController({\n getAnchor: () => this.triggerEl,\n getPopup: () => this.popupEl,\n measure: (trigger, popup) => {\n if (!this.state.open || !popup.isConnected || !this.state.host.contains(popup)) return null;\n\n const sectionPadding = resolveCssLengthPx(TOKEN_DEFAULTS.space050, TOKEN_DEFAULTS.space050);\n popup.style.minWidth = `${choicePopupMinWidth(trigger.offsetWidth, sectionPadding)}px`;\n\n return {\n anchorRect: trigger.getBoundingClientRect(),\n popupWidth: popup.offsetWidth,\n popupHeight: popup.offsetHeight,\n side: 'bottom',\n align: 'start',\n sideOffsetPx: sectionPadding,\n alignOffsetPx: resolveChoicePopupAlignOffset({\n align: 'start',\n alignOffsetPx: 0,\n sectionInsetPx: sectionPadding,\n }),\n viewportPadPx: sectionPadding,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n };\n },\n apply: ({ x, y }) => {\n this.state.position = { x, y };\n this.state.positionReady = true;\n },\n topLayer: true,\n });\n }\n\n get activeOptionId(): string | undefined {\n return !this.state.isLoading && this.state.activeIndex >= 0\n ? `${this.state.generatedId}-option-${this.state.activeIndex}`\n : undefined;\n }\n\n setTriggerElement = (element: HTMLButtonElement | null) => {\n this.triggerEl = element;\n };\n\n setPopupElement = (element: HTMLDivElement | null) => {\n this.popupEl = element;\n };\n\n setSearchElement = (element: HTMLInputElement | null) => {\n this.searchEl = element;\n };\n\n connect() {\n if (this.state.open) this.openChanged(true);\n }\n\n disconnect() {\n this.cancelPositionRetry();\n this.unbindPopupListeners();\n if (this.typeaheadTimer) clearTimeout(this.typeaheadTimer);\n }\n\n setFocus() {\n this.triggerEl?.focus();\n }\n\n optionsChanged() {\n if (!this.state.open) return;\n const enabled = enabledChoiceIndexes(this.state.options);\n if (!enabled.includes(this.state.activeIndex)) this.state.activeIndex = enabled[0] ?? -1;\n requestAnimationFrame(() => this.updatePosition());\n }\n\n loadingChanged() {\n if (this.state.open) requestAnimationFrame(() => this.updatePosition());\n }\n\n openChanged(open: boolean) {\n if (open) {\n this.bindPopupListeners();\n this.schedulePositionUpdate(() => {\n this.scrollActiveOptionIntoView();\n if (this.state.searchable) this.searchEl?.focus();\n });\n return;\n }\n this.cancelPositionRetry();\n this.unbindPopupListeners();\n this.state.searchTerm = '';\n this.state.positionReady = false;\n }\n\n searchChanged() {\n this.state.activeIndex = enabledChoiceIndexes(this.state.options)[0] ?? -1;\n requestAnimationFrame(() => {\n this.updatePosition();\n this.scrollActiveOptionIntoView();\n });\n }\n\n activeIndexChanged() {\n requestAnimationFrame(() => this.scrollActiveOptionIntoView());\n }\n\n openPopup(focusVisible: boolean, edge?: 'first' | 'last') {\n if (this.state.isDisabled || (!this.state.options.length && !this.state.isLoading)) return;\n const enabled = enabledChoiceIndexes(this.state.options);\n this.state.activeIndex =\n edge === 'last'\n ? (enabled[enabled.length - 1] ?? -1)\n : this.state.preferredIndex >= 0\n ? this.state.preferredIndex\n : (enabled[0] ?? -1);\n this.state.focusRingVisible = focusVisible;\n this.state.open = true;\n }\n\n closePopup(restoreFocus = false) {\n if (!this.state.open) return;\n this.state.open = false;\n if (restoreFocus) requestAnimationFrame(() => this.triggerEl?.focus());\n }\n\n focusSearchOrTrigger() {\n requestAnimationFrame(() =>\n this.state.searchable ? this.searchEl?.focus() : this.triggerEl?.focus()\n );\n }\n\n handleTriggerKeyDown = (event: KeyboardEvent) => {\n if (!this.state.open) {\n if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n this.openPopup(true, event.key === 'ArrowUp' ? 'last' : 'first');\n } else if (this.isTypeaheadKey(event)) {\n event.preventDefault();\n this.openPopup(true);\n if (this.state.searchable) this.state.searchTerm = event.key;\n else this.handleTypeahead(event.key);\n }\n return;\n }\n this.handleListKeyDown(event);\n };\n\n handleListKeyDown = (event: KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.state.focusRingVisible = true;\n this.state.activeIndex = moveChoiceIndex(this.state.options, this.state.activeIndex, 1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.state.focusRingVisible = true;\n this.state.activeIndex = moveChoiceIndex(this.state.options, this.state.activeIndex, -1);\n break;\n case 'Home':\n event.preventDefault();\n this.state.focusRingVisible = true;\n this.state.activeIndex = enabledChoiceIndexes(this.state.options)[0] ?? -1;\n break;\n case 'End': {\n event.preventDefault();\n this.state.focusRingVisible = true;\n const enabled = enabledChoiceIndexes(this.state.options);\n this.state.activeIndex = enabled[enabled.length - 1] ?? -1;\n break;\n }\n case 'Enter':\n case ' ': {\n if (event.key === ' ' && this.state.searchable && event.target === this.searchEl) break;\n event.preventDefault();\n const option = this.state.options[this.state.activeIndex];\n if (option) this.state.selectOption(option);\n break;\n }\n case 'Escape':\n event.preventDefault();\n this.closePopup(true);\n break;\n case 'Tab':\n this.closePopup();\n break;\n default:\n if (!this.state.searchable && this.isTypeaheadKey(event)) {\n this.handleTypeahead(event.key);\n }\n }\n };\n\n private isTypeaheadKey(event: KeyboardEvent) {\n return event.key.length === 1 && !event.metaKey && !event.ctrlKey && !event.altKey;\n }\n\n private handleTypeahead(key: string) {\n if (this.typeaheadTimer) clearTimeout(this.typeaheadTimer);\n this.state.focusRingVisible = true;\n const normalized = key.toLocaleLowerCase();\n const repeatedCharacter =\n this.typeahead.length > 0 && [...this.typeahead].every(character => character === normalized);\n this.typeahead = repeatedCharacter ? normalized : `${this.typeahead}${normalized}`;\n const match = findChoiceTypeaheadMatch(\n this.state.options,\n this.typeahead,\n this.state.activeIndex\n );\n if (match >= 0) this.state.activeIndex = match;\n const resetMs = resolveCssTimeMs(\n TOKEN_DEFAULTS.animationDurationMedium1,\n TOKEN_DEFAULTS.animationDurationMedium1\n );\n this.typeaheadTimer = setTimeout(() => {\n this.typeahead = '';\n this.typeaheadTimer = null;\n }, resetMs);\n }\n\n private scrollActiveOptionIntoView() {\n if (!this.state.open || !this.activeOptionId) return;\n this.state.host\n .querySelector<HTMLElement>(`#${this.activeOptionId}`)\n ?.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n }\n\n private bindPopupListeners() {\n this.unbindPopupListeners();\n this.outsideHandler = event => {\n if (this.state.host.contains(event.target as Node)) return;\n this.closePopup();\n };\n document.addEventListener('mousedown', this.outsideHandler, true);\n this.position.observe();\n }\n\n private unbindPopupListeners() {\n if (this.outsideHandler) {\n document.removeEventListener('mousedown', this.outsideHandler, true);\n this.outsideHandler = null;\n }\n this.position.unobserve();\n }\n\n private cancelPositionRetry() {\n this.position.cancel();\n }\n\n private schedulePositionUpdate(onReady?: () => void) {\n if (!this.state.open) return;\n this.state.positionReady = false;\n this.position.schedule(onReady);\n }\n\n private updatePosition(): boolean {\n return this.position.update();\n }\n}\n","@import '../../utils/choice-list.css';\n@import '../../utils/control-parts.css';\n@import '../../utils/control-width.css';\n@import '../../utils/field-stack.css';\n@import '../../utils/search-control.css';\n@import '../../utils/typography.css';\n\n:host(.select-host) {\n display: inline-flex;\n position: relative;\n outline: none;\n --ds-select-fg: var(--color-foreground-secondary);\n --ds-select-fg-active: var(--color-foreground-primary);\n --ds-select-prefix-fg: var(--ds-select-fg);\n --ds-select-chevron-fg: var(--ds-select-fg);\n --ds-select-border: var(--color-border-secondary);\n}\n\n:host(.ds-control-width--fill),\n:host(.ds-control-width--fill) .trigger {\n width: 100%;\n}\n\n.trigger {\n justify-content: flex-start;\n background: transparent;\n border: none;\n border-radius: var(--ds-control-radius, var(--dimension-radius-025));\n color: var(--ds-select-fg);\n cursor: default;\n font-family: inherit;\n -webkit-user-select: none;\n user-select: none;\n overflow: hidden;\n transition: color var(--effect-motion-short-2);\n}\n\n.trigger--bordered {\n --ds-interaction-border-width: var(--dimension-stroke-width-012);\n --ds-interaction-border-color: var(--ds-select-border);\n}\n\n.trigger--has-value .trigger__label {\n color: var(--ds-select-fg-active);\n}\n\n.wrapper--error {\n --ds-interaction-border-width: var(--dimension-stroke-width-018);\n --ds-interaction-border-color: var(--color-border-bold-negative);\n}\n\n.trigger__prefix,\n.trigger__chevron {\n position: relative;\n z-index: 2;\n}\n\n.trigger__prefix {\n color: var(--ds-select-prefix-fg);\n}\n\n.trigger__chevron {\n color: var(--ds-select-chevron-fg);\n}\n\n.trigger__label {\n position: relative;\n z-index: 2;\n flex: 1 1 auto;\n text-align: left;\n color: inherit;\n transition: color var(--effect-motion-short-2);\n}\n\n.select-popup {\n color: var(--color-foreground-secondary);\n}\n\n.select-option[aria-selected='true'] .ds-choice-item__icon {\n color: var(--color-foreground-primary);\n}\n\n.error-text {\n width: 100%;\n}\n\n:host(.select-host--background-medium) {\n --ds-select-fg: var(--color-foreground-on-medium-background-secondary);\n --ds-select-fg-active: var(--color-foreground-on-medium-background-primary);\n --ds-select-border: var(--color-border-on-medium-background-secondary);\n}\n\n:host(.select-host--background-bold) {\n --ds-select-fg: var(--color-foreground-on-bold-background-secondary);\n --ds-select-fg-active: var(--color-foreground-on-bold-background-primary);\n --ds-select-border: var(--color-border-on-bold-background-secondary);\n}\n\n:host(.select-host--background-strong) {\n --ds-select-fg: var(--color-foreground-on-strong-background-secondary);\n --ds-select-fg-active: var(--color-foreground-on-strong-background-primary);\n --ds-select-border: var(--color-border-on-strong-background-secondary);\n}\n\n:host(.select-host--background-translucent) {\n --ds-select-fg: var(--color-translucent-foreground-secondary);\n --ds-select-fg-active: var(--color-translucent-foreground-primary);\n --ds-select-border: var(--color-translucent-border-secondary);\n}\n\n:host(.select-host--background-inverted) {\n --ds-select-fg: var(--color-inverted-foreground-secondary);\n --ds-select-fg-active: var(--color-inverted-foreground-primary);\n --ds-select-border: var(--color-inverted-border-secondary);\n}\n\n:host(.select-host--background-media) {\n --ds-select-fg: var(--color-media-foreground-secondary);\n --ds-select-fg-active: var(--color-media-foreground-primary);\n --ds-select-border: var(--color-media-border-secondary);\n}\n\n:host(.select-host--background-always-dark) {\n --ds-select-fg: var(--color-always-dark-foreground-secondary);\n --ds-select-fg-active: var(--color-always-dark-foreground-primary);\n --ds-select-border: var(--color-always-dark-border-secondary);\n}\n","import {\n AttachInternals,\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport {\n controlWidthClass,\n CONTROL_SUPPORTING_TEXT_VARIANT,\n CONTROL_TEXT_VARIANT,\n DEFAULT_REQUIRED_MESSAGE,\n restoreStringArrayFormState,\n restoreStringFormState,\n setFormControlValue,\n setRepeatedFormControlValue,\n setRequiredValidity,\n type ControlWidth,\n} from '../../utils';\nimport { ChoiceFooter, ChoiceOptionRow, ChoiceSearch } from '../../utils/choice-list-parts';\nimport {\n choiceBackgroundClassMap,\n choiceListUsesIcons,\n choiceListUsesSubtext,\n enabledChoiceIndexes,\n filterChoiceSections,\n flattenChoiceSections,\n resolveChoiceSections,\n type ChoiceBackground,\n type ChoiceOption,\n type ChoiceSection,\n} from '../../utils/choice-list';\nimport { SelectController } from '../../utils/select-controller';\n\nexport type SelectOption = ChoiceOption;\nexport type SelectSection = ChoiceSection;\nexport type SelectBackground = ChoiceBackground;\nexport type SelectSize = 'lg' | 'md' | 'sm' | 'xs';\nexport type SelectWidth = ControlWidth;\nexport type SelectValue = string | string[];\n\nconst ICON_SIZE: Record<SelectSize, 'lg' | 'md' | 'sm' | 'xs'> = {\n lg: 'lg',\n md: 'md',\n sm: 'sm',\n xs: 'xs',\n};\n\nlet selectId = 0;\n\n@Component({\n tag: 'ds-select',\n styleUrl: 'Select.css',\n scoped: true,\n formAssociated: true,\n})\nexport class Select {\n @Element() el!: HTMLElement;\n @AttachInternals() internals!: ElementInternals;\n\n /** Flat choices. Assign arrays through the JavaScript property. */\n @Prop() options: SelectOption[] = [];\n /** Grouped choices; takes precedence over options. Assign through JavaScript. */\n @Prop() sections: SelectSection[] = [];\n /** Enable independent multi-value selection while keeping the popup open. */\n @Prop({ reflect: true }) multiple: boolean = false;\n /** Selected scalar or array value according to `multiple`. */\n @Prop({ mutable: true }) value: SelectValue = '';\n /** Controlled popup visibility. */\n @Prop({ mutable: true, reflect: true }) open: boolean = false;\n /** Native form field name. */\n @Prop({ reflect: true }) name: string | undefined;\n /** Native disabled state. */\n @Prop({ reflect: true }) disabled: boolean = false;\n /** Require one valid selected value. */\n @Prop({ reflect: true }) required: boolean = false;\n /** Validation message used when required is missing. */\n @Prop() requiredMessage: string = DEFAULT_REQUIRED_MESSAGE;\n /** Trigger text shown when no valid value is selected. */\n @Prop() placeholder: string = 'Select';\n /** Control density. */\n @Prop() size: SelectSize = 'md';\n /** Width fit — hug content (default) or fill the parent. */\n @Prop() width: SelectWidth = 'hug';\n /** Shared inactive treatment; removes interaction and form submission. */\n @Prop() isInactive: boolean = false;\n /** Replace the prefix with a loader and disable option interaction. */\n @Prop() isLoading: boolean = false;\n /** Show the selected interaction fill when a valid value exists. */\n @Prop() activeFill: boolean = true;\n /** Show the surface-aware inset border, including focused and invalid strokes. */\n @Prop() hasBorder: boolean = true;\n /** Optional trigger prefix icon name. */\n @Prop() icon: string | undefined;\n /** Show the clear footer action when a value exists. */\n @Prop() allowClear: boolean = true;\n /** Localized clear action label. */\n @Prop() clearLabel: string = 'Clear';\n /** Localized noun displayed after the selected count in multiple mode. */\n @Prop() selectedLabel: string = 'selected';\n /** Show immediate local filtering over option labels, subtext, and section headings. */\n @Prop() searchable: boolean = false;\n /** Localized search-field placeholder and accessible name. */\n @Prop() searchPlaceholder: string = 'Search';\n /** Localized empty-filter result text. */\n @Prop() noResultsText: string = 'No results found';\n /** Accessible loading status label. */\n @Prop() loadingLabel: string = 'Loading';\n /** Actual parent surface context; omit on primary and secondary surfaces. */\n @Prop() background: SelectBackground | undefined;\n /** Show invalid visual state. */\n @Prop() error: boolean = false;\n /** Error text rendered below the trigger when error is true. */\n @Prop() errorMessage: string | undefined;\n /** ID applied to the internal combobox trigger for external labels. */\n @Prop() inputId: string | undefined;\n /** Direct accessible name when no external label is available. */\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | null = null;\n /** IDs of elements that label the combobox. */\n @Prop({ attribute: 'aria-labelledby' }) ariaLabelledby: string | undefined;\n /** Additional IDs that describe the combobox. */\n @Prop({ attribute: 'aria-describedby' }) ariaDescribedby: string | undefined;\n\n /** Emitted after selection or clearing with the next scalar or array value. */\n @Event() dsChange!: EventEmitter<SelectValue>;\n /** Emitted after the footer clear action. */\n @Event() dsClear!: EventEmitter<void>;\n /** Emitted whenever popup visibility changes. */\n @Event() dsOpenChange!: EventEmitter<boolean>;\n\n @State() private activeIndex = -1;\n @State() private searchTerm = '';\n @State() private formDisabled = false;\n @State() private position = { x: 0, y: 0 };\n @State() private positionReady = false;\n @State() private focusRingVisible = false;\n\n private readonly generatedId = `ds-select-${++selectId}`;\n private readonly listboxId = `${this.generatedId}-listbox`;\n private readonly errorId = `${this.generatedId}-error`;\n private initialValue: SelectValue = '';\n private readonly controller = this.createController();\n\n private createController() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias -- adapter getters preserve reactive component ownership without inheritance.\n const owner = this;\n return new SelectController<SelectOption>({\n get host() {\n return owner.el;\n },\n generatedId: owner.generatedId,\n get options() {\n return owner.visibleOptions;\n },\n get searchable() {\n return owner.searchable;\n },\n get isLoading() {\n return owner.isLoading;\n },\n get isDisabled() {\n return owner.isDisabled;\n },\n get preferredIndex() {\n if (owner.multiple) return -1;\n return owner.visibleOptions.findIndex(\n option => option.value === owner.scalarValue && !option.isInactive\n );\n },\n get open() {\n return owner.open;\n },\n set open(value) {\n owner.open = value;\n },\n get activeIndex() {\n return owner.activeIndex;\n },\n set activeIndex(value) {\n owner.activeIndex = value;\n },\n get searchTerm() {\n return owner.searchTerm;\n },\n set searchTerm(value) {\n owner.searchTerm = value;\n },\n get focusRingVisible() {\n return owner.focusRingVisible;\n },\n set focusRingVisible(value) {\n owner.focusRingVisible = value;\n },\n get position() {\n return owner.position;\n },\n set position(value) {\n owner.position = value;\n },\n get positionReady() {\n return owner.positionReady;\n },\n set positionReady(value) {\n owner.positionReady = value;\n },\n selectOption: option => owner.selectOption(option),\n });\n }\n\n componentWillLoad() {\n this.value = this.normalizeValueForMode(this.value);\n this.initialValue = Array.isArray(this.value) ? [...this.value] : this.value;\n this.syncFormValue();\n }\n\n componentDidLoad() {\n this.controller.connect();\n }\n\n disconnectedCallback() {\n this.controller.disconnect();\n }\n\n @Watch('value')\n @Watch('multiple')\n @Watch('disabled')\n @Watch('isInactive')\n @Watch('required')\n @Watch('name')\n @Watch('options')\n @Watch('sections')\n syncFormValue() {\n if (\n (this.multiple && !Array.isArray(this.value)) ||\n (!this.multiple && Array.isArray(this.value))\n ) {\n this.value = this.normalizeValueForMode(this.value);\n }\n const inactive = this.isDisabled;\n if (this.multiple) {\n const values = this.resolvedValues;\n setRepeatedFormControlValue(this.internals, this.name, values, { inactive });\n } else {\n const value = this.hasSelection ? this.scalarValue : '';\n setFormControlValue(this.internals, value, { inactive });\n }\n const missing = this.required && !inactive && !this.hasSelection;\n setRequiredValidity(this.internals, missing, this.requiredMessage);\n this.controller.optionsChanged();\n }\n\n @Watch('isLoading')\n onLoadingChange() {\n this.controller.loadingChanged();\n }\n\n @Watch('open')\n onOpenChange(open: boolean) {\n this.dsOpenChange.emit(open);\n this.controller.openChanged(open);\n }\n\n @Watch('searchTerm')\n onSearchTermChange() {\n this.controller.searchChanged();\n }\n\n @Watch('activeIndex')\n onActiveIndexChange() {\n this.controller.activeIndexChanged();\n }\n\n formDisabledCallback(disabled: boolean) {\n this.formDisabled = disabled;\n this.syncFormValue();\n }\n\n formResetCallback() {\n this.value = this.normalizeValueForMode(this.initialValue);\n this.closePopup();\n }\n\n formStateRestoreCallback(state: string | File | FormData | null) {\n if (!this.multiple) {\n this.value = restoreStringFormState(state);\n return;\n }\n this.value = restoreStringArrayFormState(state);\n }\n\n @Method()\n async setFocus() {\n this.controller.setFocus();\n }\n\n private get isDisabled(): boolean {\n return this.disabled || this.isInactive || this.formDisabled;\n }\n\n private normalizeValueForMode(value: SelectValue): SelectValue {\n if (this.multiple) {\n return Array.isArray(value) ? [...value] : value ? [value] : [];\n }\n return Array.isArray(value) ? value[0] ?? '' : value;\n }\n\n private get allSections(): SelectSection[] {\n return resolveChoiceSections(this.options, this.sections);\n }\n\n private get allOptions(): SelectOption[] {\n return flattenChoiceSections(this.allSections);\n }\n\n private get visibleSections(): SelectSection[] {\n return this.searchable\n ? filterChoiceSections(this.allSections, this.searchTerm)\n : this.allSections;\n }\n\n private get visibleOptions(): SelectOption[] {\n return flattenChoiceSections(this.visibleSections);\n }\n\n private get scalarValue(): string {\n return typeof this.value === 'string' ? this.value : '';\n }\n\n private get resolvedValues(): string[] {\n if (!this.multiple || !Array.isArray(this.value)) return [];\n const valid = new Set(this.allOptions.map(option => option.value));\n return [...new Set(this.value.filter(value => valid.has(value)))];\n }\n\n private get selectedOption(): SelectOption | undefined {\n if (this.multiple) return undefined;\n return this.allOptions.find(option => option.value === this.scalarValue);\n }\n\n private get hasSelection(): boolean {\n return this.multiple ? this.resolvedValues.length > 0 : Boolean(this.selectedOption);\n }\n\n private get activeOptionId(): string | undefined {\n return this.controller.activeOptionId;\n }\n\n private closePopup(restoreFocus = false) {\n this.controller.closePopup(restoreFocus);\n }\n\n private openPopup(focusVisible: boolean, edge?: 'first' | 'last') {\n this.controller.openPopup(focusVisible, edge);\n }\n\n private selectOption(option: SelectOption) {\n if (option.isInactive || this.isLoading) return;\n if (this.multiple) {\n const current = this.resolvedValues;\n const next = current.includes(option.value)\n ? current.filter(value => value !== option.value)\n : [...current, option.value];\n this.value = next;\n this.dsChange.emit([...next]);\n return;\n }\n this.value = option.value;\n this.dsChange.emit(option.value);\n this.controller.closePopup(true);\n }\n\n private clearSelection = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n this.value = this.multiple ? [] : '';\n this.dsChange.emit(this.multiple ? [] : '');\n this.dsClear.emit();\n if (!this.multiple) {\n const enabled = enabledChoiceIndexes(this.visibleOptions);\n this.activeIndex = enabled[0] ?? -1;\n }\n this.controller.focusSearchOrTrigger();\n };\n\n private readonly handleListKeyDown = this.controller.handleListKeyDown;\n private readonly handleTriggerKeyDown = this.controller.handleTriggerKeyDown;\n\n private renderOption(\n option: SelectOption,\n index: number,\n usesIcons: boolean,\n usesSubtext: boolean\n ) {\n const selected = this.multiple\n ? this.resolvedValues.includes(option.value)\n : option.value === this.scalarValue;\n const active = index === this.activeIndex;\n return (\n <ChoiceOptionRow\n size={this.size}\n id={`${this.generatedId}-option-${index}`}\n option={option}\n selected={selected}\n active={active}\n focusRingVisible={this.focusRingVisible}\n usesSubtext={usesSubtext}\n leading={\n this.multiple ? (\n <span\n class=\"ds-choice-item__icon ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-checkbox\n class=\"select-option__checkbox\"\n label=\"\"\n size={this.size}\n checked={selected}\n presentation\n />\n </span>\n ) : usesIcons && option.icon ? (\n <span\n class=\"ds-choice-item__icon ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-icon name={option.icon} size={this.size} color=\"inherit\" />\n </span>\n ) : undefined\n }\n onHover={() => {\n this.focusRingVisible = false;\n this.activeIndex = index;\n }}\n onSelect={() => this.selectOption(option)}\n />\n );\n }\n\n render() {\n const inactive = this.isDisabled;\n const showPlaceholder = !this.hasSelection;\n const count = this.resolvedValues.length;\n const label = this.multiple\n ? `${this.placeholder}${count > 0 ? ` · ${count}` : ''}`\n : showPlaceholder\n ? this.placeholder\n : this.selectedOption?.label;\n const textVariant = CONTROL_TEXT_VARIANT[this.size];\n const iconSize = ICON_SIZE[this.size];\n const usesOptionIcons = !this.multiple && choiceListUsesIcons(this.allOptions);\n const usesOptionSubtext = choiceListUsesSubtext(this.allOptions);\n const showError = this.error && Boolean(this.errorMessage);\n const describedBy =\n [this.ariaDescribedby, showError ? this.errorId : undefined].filter(Boolean).join(' ') ||\n undefined;\n const popupStyle = {\n position: 'fixed',\n left: '0',\n top: '0',\n transform: `translate(${Math.round(this.position.x)}px, ${Math.round(this.position.y)}px)`,\n zIndex: 'var(--dimension-z-index-floating)',\n visibility: this.positionReady ? 'visible' : 'hidden',\n };\n let flatIndex = 0;\n\n return (\n <Host\n class={{\n 'select-host': true,\n 'select-host--multiple': this.multiple,\n 'ds-field-stack': true,\n 'ds-control-inactive': inactive,\n [`ds-control--${this.size}`]: true,\n ...controlWidthClass(this.width),\n [`select-host--background-${this.background}`]: !!this.background,\n }}\n >\n <button\n ref={element => {\n this.controller.setTriggerElement((element as HTMLButtonElement) ?? null);\n }}\n id={this.inputId ?? this.generatedId}\n type=\"button\"\n class={{\n trigger: true,\n 'ds-control-frame': true,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--selected': !inactive && this.activeFill && this.hasSelection,\n 'trigger--bordered': this.hasBorder,\n 'trigger--placeholder': showPlaceholder && !this.multiple,\n 'trigger--has-value': this.hasSelection,\n 'wrapper--error': this.hasBorder && this.error,\n [`ds-control--${this.size}`]: true,\n ...choiceBackgroundClassMap(this.background),\n }}\n disabled={inactive}\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={String(this.open)}\n aria-controls={this.open ? this.listboxId : undefined}\n aria-activedescendant={this.open && !this.searchable ? this.activeOptionId : undefined}\n aria-label={this.ariaLabel}\n aria-labelledby={this.ariaLabelledby}\n aria-describedby={describedBy}\n aria-invalid={this.error ? 'true' : undefined}\n aria-required={this.required || undefined}\n aria-busy={this.isLoading ? 'true' : undefined}\n onClick={() => (this.open ? this.closePopup() : this.openPopup(false))}\n onKeyDown={this.handleTriggerKeyDown}\n >\n {(this.icon || this.isLoading) && (\n <span\n class=\"trigger__prefix ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n {this.isLoading ? (\n <ds-loader size={iconSize} color=\"inherit\" />\n ) : (\n <ds-icon name={this.icon} size={iconSize} color=\"inherit\" />\n )}\n </span>\n )}\n <ds-text\n class=\"trigger__label ds-control-label-box ds-interaction-fill__content\"\n as=\"span\"\n variant={textVariant}\n color=\"inherit\"\n lineTruncation={1}\n >\n {label}\n </ds-text>\n <span\n class=\"trigger__chevron ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-icon name=\"ChevronDown\" size={iconSize} color=\"inherit\" />\n </span>\n </button>\n\n {this.open && (\n <div\n popover=\"manual\"\n ref={element => {\n this.controller.setPopupElement((element as HTMLDivElement) ?? null);\n }}\n class=\"select-popup ds-choice-popup\"\n style={popupStyle}\n >\n {this.searchable && (\n <ChoiceSearch\n size={this.size}\n value={this.searchTerm}\n placeholder={this.searchPlaceholder}\n controls={this.listboxId}\n activeDescendant={this.activeOptionId}\n inputRef={this.controller.setSearchElement}\n clearLabel={this.clearLabel}\n onValueChange={value => {\n this.searchTerm = value;\n }}\n onKeyDown={event => this.handleListKeyDown(event)}\n />\n )}\n <div\n id={this.listboxId}\n class=\"ds-choice-list\"\n role=\"listbox\"\n aria-multiselectable={this.multiple ? 'true' : undefined}\n aria-label={this.ariaLabel ?? this.placeholder}\n aria-busy={this.isLoading ? 'true' : undefined}\n >\n {this.isLoading ? (\n <div\n class=\"ds-choice-loading ds-empty-region\"\n role=\"option\"\n aria-selected=\"false\"\n aria-disabled=\"true\"\n aria-label={this.loadingLabel}\n aria-live=\"polite\"\n >\n <ds-loader size={this.size} color=\"inherit\" />\n </div>\n ) : this.visibleOptions.length === 0 ? (\n <div\n class=\"ds-choice-empty ds-empty-region\"\n role=\"option\"\n aria-selected=\"false\"\n aria-disabled=\"true\"\n aria-label={this.noResultsText}\n aria-live=\"polite\"\n >\n <ds-empty-state body={this.noResultsText} />\n </div>\n ) : (\n this.visibleSections.map(section => (\n <div\n class={{\n 'ds-choice-section': true,\n 'ds-chrome-column': true,\n 'ds-chrome-space--sm': true,\n 'ds-choice-section--divided': !!section.divider,\n }}\n role={section.header ? 'group' : undefined}\n aria-label={section.header}\n >\n {section.header && (\n <ds-text\n class={`ds-choice-section__header ds-control--${this.size}`}\n as=\"span\"\n variant={CONTROL_SUPPORTING_TEXT_VARIANT[this.size]}\n emphasis\n color=\"primary\"\n aria-hidden=\"true\"\n >\n {section.header}\n </ds-text>\n )}\n {section.options.map(option =>\n this.renderOption(option, flatIndex++, usesOptionIcons, usesOptionSubtext)\n )}\n </div>\n ))\n )}\n </div>\n {this.allowClear && this.hasSelection && !this.isLoading && (\n <ChoiceFooter\n size={this.size}\n summary={\n this.multiple ? `${count} ${this.selectedLabel}` : undefined\n }\n clearLabel={this.clearLabel}\n onClear={this.clearSelection}\n />\n )}\n </div>\n )}\n\n {showError && (\n <ds-text\n class=\"error-text\"\n as=\"div\"\n variant=\"text-body-small\"\n color=\"negative\"\n textId={this.errorId}\n role=\"alert\"\n >\n {this.errorMessage}\n </ds-text>\n )}\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,5 +1,5 @@
1
1
  {
2
- "timestamp": "2026-07-31T05:26:45",
2
+ "timestamp": "2026-07-31T23:32:50",
3
3
  "compiler": {
4
4
  "name": "@stencil/core",
5
5
  "version": "4.43.5",
@@ -4962,7 +4962,7 @@
4962
4962
  "mutable": false,
4963
4963
  "attr": "comparison-label",
4964
4964
  "reflectToAttr": false,
4965
- "docs": "Comparison caption, for example `vs Previous period`.",
4965
+ "docs": "Copy between the current period and comparison control, usually `vs.`.",
4966
4966
  "docsTags": [
4967
4967
  {
4968
4968
  "name": "default",
@@ -5061,7 +5061,7 @@
5061
5061
  "mutable": false,
5062
5062
  "attr": "metric-min-width",
5063
5063
  "reflectToAttr": false,
5064
- "docs": "Width a metric cell may shrink to before the grid drops a column. The grid\nreflows and then stacks from this alone, so no measurement is required.",
5064
+ "docs": "Width a metric cell may shrink to before the grid drops a column. The grid\nuses this threshold while choosing an evenly distributed column count.",
5065
5065
  "docsTags": [
5066
5066
  {
5067
5067
  "name": "default",
@@ -5096,7 +5096,7 @@
5096
5096
  },
5097
5097
  "mutable": false,
5098
5098
  "reflectToAttr": false,
5099
- "docs": "Measures rendered in the responsive grid. Only the first six are shown.",
5099
+ "docs": "Measures rendered in the responsive grid. Only the first seven are shown.",
5100
5100
  "docsTags": [
5101
5101
  {
5102
5102
  "name": "default",
@@ -5154,7 +5154,7 @@
5154
5154
  "mutable": false,
5155
5155
  "attr": "period-label",
5156
5156
  "reflectToAttr": false,
5157
- "docs": "Current reporting period, for example `Jun 29, 2026 Jul 26, 2026`.",
5157
+ "docs": "Fixed current date or range. Replaced by content in the `period` slot.",
5158
5158
  "docsTags": [
5159
5159
  {
5160
5160
  "name": "default",
@@ -5189,7 +5189,7 @@
5189
5189
  },
5190
5190
  "mutable": false,
5191
5191
  "reflectToAttr": false,
5192
- "docs": "Leading summary block. Omit to render the bar without a headline figure.",
5192
+ "docs": "Optional nonselectable safety score rendered as the first grid cell.",
5193
5193
  "docsTags": [],
5194
5194
  "values": [
5195
5195
  {
@@ -5241,7 +5241,7 @@
5241
5241
  "mutable": false,
5242
5242
  "attr": "scroll-collapse-progress",
5243
5243
  "reflectToAttr": false,
5244
- "docs": "Page-controlled visual collapse from the full card (`0`) toward its 48px\ncompact handoff height (`1`). The component preserves its expanded flow\nheight, keeps elevation on the shrinking surface, and clips translated\ncontent internally. The page still owns sticky positioning and the final\nswap to `variant=\"compact\"`.",
5244
+ "docs": "Page-controlled visual collapse from the full card (`0`) toward its 48px\ncompact handoff height (`1`). The component preserves its expanded flow\nheight, keeps the period bar stationary, and moves/clips the grid beneath\nit. The page still owns sticky positioning and the final compact handoff.",
5245
5245
  "docsTags": [
5246
5246
  {
5247
5247
  "name": "default",
@@ -5347,14 +5347,12 @@
5347
5347
  "dependencies": [
5348
5348
  "ds-skeleton",
5349
5349
  "ds-text",
5350
- "ds-icon",
5351
5350
  "ds-tooltip"
5352
5351
  ],
5353
5352
  "dependencyGraph": {
5354
5353
  "ds-card-overview": [
5355
5354
  "ds-skeleton",
5356
5355
  "ds-text",
5357
- "ds-icon",
5358
5356
  "ds-tooltip"
5359
5357
  ],
5360
5358
  "ds-tooltip": [
@@ -8849,7 +8847,6 @@
8849
8847
  "ds-bar-title",
8850
8848
  "ds-button-filled",
8851
8849
  "ds-button-unfilled",
8852
- "ds-card-overview",
8853
8850
  "ds-chip",
8854
8851
  "ds-empty-state",
8855
8852
  "ds-input",
@@ -8887,9 +8884,6 @@
8887
8884
  "ds-button-unfilled": [
8888
8885
  "ds-icon"
8889
8886
  ],
8890
- "ds-card-overview": [
8891
- "ds-icon"
8892
- ],
8893
8887
  "ds-chip": [
8894
8888
  "ds-icon"
8895
8889
  ],
@@ -9248,7 +9242,7 @@
9248
9242
  "mutable": false,
9249
9243
  "attr": "has-border",
9250
9244
  "reflectToAttr": false,
9251
- "docs": "Show the standard inset border.",
9245
+ "docs": "Show the standard inset border, including focused and invalid strokes.",
9252
9246
  "docsTags": [
9253
9247
  {
9254
9248
  "name": "default",
@@ -17138,7 +17132,7 @@
17138
17132
  "mutable": false,
17139
17133
  "attr": "has-border",
17140
17134
  "reflectToAttr": false,
17141
- "docs": "Show the surface-aware inset border.",
17135
+ "docs": "Show the surface-aware inset border, including focused and invalid strokes.",
17142
17136
  "docsTags": [
17143
17137
  {
17144
17138
  "name": "default",
@@ -24475,7 +24469,7 @@
24475
24469
  "path": "src/wc/components/CardOverview/card-overview-types.ts"
24476
24470
  },
24477
24471
  "src/wc/components/CardOverview/card-overview-types.ts::OverviewScore": {
24478
- "declaration": "export interface OverviewScore {\n /** Category above the figure, for example `Safety score`. */\n label: string;\n /** Display-ready headline figure. */\n value: string | number;\n /** Change against the comparison period. Omit when there is nothing to report. */\n trend?: MetricTrend;\n /** Qualitative band beneath the figure, for example `Good (6783)`. */\n band?: string;\n}",
24472
+ "declaration": "export interface OverviewScore {\n /** Category before the trend and figure, for example `Safety score`. */\n label: string;\n /** Display-ready headline figure. */\n value: string | number;\n /** Change against the comparison period. Omit when there is nothing to report. */\n trend?: MetricTrend;\n /**\n * Safety score color level. Numeric values from 0–100 infer fair (050),\n * good (51–80), or excellent (81–100) when this is omitted.\n */\n level?: SafetyScoreLevel;\n /** @deprecated Ignored. The redesigned score cell no longer renders a band. */\n band?: string;\n}",
24479
24473
  "docstring": "Leading summary block — the headline figure the rest of the bar contextualises.\n\nDerive `trend` with `resolveMetricTrend` so whether a rise reads well stays a\nproduct decision rather than a design-system one.",
24480
24474
  "path": "src/wc/components/CardOverview/card-overview-types.ts"
24481
24475
  },
@@ -126,7 +126,7 @@
126
126
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: items.",
127
127
  "peerDependencies": {
128
128
  "required": [
129
- "@ds-mo/tokens ^5.1.0",
129
+ "@ds-mo/tokens ^5.1.1",
130
130
  "@ds-mo/icons ^6.4.0"
131
131
  ],
132
132
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
@@ -203,7 +203,7 @@
203
203
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: parts.",
204
204
  "peerDependencies": {
205
205
  "required": [
206
- "@ds-mo/tokens ^5.1.0",
206
+ "@ds-mo/tokens ^5.1.1",
207
207
  "@ds-mo/icons ^6.4.0"
208
208
  ],
209
209
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
@@ -122,7 +122,7 @@
122
122
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: items.",
123
123
  "peerDependencies": {
124
124
  "required": [
125
- "@ds-mo/tokens ^5.1.0",
125
+ "@ds-mo/tokens ^5.1.1",
126
126
  "@ds-mo/icons ^6.4.0"
127
127
  ],
128
128
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
@@ -181,7 +181,7 @@
181
181
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: input, output.",
182
182
  "peerDependencies": {
183
183
  "required": [
184
- "@ds-mo/tokens ^5.1.0",
184
+ "@ds-mo/tokens ^5.1.1",
185
185
  "@ds-mo/icons ^6.4.0"
186
186
  ],
187
187
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
@@ -106,7 +106,7 @@
106
106
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: items.",
107
107
  "peerDependencies": {
108
108
  "required": [
109
- "@ds-mo/tokens ^5.1.0",
109
+ "@ds-mo/tokens ^5.1.1",
110
110
  "@ds-mo/icons ^6.4.0"
111
111
  ],
112
112
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
@@ -143,7 +143,7 @@
143
143
  },
144
144
  "peerDependencies": {
145
145
  "required": [
146
- "@ds-mo/tokens ^5.1.0",
146
+ "@ds-mo/tokens ^5.1.1",
147
147
  "@ds-mo/icons ^6.4.0"
148
148
  ],
149
149
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
@@ -260,7 +260,7 @@
260
260
  },
261
261
  "peerDependencies": {
262
262
  "required": [
263
- "@ds-mo/tokens ^5.1.0",
263
+ "@ds-mo/tokens ^5.1.1",
264
264
  "@ds-mo/icons ^6.4.0"
265
265
  ],
266
266
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
@@ -276,7 +276,7 @@
276
276
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: tabs.",
277
277
  "peerDependencies": {
278
278
  "required": [
279
- "@ds-mo/tokens ^5.1.0",
279
+ "@ds-mo/tokens ^5.1.1",
280
280
  "@ds-mo/icons ^6.4.0"
281
281
  ],
282
282
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
@@ -449,7 +449,7 @@
449
449
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: actions, breadcrumbs, primaryAction, sections.",
450
450
  "peerDependencies": {
451
451
  "required": [
452
- "@ds-mo/tokens ^5.1.0",
452
+ "@ds-mo/tokens ^5.1.1",
453
453
  "@ds-mo/icons ^6.4.0"
454
454
  ],
455
455
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
@@ -351,7 +351,7 @@
351
351
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: steps, submitAction.",
352
352
  "peerDependencies": {
353
353
  "required": [
354
- "@ds-mo/tokens ^5.1.0",
354
+ "@ds-mo/tokens ^5.1.1",
355
355
  "@ds-mo/icons ^6.4.0"
356
356
  ],
357
357
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
@@ -171,7 +171,7 @@
171
171
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: items.",
172
172
  "peerDependencies": {
173
173
  "required": [
174
- "@ds-mo/tokens ^5.1.0",
174
+ "@ds-mo/tokens ^5.1.1",
175
175
  "@ds-mo/icons ^6.4.0"
176
176
  ],
177
177
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
@@ -491,7 +491,7 @@
491
491
  },
492
492
  "peerDependencies": {
493
493
  "required": [
494
- "@ds-mo/tokens ^5.1.0",
494
+ "@ds-mo/tokens ^5.1.1",
495
495
  "@ds-mo/icons ^6.4.0"
496
496
  ],
497
497
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
@@ -552,7 +552,7 @@
552
552
  },
553
553
  "peerDependencies": {
554
554
  "required": [
555
- "@ds-mo/tokens ^5.1.0",
555
+ "@ds-mo/tokens ^5.1.1",
556
556
  "@ds-mo/icons ^6.4.0"
557
557
  ],
558
558
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
@@ -211,7 +211,7 @@
211
211
  },
212
212
  "peerDependencies": {
213
213
  "required": [
214
- "@ds-mo/tokens ^5.1.0",
214
+ "@ds-mo/tokens ^5.1.1",
215
215
  "@ds-mo/icons ^6.4.0"
216
216
  ],
217
217
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."