@ds-mo/ui 14.19.1 → 14.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.package-ready.json +1 -1
- package/dist/agent-patterns.json +1 -1
- package/dist/agent.json +24 -8
- package/dist/angular/ds-filter-menu.d.ts +1 -1
- package/dist/angular/ds-filter-menu.js +3 -3
- package/dist/components/ds-agent-questionnaire.js +1 -1
- package/dist/components/ds-agent-response.js +1 -1
- package/dist/components/ds-banner.js +1 -1
- package/dist/components/ds-bar-nav.js +1 -1
- package/dist/components/ds-bar-title.js +1 -1
- package/dist/components/ds-bar-workflow.js +1 -1
- package/dist/components/ds-button-unfilled.js +1 -1
- package/dist/components/ds-card-chart.js +1 -1
- package/dist/components/ds-card-overview.js +1 -1
- package/dist/components/ds-card-setting.js +1 -1
- package/dist/components/ds-chart.js +1 -1
- package/dist/components/ds-code-block.js +1 -1
- package/dist/components/ds-filter-menu.js +1 -1
- package/dist/components/ds-input.js +1 -1
- package/dist/components/ds-markdown.js +1 -1
- package/dist/components/ds-menu.js +1 -1
- package/dist/components/ds-message-actions.js +1 -1
- package/dist/components/ds-message-composer.js +1 -1
- package/dist/components/ds-message-scroller.js +1 -1
- package/dist/components/ds-mobile-header.js +1 -1
- package/dist/components/ds-mobile-section-switcher.js +1 -1
- package/dist/components/ds-mobile-sheet-nav.js +1 -1
- package/dist/components/ds-modal.js +1 -1
- package/dist/components/ds-pagination.js +1 -1
- package/dist/components/ds-panel-nav.js +1 -1
- package/dist/components/ds-panel-tool-header.js +1 -1
- package/dist/components/ds-panel-tool-search.js +1 -1
- package/dist/components/ds-panel-tools.js +1 -1
- package/dist/components/ds-select.js +1 -1
- package/dist/components/ds-shell-app.js +1 -1
- package/dist/components/ds-shell-tools.js +1 -1
- package/dist/components/ds-tab-group.js +1 -1
- package/dist/components/ds-table-filter.js +1 -1
- package/dist/components/ds-table-filter.js.map +1 -1
- package/dist/components/ds-table-saved-views.js +1 -1
- package/dist/components/ds-table-sort.js +1 -1
- package/dist/components/ds-table.js +1 -1
- package/dist/components/ds-toast.js +1 -1
- package/dist/components/ds-tooltip-chart.js +1 -1
- package/dist/components/ds-tooltip.js +1 -1
- package/dist/components/{p-BNq9fr9S.js → p-1UAVanY9.js} +2 -2
- package/dist/components/{p-Crz606uD.js → p-AtUP95E_.js} +2 -2
- package/dist/components/{p-vrotWZxt.js → p-B2FT4Da6.js} +2 -2
- package/dist/components/p-B5-R5mb8.js +2 -0
- package/dist/components/p-B5-R5mb8.js.map +1 -0
- package/dist/components/{p-Drnyq8z7.js → p-B6rSDhJY.js} +2 -2
- package/dist/components/{p-DBYCwq9L.js → p-BUexfjjg.js} +2 -2
- package/dist/components/{p-Djxw2FjZ.js → p-BkelrY4-.js} +2 -2
- package/dist/components/{p-BubgDQlb.js → p-BmssRAEZ.js} +2 -2
- package/dist/components/{p-B6WQre5D.js → p-CCmgtju-.js} +2 -2
- package/dist/components/{p-Bx1IHqJb.js → p-CDw_WEVt.js} +2 -2
- package/dist/components/{p-1YHFQeI7.js → p-CUL5_8JM.js} +2 -2
- package/dist/components/{p-DZv2g9Pe.js → p-CptSB-tA.js} +2 -2
- package/dist/components/{p-Demfba7T.js → p-CyZqk196.js} +2 -2
- package/dist/components/{p-Cxr0IQjC.js → p-CzbsTZt7.js} +2 -2
- package/dist/components/{p-CFsLF-ts.js → p-D7QlTWbN.js} +2 -2
- package/dist/components/p-DBYv7fRq.js +2 -0
- package/dist/components/{p-CKtJ6FHM.js.map → p-DBYv7fRq.js.map} +1 -1
- package/dist/components/{p-D-MWvpg6.js → p-DGe5oXR0.js} +2 -2
- package/dist/components/p-DGe5oXR0.js.map +1 -0
- package/dist/components/{p-DsgEY6mZ.js → p-DIlScMvI.js} +2 -2
- package/dist/components/p-DLbHgbVj.js +2 -0
- package/dist/components/{p-Cp5Hr7Vz.js.map → p-DLbHgbVj.js.map} +1 -1
- package/dist/components/{p-D7v6Na7U.js → p-DM1Z_hh0.js} +2 -2
- package/dist/components/{p-BmlGeaY8.js → p-DWjTOoXs.js} +2 -2
- package/dist/components/{p-CRSwNbPk.js → p-DfDoqOlx.js} +2 -2
- package/dist/components/{p-DmWoFSGs.js → p-L8IIeDXM.js} +2 -2
- package/dist/components/{p-BWwiCvep.js → p-rw0ZxIE4.js} +2 -2
- package/dist/components/{p-DIqT1m2r.js → p-v4oqkJms.js} +2 -2
- package/dist/docs/components.json +112 -14
- package/dist/lib/utils/date-filter-value.d.ts +57 -0
- package/dist/lib/utils/index.d.ts +2 -0
- package/dist/lib/utils/index.js +67 -0
- package/dist/lib/utils/index.js.map +3 -3
- package/dist/mcp-data/registry/filter-menu.json +56 -9
- package/dist/mcp-data/registry/registry.json +23 -7
- package/dist/mcp-data/registry/tab-group.json +1 -1
- package/dist/mcp-data/registry/table-filter.json +5 -3
- package/dist/types/components/FilterMenu/FilterMenu.d.ts +20 -1
- package/dist/types/components/FilterMenu/filter-menu-calendar.d.ts +13 -0
- package/dist/types/components.d.ts +26 -4
- package/dist/types/utils/date-filter-value.d.ts +58 -0
- package/dist/types/utils/index.d.ts +2 -0
- package/dist/vue/ds-filter-menu.js +2 -0
- package/package.json +1 -1
- package/dist/components/p-CKtJ6FHM.js +0 -2
- package/dist/components/p-Cp5Hr7Vz.js +0 -2
- package/dist/components/p-CpUXubax.js +0 -2
- package/dist/components/p-CpUXubax.js.map +0 -1
- package/dist/components/p-D-MWvpg6.js.map +0 -1
- /package/dist/components/{p-BNq9fr9S.js.map → p-1UAVanY9.js.map} +0 -0
- /package/dist/components/{p-Crz606uD.js.map → p-AtUP95E_.js.map} +0 -0
- /package/dist/components/{p-vrotWZxt.js.map → p-B2FT4Da6.js.map} +0 -0
- /package/dist/components/{p-Drnyq8z7.js.map → p-B6rSDhJY.js.map} +0 -0
- /package/dist/components/{p-DBYCwq9L.js.map → p-BUexfjjg.js.map} +0 -0
- /package/dist/components/{p-Djxw2FjZ.js.map → p-BkelrY4-.js.map} +0 -0
- /package/dist/components/{p-BubgDQlb.js.map → p-BmssRAEZ.js.map} +0 -0
- /package/dist/components/{p-B6WQre5D.js.map → p-CCmgtju-.js.map} +0 -0
- /package/dist/components/{p-Bx1IHqJb.js.map → p-CDw_WEVt.js.map} +0 -0
- /package/dist/components/{p-1YHFQeI7.js.map → p-CUL5_8JM.js.map} +0 -0
- /package/dist/components/{p-DZv2g9Pe.js.map → p-CptSB-tA.js.map} +0 -0
- /package/dist/components/{p-Demfba7T.js.map → p-CyZqk196.js.map} +0 -0
- /package/dist/components/{p-Cxr0IQjC.js.map → p-CzbsTZt7.js.map} +0 -0
- /package/dist/components/{p-CFsLF-ts.js.map → p-D7QlTWbN.js.map} +0 -0
- /package/dist/components/{p-DsgEY6mZ.js.map → p-DIlScMvI.js.map} +0 -0
- /package/dist/components/{p-D7v6Na7U.js.map → p-DM1Z_hh0.js.map} +0 -0
- /package/dist/components/{p-BmlGeaY8.js.map → p-DWjTOoXs.js.map} +0 -0
- /package/dist/components/{p-CRSwNbPk.js.map → p-DfDoqOlx.js.map} +0 -0
- /package/dist/components/{p-DmWoFSGs.js.map → p-L8IIeDXM.js.map} +0 -0
- /package/dist/components/{p-BWwiCvep.js.map → p-rw0ZxIE4.js.map} +0 -0
- /package/dist/components/{p-DIqT1m2r.js.map → p-v4oqkJms.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["filterMenuCss","filterMenuId","ICON_SIZE","lg","md","sm","xs","FilterMenu","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","open","triggerLabel","icon","size","width","hasBorder","activeFill","collapseLabel","ariaLabel","filters","values","side","align","sideOffset","TOKEN_CSS_LENGTHS","space050","alignOffset","menuWidth","menuWidthLg","menuLabel","categoriesLabel","clearLabel","initialFocusVisible","shouldRender","closing","positionReady","pos","x","y","focusRingVisible","activeOptionIndex","captionCompact","generatedId","triggerElement","pendingInitialFocusVisible","closeTimer","hasLoaded","closingSnapshot","position","AnchoredPositionController","getAnchor","resolvedAnchor","getPopup","el","querySelector","getOwnerDocument","ownerDocument","measure","anchor","popup","anchorRect","getBoundingClientRect","sectionInsetPx","resolveCssLengthPx","TOKEN_DEFAULTS","popupWidth","offsetWidth","popupFallbackWidth","popupHeight","offsetHeight","popupFallbackHeight","sideOffsetPx","alignOffsetPx","resolveChoicePopupAlignOffset","viewportPadPx","viewportPad","viewportWidth","window","innerWidth","viewportHeight","innerHeight","collisionRect","resolveAnchoredOverlayBoundaryRect","boundary","apply","onReady","liveUpdate","observeResize","topLayer","interaction","AnchoredOverlayInteractionController","onOutsideActivation","close","componentDidLoad","syncCaptionCompactObserver","onOpenChange","connectedCallback","disconnectedCallback","disconnectCaptionCompactObserver","unobserve","teardownListeners","onCollapseLabelChange","isOpen","setupListeners","schedule","focusInitialCategory","cancel","captureClosingSnapshot","duration","resolveMotionTimeMs","motionShort2","animationDurationShort3","finishClose","setTimeout","onPositionInputChange","handleKeyDown","event","key","preventDefault","tabLeavesPopup","moveFocusAfterTab","shiftKey","anchorId","document","getElementById","usesInternalTrigger","menuFallbackHeight","connect","observe","disconnect","clearTimeout","restoreFocus","focusAnchor","dsOpenChange","emit","dsClose","toggleFromTrigger","detail","handleTriggerKeyDown","matches","hidePopover","dsAfterClose","map","filter","options","option","Object","fromEntries","entries","value","Array","isArray","activeFilterId","requestAnimationFrame","focus","selectedFilter","find","id","selectedCount","kind","length","totalSelected","reduce","total","activeFilterCount","selectCategory","filterId","dsActiveFilterChange","handleCategoryKeyDown","currentIndex","findIndex","nextIndex","handlePanelKeyDown","handleOptionKeyDown","index","selectOption","includes","enabled","candidate","optionIndex","isInactive","current","indexOf","next","direction","start","toggleMultiple","checked","selected","Set","add","delete","ordered","has","dsChange","renderOptions","usesSubtext","choiceListUsesSubtext","label","subtext","description","isSelected","h","ChoiceOptionRow","active","tabIndex","leading","class","presentation","undefined","onFocus","onKeyDown","onHover","onSelect","fieldLabel","Boolean","dateValue","inputId","htmlFor","as","variant","emphasis","color","type","onInput","target","isInset","rounded","onDsClick","stopPropagation","captionIconOnly","captionCompactDisconnect","observeTableCaptionCompact","compact","renderCaptionTooltip","trigger","render","state","activeFilter","hasActiveFilters","textVariant","CONTROL_TEXT_VARIANT","iconSize","popupId","popupStyle","left","top","transform","Math","round","zIndex","visibility","Host","controlWidthClass","ref","element","role","String","onClick","name","lineTruncation","popover","style","count","divider","onMouseDown","intent","contrast","dsClear"],"sources":["src/wc/components/FilterMenu/FilterMenu.css?tag=ds-filter-menu&encapsulation=scoped","src/wc/components/FilterMenu/FilterMenu.tsx"],"sourcesContent":["@import '../../utils/choice-list.css';\n@import '../../utils/control-parts.css';\n@import '../../utils/control-width.css';\n@import '../../utils/select-trigger.css';\n@import '../../utils/table-caption-control.css';\n\n:host(.filter-menu-host--external-trigger) {\n display: contents;\n}\n\n.filter-menu {\n display: flex;\n min-height: 0;\n flex-direction: column;\n color: var(--color-foreground-primary);\n}\n\n.filter-menu__body {\n display: grid;\n grid-template-columns: minmax(calc(var(--dimension-size-base) * 18), 2fr) minmax(0, 3fr);\n min-height: calc(var(--dimension-size-800) * 4 + var(--dimension-space-150));\n max-height: calc(100vh - var(--dimension-size-800) - var(--dimension-size-600));\n}\n\n.filter-menu__categories {\n min-width: 0;\n border-inline-end: var(--dimension-stroke-width-012) solid var(--color-border-tertiary);\n}\n\n.filter-menu__category-section {\n display: flex;\n min-width: 0;\n flex-direction: column;\n}\n\n.filter-menu__category-section.ds-choice-section--divided {\n padding-block-end: var(--dimension-space-050);\n}\n\n.filter-menu__category {\n justify-content: space-between;\n width: 100%;\n border: 0;\n background: transparent;\n color: var(--color-foreground-secondary);\n cursor: default;\n text-align: start;\n}\n\n.filter-menu__category--active {\n color: var(--color-foreground-primary);\n}\n\n.filter-menu__options {\n min-width: 0;\n overflow: hidden;\n}\n\n.filter-menu__date-field {\n display: flex;\n min-width: 0;\n flex-direction: column;\n align-items: stretch;\n gap: var(--dimension-space-100);\n}\n\n.filter-menu__date-control {\n width: 100%;\n border-radius: var(--dimension-radius-025);\n background: transparent;\n box-shadow: inset 0 0 0 var(--dimension-stroke-width-012) var(--color-border-secondary);\n}\n\n.filter-menu__date-control:focus-within {\n box-shadow: inset 0 0 0 var(--dimension-stroke-width-018) var(--color-border-bold-brand);\n}\n\n.filter-menu__date-input {\n flex: 1 1 auto;\n min-width: 0;\n height: 100%;\n padding-inline: var(--dimension-space-100);\n border: 0;\n outline: 0;\n background: transparent;\n color: var(--color-foreground-primary);\n font: inherit;\n}\n\n.filter-menu__footer {\n flex: 0 0 auto;\n}\n\n.filter-menu__clear {\n color: var(--color-foreground-bold-brand);\n}\n\n@media (max-width: 520px) {\n .filter-menu__body {\n grid-template-columns: minmax(calc(var(--dimension-size-base) * 14), 2fr) minmax(0, 3fr);\n }\n}\n\n@media (forced-colors: active) {\n .filter-menu__categories {\n border-inline-end-color: var(--ds-forced-color-content);\n }\n\n .filter-menu__date-control {\n outline: var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);\n }\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Listen,\n Prop,\n State,\n type VNode,\n Watch,\n} from '@stencil/core';\nimport {\n CONTROL_TEXT_VARIANT,\n controlWidthClass,\n resolveChoicePopupAlignOffset,\n resolveCssLengthPx,\n resolveMotionTimeMs,\n TOKEN_CSS_LENGTHS,\n TOKEN_DEFAULTS,\n type ControlWidth,\n} from '../../utils';\nimport { observeTableCaptionCompact } from '../../utils/table-caption-compact';\nimport type { AnchoredAlign, AnchoredSide } from '../../utils/anchored-position';\nimport { AnchoredPositionController } from '../../utils/anchored-position-controller';\nimport { AnchoredOverlayInteractionController } from '../../utils/anchored-overlay-interaction-controller';\nimport { resolveAnchoredOverlayBoundaryRect } from '../../utils/anchored-overlay-boundary';\nimport { ChoiceOptionRow } from '../../utils/choice-list-parts';\nimport { choiceListUsesSubtext } from '../../utils/choice-list';\n\nexport type FilterMenuFilterKind = 'single' | 'multiple' | 'boolean' | 'date';\nexport type FilterMenuSize = 'lg' | 'md' | 'sm' | 'xs';\nexport type FilterMenuWidth = ControlWidth;\n\nexport interface FilterMenuOption {\n label: string;\n value: string;\n description?: string;\n isInactive?: boolean;\n}\n\nexport interface FilterMenuFilter {\n id: string;\n label: string;\n kind: FilterMenuFilterKind;\n options?: FilterMenuOption[];\n description?: string;\n fieldLabel?: string;\n /** Draw a standard menu-section divider after this category. */\n divider?: boolean;\n}\n\nexport type FilterMenuValue = string[] | boolean | string;\nexport type FilterMenuValues = Record<string, FilterMenuValue | undefined>;\n\nexport interface FilterMenuChangeDetail {\n filterId: string;\n value: FilterMenuValue;\n}\n\nlet filterMenuId = 0;\n\nconst ICON_SIZE: Record<FilterMenuSize, 'lg' | 'md' | 'sm' | 'xs'> = {\n lg: 'lg',\n md: 'md',\n sm: 'sm',\n xs: 'xs',\n};\n\n@Component({\n tag: 'ds-filter-menu',\n styleUrl: 'FilterMenu.css',\n scoped: true,\n})\nexport class FilterMenu {\n @Element() el!: HTMLElement;\n\n /** Controlled popup visibility. */\n @Prop({ mutable: true }) open: boolean = false;\n /** Select trigger text. The selected count is appended automatically. */\n @Prop() triggerLabel: string = 'Filters';\n /** Optional select trigger prefix icon name. */\n @Prop() icon: string | undefined = 'Filters';\n /** Select trigger density. */\n @Prop() size: FilterMenuSize = 'md';\n /** Select trigger width fit. */\n @Prop() width: FilterMenuWidth = 'hug';\n /** Show the surface-aware inset border around the select trigger. */\n @Prop() hasBorder: boolean = true;\n /** Show selected interaction fill when one or more criteria are active. */\n @Prop() activeFill: boolean = false;\n /**\n * Opt into table-caption icon-only chrome below 900px. The trigger omits its\n * visible label and chevron; keep an accessible name via aria-label.\n */\n @Prop({ reflect: true }) collapseLabel: boolean = false;\n /** ID applied to the internal select trigger. */\n @Prop() inputId: string | undefined;\n /** Direct accessible name for the internal select trigger. */\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | null = null;\n /** Product-owned filter categories and option definitions. */\n @Prop() filters: FilterMenuFilter[] = [];\n /** Controlled values keyed by filter id. */\n @Prop() values: FilterMenuValues = {};\n /** Controlled category shown in the option pane. */\n @Prop() activeFilterId: string | undefined;\n /** External trigger element to position against. */\n @Prop() anchor: HTMLElement | undefined;\n /** ID of the external trigger element used for positioning and focus return. */\n @Prop() anchorId: string | undefined;\n /** Explicit collision owner; otherwise the nearest data-ds-overlay-boundary ancestor is used. */\n @Prop() boundary: HTMLElement | undefined;\n /** Preferred popup side; collision handling may flip it. */\n @Prop() side: AnchoredSide = 'bottom';\n /** Cross-axis alignment against the trigger. */\n @Prop() align: AnchoredAlign = 'end';\n /** Gap between trigger and popup — number in px or a TokoMo length. */\n @Prop() sideOffset: number | string = TOKEN_CSS_LENGTHS.space050;\n /** Cross-axis offset — number in px or a TokoMo length. */\n @Prop() alignOffset: number | string = 0;\n /** Popup width. It remains clamped to its collision boundary by the component recipe. */\n @Prop() menuWidth: string = TOKEN_CSS_LENGTHS.menuWidthLg;\n /** Accessible name for the non-modal filter dialog. */\n @Prop() menuLabel: string = 'Filters';\n /** Accessible name for the category tab list. */\n @Prop() categoriesLabel: string = 'Filter categories';\n /** Footer action and date-clear accessible label. */\n @Prop() clearLabel: string = 'Clear';\n /** Show a visible focus ring on initial entry after keyboard activation. */\n @Prop() initialFocusVisible: boolean = false;\n\n @State() private shouldRender = false;\n @State() private closing = false;\n @State() private positionReady = false;\n @State() private pos: { x: number; y: number } = { x: 0, y: 0 };\n @State() private focusRingVisible = false;\n @State() private activeOptionIndex = 0;\n @State() private captionCompact = false;\n\n /** Requests a controlled value replacement without closing the popup. */\n @Event() dsChange!: EventEmitter<FilterMenuChangeDetail>;\n /** Requests that the consumer clear every filter value. */\n @Event() dsClear!: EventEmitter<void>;\n /** Requests a controlled active-category replacement. */\n @Event() dsActiveFilterChange!: EventEmitter<string>;\n /** Requests that the controlled popup close. */\n @Event() dsClose!: EventEmitter<void>;\n /** Emitted whenever internal select-trigger activation changes popup visibility. */\n @Event() dsOpenChange!: EventEmitter<boolean>;\n /** Emitted after exit motion and rendered popup removal complete. */\n @Event() dsAfterClose!: EventEmitter<void>;\n\n private readonly generatedId = `ds-filter-menu-${++filterMenuId}`;\n private triggerElement: HTMLButtonElement | null = null;\n private pendingInitialFocusVisible = false;\n private closeTimer: ReturnType<typeof setTimeout> | null = null;\n private captionCompactDisconnect: (() => void) | undefined;\n private hasLoaded = false;\n private closingSnapshot: {\n filters: FilterMenuFilter[];\n values: FilterMenuValues;\n activeFilterId: string | undefined;\n } | null = null;\n\n private readonly position = new AnchoredPositionController({\n getAnchor: () => this.resolvedAnchor,\n getPopup: () => this.el.querySelector<HTMLElement>('.filter-menu-popup'),\n getOwnerDocument: () => this.el.ownerDocument,\n measure: (anchor, popup) => {\n if (!this.open) return null;\n const anchorRect = anchor.getBoundingClientRect();\n const sectionInsetPx = resolveCssLengthPx(TOKEN_DEFAULTS.space050, TOKEN_DEFAULTS.space050);\n return {\n anchorRect,\n popupWidth: popup.offsetWidth || this.popupFallbackWidth,\n popupHeight: popup.offsetHeight || this.popupFallbackHeight,\n side: this.side,\n align: this.align,\n sideOffsetPx: resolveCssLengthPx(this.sideOffset, TOKEN_DEFAULTS.space050),\n alignOffsetPx: resolveChoicePopupAlignOffset({\n align: this.align,\n alignOffsetPx: resolveCssLengthPx(this.alignOffset, 0),\n sectionInsetPx,\n }),\n viewportPadPx: this.viewportPad,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n collisionRect: resolveAnchoredOverlayBoundaryRect(anchor, this.boundary),\n };\n },\n apply: ({ x, y }) => {\n this.pos = { x, y };\n },\n onReady: () => {\n this.positionReady = true;\n },\n liveUpdate: 'double-frame',\n observeResize: true,\n topLayer: true,\n });\n private readonly interaction = new AnchoredOverlayInteractionController({\n getAnchor: () => this.resolvedAnchor,\n getPopup: () => this.el.querySelector<HTMLElement>('.filter-menu-popup'),\n getOwnerDocument: () => this.el.ownerDocument,\n onOutsideActivation: () => this.close(),\n });\n\n componentDidLoad() {\n this.hasLoaded = true;\n this.syncCaptionCompactObserver();\n if (this.open) this.onOpenChange(true);\n }\n\n connectedCallback() {\n if (!this.hasLoaded) return;\n this.syncCaptionCompactObserver();\n if (this.open) this.onOpenChange(true);\n }\n\n disconnectedCallback() {\n this.disconnectCaptionCompactObserver();\n this.position.unobserve();\n this.teardownListeners();\n }\n\n @Watch('collapseLabel')\n onCollapseLabelChange() {\n this.syncCaptionCompactObserver();\n }\n\n @Watch('open')\n onOpenChange(isOpen: boolean) {\n if (isOpen) {\n this.teardownListeners();\n this.closingSnapshot = null;\n this.shouldRender = true;\n this.closing = false;\n this.positionReady = false;\n this.focusRingVisible = this.pendingInitialFocusVisible || this.initialFocusVisible;\n this.setupListeners();\n this.position.schedule(() => this.focusInitialCategory());\n return;\n }\n\n if (!this.shouldRender) return;\n this.position.cancel();\n this.captureClosingSnapshot();\n this.closing = true;\n this.teardownListeners();\n const duration = resolveMotionTimeMs(\n TOKEN_DEFAULTS.motionShort2,\n TOKEN_DEFAULTS.animationDurationShort3\n );\n if (duration <= 0) {\n this.finishClose();\n return;\n }\n this.closeTimer = setTimeout(() => this.finishClose(), duration);\n }\n\n @Watch('anchor')\n @Watch('anchorId')\n @Watch('boundary')\n @Watch('side')\n @Watch('align')\n @Watch('sideOffset')\n @Watch('alignOffset')\n @Watch('menuWidth')\n onPositionInputChange() {\n if (this.open) this.position.schedule();\n }\n\n @Listen('keydown')\n handleKeyDown(event: KeyboardEvent) {\n if (!this.shouldRender || this.closing) return;\n if (event.key === 'Escape') {\n event.preventDefault();\n this.close();\n return;\n }\n if (event.key !== 'Tab' || !this.tabLeavesPopup(event)) return;\n event.preventDefault();\n this.close(false);\n this.interaction.moveFocusAfterTab(event.shiftKey);\n }\n\n private get resolvedAnchor(): HTMLElement | null {\n if (this.anchor) return this.anchor;\n if (this.anchorId) return document.getElementById(this.anchorId);\n return this.triggerElement;\n }\n\n private get usesInternalTrigger(): boolean {\n return !this.anchor && !this.anchorId;\n }\n\n private get viewportPad(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.space050, TOKEN_DEFAULTS.space050);\n }\n\n private get popupFallbackWidth(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.menuWidthLg, TOKEN_DEFAULTS.menuWidthLg);\n }\n\n private get popupFallbackHeight(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.menuFallbackHeight, TOKEN_DEFAULTS.menuFallbackHeight);\n }\n\n private setupListeners() {\n this.interaction.connect();\n this.position.observe();\n }\n\n private teardownListeners() {\n this.position.unobserve();\n this.interaction.disconnect();\n if (this.closeTimer) {\n clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n }\n\n private close(restoreFocus = true) {\n this.captureClosingSnapshot();\n if (restoreFocus) this.interaction.focusAnchor();\n this.dsOpenChange.emit(false);\n this.dsClose.emit();\n this.open = false;\n this.onOpenChange(false);\n }\n\n private toggleFromTrigger(event: MouseEvent) {\n if (this.open) {\n this.close();\n return;\n }\n this.pendingInitialFocusVisible = event.detail === 0;\n this.open = true;\n this.dsOpenChange.emit(true);\n this.onOpenChange(true);\n }\n\n private handleTriggerKeyDown(event: KeyboardEvent) {\n if (event.key !== 'ArrowDown' || this.open) return;\n event.preventDefault();\n this.pendingInitialFocusVisible = true;\n this.open = true;\n this.dsOpenChange.emit(true);\n this.onOpenChange(true);\n }\n\n private finishClose() {\n const popup = this.el.querySelector<HTMLElement>('.filter-menu-popup');\n if (popup?.matches(':popover-open')) popup.hidePopover();\n this.shouldRender = false;\n this.closing = false;\n this.closingSnapshot = null;\n this.closeTimer = null;\n this.dsAfterClose.emit();\n }\n\n private captureClosingSnapshot() {\n if (this.closingSnapshot) return;\n this.closingSnapshot = {\n filters: this.filters.map(filter => ({\n ...filter,\n options: filter.options?.map(option => ({ ...option })),\n })),\n values: Object.fromEntries(\n Object.entries(this.values).map(([key, value]) => [\n key,\n Array.isArray(value) ? [...value] : value,\n ])\n ),\n activeFilterId: this.activeFilterId,\n };\n }\n\n private focusInitialCategory() {\n requestAnimationFrame(() => {\n this.el.querySelector<HTMLElement>('.filter-menu__category[tabindex=\"0\"]')?.focus();\n this.pendingInitialFocusVisible = false;\n });\n }\n\n private tabLeavesPopup(event: KeyboardEvent): boolean {\n return this.interaction.tabLeavesPopup(event);\n }\n\n private selectedFilter(filters: FilterMenuFilter[], activeFilterId: string | undefined) {\n return filters.find(filter => filter.id === activeFilterId) ?? filters[0];\n }\n\n private selectedCount(filter: FilterMenuFilter, values: FilterMenuValues): number {\n const value = values[filter.id];\n if (filter.kind === 'multiple') return Array.isArray(value) ? value.length : 0;\n if (filter.kind === 'boolean') return value === true ? 1 : 0;\n return typeof value === 'string' && value.length > 0 ? 1 : 0;\n }\n\n private totalSelected(filters: FilterMenuFilter[], values: FilterMenuValues): number {\n return filters.reduce((total, filter) => total + this.selectedCount(filter, values), 0);\n }\n\n private activeFilterCount(filters: FilterMenuFilter[], values: FilterMenuValues): number {\n return filters.filter(filter => this.selectedCount(filter, values) > 0).length;\n }\n\n private selectCategory(filterId: string, focus = false) {\n this.activeOptionIndex = 0;\n this.dsActiveFilterChange.emit(filterId);\n if (!focus) return;\n requestAnimationFrame(() => {\n this.el.querySelector<HTMLElement>(`[data-filter-category=\"${filterId}\"]`)?.focus();\n });\n }\n\n private handleCategoryKeyDown(\n event: KeyboardEvent,\n filters: FilterMenuFilter[],\n filterId: string\n ) {\n const currentIndex = filters.findIndex(filter => filter.id === filterId);\n let nextIndex: number;\n if (event.key === 'ArrowDown') nextIndex = (currentIndex + 1) % filters.length;\n else if (event.key === 'ArrowUp')\n nextIndex = (currentIndex - 1 + filters.length) % filters.length;\n else if (event.key === 'Home') nextIndex = 0;\n else if (event.key === 'End') nextIndex = filters.length - 1;\n else if (event.key === 'ArrowRight') {\n event.preventDefault();\n requestAnimationFrame(() => {\n this.el\n .querySelector<HTMLElement>(\n '.filter-menu__options [role=\"option\"], .filter-menu__options input'\n )\n ?.focus();\n });\n return;\n } else return;\n\n event.preventDefault();\n this.focusRingVisible = true;\n this.selectCategory(filters[nextIndex].id, true);\n }\n\n private handlePanelKeyDown(event: KeyboardEvent, filterId: string) {\n if (event.key !== 'ArrowLeft') return;\n event.preventDefault();\n this.el.querySelector<HTMLElement>(`[data-filter-category=\"${filterId}\"]`)?.focus();\n }\n\n private handleOptionKeyDown(\n event: KeyboardEvent,\n filter: FilterMenuFilter,\n option: FilterMenuOption,\n index: number,\n values: FilterMenuValues\n ) {\n const options = filter.options ?? [];\n if (event.key === 'ArrowLeft') {\n this.handlePanelKeyDown(event, filter.id);\n return;\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.selectOption(filter, option, values);\n return;\n }\n if (!['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key)) return;\n event.preventDefault();\n const enabled = options\n .map((candidate, optionIndex) => ({ candidate, optionIndex }))\n .filter(({ candidate }) => !candidate.isInactive)\n .map(({ optionIndex }) => optionIndex);\n if (!enabled.length) return;\n const current = enabled.indexOf(index);\n let next: number;\n if (event.key === 'Home') next = enabled[0];\n else if (event.key === 'End') next = enabled[enabled.length - 1];\n else {\n const direction = event.key === 'ArrowDown' ? 1 : -1;\n const start = current >= 0 ? current : direction === 1 ? -1 : 0;\n next = enabled[(start + direction + enabled.length) % enabled.length];\n }\n this.activeOptionIndex = next;\n this.focusRingVisible = true;\n requestAnimationFrame(() => {\n this.el\n .querySelector<HTMLElement>(`#${this.generatedId}-${filter.id}-option-${next}`)\n ?.focus();\n });\n }\n\n private toggleMultiple(\n filter: FilterMenuFilter,\n option: FilterMenuOption,\n checked: boolean,\n values: FilterMenuValues\n ) {\n if (option.isInactive) return;\n const current = Array.isArray(values[filter.id]) ? (values[filter.id] as string[]) : [];\n const selected = new Set(current);\n if (checked) selected.add(option.value);\n else selected.delete(option.value);\n const ordered = (filter.options ?? [])\n .map(candidate => candidate.value)\n .filter(value => selected.has(value));\n this.dsChange.emit({ filterId: filter.id, value: ordered });\n }\n\n private selectOption(\n filter: FilterMenuFilter,\n option: FilterMenuOption,\n values: FilterMenuValues\n ) {\n if (option.isInactive) return;\n if (filter.kind === 'single') {\n this.dsChange.emit({ filterId: filter.id, value: option.value });\n return;\n }\n const selected = Array.isArray(values[filter.id])\n ? (values[filter.id] as string[]).includes(option.value)\n : false;\n this.toggleMultiple(filter, option, !selected, values);\n }\n\n private renderOptions(filter: FilterMenuFilter, values: FilterMenuValues) {\n const value = values[filter.id];\n if (filter.kind === 'multiple' || filter.kind === 'single') {\n const selected = Array.isArray(value) ? value : [];\n const options = filter.options ?? [];\n const usesSubtext = choiceListUsesSubtext(\n options.map(option => ({\n label: option.label,\n value: option.value,\n subtext: option.description,\n }))\n );\n return options.map((option, index) => {\n const isSelected =\n filter.kind === 'multiple' ? selected.includes(option.value) : value === option.value;\n return (\n <ChoiceOptionRow\n size=\"md\"\n id={`${this.generatedId}-${filter.id}-option-${index}`}\n option={{\n label: option.label,\n value: option.value,\n subtext: option.description,\n isInactive: option.isInactive,\n }}\n selected={isSelected}\n active={index === this.activeOptionIndex}\n focusRingVisible={this.focusRingVisible}\n usesSubtext={usesSubtext}\n tabIndex={index === this.activeOptionIndex ? 0 : -1}\n leading={\n filter.kind === '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 label=\"\" size=\"md\" checked={isSelected} presentation />\n </span>\n ) : undefined\n }\n onFocus={() => {\n this.activeOptionIndex = index;\n }}\n onKeyDown={(event: KeyboardEvent) =>\n this.handleOptionKeyDown(event, filter, option, index, values)\n }\n onHover={() => {\n this.focusRingVisible = false;\n this.activeOptionIndex = index;\n }}\n onSelect={() => this.selectOption(filter, option, values)}\n />\n );\n });\n }\n\n if (filter.kind === 'boolean') {\n const option: FilterMenuOption = {\n label: filter.fieldLabel ?? filter.label,\n value: 'true',\n description: filter.description,\n };\n return (\n <ChoiceOptionRow\n size=\"md\"\n id={`${this.generatedId}-${filter.id}-option-0`}\n option={{\n label: option.label,\n value: option.value,\n subtext: option.description,\n }}\n selected={value === true}\n active\n focusRingVisible={this.focusRingVisible}\n usesSubtext={Boolean(option.description)}\n tabIndex={0}\n leading={\n <span\n class=\"ds-choice-item__icon ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-checkbox label=\"\" size=\"md\" checked={value === true} presentation />\n </span>\n }\n onKeyDown={(event: KeyboardEvent) => {\n if (event.key === 'ArrowLeft') this.handlePanelKeyDown(event, filter.id);\n else if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.dsChange.emit({ filterId: filter.id, value: value !== true });\n }\n }}\n onHover={() => {\n this.focusRingVisible = false;\n }}\n onSelect={() => this.dsChange.emit({ filterId: filter.id, value: value !== true })}\n />\n );\n }\n\n const dateValue = typeof value === 'string' ? value : '';\n const inputId = `${this.generatedId}-${filter.id}-input`;\n return (\n <div class=\"filter-menu__date-field\">\n <label htmlFor={inputId}>\n <ds-text as=\"span\" variant=\"text-body-small\" emphasis color=\"primary\">\n {filter.fieldLabel ?? 'Event date'}\n </ds-text>\n </label>\n <div class=\"filter-menu__date-control ds-control-frame ds-control--md\">\n <input\n id={inputId}\n class=\"filter-menu__date-input\"\n type=\"date\"\n value={dateValue}\n onInput={(event: Event) =>\n this.dsChange.emit({\n filterId: filter.id,\n value: (event.target as HTMLInputElement).value,\n })\n }\n />\n {dateValue ? (\n <ds-button-unfilled\n variant=\"icon\"\n icon=\"CrossCircle\"\n size=\"sm\"\n isInset\n hasBorder={false}\n rounded\n ariaLabel={`${this.clearLabel} ${filter.fieldLabel ?? filter.label}`}\n onDsClick={(event: CustomEvent<MouseEvent>) => {\n event.stopPropagation();\n this.dsChange.emit({ filterId: filter.id, value: '' });\n }}\n />\n ) : null}\n </div>\n </div>\n );\n }\n\n private get captionIconOnly(): boolean {\n return (\n this.collapseLabel && this.captionCompact && this.usesInternalTrigger && Boolean(this.icon)\n );\n }\n\n private syncCaptionCompactObserver(): void {\n this.disconnectCaptionCompactObserver();\n if (!this.collapseLabel) {\n if (this.captionCompact) this.captionCompact = false;\n return;\n }\n this.captionCompactDisconnect = observeTableCaptionCompact(this.el, compact => {\n if (this.captionCompact !== compact) this.captionCompact = compact;\n });\n }\n\n private disconnectCaptionCompactObserver(): void {\n this.captionCompactDisconnect?.();\n this.captionCompactDisconnect = undefined;\n }\n\n private renderCaptionTooltip(trigger: VNode, label: string): VNode {\n if (!this.collapseLabel) return trigger;\n return (\n <ds-tooltip label={label} side=\"top\" size=\"sm\">\n {trigger}\n </ds-tooltip>\n );\n }\n\n render() {\n const state =\n this.closing && this.closingSnapshot\n ? this.closingSnapshot\n : {\n filters: this.filters,\n values: this.values,\n activeFilterId: this.activeFilterId,\n };\n const activeFilter = this.selectedFilter(state.filters, state.activeFilterId);\n const totalSelected = this.totalSelected(state.filters, state.values);\n const activeFilterCount = this.activeFilterCount(state.filters, state.values);\n const hasActiveFilters = activeFilterCount > 0;\n const label = `${this.triggerLabel}${hasActiveFilters ? ` · ${activeFilterCount}` : ''}`;\n const textVariant = CONTROL_TEXT_VARIANT[this.size];\n const iconSize = ICON_SIZE[this.size];\n const popupId = `${this.generatedId}-popup`;\n const popupStyle: Record<string, string> = {\n position: 'fixed',\n left: '0',\n top: '0',\n width: this.menuWidth,\n transform: `translate(${Math.round(this.pos.x)}px, ${Math.round(this.pos.y)}px)`,\n zIndex: '9998',\n visibility: this.positionReady ? 'visible' : 'hidden',\n };\n\n return (\n <Host\n class={{\n 'filter-menu-host': true,\n 'filter-menu-host--external-trigger': !this.usesInternalTrigger,\n 'ds-select-trigger-host': this.usesInternalTrigger,\n [`ds-control--${this.size}`]: true,\n 'ds-table-caption-control': this.collapseLabel,\n 'ds-table-caption-control--compact': this.captionIconOnly,\n ...controlWidthClass(this.width),\n }}\n >\n {this.usesInternalTrigger\n ? this.renderCaptionTooltip(\n <button\n ref={element => {\n this.triggerElement = (element as HTMLButtonElement) ?? null;\n }}\n id={this.inputId ?? `${this.generatedId}-trigger`}\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': this.activeFill && hasActiveFilters,\n 'trigger--expanded': this.open || this.closing,\n 'trigger--bordered': this.hasBorder,\n 'trigger--has-value': hasActiveFilters,\n [`ds-control--${this.size}`]: true,\n }}\n role=\"combobox\"\n aria-haspopup=\"dialog\"\n aria-expanded={String(this.open)}\n aria-controls={this.open ? popupId : undefined}\n aria-label={this.ariaLabel ?? this.menuLabel}\n onClick={(event: MouseEvent) => this.toggleFromTrigger(event)}\n onKeyDown={(event: KeyboardEvent) => this.handleTriggerKeyDown(event)}\n >\n {this.icon ? (\n <span\n class=\"trigger__prefix ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-icon name={this.icon} size={iconSize} color=\"inherit\" />\n </span>\n ) : null}\n {this.captionIconOnly ? null : (\n <ds-text\n class=\"trigger__label-box trigger__label trigger__label-content 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 )}\n {this.captionIconOnly ? null : (\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 )}\n </button>,\n this.captionIconOnly ? label : ''\n )\n : null}\n\n {this.shouldRender ? (\n <div\n id={popupId}\n popover=\"manual\"\n class={{\n 'filter-menu-popup': true,\n 'ds-choice-popup': true,\n 'ds-choice-popup--closing': this.closing,\n }}\n style={popupStyle}\n role=\"dialog\"\n aria-label={this.menuLabel}\n >\n {activeFilter ? (\n <div class=\"filter-menu\">\n <div class=\"filter-menu__body\">\n <div\n class=\"filter-menu__categories ds-choice-list ds-chrome-column ds-chrome-space--sm\"\n role=\"tablist\"\n aria-label={this.categoriesLabel}\n aria-orientation=\"vertical\"\n >\n {state.filters.map(filter => {\n const active = filter.id === activeFilter.id;\n const count = this.selectedCount(filter, state.values);\n return (\n <div\n key={filter.id}\n class={{\n 'filter-menu__category-section': true,\n 'ds-choice-section--divided': Boolean(filter.divider),\n }}\n >\n <button\n id={`${this.generatedId}-${filter.id}-tab`}\n type=\"button\"\n role=\"tab\"\n data-filter-category={filter.id}\n class={{\n 'filter-menu__category': true,\n 'filter-menu__category--active': active,\n 'ds-choice-item': true,\n 'ds-control-frame': true,\n 'ds-control--md': true,\n 'ds-focus-ring-inset': true,\n 'ds-focus-ring--visible': active && this.focusRingVisible,\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--selected': active,\n }}\n aria-selected={String(active)}\n aria-controls={`${this.generatedId}-panel`}\n tabIndex={active ? 0 : -1}\n onMouseDown={() => {\n this.focusRingVisible = false;\n }}\n onClick={() => this.selectCategory(filter.id)}\n onKeyDown={(event: KeyboardEvent) =>\n this.handleCategoryKeyDown(event, state.filters, filter.id)\n }\n >\n <ds-text\n class=\"ds-choice-item__content ds-choice-item__label ds-control-label-box ds-interaction-fill__content\"\n as=\"span\"\n variant=\"text-body-medium\"\n color={active ? 'primary' : 'secondary'}\n >\n {filter.label}\n </ds-text>\n {count > 0 ? (\n <ds-tag\n class=\"ds-choice-item__tag ds-interaction-fill__content\"\n label={String(count)}\n size=\"sm\"\n intent=\"brand\"\n contrast=\"bold\"\n isInset\n rounded\n />\n ) : null}\n </button>\n </div>\n );\n })}\n </div>\n\n <div\n id={`${this.generatedId}-panel`}\n class=\"filter-menu__options\"\n role=\"tabpanel\"\n aria-labelledby={`${this.generatedId}-${activeFilter.id}-tab`}\n >\n <div\n key={activeFilter.id}\n class=\"filter-menu__option-list ds-choice-list ds-chrome-column ds-chrome-space--sm\"\n role=\"listbox\"\n aria-label={activeFilter.label}\n aria-multiselectable={activeFilter.kind === 'multiple' ? 'true' : undefined}\n >\n {this.renderOptions(activeFilter, state.values)}\n </div>\n </div>\n </div>\n\n {totalSelected > 0 ? (\n <div class=\"filter-menu__footer ds-choice-footer\">\n <div class=\"ds-choice-footer__content ds-control--md\">\n <ds-text\n class=\"ds-choice-footer__summary\"\n as=\"span\"\n variant=\"text-body-medium\"\n color=\"secondary\"\n aria-live=\"polite\"\n >\n {totalSelected} selected\n </ds-text>\n <button\n class=\"filter-menu__clear ds-choice-footer__clear ds-text-action\"\n type=\"button\"\n onClick={() => this.dsClear.emit()}\n >\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"inherit\">\n {this.clearLabel}\n </ds-text>\n </button>\n </div>\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["tabGroupCss","TabGroup","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","value","tabs","size","width","ariaLabel","selectableTabs","getSelectableTabs","focusableTabId","some","tab","id","isInactive","find","selectTab","options","dsChange","emit","focus","focusTab","btn","el","querySelector","preventScroll","onValueChange","next","prev","undefined","requestAnimationFrame","active","document","activeElement","contains","activeId","getAttribute","focusId","nextTab","blur","findEnabled","from","step","len","length","n","i","handleKeyDown","e","focusedId","target","closest","dataset","currentIdx","findIndex","t","nextIdx","key","first","lastEnabled","reverse","preventDefault","getBgClass","background","render","bgClass","h","Host","class","controlWidthClass","role","ariaLabelledby","map","index","isTabDivider","isSelected","variant","showIcon","showLabel","emphasizeLabel","type","label","panelId","disabled","tabIndex","onClick","tab__content","dot","name","icon","color","as","CONTROL_TEXT_VARIANT","emphasis","hasRing"],"sources":["src/wc/components/TabGroup/TabGroup.css?tag=ds-tab-group&encapsulation=scoped","src/wc/components/TabGroup/TabGroup.tsx"],"sourcesContent":["@import '../../utils/control-density.css';\n@import '../../utils/control-density-inset.css';\n@import '../../utils/control-width.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/interaction-fill.css';\n@import '../../utils/control-inactive.css';\n\n:host {\n display: block;\n --_tab-group-surface-border: var(--color-border-tertiary);\n --_tab-group-divider: var(--color-border-secondary);\n}\n\n:host(.tab-group-host--on-faint) {\n --_tab-group-selected-fill: var(--color-interaction-active);\n}\n\n:host(.tab-group-host--on-medium) {\n --_tab-group-surface-border: var(--color-border-on-medium-background-tertiary);\n --_tab-group-divider: var(--color-border-on-medium-background-secondary);\n --_tab-group-selected-fill: var(--color-interaction-on-medium-background-active);\n}\n\n:host(.tab-group-host--on-bold) {\n --_tab-group-surface-border: var(--color-border-on-bold-background-tertiary);\n --_tab-group-divider: var(--color-border-on-bold-background-secondary);\n --_tab-group-selected-fill: var(--color-interaction-on-bold-background-active);\n}\n\n:host(.tab-group-host--on-strong) {\n --_tab-group-surface-border: var(--color-border-on-strong-background-tertiary);\n --_tab-group-divider: var(--color-border-on-strong-background-secondary);\n --_tab-group-selected-fill: var(--color-interaction-on-strong-background-active);\n}\n\n:host(.tab-group-host--on-translucent) {\n --_tab-group-surface-border: var(--color-translucent-border-tertiary);\n --_tab-group-divider: var(--color-translucent-border-secondary);\n --_tab-group-selected-fill: var(--color-translucent-interaction-active);\n}\n\n:host(.tab-group-host--on-inverted) {\n --_tab-group-surface-border: var(--color-inverted-border-tertiary);\n --_tab-group-divider: var(--color-inverted-border-secondary);\n --_tab-group-selected-fill: var(--color-inverted-interaction-active);\n}\n\n:host(.tab-group-host--on-media) {\n --_tab-group-surface-border: var(--color-media-border-tertiary);\n --_tab-group-divider: var(--color-media-border-secondary);\n --_tab-group-selected-fill: var(--color-media-interaction-active);\n}\n\n:host(.tab-group-host--on-always-dark) {\n --_tab-group-surface-border: var(--color-always-dark-border-tertiary);\n --_tab-group-divider: var(--color-always-dark-border-secondary);\n --_tab-group-selected-fill: var(--color-always-dark-interaction-active);\n}\n\n.tab-list {\n display: flex;\n align-items: center;\n gap: var(--ds-control-gap);\n position: relative;\n width: max-content;\n max-width: 100%;\n height: var(--ds-control-height);\n padding: calc(var(--dimension-space-025) - var(--dimension-stroke-width-012));\n background-color: var(--color-background-secondary);\n border: var(--dimension-stroke-width-012) solid var(--_tab-group-surface-border);\n border-radius: var(--dimension-radius-half);\n box-sizing: border-box;\n}\n\n:host(.ds-control-width--fill) .tab-list {\n width: 100%;\n}\n\n:host(.tab-group-host--surface) .tab-list {\n background-color: transparent;\n}\n\n.tab {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--ds-control-gap);\n padding: 0 var(--ds-control-padding-inline);\n background-color: transparent;\n border: none;\n border-radius: var(--dimension-radius-half);\n cursor: default;\n -webkit-user-select: none;\n user-select: none;\n color: var(--color-foreground-secondary);\n transition: color var(--effect-motion-short-2);\n flex-shrink: 0;\n height: var(--ds-control-height);\n min-width: var(--ds-control-height);\n box-sizing: border-box;\n --_dot: var(--color-foreground-bold-brand);\n /* Hover/press: `.ds-interaction-fill` fills cover the complete segment. */\n}\n\n:host(.ds-control-width--fill) .tab {\n flex: 1 1 0;\n min-width: 0;\n overflow: hidden;\n}\n\n:host(.ds-control-width--fill) .tab__content {\n max-width: 100%;\n overflow: hidden;\n}\n\n:host(.ds-control-width--fill) .tab__label {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.tab--selected {\n color: var(--color-foreground-primary);\n background-color: var(--color-background-primary);\n /* Inset stroke on interaction-fill ::after — stays above hover wash. */\n --ds-interaction-border-width: var(--dimension-stroke-width-012);\n --ds-interaction-border-color: var(--_tab-group-surface-border);\n}\n\n:host(.tab-group-host--surface) .tab--selected {\n background-color: var(--_tab-group-selected-fill);\n}\n\n.tab--selected:not(.ds-interaction-fill) {\n box-shadow: inset 0 0 0 var(--ds-interaction-border-width) var(--ds-interaction-border-color);\n}\n\n/* Inactive: `.ds-control-inactive` (50% opacity) — applied via class in TSX. */\n\n.tab__content {\n position: relative;\n z-index: 2;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--ds-control-gap);\n min-width: 0;\n}\n\n.tab__content--dot {\n padding-right: var(--dimension-space-050);\n}\n\n.tab__label {\n padding: 0 var(--ds-control-label-inset);\n white-space: nowrap;\n}\n\n.tab__icon {\n flex-shrink: 0;\n}\n\n.tab__dot {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n pointer-events: none;\n}\n\n.on-medium {\n color: var(--color-foreground-on-medium-background-secondary);\n}\n\n.on-medium.tab--selected {\n color: var(--color-foreground-on-medium-background-primary);\n}\n\n.on-bold {\n color: var(--color-foreground-on-bold-background-secondary);\n}\n\n.on-bold.tab--selected {\n color: var(--color-foreground-on-bold-background-primary);\n}\n\n.on-strong {\n color: var(--color-foreground-on-strong-background-secondary);\n}\n\n.on-strong.tab--selected {\n color: var(--color-foreground-on-strong-background-primary);\n}\n\n.on-translucent {\n color: var(--color-translucent-foreground-secondary);\n}\n\n.on-translucent.tab--selected {\n color: var(--color-translucent-foreground-primary);\n}\n\n.on-inverted {\n color: var(--color-inverted-foreground-secondary);\n}\n\n.on-inverted.tab--selected {\n color: var(--color-inverted-foreground-primary);\n}\n\n.on-media {\n color: var(--color-media-foreground-secondary);\n}\n\n.on-media.tab--selected {\n color: var(--color-media-foreground-primary);\n}\n\n.on-always-dark {\n color: var(--color-always-dark-foreground-secondary);\n}\n\n.on-always-dark.tab--selected {\n color: var(--color-always-dark-foreground-primary);\n}\n\n.tab-divider {\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: var(--dimension-stroke-width-012);\n align-self: center;\n padding: 0;\n flex-shrink: 0;\n pointer-events: none;\n}\n\n.tab-divider__line {\n width: var(--dimension-stroke-width-012);\n height: var(--typography-lineheight-sm);\n flex-shrink: 0;\n background-color: var(--_tab-group-divider);\n}\n","import {\n Component,\n Prop,\n Event,\n EventEmitter,\n Element,\n Listen,\n Watch,\n h,\n Host,\n} from '@stencil/core';\nimport { controlWidthClass, CONTROL_TEXT_VARIANT, type ControlWidth } from '../../utils';\nimport {\n getSelectableTabs,\n isTabDivider,\n type TabGroupItem,\n type TabItemTab,\n} from './tab-item-utils';\n\nexport type TabBackground =\n | 'faint'\n | 'medium'\n | 'bold'\n | 'strong'\n | 'translucent'\n | 'inverted'\n | 'media'\n | 'always-dark';\n\nexport type TabGroupSize = 'sm' | 'md' | 'lg';\nexport type TabGroupWidth = ControlWidth;\n\n@Component({\n tag: 'ds-tab-group',\n styleUrl: 'TabGroup.css',\n scoped: true,\n})\nexport class TabGroup {\n @Element() el!: HTMLElement;\n\n @Prop({ mutable: true }) value: string = '';\n @Prop() tabs: TabGroupItem[] = [];\n /** Control density: 24px small, 32px medium, or 40px large track. */\n @Prop() size: TabGroupSize = 'md';\n /** Width fit — hug content (default) or fill the parent with equal-width segments. */\n @Prop() width: TabGroupWidth = 'hug';\n @Prop() background: TabBackground | undefined;\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | null = null;\n @Prop({ attribute: 'aria-labelledby' }) ariaLabelledby: string | undefined;\n\n @Event() dsChange!: EventEmitter<string>;\n\n private get selectableTabs(): TabItemTab[] {\n return getSelectableTabs(this.tabs);\n }\n\n private get focusableTabId(): string {\n return this.selectableTabs.some(tab => tab.id === this.value && !tab.isInactive)\n ? this.value\n : (this.selectableTabs.find(tab => !tab.isInactive)?.id ?? '');\n }\n\n private selectTab(id: string, options?: { focus?: boolean }) {\n this.value = id;\n this.dsChange.emit(id);\n if (options?.focus !== false) {\n this.focusTab(id);\n }\n }\n\n private focusTab(id: string) {\n const btn = this.el.querySelector(`[data-tab-id=\"${id}\"]`) as HTMLElement | null;\n btn?.focus({ preventScroll: true });\n }\n\n /** Keep focus on the selected tab when value changes externally (e.g. BarNav menu). */\n @Watch('value')\n onValueChange(next: string, prev: string | undefined) {\n if (prev === undefined || next === prev) return;\n\n requestAnimationFrame(() => {\n const active = document.activeElement as HTMLElement | null;\n if (!active || !this.el.contains(active)) return;\n\n const activeId = active.getAttribute('data-tab-id');\n if (activeId === next) return;\n\n const focusId = this.selectableTabs.some(tab => tab.id === next && !tab.isInactive)\n ? next\n : this.focusableTabId;\n const nextTab = this.el.querySelector(`[data-tab-id=\"${focusId}\"]`) as HTMLElement | null;\n if (nextTab) {\n nextTab.focus({ preventScroll: true });\n } else {\n active.blur();\n }\n });\n }\n\n /**\n * Find the next non-inactive tab index relative to `from`, stepping by `step`.\n * Returns `from` unchanged if no other enabled tab exists.\n */\n private findEnabled(from: number, step: 1 | -1): number {\n const tabs = this.selectableTabs;\n const len = tabs.length;\n for (let n = 0; n < len; n++) {\n const i = (from + step * (n + 1) + len * (n + 1)) % len;\n if (!tabs[i]?.isInactive) return i;\n }\n return from;\n }\n\n @Listen('keydown')\n handleKeyDown(e: KeyboardEvent) {\n const tabs = this.selectableTabs;\n if (!tabs.length) return;\n\n const focusedId = (e.target as Element | null)?.closest<HTMLElement>('[data-tab-id]')?.dataset[\n 'tabId'\n ];\n const currentIdx = tabs.findIndex(t => t.id === (focusedId ?? this.focusableTabId));\n\n let nextIdx: number | null = null;\n\n if (e.key === 'ArrowRight') {\n nextIdx = this.findEnabled(currentIdx, 1);\n } else if (e.key === 'ArrowLeft') {\n nextIdx = this.findEnabled(currentIdx, -1);\n }\n\n if (e.key === 'Home') {\n const first = tabs.findIndex(t => !t.isInactive);\n nextIdx = first === -1 ? null : first;\n } else if (e.key === 'End') {\n const lastEnabled = [...tabs].reverse().findIndex(t => !t.isInactive);\n nextIdx = lastEnabled === -1 ? null : tabs.length - 1 - lastEnabled;\n }\n\n if (nextIdx !== null) {\n e.preventDefault();\n const next = tabs[nextIdx];\n this.selectTab(next.id);\n }\n }\n\n private getBgClass(): string {\n if (!this.background) return '';\n if (this.background === 'always-dark') return 'on-always-dark';\n return `on-${this.background}`;\n }\n\n render() {\n const bgClass = this.getBgClass();\n const focusableTabId = this.focusableTabId;\n\n return (\n <Host\n class={{\n 'tab-group-host': true,\n [`tab-group-host--${this.size}`]: true,\n [`ds-control--${this.size}`]: true,\n 'tab-group-host--surface': !!bgClass,\n [`tab-group-host--${bgClass}`]: !!bgClass,\n ...controlWidthClass(this.width),\n }}\n >\n <div\n role=\"tablist\"\n class=\"tab-list\"\n aria-label={this.ariaLabel}\n aria-labelledby={this.ariaLabelledby}\n >\n {this.tabs.map((tab, index) => {\n if (isTabDivider(tab)) {\n return (\n <div key={`divider-${index}`} class=\"tab-divider\" aria-hidden=\"true\">\n <div class=\"tab-divider__line\" />\n </div>\n );\n }\n\n const isSelected = tab.id === this.value;\n const variant = tab.variant ?? 'label';\n const showIcon = variant === 'icon' || variant === 'icon-label';\n const showLabel = variant === 'label' || variant === 'icon-label';\n const emphasizeLabel = isSelected && !bgClass;\n return (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n data-tab-id={tab.id}\n class={{\n tab: true,\n 'tab--selected': isSelected,\n [`ds-control--${this.size}`]: true,\n 'ds-control--inset': true,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': !tab.isInactive,\n 'ds-interaction-fill--on-faint': bgClass === 'on-faint',\n 'ds-interaction-fill--on-medium': bgClass === 'on-medium',\n 'ds-interaction-fill--on-bold': bgClass === 'on-bold',\n 'ds-interaction-fill--on-strong': bgClass === 'on-strong',\n 'ds-interaction-fill--on-translucent': bgClass === 'on-translucent',\n 'ds-interaction-fill--on-inverted': bgClass === 'on-inverted',\n 'ds-interaction-fill--on-media': bgClass === 'on-media',\n 'ds-interaction-fill--on-always-dark': bgClass === 'on-always-dark',\n 'ds-control-inactive': !!tab.isInactive,\n [bgClass]: !!bgClass,\n }}\n aria-label={variant === 'icon' ? tab.label : undefined}\n aria-selected={isSelected}\n aria-disabled={tab.isInactive ? 'true' : undefined}\n aria-controls={tab.panelId ?? undefined}\n disabled={tab.isInactive}\n tabIndex={tab.id === focusableTabId ? 0 : -1}\n onClick={() => !tab.isInactive && this.selectTab(tab.id)}\n >\n <span\n class={{\n tab__content: true,\n [`tab__content--${variant}`]: true,\n 'tab__content--dot': !!tab.dot,\n }}\n >\n {showIcon && (\n <ds-icon class=\"tab__icon\" name={tab.icon} size={this.size} color=\"inherit\" />\n )}\n {showLabel && (\n <ds-text\n class=\"tab__label\"\n as=\"span\"\n variant={CONTROL_TEXT_VARIANT[this.size]}\n emphasis={emphasizeLabel}\n color=\"inherit\"\n >\n {tab.label}\n </ds-text>\n )}\n {tab.dot && (\n <ds-badge\n class=\"tab__dot\"\n variant=\"dot\"\n hasRing={false}\n label=\"\"\n aria-hidden=\"true\"\n />\n )}\n </span>\n </button>\n );\n })}\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|