@radix-ng/primitives 1.0.0-beta.4 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) 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-checkbox.mjs +33 -18
  5. package/fesm2022/radix-ng-primitives-checkbox.mjs.map +1 -1
  6. package/fesm2022/radix-ng-primitives-composite.mjs +515 -0
  7. package/fesm2022/radix-ng-primitives-composite.mjs.map +1 -0
  8. package/fesm2022/radix-ng-primitives-core.mjs +7 -0
  9. package/fesm2022/radix-ng-primitives-core.mjs.map +1 -1
  10. package/fesm2022/radix-ng-primitives-dialog.mjs +54 -12
  11. package/fesm2022/radix-ng-primitives-dialog.mjs.map +1 -1
  12. package/fesm2022/radix-ng-primitives-drawer.mjs +442 -2
  13. package/fesm2022/radix-ng-primitives-drawer.mjs.map +1 -1
  14. package/fesm2022/radix-ng-primitives-editable.mjs +12 -7
  15. package/fesm2022/radix-ng-primitives-editable.mjs.map +1 -1
  16. package/fesm2022/radix-ng-primitives-floating-focus-manager.mjs +294 -8
  17. package/fesm2022/radix-ng-primitives-floating-focus-manager.mjs.map +1 -1
  18. package/fesm2022/radix-ng-primitives-focus-scope.mjs +9 -0
  19. package/fesm2022/radix-ng-primitives-focus-scope.mjs.map +1 -1
  20. package/fesm2022/radix-ng-primitives-menu.mjs +71 -20
  21. package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
  22. package/fesm2022/radix-ng-primitives-menubar.mjs +68 -36
  23. package/fesm2022/radix-ng-primitives-menubar.mjs.map +1 -1
  24. package/fesm2022/radix-ng-primitives-navigation-menu.mjs +281 -88
  25. package/fesm2022/radix-ng-primitives-navigation-menu.mjs.map +1 -1
  26. package/fesm2022/radix-ng-primitives-number-field.mjs +7 -2
  27. package/fesm2022/radix-ng-primitives-number-field.mjs.map +1 -1
  28. package/fesm2022/radix-ng-primitives-popover.mjs +117 -35
  29. package/fesm2022/radix-ng-primitives-popover.mjs.map +1 -1
  30. package/fesm2022/radix-ng-primitives-popper.mjs +73 -65
  31. package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
  32. package/fesm2022/radix-ng-primitives-radio.mjs +77 -36
  33. package/fesm2022/radix-ng-primitives-radio.mjs.map +1 -1
  34. package/fesm2022/radix-ng-primitives-roving-focus.mjs +40 -8
  35. package/fesm2022/radix-ng-primitives-roving-focus.mjs.map +1 -1
  36. package/fesm2022/radix-ng-primitives-scroll-area.mjs +56 -25
  37. package/fesm2022/radix-ng-primitives-scroll-area.mjs.map +1 -1
  38. package/fesm2022/radix-ng-primitives-select.mjs +62 -37
  39. package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
  40. package/fesm2022/radix-ng-primitives-slider.mjs +259 -28
  41. package/fesm2022/radix-ng-primitives-slider.mjs.map +1 -1
  42. package/fesm2022/radix-ng-primitives-stepper.mjs +11 -7
  43. package/fesm2022/radix-ng-primitives-stepper.mjs.map +1 -1
  44. package/fesm2022/radix-ng-primitives-switch.mjs +10 -5
  45. package/fesm2022/radix-ng-primitives-switch.mjs.map +1 -1
  46. package/fesm2022/radix-ng-primitives-tabs.mjs +64 -30
  47. package/fesm2022/radix-ng-primitives-tabs.mjs.map +1 -1
  48. package/fesm2022/radix-ng-primitives-toggle-group.mjs +69 -19
  49. package/fesm2022/radix-ng-primitives-toggle-group.mjs.map +1 -1
  50. package/fesm2022/radix-ng-primitives-toggle.mjs +37 -13
  51. package/fesm2022/radix-ng-primitives-toggle.mjs.map +1 -1
  52. package/fesm2022/radix-ng-primitives-toolbar.mjs +50 -24
  53. package/fesm2022/radix-ng-primitives-toolbar.mjs.map +1 -1
  54. package/fesm2022/radix-ng-primitives-tooltip.mjs +180 -35
  55. package/fesm2022/radix-ng-primitives-tooltip.mjs.map +1 -1
  56. package/navigation-menu/README.md +5 -2
  57. package/package.json +5 -1
  58. package/types/radix-ng-primitives-accordion.d.ts +9 -13
  59. package/types/radix-ng-primitives-checkbox.d.ts +27 -15
  60. package/types/radix-ng-primitives-composite.d.ts +152 -0
  61. package/types/radix-ng-primitives-core.d.ts +2 -0
  62. package/types/radix-ng-primitives-dialog.d.ts +13 -2
  63. package/types/radix-ng-primitives-drawer.d.ts +40 -2
  64. package/types/radix-ng-primitives-editable.d.ts +11 -5
  65. package/types/radix-ng-primitives-floating-focus-manager.d.ts +113 -16
  66. package/types/radix-ng-primitives-menu.d.ts +13 -5
  67. package/types/radix-ng-primitives-menubar.d.ts +10 -5
  68. package/types/radix-ng-primitives-navigation-menu.d.ts +65 -33
  69. package/types/radix-ng-primitives-number-field.d.ts +8 -3
  70. package/types/radix-ng-primitives-popover.d.ts +26 -10
  71. package/types/radix-ng-primitives-popper.d.ts +1 -0
  72. package/types/radix-ng-primitives-radio.d.ts +22 -13
  73. package/types/radix-ng-primitives-roving-focus.d.ts +15 -1
  74. package/types/radix-ng-primitives-scroll-area.d.ts +4 -1
  75. package/types/radix-ng-primitives-select.d.ts +16 -20
  76. package/types/radix-ng-primitives-slider.d.ts +60 -9
  77. package/types/radix-ng-primitives-stepper.d.ts +11 -4
  78. package/types/radix-ng-primitives-switch.d.ts +10 -4
  79. package/types/radix-ng-primitives-tabs.d.ts +20 -11
  80. package/types/radix-ng-primitives-toggle-group.d.ts +34 -17
  81. package/types/radix-ng-primitives-toggle.d.ts +14 -7
  82. package/types/radix-ng-primitives-toolbar.d.ts +22 -14
  83. package/types/radix-ng-primitives-tooltip.d.ts +38 -14
@@ -1,16 +1,15 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, model, signal, computed, ElementRef, input, booleanAttribute, output, untracked, effect, Directive, InjectionToken, Injector, DestroyRef, afterNextRender, linkedSignal, isDevMode, forwardRef } from '@angular/core';
3
3
  import * as i3 from '@radix-ng/primitives/core';
4
- import { isEqual, getActiveElement, createContext, createFloatingRootContext, useTransitionStatus, isNullish, provideFloatingTree, provideFloatingRootContext, injectId, RDX_FLOATING_ROOT_CONTEXT, RDX_FLOATING_REGISTRATION, useListHighlight, useAnchoredScrollLock, RdxFloatingNodeRegistration, handleAndDispatchCustomEvent, rdxDevError, setupInternalBackdrop } from '@radix-ng/primitives/core';
4
+ import { isEqual, getActiveElement, createContext, injectId, createFloatingRootContext, useTransitionStatus, isNullish, createCancelableChangeEventDetails, provideFloatingTree, provideFloatingRootContext, RDX_FLOATING_ROOT_CONTEXT, RDX_FLOATING_REGISTRATION, useListHighlight, useAnchoredScrollLock, RdxFloatingNodeRegistration, handleAndDispatchCustomEvent, rdxDevError, setupInternalBackdrop } from '@radix-ng/primitives/core';
5
5
  import { injectDirection } from '@radix-ng/primitives/direction-provider';
6
- import { getInteractionTypeFromEvent } from '@radix-ng/primitives/floating-focus-manager';
6
+ import * as i2 from '@radix-ng/primitives/floating-focus-manager';
7
+ import { getInteractionTypeFromEvent, provideFloatingFocusManagerConfig, RdxFloatingFocusManager, createRdxTriggerInteraction } from '@radix-ng/primitives/floating-focus-manager';
7
8
  import * as i1 from '@radix-ng/primitives/popper';
8
9
  import { RdxPopper, RdxPopperContent, RdxPopperContentWrapper, legacyPopperVars, provideRdxPopperContentWrapper, provideRdxPopperContentConfig, RdxPopperAnchor } from '@radix-ng/primitives/popper';
9
10
  import * as i4 from '@radix-ng/primitives/collection';
10
11
  import { RdxCollectionProvider, RdxCollectionItem } from '@radix-ng/primitives/collection';
11
12
  import { RdxDismiss } from '@radix-ng/primitives/dismissable-layer';
12
- import * as i2 from '@radix-ng/primitives/focus-scope';
13
- import { RdxFocusScope } from '@radix-ng/primitives/focus-scope';
14
13
  import * as i1$1 from '@radix-ng/primitives/portal';
15
14
  import { RdxPortalPresence } from '@radix-ng/primitives/portal';
16
15
  import { provideRdxPresenceContext } from '@radix-ng/primitives/presence';
@@ -53,24 +52,13 @@ function focusFirst(candidates) {
53
52
  }
54
53
  }
55
54
 
56
- function createChangeEventDetails(reason, event) {
57
- let canceled = false;
58
- return {
59
- reason,
60
- event,
61
- cancel: () => {
62
- canceled = true;
63
- },
64
- isCanceled: () => canceled
65
- };
66
- }
67
55
  const context$2 = () => {
68
56
  const context = inject(RdxSelectRoot);
69
57
  return {
70
58
  triggerElement: context.triggerElement,
71
59
  valueElement: context.valueElement,
72
60
  triggerPointerDownPosRef: context.triggerPointerDownPosRef,
73
- contentId: '',
61
+ contentId: context.contentId,
74
62
  dir: context.dir,
75
63
  value: context.value,
76
64
  multiple: context.multiple,
@@ -113,6 +101,7 @@ const context$2 = () => {
113
101
  const [injectSelectRootContext, provideSelectRootContext] = createContext('RdxSelectRootContext', 'components/select');
114
102
  class RdxSelectRoot {
115
103
  constructor() {
104
+ this.contentId = injectId('rdx-select-content-');
116
105
  this.open = model(false, ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
117
106
  /** Whether the current open was initiated by **touch** (ADR 0016 §3 — gates the anchored scroll lock). */
118
107
  this.openedByTouch = signal(false, ...(ngDevMode ? [{ debugName: "openedByTouch" }] : /* istanbul ignore next */ []));
@@ -212,7 +201,7 @@ class RdxSelectRoot {
212
201
  return [...array];
213
202
  })()
214
203
  : value;
215
- const eventDetails = createChangeEventDetails(reason, event);
204
+ const { eventDetails } = createCancelableChangeEventDetails(reason, event, this.triggerElement() ?? undefined);
216
205
  this.onValueChange.emit({ value: nextValue, eventDetails });
217
206
  if (eventDetails.isCanceled()) {
218
207
  return false;
@@ -228,7 +217,7 @@ class RdxSelectRoot {
228
217
  setOpen(open, reason = 'none', event) {
229
218
  const resolvedEvent = event ?? new Event('select.open-change');
230
219
  const interactionType = getInteractionTypeFromEvent(event);
231
- const eventDetails = createChangeEventDetails(reason, resolvedEvent);
220
+ const { eventDetails } = createCancelableChangeEventDetails(reason, resolvedEvent, this.triggerElement() ?? undefined);
232
221
  this.onOpenChange.emit({ open, eventDetails });
233
222
  if (eventDetails.isCanceled()) {
234
223
  return false;
@@ -498,20 +487,7 @@ class RdxSelectPopup {
498
487
  onPointerDownOutside: (event) => this.pointerDownOutside.emit(event),
499
488
  onDismiss: (reason, event) => this.rootContext.onOpenChange(false, reason === 'escape-key' ? 'escape-key' : reason === 'focus-outside' ? 'focus-out' : 'outside-press', event)
500
489
  });
501
- const focusScope = inject(RdxFocusScope);
502
490
  afterNextRender(() => {
503
- focusScope.unmountAutoFocus.subscribe((event) => {
504
- if (event.defaultPrevented)
505
- return;
506
- this.rootContext.triggerElement()?.focus({ preventScroll: true });
507
- event.preventDefault();
508
- });
509
- // Focus the popup itself (not an item) — the listbox is the focus owner; items are
510
- // navigated virtually via aria-activedescendant.
511
- focusScope.mountAutoFocus.subscribe((event) => {
512
- event.preventDefault();
513
- this.content()?.focus({ preventScroll: true });
514
- });
515
491
  // The popup is now the listbox host itself (no longer the positioner's first child).
516
492
  this.content.set(this.currentElement.nativeElement);
517
493
  });
@@ -632,14 +608,51 @@ class RdxSelectPopup {
632
608
  }
633
609
  }
634
610
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxSelectPopup, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
635
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.9", type: RdxSelectPopup, isStandalone: true, selector: "[rdxSelectPopup]", outputs: { escapeKeyDown: "escapeKeyDown", pointerDownOutside: "pointerDownOutside" }, host: { attributes: { "role": "listbox", "tabindex": "-1" }, listeners: { "keydown": "handleKeyDown($event)" }, properties: { "id": "rootContext.contentId", "attr.aria-activedescendant": "highlight.activeId()", "attr.aria-multiselectable": "rootContext.multiple() ? \"true\" : undefined", "attr.data-state": "rootContext.open() ? \"open\" : \"closed\"", "attr.data-open": "rootContext.open() ? \"\" : undefined", "attr.data-closed": "rootContext.open() ? undefined : \"\"", "attr.data-starting-style": "rootContext.transitionStatus() === \"starting\" ? \"\" : undefined", "attr.data-ending-style": "rootContext.transitionStatus() === \"ending\" ? \"\" : undefined", "dir": "rootContext.dir()", "style": "{\n display: 'flex',\n flexDirection: 'column',\n outline: 'none'\n }" } }, providers: [provideSelectPopupContext(context$1)], hostDirectives: [{ directive: i1.RdxPopperContent }, { directive: i2.RdxFocusScope }, { directive: i3.RdxFloatingNodeRegistration }, { directive: i4.RdxCollectionProvider }], ngImport: i0 }); }
611
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.9", type: RdxSelectPopup, isStandalone: true, selector: "[rdxSelectPopup]", outputs: { escapeKeyDown: "escapeKeyDown", pointerDownOutside: "pointerDownOutside" }, host: { attributes: { "role": "listbox", "tabindex": "-1" }, listeners: { "keydown": "handleKeyDown($event)" }, properties: { "id": "rootContext.contentId", "attr.aria-activedescendant": "highlight.activeId()", "attr.aria-multiselectable": "rootContext.multiple() ? \"true\" : undefined", "attr.data-state": "rootContext.open() ? \"open\" : \"closed\"", "attr.data-open": "rootContext.open() ? \"\" : undefined", "attr.data-closed": "rootContext.open() ? undefined : \"\"", "attr.data-starting-style": "rootContext.transitionStatus() === \"starting\" ? \"\" : undefined", "attr.data-ending-style": "rootContext.transitionStatus() === \"ending\" ? \"\" : undefined", "dir": "rootContext.dir()", "style": "{\n display: 'flex',\n flexDirection: 'column',\n outline: 'none'\n }" } }, providers: [
612
+ provideSelectPopupContext(context$1),
613
+ provideFloatingFocusManagerConfig(() => {
614
+ const rootContext = injectSelectRootContext();
615
+ const host = inject(ElementRef).nativeElement;
616
+ return {
617
+ modal: () => false,
618
+ enabled: () => rootContext.open() || rootContext.transitionStatus() === 'ending',
619
+ closeOnFocusOut: () => false,
620
+ // The listbox owns DOM focus; items are navigated virtually through aria-activedescendant.
621
+ initialFocus: () => host,
622
+ restoreFocus: () => true,
623
+ openInteractionType: () => rootContext.openInteractionType(),
624
+ closeInteractionType: () => rootContext.closeInteractionType()
625
+ };
626
+ })
627
+ ], hostDirectives: [{ directive: i1.RdxPopperContent }, { directive: i2.RdxFloatingFocusManager, inputs: ["returnFocus", "finalFocus"] }, { directive: i3.RdxFloatingNodeRegistration }, { directive: i4.RdxCollectionProvider }], ngImport: i0 }); }
636
628
  }
637
629
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxSelectPopup, decorators: [{
638
630
  type: Directive,
639
631
  args: [{
640
632
  selector: '[rdxSelectPopup]',
641
- hostDirectives: [RdxPopperContent, RdxFocusScope, RdxFloatingNodeRegistration, RdxCollectionProvider],
642
- providers: [provideSelectPopupContext(context$1)],
633
+ hostDirectives: [
634
+ RdxPopperContent,
635
+ { directive: RdxFloatingFocusManager, inputs: ['returnFocus: finalFocus'] },
636
+ RdxFloatingNodeRegistration,
637
+ RdxCollectionProvider
638
+ ],
639
+ providers: [
640
+ provideSelectPopupContext(context$1),
641
+ provideFloatingFocusManagerConfig(() => {
642
+ const rootContext = injectSelectRootContext();
643
+ const host = inject(ElementRef).nativeElement;
644
+ return {
645
+ modal: () => false,
646
+ enabled: () => rootContext.open() || rootContext.transitionStatus() === 'ending',
647
+ closeOnFocusOut: () => false,
648
+ // The listbox owns DOM focus; items are navigated virtually through aria-activedescendant.
649
+ initialFocus: () => host,
650
+ restoreFocus: () => true,
651
+ openInteractionType: () => rootContext.openInteractionType(),
652
+ closeInteractionType: () => rootContext.closeInteractionType()
653
+ };
654
+ })
655
+ ],
643
656
  host: {
644
657
  role: 'listbox',
645
658
  tabindex: '-1',
@@ -978,6 +991,13 @@ class RdxSelectTrigger {
978
991
  this.id = input(injectId('rdx-select-trigger-'), ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
979
992
  this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
980
993
  this.isDisabled = computed(() => this.rootContext.disabled() || this.disabled() || Boolean(this.fieldRootContext?.disabledState()), ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
994
+ this.triggerInteraction = createRdxTriggerInteraction({
995
+ trigger: () => this.elementRef.nativeElement,
996
+ activeTrigger: () => this.rootContext.triggerElement(),
997
+ open: () => this.rootContext.open(),
998
+ disabled: () => this.isDisabled(),
999
+ contentId: () => this.rootContext.contentId
1000
+ });
981
1001
  this.invalidState = computed(() => Boolean(this.fieldRootContext?.invalidState()), ...(ngDevMode ? [{ debugName: "invalidState" }] : /* istanbul ignore next */ []));
982
1002
  this.requiredState = computed(() => Boolean(this.fieldRootContext?.requiredState()), ...(ngDevMode ? [{ debugName: "requiredState" }] : /* istanbul ignore next */ []));
983
1003
  this.filledState = computed(() => !this.rootContext.isEmptyModelValue() || Boolean(this.fieldRootContext?.filledState()), ...(ngDevMode ? [{ debugName: "filledState" }] : /* istanbul ignore next */ []));
@@ -1020,10 +1040,14 @@ class RdxSelectTrigger {
1020
1040
  // We force `focus` in this case. Note: this doesn't create any other side-effect
1021
1041
  // because we are preventing default in `onPointerDown` so effectively
1022
1042
  // this only runs for a label 'click'
1043
+ if (this.rootContext.open()) {
1044
+ return;
1045
+ }
1023
1046
  event?.currentTarget?.focus();
1024
1047
  }
1025
1048
  onPointerDown(event) {
1026
1049
  const pointerEvent = event;
1050
+ this.triggerInteraction.recordPointerDown(pointerEvent);
1027
1051
  if (pointerEvent.pointerType === 'touch')
1028
1052
  return event.preventDefault();
1029
1053
  // prevent implicit pointer capture
@@ -1063,7 +1087,7 @@ class RdxSelectTrigger {
1063
1087
  this.fieldRootContext?.setTouched(true);
1064
1088
  }
1065
1089
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxSelectTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1066
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: RdxSelectTrigger, isStandalone: true, selector: "button[rdxSelectTrigger]", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "combobox", "type": "button" }, listeners: { "click": "onClickHandler($event)", "pointerdown": "onPointerDown($event)", "pointerup": "onPointerUp($event)", "keydown": "onKeydown($event)", "focus": "onFocus()", "blur": "onBlur()" }, properties: { "attr.id": "id()", "attr.aria-describedby": "describedBy()", "attr.aria-invalid": "invalidState() ? \"true\" : undefined", "attr.aria-required": "requiredState() ? \"true\" : undefined", "attr.disabled": "isDisabled() ? \"\" : undefined", "dir": "rootContext.dir()", "attr.data-state": "rootContext.open() ? \"open\" : \"closed\"", "attr.data-popup-open": "dataAttr(rootContext.open())", "attr.data-placeholder": "dataAttr(rootContext.isEmptyModelValue())", "attr.data-disabled": "dataAttr(isDisabled())", "attr.data-invalid": "dataAttr(invalidState())", "attr.data-valid": "dataAttr(!invalidState())", "attr.data-required": "dataAttr(requiredState())", "attr.data-filled": "dataAttr(filledState())", "attr.data-focused": "dataAttr(focusedState())" } }, hostDirectives: [{ directive: i1.RdxPopperAnchor }], ngImport: i0 }); }
1090
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: RdxSelectTrigger, isStandalone: true, selector: "button[rdxSelectTrigger]", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "combobox", "type": "button" }, listeners: { "click": "onClickHandler($event)", "pointerdown": "onPointerDown($event)", "pointerup": "onPointerUp($event)", "keydown": "onKeydown($event)", "focus": "onFocus()", "blur": "onBlur()" }, properties: { "attr.id": "id()", "attr.aria-describedby": "describedBy()", "attr.aria-controls": "triggerInteraction.ariaControls()", "attr.aria-invalid": "invalidState() ? \"true\" : undefined", "attr.aria-required": "requiredState() ? \"true\" : undefined", "attr.disabled": "isDisabled() ? \"\" : undefined", "dir": "rootContext.dir()", "attr.data-state": "triggerInteraction.dataState()", "attr.data-popup-open": "triggerInteraction.dataPopupOpen()", "attr.data-placeholder": "dataAttr(rootContext.isEmptyModelValue())", "attr.data-disabled": "dataAttr(isDisabled())", "attr.data-invalid": "dataAttr(invalidState())", "attr.data-valid": "dataAttr(!invalidState())", "attr.data-required": "dataAttr(requiredState())", "attr.data-filled": "dataAttr(filledState())", "attr.data-focused": "dataAttr(focusedState())" } }, hostDirectives: [{ directive: i1.RdxPopperAnchor }], ngImport: i0 }); }
1067
1091
  }
1068
1092
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxSelectTrigger, decorators: [{
1069
1093
  type: Directive,
@@ -1075,12 +1099,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
1075
1099
  type: 'button',
1076
1100
  '[attr.id]': 'id()',
1077
1101
  '[attr.aria-describedby]': 'describedBy()',
1102
+ '[attr.aria-controls]': 'triggerInteraction.ariaControls()',
1078
1103
  '[attr.aria-invalid]': 'invalidState() ? "true" : undefined',
1079
1104
  '[attr.aria-required]': 'requiredState() ? "true" : undefined',
1080
1105
  '[attr.disabled]': 'isDisabled() ? "" : undefined',
1081
1106
  '[dir]': 'rootContext.dir()',
1082
- '[attr.data-state]': 'rootContext.open() ? "open" : "closed"',
1083
- '[attr.data-popup-open]': 'dataAttr(rootContext.open())',
1107
+ '[attr.data-state]': 'triggerInteraction.dataState()',
1108
+ '[attr.data-popup-open]': 'triggerInteraction.dataPopupOpen()',
1084
1109
  '[attr.data-placeholder]': 'dataAttr(rootContext.isEmptyModelValue())',
1085
1110
  '[attr.data-disabled]': 'dataAttr(isDisabled())',
1086
1111
  '[attr.data-invalid]': 'dataAttr(invalidState())',