@radix-ng/primitives 1.0.0-beta.5 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/composite/README.md +3 -0
  2. package/fesm2022/radix-ng-primitives-accordion.mjs +20 -44
  3. package/fesm2022/radix-ng-primitives-accordion.mjs.map +1 -1
  4. package/fesm2022/radix-ng-primitives-checkbox.mjs +134 -58
  5. package/fesm2022/radix-ng-primitives-checkbox.mjs.map +1 -1
  6. package/fesm2022/radix-ng-primitives-composite.mjs +599 -0
  7. package/fesm2022/radix-ng-primitives-composite.mjs.map +1 -0
  8. package/fesm2022/radix-ng-primitives-drawer.mjs +442 -2
  9. package/fesm2022/radix-ng-primitives-drawer.mjs.map +1 -1
  10. package/fesm2022/radix-ng-primitives-menu.mjs +315 -68
  11. package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
  12. package/fesm2022/radix-ng-primitives-menubar.mjs +91 -36
  13. package/fesm2022/radix-ng-primitives-menubar.mjs.map +1 -1
  14. package/fesm2022/radix-ng-primitives-navigation-menu.mjs +281 -88
  15. package/fesm2022/radix-ng-primitives-navigation-menu.mjs.map +1 -1
  16. package/fesm2022/radix-ng-primitives-popover.mjs +40 -15
  17. package/fesm2022/radix-ng-primitives-popover.mjs.map +1 -1
  18. package/fesm2022/radix-ng-primitives-popper.mjs +73 -65
  19. package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
  20. package/fesm2022/radix-ng-primitives-radio.mjs +63 -27
  21. package/fesm2022/radix-ng-primitives-radio.mjs.map +1 -1
  22. package/fesm2022/radix-ng-primitives-scroll-area.mjs +56 -25
  23. package/fesm2022/radix-ng-primitives-scroll-area.mjs.map +1 -1
  24. package/fesm2022/radix-ng-primitives-select.mjs +59 -29
  25. package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
  26. package/fesm2022/radix-ng-primitives-slider.mjs +57 -13
  27. package/fesm2022/radix-ng-primitives-slider.mjs.map +1 -1
  28. package/fesm2022/radix-ng-primitives-tabs.mjs +335 -73
  29. package/fesm2022/radix-ng-primitives-tabs.mjs.map +1 -1
  30. package/fesm2022/radix-ng-primitives-toggle-group.mjs +66 -21
  31. package/fesm2022/radix-ng-primitives-toggle-group.mjs.map +1 -1
  32. package/fesm2022/radix-ng-primitives-toggle.mjs +29 -11
  33. package/fesm2022/radix-ng-primitives-toggle.mjs.map +1 -1
  34. package/fesm2022/radix-ng-primitives-toolbar.mjs +68 -36
  35. package/fesm2022/radix-ng-primitives-toolbar.mjs.map +1 -1
  36. package/navigation-menu/README.md +5 -2
  37. package/package.json +6 -10
  38. package/types/radix-ng-primitives-accordion.d.ts +12 -16
  39. package/types/radix-ng-primitives-checkbox.d.ts +98 -70
  40. package/types/radix-ng-primitives-composite.d.ts +195 -0
  41. package/types/radix-ng-primitives-drawer.d.ts +40 -2
  42. package/types/radix-ng-primitives-menu.d.ts +46 -16
  43. package/types/radix-ng-primitives-menubar.d.ts +12 -5
  44. package/types/radix-ng-primitives-navigation-menu.d.ts +65 -33
  45. package/types/radix-ng-primitives-popover.d.ts +9 -5
  46. package/types/radix-ng-primitives-popper.d.ts +1 -0
  47. package/types/radix-ng-primitives-radio.d.ts +11 -9
  48. package/types/radix-ng-primitives-scroll-area.d.ts +4 -1
  49. package/types/radix-ng-primitives-select.d.ts +46 -32
  50. package/types/radix-ng-primitives-slider.d.ts +19 -4
  51. package/types/radix-ng-primitives-tabs.d.ts +69 -14
  52. package/types/radix-ng-primitives-toggle-group.d.ts +27 -16
  53. package/types/radix-ng-primitives-toggle.d.ts +5 -5
  54. package/types/radix-ng-primitives-toolbar.d.ts +84 -69
  55. package/collection/README.md +0 -1
  56. package/fesm2022/radix-ng-primitives-collection.mjs +0 -72
  57. package/fesm2022/radix-ng-primitives-collection.mjs.map +0 -1
  58. package/fesm2022/radix-ng-primitives-roving-focus.mjs +0 -388
  59. package/fesm2022/radix-ng-primitives-roving-focus.mjs.map +0 -1
  60. package/roving-focus/README.md +0 -3
  61. package/types/radix-ng-primitives-collection.d.ts +0 -44
  62. package/types/radix-ng-primitives-roving-focus.d.ts +0 -187
@@ -1,5 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, contentChildren, input, booleanAttribute, signal, computed, effect, Directive, NgModule } from '@angular/core';
2
+ import { inject, ElementRef, contentChildren, signal, input, booleanAttribute, computed, effect, Directive, NgModule } from '@angular/core';
3
+ import * as i1 from '@radix-ng/primitives/composite';
4
+ import { RdxCompositeRoot, RdxCompositeList } from '@radix-ng/primitives/composite';
3
5
  import { createContext, provideFloatingTree } from '@radix-ng/primitives/core';
4
6
  import { RdxMenuRoot } from '@radix-ng/primitives/menu';
5
7
 
@@ -25,9 +27,13 @@ let nextMenubarItemId = 0;
25
27
  */
26
28
  class RdxMenubarRoot {
27
29
  constructor() {
28
- this.menuRoots = contentChildren(RdxMenuRoot, ...(ngDevMode ? [{ debugName: "menuRoots" }] : /* istanbul ignore next */ []));
30
+ this.elementRef = inject(ElementRef);
31
+ this.compositeRoot = inject(RdxCompositeRoot, { self: true });
32
+ this.compositeList = inject(RdxCompositeList, { self: true });
33
+ this.menuRoots = contentChildren(RdxMenuRoot, { ...(ngDevMode ? { debugName: "menuRoots" } : /* istanbul ignore next */ {}), descendants: true });
29
34
  this.ids = new WeakMap();
30
35
  this.items = [];
36
+ this.itemsVersion = signal(0, ...(ngDevMode ? [{ debugName: "itemsVersion" }] : /* istanbul ignore next */ []));
31
37
  /** Whether every menubar trigger is disabled. */
32
38
  this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
33
39
  /** Whether arrow-key navigation wraps at the first/last trigger. */
@@ -36,6 +42,21 @@ class RdxMenubarRoot {
36
42
  this.orientation = input('horizontal', ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
37
43
  this.activeId = signal(null, ...(ngDevMode ? [{ debugName: "activeId" }] : /* istanbul ignore next */ []));
38
44
  this.isAnyOpen = computed(() => this.activeId() !== null, ...(ngDevMode ? [{ debugName: "isAnyOpen" }] : /* istanbul ignore next */ []));
45
+ effect(() => {
46
+ this.compositeRoot.setOrientation(this.orientation());
47
+ this.compositeRoot.setLoopFocus(this.loopFocus());
48
+ this.compositeRoot.setEnableHomeAndEndKeys(true);
49
+ });
50
+ effect(() => {
51
+ this.itemsVersion();
52
+ this.syncDisabledIndices();
53
+ this.syncTabIndices();
54
+ });
55
+ effect(() => {
56
+ this.compositeRoot.highlightedIndex();
57
+ this.itemsVersion();
58
+ this.syncTabIndices();
59
+ });
39
60
  effect((onCleanup) => {
40
61
  const roots = this.menuRoots();
41
62
  const registered = [];
@@ -67,13 +88,13 @@ class RdxMenubarRoot {
67
88
  });
68
89
  }
69
90
  registerItem(id, el, open, close, disabled) {
70
- this.items.push({ id, el, root: undefined, open, close, disabled });
71
- // Keep items in DOM order
72
- this.items.sort((a, b) => (a.el.compareDocumentPosition(b.el) & 4 ? -1 : 1));
91
+ this.items.push({ id, el, open, close, disabled });
92
+ this.sortItems();
73
93
  return () => {
74
94
  this.items = this.items.filter((item) => item.id !== id);
75
95
  if (this.activeId() === id)
76
96
  this.activeId.set(null);
97
+ this.markItemsChanged();
77
98
  };
78
99
  }
79
100
  activateItem(id) {
@@ -115,9 +136,19 @@ class RdxMenubarRoot {
115
136
  return true;
116
137
  });
117
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
+ });
118
148
  const unregisterItem = this.registerResolvedItem(id, trigger, root);
119
149
  return () => {
120
150
  unregisterItem();
151
+ unregisterCompositeItem();
121
152
  unregisterTriggerInteraction();
122
153
  unregisterPopupArrowNavigation();
123
154
  };
@@ -129,15 +160,17 @@ class RdxMenubarRoot {
129
160
  root,
130
161
  open: () => root.show(false),
131
162
  close: () => root.close(),
132
- disabled: () => this.disabled() || root.disabled() || el.hasAttribute('disabled')
163
+ disabled: () => this.disabled() ||
164
+ root.disabled() ||
165
+ el.hasAttribute('disabled') ||
166
+ el.getAttribute('aria-disabled') === 'true'
133
167
  });
134
- this.items.sort((a, b) => (a.el.compareDocumentPosition(b.el) & 4 ? -1 : 1));
135
- this.updateTriggerTabStops();
168
+ this.sortItems();
136
169
  return () => {
137
170
  this.items = this.items.filter((item) => item.id !== id);
138
171
  if (this.activeId() === id)
139
172
  this.activeId.set(null);
140
- this.updateTriggerTabStops();
173
+ this.markItemsChanged();
141
174
  };
142
175
  }
143
176
  handleTriggerInteraction(id, root, trigger, interaction) {
@@ -244,33 +277,37 @@ class RdxMenubarRoot {
244
277
  const next = enabled[(nextIndex + enabled.length) % enabled.length];
245
278
  this.focusItem(next, openOnMove);
246
279
  }
247
- handleArrowLeft(event) {
248
- this.handleOpenMenuNavigation(event, -1);
249
- }
250
- handleArrowRight(event) {
251
- this.handleOpenMenuNavigation(event, 1);
252
- }
253
- handleOpenMenuNavigation(event, offset) {
254
- const activeId = this.activeId();
255
- if (!activeId || this.disabled() || !this.hasOpenMenu()) {
256
- return;
257
- }
258
- event.preventDefault();
259
- event.stopPropagation();
260
- event.stopImmediatePropagation();
261
- this.focusAdjacent(activeId, offset, true);
262
- }
263
280
  focusItem(item, openOnMove) {
264
281
  if (!item || this.disabled())
265
282
  return;
266
- item.el.focus();
283
+ this.highlightItem(item);
284
+ item.el.focus({ preventScroll: true });
267
285
  if (openOnMove) {
268
286
  item.open();
269
287
  this.activateItem(item.id);
270
288
  }
271
289
  }
272
- updateTriggerTabStops() {
273
- this.items.forEach((item) => item.el.setAttribute('tabindex', '-1'));
290
+ handleFocusIn(event) {
291
+ const target = event.target;
292
+ if (target === this.elementRef.nativeElement) {
293
+ this.focusItem(this.enabledItems()[0], false);
294
+ return;
295
+ }
296
+ const focusedItem = target instanceof HTMLElement ? this.items.find((item) => item.el === target) : undefined;
297
+ if (!focusedItem || focusedItem.disabled()) {
298
+ return;
299
+ }
300
+ this.highlightItem(focusedItem);
301
+ if (this.hasOpenMenu() && this.activeId() !== focusedItem.id) {
302
+ focusedItem.open();
303
+ this.activateItem(focusedItem.id);
304
+ }
305
+ }
306
+ highlightItem(item) {
307
+ const index = this.items.findIndex((candidate) => candidate.id === item.id);
308
+ if (index !== -1) {
309
+ this.compositeRoot.setHighlightedIndex(index, true);
310
+ }
274
311
  }
275
312
  enabledItems() {
276
313
  return this.items.filter((item) => !item.disabled());
@@ -278,15 +315,34 @@ class RdxMenubarRoot {
278
315
  hasOpenMenu() {
279
316
  return this.items.some((item) => item.root?.open());
280
317
  }
318
+ sortItems() {
319
+ this.items.sort((a, b) => (a.el.compareDocumentPosition(b.el) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1));
320
+ this.markItemsChanged();
321
+ }
322
+ markItemsChanged() {
323
+ this.itemsVersion.update((value) => value + 1);
324
+ }
325
+ syncDisabledIndices() {
326
+ const disabledIndices = this.items
327
+ .map((item, index) => (item.disabled() ? index : -1))
328
+ .filter((index) => index !== -1);
329
+ this.compositeRoot.setDisabledIndices(disabledIndices.length ? disabledIndices : undefined);
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
+ }
281
337
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxMenubarRoot, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
282
- 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", "tabindex": "0" }, listeners: { "keydown.arrowleft": "handleArrowLeft($event)", "keydown.arrowright": "handleArrowRight($event)" }, properties: { "attr.aria-orientation": "orientation()", "attr.data-orientation": "orientation()", "attr.data-disabled": "disabled() ? \"\" : undefined", "attr.data-has-submenu-open": "isAnyOpen() ? \"\" : undefined" } }, providers: [
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: [
283
339
  provideRdxMenubarContext(contextFactory),
284
340
  // One shared floating tree for all child menus (Base UI `Menubar` wraps them in a single
285
341
  // `FloatingTree`). Each `RdxMenuRoot`'s own `provideFloatingTree()` inherits this via skipSelf, so
286
342
  // sibling menubar menus live in the same tree — the dismissal / focus engine can see their
287
343
  // relationships instead of each menu owning an isolated tree.
288
344
  provideFloatingTree()
289
- ], queries: [{ propertyName: "menuRoots", predicate: RdxMenuRoot, isSignal: true }], exportAs: ["rdxMenubarRoot"], ngImport: i0 }); }
345
+ ], queries: [{ propertyName: "menuRoots", predicate: RdxMenuRoot, descendants: true, isSignal: true }], exportAs: ["rdxMenubarRoot"], hostDirectives: [{ directive: i1.RdxCompositeRoot }], ngImport: i0 }); }
290
346
  }
291
347
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxMenubarRoot, decorators: [{
292
348
  type: Directive,
@@ -303,20 +359,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
303
359
  ],
304
360
  host: {
305
361
  role: 'menubar',
306
- tabindex: '0',
307
362
  '[attr.aria-orientation]': 'orientation()',
308
363
  '[attr.data-orientation]': 'orientation()',
309
364
  '[attr.data-disabled]': 'disabled() ? "" : undefined',
310
365
  '[attr.data-has-submenu-open]': 'isAnyOpen() ? "" : undefined',
311
- '(keydown.arrowleft)': 'handleArrowLeft($event)',
312
- '(keydown.arrowright)': 'handleArrowRight($event)'
313
- }
366
+ '(focusin)': 'handleFocusIn($event)'
367
+ },
368
+ hostDirectives: [RdxCompositeRoot]
314
369
  }]
315
- }], ctorParameters: () => [], propDecorators: { menuRoots: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => RdxMenuRoot), { isSignal: true }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], loopFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "loopFocus", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }] } });
370
+ }], ctorParameters: () => [], propDecorators: { menuRoots: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => RdxMenuRoot), { ...{ descendants: true }, isSignal: true }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], loopFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "loopFocus", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }] } });
316
371
 
317
372
  /**
318
373
  * Menubar-specific parts. Triggers use the standard `rdxMenuTrigger` from
319
- * `@radix-ng/primitives/menu`; the menubar root wires them for roving focus,
374
+ * `@radix-ng/primitives/menu`; the menubar root composes them into Composite focus,
320
375
  * hover switching, and ArrowLeft / ArrowRight navigation. The menu popup, items,
321
376
  * checkbox/radio, submenu, separator, etc. also come from `RdxMenuModule`.
322
377
  */
@@ -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 inject,\n input,\n signal,\n Signal\n} from '@angular/core';\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 tabindex: '0',\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 '(keydown.arrowleft)': 'handleArrowLeft($event)',\n '(keydown.arrowright)': 'handleArrowRight($event)'\n }\n})\nexport class RdxMenubarRoot {\n private readonly menuRoots = contentChildren(RdxMenuRoot);\n private readonly ids = new WeakMap<RdxMenuRoot, string>();\n private items: RdxMenubarItem[] = [];\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((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, root: undefined as never, open, close, disabled });\n // Keep items in DOM order\n this.items.sort((a, b) => (a.el.compareDocumentPosition(b.el) & 4 ? -1 : 1));\n return () => {\n this.items = this.items.filter((item) => item.id !== id);\n if (this.activeId() === id) this.activeId.set(null);\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: () => this.disabled() || root.disabled() || el.hasAttribute('disabled')\n });\n this.items.sort((a, b) => (a.el.compareDocumentPosition(b.el) & 4 ? -1 : 1));\n this.updateTriggerTabStops();\n\n return () => {\n this.items = this.items.filter((item) => item.id !== id);\n if (this.activeId() === id) this.activeId.set(null);\n this.updateTriggerTabStops();\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 protected handleArrowLeft(event: Event): void {\n this.handleOpenMenuNavigation(event, -1);\n }\n\n protected handleArrowRight(event: Event): void {\n this.handleOpenMenuNavigation(event, 1);\n }\n\n private handleOpenMenuNavigation(event: Event, offset: 1 | -1): void {\n const activeId = this.activeId();\n\n if (!activeId || this.disabled() || !this.hasOpenMenu()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n (event as KeyboardEvent).stopImmediatePropagation();\n this.focusAdjacent(activeId, offset, true);\n }\n\n private focusItem(item: RdxMenubarItem | undefined, openOnMove: boolean): void {\n if (!item || this.disabled()) return;\n\n item.el.focus();\n if (openOnMove) {\n item.open();\n this.activateItem(item.id);\n }\n }\n\n private updateTriggerTabStops(): void {\n this.items.forEach((item) => item.el.setAttribute('tabindex', '-1'));\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","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 wires them for roving 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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"}