@radix-ng/primitives 1.0.0-beta.4 → 1.0.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/composite/README.md +3 -0
- package/fesm2022/radix-ng-primitives-accordion.mjs +12 -36
- package/fesm2022/radix-ng-primitives-accordion.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-checkbox.mjs +33 -18
- package/fesm2022/radix-ng-primitives-checkbox.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-composite.mjs +515 -0
- package/fesm2022/radix-ng-primitives-composite.mjs.map +1 -0
- package/fesm2022/radix-ng-primitives-core.mjs +7 -0
- package/fesm2022/radix-ng-primitives-core.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-dialog.mjs +54 -12
- package/fesm2022/radix-ng-primitives-dialog.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-drawer.mjs +442 -2
- package/fesm2022/radix-ng-primitives-drawer.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-editable.mjs +12 -7
- package/fesm2022/radix-ng-primitives-editable.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-floating-focus-manager.mjs +294 -8
- package/fesm2022/radix-ng-primitives-floating-focus-manager.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-focus-scope.mjs +9 -0
- package/fesm2022/radix-ng-primitives-focus-scope.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-menu.mjs +71 -20
- package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-menubar.mjs +68 -36
- package/fesm2022/radix-ng-primitives-menubar.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-navigation-menu.mjs +281 -88
- package/fesm2022/radix-ng-primitives-navigation-menu.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-number-field.mjs +7 -2
- package/fesm2022/radix-ng-primitives-number-field.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-popover.mjs +117 -35
- package/fesm2022/radix-ng-primitives-popover.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-popper.mjs +73 -65
- package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-radio.mjs +77 -36
- package/fesm2022/radix-ng-primitives-radio.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-roving-focus.mjs +40 -8
- package/fesm2022/radix-ng-primitives-roving-focus.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-scroll-area.mjs +56 -25
- package/fesm2022/radix-ng-primitives-scroll-area.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-select.mjs +62 -37
- package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-slider.mjs +259 -28
- package/fesm2022/radix-ng-primitives-slider.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-stepper.mjs +11 -7
- package/fesm2022/radix-ng-primitives-stepper.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-switch.mjs +10 -5
- package/fesm2022/radix-ng-primitives-switch.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-tabs.mjs +64 -30
- package/fesm2022/radix-ng-primitives-tabs.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-toggle-group.mjs +69 -19
- package/fesm2022/radix-ng-primitives-toggle-group.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-toggle.mjs +37 -13
- package/fesm2022/radix-ng-primitives-toggle.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-toolbar.mjs +50 -24
- package/fesm2022/radix-ng-primitives-toolbar.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-tooltip.mjs +180 -35
- package/fesm2022/radix-ng-primitives-tooltip.mjs.map +1 -1
- package/navigation-menu/README.md +5 -2
- package/package.json +5 -1
- package/types/radix-ng-primitives-accordion.d.ts +9 -13
- package/types/radix-ng-primitives-checkbox.d.ts +27 -15
- package/types/radix-ng-primitives-composite.d.ts +152 -0
- package/types/radix-ng-primitives-core.d.ts +2 -0
- package/types/radix-ng-primitives-dialog.d.ts +13 -2
- package/types/radix-ng-primitives-drawer.d.ts +40 -2
- package/types/radix-ng-primitives-editable.d.ts +11 -5
- package/types/radix-ng-primitives-floating-focus-manager.d.ts +113 -16
- package/types/radix-ng-primitives-menu.d.ts +13 -5
- package/types/radix-ng-primitives-menubar.d.ts +10 -5
- package/types/radix-ng-primitives-navigation-menu.d.ts +65 -33
- package/types/radix-ng-primitives-number-field.d.ts +8 -3
- package/types/radix-ng-primitives-popover.d.ts +26 -10
- package/types/radix-ng-primitives-popper.d.ts +1 -0
- package/types/radix-ng-primitives-radio.d.ts +22 -13
- package/types/radix-ng-primitives-roving-focus.d.ts +15 -1
- package/types/radix-ng-primitives-scroll-area.d.ts +4 -1
- package/types/radix-ng-primitives-select.d.ts +16 -20
- package/types/radix-ng-primitives-slider.d.ts +60 -9
- package/types/radix-ng-primitives-stepper.d.ts +11 -4
- package/types/radix-ng-primitives-switch.d.ts +10 -4
- package/types/radix-ng-primitives-tabs.d.ts +20 -11
- package/types/radix-ng-primitives-toggle-group.d.ts +34 -17
- package/types/radix-ng-primitives-toggle.d.ts +14 -7
- package/types/radix-ng-primitives-toolbar.d.ts +22 -14
- package/types/radix-ng-primitives-tooltip.d.ts +38 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"radix-ng-primitives-floating-focus-manager.mjs","sources":["../../../packages/primitives/floating-focus-manager/src/mark-others.ts","../../../packages/primitives/floating-focus-manager/src/floating-focus-manager.ts","../../../packages/primitives/floating-focus-manager/radix-ng-primitives-floating-focus-manager.ts"],"sourcesContent":["/**\n * `markOthers` — the Angular port of Base UI's `floating-ui-react/utils/markOthers` (ADR 0017 §3). It\n * isolates a popup from the rest of the page by walking the owner `Document`'s `<body>` and applying an\n * attribute to every element **outside** the kept (`avoidElements`) subtree — siblings of the popup's\n * ancestor chain — leaving the popup, its ancestors, and any `[aria-live]` region untouched.\n *\n * Two independent passes (Base UI makes two separate calls, never bundling them):\n * - **control attribute** — either `inert` (the real attribute: non-interactive **and** removed from the\n * a11y tree) or `aria-hidden=\"true\"` (AT-only). `inert` takes precedence and is what replaces the\n * global body pointer-lock for modal isolation (ADR 0017 §3 / finding #4): it blocks pointer + focus\n * on outside content **scoped** to siblings of the popup's ancestor chain, so independent overlays at a\n * higher layer are unaffected (unlike `body { pointer-events: none }`).\n * - **`mark`** — a neutral marker attribute ({@link RDX_FLOATING_MARKER}) applied whenever the focus\n * manager is active; read by ADR 0015's outside-press guard to detect third-party-injected subtrees.\n *\n * Per-**element**, per-**attribute** ref-counting (`WeakMap<Element, number>`) lets overlapping popups\n * compose: an element controlled by two popups is only cleared when both undo. An element that already\n * carried the control attribute before the call is recorded and left in place on undo.\n *\n * @returns an `Undo` that reverses exactly what this call applied.\n */\nexport type Undo = () => void;\n\nexport interface MarkOthersOptions {\n /** Apply `aria-hidden=\"true\"` to outside elements (AT-only isolation). Ignored when `inert` is set. */\n ariaHidden?: boolean;\n /**\n * Apply the real `inert` attribute to outside elements — non-interactive **and** a11y-hidden in one.\n * Takes precedence over `ariaHidden`; this is the scoped replacement for the body pointer-lock.\n */\n inert?: boolean;\n /** Apply the neutral {@link RDX_FLOATING_MARKER} to outside elements. Default `true`. */\n mark?: boolean;\n}\n\n/** The neutral \"outside the active floating layer\" marker (Base UI `data-base-ui-inert`). */\nexport const RDX_FLOATING_MARKER = 'data-rdx-floating-inert';\n\n/** The mutually-exclusive control attribute (Base UI: `inert` wins over `aria-hidden`). */\ntype ControlAttribute = 'inert' | 'aria-hidden';\n\n/** Per-element, per-attribute ref-counts. Keyed by element, so they are naturally per-`Document`. */\nconst controlCounters: Record<ControlAttribute, WeakMap<Element, number>> = {\n inert: new WeakMap(),\n 'aria-hidden': new WeakMap()\n};\n/** Elements that already carried the control attribute before we touched them — left in place on undo. */\nconst preExistingControlled: Record<ControlAttribute, WeakSet<Element>> = {\n inert: new WeakSet(),\n 'aria-hidden': new WeakSet()\n};\nlet markerCounters = new WeakMap<Element, number>();\nlet lockCount = 0;\n\nfunction unwrapHost(node: Node | null): Element | null {\n if (!node) {\n return null;\n }\n return node instanceof ShadowRoot ? node.host : unwrapHost(node.parentNode);\n}\n\n/** Maps each target to the element actually inside `parent` (piercing shadow hosts), dropping the rest. */\nfunction correctElements(parent: HTMLElement, targets: Element[]): Element[] {\n return targets\n .map((target) => {\n if (parent.contains(target)) {\n return target;\n }\n const host = unwrapHost(target);\n return host && parent.contains(host) ? host : null;\n })\n .filter((element): element is Element => element != null);\n}\n\n/** The set of nodes on the path from each target up to the root — the \"keep\" subtree. */\nfunction buildKeepSet(targets: Element[]): Set<Node> {\n const keep = new Set<Node>();\n targets.forEach((target) => {\n let node: Node | null = target;\n while (node && !keep.has(node)) {\n keep.add(node);\n node = node.parentNode;\n }\n });\n return keep;\n}\n\n/** Collects every element outside the kept subtree (a sibling of the kept ancestor chain). */\nfunction collectOutsideElements(root: HTMLElement, keep: Set<Node>, stop: Set<Node>): Element[] {\n const outside: Element[] = [];\n const walk = (parent: Element | null): void => {\n if (!parent || stop.has(parent)) {\n return;\n }\n Array.from(parent.children).forEach((node) => {\n if (node.nodeName.toLowerCase() === 'script') {\n return;\n }\n if (keep.has(node)) {\n walk(node);\n } else {\n outside.push(node);\n }\n });\n };\n walk(root);\n return outside;\n}\n\nexport function markOthers(avoidElements: Element[], options: MarkOthersOptions = {}): Undo {\n const { ariaHidden = false, inert = false, mark = true } = options;\n const first = avoidElements[0];\n if (!first) {\n return () => {};\n }\n const body = first.ownerDocument.body;\n const avoid = correctElements(body, avoidElements);\n\n // `inert` wins over `aria-hidden` (it already removes the subtree from the a11y tree, Base UI).\n const controlAttribute: ControlAttribute | null = inert ? 'inert' : ariaHidden ? 'aria-hidden' : null;\n const controlledElements: Element[] = [];\n const markedElements: Element[] = [];\n\n if (controlAttribute) {\n const counters = controlCounters[controlAttribute];\n const preExisting = preExistingControlled[controlAttribute];\n // `aria-live` regions stay announceable, so keep them out of the controlled set too.\n const live = correctElements(body, Array.from(body.querySelectorAll('[aria-live]')));\n const controlElements = avoid.concat(live);\n const targets = collectOutsideElements(body, buildKeepSet(controlElements), new Set<Node>(controlElements));\n\n targets.forEach((node) => {\n const attr = node.getAttribute(controlAttribute);\n const already = attr !== null && attr !== 'false';\n const count = (counters.get(node) ?? 0) + 1;\n counters.set(node, count);\n controlledElements.push(node);\n\n if (count === 1 && already) {\n preExisting.add(node);\n }\n if (!already) {\n node.setAttribute(controlAttribute, controlAttribute === 'inert' ? '' : 'true');\n }\n });\n }\n\n if (mark) {\n const targets = collectOutsideElements(body, buildKeepSet(avoid), new Set<Node>(avoid));\n targets.forEach((node) => {\n const count = (markerCounters.get(node) ?? 0) + 1;\n markerCounters.set(node, count);\n markedElements.push(node);\n if (count === 1) {\n node.setAttribute(RDX_FLOATING_MARKER, '');\n }\n });\n }\n\n lockCount += 1;\n\n return () => {\n if (controlAttribute) {\n const counters = controlCounters[controlAttribute];\n const preExisting = preExistingControlled[controlAttribute];\n controlledElements.forEach((element) => {\n const count = (counters.get(element) ?? 0) - 1;\n counters.set(element, count);\n if (count === 0) {\n if (!preExisting.has(element)) {\n element.removeAttribute(controlAttribute);\n }\n preExisting.delete(element);\n }\n });\n }\n\n markedElements.forEach((element) => {\n const count = (markerCounters.get(element) ?? 0) - 1;\n markerCounters.set(element, count);\n if (count === 0) {\n element.removeAttribute(RDX_FLOATING_MARKER);\n }\n });\n\n lockCount -= 1;\n if (lockCount === 0) {\n // No active locks anywhere — drop the ref-count tables so detached elements can be GC'd.\n controlCounters.inert = new WeakMap();\n controlCounters['aria-hidden'] = new WeakMap();\n preExistingControlled.inert = new WeakSet();\n preExistingControlled['aria-hidden'] = new WeakSet();\n markerCounters = new WeakMap();\n }\n };\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n booleanAttribute,\n computed,\n DestroyRef,\n Directive,\n effect,\n ElementRef,\n inject,\n InjectionToken,\n input,\n output,\n PLATFORM_ID,\n Provider,\n signal,\n WritableSignal\n} from '@angular/core';\nimport {\n BooleanInput,\n RDX_FLOATING_REGISTRATION,\n RDX_FLOATING_ROOT_CONTEXT,\n RdxFloatingRootContext\n} from '@radix-ng/primitives/core';\nimport {\n composedContains,\n FOCUS_GUARD_ATTR,\n provideRdxFocusScopeConfig,\n RdxFocusScope,\n RdxFocusScopeConfig,\n RdxFocusScopeConfigToken\n} from '@radix-ng/primitives/focus-scope';\nimport { markOthers } from './mark-others';\n\n/**\n * How a popup was opened / closed (Base UI `InteractionType`). `null` = a **programmatic** open (prefer\n * the previously-focused element); `''` = an **unknown** interaction. The two are deliberately distinct\n * (Base UI keys `preferPreviousFocus = openInteractionType == null` off exactly this).\n */\nexport type RdxInteractionType = 'mouse' | 'touch' | 'pen' | 'keyboard' | '' | null;\n\n/** A focus target: an element, a getter, or `null`. */\nexport type RdxFocusTarget = HTMLElement | (() => HTMLElement | null) | null;\n\n/** `initialFocus` policy (ADR 0017 §2) — a target, `false`, or an open-interaction callback. */\nexport type RdxInitialFocus =\n | RdxFocusTarget\n | false\n | ((openInteractionType: RdxInteractionType) => RdxFocusTarget | false);\n\n/** `returnFocus` policy (ADR 0017 §2) — a target/boolean or a callback receiving the **close** interaction type. */\nexport type RdxReturnFocus =\n | RdxFocusTarget\n | boolean\n | ((closeInteractionType: RdxInteractionType) => RdxFocusTarget | boolean);\n\n/** Normalizes a DOM event into Base UI-like interaction intent for focus policy decisions. */\nexport function getInteractionTypeFromEvent(event?: Event): RdxInteractionType {\n if (!event) {\n return null;\n }\n\n if (typeof KeyboardEvent !== 'undefined' && event instanceof KeyboardEvent) {\n return 'keyboard';\n }\n\n if ('pointerType' in event && typeof event.pointerType === 'string') {\n return (event.pointerType || 'mouse') as RdxInteractionType;\n }\n\n if (typeof MouseEvent !== 'undefined' && event instanceof MouseEvent) {\n return event.detail === 0 ? 'keyboard' : 'mouse';\n }\n\n return '';\n}\n\n/** Resolves an {@link RdxFocusTarget} (element | getter | null) to a concrete element. */\nexport function resolveFocusTarget(target: RdxFocusTarget): HTMLElement | null {\n return typeof target === 'function' ? target() : target;\n}\n\n/**\n * Resolves an {@link RdxInitialFocus} policy against how the popup opened.\n */\nexport function resolveInitialFocus(\n policy: RdxInitialFocus,\n openInteractionType: RdxInteractionType\n): HTMLElement | null | false {\n const resolved = typeof policy === 'function' ? policy(openInteractionType) : policy;\n return resolved === false ? false : resolveFocusTarget(resolved);\n}\n\n/**\n * Resolves an {@link RdxReturnFocus} policy against how the popup closed. `false` = do not return focus;\n * `true` = the default (return to the previously-focused element); an element = return there.\n */\nexport function resolveReturnFocus(\n policy: RdxReturnFocus,\n closeInteractionType: RdxInteractionType\n): HTMLElement | boolean | null {\n const resolved = typeof policy === 'function' ? policy(closeInteractionType) : policy;\n return typeof resolved === 'boolean' ? resolved : resolveFocusTarget(resolved);\n}\n\n/**\n * DI seam for a **composing primitive** (Dialog / Popover / Menu) to drive the manager's gates from its\n * own root context instead of template-bound inputs (which a primitive cannot set). Each field falls\n * back to the manager's input, then to the documented default. Mirrors {@link RdxFocusScopeConfig}.\n */\nexport interface RdxFloatingFocusManagerConfig {\n modal?: () => boolean;\n inert?: () => boolean;\n enabled?: () => boolean;\n closeOnFocusOut?: () => boolean;\n initialFocus?: () => RdxInitialFocus;\n returnFocus?: () => RdxReturnFocus;\n openInteractionType?: () => RdxInteractionType;\n closeInteractionType?: () => RdxInteractionType;\n}\n\nexport const RDX_FLOATING_FOCUS_MANAGER_CONFIG = new InjectionToken<RdxFloatingFocusManagerConfig>(\n 'RdxFloatingFocusManagerConfig'\n);\n\n/** Provides a {@link RdxFloatingFocusManagerConfig} for an enclosing primitive's focus manager. */\nexport function provideFloatingFocusManagerConfig(factory: () => RdxFloatingFocusManagerConfig): Provider {\n return { provide: RDX_FLOATING_FOCUS_MANAGER_CONFIG, useFactory: factory };\n}\n\n/** Coerces a boolean-ish input while preserving `undefined` (\"not set\" → fall back to the config). */\nfunction coerceOptionalBoolean(value: BooleanInput | undefined): boolean | undefined {\n return value === undefined ? undefined : booleanAttribute(value);\n}\n\n/**\n * Provides a {@link RdxFocusScopeConfig} whose `trapped` is a **writable** signal, so the enclosing\n * {@link RdxFloatingFocusManager} can drive it from its `modal`/`enabled` policy after construction. The\n * factory has **no** dependency on the manager instance, so it cannot deadlock the host-directive\n * construction order (the manager later injects this same config and writes the signal).\n */\nfunction provideManagedFocusScopeConfig(): Provider {\n return provideRdxFocusScopeConfig((): RdxFocusScopeConfig => ({ trapped: signal(false) }));\n}\n\n/**\n * `RdxFloatingFocusManager` (ADR 0017 Phase 1b skeleton) — the Angular counterpart of Base UI's\n * `FloatingFocusManager`. It is a **coordinator** that composes three low-level focus parts (it never\n * inherits them, which would re-fuse trap + popup policy): the **reworked {@link RdxFocusScope}** (the\n * trap, via `hostDirectives`), the portal-focus bridge, and owner-`Document` guards. Per ADR 0017 §1/§2\n * its policies are **independent**, none derived from `modal`.\n *\n * **This skeleton wires the composition + lifecycle gates:**\n * - `enabled` — the manager's active-ness (`mounted && !hover-open`). When off, **no trap** (and, later,\n * no aria-hidden / no marker — Phase 2).\n * - `modal` → `RdxFocusScope.trapped`: the effective trap is `enabled() && modal()`, pushed into the\n * composed focus scope through its config token (the composition seam).\n * - `loop` is forwarded to `RdxFocusScope`.\n * - `initialFocus` / `returnFocus` are **orchestrated** here (the §2 policy contract, incl. the\n * interaction-type callback forms): `initialFocus` via the scope's `mountAutoFocus` hook, `returnFocus`\n * via the scope's `returnFocus` config seam (resolved at the scope's queued post-unmount frame). The\n * portal-focus bridge remains a later-phase dependency.\n */\n@Directive({\n selector: '[rdxFloatingFocusManager]',\n exportAs: 'rdxFloatingFocusManager',\n hostDirectives: [{ directive: RdxFocusScope, inputs: ['loop'] }],\n providers: [provideManagedFocusScopeConfig()]\n})\nexport class RdxFloatingFocusManager {\n /** Manager active-ness (ADR 0017 §2): the popup is mounted **and** not hover-opened. */\n readonly enabled = input(undefined, { transform: coerceOptionalBoolean });\n\n /** Modal popup → focus trap. Combined with `enabled` to drive the composed `RdxFocusScope`. */\n readonly modal = input(undefined, { transform: coerceOptionalBoolean });\n\n /**\n * Whether outside elements receive the real `inert` attribute. Defaults to the effective `modal` value,\n * but primitives can split focus trapping from pointer/AT isolation (Base UI `modal=\"trap-focus\"`).\n */\n readonly inert = input(undefined, { transform: coerceOptionalBoolean });\n\n /** Where focus goes when the popup opens (ADR 0017 §2). */\n readonly initialFocus = input<RdxInitialFocus | undefined>(undefined);\n\n /** Where focus returns when the popup closes (ADR 0017 §2). */\n readonly returnFocus = input<RdxReturnFocus | undefined>(undefined);\n\n /**\n * Whether a **non-modal** popup closes when focus leaves to an unrelated node (Base UI\n * `closeOnFocusOut`, default `true`; Dialog sets it to `!disablePointerDismissal`). Modal popups\n * never close on focus-out (the trap keeps focus in).\n */\n readonly closeOnFocusOut = input(undefined, { transform: coerceOptionalBoolean });\n\n /**\n * Emitted when focus leaves a non-modal popup to a node **unrelated** to the floating tree (ADR 0017\n * §3) — the consumer should close the popup. This is the focus-manager's focus-out close (it reads\n * the shared tree), replacing the dismissal capability's focus-out at the ADR 0015 Phase-4 cutover.\n */\n readonly focusOut = output<FocusEvent>();\n\n /** Optional DI config a composing primitive provides to drive the gates (input wins over config). */\n private readonly config = inject(RDX_FLOATING_FOCUS_MANAGER_CONFIG, { optional: true });\n\n /** Effective gates: `input ?? config ?? default`. */\n readonly effectiveEnabled = computed(() => this.enabled() ?? this.config?.enabled?.() ?? true);\n readonly effectiveModal = computed(() => this.modal() ?? this.config?.modal?.() ?? false);\n readonly effectiveInert = computed(() => this.inert() ?? this.config?.inert?.() ?? this.effectiveModal());\n readonly effectiveCloseOnFocusOut = computed(\n () => this.closeOnFocusOut() ?? this.config?.closeOnFocusOut?.() ?? true\n );\n readonly effectiveInitialFocus = computed(() =>\n this.initialFocus() !== undefined ? this.initialFocus()! : (this.config?.initialFocus?.() ?? null)\n );\n readonly effectiveReturnFocus = computed(() =>\n this.returnFocus() !== undefined ? this.returnFocus()! : (this.config?.returnFocus?.() ?? true)\n );\n readonly effectiveOpenInteractionType = computed(\n () => this.config?.openInteractionType?.() ?? this._interactionType()\n );\n readonly effectiveCloseInteractionType = computed(\n () => this.config?.closeInteractionType?.() ?? this._interactionType()\n );\n\n /** The effective trap state the composed `RdxFocusScope` reads via its config token. */\n readonly trapped = computed(() => this.effectiveEnabled() && this.effectiveModal());\n\n // The config this directive provides — its `trapped` signal is writable so we can drive it, and we\n // attach a `returnFocus` resolver the composed focus scope calls at unmount (ADR 0017 `returnFocus`).\n private readonly focusScopeConfig = inject(RdxFocusScopeConfigToken) as {\n trapped: WritableSignal<boolean>;\n returnFocus?: () => HTMLElement | false | undefined;\n };\n\n private readonly host = inject(ElementRef).nativeElement as HTMLElement;\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /** The shared per-popup context (open / triggers / elements), if a primitive root provides one. */\n private readonly rootContext = inject(RDX_FLOATING_ROOT_CONTEXT, { optional: true });\n /** The registration handle for this node, used to read the shared tree (ancestors / descendants). */\n private readonly registration = inject(RDX_FLOATING_REGISTRATION, { optional: true });\n\n private readonly _interactionType = signal<RdxInteractionType>('');\n /** How the popup was most recently interacted with — fed to the initial/return focus policy callbacks. */\n readonly interactionType = this._interactionType.asReadonly();\n\n constructor() {\n effect(() => this.focusScopeConfig.trapped.set(this.trapped()));\n\n // Own the return-focus *target* (the composed focus scope owns the *timing*): the scope calls this\n // in its queued post-unmount frame, resolving the `returnFocus` policy against the close interaction.\n this.focusScopeConfig.returnFocus = () => this.resolveReturnFocusTarget();\n\n if (!this.isBrowser) {\n return; // SSR: no DOM marking / listeners.\n }\n\n // Marker pass (ADR 0017 §3) — applied to outside elements while the manager is active **and the\n // popup is open**, independent of `modal`. Read by ADR 0015's outside-press guard.\n effect((onCleanup) => {\n if (!this.effectiveEnabled() || !this.isFloatingOpen()) {\n return;\n }\n onCleanup(markOthers(this.avoidElements(), { ariaHidden: false, mark: true }));\n });\n\n // Pointer/AT isolation pass — apply the real `inert` attribute to outside elements only when the\n // composing primitive asks for outside interaction to be blocked. This is intentionally separate from\n // focus trapping: Base UI `modal=\"trap-focus\"` traps focus but leaves outside pointer interaction\n // enabled.\n effect((onCleanup) => {\n if (!this.effectiveEnabled() || !this.isFloatingOpen() || !this.effectiveInert()) {\n return;\n }\n onCleanup(markOthers(this.avoidElements(), { inert: true, mark: false }));\n });\n\n this.trackInteractionType();\n this.wireCloseOnFocusOut();\n this.wireFocusOrchestration();\n this.wireInitialFocusFallback();\n }\n\n /** Records the most recent open/close interaction (pointer type or keyboard) for the focus policies. */\n private trackInteractionType(): void {\n const ownerDocument = this.host.ownerDocument;\n const onPointer = (event: Event): void => {\n this._interactionType.set(((event as PointerEvent).pointerType || 'mouse') as RdxInteractionType);\n };\n const onKey = (): void => this._interactionType.set('keyboard');\n\n ownerDocument.addEventListener('pointerdown', onPointer, true);\n ownerDocument.addEventListener('keydown', onKey, true);\n inject(DestroyRef).onDestroy(() => {\n ownerDocument.removeEventListener('pointerdown', onPointer, true);\n ownerDocument.removeEventListener('keydown', onKey, true);\n });\n }\n\n /**\n * Initial-focus orchestration (ADR 0017 §2). The manager owns the focus *policy*; it intercepts the\n * composed {@link RdxFocusScope}'s preventable `mountAutoFocus` (its designed extension point) and\n * applies the `initialFocus` policy, falling back to the scope's first-tabbable default when the\n * policy is `null`. (`returnFocus` is orchestrated separately via the config seam — see\n * {@link resolveReturnFocusTarget} — because it must run during the scope's queued *post-unmount* frame.)\n */\n private wireFocusOrchestration(): void {\n const focusScope = inject(RdxFocusScope);\n\n focusScope.mountAutoFocus.subscribe((event) => {\n const interactionType = this.effectiveOpenInteractionType();\n const target =\n resolveInitialFocus(this.effectiveInitialFocus(), interactionType) ??\n this.defaultInitialFocus(interactionType);\n if (target === false) {\n event.preventDefault();\n return;\n }\n if (target) {\n event.preventDefault(); // override the scope's first-tabbable default\n target.focus();\n }\n });\n }\n\n /**\n * Resolves the {@link returnFocus} policy against the **close** interaction type for the composed\n * focus scope to apply at unmount (ADR 0017 §2). Mirrors Base UI's `getReturnElement`:\n * - `false` → `false` (the scope suppresses return-focus);\n * - `true` / `null` → `undefined` (the scope's default — return to the element focused before mount);\n * - an element (direct or from a callback) → that element (returned **explicitly**, bypassing the\n * \"focus moved elsewhere\" guard).\n */\n private resolveReturnFocusTarget(): HTMLElement | false | undefined {\n const resolved = resolveReturnFocus(this.effectiveReturnFocus(), this.effectiveCloseInteractionType());\n if (resolved === false) {\n return false;\n }\n if (resolved === true || resolved == null) {\n return undefined;\n }\n return resolved;\n }\n\n /**\n * Base UI's `defaultInitialFocus`: on a **touch** open, focus the popup itself instead of its first\n * tabbable control, so a soft keyboard (Android) does not pop up over the popup. Any other interaction\n * returns `null`, keeping the focus scope's first-tabbable default. The popup is made programmatically\n * focusable (`tabindex=\"-1\"`) if it isn't already.\n */\n private defaultInitialFocus(interactionType: RdxInteractionType): HTMLElement | null {\n if (interactionType !== 'touch') {\n return null;\n }\n const popup = (this.rootContext?.floatingElement ?? this.host) as HTMLElement;\n if (!popup.hasAttribute('tabindex')) {\n popup.setAttribute('tabindex', '-1');\n }\n return popup;\n }\n\n /**\n * Manager-owned post-open fallback. Some popup types open from a trigger event that fired before the\n * manager existed, and some policies resolve their final target only after a couple of renders. Re-run\n * the initial-focus policy for a few animation frames while the popup is open so the target can settle.\n */\n private wireInitialFocusFallback(): void {\n effect(() => {\n if (!this.effectiveEnabled() || !this.isFloatingOpen()) {\n return;\n }\n\n this.scheduleInitialFocusFallback();\n });\n }\n\n private scheduleInitialFocusFallback(attempt = 0): void {\n const view = this.host.ownerDocument.defaultView ?? globalThis;\n view.requestAnimationFrame(() => this.applyInitialFocusFallback(attempt));\n }\n\n private applyInitialFocusFallback(attempt: number): void {\n if (!this.effectiveEnabled() || !this.isFloatingOpen()) {\n return;\n }\n\n const popup = (this.rootContext?.floatingElement ?? this.host) as HTMLElement;\n const activeElement = this.host.ownerDocument.activeElement;\n\n if (activeElement instanceof HTMLElement && popup.contains(activeElement)) {\n return;\n }\n\n const interactionType = this.effectiveOpenInteractionType();\n const resolved = resolveInitialFocus(this.effectiveInitialFocus(), interactionType);\n if (resolved === false) {\n return;\n }\n\n const target = resolved ?? this.defaultInitialFocus(interactionType);\n if (target && activeElement !== target) {\n target.focus({ preventScroll: true });\n }\n\n if (attempt < 2) {\n this.scheduleInitialFocusFallback(attempt + 1);\n }\n }\n\n /**\n * Close-on-focus-out (ADR 0017 §3): a **non-modal** active popup closes when focus moves to a node\n * unrelated to the floating tree — not the popup, its trigger(s), a focus guard, or an ancestor /\n * descendant popup — and not during a pointer press (a drag must not close it). Mirrors Base UI's\n * `FloatingFocusManager` `!modal` branch (`movedToUnrelatedNode`).\n */\n private wireCloseOnFocusOut(): void {\n const ownerDocument = this.host.ownerDocument;\n let pointerDown = false;\n\n const onPointerDown = (): void => {\n pointerDown = true;\n };\n const onPointerUp = (): void => {\n pointerDown = false;\n };\n const onFocusOut = (event: FocusEvent): void => {\n if (!this.effectiveEnabled() || !this.effectiveCloseOnFocusOut() || this.effectiveModal() || pointerDown) {\n return;\n }\n const relatedTarget = event.relatedTarget as Node | null;\n if (!relatedTarget) {\n return; // focus left to nothing (tab-away / window blur) — let the browser handle it\n }\n if (relatedTarget instanceof Element && relatedTarget.hasAttribute(FOCUS_GUARD_ATTR)) {\n return; // moved onto a focus guard — still inside the focus system\n }\n if (this.isRelatedTargetInside(relatedTarget)) {\n return; // moved to a related node (trigger / ancestor / descendant) — keep open\n }\n this.focusOut.emit(event);\n };\n\n ownerDocument.addEventListener('pointerdown', onPointerDown, true);\n ownerDocument.addEventListener('pointerup', onPointerUp, true);\n ownerDocument.addEventListener('focusout', onFocusOut, true);\n\n inject(DestroyRef).onDestroy(() => {\n ownerDocument.removeEventListener('pointerdown', onPointerDown, true);\n ownerDocument.removeEventListener('pointerup', onPointerUp, true);\n ownerDocument.removeEventListener('focusout', onFocusOut, true);\n });\n }\n\n /**\n * The marker keep-set is intentionally narrow: the popup/focus host only. Own sibling roots such as a\n * user backdrop are DOM-footprint bookkeeping, not marker keep-set members.\n */\n private avoidElements(): Element[] {\n return [this.host];\n }\n\n private isFloatingOpen(): boolean {\n return this.rootContext?.open() ?? true;\n }\n\n /** Whether `relatedTarget` is inside the popup, its trigger(s), or an ancestor / descendant popup. */\n private isRelatedTargetInside(relatedTarget: Node): boolean {\n const floating = this.rootContext?.floatingElement ?? this.host;\n if (composedContains(floating, relatedTarget)) {\n return true;\n }\n if (this.rootContext && this.contextContains(this.rootContext, relatedTarget)) {\n return true;\n }\n\n const node = this.registration?.node() ?? null;\n if (node) {\n for (const ancestor of node.tree.ancestors(node)) {\n if (ancestor.context && this.contextContains(ancestor.context, relatedTarget)) {\n return true;\n }\n }\n for (const child of node.tree.children(node, { onlyOpen: true })) {\n if (child.context && this.contextContains(child.context, relatedTarget)) {\n return true;\n }\n }\n }\n return false;\n }\n\n private contextContains(context: RdxFloatingRootContext, relatedTarget: Node): boolean {\n if (context.floatingElement && composedContains(context.floatingElement, relatedTarget)) {\n return true;\n }\n if (context.referenceElement && composedContains(context.referenceElement, relatedTarget)) {\n return true;\n }\n return context.triggers.contains(relatedTarget);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;AAmCA;AACO,MAAM,mBAAmB,GAAG;AAKnC;AACA,MAAM,eAAe,GAAuD;IACxE,KAAK,EAAE,IAAI,OAAO,EAAE;IACpB,aAAa,EAAE,IAAI,OAAO;CAC7B;AACD;AACA,MAAM,qBAAqB,GAA+C;IACtE,KAAK,EAAE,IAAI,OAAO,EAAE;IACpB,aAAa,EAAE,IAAI,OAAO;CAC7B;AACD,IAAI,cAAc,GAAG,IAAI,OAAO,EAAmB;AACnD,IAAI,SAAS,GAAG,CAAC;AAEjB,SAAS,UAAU,CAAC,IAAiB,EAAA;IACjC,IAAI,CAAC,IAAI,EAAE;AACP,QAAA,OAAO,IAAI;IACf;AACA,IAAA,OAAO,IAAI,YAAY,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;AAC/E;AAEA;AACA,SAAS,eAAe,CAAC,MAAmB,EAAE,OAAkB,EAAA;AAC5D,IAAA,OAAO;AACF,SAAA,GAAG,CAAC,CAAC,MAAM,KAAI;AACZ,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACzB,YAAA,OAAO,MAAM;QACjB;AACA,QAAA,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC;AAC/B,QAAA,OAAO,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;AACtD,IAAA,CAAC;SACA,MAAM,CAAC,CAAC,OAAO,KAAyB,OAAO,IAAI,IAAI,CAAC;AACjE;AAEA;AACA,SAAS,YAAY,CAAC,OAAkB,EAAA;AACpC,IAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAQ;AAC5B,IAAA,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;QACvB,IAAI,IAAI,GAAgB,MAAM;QAC9B,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AAC5B,YAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACd,YAAA,IAAI,GAAG,IAAI,CAAC,UAAU;QAC1B;AACJ,IAAA,CAAC,CAAC;AACF,IAAA,OAAO,IAAI;AACf;AAEA;AACA,SAAS,sBAAsB,CAAC,IAAiB,EAAE,IAAe,EAAE,IAAe,EAAA;IAC/E,MAAM,OAAO,GAAc,EAAE;AAC7B,IAAA,MAAM,IAAI,GAAG,CAAC,MAAsB,KAAU;QAC1C,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YAC7B;QACJ;AACA,QAAA,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;YACzC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,QAAQ,EAAE;gBAC1C;YACJ;AACA,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBAChB,IAAI,CAAC,IAAI,CAAC;YACd;iBAAO;AACH,gBAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACtB;AACJ,QAAA,CAAC,CAAC;AACN,IAAA,CAAC;IACD,IAAI,CAAC,IAAI,CAAC;AACV,IAAA,OAAO,OAAO;AAClB;SAEgB,UAAU,CAAC,aAAwB,EAAE,UAA6B,EAAE,EAAA;AAChF,IAAA,MAAM,EAAE,UAAU,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,OAAO;AAClE,IAAA,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,EAAE;AACR,QAAA,OAAO,MAAK,EAAE,CAAC;IACnB;AACA,IAAA,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI;IACrC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,EAAE,aAAa,CAAC;;AAGlD,IAAA,MAAM,gBAAgB,GAA4B,KAAK,GAAG,OAAO,GAAG,UAAU,GAAG,aAAa,GAAG,IAAI;IACrG,MAAM,kBAAkB,GAAc,EAAE;IACxC,MAAM,cAAc,GAAc,EAAE;IAEpC,IAAI,gBAAgB,EAAE;AAClB,QAAA,MAAM,QAAQ,GAAG,eAAe,CAAC,gBAAgB,CAAC;AAClD,QAAA,MAAM,WAAW,GAAG,qBAAqB,CAAC,gBAAgB,CAAC;;AAE3D,QAAA,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC;QACpF,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;AAC1C,QAAA,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,EAAE,YAAY,CAAC,eAAe,CAAC,EAAE,IAAI,GAAG,CAAO,eAAe,CAAC,CAAC;AAE3G,QAAA,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;YACrB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC;YAChD,MAAM,OAAO,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,OAAO;AACjD,YAAA,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAC3C,YAAA,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC;AACzB,YAAA,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;AAE7B,YAAA,IAAI,KAAK,KAAK,CAAC,IAAI,OAAO,EAAE;AACxB,gBAAA,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;YACzB;YACA,IAAI,CAAC,OAAO,EAAE;AACV,gBAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,gBAAgB,KAAK,OAAO,GAAG,EAAE,GAAG,MAAM,CAAC;YACnF;AACJ,QAAA,CAAC,CAAC;IACN;IAEA,IAAI,IAAI,EAAE;AACN,QAAA,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,CAAO,KAAK,CAAC,CAAC;AACvF,QAAA,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AACrB,YAAA,MAAM,KAAK,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjD,YAAA,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC;AAC/B,YAAA,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;AACzB,YAAA,IAAI,KAAK,KAAK,CAAC,EAAE;AACb,gBAAA,IAAI,CAAC,YAAY,CAAC,mBAAmB,EAAE,EAAE,CAAC;YAC9C;AACJ,QAAA,CAAC,CAAC;IACN;IAEA,SAAS,IAAI,CAAC;AAEd,IAAA,OAAO,MAAK;QACR,IAAI,gBAAgB,EAAE;AAClB,YAAA,MAAM,QAAQ,GAAG,eAAe,CAAC,gBAAgB,CAAC;AAClD,YAAA,MAAM,WAAW,GAAG,qBAAqB,CAAC,gBAAgB,CAAC;AAC3D,YAAA,kBAAkB,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;AACnC,gBAAA,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AAC9C,gBAAA,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;AAC5B,gBAAA,IAAI,KAAK,KAAK,CAAC,EAAE;oBACb,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;AAC3B,wBAAA,OAAO,CAAC,eAAe,CAAC,gBAAgB,CAAC;oBAC7C;AACA,oBAAA,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC/B;AACJ,YAAA,CAAC,CAAC;QACN;AAEA,QAAA,cAAc,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;AAC/B,YAAA,MAAM,KAAK,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AACpD,YAAA,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;AAClC,YAAA,IAAI,KAAK,KAAK,CAAC,EAAE;AACb,gBAAA,OAAO,CAAC,eAAe,CAAC,mBAAmB,CAAC;YAChD;AACJ,QAAA,CAAC,CAAC;QAEF,SAAS,IAAI,CAAC;AACd,QAAA,IAAI,SAAS,KAAK,CAAC,EAAE;;AAEjB,YAAA,eAAe,CAAC,KAAK,GAAG,IAAI,OAAO,EAAE;AACrC,YAAA,eAAe,CAAC,aAAa,CAAC,GAAG,IAAI,OAAO,EAAE;AAC9C,YAAA,qBAAqB,CAAC,KAAK,GAAG,IAAI,OAAO,EAAE;AAC3C,YAAA,qBAAqB,CAAC,aAAa,CAAC,GAAG,IAAI,OAAO,EAAE;AACpD,YAAA,cAAc,GAAG,IAAI,OAAO,EAAE;QAClC;AACJ,IAAA,CAAC;AACL;;AC5IA;AACM,SAAU,2BAA2B,CAAC,KAAa,EAAA;IACrD,IAAI,CAAC,KAAK,EAAE;AACR,QAAA,OAAO,IAAI;IACf;IAEA,IAAI,OAAO,aAAa,KAAK,WAAW,IAAI,KAAK,YAAY,aAAa,EAAE;AACxE,QAAA,OAAO,UAAU;IACrB;IAEA,IAAI,aAAa,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,EAAE;AACjE,QAAA,QAAQ,KAAK,CAAC,WAAW,IAAI,OAAO;IACxC;IAEA,IAAI,OAAO,UAAU,KAAK,WAAW,IAAI,KAAK,YAAY,UAAU,EAAE;AAClE,QAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG,UAAU,GAAG,OAAO;IACpD;AAEA,IAAA,OAAO,EAAE;AACb;AAEA;AACM,SAAU,kBAAkB,CAAC,MAAsB,EAAA;AACrD,IAAA,OAAO,OAAO,MAAM,KAAK,UAAU,GAAG,MAAM,EAAE,GAAG,MAAM;AAC3D;AAEA;;AAEG;AACG,SAAU,mBAAmB,CAC/B,MAAuB,EACvB,mBAAuC,EAAA;AAEvC,IAAA,MAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,UAAU,GAAG,MAAM,CAAC,mBAAmB,CAAC,GAAG,MAAM;AACpF,IAAA,OAAO,QAAQ,KAAK,KAAK,GAAG,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC;AACpE;AAEA;;;AAGG;AACG,SAAU,kBAAkB,CAC9B,MAAsB,EACtB,oBAAwC,EAAA;AAExC,IAAA,MAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,UAAU,GAAG,MAAM,CAAC,oBAAoB,CAAC,GAAG,MAAM;AACrF,IAAA,OAAO,OAAO,QAAQ,KAAK,SAAS,GAAG,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC;AAClF;MAkBa,iCAAiC,GAAG,IAAI,cAAc,CAC/D,+BAA+B;AAGnC;AACM,SAAU,iCAAiC,CAAC,OAA4C,EAAA;IAC1F,OAAO,EAAE,OAAO,EAAE,iCAAiC,EAAE,UAAU,EAAE,OAAO,EAAE;AAC9E;AAEA;AACA,SAAS,qBAAqB,CAAC,KAA+B,EAAA;AAC1D,IAAA,OAAO,KAAK,KAAK,SAAS,GAAG,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC;AACpE;AAEA;;;;;AAKG;AACH,SAAS,8BAA8B,GAAA;AACnC,IAAA,OAAO,0BAA0B,CAAC,OAA4B,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC9F;AAEA;;;;;;;;;;;;;;;;;AAiBG;MAOU,uBAAuB,CAAA;AA8EhC,IAAA,WAAA,GAAA;;QA5ES,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,SAAS,+EAAI,SAAS,EAAE,qBAAqB,EAAA,CAAG;;QAGhE,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,SAAS,6EAAI,SAAS,EAAE,qBAAqB,EAAA,CAAG;AAEvE;;;AAGG;QACM,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,SAAS,6EAAI,SAAS,EAAE,qBAAqB,EAAA,CAAG;;AAG9D,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAA8B,SAAS,mFAAC;;AAG5D,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAA6B,SAAS,kFAAC;AAEnE;;;;AAIG;QACM,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,SAAS,uFAAI,SAAS,EAAE,qBAAqB,EAAA,CAAG;AAEjF;;;;AAIG;QACM,IAAA,CAAA,QAAQ,GAAG,MAAM,EAAc;;QAGvB,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,iCAAiC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;QAG9E,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,IAAI,IAAI,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;QACrF,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;QAChF,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;QAChG,IAAA,CAAA,wBAAwB,GAAG,QAAQ,CACxC,MAAM,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,eAAe,IAAI,IAAI,IAAI,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,0BAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC3E;AACQ,QAAA,IAAA,CAAA,qBAAqB,GAAG,QAAQ,CAAC,MACtC,IAAI,CAAC,YAAY,EAAE,KAAK,SAAS,GAAG,IAAI,CAAC,YAAY,EAAG,IAAI,IAAI,CAAC,MAAM,EAAE,YAAY,IAAI,IAAI,IAAI,CAAC,4FACrG;AACQ,QAAA,IAAA,CAAA,oBAAoB,GAAG,QAAQ,CAAC,MACrC,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS,GAAG,IAAI,CAAC,WAAW,EAAG,IAAI,IAAI,CAAC,MAAM,EAAE,WAAW,IAAI,IAAI,IAAI,CAAC,2FAClG;AACQ,QAAA,IAAA,CAAA,4BAA4B,GAAG,QAAQ,CAC5C,MAAM,IAAI,CAAC,MAAM,EAAE,mBAAmB,IAAI,IAAI,IAAI,CAAC,gBAAgB,EAAE,mGACxE;AACQ,QAAA,IAAA,CAAA,6BAA6B,GAAG,QAAQ,CAC7C,MAAM,IAAI,CAAC,MAAM,EAAE,oBAAoB,IAAI,IAAI,IAAI,CAAC,gBAAgB,EAAE,oGACzE;;AAGQ,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,8EAAC;;;AAIlE,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,wBAAwB,CAGlE;AAEgB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,aAA4B;QACtD,IAAA,CAAA,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;;QAGlD,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,yBAAyB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;QAEnE,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,yBAAyB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAEpE,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAqB,EAAE,uFAAC;;AAEzD,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;AAGzD,QAAA,MAAM,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;;;AAI/D,QAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,GAAG,MAAM,IAAI,CAAC,wBAAwB,EAAE;AAEzE,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACjB,YAAA,OAAO;QACX;;;AAIA,QAAA,MAAM,CAAC,CAAC,SAAS,KAAI;AACjB,YAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;gBACpD;YACJ;AACA,YAAA,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AAClF,QAAA,CAAC,CAAC;;;;;AAMF,QAAA,MAAM,CAAC,CAAC,SAAS,KAAI;AACjB,YAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;gBAC9E;YACJ;AACA,YAAA,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7E,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,oBAAoB,EAAE;QAC3B,IAAI,CAAC,mBAAmB,EAAE;QAC1B,IAAI,CAAC,sBAAsB,EAAE;QAC7B,IAAI,CAAC,wBAAwB,EAAE;IACnC;;IAGQ,oBAAoB,GAAA;AACxB,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa;AAC7C,QAAA,MAAM,SAAS,GAAG,CAAC,KAAY,KAAU;AACrC,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAG,KAAsB,CAAC,WAAW,IAAI,OAAO,EAAwB;AACrG,QAAA,CAAC;AACD,QAAA,MAAM,KAAK,GAAG,MAAY,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC;QAE/D,aAAa,CAAC,gBAAgB,CAAC,aAAa,EAAE,SAAS,EAAE,IAAI,CAAC;QAC9D,aAAa,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC;AACtD,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAK;YAC9B,aAAa,CAAC,mBAAmB,CAAC,aAAa,EAAE,SAAS,EAAE,IAAI,CAAC;YACjE,aAAa,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC;AAC7D,QAAA,CAAC,CAAC;IACN;AAEA;;;;;;AAMG;IACK,sBAAsB,GAAA;AAC1B,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC;QAExC,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;AAC1C,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,4BAA4B,EAAE;YAC3D,MAAM,MAAM,GACR,mBAAmB,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,eAAe,CAAC;AAClE,gBAAA,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC;AAC7C,YAAA,IAAI,MAAM,KAAK,KAAK,EAAE;gBAClB,KAAK,CAAC,cAAc,EAAE;gBACtB;YACJ;YACA,IAAI,MAAM,EAAE;AACR,gBAAA,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,MAAM,CAAC,KAAK,EAAE;YAClB;AACJ,QAAA,CAAC,CAAC;IACN;AAEA;;;;;;;AAOG;IACK,wBAAwB,GAAA;AAC5B,QAAA,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC,6BAA6B,EAAE,CAAC;AACtG,QAAA,IAAI,QAAQ,KAAK,KAAK,EAAE;AACpB,YAAA,OAAO,KAAK;QAChB;QACA,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,IAAI,IAAI,EAAE;AACvC,YAAA,OAAO,SAAS;QACpB;AACA,QAAA,OAAO,QAAQ;IACnB;AAEA;;;;;AAKG;AACK,IAAA,mBAAmB,CAAC,eAAmC,EAAA;AAC3D,QAAA,IAAI,eAAe,KAAK,OAAO,EAAE;AAC7B,YAAA,OAAO,IAAI;QACf;AACA,QAAA,MAAM,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,eAAe,IAAI,IAAI,CAAC,IAAI,CAAgB;QAC7E,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE;AACjC,YAAA,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC;QACxC;AACA,QAAA,OAAO,KAAK;IAChB;AAEA;;;;AAIG;IACK,wBAAwB,GAAA;QAC5B,MAAM,CAAC,MAAK;AACR,YAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;gBACpD;YACJ;YAEA,IAAI,CAAC,4BAA4B,EAAE;AACvC,QAAA,CAAC,CAAC;IACN;IAEQ,4BAA4B,CAAC,OAAO,GAAG,CAAC,EAAA;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,IAAI,UAAU;AAC9D,QAAA,IAAI,CAAC,qBAAqB,CAAC,MAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAC7E;AAEQ,IAAA,yBAAyB,CAAC,OAAe,EAAA;AAC7C,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;YACpD;QACJ;AAEA,QAAA,MAAM,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,eAAe,IAAI,IAAI,CAAC,IAAI,CAAgB;QAC7E,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa;QAE3D,IAAI,aAAa,YAAY,WAAW,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;YACvE;QACJ;AAEA,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,4BAA4B,EAAE;QAC3D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,eAAe,CAAC;AACnF,QAAA,IAAI,QAAQ,KAAK,KAAK,EAAE;YACpB;QACJ;QAEA,MAAM,MAAM,GAAG,QAAQ,IAAI,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC;AACpE,QAAA,IAAI,MAAM,IAAI,aAAa,KAAK,MAAM,EAAE;YACpC,MAAM,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;QACzC;AAEA,QAAA,IAAI,OAAO,GAAG,CAAC,EAAE;AACb,YAAA,IAAI,CAAC,4BAA4B,CAAC,OAAO,GAAG,CAAC,CAAC;QAClD;IACJ;AAEA;;;;;AAKG;IACK,mBAAmB,GAAA;AACvB,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa;QAC7C,IAAI,WAAW,GAAG,KAAK;QAEvB,MAAM,aAAa,GAAG,MAAW;YAC7B,WAAW,GAAG,IAAI;AACtB,QAAA,CAAC;QACD,MAAM,WAAW,GAAG,MAAW;YAC3B,WAAW,GAAG,KAAK;AACvB,QAAA,CAAC;AACD,QAAA,MAAM,UAAU,GAAG,CAAC,KAAiB,KAAU;AAC3C,YAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,WAAW,EAAE;gBACtG;YACJ;AACA,YAAA,MAAM,aAAa,GAAG,KAAK,CAAC,aAA4B;YACxD,IAAI,CAAC,aAAa,EAAE;AAChB,gBAAA,OAAO;YACX;YACA,IAAI,aAAa,YAAY,OAAO,IAAI,aAAa,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE;AAClF,gBAAA,OAAO;YACX;AACA,YAAA,IAAI,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,EAAE;AAC3C,gBAAA,OAAO;YACX;AACA,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AAC7B,QAAA,CAAC;QAED,aAAa,CAAC,gBAAgB,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC;QAClE,aAAa,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,CAAC;QAC9D,aAAa,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC;AAE5D,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAK;YAC9B,aAAa,CAAC,mBAAmB,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC;YACrE,aAAa,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,CAAC;YACjE,aAAa,CAAC,mBAAmB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC;AACnE,QAAA,CAAC,CAAC;IACN;AAEA;;;AAGG;IACK,aAAa,GAAA;AACjB,QAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;IACtB;IAEQ,cAAc,GAAA;QAClB,OAAO,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,IAAI;IAC3C;;AAGQ,IAAA,qBAAqB,CAAC,aAAmB,EAAA;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe,IAAI,IAAI,CAAC,IAAI;AAC/D,QAAA,IAAI,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE;AAC3C,YAAA,OAAO,IAAI;QACf;AACA,QAAA,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,EAAE;AAC3E,YAAA,OAAO,IAAI;QACf;QAEA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,IAAI;QAC9C,IAAI,IAAI,EAAE;AACN,YAAA,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;AAC9C,gBAAA,IAAI,QAAQ,CAAC,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE;AAC3E,oBAAA,OAAO,IAAI;gBACf;YACJ;AACA,YAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;AAC9D,gBAAA,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE;AACrE,oBAAA,OAAO,IAAI;gBACf;YACJ;QACJ;AACA,QAAA,OAAO,KAAK;IAChB;IAEQ,eAAe,CAAC,OAA+B,EAAE,aAAmB,EAAA;AACxE,QAAA,IAAI,OAAO,CAAC,eAAe,IAAI,gBAAgB,CAAC,OAAO,CAAC,eAAe,EAAE,aAAa,CAAC,EAAE;AACrF,YAAA,OAAO,IAAI;QACf;AACA,QAAA,IAAI,OAAO,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,OAAO,CAAC,gBAAgB,EAAE,aAAa,CAAC,EAAE;AACvF,YAAA,OAAO,IAAI;QACf;QACA,OAAO,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC;IACnD;8GA3US,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,SAAA,EAFrB,CAAC,8BAA8B,EAAE,CAAC,EAAA,QAAA,EAAA,CAAA,yBAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,SAAA,EAAA,EAAA,CAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAEpC,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBANnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,2BAA2B;AACrC,oBAAA,QAAQ,EAAE,yBAAyB;AACnC,oBAAA,cAAc,EAAE,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;AAChE,oBAAA,SAAS,EAAE,CAAC,8BAA8B,EAAE;AAC/C,iBAAA;;;ACvKD;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"radix-ng-primitives-floating-focus-manager.mjs","sources":["../../../packages/primitives/floating-focus-manager/src/mark-others.ts","../../../packages/primitives/floating-focus-manager/src/floating-focus-manager.ts","../../../packages/primitives/floating-focus-manager/src/trigger-interaction.ts","../../../packages/primitives/floating-focus-manager/radix-ng-primitives-floating-focus-manager.ts"],"sourcesContent":["/**\n * `markOthers` — the Angular port of Base UI's `floating-ui-react/utils/markOthers` (ADR 0017 §3). It\n * isolates a popup from the rest of the page by walking the owner `Document`'s `<body>` and applying an\n * attribute to every element **outside** the kept (`avoidElements`) subtree — siblings of the popup's\n * ancestor chain — leaving the popup, its ancestors, and any `[aria-live]` region untouched.\n *\n * Two independent passes (Base UI makes two separate calls, never bundling them):\n * - **control attribute** — either `inert` (the real attribute: non-interactive **and** removed from the\n * a11y tree) or `aria-hidden=\"true\"` (AT-only). `inert` takes precedence and is what replaces the\n * global body pointer-lock for modal isolation (ADR 0017 §3 / finding #4): it blocks pointer + focus\n * on outside content **scoped** to siblings of the popup's ancestor chain, so independent overlays at a\n * higher layer are unaffected (unlike `body { pointer-events: none }`).\n * - **`mark`** — a neutral marker attribute ({@link RDX_FLOATING_MARKER}) applied whenever the focus\n * manager is active; read by ADR 0015's outside-press guard to detect third-party-injected subtrees.\n *\n * Per-**element**, per-**attribute** ref-counting (`WeakMap<Element, number>`) lets overlapping popups\n * compose: an element controlled by two popups is only cleared when both undo. An element that already\n * carried the control attribute before the call is recorded and left in place on undo.\n *\n * @returns an `Undo` that reverses exactly what this call applied.\n */\nexport type Undo = () => void;\n\nexport interface MarkOthersOptions {\n /** Apply `aria-hidden=\"true\"` to outside elements (AT-only isolation). Ignored when `inert` is set. */\n ariaHidden?: boolean;\n /**\n * Apply the real `inert` attribute to outside elements — non-interactive **and** a11y-hidden in one.\n * Takes precedence over `ariaHidden`; this is the scoped replacement for the body pointer-lock.\n */\n inert?: boolean;\n /** Apply the neutral {@link RDX_FLOATING_MARKER} to outside elements. Default `true`. */\n mark?: boolean;\n}\n\n/** The neutral \"outside the active floating layer\" marker (Base UI `data-base-ui-inert`). */\nexport const RDX_FLOATING_MARKER = 'data-rdx-floating-inert';\n\n/** The mutually-exclusive control attribute (Base UI: `inert` wins over `aria-hidden`). */\ntype ControlAttribute = 'inert' | 'aria-hidden';\n\n/** Per-element, per-attribute ref-counts. Keyed by element, so they are naturally per-`Document`. */\nconst controlCounters: Record<ControlAttribute, WeakMap<Element, number>> = {\n inert: new WeakMap(),\n 'aria-hidden': new WeakMap()\n};\n/** Elements that already carried the control attribute before we touched them — left in place on undo. */\nconst preExistingControlled: Record<ControlAttribute, WeakSet<Element>> = {\n inert: new WeakSet(),\n 'aria-hidden': new WeakSet()\n};\nlet markerCounters = new WeakMap<Element, number>();\nlet lockCount = 0;\n\nfunction unwrapHost(node: Node | null): Element | null {\n if (!node) {\n return null;\n }\n return node instanceof ShadowRoot ? node.host : unwrapHost(node.parentNode);\n}\n\n/** Maps each target to the element actually inside `parent` (piercing shadow hosts), dropping the rest. */\nfunction correctElements(parent: HTMLElement, targets: Element[]): Element[] {\n return targets\n .map((target) => {\n if (parent.contains(target)) {\n return target;\n }\n const host = unwrapHost(target);\n return host && parent.contains(host) ? host : null;\n })\n .filter((element): element is Element => element != null);\n}\n\n/** The set of nodes on the path from each target up to the root — the \"keep\" subtree. */\nfunction buildKeepSet(targets: Element[]): Set<Node> {\n const keep = new Set<Node>();\n targets.forEach((target) => {\n let node: Node | null = target;\n while (node && !keep.has(node)) {\n keep.add(node);\n node = node.parentNode;\n }\n });\n return keep;\n}\n\n/** Collects every element outside the kept subtree (a sibling of the kept ancestor chain). */\nfunction collectOutsideElements(root: HTMLElement, keep: Set<Node>, stop: Set<Node>): Element[] {\n const outside: Element[] = [];\n const walk = (parent: Element | null): void => {\n if (!parent || stop.has(parent)) {\n return;\n }\n Array.from(parent.children).forEach((node) => {\n if (node.nodeName.toLowerCase() === 'script') {\n return;\n }\n if (keep.has(node)) {\n walk(node);\n } else {\n outside.push(node);\n }\n });\n };\n walk(root);\n return outside;\n}\n\nexport function markOthers(avoidElements: Element[], options: MarkOthersOptions = {}): Undo {\n const { ariaHidden = false, inert = false, mark = true } = options;\n const first = avoidElements[0];\n if (!first) {\n return () => {};\n }\n const body = first.ownerDocument.body;\n const avoid = correctElements(body, avoidElements);\n\n // `inert` wins over `aria-hidden` (it already removes the subtree from the a11y tree, Base UI).\n const controlAttribute: ControlAttribute | null = inert ? 'inert' : ariaHidden ? 'aria-hidden' : null;\n const controlledElements: Element[] = [];\n const markedElements: Element[] = [];\n\n if (controlAttribute) {\n const counters = controlCounters[controlAttribute];\n const preExisting = preExistingControlled[controlAttribute];\n // `aria-live` regions stay announceable, so keep them out of the controlled set too.\n const live = correctElements(body, Array.from(body.querySelectorAll('[aria-live]')));\n const controlElements = avoid.concat(live);\n const targets = collectOutsideElements(body, buildKeepSet(controlElements), new Set<Node>(controlElements));\n\n targets.forEach((node) => {\n const attr = node.getAttribute(controlAttribute);\n const already = attr !== null && attr !== 'false';\n const count = (counters.get(node) ?? 0) + 1;\n counters.set(node, count);\n controlledElements.push(node);\n\n if (count === 1 && already) {\n preExisting.add(node);\n }\n if (!already) {\n node.setAttribute(controlAttribute, controlAttribute === 'inert' ? '' : 'true');\n }\n });\n }\n\n if (mark) {\n const targets = collectOutsideElements(body, buildKeepSet(avoid), new Set<Node>(avoid));\n targets.forEach((node) => {\n const count = (markerCounters.get(node) ?? 0) + 1;\n markerCounters.set(node, count);\n markedElements.push(node);\n if (count === 1) {\n node.setAttribute(RDX_FLOATING_MARKER, '');\n }\n });\n }\n\n lockCount += 1;\n\n return () => {\n if (controlAttribute) {\n const counters = controlCounters[controlAttribute];\n const preExisting = preExistingControlled[controlAttribute];\n controlledElements.forEach((element) => {\n const count = (counters.get(element) ?? 0) - 1;\n counters.set(element, count);\n if (count === 0) {\n if (!preExisting.has(element)) {\n element.removeAttribute(controlAttribute);\n }\n preExisting.delete(element);\n }\n });\n }\n\n markedElements.forEach((element) => {\n const count = (markerCounters.get(element) ?? 0) - 1;\n markerCounters.set(element, count);\n if (count === 0) {\n element.removeAttribute(RDX_FLOATING_MARKER);\n }\n });\n\n lockCount -= 1;\n if (lockCount === 0) {\n // No active locks anywhere — drop the ref-count tables so detached elements can be GC'd.\n controlCounters.inert = new WeakMap();\n controlCounters['aria-hidden'] = new WeakMap();\n preExistingControlled.inert = new WeakSet();\n preExistingControlled['aria-hidden'] = new WeakSet();\n markerCounters = new WeakMap();\n }\n };\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n booleanAttribute,\n computed,\n DestroyRef,\n Directive,\n effect,\n ElementRef,\n inject,\n InjectionToken,\n input,\n output,\n PLATFORM_ID,\n Provider,\n signal,\n WritableSignal\n} from '@angular/core';\nimport {\n BooleanInput,\n RDX_FLOATING_REGISTRATION,\n RDX_FLOATING_ROOT_CONTEXT,\n RdxFloatingRootContext,\n RdxFloatingTree\n} from '@radix-ng/primitives/core';\nimport {\n composedContains,\n createFocusGuard,\n enableFocusInside,\n focus,\n FOCUS_GUARD_ATTR,\n getNextTabbable,\n getPreviousTabbable,\n getTabbableCandidates,\n isOutsideEvent,\n provideRdxFocusScopeConfig,\n RdxFocusScope,\n RdxFocusScopeConfig,\n RdxFocusScopeConfigToken,\n useFocusGuardsTabbability\n} from '@radix-ng/primitives/focus-scope';\nimport { markOthers } from './mark-others';\n\n/**\n * How a popup was opened / closed (Base UI `InteractionType`). `null` = a **programmatic** open (prefer\n * the previously-focused element); `''` = an **unknown** interaction. The two are deliberately distinct\n * (Base UI keys `preferPreviousFocus = openInteractionType == null` off exactly this).\n */\nexport type RdxInteractionType = 'mouse' | 'touch' | 'pen' | 'keyboard' | '' | null;\n\n/** A focus target: an element, a getter, `null`, or `undefined` from a policy callback. */\nexport type RdxFocusTarget = HTMLElement | (() => HTMLElement | null) | null | undefined;\n\n/** `initialFocus` policy (ADR 0017 §2) — a target, `false`, or an open-interaction callback. */\nexport type RdxInitialFocus =\n | RdxFocusTarget\n | false\n | ((openInteractionType: RdxInteractionType) => RdxFocusTarget | false);\n\n/** `returnFocus` policy (ADR 0017 §2) — a target/boolean or a callback receiving the **close** interaction type. */\nexport type RdxReturnFocus =\n | RdxFocusTarget\n | boolean\n | ((closeInteractionType: RdxInteractionType) => RdxFocusTarget | boolean | undefined);\n\n/** Normalizes a DOM event into Base UI-like interaction intent for focus policy decisions. */\nexport function getInteractionTypeFromEvent(event?: Event): RdxInteractionType {\n if (!event) {\n return null;\n }\n\n if (typeof KeyboardEvent !== 'undefined' && event instanceof KeyboardEvent) {\n return 'keyboard';\n }\n\n if ('pointerType' in event && typeof event.pointerType === 'string') {\n return (event.pointerType || 'mouse') as RdxInteractionType;\n }\n\n if (typeof MouseEvent !== 'undefined' && event instanceof MouseEvent) {\n return event.detail === 0 ? 'keyboard' : 'mouse';\n }\n\n return '';\n}\n\n/** Resolves an {@link RdxFocusTarget} (element | getter | null) to a concrete element. */\nexport function resolveFocusTarget(target: RdxFocusTarget): HTMLElement | null | undefined {\n return typeof target === 'function' ? target() : target;\n}\n\n/**\n * Resolves an {@link RdxInitialFocus} policy against how the popup opened.\n */\nexport function resolveInitialFocus(\n policy: RdxInitialFocus,\n openInteractionType: RdxInteractionType\n): HTMLElement | null | false | undefined {\n const resolved = typeof policy === 'function' ? policy(openInteractionType) : policy;\n return resolved === false ? false : resolveFocusTarget(resolved);\n}\n\n/**\n * Resolves an {@link RdxReturnFocus} policy against how the popup closed. `false` = do not return focus;\n * `true` = the default (return to the previously-focused element); an element = return there.\n */\nexport function resolveReturnFocus(\n policy: RdxReturnFocus,\n closeInteractionType: RdxInteractionType\n): HTMLElement | boolean | null | undefined {\n const resolved = typeof policy === 'function' ? policy(closeInteractionType) : policy;\n return typeof resolved === 'boolean' ? resolved : resolveFocusTarget(resolved);\n}\n\n/**\n * DI seam for a **composing primitive** (Dialog / Popover / Menu) to drive the manager's gates from its\n * own root context instead of template-bound inputs (which a primitive cannot set). Each field falls\n * back to the manager's input, then to the documented default. Mirrors {@link RdxFocusScopeConfig}.\n */\nexport interface RdxFloatingFocusManagerConfig {\n modal?: () => boolean;\n inert?: () => boolean;\n enabled?: () => boolean;\n closeOnFocusOut?: () => boolean;\n initialFocus?: () => RdxInitialFocus;\n returnFocus?: () => RdxReturnFocus;\n restoreFocus?: () => boolean | 'popup';\n previousFocusableElement?: () => RdxFocusTarget;\n nextFocusableElement?: () => RdxFocusTarget;\n beforeContentFocusGuardRef?: () => RdxFocusGuardRef | null | undefined;\n externalTree?: () => RdxFloatingTree | null | undefined;\n getInsideElements?: () => Array<Element | null | undefined>;\n openInteractionType?: () => RdxInteractionType;\n closeInteractionType?: () => RdxInteractionType;\n}\n\nexport type RdxFocusGuardRef =\n | ((element: HTMLSpanElement | null) => void)\n | { set: (element: HTMLSpanElement | null) => void };\n\nexport const RDX_FLOATING_FOCUS_MANAGER_CONFIG = new InjectionToken<RdxFloatingFocusManagerConfig>(\n 'RdxFloatingFocusManagerConfig'\n);\n\n/** Provides a {@link RdxFloatingFocusManagerConfig} for an enclosing primitive's focus manager. */\nexport function provideFloatingFocusManagerConfig(factory: () => RdxFloatingFocusManagerConfig): Provider {\n return { provide: RDX_FLOATING_FOCUS_MANAGER_CONFIG, useFactory: factory };\n}\n\n/** Coerces a boolean-ish input while preserving `undefined` (\"not set\" → fall back to the config). */\nfunction coerceOptionalBoolean(value: BooleanInput | undefined): boolean | undefined {\n return value === undefined ? undefined : booleanAttribute(value);\n}\n\n/**\n * Provides a {@link RdxFocusScopeConfig} whose `trapped` is a **writable** signal, so the enclosing\n * {@link RdxFloatingFocusManager} can drive it from its `modal`/`enabled` policy after construction. The\n * factory has **no** dependency on the manager instance, so it cannot deadlock the host-directive\n * construction order (the manager later injects this same config and writes the signal).\n */\nfunction provideManagedFocusScopeConfig(): Provider {\n return provideRdxFocusScopeConfig((): RdxFocusScopeConfig => ({ trapped: signal(false) }));\n}\n\n/**\n * `RdxFloatingFocusManager` (ADR 0017 Phase 1b skeleton) — the Angular counterpart of Base UI's\n * `FloatingFocusManager`. It is a **coordinator** that composes three low-level focus parts (it never\n * inherits them, which would re-fuse trap + popup policy): the **reworked {@link RdxFocusScope}** (the\n * trap, via `hostDirectives`), the portal-focus bridge, and owner-`Document` guards. Per ADR 0017 §1/§2\n * its policies are **independent**, none derived from `modal`.\n *\n * **This skeleton wires the composition + lifecycle gates:**\n * - `enabled` — the manager's active-ness (`mounted && !hover-open`). When off, **no trap** (and, later,\n * no aria-hidden / no marker — Phase 2).\n * - `modal` → `RdxFocusScope.trapped`: the effective trap is `enabled() && modal()`, pushed into the\n * composed focus scope through its config token (the composition seam).\n * - `loop` is forwarded to `RdxFocusScope`.\n * - `initialFocus` / `returnFocus` are **orchestrated** here (the §2 policy contract, incl. the\n * interaction-type callback forms): `initialFocus` via the scope's `mountAutoFocus` hook, `returnFocus`\n * via the scope's `returnFocus` config seam (resolved at the scope's queued post-unmount frame).\n */\n@Directive({\n selector: '[rdxFloatingFocusManager]',\n exportAs: 'rdxFloatingFocusManager',\n hostDirectives: [{ directive: RdxFocusScope, inputs: ['loop'] }],\n providers: [provideManagedFocusScopeConfig()]\n})\nexport class RdxFloatingFocusManager {\n /** Manager active-ness (ADR 0017 §2): the popup is mounted **and** not hover-opened. */\n readonly enabled = input(undefined, { transform: coerceOptionalBoolean });\n\n /** Modal popup → focus trap. Combined with `enabled` to drive the composed `RdxFocusScope`. */\n readonly modal = input(undefined, { transform: coerceOptionalBoolean });\n\n /**\n * Whether outside elements receive the real `inert` attribute. Defaults to the effective `modal` value,\n * but primitives can split focus trapping from pointer/AT isolation (Base UI `modal=\"trap-focus\"`).\n */\n readonly inert = input(undefined, { transform: coerceOptionalBoolean });\n\n /** Where focus goes when the popup opens (ADR 0017 §2). */\n readonly initialFocus = input<RdxInitialFocus | undefined>(undefined);\n\n /** Where focus returns when the popup closes (ADR 0017 §2). */\n readonly returnFocus = input<RdxReturnFocus | undefined>(undefined);\n\n /**\n * Restores focus inside the floating tree when the currently focused inside element is removed and\n * the browser drops focus onto `<body>` (Base UI `restoreFocus`). `true` restores to the last\n * available tabbable candidate, `'popup'` restores to the popup container.\n */\n readonly restoreFocus = input<boolean | 'popup' | undefined>(undefined);\n\n /** Overrides where backward tabbing out of a non-modal portaled popup lands. */\n readonly previousFocusableElement = input<RdxFocusTarget>(undefined);\n\n /** Overrides where forward tabbing out of a non-modal portaled popup lands. */\n readonly nextFocusableElement = input<RdxFocusTarget>(undefined);\n\n /** Optional callback/signal that receives the leading content focus guard. */\n readonly beforeContentFocusGuardRef = input<RdxFocusGuardRef | null | undefined>(undefined);\n\n /** Explicit floating tree for detached sibling composition (Base UI `externalTree`). */\n readonly externalTree = input<RdxFloatingTree | null | undefined>(undefined);\n\n /** Additional elements treated as inside the floating subtree (Base UI `getInsideElements`). */\n readonly getInsideElements = input<(() => Array<Element | null | undefined>) | undefined>(undefined);\n\n /**\n * Whether a **non-modal** popup closes when focus leaves to an unrelated node (Base UI\n * `closeOnFocusOut`, default `true`; Dialog sets it to `!disablePointerDismissal`). Modal popups\n * never close on focus-out (the trap keeps focus in).\n */\n readonly closeOnFocusOut = input(undefined, { transform: coerceOptionalBoolean });\n\n /**\n * Emitted when focus leaves a non-modal popup to a node **unrelated** to the floating tree (ADR 0017\n * §3) — the consumer should close the popup. This is the focus-manager's focus-out close (it reads\n * the shared tree), replacing the dismissal capability's focus-out at the ADR 0015 Phase-4 cutover.\n */\n readonly focusOut = output<FocusEvent>();\n\n /** Optional DI config a composing primitive provides to drive the gates (input wins over config). */\n private readonly config = inject(RDX_FLOATING_FOCUS_MANAGER_CONFIG, { optional: true });\n\n /** Effective gates: `input ?? config ?? default`. */\n readonly effectiveEnabled = computed(() => this.enabled() ?? this.config?.enabled?.() ?? true);\n readonly effectiveModal = computed(() => this.modal() ?? this.config?.modal?.() ?? false);\n readonly effectiveInert = computed(() => this.inert() ?? this.config?.inert?.() ?? this.effectiveModal());\n readonly effectiveCloseOnFocusOut = computed(\n () => this.closeOnFocusOut() ?? this.config?.closeOnFocusOut?.() ?? true\n );\n readonly effectiveInitialFocus = computed(() =>\n this.initialFocus() !== undefined ? this.initialFocus()! : (this.config?.initialFocus?.() ?? null)\n );\n readonly effectiveReturnFocus = computed(() =>\n this.returnFocus() !== undefined ? this.returnFocus()! : (this.config?.returnFocus?.() ?? true)\n );\n readonly effectiveRestoreFocus = computed(() => this.restoreFocus() ?? this.config?.restoreFocus?.() ?? false);\n readonly effectivePreviousFocusableElement = computed(() =>\n this.previousFocusableElement() !== undefined\n ? this.previousFocusableElement()\n : this.config?.previousFocusableElement?.()\n );\n readonly effectiveNextFocusableElement = computed(() =>\n this.nextFocusableElement() !== undefined ? this.nextFocusableElement() : this.config?.nextFocusableElement?.()\n );\n readonly effectiveBeforeContentFocusGuardRef = computed(\n () => this.beforeContentFocusGuardRef() ?? this.config?.beforeContentFocusGuardRef?.()\n );\n readonly effectiveExternalTree = computed(() => this.externalTree() ?? this.config?.externalTree?.() ?? null);\n readonly insideElements = computed(() => {\n const getElements = this.getInsideElements() ?? this.config?.getInsideElements;\n return (getElements?.() ?? []).filter((element): element is Element => element != null);\n });\n readonly effectiveOpenInteractionType = computed(\n () => this.config?.openInteractionType?.() ?? this._interactionType()\n );\n readonly effectiveCloseInteractionType = computed(\n () => this.config?.closeInteractionType?.() ?? this._interactionType()\n );\n\n /** The effective trap state the composed `RdxFocusScope` reads via its config token. */\n readonly trapped = computed(() => this.effectiveEnabled() && this.effectiveModal());\n\n // The config this directive provides — its `trapped` signal is writable so we can drive it, and we\n // attach a `returnFocus` resolver the composed focus scope calls at unmount (ADR 0017 `returnFocus`).\n private readonly focusScopeConfig = inject(RdxFocusScopeConfigToken) as {\n trapped: WritableSignal<boolean>;\n returnFocus?: () => HTMLElement | false | undefined;\n };\n\n private readonly host = inject(ElementRef).nativeElement as HTMLElement;\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /** The shared per-popup context (open / triggers / elements), if a primitive root provides one. */\n private readonly rootContext = inject(RDX_FLOATING_ROOT_CONTEXT, { optional: true });\n /** The registration handle for this node, used to read the shared tree (ancestors / descendants). */\n private readonly registration = inject(RDX_FLOATING_REGISTRATION, { optional: true });\n\n private readonly _interactionType = signal<RdxInteractionType>('');\n /** How the popup was most recently interacted with — fed to the initial/return focus policy callbacks. */\n readonly interactionType = this._interactionType.asReadonly();\n\n constructor() {\n effect(() => this.focusScopeConfig.trapped.set(this.trapped()));\n\n // Own the return-focus *target* (the composed focus scope owns the *timing*): the scope calls this\n // in its queued post-unmount frame, resolving the `returnFocus` policy against the close interaction.\n this.focusScopeConfig.returnFocus = () => this.resolveReturnFocusTarget();\n\n if (!this.isBrowser) {\n return; // SSR: no DOM marking / listeners.\n }\n\n // Marker pass (ADR 0017 §3) — applied to outside elements while the manager is active **and the\n // popup is open**, independent of `modal`. Read by ADR 0015's outside-press guard.\n effect((onCleanup) => {\n if (!this.effectiveEnabled() || !this.isFloatingOpen()) {\n return;\n }\n onCleanup(markOthers(this.avoidElements(), { ariaHidden: false, mark: true }));\n });\n\n // Pointer/AT isolation pass — apply the real `inert` attribute to outside elements only when the\n // composing primitive asks for outside interaction to be blocked. This is intentionally separate from\n // focus trapping: Base UI `modal=\"trap-focus\"` traps focus but leaves outside pointer interaction\n // enabled.\n effect((onCleanup) => {\n if (!this.effectiveEnabled() || !this.isFloatingOpen() || !this.effectiveInert()) {\n return;\n }\n onCleanup(markOthers(this.avoidElements(), { inert: true, mark: false }));\n });\n\n this.trackInteractionType();\n useFocusGuardsTabbability(() => (this.rootContext?.floatingElement ?? this.host) as HTMLElement, {\n enabled: () =>\n Boolean(this.rootContext) && this.effectiveEnabled() && this.isFloatingOpen() && !this.effectiveModal()\n });\n this.wireCloseOnFocusOut();\n this.wireRestoreFocus();\n this.wirePortalFocusBridge();\n this.wireFocusOrchestration();\n this.wireInitialFocusFallback();\n }\n\n /** Records the most recent open/close interaction (pointer type or keyboard) for the focus policies. */\n private trackInteractionType(): void {\n const ownerDocument = this.host.ownerDocument;\n const onPointer = (event: Event): void => {\n this._interactionType.set(((event as PointerEvent).pointerType || 'mouse') as RdxInteractionType);\n };\n const onKey = (): void => this._interactionType.set('keyboard');\n\n ownerDocument.addEventListener('pointerdown', onPointer, true);\n ownerDocument.addEventListener('keydown', onKey, true);\n inject(DestroyRef).onDestroy(() => {\n ownerDocument.removeEventListener('pointerdown', onPointer, true);\n ownerDocument.removeEventListener('keydown', onKey, true);\n });\n }\n\n /**\n * Initial-focus orchestration (ADR 0017 §2). The manager owns the focus *policy*; it intercepts the\n * composed {@link RdxFocusScope}'s preventable `mountAutoFocus` (its designed extension point) and\n * applies the `initialFocus` policy, falling back to the scope's first-tabbable default when the\n * policy is `null`. (`returnFocus` is orchestrated separately via the config seam — see\n * {@link resolveReturnFocusTarget} — because it must run during the scope's queued *post-unmount* frame.)\n */\n private wireFocusOrchestration(): void {\n const focusScope = inject(RdxFocusScope);\n\n focusScope.mountAutoFocus.subscribe((event) => {\n const interactionType = this.effectiveOpenInteractionType();\n const target =\n resolveInitialFocus(this.effectiveInitialFocus(), interactionType) ??\n this.defaultInitialFocus(interactionType);\n if (target === false) {\n event.preventDefault();\n return;\n }\n if (target) {\n event.preventDefault(); // override the scope's first-tabbable default\n target.focus();\n }\n });\n }\n\n /**\n * Resolves the {@link returnFocus} policy against the **close** interaction type for the composed\n * focus scope to apply at unmount (ADR 0017 §2). Mirrors Base UI's `getReturnElement`:\n * - `false` → `false` (the scope suppresses return-focus);\n * - `true` / `null` → `undefined` (the scope's default — return to the element focused before mount);\n * - an element (direct or from a callback) → that element (returned **explicitly**, bypassing the\n * \"focus moved elsewhere\" guard).\n */\n private resolveReturnFocusTarget(): HTMLElement | false | undefined {\n const resolved = resolveReturnFocus(this.effectiveReturnFocus(), this.effectiveCloseInteractionType());\n if (resolved === false) {\n return false;\n }\n if (resolved === undefined) {\n return false;\n }\n if (resolved === true || resolved == null) {\n return undefined;\n }\n return resolved;\n }\n\n /**\n * Base UI's `defaultInitialFocus`: on a **touch** open, focus the popup itself instead of its first\n * tabbable control, so a soft keyboard (Android) does not pop up over the popup. Any other interaction\n * returns `null`, keeping the focus scope's first-tabbable default. The popup is made programmatically\n * focusable (`tabindex=\"-1\"`) if it isn't already.\n */\n private defaultInitialFocus(interactionType: RdxInteractionType): HTMLElement | null {\n if (interactionType !== 'touch') {\n return null;\n }\n const popup = (this.rootContext?.floatingElement ?? this.host) as HTMLElement;\n if (!popup.hasAttribute('tabindex')) {\n popup.setAttribute('tabindex', '-1');\n }\n return popup;\n }\n\n /**\n * Manager-owned post-open fallback. Some popup types open from a trigger event that fired before the\n * manager existed, and some policies resolve their final target only after a couple of renders. Re-run\n * the initial-focus policy for a few animation frames while the popup is open so the target can settle.\n */\n private wireInitialFocusFallback(): void {\n effect(() => {\n if (!this.effectiveEnabled() || !this.isFloatingOpen()) {\n return;\n }\n\n this.scheduleInitialFocusFallback();\n });\n }\n\n private scheduleInitialFocusFallback(attempt = 0): void {\n const view = this.host.ownerDocument.defaultView ?? globalThis;\n view.requestAnimationFrame(() => this.applyInitialFocusFallback(attempt));\n }\n\n private applyInitialFocusFallback(attempt: number): void {\n if (!this.effectiveEnabled() || !this.isFloatingOpen()) {\n return;\n }\n\n const popup = (this.rootContext?.floatingElement ?? this.host) as HTMLElement;\n const activeElement = this.host.ownerDocument.activeElement;\n\n if (activeElement instanceof HTMLElement && popup.contains(activeElement)) {\n return;\n }\n\n const interactionType = this.effectiveOpenInteractionType();\n const resolved = resolveInitialFocus(this.effectiveInitialFocus(), interactionType);\n if (resolved === false) {\n return;\n }\n\n const target = resolved ?? this.defaultInitialFocus(interactionType);\n if (target && activeElement !== target) {\n target.focus({ preventScroll: true });\n }\n\n if (attempt < 2) {\n this.scheduleInitialFocusFallback(attempt + 1);\n }\n }\n\n /**\n * Close-on-focus-out (ADR 0017 §3): a **non-modal** active popup closes when focus moves to a node\n * unrelated to the floating tree — not the popup, its trigger(s), a focus guard, or an ancestor /\n * descendant popup — and not during a pointer press (a drag must not close it). Mirrors Base UI's\n * `FloatingFocusManager` `!modal` branch (`movedToUnrelatedNode`).\n */\n private wireCloseOnFocusOut(): void {\n const ownerDocument = this.host.ownerDocument;\n let pointerDown = false;\n\n const onPointerDown = (): void => {\n pointerDown = true;\n };\n const onPointerUp = (): void => {\n pointerDown = false;\n };\n const onFocusOut = (event: FocusEvent): void => {\n if (!this.effectiveEnabled() || !this.effectiveCloseOnFocusOut() || this.effectiveModal() || pointerDown) {\n return;\n }\n const relatedTarget = event.relatedTarget as Node | null;\n if (!relatedTarget) {\n return; // focus left to nothing (tab-away / window blur) — let the browser handle it\n }\n if (relatedTarget instanceof Element && relatedTarget.hasAttribute(FOCUS_GUARD_ATTR)) {\n return; // moved onto a focus guard — still inside the focus system\n }\n if (this.isRelatedTargetInside(relatedTarget)) {\n return; // moved to a related node (trigger / ancestor / descendant) — keep open\n }\n this.focusOut.emit(event);\n };\n\n ownerDocument.addEventListener('pointerdown', onPointerDown, true);\n ownerDocument.addEventListener('pointerup', onPointerUp, true);\n ownerDocument.addEventListener('focusout', onFocusOut, true);\n\n inject(DestroyRef).onDestroy(() => {\n ownerDocument.removeEventListener('pointerdown', onPointerDown, true);\n ownerDocument.removeEventListener('pointerup', onPointerUp, true);\n ownerDocument.removeEventListener('focusout', onFocusOut, true);\n });\n }\n\n /**\n * Restore focus when an inside focused element disappears and the document focus falls back to\n * `<body>`. This mirrors the practical Base UI `restoreFocus` path used by Select while keeping the\n * broader portal-guard navigation separate.\n */\n private wireRestoreFocus(): void {\n const ownerDocument = this.host.ownerDocument;\n const onFocusOut = (event: FocusEvent): void => {\n if (!this.effectiveEnabled() || !this.effectiveRestoreFocus() || !this.isFloatingOpen()) {\n return;\n }\n\n const target = event.target as Node | null;\n if (!target || !this.isRelatedTargetInside(target)) {\n return;\n }\n\n const view = ownerDocument.defaultView ?? globalThis;\n view.requestAnimationFrame(() => {\n if (!this.effectiveEnabled() || !this.effectiveRestoreFocus() || !this.isFloatingOpen()) {\n return;\n }\n if (ownerDocument.activeElement !== ownerDocument.body) {\n return;\n }\n\n const popup = this.rootContext?.floatingElement ?? this.host;\n const targetToFocus =\n this.effectiveRestoreFocus() === 'popup' ? popup : (getTabbableCandidates(popup).at(-1) ?? popup);\n focus(targetToFocus);\n });\n };\n\n ownerDocument.addEventListener('focusout', onFocusOut, true);\n inject(DestroyRef).onDestroy(() => ownerDocument.removeEventListener('focusout', onFocusOut, true));\n }\n\n /**\n * Portal focus bridge (Base UI inside guards): when focus reaches the hidden guards around portaled\n * content, redirect it either back inside the popup or to the configured neighboring tabbable node.\n */\n private wirePortalFocusBridge(): void {\n effect((onCleanup) => {\n if (!this.effectiveEnabled() || !this.isFloatingOpen()) {\n this.setBeforeContentFocusGuardRef(null);\n return;\n }\n\n const ownerDocument = this.host.ownerDocument;\n const parent = this.host.parentNode;\n if (!parent) {\n return;\n }\n\n const beforeGuard = createFocusGuard(ownerDocument);\n const afterGuard = createFocusGuard(ownerDocument);\n beforeGuard.setAttribute('data-type', 'inside');\n afterGuard.setAttribute('data-type', 'inside');\n\n parent.insertBefore(beforeGuard, this.host);\n parent.insertBefore(afterGuard, this.host.nextSibling);\n this.setBeforeContentFocusGuardRef(beforeGuard);\n\n const onBeforeFocus = (event: FocusEvent): void => {\n if (this.effectiveModal()) {\n focus(this.getTabbableContent().at(-1) ?? this.host);\n return;\n }\n\n if (this.isFromOutsideFocusGuard(event)) {\n const popup = this.rootContext?.floatingElement ?? this.host;\n enableFocusInside(popup);\n focus(this.getTabbableContent()[0] ?? this.host);\n return;\n }\n\n if (isOutsideEvent(event, this.portalFocusContainer())) {\n focus(getNextTabbable(this.rootContext?.referenceElement ?? this.host));\n return;\n }\n\n focus(resolveFocusTarget(this.effectivePreviousFocusableElement()) ?? this.defaultPreviousFocusable());\n };\n\n const onAfterFocus = (event: FocusEvent): void => {\n if (this.effectiveModal()) {\n focus(this.getTabbableContent()[0] ?? this.host);\n return;\n }\n\n if (isOutsideEvent(event, this.portalFocusContainer())) {\n focus(getPreviousTabbable(this.rootContext?.referenceElement ?? this.host));\n return;\n }\n\n focus(resolveFocusTarget(this.effectiveNextFocusableElement()) ?? this.defaultNextFocusable());\n };\n\n beforeGuard.addEventListener('focus', onBeforeFocus);\n afterGuard.addEventListener('focus', onAfterFocus);\n\n onCleanup(() => {\n beforeGuard.removeEventListener('focus', onBeforeFocus);\n afterGuard.removeEventListener('focus', onAfterFocus);\n beforeGuard.remove();\n afterGuard.remove();\n this.setBeforeContentFocusGuardRef(null);\n });\n });\n }\n\n /**\n * The marker keep-set is intentionally narrow: the popup/focus host only. Own sibling roots such as a\n * user backdrop are DOM-footprint bookkeeping, not marker keep-set members.\n */\n private avoidElements(): Element[] {\n return [\n this.host,\n ...this.insideElements(),\n resolveFocusTarget(this.effectivePreviousFocusableElement()) ?? null,\n resolveFocusTarget(this.effectiveNextFocusableElement()) ?? null\n ].filter((element): element is Element => element != null);\n }\n\n private isFloatingOpen(): boolean {\n return this.rootContext?.open() ?? true;\n }\n\n /** Whether `relatedTarget` is inside the popup, its trigger(s), or an ancestor / descendant popup. */\n private isRelatedTargetInside(relatedTarget: Node): boolean {\n const floating = this.rootContext?.floatingElement ?? this.host;\n if (composedContains(floating, relatedTarget)) {\n return true;\n }\n if (this.rootContext && this.contextContains(this.rootContext, relatedTarget)) {\n return true;\n }\n if (\n this.insideElements().some(\n (element) => element === relatedTarget || composedContains(element, relatedTarget)\n )\n ) {\n return true;\n }\n\n const node = this.currentFloatingNode();\n if (node) {\n for (const ancestor of node.tree.ancestors(node)) {\n if (ancestor.context && this.contextContains(ancestor.context, relatedTarget)) {\n return true;\n }\n }\n for (const child of node.tree.children(node, { onlyOpen: true })) {\n if (child.context && this.contextContains(child.context, relatedTarget)) {\n return true;\n }\n }\n }\n return false;\n }\n\n private contextContains(context: RdxFloatingRootContext, relatedTarget: Node): boolean {\n if (context.floatingElement && composedContains(context.floatingElement, relatedTarget)) {\n return true;\n }\n if (context.referenceElement && composedContains(context.referenceElement, relatedTarget)) {\n return true;\n }\n return context.triggers.contains(relatedTarget);\n }\n\n private currentFloatingNode() {\n const node = this.registration?.node() ?? null;\n if (node) {\n return node;\n }\n const tree = this.effectiveExternalTree();\n return tree?.all.find((candidate) => candidate.context === this.rootContext) ?? null;\n }\n\n private getTabbableContent(): HTMLElement[] {\n return getTabbableCandidates(this.rootContext?.floatingElement ?? this.host);\n }\n\n private portalFocusContainer(): Element {\n const floating = this.rootContext?.floatingElement ?? this.host;\n const parent = floating.parentElement;\n return parent && parent !== floating.ownerDocument.body ? parent : floating;\n }\n\n private defaultPreviousFocusable(): HTMLElement | null {\n return getPreviousTabbable(this.rootContext?.referenceElement ?? this.host);\n }\n\n private defaultNextFocusable(): HTMLElement | null {\n return getNextTabbable(this.rootContext?.referenceElement ?? this.host);\n }\n\n private setBeforeContentFocusGuardRef(element: HTMLSpanElement | null): void {\n const ref = this.effectiveBeforeContentFocusGuardRef();\n if (!ref) {\n return;\n }\n if (typeof ref === 'function') {\n ref(element);\n } else {\n ref.set(element);\n }\n }\n\n private isFromOutsideFocusGuard(event: FocusEvent): boolean {\n const relatedTarget = event.relatedTarget;\n return (\n relatedTarget instanceof Element &&\n relatedTarget.hasAttribute(FOCUS_GUARD_ATTR) &&\n relatedTarget.getAttribute('data-type') === 'outside'\n );\n }\n}\n","import { computed, effect, Signal, signal } from '@angular/core';\nimport {\n composedContains,\n createAriaOwnsAnchor,\n createFocusGuard,\n focus,\n FOCUS_GUARD_ATTR,\n getTabbableAfterElement,\n getTabbableBeforeElement,\n isOutsideEvent\n} from '@radix-ng/primitives/focus-scope';\nimport { getInteractionTypeFromEvent, RdxInteractionType } from './floating-focus-manager';\n\nexport interface RdxTriggerInteractionOptions {\n trigger: () => HTMLElement;\n open: () => boolean;\n activeTrigger?: () => HTMLElement | null | undefined;\n disabled?: () => boolean;\n contentId?: () => string | null | undefined;\n}\n\nexport interface RdxTriggerInteraction {\n readonly lastPointerType: Signal<string>;\n readonly isActive: Signal<boolean>;\n readonly isInactive: Signal<boolean>;\n readonly dataState: Signal<'open' | 'closed'>;\n readonly dataPopupOpen: Signal<'' | undefined>;\n readonly ariaControls: Signal<string | undefined>;\n readonly ariaExpanded: Signal<boolean>;\n readonly disabled: Signal<boolean>;\n recordPointerDown: (event: PointerEvent) => void;\n clickInteractionType: (event: MouseEvent) => RdxInteractionType;\n}\n\nexport interface RdxTriggerFocusGuardOptions {\n trigger: () => HTMLElement;\n close: (event: FocusEvent) => void;\n beforeContentFocusGuard?: () => HTMLElement | null | undefined;\n contentId?: () => string | null | undefined;\n enabled?: () => boolean;\n popupElement?: () => HTMLElement | null | undefined;\n}\n\nexport interface RdxTriggerFocusGuardAnchorOptions {\n trigger: () => HTMLElement;\n contentId: () => string | null | undefined;\n enabled?: () => boolean;\n}\n\n/**\n * Shared trigger state for floating primitives. It intentionally stays small: each primitive still owns\n * its open/close business rules, while this layer normalizes active-trigger state and the open method\n * signal that must be captured before the popup/focus manager mounts.\n */\nexport function createRdxTriggerInteraction(options: RdxTriggerInteractionOptions): RdxTriggerInteraction {\n const lastPointerType = signal('');\n const activeTrigger = options.activeTrigger ?? (() => options.trigger());\n const disabled = computed(() => options.disabled?.() ?? false);\n const isActive = computed(() => options.open() && activeTrigger() === options.trigger());\n const dataState = computed(() => (options.open() ? 'open' : 'closed'));\n const dataPopupOpen = computed(() => (isActive() ? '' : undefined));\n const ariaControls = computed(() => (isActive() ? (options.contentId?.() ?? undefined) : undefined));\n const ariaExpanded = computed(() => isActive());\n\n return {\n lastPointerType: lastPointerType.asReadonly(),\n isActive,\n isInactive: computed(() => !isActive()),\n dataState,\n dataPopupOpen,\n ariaControls,\n ariaExpanded,\n disabled,\n recordPointerDown: (event: PointerEvent): void => {\n lastPointerType.set(event.pointerType);\n },\n clickInteractionType: (event: MouseEvent): RdxInteractionType => {\n if (event.detail !== 0 && lastPointerType() === 'touch') {\n return 'touch';\n }\n return getInteractionTypeFromEvent(event);\n }\n };\n}\n\n/**\n * Adds Base UI's trigger-side focus guards for portaled content. The content guards remain owned by\n * `RdxFloatingFocusManager`; these guards bridge tab order from the trigger into the portal and close the\n * popup when focus leaves past either trigger-side boundary.\n */\nexport function useTriggerFocusGuards(options: RdxTriggerFocusGuardOptions): void {\n const enabled = options.enabled ?? (() => true);\n\n effect((onCleanup) => {\n if (!enabled()) {\n return;\n }\n\n const trigger = options.trigger();\n const preGuard = createFocusGuard(trigger.ownerDocument);\n const postGuard = createFocusGuard(trigger.ownerDocument);\n preGuard.setAttribute('data-type', 'outside');\n postGuard.setAttribute('data-type', 'outside');\n const contentId = options.contentId?.();\n const anchor = contentId ? createAriaOwnsAnchor(trigger.ownerDocument, contentId) : null;\n\n const handlePreGuardFocus = (event: FocusEvent): void => {\n const previousTabbable = getTabbableBeforeElement(preGuard);\n options.close(event);\n focus(previousTabbable);\n };\n\n const handlePostGuardFocus = (event: FocusEvent): void => {\n const popup = options.popupElement?.() ?? null;\n const beforeContentGuard = options.beforeContentFocusGuard?.() ?? null;\n\n if (popup && beforeContentGuard && isOutsideEvent(event, popup)) {\n focus(beforeContentGuard);\n return;\n }\n\n let nextTabbable = getTabbableAfterElement(postGuard);\n while (\n nextTabbable &&\n (nextTabbable.hasAttribute(FOCUS_GUARD_ATTR) || (popup && composedContains(popup, nextTabbable)))\n ) {\n const previous = nextTabbable;\n nextTabbable = getTabbableAfterElement(nextTabbable);\n if (nextTabbable === previous) {\n break;\n }\n }\n\n options.close(event);\n focus(nextTabbable);\n };\n\n preGuard.addEventListener('focus', handlePreGuardFocus);\n postGuard.addEventListener('focus', handlePostGuardFocus);\n\n trigger.insertAdjacentElement('beforebegin', preGuard);\n if (anchor) {\n trigger.insertAdjacentElement('afterend', anchor);\n anchor.insertAdjacentElement('afterend', postGuard);\n } else {\n trigger.insertAdjacentElement('afterend', postGuard);\n }\n\n onCleanup(() => {\n preGuard.removeEventListener('focus', handlePreGuardFocus);\n postGuard.removeEventListener('focus', handlePostGuardFocus);\n preGuard.remove();\n postGuard.remove();\n anchor?.remove();\n });\n });\n}\n\n/**\n * Backwards-compatible aria-owns-only bridge for modal popups that do not need trigger-side tab guards.\n */\nexport function useTriggerFocusGuardAnchor(options: RdxTriggerFocusGuardAnchorOptions): void {\n const enabled = options.enabled ?? (() => true);\n\n effect((onCleanup) => {\n const contentId = options.contentId();\n if (!enabled() || !contentId) {\n return;\n }\n\n const trigger = options.trigger();\n const anchor = createAriaOwnsAnchor(trigger.ownerDocument, contentId);\n trigger.insertAdjacentElement('afterend', anchor);\n onCleanup(() => anchor.remove());\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -262,6 +262,7 @@ function useFocusGuardsTabbability(portalNode, options = {}) {
|
|
|
262
262
|
if (!node || !enabled()) {
|
|
263
263
|
return;
|
|
264
264
|
}
|
|
265
|
+
const ownerDocument = node.ownerDocument;
|
|
265
266
|
const onFocus = (event) => {
|
|
266
267
|
// Only react to focus actually crossing the portal boundary.
|
|
267
268
|
if (!event.relatedTarget || !isOutsideEvent(event, node)) {
|
|
@@ -278,11 +279,19 @@ function useFocusGuardsTabbability(portalNode, options = {}) {
|
|
|
278
279
|
focusInsideDisabled = true;
|
|
279
280
|
}
|
|
280
281
|
};
|
|
282
|
+
if (isOutsideEvent(new FocusEvent('focusin', { relatedTarget: ownerDocument.activeElement }), node)) {
|
|
283
|
+
disableFocusInside(node);
|
|
284
|
+
focusInsideDisabled = true;
|
|
285
|
+
}
|
|
281
286
|
node.addEventListener('focusin', onFocus, true);
|
|
282
287
|
node.addEventListener('focusout', onFocus, true);
|
|
283
288
|
onCleanup(() => {
|
|
284
289
|
node.removeEventListener('focusin', onFocus, true);
|
|
285
290
|
node.removeEventListener('focusout', onFocus, true);
|
|
291
|
+
if (focusInsideDisabled) {
|
|
292
|
+
enableFocusInside(node);
|
|
293
|
+
focusInsideDisabled = false;
|
|
294
|
+
}
|
|
286
295
|
});
|
|
287
296
|
});
|
|
288
297
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"radix-ng-primitives-focus-scope.mjs","sources":["../../../packages/primitives/focus-scope/src/utils.ts","../../../packages/primitives/focus-scope/src/focus-guards.ts","../../../packages/primitives/focus-scope/src/focus-scope.config.ts","../../../packages/primitives/focus-scope/src/stack.ts","../../../packages/primitives/focus-scope/src/focus-scope.ts","../../../packages/primitives/focus-scope/radix-ng-primitives-focus-scope.ts"],"sourcesContent":["import { getActiveElement } from '@radix-ng/primitives/core';\n\nexport const AUTOFOCUS_ON_MOUNT = 'focusScope.autoFocusOnMount';\nexport const AUTOFOCUS_ON_UNMOUNT = 'focusScope.autoFocusOnUnmount';\nexport const EVENT_OPTIONS = { bubbles: false, cancelable: true };\n\ntype FocusableTarget = HTMLElement | { focus: () => void };\n\n/**\n * The real target of a (possibly retargeted) event, piercing shadow boundaries via `composedPath()`.\n * Falls back to `event.target` when `composedPath` is unavailable.\n */\nexport function getEventTarget(event: Event): EventTarget | null {\n return event.composedPath?.()[0] ?? event.target;\n}\n\n/**\n * Shadow-DOM-aware containment: whether `node` is `container` or lives inside it, crossing shadow roots\n * via their `host` (unlike `Node.contains`, which stops at a shadow boundary).\n */\nexport function composedContains(container: Node, node: Node | null): boolean {\n let current: Node | null = node;\n while (current) {\n if (current === container) {\n return true;\n }\n current = current instanceof ShadowRoot ? current.host : current.parentNode;\n }\n return false;\n}\n\n/**\n * Attempts focusing the first element in a list of candidates.\n * Stops when focus has actually moved.\n */\nexport function focusFirst(candidates: HTMLElement[], { select = false } = {}) {\n const previouslyFocusedElement = getActiveElement();\n for (const candidate of candidates) {\n focus(candidate, { select });\n if (getActiveElement() !== previouslyFocusedElement) return true;\n }\n\n return;\n}\n\n/**\n * Returns a list of potential tabbable candidates.\n *\n * NOTE: This is only a close approximation. For example it doesn't take into account cases like when\n * elements are not visible. This cannot be worked out easily by just reading a property, but rather\n * necessitate runtime knowledge (computed styles, etc). We deal with these cases separately.\n *\n * See: https://developer.mozilla.org/en-US/docs/Web/API/TreeWalker\n * Credit: https://github.com/discord/focus-layers/blob/master/src/util/wrapFocus.tsx#L1\n */\nexport function getTabbableCandidates(container: HTMLElement) {\n const nodes: HTMLElement[] = [];\n const walker = container.ownerDocument.createTreeWalker(container, NodeFilter.SHOW_ELEMENT, {\n acceptNode: (node: any) => {\n const isHiddenInput = node.tagName === 'INPUT' && node.type === 'hidden';\n if (node.disabled || node.hidden || isHiddenInput) return NodeFilter.FILTER_SKIP;\n // `.tabIndex` is not the same as the `tabindex` attribute. It works on the\n // runtime's understanding of tabbability, so this automatically accounts\n // for any kind of element that could be tabbed to.\n return node.tabIndex >= 0 ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;\n }\n });\n while (walker.nextNode()) nodes.push(walker.currentNode as HTMLElement);\n // we do not take into account the order of nodes with positive `tabIndex` as it\n // hinders accessibility to have tab order different from visual order.\n return nodes;\n}\n\nexport function isHidden(node: HTMLElement, { upTo }: { upTo?: HTMLElement }) {\n const view = node.ownerDocument.defaultView;\n if (!view) {\n return false; // no view (detached / SSR) — cannot resolve computed styles, treat as visible\n }\n if (view.getComputedStyle(node).visibility === 'hidden') return true;\n while (node) {\n // we stop at `upTo` (excluding it)\n if (upTo !== undefined && node === upTo) return false;\n if (view.getComputedStyle(node).display === 'none') return true;\n node = node.parentElement as HTMLElement;\n }\n return false;\n}\n\n/**\n * Returns the first visible element in a list.\n * NOTE: Only checks visibility up to the `container`.\n */\nexport function findVisible(elements: HTMLElement[], container: HTMLElement): HTMLElement | undefined {\n for (const element of elements) {\n // we stop checking if it's hidden at the `container` level (excluding)\n if (!isHidden(element, { upTo: container })) return element;\n }\n return undefined;\n}\n\n/**\n * Returns the first and last tabbable elements inside a container.\n */\nexport function getTabbableEdges(container: HTMLElement) {\n const candidates = getTabbableCandidates(container);\n const first = findVisible(candidates, container);\n const last = findVisible(candidates.reverse(), container);\n return [first, last] as const;\n}\n\n/** Visible tabbable elements of `root` in document order (the basis for tab-order navigation). */\nfunction visibleTabbablesIn(root: HTMLElement): HTMLElement[] {\n return getTabbableCandidates(root).filter((el) => !isHidden(el, { upTo: root }));\n}\n\n/** The tabbable one step (`dir`) from the document's active element, within `container`. */\nfunction getTabbableIn(container: HTMLElement, dir: 1 | -1): HTMLElement | undefined {\n const list = visibleTabbablesIn(container);\n if (list.length === 0) {\n return undefined;\n }\n const active = getActiveElement(container.ownerDocument) as HTMLElement | null;\n const index = active ? list.indexOf(active) : -1;\n const nextIndex = index === -1 ? (dir === 1 ? 0 : list.length - 1) : index + dir;\n return list[nextIndex];\n}\n\n/**\n * The next tabbable in the document after the current focus (Base UI `getNextTabbable`) — used by the\n * portal-focus bridge's trailing guard to step focus past the popup. Falls back to `reference`.\n */\nexport function getNextTabbable(reference: Element | null): HTMLElement | null {\n const body = (reference?.ownerDocument ?? document).body;\n return getTabbableIn(body, 1) ?? (reference as HTMLElement | null);\n}\n\n/** The previous tabbable in the document before the current focus (Base UI `getPreviousTabbable`). */\nexport function getPreviousTabbable(reference: Element | null): HTMLElement | null {\n const body = (reference?.ownerDocument ?? document).body;\n return getTabbableIn(body, -1) ?? (reference as HTMLElement | null);\n}\n\n/** The tabbable `dir` steps from `reference` in the document, wrapping around. */\nfunction getTabbableNearElement(reference: Element | null, dir: 1 | -1): HTMLElement | null {\n if (!reference) {\n return null;\n }\n const list = visibleTabbablesIn(reference.ownerDocument.body);\n const index = list.indexOf(reference as HTMLElement);\n if (list.length === 0 || index === -1) {\n return null;\n }\n return list[(index + dir + list.length) % list.length];\n}\n\n/** The tabbable immediately after `reference` in the document, wrapping (Base UI `getTabbableAfterElement`). */\nexport function getTabbableAfterElement(reference: Element | null): HTMLElement | null {\n return getTabbableNearElement(reference, 1);\n}\n\n/** The tabbable immediately before `reference` in the document, wrapping (Base UI `getTabbableBeforeElement`). */\nexport function getTabbableBeforeElement(reference: Element | null): HTMLElement | null {\n return getTabbableNearElement(reference, -1);\n}\n\nexport function isSelectableInput(element: any): element is FocusableTarget & { select: () => void } {\n return element instanceof HTMLInputElement && 'select' in element;\n}\n\nexport function focus(element?: FocusableTarget | null, { select = false } = {}) {\n // only focus if that element is focusable\n if (element && element.focus) {\n const previouslyFocusedElement = getActiveElement();\n // NOTE: we prevent scrolling on focus, to minimize jarring transitions for users\n element.focus({ preventScroll: true });\n // only select if its not the same element, it supports selection and we need to select\n if (element !== previouslyFocusedElement && isSelectableInput(element) && select) {\n element.select();\n }\n }\n}\n","import { effect } from '@angular/core';\nimport { composedContains, getTabbableCandidates } from './utils';\n\n/** Marks the leading / trailing focus-guard spans (Base UI `data-base-ui-focus-guard`). */\nexport const FOCUS_GUARD_ATTR = 'data-rdx-focus-guard';\n\n/** Saved-tabindex marker used by {@link disableFocusInside} / {@link enableFocusInside}. */\nconst SAVED_TABINDEX_ATTR = 'data-rdx-tabindex';\n\n/** Visually-hidden, off-flow style for a focus guard / `aria-owns` anchor (Base UI `visuallyHidden`). */\nexport const FOCUS_GUARD_STYLE: Partial<CSSStyleDeclaration> = {\n position: 'fixed',\n top: '0',\n left: '0',\n width: '1px',\n height: '1px',\n padding: '0',\n margin: '-1px',\n overflow: 'hidden',\n clipPath: 'inset(50%)',\n whiteSpace: 'nowrap',\n border: '0'\n};\n\n/**\n * Creates a visually-hidden, **tabbable** focus-guard `<span>` — the Angular counterpart of Base UI's\n * `FocusGuard`. The portal-focus bridge places one before and one after the portal content so a Tab into\n * (or out of) the portal lands on a guard, which then redirects focus to the right boundary.\n */\nexport function createFocusGuard(ownerDocument: Document): HTMLSpanElement {\n const guard = ownerDocument.createElement('span');\n guard.setAttribute('tabindex', '0');\n guard.setAttribute('aria-hidden', 'true');\n guard.setAttribute(FOCUS_GUARD_ATTR, '');\n Object.assign(guard.style, FOCUS_GUARD_STYLE);\n return guard;\n}\n\n/**\n * Creates a visually-hidden `<span aria-owns=\"…\">` that links the portal node into the trigger's tab /\n * AT order (Base UI's single `aria-owns` anchor). The manager places it next to the trigger.\n */\nexport function createAriaOwnsAnchor(ownerDocument: Document, portalId: string): HTMLSpanElement {\n const anchor = ownerDocument.createElement('span');\n anchor.setAttribute('aria-owns', portalId);\n Object.assign(anchor.style, FOCUS_GUARD_STYLE);\n return anchor;\n}\n\n/**\n * Makes every tabbable descendant of `container` **non-tabbable** (`tabindex=\"-1\"`), saving each one's\n * original tabindex so {@link enableFocusInside} can restore it. Base UI `disableFocusInside`: a\n * non-modal portal keeps its content untabbable until focus is actually inside it, so a Tab from the\n * trigger steps onto the guard instead of jumping into the content.\n */\nexport function disableFocusInside(container: HTMLElement): void {\n for (const element of getTabbableCandidates(container)) {\n element.setAttribute(SAVED_TABINDEX_ATTR, element.getAttribute('tabindex') ?? '');\n element.setAttribute('tabindex', '-1');\n }\n}\n\n/** Restores the tabbability that {@link disableFocusInside} suspended. Base UI `enableFocusInside`. */\nexport function enableFocusInside(container: HTMLElement): void {\n container.querySelectorAll<HTMLElement>(`[${SAVED_TABINDEX_ATTR}]`).forEach((element) => {\n const original = element.getAttribute(SAVED_TABINDEX_ATTR);\n element.removeAttribute(SAVED_TABINDEX_ATTR);\n if (original) {\n element.setAttribute('tabindex', original);\n } else {\n element.removeAttribute('tabindex');\n }\n });\n}\n\n/**\n * Whether a focus event crossed the `container` boundary — its `relatedTarget` (the other side of the\n * focus move) is `null` or outside `container` (Base UI `isOutsideEvent`). Shadow-DOM-aware via\n * {@link composedContains}.\n */\nexport function isOutsideEvent(event: FocusEvent, container: Element): boolean {\n const relatedTarget = event.relatedTarget as Node | null;\n return !relatedTarget || !composedContains(container, relatedTarget);\n}\n\n/**\n * The portal-focus bridge's **tabbability toggle** (Base UI `FloatingPortal` capture-phase `onFocus`).\n * While `portalNode` is mounted (and `enabled`), it makes the portal content tabbable **only when focus\n * is inside it**: focus entering from outside re-enables tabbability, focus leaving to outside disables\n * it again. Listens on the **capture** phase so it settles before the focus manager's guards react.\n *\n * Must be called in an injection context. The initial disable-on-mount and the guard-span placement are\n * the manager's responsibility (Phase 1b); this owns only the dynamic in/out toggle.\n */\nexport function useFocusGuardsTabbability(\n portalNode: () => HTMLElement | null,\n options: { enabled?: () => boolean } = {}\n): void {\n const enabled = options.enabled ?? (() => true);\n let focusInsideDisabled = false;\n\n effect((onCleanup) => {\n const node = portalNode();\n if (!node || !enabled()) {\n return;\n }\n\n const onFocus = (event: FocusEvent): void => {\n // Only react to focus actually crossing the portal boundary.\n if (!event.relatedTarget || !isOutsideEvent(event, node)) {\n return;\n }\n if (event.type === 'focusin') {\n if (focusInsideDisabled) {\n enableFocusInside(node);\n focusInsideDisabled = false;\n }\n } else {\n disableFocusInside(node);\n focusInsideDisabled = true;\n }\n };\n\n node.addEventListener('focusin', onFocus, true);\n node.addEventListener('focusout', onFocus, true);\n onCleanup(() => {\n node.removeEventListener('focusin', onFocus, true);\n node.removeEventListener('focusout', onFocus, true);\n });\n });\n}\n","import { InjectionToken, Provider, Signal, signal } from '@angular/core';\n\nexport type RdxFocusScopeConfig = {\n trapped: Signal<boolean>;\n\n /**\n * Optional return-focus policy override (ADR 0017 `returnFocus`), resolved by an enclosing\n * {@link RdxFloatingFocusManager} at **unmount time**. The focus scope owns the *timing* (its queued\n * post-unmount focus); this lets the manager own the *target*:\n * - `false` → do **not** return focus;\n * - an `HTMLElement` → return focus there **explicitly** (bypasses the moved-focus guard, matching\n * Base UI's `hasExplicitReturnFocus`);\n * - `undefined` → default behavior (return to the element focused before mount, with the guard).\n */\n returnFocus?: () => HTMLElement | false | undefined;\n};\n\nexport const RdxFocusScopeConfigToken = new InjectionToken<RdxFocusScopeConfig>('RdxFocusScopeConfig', {\n factory: () => ({\n trapped: signal(false)\n })\n});\n\nexport function provideRdxFocusScopeConfig(factory: () => RdxFocusScopeConfig): Provider {\n return { provide: RdxFocusScopeConfigToken, useFactory: factory };\n}\n","import { signal, WritableSignal } from '@angular/core';\n\nexport interface FocusScopeAPI {\n paused: WritableSignal<boolean>;\n pause(): void;\n resume(): void;\n}\n\n/**\n * The active-scope stack pauses/resumes scopes, so it **is** cross-document coordination state — keyed\n * per owner `Document` (a `WeakMap`) rather than process-global (ADR 0017 Phase 1a): opening a scope in\n * document B must not pause document A's scope.\n */\nconst stacksByDocument = new WeakMap<Document, WritableSignal<FocusScopeAPI[]>>();\n\nfunction getFocusStackState(document: Document): WritableSignal<FocusScopeAPI[]> {\n let state = stacksByDocument.get(document);\n if (!state) {\n state = signal<FocusScopeAPI[]>([]);\n stacksByDocument.set(document, state);\n }\n return state;\n}\n\nexport function createFocusScopesStack(document: Document) {\n /** A stack of focus scopes for this document, with the active one at the top */\n const stack = getFocusStackState(document);\n\n return {\n add(focusScope: FocusScopeAPI) {\n const current = stack();\n const active = current[0];\n if (focusScope !== active) {\n active?.pause();\n }\n const updated = arrayRemove(current, focusScope);\n updated.unshift(focusScope);\n stack.set(updated);\n },\n\n remove(focusScope: FocusScopeAPI) {\n const current = stack();\n const updated = arrayRemove(current, focusScope);\n stack.set(updated);\n // после удаления «возобновляем» новый верхний\n stack()[0]?.resume();\n }\n };\n}\n\nexport function arrayRemove<T>(array: T[], item: T): T[] {\n const copy = [...array];\n const idx = copy.indexOf(item);\n if (idx !== -1) {\n copy.splice(idx, 1);\n }\n return copy;\n}\n\nexport function removeLinks(items: HTMLElement[]): HTMLElement[] {\n return items.filter((el) => el.tagName !== 'A');\n}\n","import {\n afterNextRender,\n booleanAttribute,\n computed,\n DestroyRef,\n Directive,\n effect,\n ElementRef,\n inject,\n Injector,\n input,\n output,\n Signal,\n signal\n} from '@angular/core';\nimport { BooleanInput, createContext, getActiveElement } from '@radix-ng/primitives/core';\nimport { RdxFocusScopeConfigToken } from './focus-scope.config';\nimport { createFocusScopesStack, FocusScopeAPI, removeLinks } from './stack';\nimport {\n AUTOFOCUS_ON_MOUNT,\n AUTOFOCUS_ON_UNMOUNT,\n composedContains,\n EVENT_OPTIONS,\n focus,\n focusFirst,\n getEventTarget,\n getTabbableCandidates,\n getTabbableEdges\n} from './utils';\n\nexport interface FocusScopeContext {\n loop?: Signal<boolean>;\n\n trapped?: Signal<boolean>;\n}\n\nexport const [injectFocusScopeContext, provideFocusScopeContext] = createContext<FocusScopeContext>(\n 'FocusScope Context',\n 'utils/focus-scope'\n);\n\nconst rootContext = (): FocusScopeContext => {\n const context = inject(RdxFocusScope);\n\n return {\n loop: context.loop,\n trapped: context.isTrapped\n };\n};\n\n/**\n * @group Components\n */\n@Directive({\n selector: '[rdxFocusScope]',\n providers: [provideFocusScopeContext(rootContext)],\n host: {\n tabindex: '-1',\n '(keydown)': 'handleKeyDown($event)'\n }\n})\nexport class RdxFocusScope {\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly config = inject(RdxFocusScopeConfigToken);\n\n /** The host's owner `Document` — all focus listeners / reads are scoped here, never global `document`. */\n private readonly ownerDocument = this.elementRef.nativeElement.ownerDocument ?? document;\n\n /**\n * When `true`, tabbing from last item will focus first tabbable\n * and shift+tab from first item will focus last tababble.\n *\n * @group Props\n * @defaultValue false\n */\n readonly loop = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n /**\n * When `true`, focus cannot escape the focus scope via keyboard,\n * pointer, or a programmatic focus.\n *\n * @group Props\n * @defaultValue false\n */\n readonly trapped = input<boolean | undefined, BooleanInput | undefined>(undefined, {\n transform: (value) => (value === undefined ? undefined : booleanAttribute(value))\n });\n\n readonly isTrapped = computed(() => this.trapped() ?? this.config.trapped());\n\n /**\n * Event handler called when auto-focusing on mount.\n * Can be prevented.\n *\n * @group Emits\n */\n readonly mountAutoFocus = output<Event>();\n\n /**\n * Event handler called when auto-focusing on unmount.\n * Can be prevented.\n *\n * @group Emits\n */\n readonly unmountAutoFocus = output<Event>();\n\n readonly lastFocusedElement = signal<HTMLElement | null>(null);\n\n private readonly focusScopesStack = createFocusScopesStack(this.ownerDocument);\n\n readonly focusScope: FocusScopeAPI = {\n paused: signal(false),\n pause: () => this.focusScope.paused.set(true),\n resume: () => this.focusScope.paused.set(false)\n };\n\n private alive = true;\n\n constructor() {\n this.destroyRef.onDestroy(() => {\n this.alive = false;\n });\n\n afterNextRender(() => {\n effect(\n (onCleanup) => {\n const container = this.elementRef.nativeElement;\n\n if (this.isTrapped()) {\n const handleFocusIn = (event: FocusEvent) => {\n if (this.focusScope.paused() || !container) {\n return;\n }\n\n const target = getEventTarget(event) as HTMLElement | null;\n if (composedContains(container, target)) {\n this.lastFocusedElement.set(target);\n } else {\n focus(this.lastFocusedElement(), { select: true });\n }\n };\n\n const handleFocusOut = (event: FocusEvent) => {\n if (this.focusScope.paused() || !container) {\n return;\n }\n const relatedTarget = event.relatedTarget as HTMLElement | null;\n\n // A `focusout` event with a `null` `relatedTarget` will happen in at least two cases:\n //\n // 1. When the user switches app/tabs/windows/the browser itself loses focus.\n // 2. In Google Chrome, when the focused element is removed from the DOM.\n //\n // We let the browser do its thing here because:\n //\n // 1. The browser already keeps a memory of what's focused for when the page gets refocused.\n // 2. In Google Chrome, if we try to focus the deleted focused element (as per below), it\n // throws the CPU to 100%, so we avoid doing anything for this reason here too.\n if (relatedTarget === null) return;\n\n // If the focus has moved to an actual legitimate element (`relatedTarget !== null`)\n // that is outside the container, we move focus to the last valid focused element inside.\n if (!composedContains(container, relatedTarget)) {\n focus(this.lastFocusedElement(), { select: true });\n }\n };\n\n const handleMutations = () => {\n const isLastFocusedElementExist = composedContains(container, this.lastFocusedElement());\n\n if (!isLastFocusedElementExist) {\n focus(container);\n }\n };\n\n const mutationObserver = new MutationObserver(handleMutations);\n if (container) {\n mutationObserver.observe(container, { childList: true, subtree: true });\n }\n\n this.ownerDocument.addEventListener('focusin', handleFocusIn);\n this.ownerDocument.addEventListener('focusout', handleFocusOut);\n\n onCleanup(() => {\n this.ownerDocument.removeEventListener('focusin', handleFocusIn);\n this.ownerDocument.removeEventListener('focusout', handleFocusOut);\n mutationObserver.disconnect();\n });\n }\n },\n { injector: this.injector }\n );\n\n effect(\n async (onCleanup) => {\n const container = this.elementRef.nativeElement;\n\n await Promise.resolve();\n if (!container || !this.alive) {\n return;\n }\n\n this.focusScopesStack.add(this.focusScope);\n\n const previouslyFocusedElement = getActiveElement(this.ownerDocument) as HTMLElement | null;\n const hasFocusedCandidate = composedContains(container, previouslyFocusedElement);\n const mountEventHandler = (ev: Event) => {\n if (this.alive) this.mountAutoFocus.emit(ev);\n };\n\n if (!hasFocusedCandidate) {\n const mountEvent = new CustomEvent(AUTOFOCUS_ON_MOUNT, EVENT_OPTIONS);\n container.addEventListener(AUTOFOCUS_ON_MOUNT, mountEventHandler);\n container.dispatchEvent(mountEvent);\n\n if (!mountEvent.defaultPrevented) {\n focusFirst(removeLinks(getTabbableCandidates(container)), {\n select: true\n });\n if (getActiveElement(this.ownerDocument) === previouslyFocusedElement) focus(container);\n }\n }\n\n const unmountEventHandler = (ev: Event) => {\n if (this.alive) this.unmountAutoFocus.emit(ev);\n };\n container.addEventListener(AUTOFOCUS_ON_UNMOUNT, unmountEventHandler);\n\n onCleanup(() => {\n container.removeEventListener(AUTOFOCUS_ON_MOUNT, mountEventHandler);\n\n const unmountEvent = new CustomEvent(AUTOFOCUS_ON_UNMOUNT, EVENT_OPTIONS);\n container.dispatchEvent(unmountEvent);\n\n // Queue the return-focus on the owner window's animation frame (not `setTimeout`),\n // so it runs after the unmounting paint settles (ADR 0017 Phase 1a queued focus).\n const view = this.ownerDocument.defaultView ?? globalThis;\n view.requestAnimationFrame(() => {\n // An enclosing focus manager can override the return target (ADR 0017\n // `returnFocus`): `false` suppresses it, an element returns there explicitly\n // (bypassing the moved-focus guard), `undefined` keeps the default behavior.\n const override = this.config.returnFocus?.();\n if (override !== false && !unmountEvent.defaultPrevented) {\n if (override) {\n focus(override, { select: true });\n } else if (!this.shouldPreserveMovedFocus()) {\n focus(previouslyFocusedElement ?? this.ownerDocument.body, { select: true });\n }\n }\n\n // we need to remove the listener after we `dispatchEvent`\n container.removeEventListener(AUTOFOCUS_ON_UNMOUNT, unmountEventHandler);\n\n this.focusScopesStack.remove(this.focusScope);\n });\n });\n },\n { injector: this.injector }\n );\n });\n }\n\n /**\n * Whether the interaction that unmounted this scope already moved focus to a legitimate element\n * **outside** it — e.g. an outside press onto an interactive control in a non-modal layer (ADR 0017\n * §2, finding #3). Returning focus to the previously-focused element would then *steal* it back from\n * what the user just acted on. Focus that fell to `<body>` / `null` (a backdrop press, Escape, or the\n * focused element being removed) is **not** \"moved\" — return focus normally so keyboard users land\n * back on the trigger. The page never scroll-jumps either way: {@link focus} uses `preventScroll`.\n */\n private shouldPreserveMovedFocus(): boolean {\n const active = getActiveElement(this.ownerDocument) as HTMLElement | null;\n return (\n !!active && active !== this.ownerDocument.body && !composedContains(this.elementRef.nativeElement, active)\n );\n }\n\n handleKeyDown(event: KeyboardEvent) {\n const isTabKey = event.key === 'Tab' && !event.altKey && !event.ctrlKey && !event.metaKey;\n\n const focusedElement = getActiveElement(this.ownerDocument) as HTMLElement | null;\n\n if (isTabKey && focusedElement) {\n const container = event.currentTarget as HTMLElement;\n\n const [first, last] = getTabbableEdges(container);\n const hasTabbableElementsInside = first && last;\n\n // we can only wrap focus if we have tabbable edges\n if (!hasTabbableElementsInside) {\n if (focusedElement === container) event.preventDefault();\n } else {\n if (!event.shiftKey && focusedElement === last) {\n event.preventDefault();\n if (this.loop()) {\n focus(first, { select: true });\n }\n } else if (event.shiftKey && focusedElement === first) {\n event.preventDefault();\n if (this.loop()) {\n focus(last, { select: true });\n }\n }\n }\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"radix-ng-primitives-focus-scope.mjs","sources":["../../../packages/primitives/focus-scope/src/utils.ts","../../../packages/primitives/focus-scope/src/focus-guards.ts","../../../packages/primitives/focus-scope/src/focus-scope.config.ts","../../../packages/primitives/focus-scope/src/stack.ts","../../../packages/primitives/focus-scope/src/focus-scope.ts","../../../packages/primitives/focus-scope/radix-ng-primitives-focus-scope.ts"],"sourcesContent":["import { getActiveElement } from '@radix-ng/primitives/core';\n\nexport const AUTOFOCUS_ON_MOUNT = 'focusScope.autoFocusOnMount';\nexport const AUTOFOCUS_ON_UNMOUNT = 'focusScope.autoFocusOnUnmount';\nexport const EVENT_OPTIONS = { bubbles: false, cancelable: true };\n\ntype FocusableTarget = HTMLElement | { focus: () => void };\n\n/**\n * The real target of a (possibly retargeted) event, piercing shadow boundaries via `composedPath()`.\n * Falls back to `event.target` when `composedPath` is unavailable.\n */\nexport function getEventTarget(event: Event): EventTarget | null {\n return event.composedPath?.()[0] ?? event.target;\n}\n\n/**\n * Shadow-DOM-aware containment: whether `node` is `container` or lives inside it, crossing shadow roots\n * via their `host` (unlike `Node.contains`, which stops at a shadow boundary).\n */\nexport function composedContains(container: Node, node: Node | null): boolean {\n let current: Node | null = node;\n while (current) {\n if (current === container) {\n return true;\n }\n current = current instanceof ShadowRoot ? current.host : current.parentNode;\n }\n return false;\n}\n\n/**\n * Attempts focusing the first element in a list of candidates.\n * Stops when focus has actually moved.\n */\nexport function focusFirst(candidates: HTMLElement[], { select = false } = {}) {\n const previouslyFocusedElement = getActiveElement();\n for (const candidate of candidates) {\n focus(candidate, { select });\n if (getActiveElement() !== previouslyFocusedElement) return true;\n }\n\n return;\n}\n\n/**\n * Returns a list of potential tabbable candidates.\n *\n * NOTE: This is only a close approximation. For example it doesn't take into account cases like when\n * elements are not visible. This cannot be worked out easily by just reading a property, but rather\n * necessitate runtime knowledge (computed styles, etc). We deal with these cases separately.\n *\n * See: https://developer.mozilla.org/en-US/docs/Web/API/TreeWalker\n * Credit: https://github.com/discord/focus-layers/blob/master/src/util/wrapFocus.tsx#L1\n */\nexport function getTabbableCandidates(container: HTMLElement) {\n const nodes: HTMLElement[] = [];\n const walker = container.ownerDocument.createTreeWalker(container, NodeFilter.SHOW_ELEMENT, {\n acceptNode: (node: any) => {\n const isHiddenInput = node.tagName === 'INPUT' && node.type === 'hidden';\n if (node.disabled || node.hidden || isHiddenInput) return NodeFilter.FILTER_SKIP;\n // `.tabIndex` is not the same as the `tabindex` attribute. It works on the\n // runtime's understanding of tabbability, so this automatically accounts\n // for any kind of element that could be tabbed to.\n return node.tabIndex >= 0 ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;\n }\n });\n while (walker.nextNode()) nodes.push(walker.currentNode as HTMLElement);\n // we do not take into account the order of nodes with positive `tabIndex` as it\n // hinders accessibility to have tab order different from visual order.\n return nodes;\n}\n\nexport function isHidden(node: HTMLElement, { upTo }: { upTo?: HTMLElement }) {\n const view = node.ownerDocument.defaultView;\n if (!view) {\n return false; // no view (detached / SSR) — cannot resolve computed styles, treat as visible\n }\n if (view.getComputedStyle(node).visibility === 'hidden') return true;\n while (node) {\n // we stop at `upTo` (excluding it)\n if (upTo !== undefined && node === upTo) return false;\n if (view.getComputedStyle(node).display === 'none') return true;\n node = node.parentElement as HTMLElement;\n }\n return false;\n}\n\n/**\n * Returns the first visible element in a list.\n * NOTE: Only checks visibility up to the `container`.\n */\nexport function findVisible(elements: HTMLElement[], container: HTMLElement): HTMLElement | undefined {\n for (const element of elements) {\n // we stop checking if it's hidden at the `container` level (excluding)\n if (!isHidden(element, { upTo: container })) return element;\n }\n return undefined;\n}\n\n/**\n * Returns the first and last tabbable elements inside a container.\n */\nexport function getTabbableEdges(container: HTMLElement) {\n const candidates = getTabbableCandidates(container);\n const first = findVisible(candidates, container);\n const last = findVisible(candidates.reverse(), container);\n return [first, last] as const;\n}\n\n/** Visible tabbable elements of `root` in document order (the basis for tab-order navigation). */\nfunction visibleTabbablesIn(root: HTMLElement): HTMLElement[] {\n return getTabbableCandidates(root).filter((el) => !isHidden(el, { upTo: root }));\n}\n\n/** The tabbable one step (`dir`) from the document's active element, within `container`. */\nfunction getTabbableIn(container: HTMLElement, dir: 1 | -1): HTMLElement | undefined {\n const list = visibleTabbablesIn(container);\n if (list.length === 0) {\n return undefined;\n }\n const active = getActiveElement(container.ownerDocument) as HTMLElement | null;\n const index = active ? list.indexOf(active) : -1;\n const nextIndex = index === -1 ? (dir === 1 ? 0 : list.length - 1) : index + dir;\n return list[nextIndex];\n}\n\n/**\n * The next tabbable in the document after the current focus (Base UI `getNextTabbable`) — used by the\n * portal-focus bridge's trailing guard to step focus past the popup. Falls back to `reference`.\n */\nexport function getNextTabbable(reference: Element | null): HTMLElement | null {\n const body = (reference?.ownerDocument ?? document).body;\n return getTabbableIn(body, 1) ?? (reference as HTMLElement | null);\n}\n\n/** The previous tabbable in the document before the current focus (Base UI `getPreviousTabbable`). */\nexport function getPreviousTabbable(reference: Element | null): HTMLElement | null {\n const body = (reference?.ownerDocument ?? document).body;\n return getTabbableIn(body, -1) ?? (reference as HTMLElement | null);\n}\n\n/** The tabbable `dir` steps from `reference` in the document, wrapping around. */\nfunction getTabbableNearElement(reference: Element | null, dir: 1 | -1): HTMLElement | null {\n if (!reference) {\n return null;\n }\n const list = visibleTabbablesIn(reference.ownerDocument.body);\n const index = list.indexOf(reference as HTMLElement);\n if (list.length === 0 || index === -1) {\n return null;\n }\n return list[(index + dir + list.length) % list.length];\n}\n\n/** The tabbable immediately after `reference` in the document, wrapping (Base UI `getTabbableAfterElement`). */\nexport function getTabbableAfterElement(reference: Element | null): HTMLElement | null {\n return getTabbableNearElement(reference, 1);\n}\n\n/** The tabbable immediately before `reference` in the document, wrapping (Base UI `getTabbableBeforeElement`). */\nexport function getTabbableBeforeElement(reference: Element | null): HTMLElement | null {\n return getTabbableNearElement(reference, -1);\n}\n\nexport function isSelectableInput(element: any): element is FocusableTarget & { select: () => void } {\n return element instanceof HTMLInputElement && 'select' in element;\n}\n\nexport function focus(element?: FocusableTarget | null, { select = false } = {}) {\n // only focus if that element is focusable\n if (element && element.focus) {\n const previouslyFocusedElement = getActiveElement();\n // NOTE: we prevent scrolling on focus, to minimize jarring transitions for users\n element.focus({ preventScroll: true });\n // only select if its not the same element, it supports selection and we need to select\n if (element !== previouslyFocusedElement && isSelectableInput(element) && select) {\n element.select();\n }\n }\n}\n","import { effect } from '@angular/core';\nimport { composedContains, getTabbableCandidates } from './utils';\n\n/** Marks the leading / trailing focus-guard spans (Base UI `data-base-ui-focus-guard`). */\nexport const FOCUS_GUARD_ATTR = 'data-rdx-focus-guard';\n\n/** Saved-tabindex marker used by {@link disableFocusInside} / {@link enableFocusInside}. */\nconst SAVED_TABINDEX_ATTR = 'data-rdx-tabindex';\n\n/** Visually-hidden, off-flow style for a focus guard / `aria-owns` anchor (Base UI `visuallyHidden`). */\nexport const FOCUS_GUARD_STYLE: Partial<CSSStyleDeclaration> = {\n position: 'fixed',\n top: '0',\n left: '0',\n width: '1px',\n height: '1px',\n padding: '0',\n margin: '-1px',\n overflow: 'hidden',\n clipPath: 'inset(50%)',\n whiteSpace: 'nowrap',\n border: '0'\n};\n\n/**\n * Creates a visually-hidden, **tabbable** focus-guard `<span>` — the Angular counterpart of Base UI's\n * `FocusGuard`. The portal-focus bridge places one before and one after the portal content so a Tab into\n * (or out of) the portal lands on a guard, which then redirects focus to the right boundary.\n */\nexport function createFocusGuard(ownerDocument: Document): HTMLSpanElement {\n const guard = ownerDocument.createElement('span');\n guard.setAttribute('tabindex', '0');\n guard.setAttribute('aria-hidden', 'true');\n guard.setAttribute(FOCUS_GUARD_ATTR, '');\n Object.assign(guard.style, FOCUS_GUARD_STYLE);\n return guard;\n}\n\n/**\n * Creates a visually-hidden `<span aria-owns=\"…\">` that links the portal node into the trigger's tab /\n * AT order (Base UI's single `aria-owns` anchor). The manager places it next to the trigger.\n */\nexport function createAriaOwnsAnchor(ownerDocument: Document, portalId: string): HTMLSpanElement {\n const anchor = ownerDocument.createElement('span');\n anchor.setAttribute('aria-owns', portalId);\n Object.assign(anchor.style, FOCUS_GUARD_STYLE);\n return anchor;\n}\n\n/**\n * Makes every tabbable descendant of `container` **non-tabbable** (`tabindex=\"-1\"`), saving each one's\n * original tabindex so {@link enableFocusInside} can restore it. Base UI `disableFocusInside`: a\n * non-modal portal keeps its content untabbable until focus is actually inside it, so a Tab from the\n * trigger steps onto the guard instead of jumping into the content.\n */\nexport function disableFocusInside(container: HTMLElement): void {\n for (const element of getTabbableCandidates(container)) {\n element.setAttribute(SAVED_TABINDEX_ATTR, element.getAttribute('tabindex') ?? '');\n element.setAttribute('tabindex', '-1');\n }\n}\n\n/** Restores the tabbability that {@link disableFocusInside} suspended. Base UI `enableFocusInside`. */\nexport function enableFocusInside(container: HTMLElement): void {\n container.querySelectorAll<HTMLElement>(`[${SAVED_TABINDEX_ATTR}]`).forEach((element) => {\n const original = element.getAttribute(SAVED_TABINDEX_ATTR);\n element.removeAttribute(SAVED_TABINDEX_ATTR);\n if (original) {\n element.setAttribute('tabindex', original);\n } else {\n element.removeAttribute('tabindex');\n }\n });\n}\n\n/**\n * Whether a focus event crossed the `container` boundary — its `relatedTarget` (the other side of the\n * focus move) is `null` or outside `container` (Base UI `isOutsideEvent`). Shadow-DOM-aware via\n * {@link composedContains}.\n */\nexport function isOutsideEvent(event: FocusEvent, container: Element): boolean {\n const relatedTarget = event.relatedTarget as Node | null;\n return !relatedTarget || !composedContains(container, relatedTarget);\n}\n\n/**\n * The portal-focus bridge's **tabbability toggle** (Base UI `FloatingPortal` capture-phase `onFocus`).\n * While `portalNode` is mounted (and `enabled`), it makes the portal content tabbable **only when focus\n * is inside it**: focus entering from outside re-enables tabbability, focus leaving to outside disables\n * it again. Listens on the **capture** phase so it settles before the focus manager's guards react.\n *\n * Must be called in an injection context. The initial disable-on-mount and the guard-span placement are\n * the manager's responsibility (Phase 1b); this owns only the dynamic in/out toggle.\n */\nexport function useFocusGuardsTabbability(\n portalNode: () => HTMLElement | null,\n options: { enabled?: () => boolean } = {}\n): void {\n const enabled = options.enabled ?? (() => true);\n let focusInsideDisabled = false;\n\n effect((onCleanup) => {\n const node = portalNode();\n if (!node || !enabled()) {\n return;\n }\n const ownerDocument = node.ownerDocument;\n\n const onFocus = (event: FocusEvent): void => {\n // Only react to focus actually crossing the portal boundary.\n if (!event.relatedTarget || !isOutsideEvent(event, node)) {\n return;\n }\n if (event.type === 'focusin') {\n if (focusInsideDisabled) {\n enableFocusInside(node);\n focusInsideDisabled = false;\n }\n } else {\n disableFocusInside(node);\n focusInsideDisabled = true;\n }\n };\n\n if (isOutsideEvent(new FocusEvent('focusin', { relatedTarget: ownerDocument.activeElement }), node)) {\n disableFocusInside(node);\n focusInsideDisabled = true;\n }\n\n node.addEventListener('focusin', onFocus, true);\n node.addEventListener('focusout', onFocus, true);\n onCleanup(() => {\n node.removeEventListener('focusin', onFocus, true);\n node.removeEventListener('focusout', onFocus, true);\n if (focusInsideDisabled) {\n enableFocusInside(node);\n focusInsideDisabled = false;\n }\n });\n });\n}\n","import { InjectionToken, Provider, Signal, signal } from '@angular/core';\n\nexport type RdxFocusScopeConfig = {\n trapped: Signal<boolean>;\n\n /**\n * Optional return-focus policy override (ADR 0017 `returnFocus`), resolved by an enclosing\n * {@link RdxFloatingFocusManager} at **unmount time**. The focus scope owns the *timing* (its queued\n * post-unmount focus); this lets the manager own the *target*:\n * - `false` → do **not** return focus;\n * - an `HTMLElement` → return focus there **explicitly** (bypasses the moved-focus guard, matching\n * Base UI's `hasExplicitReturnFocus`);\n * - `undefined` → default behavior (return to the element focused before mount, with the guard).\n */\n returnFocus?: () => HTMLElement | false | undefined;\n};\n\nexport const RdxFocusScopeConfigToken = new InjectionToken<RdxFocusScopeConfig>('RdxFocusScopeConfig', {\n factory: () => ({\n trapped: signal(false)\n })\n});\n\nexport function provideRdxFocusScopeConfig(factory: () => RdxFocusScopeConfig): Provider {\n return { provide: RdxFocusScopeConfigToken, useFactory: factory };\n}\n","import { signal, WritableSignal } from '@angular/core';\n\nexport interface FocusScopeAPI {\n paused: WritableSignal<boolean>;\n pause(): void;\n resume(): void;\n}\n\n/**\n * The active-scope stack pauses/resumes scopes, so it **is** cross-document coordination state — keyed\n * per owner `Document` (a `WeakMap`) rather than process-global (ADR 0017 Phase 1a): opening a scope in\n * document B must not pause document A's scope.\n */\nconst stacksByDocument = new WeakMap<Document, WritableSignal<FocusScopeAPI[]>>();\n\nfunction getFocusStackState(document: Document): WritableSignal<FocusScopeAPI[]> {\n let state = stacksByDocument.get(document);\n if (!state) {\n state = signal<FocusScopeAPI[]>([]);\n stacksByDocument.set(document, state);\n }\n return state;\n}\n\nexport function createFocusScopesStack(document: Document) {\n /** A stack of focus scopes for this document, with the active one at the top */\n const stack = getFocusStackState(document);\n\n return {\n add(focusScope: FocusScopeAPI) {\n const current = stack();\n const active = current[0];\n if (focusScope !== active) {\n active?.pause();\n }\n const updated = arrayRemove(current, focusScope);\n updated.unshift(focusScope);\n stack.set(updated);\n },\n\n remove(focusScope: FocusScopeAPI) {\n const current = stack();\n const updated = arrayRemove(current, focusScope);\n stack.set(updated);\n // после удаления «возобновляем» новый верхний\n stack()[0]?.resume();\n }\n };\n}\n\nexport function arrayRemove<T>(array: T[], item: T): T[] {\n const copy = [...array];\n const idx = copy.indexOf(item);\n if (idx !== -1) {\n copy.splice(idx, 1);\n }\n return copy;\n}\n\nexport function removeLinks(items: HTMLElement[]): HTMLElement[] {\n return items.filter((el) => el.tagName !== 'A');\n}\n","import {\n afterNextRender,\n booleanAttribute,\n computed,\n DestroyRef,\n Directive,\n effect,\n ElementRef,\n inject,\n Injector,\n input,\n output,\n Signal,\n signal\n} from '@angular/core';\nimport { BooleanInput, createContext, getActiveElement } from '@radix-ng/primitives/core';\nimport { RdxFocusScopeConfigToken } from './focus-scope.config';\nimport { createFocusScopesStack, FocusScopeAPI, removeLinks } from './stack';\nimport {\n AUTOFOCUS_ON_MOUNT,\n AUTOFOCUS_ON_UNMOUNT,\n composedContains,\n EVENT_OPTIONS,\n focus,\n focusFirst,\n getEventTarget,\n getTabbableCandidates,\n getTabbableEdges\n} from './utils';\n\nexport interface FocusScopeContext {\n loop?: Signal<boolean>;\n\n trapped?: Signal<boolean>;\n}\n\nexport const [injectFocusScopeContext, provideFocusScopeContext] = createContext<FocusScopeContext>(\n 'FocusScope Context',\n 'utils/focus-scope'\n);\n\nconst rootContext = (): FocusScopeContext => {\n const context = inject(RdxFocusScope);\n\n return {\n loop: context.loop,\n trapped: context.isTrapped\n };\n};\n\n/**\n * @group Components\n */\n@Directive({\n selector: '[rdxFocusScope]',\n providers: [provideFocusScopeContext(rootContext)],\n host: {\n tabindex: '-1',\n '(keydown)': 'handleKeyDown($event)'\n }\n})\nexport class RdxFocusScope {\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly config = inject(RdxFocusScopeConfigToken);\n\n /** The host's owner `Document` — all focus listeners / reads are scoped here, never global `document`. */\n private readonly ownerDocument = this.elementRef.nativeElement.ownerDocument ?? document;\n\n /**\n * When `true`, tabbing from last item will focus first tabbable\n * and shift+tab from first item will focus last tababble.\n *\n * @group Props\n * @defaultValue false\n */\n readonly loop = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n /**\n * When `true`, focus cannot escape the focus scope via keyboard,\n * pointer, or a programmatic focus.\n *\n * @group Props\n * @defaultValue false\n */\n readonly trapped = input<boolean | undefined, BooleanInput | undefined>(undefined, {\n transform: (value) => (value === undefined ? undefined : booleanAttribute(value))\n });\n\n readonly isTrapped = computed(() => this.trapped() ?? this.config.trapped());\n\n /**\n * Event handler called when auto-focusing on mount.\n * Can be prevented.\n *\n * @group Emits\n */\n readonly mountAutoFocus = output<Event>();\n\n /**\n * Event handler called when auto-focusing on unmount.\n * Can be prevented.\n *\n * @group Emits\n */\n readonly unmountAutoFocus = output<Event>();\n\n readonly lastFocusedElement = signal<HTMLElement | null>(null);\n\n private readonly focusScopesStack = createFocusScopesStack(this.ownerDocument);\n\n readonly focusScope: FocusScopeAPI = {\n paused: signal(false),\n pause: () => this.focusScope.paused.set(true),\n resume: () => this.focusScope.paused.set(false)\n };\n\n private alive = true;\n\n constructor() {\n this.destroyRef.onDestroy(() => {\n this.alive = false;\n });\n\n afterNextRender(() => {\n effect(\n (onCleanup) => {\n const container = this.elementRef.nativeElement;\n\n if (this.isTrapped()) {\n const handleFocusIn = (event: FocusEvent) => {\n if (this.focusScope.paused() || !container) {\n return;\n }\n\n const target = getEventTarget(event) as HTMLElement | null;\n if (composedContains(container, target)) {\n this.lastFocusedElement.set(target);\n } else {\n focus(this.lastFocusedElement(), { select: true });\n }\n };\n\n const handleFocusOut = (event: FocusEvent) => {\n if (this.focusScope.paused() || !container) {\n return;\n }\n const relatedTarget = event.relatedTarget as HTMLElement | null;\n\n // A `focusout` event with a `null` `relatedTarget` will happen in at least two cases:\n //\n // 1. When the user switches app/tabs/windows/the browser itself loses focus.\n // 2. In Google Chrome, when the focused element is removed from the DOM.\n //\n // We let the browser do its thing here because:\n //\n // 1. The browser already keeps a memory of what's focused for when the page gets refocused.\n // 2. In Google Chrome, if we try to focus the deleted focused element (as per below), it\n // throws the CPU to 100%, so we avoid doing anything for this reason here too.\n if (relatedTarget === null) return;\n\n // If the focus has moved to an actual legitimate element (`relatedTarget !== null`)\n // that is outside the container, we move focus to the last valid focused element inside.\n if (!composedContains(container, relatedTarget)) {\n focus(this.lastFocusedElement(), { select: true });\n }\n };\n\n const handleMutations = () => {\n const isLastFocusedElementExist = composedContains(container, this.lastFocusedElement());\n\n if (!isLastFocusedElementExist) {\n focus(container);\n }\n };\n\n const mutationObserver = new MutationObserver(handleMutations);\n if (container) {\n mutationObserver.observe(container, { childList: true, subtree: true });\n }\n\n this.ownerDocument.addEventListener('focusin', handleFocusIn);\n this.ownerDocument.addEventListener('focusout', handleFocusOut);\n\n onCleanup(() => {\n this.ownerDocument.removeEventListener('focusin', handleFocusIn);\n this.ownerDocument.removeEventListener('focusout', handleFocusOut);\n mutationObserver.disconnect();\n });\n }\n },\n { injector: this.injector }\n );\n\n effect(\n async (onCleanup) => {\n const container = this.elementRef.nativeElement;\n\n await Promise.resolve();\n if (!container || !this.alive) {\n return;\n }\n\n this.focusScopesStack.add(this.focusScope);\n\n const previouslyFocusedElement = getActiveElement(this.ownerDocument) as HTMLElement | null;\n const hasFocusedCandidate = composedContains(container, previouslyFocusedElement);\n const mountEventHandler = (ev: Event) => {\n if (this.alive) this.mountAutoFocus.emit(ev);\n };\n\n if (!hasFocusedCandidate) {\n const mountEvent = new CustomEvent(AUTOFOCUS_ON_MOUNT, EVENT_OPTIONS);\n container.addEventListener(AUTOFOCUS_ON_MOUNT, mountEventHandler);\n container.dispatchEvent(mountEvent);\n\n if (!mountEvent.defaultPrevented) {\n focusFirst(removeLinks(getTabbableCandidates(container)), {\n select: true\n });\n if (getActiveElement(this.ownerDocument) === previouslyFocusedElement) focus(container);\n }\n }\n\n const unmountEventHandler = (ev: Event) => {\n if (this.alive) this.unmountAutoFocus.emit(ev);\n };\n container.addEventListener(AUTOFOCUS_ON_UNMOUNT, unmountEventHandler);\n\n onCleanup(() => {\n container.removeEventListener(AUTOFOCUS_ON_MOUNT, mountEventHandler);\n\n const unmountEvent = new CustomEvent(AUTOFOCUS_ON_UNMOUNT, EVENT_OPTIONS);\n container.dispatchEvent(unmountEvent);\n\n // Queue the return-focus on the owner window's animation frame (not `setTimeout`),\n // so it runs after the unmounting paint settles (ADR 0017 Phase 1a queued focus).\n const view = this.ownerDocument.defaultView ?? globalThis;\n view.requestAnimationFrame(() => {\n // An enclosing focus manager can override the return target (ADR 0017\n // `returnFocus`): `false` suppresses it, an element returns there explicitly\n // (bypassing the moved-focus guard), `undefined` keeps the default behavior.\n const override = this.config.returnFocus?.();\n if (override !== false && !unmountEvent.defaultPrevented) {\n if (override) {\n focus(override, { select: true });\n } else if (!this.shouldPreserveMovedFocus()) {\n focus(previouslyFocusedElement ?? this.ownerDocument.body, { select: true });\n }\n }\n\n // we need to remove the listener after we `dispatchEvent`\n container.removeEventListener(AUTOFOCUS_ON_UNMOUNT, unmountEventHandler);\n\n this.focusScopesStack.remove(this.focusScope);\n });\n });\n },\n { injector: this.injector }\n );\n });\n }\n\n /**\n * Whether the interaction that unmounted this scope already moved focus to a legitimate element\n * **outside** it — e.g. an outside press onto an interactive control in a non-modal layer (ADR 0017\n * §2, finding #3). Returning focus to the previously-focused element would then *steal* it back from\n * what the user just acted on. Focus that fell to `<body>` / `null` (a backdrop press, Escape, or the\n * focused element being removed) is **not** \"moved\" — return focus normally so keyboard users land\n * back on the trigger. The page never scroll-jumps either way: {@link focus} uses `preventScroll`.\n */\n private shouldPreserveMovedFocus(): boolean {\n const active = getActiveElement(this.ownerDocument) as HTMLElement | null;\n return (\n !!active && active !== this.ownerDocument.body && !composedContains(this.elementRef.nativeElement, active)\n );\n }\n\n handleKeyDown(event: KeyboardEvent) {\n const isTabKey = event.key === 'Tab' && !event.altKey && !event.ctrlKey && !event.metaKey;\n\n const focusedElement = getActiveElement(this.ownerDocument) as HTMLElement | null;\n\n if (isTabKey && focusedElement) {\n const container = event.currentTarget as HTMLElement;\n\n const [first, last] = getTabbableEdges(container);\n const hasTabbableElementsInside = first && last;\n\n // we can only wrap focus if we have tabbable edges\n if (!hasTabbableElementsInside) {\n if (focusedElement === container) event.preventDefault();\n } else {\n if (!event.shiftKey && focusedElement === last) {\n event.preventDefault();\n if (this.loop()) {\n focus(first, { select: true });\n }\n } else if (event.shiftKey && focusedElement === first) {\n event.preventDefault();\n if (this.loop()) {\n focus(last, { select: true });\n }\n }\n }\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|