@radix-ng/primitives 1.0.0-beta.5 → 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.
Files changed (50) hide show
  1. package/composite/README.md +3 -0
  2. package/fesm2022/radix-ng-primitives-accordion.mjs +12 -36
  3. package/fesm2022/radix-ng-primitives-accordion.mjs.map +1 -1
  4. package/fesm2022/radix-ng-primitives-composite.mjs +515 -0
  5. package/fesm2022/radix-ng-primitives-composite.mjs.map +1 -0
  6. package/fesm2022/radix-ng-primitives-drawer.mjs +442 -2
  7. package/fesm2022/radix-ng-primitives-drawer.mjs.map +1 -1
  8. package/fesm2022/radix-ng-primitives-menu.mjs +38 -16
  9. package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
  10. package/fesm2022/radix-ng-primitives-menubar.mjs +68 -36
  11. package/fesm2022/radix-ng-primitives-menubar.mjs.map +1 -1
  12. package/fesm2022/radix-ng-primitives-navigation-menu.mjs +281 -88
  13. package/fesm2022/radix-ng-primitives-navigation-menu.mjs.map +1 -1
  14. package/fesm2022/radix-ng-primitives-popover.mjs +40 -15
  15. package/fesm2022/radix-ng-primitives-popover.mjs.map +1 -1
  16. package/fesm2022/radix-ng-primitives-popper.mjs +73 -65
  17. package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
  18. package/fesm2022/radix-ng-primitives-radio.mjs +63 -27
  19. package/fesm2022/radix-ng-primitives-radio.mjs.map +1 -1
  20. package/fesm2022/radix-ng-primitives-roving-focus.mjs +40 -8
  21. package/fesm2022/radix-ng-primitives-roving-focus.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 +3 -0
  25. package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
  26. package/fesm2022/radix-ng-primitives-tabs.mjs +50 -21
  27. package/fesm2022/radix-ng-primitives-tabs.mjs.map +1 -1
  28. package/fesm2022/radix-ng-primitives-toggle-group.mjs +66 -21
  29. package/fesm2022/radix-ng-primitives-toggle-group.mjs.map +1 -1
  30. package/fesm2022/radix-ng-primitives-toggle.mjs +29 -11
  31. package/fesm2022/radix-ng-primitives-toggle.mjs.map +1 -1
  32. package/fesm2022/radix-ng-primitives-toolbar.mjs +50 -24
  33. package/fesm2022/radix-ng-primitives-toolbar.mjs.map +1 -1
  34. package/navigation-menu/README.md +5 -2
  35. package/package.json +5 -1
  36. package/types/radix-ng-primitives-accordion.d.ts +9 -13
  37. package/types/radix-ng-primitives-composite.d.ts +152 -0
  38. package/types/radix-ng-primitives-drawer.d.ts +40 -2
  39. package/types/radix-ng-primitives-menu.d.ts +5 -3
  40. package/types/radix-ng-primitives-menubar.d.ts +10 -5
  41. package/types/radix-ng-primitives-navigation-menu.d.ts +65 -33
  42. package/types/radix-ng-primitives-popover.d.ts +9 -5
  43. package/types/radix-ng-primitives-popper.d.ts +1 -0
  44. package/types/radix-ng-primitives-radio.d.ts +11 -9
  45. package/types/radix-ng-primitives-roving-focus.d.ts +15 -1
  46. package/types/radix-ng-primitives-scroll-area.d.ts +4 -1
  47. package/types/radix-ng-primitives-tabs.d.ts +8 -5
  48. package/types/radix-ng-primitives-toggle-group.d.ts +27 -16
  49. package/types/radix-ng-primitives-toggle.d.ts +5 -5
  50. package/types/radix-ng-primitives-toolbar.d.ts +22 -14
@@ -14,6 +14,20 @@ import * as i1$1 from '@radix-ng/primitives/portal';
14
14
  import { RdxPortalPresence } from '@radix-ng/primitives/portal';
15
15
  import { provideRdxPresenceContext } from '@radix-ng/primitives/presence';
16
16
  import { isPlatformBrowser } from '@angular/common';
17
+ import * as i2$1 from '@radix-ng/primitives/composite';
18
+ import { RdxCompositeItem } from '@radix-ng/primitives/composite';
19
+
20
+ /** Selector for focusable menu items within a popup. */
21
+ const RDX_MENU_ITEM_SELECTOR = [
22
+ '[rdxMenuItem]:not([data-disabled])',
23
+ '[rdxMenuCheckboxItem]:not([data-disabled])',
24
+ '[rdxMenuRadioItem]:not([data-disabled])',
25
+ '[rdxMenuLinkItem]:not([data-disabled])',
26
+ '[rdxMenuSubTrigger]:not([data-disabled])'
27
+ ].join(',');
28
+ function getFocusableMenuItems(popup) {
29
+ return Array.from(popup.querySelectorAll(RDX_MENU_ITEM_SELECTOR)).filter((item) => item.closest('[rdxMenuPopup]') === popup);
30
+ }
17
31
 
18
32
  const [injectRdxMenuRootContext, provideRdxMenuRootContext] = createContext('RdxMenuRootContext', 'components/menu');
19
33
  function buildContext(instance) {
@@ -177,7 +191,12 @@ class RdxMenuRoot {
177
191
  if (this.effectiveDisabled()) {
178
192
  return;
179
193
  }
180
- this.autoFocus.set(autoFocus === true ? 'first' : autoFocus);
194
+ const nextAutoFocus = autoFocus === true ? 'first' : autoFocus;
195
+ this.autoFocus.set(nextAutoFocus);
196
+ if (this.open()) {
197
+ this.focusOpenPopup(nextAutoFocus);
198
+ return;
199
+ }
181
200
  if (!this.open()) {
182
201
  const change = this.createOpenChangeEvent(true, reason, event);
183
202
  this.onOpenChange.emit(change.payload);
@@ -310,6 +329,22 @@ class RdxMenuRoot {
310
329
  }
311
330
  };
312
331
  }
332
+ focusOpenPopup(autoFocus) {
333
+ if (autoFocus === false) {
334
+ return;
335
+ }
336
+ const popup = this.popupElement();
337
+ if (!popup) {
338
+ return;
339
+ }
340
+ if (autoFocus === 'popup') {
341
+ popup.focus({ preventScroll: true });
342
+ return;
343
+ }
344
+ const items = getFocusableMenuItems(popup);
345
+ const item = autoFocus === 'last' ? items.at(-1) : items[0];
346
+ (item ?? popup).focus({ preventScroll: true });
347
+ }
313
348
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxMenuRoot, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
314
349
  static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: RdxMenuRoot, isStandalone: true, selector: "[rdxMenuRoot],[rdxMenuSubmenuRoot]", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, defaultOpen: { classPropertyName: "defaultOpen", publicName: "defaultOpen", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, modal: { classPropertyName: "modal", publicName: "modal", isSignal: true, isRequired: false, transformFunction: null }, loopFocus: { classPropertyName: "loopFocus", publicName: "loopFocus", isSignal: true, isRequired: false, transformFunction: null }, highlightItemOnHover: { classPropertyName: "highlightItemOnHover", publicName: "highlightItemOnHover", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, dirInput: { classPropertyName: "dirInput", publicName: "dir", isSignal: true, isRequired: false, transformFunction: null }, closeParentOnEsc: { classPropertyName: "closeParentOnEsc", publicName: "closeParentOnEsc", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", onOpenChange: "onOpenChange", onOpenChangeComplete: "onOpenChangeComplete" }, providers: [
315
350
  provideRdxMenuRootContext(contextFactory),
@@ -795,18 +830,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
795
830
  }]
796
831
  }], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], closeOnClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnClick", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], onSelect: [{ type: i0.Output, args: ["onSelect"] }] } });
797
832
 
798
- /** Selector for focusable menu items within a popup. */
799
- const RDX_MENU_ITEM_SELECTOR = [
800
- '[rdxMenuItem]:not([data-disabled])',
801
- '[rdxMenuCheckboxItem]:not([data-disabled])',
802
- '[rdxMenuRadioItem]:not([data-disabled])',
803
- '[rdxMenuLinkItem]:not([data-disabled])',
804
- '[rdxMenuSubTrigger]:not([data-disabled])'
805
- ].join(',');
806
- function getFocusableMenuItems(popup) {
807
- return Array.from(popup.querySelectorAll(RDX_MENU_ITEM_SELECTOR)).filter((item) => item.closest('[rdxMenuPopup]') === popup);
808
- }
809
-
810
833
  /**
811
834
  * A container for the menu contents.
812
835
  */
@@ -2492,18 +2515,17 @@ class RdxMenuTrigger {
2492
2515
  }
2493
2516
  }
2494
2517
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxMenuTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
2495
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: RdxMenuTrigger, isStandalone: true, selector: "[rdxMenuTrigger]", inputs: { nativeButton: { classPropertyName: "nativeButton", publicName: "nativeButton", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, openOnHover: { classPropertyName: "openOnHover", publicName: "openOnHover", isSignal: true, isRequired: false, transformFunction: null }, delay: { classPropertyName: "delay", publicName: "delay", isSignal: true, isRequired: false, transformFunction: null }, closeDelay: { classPropertyName: "closeDelay", publicName: "closeDelay", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "pointerdown": "handlePointerDown($event)", "mousedown": "handleMouseDown($event)", "click": "handleClick($event)", "pointerenter": "handlePointerEnter($event)", "pointermove": "handlePointerMove($event)", "pointerleave": "handlePointerLeave($event)", "keydown.arrowdown": "handleArrowDown($event)", "keydown.arrowup": "handleArrowUp($event)", "keydown.arrowleft": "handleArrowLeft($event)", "keydown.arrowright": "handleArrowRight($event)", "keydown.home": "handleHome($event)", "keydown.end": "handleEnd($event)", "keydown.escape": "handleEscape($event)", "keydown.enter": "handleKeyboardToggle($event)", "keydown.space": "handleKeyboardToggle($event)" }, properties: { "attr.type": "nativeButtonState() ? \"button\" : undefined", "attr.role": "rootContext.hasTriggerInteractionHandler() ? \"menuitem\" : nativeButtonState() ? undefined : \"button\"", "attr.tabindex": "rootContext.hasTriggerInteractionHandler() ? \"-1\" : undefined", "attr.aria-haspopup": "\"menu\"", "attr.aria-expanded": "triggerInteraction.ariaExpanded()", "attr.aria-disabled": "isDisabled() ? true : undefined", "attr.disabled": "nativeButtonState() && isDisabled() ? \"\" : undefined", "attr.data-state": "triggerInteraction.dataState()", "attr.data-disabled": "isDisabled() ? \"\" : undefined", "attr.data-popup-open": "triggerInteraction.dataPopupOpen()", "style.pointer-events": "rootContext.isOpen() && rootContext.modal() ? \"auto\" : undefined" } }, exportAs: ["rdxMenuTrigger"], hostDirectives: [{ directive: i1.RdxPopperAnchor }], ngImport: i0 }); }
2518
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: RdxMenuTrigger, isStandalone: true, selector: "[rdxMenuTrigger]", inputs: { nativeButton: { classPropertyName: "nativeButton", publicName: "nativeButton", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, openOnHover: { classPropertyName: "openOnHover", publicName: "openOnHover", isSignal: true, isRequired: false, transformFunction: null }, delay: { classPropertyName: "delay", publicName: "delay", isSignal: true, isRequired: false, transformFunction: null }, closeDelay: { classPropertyName: "closeDelay", publicName: "closeDelay", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "pointerdown": "handlePointerDown($event)", "mousedown": "handleMouseDown($event)", "click": "handleClick($event)", "pointerenter": "handlePointerEnter($event)", "pointermove": "handlePointerMove($event)", "pointerleave": "handlePointerLeave($event)", "keydown.arrowdown": "handleArrowDown($event)", "keydown.arrowup": "handleArrowUp($event)", "keydown.arrowleft": "handleArrowLeft($event)", "keydown.arrowright": "handleArrowRight($event)", "keydown.home": "handleHome($event)", "keydown.end": "handleEnd($event)", "keydown.escape": "handleEscape($event)", "keydown.enter": "handleKeyboardToggle($event)", "keydown.space": "handleKeyboardToggle($event)" }, properties: { "attr.type": "nativeButtonState() ? \"button\" : undefined", "attr.role": "rootContext.hasTriggerInteractionHandler() ? \"menuitem\" : nativeButtonState() ? undefined : \"button\"", "attr.aria-haspopup": "\"menu\"", "attr.aria-expanded": "triggerInteraction.ariaExpanded()", "attr.aria-disabled": "isDisabled() ? true : undefined", "attr.disabled": "nativeButtonState() && isDisabled() ? \"\" : undefined", "attr.data-state": "triggerInteraction.dataState()", "attr.data-disabled": "isDisabled() ? \"\" : undefined", "attr.data-popup-open": "triggerInteraction.dataPopupOpen()", "style.pointer-events": "rootContext.isOpen() && rootContext.modal() ? \"auto\" : undefined" } }, exportAs: ["rdxMenuTrigger"], hostDirectives: [{ directive: i1.RdxPopperAnchor }, { directive: i2$1.RdxCompositeItem }], ngImport: i0 }); }
2496
2519
  }
2497
2520
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxMenuTrigger, decorators: [{
2498
2521
  type: Directive,
2499
2522
  args: [{
2500
2523
  selector: '[rdxMenuTrigger]',
2501
2524
  exportAs: 'rdxMenuTrigger',
2502
- hostDirectives: [RdxPopperAnchor],
2525
+ hostDirectives: [RdxPopperAnchor, RdxCompositeItem],
2503
2526
  host: {
2504
2527
  '[attr.type]': 'nativeButtonState() ? "button" : undefined',
2505
2528
  '[attr.role]': 'rootContext.hasTriggerInteractionHandler() ? "menuitem" : nativeButtonState() ? undefined : "button"',
2506
- '[attr.tabindex]': 'rootContext.hasTriggerInteractionHandler() ? "-1" : undefined',
2507
2529
  '[attr.aria-haspopup]': '"menu"',
2508
2530
  '[attr.aria-expanded]': 'triggerInteraction.ariaExpanded()',
2509
2531
  '[attr.aria-disabled]': 'isDisabled() ? true : undefined',