@ds-mo/ui 12.6.0 → 12.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.build-stamp +1 -1
- package/dist/agent-patterns.json +1 -1
- package/dist/agent.json +7 -6
- package/dist/components/ds-agent-response.js +1 -1
- package/dist/components/ds-bar-nav.js +1 -1
- package/dist/components/ds-bar-nav.js.map +1 -1
- package/dist/components/ds-bar-title.js +1 -1
- package/dist/components/ds-bar-title.js.map +1 -1
- package/dist/components/ds-bar-workflow.js +1 -1
- package/dist/components/ds-breadcrumb.js +1 -1
- package/dist/components/ds-button-filled.js +1 -1
- package/dist/components/ds-button-unfilled.js +1 -1
- package/dist/components/ds-card-data-viz-bar.js +1 -1
- package/dist/components/ds-card-data-viz-donut.js +1 -1
- package/dist/components/ds-card-data-viz-line.js +1 -1
- package/dist/components/ds-card-setting.js +1 -1
- package/dist/components/ds-chart-legend.js +1 -1
- package/dist/components/ds-chart-legend.js.map +1 -1
- package/dist/components/ds-checkbox.js +1 -1
- package/dist/components/ds-chip.js +1 -1
- package/dist/components/ds-chip.js.map +1 -1
- package/dist/components/ds-code-block.js +1 -1
- package/dist/components/ds-conversation-list-item.js +1 -1
- package/dist/components/ds-conversation-list-item.js.map +1 -1
- package/dist/components/ds-input.js +1 -1
- package/dist/components/ds-input.js.map +1 -1
- package/dist/components/ds-markdown.js +1 -1
- package/dist/components/ds-menu.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-bar-nav.js +1 -1
- package/dist/components/ds-mobile-bar-nav.js.map +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-mobile-sheet-nav.js.map +1 -1
- package/dist/components/ds-modal.js +1 -1
- package/dist/components/ds-panel-nav.js +1 -1
- package/dist/components/ds-panel-nav.js.map +1 -1
- package/dist/components/ds-panel-sub-nav.js +1 -1
- package/dist/components/ds-panel-sub-nav.js.map +1 -1
- package/dist/components/ds-panel-tool-header.js +1 -1
- package/dist/components/ds-panel-tool-search.js +1 -1
- package/dist/components/ds-panel-tools.js +1 -1
- package/dist/components/ds-radio.js +1 -1
- package/dist/components/ds-radio.js.map +1 -1
- package/dist/components/ds-select-multi.js +1 -1
- package/dist/components/ds-select-multi.js.map +1 -1
- package/dist/components/ds-select.js +1 -1
- package/dist/components/ds-select.js.map +1 -1
- package/dist/components/ds-shell-gradient-picker.js +1 -1
- package/dist/components/ds-shell-gradient-swatch.js +1 -1
- package/dist/components/ds-shell-gradient-swatch.js.map +1 -1
- package/dist/components/ds-shell-tools.js +1 -1
- package/dist/components/ds-shell-tools.js.map +1 -1
- package/dist/components/ds-swatch-picker.js +1 -1
- package/dist/components/ds-switch.js +1 -1
- package/dist/components/ds-tab-group.js +1 -1
- package/dist/components/ds-tag.js +1 -1
- package/dist/components/ds-tag.js.map +1 -1
- package/dist/components/ds-toast.js +1 -1
- package/dist/components/ds-toast.js.map +1 -1
- package/dist/components/p-4h7vAqyJ.js +2 -0
- package/dist/components/p-4h7vAqyJ.js.map +1 -0
- package/dist/components/p-6WdUnsGC.js +2 -0
- package/dist/components/{p-DD1Lgs7O.js.map → p-6WdUnsGC.js.map} +1 -1
- package/dist/components/p-BdPaDhDe.js +2 -0
- package/dist/components/p-BdPaDhDe.js.map +1 -0
- package/dist/components/{p-CICGtu7H.js → p-BqPLwCrR.js} +2 -2
- package/dist/components/{p-D4o2D1hk.js → p-CKGlB6Ow.js} +2 -2
- package/dist/components/p-CPK5Tgae.js +2 -0
- package/dist/components/{p-DTea1Du7.js.map → p-CPK5Tgae.js.map} +1 -1
- package/dist/components/p-CUWxI1u0.js +2 -0
- package/dist/components/{p-CXcjwduV.js.map → p-CUWxI1u0.js.map} +1 -1
- package/dist/components/p-D65itwnc.js +2 -0
- package/dist/components/{p-DcFfilOX.js.map → p-D65itwnc.js.map} +1 -1
- package/dist/components/p-DikRzG5f.js +2 -0
- package/dist/components/{p-YtgcuJYx.js.map → p-DikRzG5f.js.map} +1 -1
- package/dist/components/{p-DvVW0hxm.js → p-Dq1vMuJb.js} +2 -2
- package/dist/components/{p-CvKKmZJj.js → p-DzRBKJ2L.js} +2 -2
- package/dist/components/p-P5BMmQAc.js +2 -0
- package/dist/components/{p-CFpWrYAH.js.map → p-P5BMmQAc.js.map} +1 -1
- package/dist/components/{p-D9iN80yX.js → p-hLPTSGdo.js} +2 -2
- package/dist/components/p-rsIOpkzV.js +2 -0
- package/dist/components/{p-46nk9-RO.js.map → p-rsIOpkzV.js.map} +1 -1
- package/dist/docs/components.json +2 -2
- package/dist/mcp-data/registry/menu.json +7 -7
- package/dist/mcp-data/registry/mobile-bar-nav.json +2 -2
- package/dist/mcp-data/registry/mobile-section-switcher.json +3 -2
- package/dist/mcp-data/registry/registry.json +6 -5
- package/dist/mcp-data/registry/toast.json +1 -1
- package/dist/types/components/Menu/Menu.d.ts +1 -1
- package/dist/types/components.d.ts +2 -2
- package/package.json +1 -1
- package/dist/components/p--bSkr_yn.js +0 -2
- package/dist/components/p--bSkr_yn.js.map +0 -1
- package/dist/components/p-46nk9-RO.js +0 -2
- package/dist/components/p-CFpWrYAH.js +0 -2
- package/dist/components/p-CXcjwduV.js +0 -2
- package/dist/components/p-DD1Lgs7O.js +0 -2
- package/dist/components/p-DTea1Du7.js +0 -2
- package/dist/components/p-DcFfilOX.js +0 -2
- package/dist/components/p-YtgcuJYx.js +0 -2
- package/dist/components/p-loq_--ce.js +0 -2
- package/dist/components/p-loq_--ce.js.map +0 -1
- /package/dist/components/{p-CICGtu7H.js.map → p-BqPLwCrR.js.map} +0 -0
- /package/dist/components/{p-D4o2D1hk.js.map → p-CKGlB6Ow.js.map} +0 -0
- /package/dist/components/{p-DvVW0hxm.js.map → p-Dq1vMuJb.js.map} +0 -0
- /package/dist/components/{p-CvKKmZJj.js.map → p-DzRBKJ2L.js.map} +0 -0
- /package/dist/components/{p-D9iN80yX.js.map → p-hLPTSGdo.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["computeMenuPosition","computeAnchoredPopupPosition","isMenuGradientPickerSection","section","variant","isMenuSwatchPickerSection","isMenuPickerSection","menuCss","POSITION_RETRY_BUDGET","MENU_FOCUSABLE_SELECTOR","join","snapshotMenuSections","sections","map","options","option","swatchSection","items","item","Menu","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","open","selectionMode","side","align","anchorAlignment","sideOffset","TOKEN_CSS_LENGTHS","space050","alignOffset","initialFocusVisible","menuLabel","shouldRender","closing","pos","x","y","focusedIndex","positionReady","focusRingVisible","clickOutsideHandler","scrollResizeHandler","closeTimer","positionRetryRaf","livePositionRaf","lastRenderedSections","closingSections","componentDidLoad","onOpenChange","componentDidRender","popup","el","querySelector","showPopover","matches","disconnectedCallback","cancelPositionRetry","cancelLivePositionUpdate","teardownListeners","isOpen","setupListeners","schedulePositionUpdate","focusInitialItem","captureClosingSections","closeAnimationMs","finishClose","setTimeout","onAnchorChange","onPositionPropsChange","viewportPadPx","resolveCssLengthPx","TOKEN_DEFAULTS","sideOffsetPx","alignOffsetPx","popupFallbackWidthPx","menuWidthXs","popupFallbackHeightPx","menuFallbackHeight","resolveMotionTimeMs","motionShort2","animationDurationShort3","hidePopover","dsAfterClose","emit","visibleSections","length","activeSections","resolvedAnchor","anchor","anchorId","document","getElementById","anchorFocusTarget","focusAnchor","setFocus","focus","moveFocusAfterTab","backwards","candidates","Array","from","querySelectorAll","filter","element","closest","getClientRects","index","indexOf","compositeTabLeavesPopup","event","focusables","currentIndex","target","shiftKey","flatItems","flatMap","hasCompositeSections","some","cancelAnimationFrame","scheduleLivePositionUpdate","requestAnimationFrame","calculatePosition","onReady","remaining","attempt","anchorEl","anchorRect","getBoundingClientRect","sectionInsetPx","minWidth","style","choicePopupMinWidth","width","removeProperty","next","popupWidth","offsetWidth","popupHeight","offsetHeight","resolveChoicePopupAlignOffset","viewportWidth","window","innerWidth","viewportHeight","innerHeight","flat","selectedIdx","findIndex","it","isSelected","isInactive","firstEnabledIdx","btns","e","t","contains","close","addEventListener","removeEventListener","clearTimeout","restoreFocus","dsClose","handleKeyDown","key","preventDefault","enabled","i","cur","safe","stopPropagation","focusItem","idx","handleItemClick","dsSelect","handleGradientSelect","preset","dsGradientSelect","handleSwatchSelect","value","dsSwatchSelect","render","h","Host","display","flatIdx","popupStyle","position","left","top","transform","Math","round","zIndex","visibility","menuWidth","popover","class","role","undefined","si","header","as","emphasis","color","groupLabel","shellGradientPickerSections","onDsChange","detail","isFocused","isRadioItem","showSwitch","type","isDestructive","String","switchValue","disabled","tabIndex","onMouseDown","onClick","onFocus","label","subtext","dot","hasRing","size","checked","presentation"],"sources":["src/wc/components/Menu/menu-position.ts","src/wc/components/Menu/menu-types.ts","src/wc/components/Menu/Menu.css?tag=ds-menu&encapsulation=scoped","src/wc/components/Menu/Menu.tsx"],"sourcesContent":["import {\n computeAnchoredPopupPosition,\n type AnchoredPopupAlign,\n type AnchoredPopupPositionInput,\n type AnchoredPopupSide,\n} from '../../utils/anchored-popup';\n\nexport type MenuSide = AnchoredPopupSide;\nexport type MenuAlign = AnchoredPopupAlign;\nexport type MenuPositionInput = AnchoredPopupPositionInput;\n\n/** Backward-compatible menu alias for the shared anchored-popup layout math. */\nexport const computeMenuPosition = computeAnchoredPopupPosition;\n","import type { ShellGradientPreset } from '../../shell/shell-gradient-presets';\nimport type { SwatchPickerOption, SwatchPickerSection } from '../SwatchPicker/swatch-picker-types';\n\nexport type { MenuAlign, MenuSide } from './menu-position';\nexport {\n PANEL_NAV_USER_MENU_PLACEMENT,\n PANEL_TOOLS_HEADER_MENU_PLACEMENT,\n type MenuPlacement,\n} from './menu-placement';\n\nexport interface MenuItemData {\n label: string;\n value?: string;\n subtext?: string;\n /** Show a supplemental brand notification dot. */\n dot?: boolean;\n isSelected?: boolean;\n isInactive?: boolean;\n isDestructive?: boolean;\n /** Render a compact switch indicator; the menu row owns interaction. */\n showSwitch?: boolean;\n switchValue?: boolean;\n}\n\nexport interface MenuItemsSection {\n header?: string;\n items: MenuItemData[];\n}\n\nexport interface MenuGradientPickerSection {\n header?: string;\n /** @deprecated Use the generic `swatch-picker` section. */\n variant: 'gradient-picker';\n value: ShellGradientPreset;\n}\n\nexport interface MenuSwatchPickerSection {\n header?: string;\n variant: 'swatch-picker';\n value: string;\n options?: SwatchPickerOption[];\n sections?: SwatchPickerSection[];\n groupLabel?: string;\n}\n\nexport type MenuSection =\n | MenuItemsSection\n | MenuGradientPickerSection\n | MenuSwatchPickerSection;\n\nexport function isMenuGradientPickerSection(\n section: MenuSection,\n): section is MenuGradientPickerSection {\n return 'variant' in section && section.variant === 'gradient-picker';\n}\n\nexport function isMenuSwatchPickerSection(\n section: MenuSection,\n): section is MenuSwatchPickerSection {\n return 'variant' in section && section.variant === 'swatch-picker';\n}\n\nexport function isMenuPickerSection(\n section: MenuSection,\n): section is MenuGradientPickerSection | MenuSwatchPickerSection {\n return isMenuGradientPickerSection(section) || isMenuSwatchPickerSection(section);\n}\n\nexport type { ShellGradientPreset };\nexport type { SwatchPickerOption, SwatchPickerSection };\n","@import '../../utils/choice-list.css';\n\n/* Inactive: `.ds-control-inactive` (50% opacity). */\n\n.menu-item--destructive .menu-item__label {\n /* Beat ds-text color-* host classes for destructive rows. */\n color: var(--color-foreground-bold-negative) !important;\n}\n\n/* Standard md icon zone keeps the dot aligned with other control suffixes. */\n.menu-item__dot-box {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--ds-control-icon, var(--dimension-iconography-md));\n height: var(--ds-control-icon, var(--dimension-iconography-md));\n pointer-events: none;\n}\n\n/* ── Switch suffix ───────────────────────────────────────────────────────── */\n\n.menu-item__switch {\n flex-shrink: 0;\n}\n\n/* ── Single-selection radio indicator ───────────────────────────────────── */\n\n.menu-item__radio-box {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--ds-control-icon, var(--dimension-iconography-md));\n height: var(--ds-control-icon, var(--dimension-iconography-md));\n pointer-events: none;\n}\n\n.menu-item__radio {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: var(--dimension-iconography-sm);\n height: var(--dimension-iconography-sm);\n border-radius: var(--dimension-radius-half);\n box-shadow: inset 0 0 0 var(--dimension-stroke-width-015) var(--color-foreground-tertiary);\n}\n\n.menu-item__radio--checked {\n background-color: var(--color-background-bold-brand);\n box-shadow: none;\n}\n\n.menu-item__radio-dot {\n width: var(--dimension-size-100);\n height: var(--dimension-size-100);\n border-radius: var(--dimension-radius-half);\n background-color: var(--color-foreground-on-bold-background-primary);\n}\n","import {\n Component,\n Prop,\n State,\n Event,\n EventEmitter,\n Element,\n Watch,\n Listen,\n h,\n Host,\n} from '@stencil/core';\nimport {\n choicePopupMinWidth,\n resolveChoicePopupAlignOffset,\n resolveCssLengthPx,\n resolveMotionTimeMs,\n TOKEN_CSS_LENGTHS,\n TOKEN_DEFAULTS,\n type ChoicePopupAnchorAlignment,\n} from '../../utils';\nimport { computeMenuPosition, type MenuAlign, type MenuSide } from './menu-position';\nimport type { MenuItemData, MenuSection } from './menu-types';\n\nexport type MenuSelectionMode = 'none' | 'single';\nimport {\n isMenuGradientPickerSection,\n isMenuPickerSection,\n isMenuSwatchPickerSection,\n} from './menu-types';\nimport {\n shellGradientPickerSections,\n type ShellGradientPreset,\n} from '../../shell/shell-gradient-presets';\n\n/** rAF retries while the popup mounts or the anchor resolves. */\nconst POSITION_RETRY_BUDGET = 8;\nconst MENU_FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',');\n\nfunction snapshotMenuSections(sections: MenuSection[]): MenuSection[] {\n return sections.map(section => {\n if (isMenuGradientPickerSection(section)) return { ...section };\n if (isMenuSwatchPickerSection(section)) {\n return {\n ...section,\n options: section.options?.map(option => ({ ...option })),\n sections: section.sections?.map(swatchSection => ({\n ...swatchSection,\n options: swatchSection.options.map(option => ({ ...option })),\n })),\n };\n }\n return { ...section, items: section.items.map(item => ({ ...item })) };\n });\n}\n\n@Component({\n tag: 'ds-menu',\n styleUrl: 'Menu.css',\n scoped: true,\n})\nexport class Menu {\n @Element() el!: HTMLElement;\n\n @Prop({ mutable: true }) open: boolean = false;\n @Prop() items: MenuItemData[] = [];\n /** Give ordinary rows mutually-exclusive radio-menu semantics using isSelected. */\n @Prop() selectionMode: MenuSelectionMode = 'none';\n @Prop() sections: MenuSection[] = [];\n /** Preferred side; placement flips to the opposite side when that offers a better fit. */\n @Prop() side: MenuSide = 'bottom';\n @Prop() align: MenuAlign = 'start';\n /** Align choice-row edges to the anchor by default; use `popup-frame` only for custom frame geometry. */\n @Prop() anchorAlignment: ChoicePopupAnchorAlignment = 'choice-cell';\n /** Gap between anchor and menu — number (px) or TokoMo length (`var(--dimension-space-050)`, etc.). */\n @Prop() sideOffset: number | string = TOKEN_CSS_LENGTHS.space050;\n /** Cross-axis offset — number (px) or TokoMo length. */\n @Prop() alignOffset: number | string = 0;\n @Prop() menuWidth: string | undefined;\n @Prop() minWidth: string | undefined;\n /** External trigger element to position against. Set via JS: menuEl.anchor = buttonEl */\n @Prop() anchor: HTMLElement | undefined;\n /** ID of the external trigger element for positioning */\n @Prop() anchorId: string | undefined;\n /** Show a visible ring on the initially focused menu item. Use only when the opener was keyboard-driven. */\n @Prop() initialFocusVisible: boolean = false;\n /** Accessible name for the popup menu. */\n @Prop() menuLabel: string = 'Menu';\n\n @State() private shouldRender: boolean = false;\n @State() private closing: boolean = false;\n @State() private pos: { x: number; y: number } = { x: 0, y: 0 };\n @State() private focusedIndex: number = 0;\n @State() private positionReady: boolean = false;\n @State() private focusRingVisible: boolean = false;\n\n @Event() dsClose!: EventEmitter<void>;\n /** Emitted after the popup's exit motion is complete and its rendered content is removed. */\n @Event() dsAfterClose!: EventEmitter<void>;\n @Event() dsSelect!: EventEmitter<MenuItemData>;\n /** Emitted when a `gradient-picker` section swatch is chosen. */\n @Event() dsGradientSelect!: EventEmitter<ShellGradientPreset>;\n /** Emitted when a generic `swatch-picker` section option is chosen. */\n @Event() dsSwatchSelect!: EventEmitter<string>;\n\n private clickOutsideHandler: ((e: MouseEvent) => void) | null = null;\n private scrollResizeHandler: (() => void) | null = null;\n private closeTimer: ReturnType<typeof setTimeout> | null = null;\n private positionRetryRaf: number | null = null;\n private livePositionRaf: number | null = null;\n /** Last content actually painted while open; retained unchanged through exit motion. */\n private lastRenderedSections: MenuSection[] = [];\n private closingSections: MenuSection[] | null = null;\n\n componentDidLoad() {\n if (this.open) this.onOpenChange(true);\n }\n\n componentDidRender() {\n if (!this.shouldRender) return;\n const popup = this.el.querySelector<HTMLElement>('.menu-popup');\n if (!popup || typeof popup.showPopover !== 'function') return;\n if (!popup.matches(':popover-open')) popup.showPopover();\n }\n\n disconnectedCallback() {\n this.cancelPositionRetry();\n this.cancelLivePositionUpdate();\n this.teardownListeners();\n }\n\n @Watch('open')\n onOpenChange(isOpen: boolean) {\n if (isOpen) {\n this.teardownListeners();\n this.closingSections = null;\n this.shouldRender = true;\n this.closing = false;\n this.positionReady = false;\n this.focusRingVisible = this.initialFocusVisible;\n this.setupListeners();\n this.schedulePositionUpdate(() => {\n this.focusInitialItem();\n });\n } else if (this.shouldRender) {\n this.cancelPositionRetry();\n this.captureClosingSections();\n this.closing = true;\n this.teardownListeners();\n const closeAnimationMs = this.closeAnimationMs;\n if (closeAnimationMs <= 0) {\n this.finishClose();\n return;\n }\n this.closeTimer = setTimeout(() => {\n this.closeTimer = null;\n this.finishClose();\n }, closeAnimationMs);\n }\n }\n\n @Watch('anchor')\n @Watch('anchorId')\n onAnchorChange() {\n if (this.open) this.schedulePositionUpdate();\n }\n\n @Watch('side')\n @Watch('align')\n @Watch('anchorAlignment')\n @Watch('sideOffset')\n @Watch('alignOffset')\n onPositionPropsChange() {\n if (this.open) this.schedulePositionUpdate();\n }\n\n private get viewportPadPx(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.space050, TOKEN_DEFAULTS.space050);\n }\n\n private get sideOffsetPx(): number {\n return resolveCssLengthPx(this.sideOffset, TOKEN_DEFAULTS.space050);\n }\n\n private get alignOffsetPx(): number {\n return resolveCssLengthPx(this.alignOffset, 0);\n }\n\n private get popupFallbackWidthPx(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.menuWidthXs, TOKEN_DEFAULTS.menuWidthXs);\n }\n\n private get popupFallbackHeightPx(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.menuFallbackHeight, TOKEN_DEFAULTS.menuFallbackHeight);\n }\n\n private get closeAnimationMs(): number {\n return resolveMotionTimeMs(TOKEN_DEFAULTS.motionShort2, TOKEN_DEFAULTS.animationDurationShort3);\n }\n\n private finishClose() {\n const popup = this.el.querySelector<HTMLElement>('.menu-popup');\n if (popup?.matches(':popover-open')) popup.hidePopover();\n this.shouldRender = false;\n this.closing = false;\n this.lastRenderedSections = [];\n this.closingSections = null;\n this.dsAfterClose.emit();\n }\n\n private captureClosingSections() {\n if (this.closingSections) return;\n const visibleSections = this.lastRenderedSections.length\n ? this.lastRenderedSections\n : this.activeSections;\n this.closingSections = snapshotMenuSections(visibleSections);\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 null;\n }\n\n private get anchorFocusTarget(): HTMLElement | null {\n const anchor = this.resolvedAnchor;\n if (!anchor) return null;\n if (anchor.matches(MENU_FOCUSABLE_SELECTOR)) return anchor;\n return anchor.querySelector<HTMLElement>(MENU_FOCUSABLE_SELECTOR) ?? anchor;\n }\n\n private focusAnchor() {\n const anchor = this.resolvedAnchor as\n | (HTMLElement & { setFocus?: () => Promise<void> | void })\n | null;\n if (anchor?.setFocus) {\n anchor.setFocus();\n return;\n }\n this.anchorFocusTarget?.focus();\n }\n\n private moveFocusAfterTab(backwards: boolean) {\n const anchor = this.anchorFocusTarget;\n if (!anchor) return;\n if (backwards) {\n anchor.focus();\n return;\n }\n\n const candidates = Array.from(\n document.querySelectorAll<HTMLElement>(MENU_FOCUSABLE_SELECTOR)\n ).filter(\n element =>\n !element.closest('.menu-popup') &&\n !element.closest('[inert]') &&\n element.getClientRects().length > 0\n );\n const index = candidates.indexOf(anchor);\n (candidates[index + 1] ?? anchor).focus();\n }\n\n private compositeTabLeavesPopup(event: KeyboardEvent): boolean {\n const popup = this.el.querySelector<HTMLElement>('.menu-popup');\n if (!popup) return true;\n const focusables = Array.from(\n popup.querySelectorAll<HTMLElement>(MENU_FOCUSABLE_SELECTOR)\n ).filter(element => element.getClientRects().length > 0);\n const currentIndex = focusables.indexOf(event.target as HTMLElement);\n if (currentIndex < 0) return true;\n return event.shiftKey ? currentIndex === 0 : currentIndex === focusables.length - 1;\n }\n\n private get activeSections(): MenuSection[] {\n if (this.sections.length > 0) return this.sections;\n if (this.items.length > 0) return [{ items: this.items }];\n return [];\n }\n\n private get flatItems(): MenuItemData[] {\n return this.activeSections.flatMap(section =>\n isMenuPickerSection(section) ? [] : section.items\n );\n }\n\n /** Rich preference content is a non-modal dialog, not an ARIA action menu. */\n private get hasCompositeSections(): boolean {\n return this.activeSections.some(isMenuPickerSection);\n }\n\n private cancelPositionRetry() {\n if (this.positionRetryRaf !== null) {\n cancelAnimationFrame(this.positionRetryRaf);\n this.positionRetryRaf = null;\n }\n }\n\n private cancelLivePositionUpdate() {\n if (this.livePositionRaf !== null) {\n cancelAnimationFrame(this.livePositionRaf);\n this.livePositionRaf = null;\n }\n }\n\n /** Reposition after the current scroll/layout frame without hiding the open popup. */\n private scheduleLivePositionUpdate() {\n if (this.livePositionRaf !== null) return;\n this.livePositionRaf = requestAnimationFrame(() => {\n if (this.shouldRender && !this.closing) this.calculatePosition();\n // Scroll-driven owners such as ShellPage may commit their compact header\n // render in this frame. Re-read once after that render, then stop tracking.\n this.livePositionRaf = requestAnimationFrame(() => {\n this.livePositionRaf = null;\n if (this.shouldRender && !this.closing) this.calculatePosition();\n });\n });\n }\n\n /** Retry until anchor + popup exist — do not reveal at 0,0 on a failed first pass. */\n private schedulePositionUpdate(onReady?: () => void) {\n if (!this.open) return;\n\n this.cancelPositionRetry();\n this.positionReady = false;\n\n let remaining = POSITION_RETRY_BUDGET;\n\n const attempt = () => {\n this.positionRetryRaf = null;\n if (!this.open) return;\n\n if (this.calculatePosition()) {\n this.positionReady = true;\n onReady?.();\n return;\n }\n\n if (remaining > 0) {\n remaining -= 1;\n this.positionRetryRaf = requestAnimationFrame(attempt);\n }\n };\n\n this.positionRetryRaf = requestAnimationFrame(attempt);\n }\n\n /** @returns `true` when anchor and popup were found and `pos` was updated. */\n private calculatePosition(): boolean {\n const anchorEl = this.resolvedAnchor;\n if (!anchorEl) return false;\n const popup = this.el.querySelector('.menu-popup') as HTMLElement | null;\n if (!popup) return false;\n\n const anchorRect = anchorEl.getBoundingClientRect();\n const sectionInsetPx = this.viewportPadPx;\n if (!this.minWidth) {\n if (\n this.anchorAlignment === 'choice-cell' &&\n (this.side === 'top' || this.side === 'bottom')\n ) {\n popup.style.minWidth = `max(var(--dimension-menu-width-xs), ${choicePopupMinWidth(\n anchorRect.width,\n sectionInsetPx\n )}px)`;\n } else {\n popup.style.removeProperty('min-width');\n }\n }\n\n const next = computeMenuPosition({\n anchorRect,\n popupWidth: popup.offsetWidth || this.popupFallbackWidthPx,\n popupHeight: popup.offsetHeight || this.popupFallbackHeightPx,\n side: this.side,\n align: this.align,\n sideOffsetPx: this.sideOffsetPx,\n alignOffsetPx: resolveChoicePopupAlignOffset({\n align: this.align,\n alignOffsetPx: this.alignOffsetPx,\n sectionInsetPx,\n anchorAlignment: this.anchorAlignment,\n }),\n viewportPadPx: this.viewportPadPx,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n });\n if (next.x !== this.pos.x || next.y !== this.pos.y) this.pos = next;\n return true;\n }\n\n /** Focus the selected item when present, otherwise the first enabled item. */\n private focusInitialItem() {\n if (this.hasCompositeSections) {\n requestAnimationFrame(() => {\n this.el.querySelector<HTMLElement>('.menu-popup [tabindex=\"0\"]')?.focus();\n });\n return;\n }\n\n const flat = this.flatItems;\n const selectedIdx = flat.findIndex(it => it.isSelected && !it.isInactive);\n const firstEnabledIdx = flat.findIndex(it => !it.isInactive);\n this.focusedIndex = selectedIdx >= 0 ? selectedIdx : firstEnabledIdx >= 0 ? firstEnabledIdx : 0;\n\n requestAnimationFrame(() => {\n const btns = this.el.querySelectorAll<HTMLElement>('.menu-item');\n btns[this.focusedIndex]?.focus();\n });\n }\n\n private setupListeners() {\n this.clickOutsideHandler = (e: MouseEvent) => {\n const t = e.target as Node;\n const popup = this.el.querySelector('.menu-popup');\n const anchorEl = this.resolvedAnchor;\n if (popup?.contains(t) || anchorEl?.contains(t)) return;\n this.close();\n };\n\n this.scrollResizeHandler = () => this.scheduleLivePositionUpdate();\n\n document.addEventListener('mousedown', this.clickOutsideHandler, true);\n window.addEventListener('scroll', this.scrollResizeHandler, true);\n window.addEventListener('resize', this.scrollResizeHandler);\n }\n\n private teardownListeners() {\n this.cancelLivePositionUpdate();\n if (this.clickOutsideHandler) {\n document.removeEventListener('mousedown', this.clickOutsideHandler, true);\n this.clickOutsideHandler = null;\n }\n if (this.scrollResizeHandler) {\n window.removeEventListener('scroll', this.scrollResizeHandler, true);\n window.removeEventListener('resize', this.scrollResizeHandler);\n this.scrollResizeHandler = null;\n }\n if (this.closeTimer) {\n clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n }\n\n private close(restoreFocus = true) {\n this.captureClosingSections();\n if (restoreFocus) this.focusAnchor();\n this.dsClose.emit();\n this.open = false;\n this.onOpenChange(false);\n }\n\n @Listen('keydown')\n handleKeyDown(e: KeyboardEvent) {\n if (!this.shouldRender || this.closing) return;\n\n if (e.key === 'Escape') {\n e.preventDefault();\n this.close();\n return;\n }\n\n if (e.key === 'Tab') {\n if (this.hasCompositeSections && !this.compositeTabLeavesPopup(e)) return;\n e.preventDefault();\n this.close(false);\n this.moveFocusAfterTab(e.shiftKey);\n return;\n }\n\n if (this.hasCompositeSections) return;\n\n const flat = this.flatItems;\n const enabled = flat\n .map((it, i) => ({ it, i }))\n .filter(({ it }) => !it.isInactive)\n .map(({ i }) => i);\n if (!enabled.length) return;\n\n const cur = enabled.indexOf(this.focusedIndex);\n const safe = cur < 0 ? 0 : cur;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n e.stopPropagation();\n this.focusRingVisible = true;\n this.focusedIndex = enabled[(safe + 1) % enabled.length];\n this.focusItem(this.focusedIndex);\n break;\n case 'ArrowUp':\n e.preventDefault();\n e.stopPropagation();\n this.focusRingVisible = true;\n this.focusedIndex = enabled[(safe - 1 + enabled.length) % enabled.length];\n this.focusItem(this.focusedIndex);\n break;\n case 'Home':\n e.preventDefault();\n e.stopPropagation();\n this.focusRingVisible = true;\n this.focusedIndex = enabled[0];\n this.focusItem(this.focusedIndex);\n break;\n case 'End':\n e.preventDefault();\n e.stopPropagation();\n this.focusRingVisible = true;\n this.focusedIndex = enabled[enabled.length - 1];\n this.focusItem(this.focusedIndex);\n break;\n }\n }\n\n private focusItem(idx: number) {\n const btns = this.el.querySelectorAll<HTMLElement>('.menu-item');\n btns[idx]?.focus();\n }\n\n private handleItemClick(item: MenuItemData) {\n if (item.isInactive) return;\n // Consumers commonly change the item source while handling selection.\n // Capture first so the exit animation never paints the next menu context.\n this.captureClosingSections();\n this.dsSelect.emit(item);\n }\n\n private handleGradientSelect(preset: ShellGradientPreset) {\n this.dsGradientSelect.emit(preset);\n }\n\n private handleSwatchSelect(value: string) {\n this.dsSwatchSelect.emit(value);\n }\n\n render() {\n if (!this.shouldRender) return <Host style={{ display: 'contents' }} />;\n\n const sections = this.closing\n ? (this.closingSections ?? this.lastRenderedSections)\n : this.activeSections;\n const hasCompositeSections = sections.some(isMenuPickerSection);\n if (!this.closing) {\n this.lastRenderedSections = snapshotMenuSections(sections);\n this.closingSections = null;\n }\n let flatIdx = 0;\n\n const popupStyle: Record<string, string> = {\n position: 'fixed',\n left: '0',\n top: '0',\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 if (this.menuWidth) popupStyle['width'] = this.menuWidth;\n if (this.minWidth) popupStyle['min-width'] = this.minWidth;\n\n return (\n <Host style={{ display: 'contents' }}>\n <div\n popover=\"manual\"\n class={{\n 'menu-popup': true,\n 'menu-popup--closing': this.closing,\n 'ds-choice-popup': true,\n 'ds-choice-popup--closing': this.closing,\n }}\n style={popupStyle}\n role={hasCompositeSections ? 'dialog' : 'menu'}\n aria-label={this.menuLabel}\n aria-orientation={hasCompositeSections ? undefined : 'vertical'}\n >\n <div class=\"ds-choice-list\">\n {sections.map((section, si) => (\n <div\n key={si}\n class={{\n 'menu-section': true,\n 'menu-section--divided': si < sections.length - 1,\n 'menu-section--gradient-picker': isMenuPickerSection(section),\n 'ds-choice-section': true,\n 'ds-choice-section--divided': si < sections.length - 1,\n }}\n role={section.header ? 'group' : undefined}\n aria-label={section.header}\n >\n {section.header && (\n <ds-text\n class=\"section-header ds-choice-section__header ds-control--md\"\n as=\"span\"\n variant=\"text-body-small\"\n emphasis\n color=\"primary\"\n aria-hidden=\"true\"\n >\n {section.header}\n </ds-text>\n )}\n {isMenuGradientPickerSection(section) ? (\n <ds-swatch-picker\n value={section.value}\n groupLabel={section.header ?? 'Shell gradient theme'}\n sections={shellGradientPickerSections()}\n onDsChange={(e: CustomEvent<string>) => {\n e.stopPropagation();\n this.handleGradientSelect(e.detail as ShellGradientPreset);\n }}\n />\n ) : isMenuSwatchPickerSection(section) ? (\n <ds-swatch-picker\n value={section.value}\n groupLabel={section.groupLabel ?? section.header ?? 'Swatch options'}\n options={section.options ?? []}\n sections={section.sections ?? []}\n onDsChange={(e: CustomEvent<string>) => {\n e.stopPropagation();\n this.handleSwatchSelect(e.detail);\n }}\n />\n ) : (\n section.items.map(item => {\n const idx = flatIdx++;\n const isFocused = this.focusedIndex === idx;\n const isRadioItem =\n !hasCompositeSections &&\n this.selectionMode === 'single' &&\n !item.showSwitch;\n return (\n <button\n key={idx}\n type=\"button\"\n class={{\n 'menu-item': true,\n 'ds-choice-item': true,\n 'ds-control--md': true,\n 'ds-focus-ring-inset': true,\n 'ds-focus-ring--visible': isFocused && this.focusRingVisible,\n 'ds-interaction-fill': !item.isInactive,\n 'ds-interaction-fill--selected': !!item.isSelected && !item.isInactive,\n 'menu-item--selected': !!item.isSelected,\n 'ds-control-inactive': !!item.isInactive,\n 'menu-item--destructive': !!item.isDestructive,\n 'menu-item--focused': isFocused,\n }}\n role={\n hasCompositeSections\n ? undefined\n : item.showSwitch\n ? 'menuitemcheckbox'\n : isRadioItem\n ? 'menuitemradio'\n : 'menuitem'\n }\n aria-checked={\n !hasCompositeSections && item.showSwitch\n ? String(!!item.switchValue)\n : isRadioItem\n ? String(!!item.isSelected)\n : undefined\n }\n aria-pressed={\n hasCompositeSections\n ? String(item.showSwitch ? !!item.switchValue : !!item.isSelected)\n : undefined\n }\n aria-current={\n !hasCompositeSections &&\n !item.showSwitch &&\n !isRadioItem &&\n item.isSelected\n ? 'true'\n : undefined\n }\n disabled={item.isInactive}\n tabIndex={hasCompositeSections ? 0 : isFocused ? 0 : -1}\n onMouseDown={() => {\n this.focusRingVisible = false;\n }}\n onClick={() => this.handleItemClick(item)}\n onFocus={() => {\n this.focusedIndex = idx;\n }}\n >\n {isRadioItem && (\n <span\n class=\"menu-item__radio-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <span\n class={{\n 'menu-item__radio': true,\n 'menu-item__radio--checked': !!item.isSelected,\n }}\n >\n {item.isSelected && <span class=\"menu-item__radio-dot\" />}\n </span>\n </span>\n )}\n <div class=\"menu-item__content ds-choice-item__content ds-interaction-fill__content\">\n <ds-text\n class=\"menu-item__label ds-choice-item__label\"\n as=\"span\"\n variant=\"text-body-medium\"\n color={item.isSelected ? 'primary' : 'secondary'}\n >\n {item.label}\n </ds-text>\n {item.subtext && (\n <ds-text\n class=\"menu-item__subtext ds-choice-item__subtext\"\n as=\"span\"\n variant=\"text-body-small\"\n color=\"secondary\"\n >\n {item.subtext}\n </ds-text>\n )}\n </div>\n {item.dot && (\n <span\n class=\"menu-item__dot-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-badge\n class=\"menu-item__dot\"\n variant=\"dot\"\n hasRing={false}\n label=\"\"\n />\n </span>\n )}\n {item.showSwitch && (\n <ds-switch\n class=\"menu-item__switch ds-interaction-fill__content\"\n size=\"md\"\n checked={!!item.switchValue}\n presentation\n />\n )}\n </button>\n );\n })\n )}\n </div>\n ))}\n </div>\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
|