@radix-ng/primitives 1.0.1 → 1.0.3
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 +1 -1
- package/fesm2022/radix-ng-primitives-accordion.mjs +18 -36
- package/fesm2022/radix-ng-primitives-accordion.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-checkbox.mjs +134 -58
- package/fesm2022/radix-ng-primitives-checkbox.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-collapsible.mjs +113 -64
- package/fesm2022/radix-ng-primitives-collapsible.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-composite.mjs +127 -43
- package/fesm2022/radix-ng-primitives-composite.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-menu.mjs +288 -63
- package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-menubar.mjs +24 -1
- package/fesm2022/radix-ng-primitives-menubar.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-select.mjs +56 -29
- package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-slider.mjs +57 -13
- package/fesm2022/radix-ng-primitives-slider.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-tabs.mjs +292 -59
- package/fesm2022/radix-ng-primitives-tabs.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-toolbar.mjs +19 -13
- package/fesm2022/radix-ng-primitives-toolbar.mjs.map +1 -1
- package/package.json +2 -10
- package/types/radix-ng-primitives-accordion.d.ts +7 -15
- package/types/radix-ng-primitives-checkbox.d.ts +98 -70
- package/types/radix-ng-primitives-collapsible.d.ts +44 -24
- package/types/radix-ng-primitives-composite.d.ts +58 -15
- package/types/radix-ng-primitives-menu.d.ts +44 -16
- package/types/radix-ng-primitives-menubar.d.ts +2 -0
- package/types/radix-ng-primitives-select.d.ts +46 -32
- package/types/radix-ng-primitives-slider.d.ts +19 -4
- package/types/radix-ng-primitives-tabs.d.ts +63 -11
- package/types/radix-ng-primitives-toolbar.d.ts +80 -73
- package/collection/README.md +0 -1
- package/fesm2022/radix-ng-primitives-collection.mjs +0 -72
- package/fesm2022/radix-ng-primitives-collection.mjs.map +0 -1
- package/fesm2022/radix-ng-primitives-roving-focus.mjs +0 -420
- package/fesm2022/radix-ng-primitives-roving-focus.mjs.map +0 -1
- package/roving-focus/README.md +0 -3
- package/types/radix-ng-primitives-collection.d.ts +0 -44
- package/types/radix-ng-primitives-roving-focus.d.ts +0 -201
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { inject, ElementRef, contentChildren, signal, input, booleanAttribute, computed, effect, Directive, NgModule } from '@angular/core';
|
|
3
3
|
import * as i1 from '@radix-ng/primitives/composite';
|
|
4
|
-
import { RdxCompositeRoot } from '@radix-ng/primitives/composite';
|
|
4
|
+
import { RdxCompositeRoot, RdxCompositeList } from '@radix-ng/primitives/composite';
|
|
5
5
|
import { createContext, provideFloatingTree } from '@radix-ng/primitives/core';
|
|
6
6
|
import { RdxMenuRoot } from '@radix-ng/primitives/menu';
|
|
7
7
|
|
|
@@ -29,6 +29,7 @@ class RdxMenubarRoot {
|
|
|
29
29
|
constructor() {
|
|
30
30
|
this.elementRef = inject(ElementRef);
|
|
31
31
|
this.compositeRoot = inject(RdxCompositeRoot, { self: true });
|
|
32
|
+
this.compositeList = inject(RdxCompositeList, { self: true });
|
|
32
33
|
this.menuRoots = contentChildren(RdxMenuRoot, { ...(ngDevMode ? { debugName: "menuRoots" } : /* istanbul ignore next */ {}), descendants: true });
|
|
33
34
|
this.ids = new WeakMap();
|
|
34
35
|
this.items = [];
|
|
@@ -49,6 +50,12 @@ class RdxMenubarRoot {
|
|
|
49
50
|
effect(() => {
|
|
50
51
|
this.itemsVersion();
|
|
51
52
|
this.syncDisabledIndices();
|
|
53
|
+
this.syncTabIndices();
|
|
54
|
+
});
|
|
55
|
+
effect(() => {
|
|
56
|
+
this.compositeRoot.highlightedIndex();
|
|
57
|
+
this.itemsVersion();
|
|
58
|
+
this.syncTabIndices();
|
|
52
59
|
});
|
|
53
60
|
effect((onCleanup) => {
|
|
54
61
|
const roots = this.menuRoots();
|
|
@@ -129,9 +136,19 @@ class RdxMenubarRoot {
|
|
|
129
136
|
return true;
|
|
130
137
|
});
|
|
131
138
|
const unregisterTriggerInteraction = root.registerTriggerInteractionHandler((interaction) => this.handleTriggerInteraction(id, root, trigger, interaction));
|
|
139
|
+
const unregisterCompositeItem = this.compositeList.registerItem({
|
|
140
|
+
element: trigger,
|
|
141
|
+
metadata: computed(() => ({
|
|
142
|
+
disabled: this.disabled() ||
|
|
143
|
+
root.disabled() ||
|
|
144
|
+
trigger.hasAttribute('disabled') ||
|
|
145
|
+
trigger.getAttribute('aria-disabled') === 'true'
|
|
146
|
+
}))
|
|
147
|
+
});
|
|
132
148
|
const unregisterItem = this.registerResolvedItem(id, trigger, root);
|
|
133
149
|
return () => {
|
|
134
150
|
unregisterItem();
|
|
151
|
+
unregisterCompositeItem();
|
|
135
152
|
unregisterTriggerInteraction();
|
|
136
153
|
unregisterPopupArrowNavigation();
|
|
137
154
|
};
|
|
@@ -311,6 +328,12 @@ class RdxMenubarRoot {
|
|
|
311
328
|
.filter((index) => index !== -1);
|
|
312
329
|
this.compositeRoot.setDisabledIndices(disabledIndices.length ? disabledIndices : undefined);
|
|
313
330
|
}
|
|
331
|
+
syncTabIndices() {
|
|
332
|
+
const highlightedIndex = this.compositeRoot.highlightedIndex();
|
|
333
|
+
this.items.forEach((item, index) => {
|
|
334
|
+
item.el.tabIndex = index === highlightedIndex && !item.disabled() ? 0 : -1;
|
|
335
|
+
});
|
|
336
|
+
}
|
|
314
337
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxMenubarRoot, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
315
338
|
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.2.9", type: RdxMenubarRoot, isStandalone: true, selector: "[rdxMenubarRoot]", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, loopFocus: { classPropertyName: "loopFocus", publicName: "loopFocus", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "menubar" }, listeners: { "focusin": "handleFocusIn($event)" }, properties: { "attr.aria-orientation": "orientation()", "attr.data-orientation": "orientation()", "attr.data-disabled": "disabled() ? \"\" : undefined", "attr.data-has-submenu-open": "isAnyOpen() ? \"\" : undefined" } }, providers: [
|
|
316
339
|
provideRdxMenubarContext(contextFactory),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"radix-ng-primitives-menubar.mjs","sources":["../../../packages/primitives/menubar/src/menubar-root.ts","../../../packages/primitives/menubar/index.ts","../../../packages/primitives/menubar/radix-ng-primitives-menubar.ts"],"sourcesContent":["import {\n booleanAttribute,\n computed,\n contentChildren,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n Signal\n} from '@angular/core';\nimport { RdxCompositeRoot } from '@radix-ng/primitives/composite';\nimport { BooleanInput, createContext, provideFloatingTree } from '@radix-ng/primitives/core';\nimport { RdxMenuRoot, RdxMenuTriggerInteraction } from '@radix-ng/primitives/menu';\n\nexport type RdxMenubarOrientation = 'horizontal' | 'vertical';\n\ninterface RdxMenubarItem {\n id: string;\n el: HTMLElement;\n root?: RdxMenuRoot;\n open: () => void;\n close: () => void;\n disabled: () => boolean;\n}\n\nexport interface RdxMenubarContext {\n activeId: Signal<string | null>;\n isAnyOpen: Signal<boolean>;\n disabled: Signal<boolean>;\n orientation: Signal<RdxMenubarOrientation>;\n registerItem: (\n id: string,\n el: HTMLElement,\n open: () => void,\n close: () => void,\n disabled: () => boolean\n ) => () => void;\n activateItem: (id: string) => void;\n deactivateAll: () => void;\n focusAdjacent: (currentId: string, offset: 1 | -1, openOnMove: boolean) => void;\n focusBoundary: (boundary: 'first' | 'last', openOnMove: boolean) => void;\n}\n\nexport const [injectRdxMenubarContext, provideRdxMenubarContext] = createContext<RdxMenubarContext>(\n 'RdxMenubarContext',\n 'components/menubar'\n);\n\nconst contextFactory = () => buildContext(inject(RdxMenubarRoot));\n\nfunction buildContext(root: RdxMenubarRoot): RdxMenubarContext {\n return {\n activeId: root.activeId.asReadonly(),\n isAnyOpen: root.isAnyOpen,\n disabled: root.disabled,\n orientation: root.orientation,\n registerItem: (id, el, open, close, disabled) => root.registerItem(id, el, open, close, disabled),\n activateItem: (id) => root.activateItem(id),\n deactivateAll: () => root.deactivateAll(),\n focusAdjacent: (id, offset, open) => root.focusAdjacent(id, offset, open),\n focusBoundary: (boundary, open) => root.focusBoundary(boundary, open)\n };\n}\n\nlet nextMenubarItemId = 0;\n\n/**\n * Container for a horizontal application menu bar.\n * Coordinates open/close state across multiple menus and provides arrow-key navigation.\n */\n@Directive({\n selector: '[rdxMenubarRoot]',\n exportAs: 'rdxMenubarRoot',\n providers: [\n provideRdxMenubarContext(contextFactory),\n // One shared floating tree for all child menus (Base UI `Menubar` wraps them in a single\n // `FloatingTree`). Each `RdxMenuRoot`'s own `provideFloatingTree()` inherits this via skipSelf, so\n // sibling menubar menus live in the same tree — the dismissal / focus engine can see their\n // relationships instead of each menu owning an isolated tree.\n provideFloatingTree()\n ],\n host: {\n role: 'menubar',\n '[attr.aria-orientation]': 'orientation()',\n '[attr.data-orientation]': 'orientation()',\n '[attr.data-disabled]': 'disabled() ? \"\" : undefined',\n '[attr.data-has-submenu-open]': 'isAnyOpen() ? \"\" : undefined',\n '(focusin)': 'handleFocusIn($event)'\n },\n hostDirectives: [RdxCompositeRoot]\n})\nexport class RdxMenubarRoot {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly compositeRoot = inject(RdxCompositeRoot, { self: true });\n private readonly menuRoots = contentChildren(RdxMenuRoot, { descendants: true });\n private readonly ids = new WeakMap<RdxMenuRoot, string>();\n private items: RdxMenubarItem[] = [];\n private readonly itemsVersion = signal(0);\n\n /** Whether every menubar trigger is disabled. */\n readonly disabled = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n /** Whether arrow-key navigation wraps at the first/last trigger. */\n readonly loopFocus = input<boolean, BooleanInput>(true, { transform: booleanAttribute });\n\n /** The menubar orientation. */\n readonly orientation = input<RdxMenubarOrientation>('horizontal');\n\n readonly activeId = signal<string | null>(null);\n readonly isAnyOpen = computed(() => this.activeId() !== null);\n\n constructor() {\n effect(() => {\n this.compositeRoot.setOrientation(this.orientation());\n this.compositeRoot.setLoopFocus(this.loopFocus());\n this.compositeRoot.setEnableHomeAndEndKeys(true);\n });\n\n effect(() => {\n this.itemsVersion();\n this.syncDisabledIndices();\n });\n\n effect((onCleanup) => {\n const roots = this.menuRoots();\n const registered: Array<() => void> = [];\n\n roots.forEach((root) => {\n const trigger = root.trigger();\n\n if (!trigger || trigger.closest('[rdxMenuPopup]')) {\n return;\n }\n\n registered.push(this.registerMenuRoot(root, trigger));\n });\n\n onCleanup(() => {\n registered.forEach((cleanup) => cleanup());\n });\n });\n\n effect(() => {\n const activeId = this.activeId();\n\n if (!activeId) {\n return;\n }\n\n this.menuRoots().forEach((root) => {\n const trigger = root.trigger();\n\n if (!trigger || trigger.closest('[rdxMenuPopup]')) {\n return;\n }\n\n if (this.idFor(root) === activeId && !root.open()) {\n this.deactivateAll();\n }\n });\n });\n }\n\n registerItem(\n id: string,\n el: HTMLElement,\n open: () => void,\n close: () => void,\n disabled: () => boolean\n ): () => void {\n this.items.push({ id, el, open, close, disabled });\n this.sortItems();\n return () => {\n this.items = this.items.filter((item) => item.id !== id);\n if (this.activeId() === id) this.activeId.set(null);\n this.markItemsChanged();\n };\n }\n\n activateItem(id: string): void {\n if (this.disabled()) {\n return;\n }\n\n // Close every other open menu\n this.items.forEach((item) => {\n if (item.id !== id) item.close();\n });\n this.activeId.set(id);\n }\n\n deactivateAll(): void {\n this.activeId.set(null);\n }\n\n focusBoundary(boundary: 'first' | 'last', openOnMove: boolean): void {\n const enabled = this.enabledItems();\n this.focusItem(boundary === 'first' ? enabled[0] : enabled[enabled.length - 1], openOnMove);\n }\n\n generateId(): string {\n return `rdx-menubar-item-${nextMenubarItemId++}`;\n }\n\n private idFor(root: RdxMenuRoot): string {\n let id = this.ids.get(root);\n\n if (!id) {\n id = this.generateId();\n this.ids.set(root, id);\n }\n\n return id;\n }\n\n private registerMenuRoot(root: RdxMenuRoot, trigger: HTMLElement): () => void {\n const id = this.idFor(root);\n const unregisterPopupArrowNavigation = root.registerPopupArrowNavigationHandler((offset) => {\n if (this.disabled()) {\n return false;\n }\n\n this.focusAdjacent(id, offset, true);\n return true;\n });\n const unregisterTriggerInteraction = root.registerTriggerInteractionHandler((interaction) =>\n this.handleTriggerInteraction(id, root, trigger, interaction)\n );\n const unregisterItem = this.registerResolvedItem(id, trigger, root);\n\n return () => {\n unregisterItem();\n unregisterTriggerInteraction();\n unregisterPopupArrowNavigation();\n };\n }\n\n private registerResolvedItem(id: string, el: HTMLElement, root: RdxMenuRoot): () => void {\n this.items.push({\n id,\n el,\n root,\n open: () => root.show(false),\n close: () => root.close(),\n disabled: () =>\n this.disabled() ||\n root.disabled() ||\n el.hasAttribute('disabled') ||\n el.getAttribute('aria-disabled') === 'true'\n });\n this.sortItems();\n\n return () => {\n this.items = this.items.filter((item) => item.id !== id);\n if (this.activeId() === id) this.activeId.set(null);\n this.markItemsChanged();\n };\n }\n\n private handleTriggerInteraction(\n id: string,\n root: RdxMenuRoot,\n trigger: HTMLElement,\n interaction: RdxMenuTriggerInteraction\n ): boolean {\n if (this.disabled()) {\n return false;\n }\n\n switch (interaction.type) {\n case 'click': {\n if (root.open()) {\n root.close();\n this.deactivateAll();\n } else {\n root.show();\n this.activateItem(id);\n }\n return true;\n }\n case 'enter':\n case 'space': {\n interaction.event.preventDefault();\n interaction.event.stopPropagation();\n\n if (root.open()) {\n root.close();\n this.deactivateAll();\n } else {\n root.show('first', 'trigger-press', interaction.event);\n this.activateItem(id);\n }\n\n return true;\n }\n case 'pointerenter': {\n if (interaction.event.pointerType === 'touch' || !this.hasOpenMenu()) {\n return false;\n }\n\n if (root.open()) {\n return true;\n }\n\n trigger.focus({ preventScroll: true });\n root.show(false, 'trigger-hover');\n this.activateItem(id);\n return true;\n }\n case 'arrowdown': {\n interaction.event.preventDefault();\n root.show('first');\n this.activateItem(id);\n return true;\n }\n case 'arrowup': {\n interaction.event.preventDefault();\n root.show('last');\n this.activateItem(id);\n return true;\n }\n case 'arrowleft': {\n this.handleTriggerArrow(interaction.event, id, -1, root.open());\n return true;\n }\n case 'arrowright': {\n this.handleTriggerArrow(interaction.event, id, 1, root.open());\n return true;\n }\n case 'home': {\n this.handleTriggerBoundary(interaction.event, 'first', root.open());\n return true;\n }\n case 'end': {\n this.handleTriggerBoundary(interaction.event, 'last', root.open());\n return true;\n }\n case 'escape': {\n interaction.event.preventDefault();\n interaction.event.stopPropagation();\n root.close();\n this.deactivateAll();\n trigger.focus({ preventScroll: true });\n return true;\n }\n }\n }\n\n private handleTriggerArrow(event: Event, id: string, offset: 1 | -1, openOnMove: boolean): void {\n event.preventDefault();\n event.stopPropagation();\n (event as KeyboardEvent).stopImmediatePropagation();\n this.focusAdjacent(id, offset, openOnMove);\n }\n\n private handleTriggerBoundary(event: Event, boundary: 'first' | 'last', openOnMove: boolean): void {\n event.preventDefault();\n event.stopPropagation();\n (event as KeyboardEvent).stopImmediatePropagation();\n this.focusBoundary(boundary, openOnMove);\n }\n\n focusAdjacent(currentId: string, offset: 1 | -1, openOnMove: boolean): void {\n const enabled = this.enabledItems();\n const currentIndex = enabled.findIndex((item) => item.id === currentId);\n if (currentIndex === -1 || enabled.length === 0) return;\n\n const nextIndex = currentIndex + offset;\n if (!this.loopFocus() && (nextIndex < 0 || nextIndex >= enabled.length)) {\n return;\n }\n\n const next = enabled[(nextIndex + enabled.length) % enabled.length];\n this.focusItem(next, openOnMove);\n }\n\n private focusItem(item: RdxMenubarItem | undefined, openOnMove: boolean): void {\n if (!item || this.disabled()) return;\n\n this.highlightItem(item);\n item.el.focus({ preventScroll: true });\n if (openOnMove) {\n item.open();\n this.activateItem(item.id);\n }\n }\n\n protected handleFocusIn(event: FocusEvent): void {\n const target = event.target;\n\n if (target === this.elementRef.nativeElement) {\n this.focusItem(this.enabledItems()[0], false);\n return;\n }\n\n const focusedItem = target instanceof HTMLElement ? this.items.find((item) => item.el === target) : undefined;\n if (!focusedItem || focusedItem.disabled()) {\n return;\n }\n\n this.highlightItem(focusedItem);\n\n if (this.hasOpenMenu() && this.activeId() !== focusedItem.id) {\n focusedItem.open();\n this.activateItem(focusedItem.id);\n }\n }\n\n private highlightItem(item: RdxMenubarItem): void {\n const index = this.items.findIndex((candidate) => candidate.id === item.id);\n if (index !== -1) {\n this.compositeRoot.setHighlightedIndex(index, true);\n }\n }\n\n private enabledItems(): RdxMenubarItem[] {\n return this.items.filter((item) => !item.disabled());\n }\n\n private hasOpenMenu(): boolean {\n return this.items.some((item) => item.root?.open());\n }\n\n private sortItems(): void {\n this.items.sort((a, b) => (a.el.compareDocumentPosition(b.el) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1));\n this.markItemsChanged();\n }\n\n private markItemsChanged(): void {\n this.itemsVersion.update((value) => value + 1);\n }\n\n private syncDisabledIndices(): void {\n const disabledIndices = this.items\n .map((item, index) => (item.disabled() ? index : -1))\n .filter((index) => index !== -1);\n\n this.compositeRoot.setDisabledIndices(disabledIndices.length ? disabledIndices : undefined);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { RdxMenubarRoot } from './src/menubar-root';\n\nexport * from './src/menubar-root';\n\n/**\n * Menubar-specific parts. Triggers use the standard `rdxMenuTrigger` from\n * `@radix-ng/primitives/menu`; the menubar root composes them into Composite focus,\n * hover switching, and ArrowLeft / ArrowRight navigation. The menu popup, items,\n * checkbox/radio, submenu, separator, etc. also come from `RdxMenuModule`.\n */\nconst menubarImports = [RdxMenubarRoot];\n\n@NgModule({\n imports: [...menubarImports],\n exports: [...menubarImports]\n})\nexport class RdxMenubarModule {}\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-menubar.mjs","sources":["../../../packages/primitives/menubar/src/menubar-root.ts","../../../packages/primitives/menubar/index.ts","../../../packages/primitives/menubar/radix-ng-primitives-menubar.ts"],"sourcesContent":["import {\n booleanAttribute,\n computed,\n contentChildren,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n Signal\n} from '@angular/core';\nimport { RdxCompositeList, RdxCompositeRoot } from '@radix-ng/primitives/composite';\nimport { BooleanInput, createContext, provideFloatingTree } from '@radix-ng/primitives/core';\nimport { RdxMenuRoot, RdxMenuTriggerInteraction } from '@radix-ng/primitives/menu';\n\nexport type RdxMenubarOrientation = 'horizontal' | 'vertical';\n\ninterface RdxMenubarItem {\n id: string;\n el: HTMLElement;\n root?: RdxMenuRoot;\n open: () => void;\n close: () => void;\n disabled: () => boolean;\n}\n\nexport interface RdxMenubarContext {\n activeId: Signal<string | null>;\n isAnyOpen: Signal<boolean>;\n disabled: Signal<boolean>;\n orientation: Signal<RdxMenubarOrientation>;\n registerItem: (\n id: string,\n el: HTMLElement,\n open: () => void,\n close: () => void,\n disabled: () => boolean\n ) => () => void;\n activateItem: (id: string) => void;\n deactivateAll: () => void;\n focusAdjacent: (currentId: string, offset: 1 | -1, openOnMove: boolean) => void;\n focusBoundary: (boundary: 'first' | 'last', openOnMove: boolean) => void;\n}\n\nexport const [injectRdxMenubarContext, provideRdxMenubarContext] = createContext<RdxMenubarContext>(\n 'RdxMenubarContext',\n 'components/menubar'\n);\n\nconst contextFactory = () => buildContext(inject(RdxMenubarRoot));\n\nfunction buildContext(root: RdxMenubarRoot): RdxMenubarContext {\n return {\n activeId: root.activeId.asReadonly(),\n isAnyOpen: root.isAnyOpen,\n disabled: root.disabled,\n orientation: root.orientation,\n registerItem: (id, el, open, close, disabled) => root.registerItem(id, el, open, close, disabled),\n activateItem: (id) => root.activateItem(id),\n deactivateAll: () => root.deactivateAll(),\n focusAdjacent: (id, offset, open) => root.focusAdjacent(id, offset, open),\n focusBoundary: (boundary, open) => root.focusBoundary(boundary, open)\n };\n}\n\nlet nextMenubarItemId = 0;\n\n/**\n * Container for a horizontal application menu bar.\n * Coordinates open/close state across multiple menus and provides arrow-key navigation.\n */\n@Directive({\n selector: '[rdxMenubarRoot]',\n exportAs: 'rdxMenubarRoot',\n providers: [\n provideRdxMenubarContext(contextFactory),\n // One shared floating tree for all child menus (Base UI `Menubar` wraps them in a single\n // `FloatingTree`). Each `RdxMenuRoot`'s own `provideFloatingTree()` inherits this via skipSelf, so\n // sibling menubar menus live in the same tree — the dismissal / focus engine can see their\n // relationships instead of each menu owning an isolated tree.\n provideFloatingTree()\n ],\n host: {\n role: 'menubar',\n '[attr.aria-orientation]': 'orientation()',\n '[attr.data-orientation]': 'orientation()',\n '[attr.data-disabled]': 'disabled() ? \"\" : undefined',\n '[attr.data-has-submenu-open]': 'isAnyOpen() ? \"\" : undefined',\n '(focusin)': 'handleFocusIn($event)'\n },\n hostDirectives: [RdxCompositeRoot]\n})\nexport class RdxMenubarRoot {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly compositeRoot = inject(RdxCompositeRoot, { self: true });\n private readonly compositeList = inject(RdxCompositeList, { self: true });\n private readonly menuRoots = contentChildren(RdxMenuRoot, { descendants: true });\n private readonly ids = new WeakMap<RdxMenuRoot, string>();\n private items: RdxMenubarItem[] = [];\n private readonly itemsVersion = signal(0);\n\n /** Whether every menubar trigger is disabled. */\n readonly disabled = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n /** Whether arrow-key navigation wraps at the first/last trigger. */\n readonly loopFocus = input<boolean, BooleanInput>(true, { transform: booleanAttribute });\n\n /** The menubar orientation. */\n readonly orientation = input<RdxMenubarOrientation>('horizontal');\n\n readonly activeId = signal<string | null>(null);\n readonly isAnyOpen = computed(() => this.activeId() !== null);\n\n constructor() {\n effect(() => {\n this.compositeRoot.setOrientation(this.orientation());\n this.compositeRoot.setLoopFocus(this.loopFocus());\n this.compositeRoot.setEnableHomeAndEndKeys(true);\n });\n\n effect(() => {\n this.itemsVersion();\n this.syncDisabledIndices();\n this.syncTabIndices();\n });\n\n effect(() => {\n this.compositeRoot.highlightedIndex();\n this.itemsVersion();\n this.syncTabIndices();\n });\n\n effect((onCleanup) => {\n const roots = this.menuRoots();\n const registered: Array<() => void> = [];\n\n roots.forEach((root) => {\n const trigger = root.trigger();\n\n if (!trigger || trigger.closest('[rdxMenuPopup]')) {\n return;\n }\n\n registered.push(this.registerMenuRoot(root, trigger));\n });\n\n onCleanup(() => {\n registered.forEach((cleanup) => cleanup());\n });\n });\n\n effect(() => {\n const activeId = this.activeId();\n\n if (!activeId) {\n return;\n }\n\n this.menuRoots().forEach((root) => {\n const trigger = root.trigger();\n\n if (!trigger || trigger.closest('[rdxMenuPopup]')) {\n return;\n }\n\n if (this.idFor(root) === activeId && !root.open()) {\n this.deactivateAll();\n }\n });\n });\n }\n\n registerItem(\n id: string,\n el: HTMLElement,\n open: () => void,\n close: () => void,\n disabled: () => boolean\n ): () => void {\n this.items.push({ id, el, open, close, disabled });\n this.sortItems();\n return () => {\n this.items = this.items.filter((item) => item.id !== id);\n if (this.activeId() === id) this.activeId.set(null);\n this.markItemsChanged();\n };\n }\n\n activateItem(id: string): void {\n if (this.disabled()) {\n return;\n }\n\n // Close every other open menu\n this.items.forEach((item) => {\n if (item.id !== id) item.close();\n });\n this.activeId.set(id);\n }\n\n deactivateAll(): void {\n this.activeId.set(null);\n }\n\n focusBoundary(boundary: 'first' | 'last', openOnMove: boolean): void {\n const enabled = this.enabledItems();\n this.focusItem(boundary === 'first' ? enabled[0] : enabled[enabled.length - 1], openOnMove);\n }\n\n generateId(): string {\n return `rdx-menubar-item-${nextMenubarItemId++}`;\n }\n\n private idFor(root: RdxMenuRoot): string {\n let id = this.ids.get(root);\n\n if (!id) {\n id = this.generateId();\n this.ids.set(root, id);\n }\n\n return id;\n }\n\n private registerMenuRoot(root: RdxMenuRoot, trigger: HTMLElement): () => void {\n const id = this.idFor(root);\n const unregisterPopupArrowNavigation = root.registerPopupArrowNavigationHandler((offset) => {\n if (this.disabled()) {\n return false;\n }\n\n this.focusAdjacent(id, offset, true);\n return true;\n });\n const unregisterTriggerInteraction = root.registerTriggerInteractionHandler((interaction) =>\n this.handleTriggerInteraction(id, root, trigger, interaction)\n );\n const unregisterCompositeItem = this.compositeList.registerItem({\n element: trigger,\n metadata: computed(() => ({\n disabled:\n this.disabled() ||\n root.disabled() ||\n trigger.hasAttribute('disabled') ||\n trigger.getAttribute('aria-disabled') === 'true'\n }))\n });\n const unregisterItem = this.registerResolvedItem(id, trigger, root);\n\n return () => {\n unregisterItem();\n unregisterCompositeItem();\n unregisterTriggerInteraction();\n unregisterPopupArrowNavigation();\n };\n }\n\n private registerResolvedItem(id: string, el: HTMLElement, root: RdxMenuRoot): () => void {\n this.items.push({\n id,\n el,\n root,\n open: () => root.show(false),\n close: () => root.close(),\n disabled: () =>\n this.disabled() ||\n root.disabled() ||\n el.hasAttribute('disabled') ||\n el.getAttribute('aria-disabled') === 'true'\n });\n this.sortItems();\n\n return () => {\n this.items = this.items.filter((item) => item.id !== id);\n if (this.activeId() === id) this.activeId.set(null);\n this.markItemsChanged();\n };\n }\n\n private handleTriggerInteraction(\n id: string,\n root: RdxMenuRoot,\n trigger: HTMLElement,\n interaction: RdxMenuTriggerInteraction\n ): boolean {\n if (this.disabled()) {\n return false;\n }\n\n switch (interaction.type) {\n case 'click': {\n if (root.open()) {\n root.close();\n this.deactivateAll();\n } else {\n root.show();\n this.activateItem(id);\n }\n return true;\n }\n case 'enter':\n case 'space': {\n interaction.event.preventDefault();\n interaction.event.stopPropagation();\n\n if (root.open()) {\n root.close();\n this.deactivateAll();\n } else {\n root.show('first', 'trigger-press', interaction.event);\n this.activateItem(id);\n }\n\n return true;\n }\n case 'pointerenter': {\n if (interaction.event.pointerType === 'touch' || !this.hasOpenMenu()) {\n return false;\n }\n\n if (root.open()) {\n return true;\n }\n\n trigger.focus({ preventScroll: true });\n root.show(false, 'trigger-hover');\n this.activateItem(id);\n return true;\n }\n case 'arrowdown': {\n interaction.event.preventDefault();\n root.show('first');\n this.activateItem(id);\n return true;\n }\n case 'arrowup': {\n interaction.event.preventDefault();\n root.show('last');\n this.activateItem(id);\n return true;\n }\n case 'arrowleft': {\n this.handleTriggerArrow(interaction.event, id, -1, root.open());\n return true;\n }\n case 'arrowright': {\n this.handleTriggerArrow(interaction.event, id, 1, root.open());\n return true;\n }\n case 'home': {\n this.handleTriggerBoundary(interaction.event, 'first', root.open());\n return true;\n }\n case 'end': {\n this.handleTriggerBoundary(interaction.event, 'last', root.open());\n return true;\n }\n case 'escape': {\n interaction.event.preventDefault();\n interaction.event.stopPropagation();\n root.close();\n this.deactivateAll();\n trigger.focus({ preventScroll: true });\n return true;\n }\n }\n }\n\n private handleTriggerArrow(event: Event, id: string, offset: 1 | -1, openOnMove: boolean): void {\n event.preventDefault();\n event.stopPropagation();\n (event as KeyboardEvent).stopImmediatePropagation();\n this.focusAdjacent(id, offset, openOnMove);\n }\n\n private handleTriggerBoundary(event: Event, boundary: 'first' | 'last', openOnMove: boolean): void {\n event.preventDefault();\n event.stopPropagation();\n (event as KeyboardEvent).stopImmediatePropagation();\n this.focusBoundary(boundary, openOnMove);\n }\n\n focusAdjacent(currentId: string, offset: 1 | -1, openOnMove: boolean): void {\n const enabled = this.enabledItems();\n const currentIndex = enabled.findIndex((item) => item.id === currentId);\n if (currentIndex === -1 || enabled.length === 0) return;\n\n const nextIndex = currentIndex + offset;\n if (!this.loopFocus() && (nextIndex < 0 || nextIndex >= enabled.length)) {\n return;\n }\n\n const next = enabled[(nextIndex + enabled.length) % enabled.length];\n this.focusItem(next, openOnMove);\n }\n\n private focusItem(item: RdxMenubarItem | undefined, openOnMove: boolean): void {\n if (!item || this.disabled()) return;\n\n this.highlightItem(item);\n item.el.focus({ preventScroll: true });\n if (openOnMove) {\n item.open();\n this.activateItem(item.id);\n }\n }\n\n protected handleFocusIn(event: FocusEvent): void {\n const target = event.target;\n\n if (target === this.elementRef.nativeElement) {\n this.focusItem(this.enabledItems()[0], false);\n return;\n }\n\n const focusedItem = target instanceof HTMLElement ? this.items.find((item) => item.el === target) : undefined;\n if (!focusedItem || focusedItem.disabled()) {\n return;\n }\n\n this.highlightItem(focusedItem);\n\n if (this.hasOpenMenu() && this.activeId() !== focusedItem.id) {\n focusedItem.open();\n this.activateItem(focusedItem.id);\n }\n }\n\n private highlightItem(item: RdxMenubarItem): void {\n const index = this.items.findIndex((candidate) => candidate.id === item.id);\n if (index !== -1) {\n this.compositeRoot.setHighlightedIndex(index, true);\n }\n }\n\n private enabledItems(): RdxMenubarItem[] {\n return this.items.filter((item) => !item.disabled());\n }\n\n private hasOpenMenu(): boolean {\n return this.items.some((item) => item.root?.open());\n }\n\n private sortItems(): void {\n this.items.sort((a, b) => (a.el.compareDocumentPosition(b.el) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1));\n this.markItemsChanged();\n }\n\n private markItemsChanged(): void {\n this.itemsVersion.update((value) => value + 1);\n }\n\n private syncDisabledIndices(): void {\n const disabledIndices = this.items\n .map((item, index) => (item.disabled() ? index : -1))\n .filter((index) => index !== -1);\n\n this.compositeRoot.setDisabledIndices(disabledIndices.length ? disabledIndices : undefined);\n }\n\n private syncTabIndices(): void {\n const highlightedIndex = this.compositeRoot.highlightedIndex();\n\n this.items.forEach((item, index) => {\n item.el.tabIndex = index === highlightedIndex && !item.disabled() ? 0 : -1;\n });\n }\n}\n","import { NgModule } from '@angular/core';\nimport { RdxMenubarRoot } from './src/menubar-root';\n\nexport * from './src/menubar-root';\n\n/**\n * Menubar-specific parts. Triggers use the standard `rdxMenuTrigger` from\n * `@radix-ng/primitives/menu`; the menubar root composes them into Composite focus,\n * hover switching, and ArrowLeft / ArrowRight navigation. The menu popup, items,\n * checkbox/radio, submenu, separator, etc. also come from `RdxMenuModule`.\n */\nconst menubarImports = [RdxMenubarRoot];\n\n@NgModule({\n imports: [...menubarImports],\n exports: [...menubarImports]\n})\nexport class RdxMenubarModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -7,8 +7,8 @@ import * as i2 from '@radix-ng/primitives/floating-focus-manager';
|
|
|
7
7
|
import { getInteractionTypeFromEvent, provideFloatingFocusManagerConfig, RdxFloatingFocusManager, createRdxTriggerInteraction } from '@radix-ng/primitives/floating-focus-manager';
|
|
8
8
|
import * as i1 from '@radix-ng/primitives/popper';
|
|
9
9
|
import { RdxPopper, RdxPopperContent, RdxPopperContentWrapper, legacyPopperVars, provideRdxPopperContentWrapper, provideRdxPopperContentConfig, RdxPopperAnchor } from '@radix-ng/primitives/popper';
|
|
10
|
-
import * as i4 from '@radix-ng/primitives/
|
|
11
|
-
import {
|
|
10
|
+
import * as i4 from '@radix-ng/primitives/composite';
|
|
11
|
+
import { RdxCompositeList, RdxCompositeListItem } from '@radix-ng/primitives/composite';
|
|
12
12
|
import { RdxDismiss } from '@radix-ng/primitives/dismissable-layer';
|
|
13
13
|
import * as i1$1 from '@radix-ng/primitives/portal';
|
|
14
14
|
import { RdxPortalPresence } from '@radix-ng/primitives/portal';
|
|
@@ -341,9 +341,15 @@ const context$1 = () => {
|
|
|
341
341
|
isPositioned: context.isPositioned,
|
|
342
342
|
selectedItem: context.selectedItem,
|
|
343
343
|
selectedItemText: context.selectedItemText,
|
|
344
|
+
items: context.items,
|
|
344
345
|
highlightedItem: context.highlight.highlightedItem,
|
|
345
|
-
isHighlighted: (
|
|
346
|
-
highlightItem: (
|
|
346
|
+
isHighlighted: (element) => context.highlight.highlightedItem()?.element === element,
|
|
347
|
+
highlightItem: (element) => {
|
|
348
|
+
const item = context.items().find((item) => item.element === element);
|
|
349
|
+
if (item) {
|
|
350
|
+
context.highlight.set(item);
|
|
351
|
+
}
|
|
352
|
+
},
|
|
347
353
|
isKeyboardActive: () => context.isKeyboardActive(),
|
|
348
354
|
setKeyboardActive: (value) => context.setKeyboardActive(value),
|
|
349
355
|
onViewportChange: (node) => {
|
|
@@ -391,23 +397,23 @@ class RdxSelectPopup {
|
|
|
391
397
|
this.floatingContext = inject(RDX_FLOATING_ROOT_CONTEXT);
|
|
392
398
|
this.registration = inject(RDX_FLOATING_REGISTRATION, { optional: true });
|
|
393
399
|
this.currentElement = inject(ElementRef);
|
|
394
|
-
this.
|
|
400
|
+
this.compositeList = inject(RdxCompositeList, { self: true });
|
|
395
401
|
this.injector = inject(Injector);
|
|
396
402
|
this.rootContext = injectSelectRootContext();
|
|
397
403
|
/**
|
|
398
404
|
* The collected items (DOM order). Exposed so the `item-aligned` positioner — now the popup's
|
|
399
|
-
* **ancestor** — can read them without injecting
|
|
400
|
-
*
|
|
405
|
+
* **ancestor** — can read them without injecting the composite list (which the popup provides as
|
|
406
|
+
* a descendant, so an upward `inject` would not find it).
|
|
401
407
|
*/
|
|
402
|
-
this.items = this.
|
|
408
|
+
this.items = computed(() => this.compositeList.items(), ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
|
|
403
409
|
/**
|
|
404
410
|
* Highlight-model navigation over the collected items (DOM order). `loop` is disabled so arrow
|
|
405
411
|
* navigation stops at the first / last item instead of wrapping around — matching native
|
|
406
412
|
* `<select>` behavior.
|
|
407
413
|
*/
|
|
408
414
|
this.highlight = useListHighlight({
|
|
409
|
-
items: this.
|
|
410
|
-
isNavigable: (item) => !item.
|
|
415
|
+
items: this.items,
|
|
416
|
+
isNavigable: (item) => !item.metadata()?.disabled,
|
|
411
417
|
getId: (item) => item.element.id,
|
|
412
418
|
loop: signal(false),
|
|
413
419
|
injector: this.injector
|
|
@@ -420,6 +426,7 @@ class RdxSelectPopup {
|
|
|
420
426
|
// Tracks whether the last interaction was the keyboard, so the highlight doesn't jump to an item
|
|
421
427
|
// the cursor happens to rest on when arrow-key navigation scrolls the list.
|
|
422
428
|
this.keyboardActive = false;
|
|
429
|
+
this.hasHighlightedOpen = false;
|
|
423
430
|
/**
|
|
424
431
|
* Event handler called when the escape key is down.
|
|
425
432
|
* Can be prevented.
|
|
@@ -438,9 +445,8 @@ class RdxSelectPopup {
|
|
|
438
445
|
*/
|
|
439
446
|
this.positioner = inject(RDX_SELECT_POSITIONER_TOKEN, { optional: true });
|
|
440
447
|
this.positioner?.placed.subscribe(() => {
|
|
441
|
-
this.highlightSelectedItem();
|
|
442
|
-
this.scrollSelectedIntoView();
|
|
443
448
|
this.isPositioned.set(true);
|
|
449
|
+
this.highlightSelectedItemAfterPositioned();
|
|
444
450
|
// In Popper mode the popup lives inside the positioner, which stays `visibility: hidden`
|
|
445
451
|
// until it is placed — so the mount-time `mountAutoFocus` call no-ops on the hidden
|
|
446
452
|
// listbox and keyboard navigation never starts. Focus it now that it is visible (skip if
|
|
@@ -450,6 +456,16 @@ class RdxSelectPopup {
|
|
|
450
456
|
popup.focus({ preventScroll: true });
|
|
451
457
|
}
|
|
452
458
|
});
|
|
459
|
+
effect(() => {
|
|
460
|
+
if (!this.rootContext.open()) {
|
|
461
|
+
this.hasHighlightedOpen = false;
|
|
462
|
+
return;
|
|
463
|
+
}
|
|
464
|
+
if (!this.isPositioned() || this.hasHighlightedOpen) {
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
this.highlightSelectedItemAfterPositioned();
|
|
468
|
+
});
|
|
453
469
|
// Keep the highlighted item in view during keyboard navigation. The highlight model is pure
|
|
454
470
|
// state (it never moves DOM focus or scrolls), so without this the highlight can move past the
|
|
455
471
|
// visible viewport — behind the scroll buttons. Only keyboard moves scroll; hover highlights
|
|
@@ -550,8 +566,8 @@ class RdxSelectPopup {
|
|
|
550
566
|
}
|
|
551
567
|
/** Highlights the selected item (or the first enabled one) when the popup opens. */
|
|
552
568
|
highlightSelectedItem() {
|
|
553
|
-
const items = this.
|
|
554
|
-
const selected = items.find((item) => valueComparator(this.rootContext.value(), item.
|
|
569
|
+
const items = this.items();
|
|
570
|
+
const selected = items.find((item) => valueComparator(this.rootContext.value(), item.metadata()?.value, this.rootContext.isItemEqualToValue()));
|
|
555
571
|
if (selected) {
|
|
556
572
|
this.highlight.set(selected);
|
|
557
573
|
}
|
|
@@ -559,6 +575,14 @@ class RdxSelectPopup {
|
|
|
559
575
|
this.highlight.first();
|
|
560
576
|
}
|
|
561
577
|
}
|
|
578
|
+
highlightSelectedItemAfterPositioned() {
|
|
579
|
+
if (this.items().length === 0) {
|
|
580
|
+
return;
|
|
581
|
+
}
|
|
582
|
+
this.highlightSelectedItem();
|
|
583
|
+
this.scrollSelectedIntoView();
|
|
584
|
+
this.hasHighlightedOpen = true;
|
|
585
|
+
}
|
|
562
586
|
scrollSelectedIntoView() {
|
|
563
587
|
this.selectedItem()?.scrollIntoView?.({ block: 'nearest' });
|
|
564
588
|
}
|
|
@@ -580,8 +604,9 @@ class RdxSelectPopup {
|
|
|
580
604
|
if (SELECTION_KEYS.includes(keyEvent.key)) {
|
|
581
605
|
event.preventDefault();
|
|
582
606
|
const item = this.highlight.highlightedItem();
|
|
583
|
-
|
|
584
|
-
|
|
607
|
+
const metadata = item?.metadata();
|
|
608
|
+
if (item && metadata && !metadata.disabled) {
|
|
609
|
+
this.rootContext.onValueChange(metadata.value, 'item-press', event);
|
|
585
610
|
if (!this.rootContext.multiple()) {
|
|
586
611
|
this.rootContext.onOpenChange(false, 'item-press', event);
|
|
587
612
|
}
|
|
@@ -624,7 +649,7 @@ class RdxSelectPopup {
|
|
|
624
649
|
closeInteractionType: () => rootContext.closeInteractionType()
|
|
625
650
|
};
|
|
626
651
|
})
|
|
627
|
-
], hostDirectives: [{ directive: i1.RdxPopperContent }, { directive: i2.RdxFloatingFocusManager, inputs: ["returnFocus", "finalFocus"] }, { directive: i3.RdxFloatingNodeRegistration }, { directive: i4.
|
|
652
|
+
], hostDirectives: [{ directive: i1.RdxPopperContent }, { directive: i2.RdxFloatingFocusManager, inputs: ["returnFocus", "finalFocus"] }, { directive: i3.RdxFloatingNodeRegistration }, { directive: i4.RdxCompositeList }], ngImport: i0 }); }
|
|
628
653
|
}
|
|
629
654
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxSelectPopup, decorators: [{
|
|
630
655
|
type: Directive,
|
|
@@ -634,7 +659,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
634
659
|
RdxPopperContent,
|
|
635
660
|
{ directive: RdxFloatingFocusManager, inputs: ['returnFocus: finalFocus'] },
|
|
636
661
|
RdxFloatingNodeRegistration,
|
|
637
|
-
|
|
662
|
+
RdxCompositeList
|
|
638
663
|
],
|
|
639
664
|
providers: [
|
|
640
665
|
provideSelectPopupContext(context$1),
|
|
@@ -692,7 +717,7 @@ class RdxSelectItem {
|
|
|
692
717
|
constructor() {
|
|
693
718
|
this.rootContext = injectSelectRootContext();
|
|
694
719
|
this.contentContext = injectSelectPopupContext();
|
|
695
|
-
this.
|
|
720
|
+
this.listItem = inject(RdxCompositeListItem, { self: true });
|
|
696
721
|
this.currentElement = inject(ElementRef);
|
|
697
722
|
this.value = input(...(ngDevMode ? [undefined, { debugName: "value" }] : /* istanbul ignore next */ []));
|
|
698
723
|
this.textValue = input('', ...(ngDevMode ? [{ debugName: "textValue" }] : /* istanbul ignore next */ []));
|
|
@@ -700,7 +725,7 @@ class RdxSelectItem {
|
|
|
700
725
|
this.textValue$ = linkedSignal(this.textValue, ...(ngDevMode ? [{ debugName: "textValue$" }] : /* istanbul ignore next */ []));
|
|
701
726
|
this.isSelected = computed(() => valueComparator(this.rootContext.value(), this.value(), this.rootContext.isItemEqualToValue()), ...(ngDevMode ? [{ debugName: "isSelected" }] : /* istanbul ignore next */ []));
|
|
702
727
|
/** Highlighted via the highlight model (keyboard / hover), not DOM focus. */
|
|
703
|
-
this.isHighlighted = computed(() => this.contentContext.isHighlighted(this.
|
|
728
|
+
this.isHighlighted = computed(() => this.contentContext.isHighlighted(this.currentElement.nativeElement), ...(ngDevMode ? [{ debugName: "isHighlighted" }] : /* istanbul ignore next */ []));
|
|
704
729
|
/** Item id, referenced by the popup's `aria-activedescendant`. */
|
|
705
730
|
this.id = injectId('rdx-select-item-');
|
|
706
731
|
this.textId = injectId('rdx-select-item-text-');
|
|
@@ -708,6 +733,13 @@ class RdxSelectItem {
|
|
|
708
733
|
this.contentContext.itemRefCallback(this.currentElement.nativeElement, this.value(), this.disabled());
|
|
709
734
|
});
|
|
710
735
|
this.SELECT_SELECT = 'select.select';
|
|
736
|
+
effect(() => {
|
|
737
|
+
this.listItem.setMetadata({
|
|
738
|
+
value: this.value(),
|
|
739
|
+
disabled: this.disabled(),
|
|
740
|
+
textValue: this.textValue$()
|
|
741
|
+
});
|
|
742
|
+
});
|
|
711
743
|
}
|
|
712
744
|
onPointerUp(event) {
|
|
713
745
|
if (event.defaultPrevented)
|
|
@@ -738,7 +770,7 @@ class RdxSelectItem {
|
|
|
738
770
|
return;
|
|
739
771
|
}
|
|
740
772
|
if (!this.disabled()) {
|
|
741
|
-
this.contentContext.highlightItem(this.
|
|
773
|
+
this.contentContext.highlightItem(this.currentElement.nativeElement);
|
|
742
774
|
}
|
|
743
775
|
}
|
|
744
776
|
handleKeyDown(event) {
|
|
@@ -749,7 +781,7 @@ class RdxSelectItem {
|
|
|
749
781
|
this.onPointerUp(keyEvent);
|
|
750
782
|
}
|
|
751
783
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxSelectItem, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
752
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: RdxSelectItem, isStandalone: true, selector: "[rdxSelectItem]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, textValue: { classPropertyName: "textValue", publicName: "textValue", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "option" }, listeners: { "pointerup": "onPointerUp($event)", "pointerleave": "onPointerLeave($event)", "pointermove": "onPointerMove($event)" }, properties: { "attr.id": "id", "attr.aria-selected": "isSelected()", "attr.aria-disabled": "disabled() ? \"true\" : undefined", "attr.data-state": "isSelected() ? \"checked\" : \"unchecked\"", "attr.data-selected": "isSelected() ? \"\" : undefined", "attr.data-highlighted": "isHighlighted() ? \"\" : undefined", "attr.data-disabled": "disabled() ? \"\" : undefined" } }, providers: [provideSelectItemContext(context)], exportAs: ["rdxSelectItem"], hostDirectives: [{ directive: i4.
|
|
784
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: RdxSelectItem, isStandalone: true, selector: "[rdxSelectItem]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, textValue: { classPropertyName: "textValue", publicName: "textValue", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "option" }, listeners: { "pointerup": "onPointerUp($event)", "pointerleave": "onPointerLeave($event)", "pointermove": "onPointerMove($event)" }, properties: { "attr.id": "id", "attr.aria-selected": "isSelected()", "attr.aria-disabled": "disabled() ? \"true\" : undefined", "attr.data-state": "isSelected() ? \"checked\" : \"unchecked\"", "attr.data-selected": "isSelected() ? \"\" : undefined", "attr.data-highlighted": "isHighlighted() ? \"\" : undefined", "attr.data-disabled": "disabled() ? \"\" : undefined" } }, providers: [provideSelectItemContext(context)], exportAs: ["rdxSelectItem"], hostDirectives: [{ directive: i4.RdxCompositeListItem }], ngImport: i0 }); }
|
|
753
785
|
}
|
|
754
786
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxSelectItem, decorators: [{
|
|
755
787
|
type: Directive,
|
|
@@ -757,12 +789,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
757
789
|
selector: '[rdxSelectItem]',
|
|
758
790
|
exportAs: 'rdxSelectItem',
|
|
759
791
|
providers: [provideSelectItemContext(context)],
|
|
760
|
-
hostDirectives: [
|
|
761
|
-
{
|
|
762
|
-
directive: RdxCollectionItem,
|
|
763
|
-
inputs: ['value', 'disabled']
|
|
764
|
-
}
|
|
765
|
-
],
|
|
792
|
+
hostDirectives: [RdxCompositeListItem],
|
|
766
793
|
host: {
|
|
767
794
|
role: 'option',
|
|
768
795
|
'[attr.id]': 'id',
|
|
@@ -777,7 +804,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
777
804
|
'(pointermove)': 'onPointerMove($event)'
|
|
778
805
|
}
|
|
779
806
|
}]
|
|
780
|
-
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], textValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "textValue", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
|
|
807
|
+
}], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], textValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "textValue", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
|
|
781
808
|
|
|
782
809
|
class RdxSelectItemIndicator {
|
|
783
810
|
constructor() {
|