ng-primitives 0.110.2 → 0.111.0
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.
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { createOverlay, injectOverlay, coerceOffset, coerceFlip, coerceShift } from 'ng-primitives/portal';
|
|
2
2
|
export { injectOverlayContext as injectMenuContext } from 'ng-primitives/portal';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { InjectionToken, inject, Injector, ViewContainerRef, signal, computed, effect, input, booleanAttribute, Directive, numberAttribute } from '@angular/core';
|
|
4
|
+
import { InjectionToken, inject, Injector, ViewContainerRef, signal, computed, effect, input, booleanAttribute, Directive, output, numberAttribute } from '@angular/core';
|
|
5
5
|
import { ngpRovingFocusItem, provideRovingFocusItemState, ngpRovingFocusGroup, provideRovingFocusGroupState } from 'ng-primitives/roving-focus';
|
|
6
6
|
import { ngpButton } from 'ng-primitives/button';
|
|
7
7
|
import { injectElementRef } from 'ng-primitives/internal';
|
|
8
|
-
import { createPrimitive, controlled, attrBinding, dataBinding, listener, deprecatedSetter, styleBinding } from 'ng-primitives/state';
|
|
8
|
+
import { createPrimitive, controlled, attrBinding, dataBinding, listener, deprecatedSetter, styleBinding, emitter } from 'ng-primitives/state';
|
|
9
9
|
import { Directionality } from '@angular/cdk/bidi';
|
|
10
10
|
import { ngpFocusTrap, provideFocusTrapState } from 'ng-primitives/focus-trap';
|
|
11
11
|
import { Subject } from 'rxjs';
|
|
@@ -694,13 +694,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImpor
|
|
|
694
694
|
}]
|
|
695
695
|
}], propDecorators: { menu: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpSubmenuTrigger", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpSubmenuTriggerDisabled", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpSubmenuTriggerPlacement", required: false }] }], offset: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpSubmenuTriggerOffset", required: false }] }], flip: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpSubmenuTriggerFlip", required: false }] }] } });
|
|
696
696
|
|
|
697
|
-
const [NgpMenuItemStateToken, ngpMenuItem, injectMenuItemState, provideMenuItemState] = createPrimitive('NgpMenuItem', ({ disabled = signal(false) }) => {
|
|
697
|
+
const [NgpMenuItemStateToken, ngpMenuItem, injectMenuItemState, provideMenuItemState] = createPrimitive('NgpMenuItem', ({ disabled = signal(false), closeOnSelect = signal(true), role = 'menuitem', }) => {
|
|
698
698
|
const element = injectElementRef();
|
|
699
699
|
const injector = inject(Injector);
|
|
700
700
|
const parentMenu = injectMenuState({ optional: true });
|
|
701
701
|
ngpButton({ disabled });
|
|
702
702
|
// Host bindings
|
|
703
|
-
attrBinding(element, 'role',
|
|
703
|
+
attrBinding(element, 'role', role);
|
|
704
704
|
// Event listeners
|
|
705
705
|
listener(element, 'click', onClick);
|
|
706
706
|
listener(element, 'keydown', handleArrowKey);
|
|
@@ -711,7 +711,8 @@ const [NgpMenuItemStateToken, ngpMenuItem, injectMenuItemState, provideMenuItemS
|
|
|
711
711
|
const trigger = injector.get(NgpSubmenuTrigger, null, { self: true, optional: true });
|
|
712
712
|
const origin = event.detail === 0 ? 'keyboard' : 'mouse';
|
|
713
713
|
// if this is a submenu trigger, we don't want to close the menu, we want to open the submenu
|
|
714
|
-
if (
|
|
714
|
+
// if closeOnSelect is false, we don't want to close the menu (e.g., checkbox/radio items)
|
|
715
|
+
if (!trigger && closeOnSelect()) {
|
|
715
716
|
parentMenu()?.closeAllMenus(origin);
|
|
716
717
|
}
|
|
717
718
|
}
|
|
@@ -754,11 +755,17 @@ class NgpMenuItem {
|
|
|
754
755
|
alias: 'ngpMenuItemDisabled',
|
|
755
756
|
transform: booleanAttribute,
|
|
756
757
|
}]));
|
|
757
|
-
|
|
758
|
+
/** Whether the menu should close when this item is selected */
|
|
759
|
+
this.closeOnSelect = input(true, ...(ngDevMode ? [{ debugName: "closeOnSelect", alias: 'ngpMenuItemCloseOnSelect',
|
|
760
|
+
transform: booleanAttribute }] : [{
|
|
761
|
+
alias: 'ngpMenuItemCloseOnSelect',
|
|
762
|
+
transform: booleanAttribute,
|
|
763
|
+
}]));
|
|
764
|
+
ngpMenuItem({ disabled: this.disabled, closeOnSelect: this.closeOnSelect });
|
|
758
765
|
ngpRovingFocusItem({ disabled: this.disabled });
|
|
759
766
|
}
|
|
760
767
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NgpMenuItem, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
761
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.9", type: NgpMenuItem, isStandalone: true, selector: "[ngpMenuItem]", inputs: { disabled: { classPropertyName: "disabled", publicName: "ngpMenuItemDisabled", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideMenuItemState(), provideRovingFocusItemState()], exportAs: ["ngpMenuItem"], ngImport: i0 }); }
|
|
768
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.9", type: NgpMenuItem, isStandalone: true, selector: "[ngpMenuItem]", inputs: { disabled: { classPropertyName: "disabled", publicName: "ngpMenuItemDisabled", isSignal: true, isRequired: false, transformFunction: null }, closeOnSelect: { classPropertyName: "closeOnSelect", publicName: "ngpMenuItemCloseOnSelect", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideMenuItemState(), provideRovingFocusItemState()], exportAs: ["ngpMenuItem"], ngImport: i0 }); }
|
|
762
769
|
}
|
|
763
770
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NgpMenuItem, decorators: [{
|
|
764
771
|
type: Directive,
|
|
@@ -767,7 +774,200 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImpor
|
|
|
767
774
|
exportAs: 'ngpMenuItem',
|
|
768
775
|
providers: [provideMenuItemState(), provideRovingFocusItemState()],
|
|
769
776
|
}]
|
|
770
|
-
}], ctorParameters: () => [], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpMenuItemDisabled", required: false }] }] } });
|
|
777
|
+
}], ctorParameters: () => [], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpMenuItemDisabled", required: false }] }], closeOnSelect: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpMenuItemCloseOnSelect", required: false }] }] } });
|
|
778
|
+
|
|
779
|
+
const [NgpMenuItemCheckboxStateToken, ngpMenuItemCheckbox, injectMenuItemCheckboxState, provideMenuItemCheckboxState,] = createPrimitive('NgpMenuItemCheckbox', ({ checked: _checked = signal(false), disabled = signal(false), onCheckedChange, }) => {
|
|
780
|
+
const element = injectElementRef();
|
|
781
|
+
const checked = controlled(_checked);
|
|
782
|
+
const checkedChange = emitter();
|
|
783
|
+
// Use base menu item behavior but don't close on select
|
|
784
|
+
ngpMenuItem({ disabled, closeOnSelect: signal(false), role: 'menuitemcheckbox' });
|
|
785
|
+
// Host bindings
|
|
786
|
+
attrBinding(element, 'aria-checked', checked);
|
|
787
|
+
dataBinding(element, 'data-checked', checked);
|
|
788
|
+
// Toggle on click
|
|
789
|
+
listener(element, 'click', () => toggle());
|
|
790
|
+
function toggle() {
|
|
791
|
+
if (disabled()) {
|
|
792
|
+
return;
|
|
793
|
+
}
|
|
794
|
+
const nextChecked = !checked();
|
|
795
|
+
checked.set(nextChecked);
|
|
796
|
+
onCheckedChange?.(nextChecked);
|
|
797
|
+
checkedChange.emit(nextChecked);
|
|
798
|
+
}
|
|
799
|
+
return {
|
|
800
|
+
checked,
|
|
801
|
+
checkedChange: checkedChange.asObservable(),
|
|
802
|
+
toggle,
|
|
803
|
+
};
|
|
804
|
+
});
|
|
805
|
+
|
|
806
|
+
/**
|
|
807
|
+
* The `NgpMenuItemCheckbox` directive represents a menu item that can be toggled on and off.
|
|
808
|
+
*/
|
|
809
|
+
class NgpMenuItemCheckbox {
|
|
810
|
+
constructor() {
|
|
811
|
+
/** Whether the checkbox is checked */
|
|
812
|
+
this.checked = input(false, ...(ngDevMode ? [{ debugName: "checked", alias: 'ngpMenuItemCheckboxChecked',
|
|
813
|
+
transform: booleanAttribute }] : [{
|
|
814
|
+
alias: 'ngpMenuItemCheckboxChecked',
|
|
815
|
+
transform: booleanAttribute,
|
|
816
|
+
}]));
|
|
817
|
+
/** Event emitted when the checked state changes */
|
|
818
|
+
this.checkedChange = output({
|
|
819
|
+
alias: 'ngpMenuItemCheckboxCheckedChange',
|
|
820
|
+
});
|
|
821
|
+
/** Whether the menu item checkbox is disabled */
|
|
822
|
+
this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", alias: 'ngpMenuItemCheckboxDisabled',
|
|
823
|
+
transform: booleanAttribute }] : [{
|
|
824
|
+
alias: 'ngpMenuItemCheckboxDisabled',
|
|
825
|
+
transform: booleanAttribute,
|
|
826
|
+
}]));
|
|
827
|
+
ngpMenuItemCheckbox({
|
|
828
|
+
checked: this.checked,
|
|
829
|
+
disabled: this.disabled,
|
|
830
|
+
onCheckedChange: value => this.checkedChange.emit(value),
|
|
831
|
+
});
|
|
832
|
+
ngpRovingFocusItem({ disabled: this.disabled });
|
|
833
|
+
}
|
|
834
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NgpMenuItemCheckbox, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
835
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.9", type: NgpMenuItemCheckbox, isStandalone: true, selector: "[ngpMenuItemCheckbox]", inputs: { checked: { classPropertyName: "checked", publicName: "ngpMenuItemCheckboxChecked", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "ngpMenuItemCheckboxDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checkedChange: "ngpMenuItemCheckboxCheckedChange" }, providers: [provideMenuItemCheckboxState(), provideRovingFocusItemState()], exportAs: ["ngpMenuItemCheckbox"], ngImport: i0 }); }
|
|
836
|
+
}
|
|
837
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NgpMenuItemCheckbox, decorators: [{
|
|
838
|
+
type: Directive,
|
|
839
|
+
args: [{
|
|
840
|
+
selector: '[ngpMenuItemCheckbox]',
|
|
841
|
+
exportAs: 'ngpMenuItemCheckbox',
|
|
842
|
+
providers: [provideMenuItemCheckboxState(), provideRovingFocusItemState()],
|
|
843
|
+
}]
|
|
844
|
+
}], ctorParameters: () => [], propDecorators: { checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpMenuItemCheckboxChecked", required: false }] }], checkedChange: [{ type: i0.Output, args: ["ngpMenuItemCheckboxCheckedChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpMenuItemCheckboxDisabled", required: false }] }] } });
|
|
845
|
+
|
|
846
|
+
const [NgpMenuItemRadioGroupStateToken, ngpMenuItemRadioGroup, injectMenuItemRadioGroupState, provideMenuItemRadioGroupState,] = createPrimitive('NgpMenuItemRadioGroup', ({ value: _value = signal(null), onValueChange, }) => {
|
|
847
|
+
const element = injectElementRef();
|
|
848
|
+
const value = controlled(_value);
|
|
849
|
+
const valueChange = emitter();
|
|
850
|
+
// Host bindings
|
|
851
|
+
attrBinding(element, 'role', 'group');
|
|
852
|
+
function select(newValue) {
|
|
853
|
+
if (value() === newValue) {
|
|
854
|
+
return;
|
|
855
|
+
}
|
|
856
|
+
value.set(newValue);
|
|
857
|
+
onValueChange?.(newValue);
|
|
858
|
+
valueChange.emit(newValue);
|
|
859
|
+
}
|
|
860
|
+
return {
|
|
861
|
+
value,
|
|
862
|
+
valueChange: valueChange.asObservable(),
|
|
863
|
+
select,
|
|
864
|
+
};
|
|
865
|
+
});
|
|
866
|
+
|
|
867
|
+
const [NgpMenuItemRadioStateToken, ngpMenuItemRadio, injectMenuItemRadioState, provideMenuItemRadioState,] = createPrimitive('NgpMenuItemRadio', ({ value, disabled = signal(false) }) => {
|
|
868
|
+
const element = injectElementRef();
|
|
869
|
+
const radioGroup = injectMenuItemRadioGroupState();
|
|
870
|
+
// Use base menu item behavior but don't close on select
|
|
871
|
+
ngpMenuItem({ disabled, closeOnSelect: signal(false), role: 'menuitemradio' });
|
|
872
|
+
// Computed checked state
|
|
873
|
+
const checked = computed(() => radioGroup()?.value() === value(), ...(ngDevMode ? [{ debugName: "checked" }] : []));
|
|
874
|
+
// Host bindings
|
|
875
|
+
attrBinding(element, 'aria-checked', checked);
|
|
876
|
+
dataBinding(element, 'data-checked', checked);
|
|
877
|
+
// Select on click
|
|
878
|
+
listener(element, 'click', () => {
|
|
879
|
+
if (disabled()) {
|
|
880
|
+
return;
|
|
881
|
+
}
|
|
882
|
+
radioGroup()?.select(value());
|
|
883
|
+
});
|
|
884
|
+
return {
|
|
885
|
+
checked,
|
|
886
|
+
};
|
|
887
|
+
});
|
|
888
|
+
|
|
889
|
+
/**
|
|
890
|
+
* The `NgpMenuItemIndicator` directive renders inside a checkbox or radio menu item
|
|
891
|
+
* and exposes `data-checked` based on the parent item's checked state.
|
|
892
|
+
*/
|
|
893
|
+
class NgpMenuItemIndicator {
|
|
894
|
+
constructor() {
|
|
895
|
+
const element = injectElementRef();
|
|
896
|
+
const checkboxState = injectMenuItemCheckboxState({ optional: true });
|
|
897
|
+
const radioState = injectMenuItemRadioState({ optional: true });
|
|
898
|
+
const checked = computed(() => checkboxState()?.checked() ?? radioState()?.checked() ?? false, ...(ngDevMode ? [{ debugName: "checked" }] : []));
|
|
899
|
+
dataBinding(element, 'data-checked', checked);
|
|
900
|
+
}
|
|
901
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NgpMenuItemIndicator, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
902
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.9", type: NgpMenuItemIndicator, isStandalone: true, selector: "[ngpMenuItemIndicator]", exportAs: ["ngpMenuItemIndicator"], ngImport: i0 }); }
|
|
903
|
+
}
|
|
904
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NgpMenuItemIndicator, decorators: [{
|
|
905
|
+
type: Directive,
|
|
906
|
+
args: [{
|
|
907
|
+
selector: '[ngpMenuItemIndicator]',
|
|
908
|
+
exportAs: 'ngpMenuItemIndicator',
|
|
909
|
+
}]
|
|
910
|
+
}], ctorParameters: () => [] });
|
|
911
|
+
|
|
912
|
+
/**
|
|
913
|
+
* The `NgpMenuItemRadioGroup` directive represents a group of radio menu items.
|
|
914
|
+
*/
|
|
915
|
+
class NgpMenuItemRadioGroup {
|
|
916
|
+
constructor() {
|
|
917
|
+
/** The current value of the radio group */
|
|
918
|
+
this.value = input(null, ...(ngDevMode ? [{ debugName: "value", alias: 'ngpMenuItemRadioGroupValue' }] : [{
|
|
919
|
+
alias: 'ngpMenuItemRadioGroupValue',
|
|
920
|
+
}]));
|
|
921
|
+
/** Event emitted when the value changes */
|
|
922
|
+
this.valueChange = output({
|
|
923
|
+
alias: 'ngpMenuItemRadioGroupValueChange',
|
|
924
|
+
});
|
|
925
|
+
ngpMenuItemRadioGroup({
|
|
926
|
+
value: this.value,
|
|
927
|
+
onValueChange: value => this.valueChange.emit(value),
|
|
928
|
+
});
|
|
929
|
+
}
|
|
930
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NgpMenuItemRadioGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
931
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.9", type: NgpMenuItemRadioGroup, isStandalone: true, selector: "[ngpMenuItemRadioGroup]", inputs: { value: { classPropertyName: "value", publicName: "ngpMenuItemRadioGroupValue", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "ngpMenuItemRadioGroupValueChange" }, providers: [provideMenuItemRadioGroupState()], exportAs: ["ngpMenuItemRadioGroup"], ngImport: i0 }); }
|
|
932
|
+
}
|
|
933
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NgpMenuItemRadioGroup, decorators: [{
|
|
934
|
+
type: Directive,
|
|
935
|
+
args: [{
|
|
936
|
+
selector: '[ngpMenuItemRadioGroup]',
|
|
937
|
+
exportAs: 'ngpMenuItemRadioGroup',
|
|
938
|
+
providers: [provideMenuItemRadioGroupState()],
|
|
939
|
+
}]
|
|
940
|
+
}], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpMenuItemRadioGroupValue", required: false }] }], valueChange: [{ type: i0.Output, args: ["ngpMenuItemRadioGroupValueChange"] }] } });
|
|
941
|
+
|
|
942
|
+
/**
|
|
943
|
+
* The `NgpMenuItemRadio` directive represents a radio menu item within a radio group.
|
|
944
|
+
*/
|
|
945
|
+
class NgpMenuItemRadio {
|
|
946
|
+
constructor() {
|
|
947
|
+
/** The value this radio item represents */
|
|
948
|
+
this.value = input.required(...(ngDevMode ? [{ debugName: "value", alias: 'ngpMenuItemRadioValue' }] : [{
|
|
949
|
+
alias: 'ngpMenuItemRadioValue',
|
|
950
|
+
}]));
|
|
951
|
+
/** Whether the radio item is disabled */
|
|
952
|
+
this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", alias: 'ngpMenuItemRadioDisabled',
|
|
953
|
+
transform: booleanAttribute }] : [{
|
|
954
|
+
alias: 'ngpMenuItemRadioDisabled',
|
|
955
|
+
transform: booleanAttribute,
|
|
956
|
+
}]));
|
|
957
|
+
ngpMenuItemRadio({ value: this.value, disabled: this.disabled });
|
|
958
|
+
ngpRovingFocusItem({ disabled: this.disabled });
|
|
959
|
+
}
|
|
960
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NgpMenuItemRadio, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
961
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.9", type: NgpMenuItemRadio, isStandalone: true, selector: "[ngpMenuItemRadio]", inputs: { value: { classPropertyName: "value", publicName: "ngpMenuItemRadioValue", isSignal: true, isRequired: true, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "ngpMenuItemRadioDisabled", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideMenuItemRadioState(), provideRovingFocusItemState()], exportAs: ["ngpMenuItemRadio"], ngImport: i0 }); }
|
|
962
|
+
}
|
|
963
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NgpMenuItemRadio, decorators: [{
|
|
964
|
+
type: Directive,
|
|
965
|
+
args: [{
|
|
966
|
+
selector: '[ngpMenuItemRadio]',
|
|
967
|
+
exportAs: 'ngpMenuItemRadio',
|
|
968
|
+
providers: [provideMenuItemRadioState(), provideRovingFocusItemState()],
|
|
969
|
+
}]
|
|
970
|
+
}], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpMenuItemRadioValue", required: true }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpMenuItemRadioDisabled", required: false }] }] } });
|
|
771
971
|
|
|
772
972
|
/**
|
|
773
973
|
* The `NgpMenuTrigger` directive allows you to turn an element into a menu trigger.
|
|
@@ -986,5 +1186,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImpor
|
|
|
986
1186
|
* Generated bundle index. Do not edit.
|
|
987
1187
|
*/
|
|
988
1188
|
|
|
989
|
-
export { NgpMenu, NgpMenuItem, NgpMenuTrigger, NgpSubmenuTrigger, injectMenuItemState, injectMenuState, injectMenuTriggerState, injectSubmenuTriggerState, provideMenuConfig, provideMenuItemState, provideMenuState, provideMenuTriggerState, provideSubmenuTriggerState };
|
|
1189
|
+
export { NgpMenu, NgpMenuItem, NgpMenuItemCheckbox, NgpMenuItemIndicator, NgpMenuItemRadio, NgpMenuItemRadioGroup, NgpMenuTrigger, NgpSubmenuTrigger, injectMenuItemCheckboxState, injectMenuItemRadioGroupState, injectMenuItemRadioState, injectMenuItemState, injectMenuState, injectMenuTriggerState, injectSubmenuTriggerState, provideMenuConfig, provideMenuItemCheckboxState, provideMenuItemRadioGroupState, provideMenuItemRadioState, provideMenuItemState, provideMenuState, provideMenuTriggerState, provideSubmenuTriggerState };
|
|
990
1190
|
//# sourceMappingURL=ng-primitives-menu.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-primitives-menu.mjs","sources":["../../../../packages/ng-primitives/menu/src/config/menu-config.ts","../../../../packages/ng-primitives/menu/src/menu-trigger/menu-trigger-state.ts","../../../../packages/ng-primitives/menu/src/menu/menu-state.ts","../../../../packages/ng-primitives/menu/src/submenu-trigger/submenu-trigger-state.ts","../../../../packages/ng-primitives/menu/src/submenu-trigger/submenu-trigger.ts","../../../../packages/ng-primitives/menu/src/menu-item/menu-item-state.ts","../../../../packages/ng-primitives/menu/src/menu-item/menu-item.ts","../../../../packages/ng-primitives/menu/src/menu-trigger/menu-trigger.ts","../../../../packages/ng-primitives/menu/src/menu/menu.ts","../../../../packages/ng-primitives/menu/src/ng-primitives-menu.ts"],"sourcesContent":["import { InjectionToken, Provider, inject } from '@angular/core';\nimport { NgpFlip, NgpOffset, NgpShift } from 'ng-primitives/portal';\nimport type { NgpMenuPlacement } from '../menu-trigger/menu-trigger';\n\nexport type NgpMenuTriggerType = 'click' | 'hover' | 'focus' | 'enter' | 'arrowkey';\n\nexport interface NgpMenuConfig {\n /**\n * Define the offset of the menu relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 4\n */\n offset: NgpOffset;\n\n /**\n * Define the placement of the menu relative to the trigger.\n * @default 'bottom-start'\n */\n placement: NgpMenuPlacement;\n\n /**\n * Define whether the menu should flip when there is not enough space for the menu.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n flip: NgpFlip;\n\n /**\n * Define the container element or selector in to which the menu should be attached.\n * @default 'body'\n */\n container: HTMLElement | string | null;\n\n /**\n * Defines how the menu behaves when the window is scrolled.\n * @default scroll\n */\n scrollBehavior: 'reposition' | 'block' | 'close';\n\n /**\n * Configure shift behavior to keep the menu in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n shift: NgpShift;\n\n /**\n * Whether focus should wrap around when reaching the end of the menu.\n * @default true\n */\n wrap: boolean;\n\n /**\n * Cooldown duration in milliseconds.\n * When moving from one menu to another within this duration,\n * the showDelay is skipped for the new menu.\n * @default 0\n */\n cooldown: number;\n\n /**\n * Define which trigger types are enabled for the menu.\n * @default ['click']\n */\n triggers: NgpMenuTriggerType[];\n\n /**\n * Define the delay before the menu is displayed (hover/focus triggers).\n * @default 0\n */\n showDelay: number;\n\n /**\n * Define the delay before the menu is hidden (hover/focus triggers).\n * @default 0\n */\n hideDelay: number;\n}\n\nexport const defaultMenuConfig: NgpMenuConfig = {\n offset: 4,\n placement: 'bottom-start',\n flip: true,\n container: 'body',\n scrollBehavior: 'block',\n shift: undefined,\n wrap: true,\n cooldown: 0,\n triggers: ['click'],\n showDelay: 0,\n hideDelay: 0,\n};\n\nexport const NgpMenuConfigToken = new InjectionToken<NgpMenuConfig>('NgpMenuConfigToken');\n\n/**\n * Provide the default Menu configuration\n * @param config The Menu configuration\n * @returns The provider\n */\nexport function provideMenuConfig(config: Partial<NgpMenuConfig>): Provider[] {\n return [\n {\n provide: NgpMenuConfigToken,\n useValue: { ...defaultMenuConfig, ...config },\n },\n ];\n}\n\n/**\n * Inject the Menu configuration\n * @returns The global Menu configuration\n */\nexport function injectMenuConfig(): NgpMenuConfig {\n return inject(NgpMenuConfigToken, { optional: true }) ?? defaultMenuConfig;\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport {\n computed,\n effect,\n inject,\n Injector,\n signal,\n Signal,\n ViewContainerRef,\n WritableSignal,\n} from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport {\n createOverlay,\n NgpFlip,\n NgpOffset,\n NgpOverlay,\n NgpOverlayConfig,\n NgpOverlayContent,\n NgpShift,\n} from 'ng-primitives/portal';\nimport {\n attrBinding,\n controlled,\n createPrimitive,\n dataBinding,\n deprecatedSetter,\n listener,\n} from 'ng-primitives/state';\nimport { NgpMenuTriggerType } from '../config/menu-config';\nimport { NgpMenuPlacement } from './menu-trigger';\n\nexport interface NgpMenuTriggerState<T = unknown> {\n /**\n * The menu template or component.\n */\n readonly menu: WritableSignal<NgpOverlayContent<any> | undefined>;\n /**\n * The computed placement of the menu.\n */\n readonly placement: WritableSignal<NgpMenuPlacement>;\n /**\n * Whether the menu is open.\n */\n readonly open: Signal<boolean>;\n /**\n * The offset of the menu.\n */\n readonly offset: WritableSignal<NgpOffset>;\n\n /**\n * The disabled state of the trigger.\n */\n readonly disabled: WritableSignal<boolean>;\n\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip: WritableSignal<NgpFlip>;\n\n /**\n * The context provided to the menu.\n */\n readonly context: WritableSignal<T>;\n\n /**\n * The focus origin that was used to open the menu.\n * @internal\n */\n readonly openOrigin: Signal<FocusOrigin>;\n\n /**\n * Set whether the trigger is disabled.\n * @param isDisabled - Whether the trigger is disabled\n */\n setDisabled(isDisabled: boolean): void;\n\n /**\n * Set whether the menu should flip when there is not enough space.\n * @param shouldFlip - Whether the menu should flip\n */\n setFlip(shouldFlip: NgpFlip): void;\n\n /**\n * Set the placement of the menu.\n * @param placement - The new placement\n */\n setPlacement(placement: NgpMenuPlacement): void;\n\n /**\n * Set the offset of the menu.\n * @param offset - The new offset\n */\n setOffset(offset: NgpOffset): void;\n\n /**\n * Set the context provided to the menu.\n * @param context - The new context\n */\n setContext(context: T): void;\n\n /**\n * Show the menu.\n * @param origin - The focus origin\n */\n show(origin?: FocusOrigin): void;\n /**\n * Hide the menu.\n * @param origin - The focus origin\n * @internal\n */\n hide(origin?: FocusOrigin): void;\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void;\n\n /**\n * Set the menu content.\n * @param menu - The new menu\n */\n setMenu(menu: NgpOverlayContent<any>): void;\n\n /**\n * Set whether the pointer is over the menu content.\n * @param isOver - Whether the pointer is over the content\n * @internal\n */\n setPointerOverContent(isOver: boolean): void;\n}\n\nexport interface NgpMenuTriggerProps<T = unknown> {\n /**\n * Whether the trigger is disabled.\n */\n readonly disabled?: Signal<boolean>;\n /**\n * The menu template or component.\n */\n readonly menu?: Signal<NgpOverlayContent<T> | undefined>;\n /**\n * The placement of the menu.\n */\n readonly placement?: Signal<NgpMenuPlacement>;\n /**\n * The offset of the menu.\n */\n readonly offset?: Signal<NgpOffset>;\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip?: Signal<NgpFlip>;\n /**\n * The container in which the menu should be attached.\n */\n readonly container?: Signal<HTMLElement | string | null>;\n\n /**\n * Configure shift behavior to keep the menu in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n shift: NgpShift;\n\n /**\n * How the menu behaves when the window is scrolled.\n */\n readonly scrollBehavior?: Signal<'reposition' | 'block' | 'close'>;\n /**\n * Context to provide to the menu.\n */\n readonly context?: Signal<T>;\n /**\n * Cooldown duration in milliseconds.\n */\n readonly cooldown?: Signal<number>;\n\n /**\n * Which trigger types are enabled.\n */\n readonly triggers?: Signal<NgpMenuTriggerType[]>;\n\n /**\n * The delay before showing the menu.\n */\n readonly showDelay?: Signal<number>;\n\n /**\n * The delay before hiding the menu.\n */\n readonly hideDelay?: Signal<number>;\n}\n\nexport const [\n NgpMenuTriggerStateToken,\n ngpMenuTrigger,\n _injectMenuTriggerState,\n provideMenuTriggerState,\n] = createPrimitive(\n 'NgpMenuTrigger',\n <T>({\n disabled: _disabled = signal(false),\n menu: _menu = signal<NgpOverlayContent<T> | undefined>(undefined),\n placement: _placement = signal('bottom-start' as NgpMenuPlacement),\n offset: _offset = signal(4),\n flip: _flip = signal(true),\n context: _context = signal<T>(undefined as T),\n container,\n scrollBehavior,\n cooldown,\n triggers = signal(['click'] as NgpMenuTriggerType[]),\n showDelay = signal(0),\n hideDelay = signal(0),\n }: NgpMenuTriggerProps<T>) => {\n const element = injectElementRef();\n const injector = inject(Injector);\n const viewContainerRef = inject(ViewContainerRef);\n const directionality = inject(Directionality);\n\n // Controlled properties\n const menu = controlled(_menu);\n const disabled = controlled(_disabled);\n const placement = controlled(_placement);\n const flip = controlled(_flip);\n const offset = controlled(_offset);\n const context = controlled(_context);\n\n // Internal state\n const overlay = signal<NgpOverlay<T> | null>(null);\n const open = computed(() => overlay()?.isOpen() ?? false);\n const openOrigin = signal<FocusOrigin>('program');\n const closeOrigin = signal<FocusOrigin>('program');\n\n // Track whether pointer is over trigger or content (for hover triggers)\n const pointerOverTrigger = signal(false);\n const pointerOverContent = signal(false);\n const isPointerOverMenuArea = computed(() => pointerOverTrigger() || pointerOverContent());\n\n // Reset pointer tracking when menu closes\n effect(() => {\n const isOpen = open();\n\n // When menu closes, reset pointer tracking state\n if (!isOpen) {\n pointerOverTrigger.set(false);\n pointerOverContent.set(false);\n }\n });\n\n // Computed signal to determine if focus should be restored\n // Only restore if opened via keyboard OR closed via keyboard\n const shouldRestoreFocus = computed(\n () => openOrigin() === 'keyboard' || closeOrigin() === 'keyboard',\n );\n\n // Host bindings\n attrBinding(element, 'aria-haspopup', 'true');\n attrBinding(element, 'aria-expanded', open);\n dataBinding(element, 'data-open', open);\n dataBinding(element, 'data-placement', placement);\n\n // Event listeners - conditionally add based on enabled triggers\n listener(element, 'click', onClick);\n listener(element, 'pointerenter', onPointerEnter);\n listener(element, 'pointerleave', onPointerLeave);\n listener(element, 'focus', onFocus);\n listener(element, 'blur', onBlur);\n listener(element, 'keydown', onKeydown);\n\n // Methods\n function onClick(event: MouseEvent): void {\n if (disabled?.() || !triggers().includes('click')) {\n return;\n }\n toggle(event);\n }\n\n function onPointerEnter(event: PointerEvent): void {\n if (disabled?.() || !triggers().includes('hover')) {\n return;\n }\n\n // Don't trigger on touch events\n if (event.pointerType === 'touch') {\n return;\n }\n\n pointerOverTrigger.set(true);\n\n // If already open, cancel any pending hide\n if (open()) {\n overlay()?.cancelPendingClose();\n return;\n }\n\n show('mouse');\n }\n\n function onPointerLeave(event: PointerEvent): void {\n if (disabled?.() || !triggers().includes('hover')) {\n return;\n }\n\n // Don't trigger on touch events\n if (event.pointerType === 'touch') {\n return;\n }\n\n pointerOverTrigger.set(false);\n\n // If the overlay hasn't been created, there's nothing to cancel\n if (!overlay()) {\n return;\n }\n\n // Use a small delay to allow moving to content\n setTimeout(() => {\n // Only hide if pointer is not over trigger or content\n if (!isPointerOverMenuArea()) {\n hide();\n }\n }, 50); // Small grace period for moving between trigger and content\n }\n\n function onFocus(): void {\n if (disabled?.() || !triggers().includes('focus')) {\n return;\n }\n\n // If already open, do nothing\n if (open()) {\n return;\n }\n\n show('keyboard');\n }\n\n function onBlur(event: FocusEvent): void {\n if (disabled?.() || !triggers().includes('focus')) {\n return;\n }\n\n // If the overlay hasn't been created, there's nothing to cancel\n if (!overlay()) {\n return;\n }\n\n // Check if focus is moving to an element inside the menu\n const relatedTarget = event.relatedTarget as HTMLElement | null;\n if (relatedTarget) {\n const menuElements = overlay()?.getElements() ?? [];\n const isFocusInMenu = menuElements.some(el => el.contains(relatedTarget));\n if (isFocusInMenu) {\n return;\n }\n }\n\n hide();\n }\n\n function onKeydown(event: KeyboardEvent): void {\n if (disabled?.()) {\n return;\n }\n\n const enabledTriggers = triggers();\n\n // Handle Enter key - toggle behavior\n if (event.key === 'Enter' && enabledTriggers.includes('enter')) {\n event.preventDefault();\n const origin: FocusOrigin = 'keyboard';\n if (open()) {\n hide(origin);\n } else {\n show(origin);\n }\n return;\n }\n\n // Handle arrow keys - placement-aware\n if (!enabledTriggers.includes('arrowkey')) {\n return;\n }\n\n const isArrowKey =\n event.key === 'ArrowUp' ||\n event.key === 'ArrowDown' ||\n event.key === 'ArrowLeft' ||\n event.key === 'ArrowRight';\n\n if (!isArrowKey) {\n return;\n }\n\n // Get RTL direction\n const isRtl = directionality.value === 'rtl';\n\n // Check if arrow direction matches placement\n const currentPlacement = placement();\n let shouldOpen = false;\n\n if (currentPlacement.startsWith('bottom') && event.key === 'ArrowDown') {\n shouldOpen = true;\n } else if (currentPlacement.startsWith('top') && event.key === 'ArrowUp') {\n shouldOpen = true;\n } else if (currentPlacement.startsWith('right')) {\n const isRightArrow = event.key === 'ArrowRight';\n const isLeftArrow = event.key === 'ArrowLeft';\n shouldOpen = (isRightArrow && !isRtl) || (isLeftArrow && isRtl);\n } else if (currentPlacement.startsWith('left')) {\n const isRightArrow = event.key === 'ArrowRight';\n const isLeftArrow = event.key === 'ArrowLeft';\n shouldOpen = (isLeftArrow && !isRtl) || (isRightArrow && isRtl);\n }\n\n if (shouldOpen && !open()) {\n event.preventDefault();\n show('keyboard');\n }\n }\n\n function toggle(event: MouseEvent): void {\n // determine the origin of the event, 0 is keyboard, 1 is mouse\n const origin: FocusOrigin = event.detail === 0 ? 'keyboard' : 'mouse';\n\n // if the menu is open then hide it\n if (open()) {\n hide(origin);\n } else {\n show(origin);\n }\n }\n\n function show(origin: FocusOrigin = 'program'): void {\n // Store the origin used to open the menu\n openOrigin.set(origin);\n\n // Create the overlay if it doesn't exist yet\n if (!overlay()) {\n createOverlayInstance();\n }\n\n // Show the overlay\n overlay()?.show();\n }\n\n function hide(origin: FocusOrigin = 'program'): void {\n const currentOverlay = overlay();\n if (!currentOverlay) {\n return;\n }\n\n // Hide the overlay (this will trigger onClose callback which updates closeOrigin)\n currentOverlay.hide({ origin });\n }\n\n function createOverlayInstance(): void {\n const menuContent = menu?.();\n\n if (!menuContent) {\n throw new Error('Menu must be either a TemplateRef or a ComponentType');\n }\n\n // Create config for the overlay\n const config: NgpOverlayConfig<T> = {\n content: menuContent,\n triggerElement: element.nativeElement,\n viewContainerRef,\n injector,\n context,\n container: container?.(),\n placement: placement,\n offset: offset(),\n flip: flip(),\n closeOnOutsideClick: true,\n closeOnEscape: true,\n restoreFocus: shouldRestoreFocus,\n onClose: (origin: FocusOrigin) => closeOrigin.set(origin),\n scrollBehaviour: scrollBehavior?.() ?? 'block',\n overlayType: 'menu',\n cooldown: cooldown?.(),\n showDelay: showDelay(),\n hideDelay: hideDelay(),\n };\n\n overlay.set(createOverlay(config));\n }\n\n function setMenu(newMenu: NgpOverlayContent<T> | undefined): void {\n menu.set(newMenu);\n }\n\n function setDisabled(isDisabled: boolean): void {\n disabled.set(isDisabled);\n\n if (isDisabled && open()) {\n hide();\n }\n }\n\n function setFlip(shouldFlip: NgpFlip): void {\n flip.set(shouldFlip);\n }\n\n function setPlacement(newPlacement: NgpMenuPlacement): void {\n placement.set(newPlacement);\n }\n\n function setOffset(newOffset: NgpOffset): void {\n offset.set(newOffset);\n }\n\n function setContext(newContext: T): void {\n context.set(newContext);\n }\n\n /**\n * Called by menu content when pointer enters/leaves\n * @internal\n */\n function setPointerOverContent(isOver: boolean): void {\n pointerOverContent.set(isOver);\n\n if (!isOver && open() && triggers().includes('hover')) {\n // Use a small delay to allow pointer to move back to trigger\n setTimeout(() => {\n // Only hide if pointer is not over trigger or content\n if (!isPointerOverMenuArea()) {\n hide();\n }\n }, 50);\n }\n }\n\n return {\n menu: deprecatedSetter(menu, 'setMenu'),\n placement: deprecatedSetter(placement, 'setPlacement'),\n offset: deprecatedSetter(offset, 'setOffset'),\n disabled: deprecatedSetter(disabled, 'setDisabled'),\n context: deprecatedSetter(context, 'setContext'),\n open,\n openOrigin,\n show,\n hide,\n toggle,\n setDisabled,\n setMenu,\n setFlip,\n setPlacement,\n setOffset,\n setContext,\n setPointerOverContent,\n flip,\n } satisfies NgpMenuTriggerState<T>;\n },\n);\n\nexport function injectMenuTriggerState<T>(): Signal<NgpMenuTriggerState<T>> {\n return _injectMenuTriggerState() as Signal<NgpMenuTriggerState<T>>;\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { computed, inject } from '@angular/core';\nimport { ngpFocusTrap } from 'ng-primitives/focus-trap';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { injectOverlay } from 'ng-primitives/portal';\nimport { attrBinding, createPrimitive, listener, styleBinding } from 'ng-primitives/state';\nimport { Subject } from 'rxjs';\nimport { injectMenuTriggerState } from '../menu-trigger/menu-trigger-state';\n\nexport interface NgpMenuState {\n /**\n * Close the menu and any parent menus.\n * @param origin - The focus origin\n */\n closeAllMenus(origin: FocusOrigin): void;\n /**\n * Subject that emits when submenus should be closed.\n * @internal\n */\n readonly closeSubmenus: Subject<HTMLElement>;\n}\n\nexport interface NgpMenuProps {}\n\nexport const [NgpMenuStateToken, ngpMenu, injectMenuState, provideMenuState] = createPrimitive(\n 'NgpMenu',\n ({}: NgpMenuProps) => {\n const element = injectElementRef();\n const overlay = injectOverlay();\n const directionality = inject(Directionality, { optional: true });\n const menuTrigger = injectMenuTriggerState();\n const parentMenu = injectMenuState({ optional: true, skipSelf: true });\n\n // Always trap focus in menus per WAI-ARIA guidelines (Tab should not navigate within menus)\n // Pass the open origin so focus trap uses the correct origin for :focus-visible styling\n const openOrigin = computed(() => menuTrigger()?.openOrigin() ?? 'program');\n ngpFocusTrap({\n focusOrigin: openOrigin,\n });\n\n // Host bindings\n attrBinding(element, 'role', 'menu');\n attrBinding(element, 'data-placement', overlay.finalPlacement);\n attrBinding(element, 'data-overlay', '');\n styleBinding(element, 'left.px', () => overlay.position().x ?? null);\n styleBinding(element, 'top.px', () => overlay.position().y ?? null);\n styleBinding(element, '--ngp-menu-trigger-width.px', overlay.triggerWidth);\n styleBinding(element, '--ngp-menu-transform-origin', overlay.transformOrigin);\n styleBinding(element, '--ngp-menu-available-width.px', overlay.availableWidth);\n styleBinding(element, '--ngp-menu-available-height.px', overlay.availableHeight);\n\n // Event listeners for pointer tracking and keyboard\n listener(element, 'pointerenter', onPointerEnter);\n listener(element, 'pointerleave', onPointerLeave);\n listener(element, 'keydown', onKeydown);\n\n // Subject to notify children to close submenus\n const closeSubmenus = new Subject<HTMLElement>();\n\n // Methods\n function onPointerEnter(): void {\n menuTrigger()?.setPointerOverContent(true);\n }\n\n function onPointerLeave(): void {\n menuTrigger()?.setPointerOverContent(false);\n }\n\n function onKeydown(event: KeyboardEvent): void {\n // Handle Escape key - close all menus and restore focus to root trigger\n // We handle this here instead of using overlay's closeOnEscape to ensure\n // proper focus restoration through the closeAllMenus chain\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n closeAllMenus('keyboard');\n return;\n }\n\n // Only handle arrow close keys for top-level menus (no parent submenu)\n // Submenus are handled by menu-item-state via NgpSubmenuTrigger\n if (parentMenu()) {\n return;\n }\n\n const placement = overlay.finalPlacement();\n if (!placement) {\n return;\n }\n\n const isRtl = (directionality?.value ?? 'ltr') === 'rtl';\n\n // Determine which arrow key should close based on placement\n // Note: Only Left/Right arrows close menus (for side-placed menus).\n // Up/Down arrows are reserved for roving focus navigation within the menu.\n let shouldClose = false;\n\n if (placement.startsWith('right')) {\n // Right-placed menu: Left Arrow closes (or Right Arrow in RTL)\n shouldClose = event.key === (isRtl ? 'ArrowRight' : 'ArrowLeft');\n } else if (placement.startsWith('left')) {\n // Left-placed menu: Right Arrow closes (or Left Arrow in RTL)\n shouldClose = event.key === (isRtl ? 'ArrowLeft' : 'ArrowRight');\n }\n\n if (shouldClose) {\n event.preventDefault();\n event.stopPropagation();\n menuTrigger()?.hide('keyboard');\n }\n }\n\n function closeAllMenus(origin: FocusOrigin): void {\n menuTrigger().hide(origin);\n parentMenu()?.closeAllMenus(origin);\n }\n\n return {\n closeAllMenus,\n closeSubmenus,\n } satisfies NgpMenuState;\n },\n);\n","import { FocusMonitor, FocusOrigin } from '@angular/cdk/a11y';\nimport {\n computed,\n inject,\n Injector,\n signal,\n Signal,\n ViewContainerRef,\n WritableSignal,\n} from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport {\n createOverlay,\n NgpFlip,\n NgpOffset,\n NgpOverlay,\n NgpOverlayConfig,\n NgpOverlayContent,\n} from 'ng-primitives/portal';\nimport {\n attrBinding,\n controlled,\n createPrimitive,\n dataBinding,\n deprecatedSetter,\n listener,\n} from 'ng-primitives/state';\nimport { safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { NgpMenuPlacement } from '../menu-trigger/menu-trigger';\nimport { injectMenuState } from '../menu/menu-state';\n\nexport interface NgpSubmenuTriggerState {\n /**\n * The menu template or component.\n */\n readonly menu: WritableSignal<NgpOverlayContent<any> | undefined>;\n\n /**\n * The computed placement of the menu.\n */\n readonly placement: WritableSignal<NgpMenuPlacement>;\n\n /**\n * Whether the menu is open.\n */\n readonly open: Signal<boolean>;\n\n /**\n * The offset of the menu.\n */\n readonly offset: WritableSignal<NgpOffset>;\n\n /**\n * The disabled state of the trigger.\n */\n readonly disabled: WritableSignal<boolean>;\n\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip: WritableSignal<NgpFlip>;\n\n /**\n * The focus origin used to open the submenu.\n * Used by the submenu's focus trap for :focus-visible styling.\n * @internal\n */\n readonly openOrigin: Signal<FocusOrigin>;\n\n /**\n * Show the menu.\n * @param origin - The focus origin (keyboard, mouse, touch, or program)\n */\n show(origin?: FocusOrigin): void;\n\n /**\n * Hide the menu.\n * @param origin - The focus origin\n */\n hide(origin?: FocusOrigin): void;\n\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void;\n\n /**\n * Set whether the trigger is disabled.\n * @param isDisabled - Whether the trigger is disabled\n */\n setDisabled(isDisabled: boolean): void;\n\n /**\n * Set the menu template or component.\n * @param menu - The menu content\n */\n setMenu(menu: NgpOverlayContent<any> | undefined): void;\n\n /**\n * Set the placement of the menu.\n * @param placement - The menu placement\n */\n setPlacement(placement: NgpMenuPlacement): void;\n\n /**\n * Set the offset of the menu.\n * @param offset - The menu offset\n */\n setOffset(offset: NgpOffset): void;\n\n /**\n * Set whether the menu should flip when there is not enough space.\n * @param shouldFlip - Whether the menu should flip\n */\n setFlip(shouldFlip: NgpFlip): void;\n\n /**\n * Focus the trigger element.\n * @param origin - The focus origin\n */\n focus(origin: FocusOrigin): void;\n\n /**\n * Set whether the pointer is over the menu content.\n * For submenus, this is a no-op as hover is handled via showSubmenuOnHover.\n * @param isOver - Whether the pointer is over the content\n * @internal\n */\n setPointerOverContent(isOver: boolean): void;\n}\n\nexport interface NgpSubmenuTriggerProps<T = unknown> {\n /**\n * Whether the trigger is disabled.\n */\n readonly disabled?: Signal<boolean>;\n /**\n * The menu template or component.\n */\n readonly menu?: Signal<NgpOverlayContent<T> | undefined>;\n /**\n * The placement of the menu.\n */\n readonly placement?: Signal<NgpMenuPlacement>;\n /**\n * The offset of the menu.\n */\n readonly offset?: Signal<NgpOffset>;\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip?: Signal<NgpFlip>;\n}\n\nexport const [\n NgpSubmenuTriggerStateToken,\n ngpSubmenuTrigger,\n injectSubmenuTriggerState,\n provideSubmenuTriggerState,\n] = createPrimitive(\n 'NgpSubmenuTrigger',\n <T>({\n disabled: _disabled = signal(false),\n menu: _menu = signal<NgpOverlayContent<T> | undefined>(undefined),\n placement: _placement = signal('right-start'),\n offset: _offset = signal(0),\n flip: _flip = signal(true),\n }: NgpSubmenuTriggerProps<T>) => {\n const element = injectElementRef();\n const injector = inject(Injector);\n const viewContainerRef = inject(ViewContainerRef);\n const parentMenu = injectMenuState({ optional: true });\n const focusMonitor = inject(FocusMonitor);\n\n // Controlled properties\n const menu = controlled(_menu);\n const disabled = controlled(_disabled);\n const placement = controlled(_placement);\n const flip = controlled(_flip);\n const offset = controlled(_offset);\n\n const overlay = signal<NgpOverlay<T> | null>(null);\n const open = computed(() => overlay()?.isOpen() ?? false);\n const openOrigin = signal<FocusOrigin>('program');\n\n // Subscribe to parent menu's closeSubmenus\n parentMenu()\n ?.closeSubmenus.pipe(safeTakeUntilDestroyed())\n .subscribe(submenuElement => {\n // if the element is not the trigger, we want to close the menu\n if (submenuElement === element.nativeElement) {\n return;\n }\n\n hide('mouse');\n });\n\n // Host bindings\n attrBinding(element, 'aria-haspopup', 'true');\n attrBinding(element, 'aria-expanded', open);\n dataBinding(element, 'data-open', open);\n\n // Event listeners\n listener(element, 'click', onClick);\n listener(element, 'keydown', handleArrowKey);\n listener(element, 'pointerenter', showSubmenuOnHover);\n\n // Methods\n function onClick(event: MouseEvent): void {\n if (disabled?.()) {\n return;\n }\n toggle(event);\n }\n\n function toggle(event: MouseEvent): void {\n // determine the origin of the event, 0 is keyboard, 1 is mouse\n const origin: FocusOrigin = event.detail === 0 ? 'keyboard' : 'mouse';\n\n // if the menu is open then hide it\n if (open()) {\n hide(origin);\n } else {\n show(origin);\n }\n }\n\n function show(origin: FocusOrigin = 'program'): void {\n // If the trigger is disabled, don't show the menu\n if (disabled?.()) {\n return;\n }\n\n // Store the origin used to open the menu (for focus-visible styling in submenu)\n openOrigin.set(origin);\n\n // Create the overlay if it doesn't exist yet\n if (!overlay()) {\n createOverlayInstance();\n }\n\n // Show the overlay\n overlay()?.show();\n }\n\n function hide(origin: FocusOrigin = 'program'): void {\n // If the trigger is disabled or the menu is not open, do nothing\n if (disabled?.() || !open()) {\n return;\n }\n\n // Hide the overlay\n overlay()?.hide({ origin });\n }\n\n function createOverlayInstance(): void {\n const menuContent = menu?.();\n\n if (!menuContent) {\n throw new Error('Menu must be either a TemplateRef or a ComponentType');\n }\n\n // Create config for the overlay\n // Note: restoreFocus is false because submenus should never auto-restore focus.\n // When closeAllMenus is called, the ROOT menu's overlay handles focus restoration.\n // When closing just the submenu (Left Arrow), the caller handles focus explicitly.\n // closeOnEscape is false because we handle Escape in menu-state.ts to ensure\n // proper focus restoration through closeAllMenus.\n const config: NgpOverlayConfig<T> = {\n content: menuContent,\n triggerElement: element.nativeElement,\n injector,\n placement,\n offset: offset(),\n flip: flip(),\n closeOnOutsideClick: true,\n closeOnEscape: false,\n restoreFocus: false,\n viewContainerRef,\n };\n\n overlay.set(createOverlay(config));\n }\n\n function handleArrowKey(event: Event): void {\n if (event instanceof KeyboardEvent === false) {\n return;\n }\n\n const direction = getComputedStyle(element.nativeElement).direction;\n const isRtl = direction === 'rtl';\n\n const isRightArrow = event.key === 'ArrowRight';\n const isLeftArrow = event.key === 'ArrowLeft';\n\n if ((isRightArrow && !isRtl) || (isLeftArrow && isRtl)) {\n event.preventDefault();\n show('keyboard');\n }\n }\n\n function showSubmenuOnHover(event: Event): void {\n if (event instanceof PointerEvent === false) {\n return;\n }\n\n // if this was triggered by a touch event, we don't want to show the submenu\n // as it will be shown by the click event - this prevents the submenu from being toggled\n if (event.pointerType === 'touch') {\n return;\n }\n\n show('mouse');\n }\n\n function setDisabled(isDisabled: boolean): void {\n disabled.set(isDisabled);\n\n if (isDisabled && open()) {\n hide();\n }\n }\n\n function setMenu(newMenu: NgpOverlayContent<T> | undefined): void {\n menu.set(newMenu);\n }\n\n function setPlacement(newPlacement: NgpMenuPlacement): void {\n placement.set(newPlacement);\n }\n\n function setOffset(newOffset: NgpOffset): void {\n offset.set(newOffset);\n }\n\n function setFlip(shouldFlip: NgpFlip): void {\n flip.set(shouldFlip);\n }\n\n function focus(origin: FocusOrigin): void {\n focusMonitor.focusVia(element.nativeElement, origin, { preventScroll: true });\n }\n\n // No-op for submenus - hover behavior is handled via showSubmenuOnHover on the trigger element\n\n function setPointerOverContent(_isOver: boolean): void {\n // Submenus don't need pointer tracking on content because:\n // 1. The submenu trigger handles hover via showSubmenuOnHover\n // 2. Closing on hover-out is handled by the parent menu's closeSubmenus mechanism\n }\n\n return {\n placement: deprecatedSetter(placement, 'setPlacement'),\n offset: deprecatedSetter(offset, 'setOffset'),\n disabled: deprecatedSetter(disabled, 'setDisabled'),\n menu: deprecatedSetter(menu, 'setMenu'),\n flip: deprecatedSetter(flip, 'setFlip'),\n open,\n openOrigin,\n show,\n hide,\n toggle,\n setDisabled,\n setMenu,\n setFlip,\n setPlacement,\n setOffset,\n focus,\n setPointerOverContent,\n } satisfies NgpSubmenuTriggerState;\n },\n);\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input } from '@angular/core';\nimport {\n coerceFlip,\n coerceOffset,\n NgpFlip,\n NgpFlipInput,\n NgpOffset,\n NgpOffsetInput,\n NgpOverlayContent,\n} from 'ng-primitives/portal';\nimport { NgpMenuPlacement } from '../menu-trigger/menu-trigger';\nimport { NgpMenuTriggerStateToken } from '../menu-trigger/menu-trigger-state';\nimport {\n NgpSubmenuTriggerStateToken,\n ngpSubmenuTrigger,\n provideSubmenuTriggerState,\n} from './submenu-trigger-state';\n\n@Directive({\n selector: '[ngpSubmenuTrigger]',\n exportAs: 'ngpSubmenuTrigger',\n providers: [\n provideSubmenuTriggerState(),\n // Also provide as NgpMenuTriggerStateToken so the submenu's menu-state\n // can find this trigger's openOrigin for :focus-visible styling\n { provide: NgpMenuTriggerStateToken, useExisting: NgpSubmenuTriggerStateToken },\n ],\n})\nexport class NgpSubmenuTrigger<T = unknown> {\n /**\n * Access the submenu template ref.\n */\n readonly menu = input<NgpOverlayContent<T>>(undefined, {\n alias: 'ngpSubmenuTrigger',\n });\n\n /**\n * Define if the trigger should be disabled.\n * @default false\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpSubmenuTriggerDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Define the placement of the menu relative to the trigger.\n * @default 'right-start'\n */\n readonly placement = input<NgpMenuPlacement>('right-start', {\n alias: 'ngpSubmenuTriggerPlacement',\n });\n\n /**\n * Define the offset of the menu relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 0\n */\n readonly offset = input<NgpOffset, NgpOffsetInput>(0, {\n alias: 'ngpSubmenuTriggerOffset',\n transform: coerceOffset,\n });\n\n /**\n * Define whether the menu should flip when there is not enough space for the menu.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n readonly flip = input<NgpFlip, NgpFlipInput>(true, {\n alias: 'ngpSubmenuTriggerFlip',\n transform: coerceFlip,\n });\n\n /**\n * Access the menu trigger state.\n */\n private readonly state = ngpSubmenuTrigger<T>({\n disabled: this.disabled,\n menu: this.menu,\n placement: this.placement,\n offset: this.offset,\n flip: this.flip,\n });\n\n /**\n * Show the menu.\n */\n show(): void {\n this.state.show();\n }\n\n /**\n * Hide the menu.\n */\n hide(origin: FocusOrigin = 'program'): void {\n this.state.hide(origin);\n }\n\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void {\n this.state.toggle(event);\n }\n\n /**\n * Focus the trigger element.\n * @param origin - The focus origin\n */\n focus(origin: FocusOrigin = 'program'): void {\n this.state.focus(origin);\n }\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { inject, Injector, signal, Signal } from '@angular/core';\nimport { ngpButton } from 'ng-primitives/button';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { attrBinding, createPrimitive, listener } from 'ng-primitives/state';\nimport { injectMenuState } from '../menu/menu-state';\nimport { NgpSubmenuTrigger } from '../submenu-trigger/submenu-trigger';\n\nexport interface NgpMenuItemState {}\n\nexport interface NgpMenuItemProps {\n /**\n * Whether the menu item is disabled.\n */\n readonly disabled?: Signal<boolean>;\n}\n\nexport const [NgpMenuItemStateToken, ngpMenuItem, injectMenuItemState, provideMenuItemState] =\n createPrimitive('NgpMenuItem', ({ disabled = signal(false) }: NgpMenuItemProps) => {\n const element = injectElementRef();\n const injector = inject(Injector);\n const parentMenu = injectMenuState({ optional: true });\n\n ngpButton({ disabled });\n\n // Host bindings\n attrBinding(element, 'role', 'menuitem');\n\n // Event listeners\n listener(element, 'click', onClick);\n listener(element, 'keydown', handleArrowKey);\n listener(element, 'mouseenter', showSubmenuOnHover);\n\n // Methods\n function onClick(event: MouseEvent): void {\n // we do this here to avoid circular dependency issues\n const trigger = injector.get(NgpSubmenuTrigger, null, { self: true, optional: true });\n\n const origin: FocusOrigin = event.detail === 0 ? 'keyboard' : 'mouse';\n\n // if this is a submenu trigger, we don't want to close the menu, we want to open the submenu\n if (!trigger) {\n parentMenu()?.closeAllMenus(origin);\n }\n }\n\n function handleArrowKey(event: Event): void {\n if (event instanceof KeyboardEvent === false) {\n return;\n }\n\n // if there is no parent menu, we don't want to do anything\n const trigger = injector.get(NgpSubmenuTrigger, null, { optional: true, skipSelf: true });\n\n if (!trigger) {\n return;\n }\n\n const direction = getComputedStyle(element.nativeElement).direction;\n const isRtl = direction === 'rtl';\n\n const isLeftArrow = event.key === 'ArrowLeft';\n const isRightArrow = event.key === 'ArrowRight';\n\n if ((isLeftArrow && !isRtl) || (isRightArrow && isRtl)) {\n event.preventDefault();\n\n if (trigger) {\n trigger.hide('keyboard');\n // Explicitly focus the submenu trigger since submenus have restoreFocus: false\n trigger.focus('keyboard');\n }\n }\n }\n\n function showSubmenuOnHover(): void {\n parentMenu()?.closeSubmenus.next(element.nativeElement);\n }\n\n return {} satisfies NgpMenuItemState;\n });\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input } from '@angular/core';\nimport { ngpRovingFocusItem, provideRovingFocusItemState } from 'ng-primitives/roving-focus';\nimport { ngpMenuItem, provideMenuItemState } from './menu-item-state';\n\n/**\n * The `NgpMenuItem` directive represents a menu item.\n */\n@Directive({\n selector: '[ngpMenuItem]',\n exportAs: 'ngpMenuItem',\n providers: [provideMenuItemState(), provideRovingFocusItemState()],\n})\nexport class NgpMenuItem {\n /** Whether the menu item is disabled */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuItemDisabled',\n transform: booleanAttribute,\n });\n\n constructor() {\n ngpMenuItem({ disabled: this.disabled });\n ngpRovingFocusItem({ disabled: this.disabled });\n }\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input, numberAttribute, Signal } from '@angular/core';\nimport {\n coerceFlip,\n coerceOffset,\n coerceShift,\n NgpFlip,\n NgpFlipInput,\n NgpOffset,\n NgpOffsetInput,\n NgpOverlayContent,\n NgpShift,\n NgpShiftInput,\n} from 'ng-primitives/portal';\nimport { injectMenuConfig, NgpMenuTriggerType } from '../config/menu-config';\nimport { ngpMenuTrigger, provideMenuTriggerState } from './menu-trigger-state';\n\n/**\n * The `NgpMenuTrigger` directive allows you to turn an element into a menu trigger.\n */\n@Directive({\n selector: '[ngpMenuTrigger]',\n exportAs: 'ngpMenuTrigger',\n providers: [provideMenuTriggerState()],\n})\nexport class NgpMenuTrigger<T = unknown> {\n /**\n * Access the global menu configuration.\n */\n private readonly config = injectMenuConfig();\n\n /**\n * Access the menu template ref or ComponentType.\n */\n readonly menu = input<NgpOverlayContent<T>>(undefined, {\n alias: 'ngpMenuTrigger',\n });\n\n /**\n * Define if the trigger should be disabled.\n * @default false\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuTriggerDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Define the placement of the menu relative to the trigger.\n * @default 'bottom-start'\n */\n readonly placement = input<NgpMenuPlacement>(this.config.placement, {\n alias: 'ngpMenuTriggerPlacement',\n });\n\n /**\n * Define the offset of the menu relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 4\n */\n readonly offset = input<NgpOffset, NgpOffsetInput>(this.config.offset, {\n alias: 'ngpMenuTriggerOffset',\n transform: coerceOffset,\n });\n\n /**\n * Define whether the menu should flip when there is not enough space for the menu.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n readonly flip = input<NgpFlip, NgpFlipInput>(this.config.flip, {\n alias: 'ngpMenuTriggerFlip',\n transform: coerceFlip,\n });\n\n /**\n * Configure shift behavior to keep the menu in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n readonly shift = input<NgpShift, NgpShiftInput>(this.config.shift, {\n alias: 'ngpMenuTriggerShift',\n transform: coerceShift,\n });\n\n /**\n * Define the container in which the menu should be attached.\n * @default document.body\n */\n readonly container = input<HTMLElement | string | null>(this.config.container, {\n alias: 'ngpMenuTriggerContainer',\n });\n\n /**\n * Defines how the menu behaves when the window is scrolled.\n * @default 'block'\n */\n readonly scrollBehavior = input<'reposition' | 'block' | 'close'>(this.config.scrollBehavior, {\n alias: 'ngpMenuTriggerScrollBehavior',\n });\n\n /**\n * Define the cooldown duration in milliseconds.\n * When moving from one menu to another within this duration,\n * the showDelay is skipped for the new menu.\n * @default 0\n */\n readonly cooldown = input<number, NumberInput>(this.config.cooldown, {\n alias: 'ngpMenuTriggerCooldown',\n transform: numberAttribute,\n });\n\n /**\n * Provide context to the menu. This can be used to pass data to the menu content.\n */\n readonly context = input<T>(undefined, {\n alias: 'ngpMenuTriggerContext',\n });\n\n /**\n * Define which trigger types are enabled for the menu.\n * @default ['click']\n */\n readonly triggers = input<NgpMenuTriggerType[]>(this.config.triggers, {\n alias: 'ngpMenuTriggerOpenTriggers',\n });\n\n /**\n * Define the delay before the menu is displayed (hover/focus triggers).\n * @default 0\n */\n readonly showDelay = input<number, NumberInput>(this.config.showDelay, {\n alias: 'ngpMenuTriggerShowDelay',\n transform: numberAttribute,\n });\n\n /**\n * Define the delay before the menu is hidden (hover/focus triggers).\n * @default 0\n */\n readonly hideDelay = input<number, NumberInput>(this.config.hideDelay, {\n alias: 'ngpMenuTriggerHideDelay',\n transform: numberAttribute,\n });\n\n /**\n * The menu trigger state.\n */\n private readonly state = ngpMenuTrigger<T>({\n disabled: this.disabled,\n menu: this.menu,\n placement: this.placement,\n offset: this.offset,\n flip: this.flip,\n shift: this.shift(),\n container: this.container,\n scrollBehavior: this.scrollBehavior,\n cooldown: this.cooldown,\n context: this.context as Signal<T>,\n triggers: this.triggers,\n showDelay: this.showDelay,\n hideDelay: this.hideDelay,\n });\n\n /**\n * Show the menu.\n */\n show(): void {\n this.state.show();\n }\n\n /**\n * Hide the menu.\n * @param origin - The focus origin\n * @internal\n */\n hide(origin?: FocusOrigin): void {\n this.state.hide(origin);\n }\n\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void {\n this.state.toggle(event);\n }\n}\n\nexport type NgpMenuPlacement =\n | 'top'\n | 'right'\n | 'bottom'\n | 'left'\n | 'top-start'\n | 'top-end'\n | 'right-start'\n | 'right-end'\n | 'bottom-start'\n | 'bottom-end'\n | 'left-start'\n | 'left-end';\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input } from '@angular/core';\nimport { provideFocusTrapState } from 'ng-primitives/focus-trap';\nimport { ngpRovingFocusGroup, provideRovingFocusGroupState } from 'ng-primitives/roving-focus';\nimport { injectMenuConfig } from '../config/menu-config';\nimport { ngpMenu, provideMenuState } from './menu-state';\n\n/**\n * The `NgpMenu` is a container for menu items.\n */\n@Directive({\n selector: '[ngpMenu]',\n exportAs: 'ngpMenu',\n providers: [\n // ensure we don't inherit the focus group from the parent menu if there is one\n provideRovingFocusGroupState({ inherit: false }),\n provideMenuState({ inherit: false }),\n provideFocusTrapState(),\n ],\n})\nexport class NgpMenu {\n private readonly config = injectMenuConfig();\n\n /**\n * Whether focus should wrap around when reaching the end of the menu.\n * @default true\n */\n readonly wrap = input<boolean, BooleanInput>(this.config.wrap, {\n alias: 'ngpMenuWrap',\n transform: booleanAttribute,\n });\n\n private readonly state = ngpMenu({ wrap: this.wrap });\n\n constructor() {\n ngpRovingFocusGroup({ inherit: false, wrap: this.wrap });\n }\n\n /** @internal Close the menu and any parent menus */\n closeAllMenus(origin: FocusOrigin): void {\n this.state.closeAllMenus(origin);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ng-primitives-menu.mjs","sources":["../../../../packages/ng-primitives/menu/src/config/menu-config.ts","../../../../packages/ng-primitives/menu/src/menu-trigger/menu-trigger-state.ts","../../../../packages/ng-primitives/menu/src/menu/menu-state.ts","../../../../packages/ng-primitives/menu/src/submenu-trigger/submenu-trigger-state.ts","../../../../packages/ng-primitives/menu/src/submenu-trigger/submenu-trigger.ts","../../../../packages/ng-primitives/menu/src/menu-item/menu-item-state.ts","../../../../packages/ng-primitives/menu/src/menu-item/menu-item.ts","../../../../packages/ng-primitives/menu/src/menu-item-checkbox/menu-item-checkbox-state.ts","../../../../packages/ng-primitives/menu/src/menu-item-checkbox/menu-item-checkbox.ts","../../../../packages/ng-primitives/menu/src/menu-item-radio-group/menu-item-radio-group-state.ts","../../../../packages/ng-primitives/menu/src/menu-item-radio/menu-item-radio-state.ts","../../../../packages/ng-primitives/menu/src/menu-item-indicator/menu-item-indicator.ts","../../../../packages/ng-primitives/menu/src/menu-item-radio-group/menu-item-radio-group.ts","../../../../packages/ng-primitives/menu/src/menu-item-radio/menu-item-radio.ts","../../../../packages/ng-primitives/menu/src/menu-trigger/menu-trigger.ts","../../../../packages/ng-primitives/menu/src/menu/menu.ts","../../../../packages/ng-primitives/menu/src/ng-primitives-menu.ts"],"sourcesContent":["import { InjectionToken, Provider, inject } from '@angular/core';\nimport { NgpFlip, NgpOffset, NgpShift } from 'ng-primitives/portal';\nimport type { NgpMenuPlacement } from '../menu-trigger/menu-trigger';\n\nexport type NgpMenuTriggerType = 'click' | 'hover' | 'focus' | 'enter' | 'arrowkey';\n\nexport interface NgpMenuConfig {\n /**\n * Define the offset of the menu relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 4\n */\n offset: NgpOffset;\n\n /**\n * Define the placement of the menu relative to the trigger.\n * @default 'bottom-start'\n */\n placement: NgpMenuPlacement;\n\n /**\n * Define whether the menu should flip when there is not enough space for the menu.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n flip: NgpFlip;\n\n /**\n * Define the container element or selector in to which the menu should be attached.\n * @default 'body'\n */\n container: HTMLElement | string | null;\n\n /**\n * Defines how the menu behaves when the window is scrolled.\n * @default scroll\n */\n scrollBehavior: 'reposition' | 'block' | 'close';\n\n /**\n * Configure shift behavior to keep the menu in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n shift: NgpShift;\n\n /**\n * Whether focus should wrap around when reaching the end of the menu.\n * @default true\n */\n wrap: boolean;\n\n /**\n * Cooldown duration in milliseconds.\n * When moving from one menu to another within this duration,\n * the showDelay is skipped for the new menu.\n * @default 0\n */\n cooldown: number;\n\n /**\n * Define which trigger types are enabled for the menu.\n * @default ['click']\n */\n triggers: NgpMenuTriggerType[];\n\n /**\n * Define the delay before the menu is displayed (hover/focus triggers).\n * @default 0\n */\n showDelay: number;\n\n /**\n * Define the delay before the menu is hidden (hover/focus triggers).\n * @default 0\n */\n hideDelay: number;\n}\n\nexport const defaultMenuConfig: NgpMenuConfig = {\n offset: 4,\n placement: 'bottom-start',\n flip: true,\n container: 'body',\n scrollBehavior: 'block',\n shift: undefined,\n wrap: true,\n cooldown: 0,\n triggers: ['click'],\n showDelay: 0,\n hideDelay: 0,\n};\n\nexport const NgpMenuConfigToken = new InjectionToken<NgpMenuConfig>('NgpMenuConfigToken');\n\n/**\n * Provide the default Menu configuration\n * @param config The Menu configuration\n * @returns The provider\n */\nexport function provideMenuConfig(config: Partial<NgpMenuConfig>): Provider[] {\n return [\n {\n provide: NgpMenuConfigToken,\n useValue: { ...defaultMenuConfig, ...config },\n },\n ];\n}\n\n/**\n * Inject the Menu configuration\n * @returns The global Menu configuration\n */\nexport function injectMenuConfig(): NgpMenuConfig {\n return inject(NgpMenuConfigToken, { optional: true }) ?? defaultMenuConfig;\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport {\n computed,\n effect,\n inject,\n Injector,\n signal,\n Signal,\n ViewContainerRef,\n WritableSignal,\n} from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport {\n createOverlay,\n NgpFlip,\n NgpOffset,\n NgpOverlay,\n NgpOverlayConfig,\n NgpOverlayContent,\n NgpShift,\n} from 'ng-primitives/portal';\nimport {\n attrBinding,\n controlled,\n createPrimitive,\n dataBinding,\n deprecatedSetter,\n listener,\n} from 'ng-primitives/state';\nimport { NgpMenuTriggerType } from '../config/menu-config';\nimport { NgpMenuPlacement } from './menu-trigger';\n\nexport interface NgpMenuTriggerState<T = unknown> {\n /**\n * The menu template or component.\n */\n readonly menu: WritableSignal<NgpOverlayContent<any> | undefined>;\n /**\n * The computed placement of the menu.\n */\n readonly placement: WritableSignal<NgpMenuPlacement>;\n /**\n * Whether the menu is open.\n */\n readonly open: Signal<boolean>;\n /**\n * The offset of the menu.\n */\n readonly offset: WritableSignal<NgpOffset>;\n\n /**\n * The disabled state of the trigger.\n */\n readonly disabled: WritableSignal<boolean>;\n\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip: WritableSignal<NgpFlip>;\n\n /**\n * The context provided to the menu.\n */\n readonly context: WritableSignal<T>;\n\n /**\n * The focus origin that was used to open the menu.\n * @internal\n */\n readonly openOrigin: Signal<FocusOrigin>;\n\n /**\n * Set whether the trigger is disabled.\n * @param isDisabled - Whether the trigger is disabled\n */\n setDisabled(isDisabled: boolean): void;\n\n /**\n * Set whether the menu should flip when there is not enough space.\n * @param shouldFlip - Whether the menu should flip\n */\n setFlip(shouldFlip: NgpFlip): void;\n\n /**\n * Set the placement of the menu.\n * @param placement - The new placement\n */\n setPlacement(placement: NgpMenuPlacement): void;\n\n /**\n * Set the offset of the menu.\n * @param offset - The new offset\n */\n setOffset(offset: NgpOffset): void;\n\n /**\n * Set the context provided to the menu.\n * @param context - The new context\n */\n setContext(context: T): void;\n\n /**\n * Show the menu.\n * @param origin - The focus origin\n */\n show(origin?: FocusOrigin): void;\n /**\n * Hide the menu.\n * @param origin - The focus origin\n * @internal\n */\n hide(origin?: FocusOrigin): void;\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void;\n\n /**\n * Set the menu content.\n * @param menu - The new menu\n */\n setMenu(menu: NgpOverlayContent<any>): void;\n\n /**\n * Set whether the pointer is over the menu content.\n * @param isOver - Whether the pointer is over the content\n * @internal\n */\n setPointerOverContent(isOver: boolean): void;\n}\n\nexport interface NgpMenuTriggerProps<T = unknown> {\n /**\n * Whether the trigger is disabled.\n */\n readonly disabled?: Signal<boolean>;\n /**\n * The menu template or component.\n */\n readonly menu?: Signal<NgpOverlayContent<T> | undefined>;\n /**\n * The placement of the menu.\n */\n readonly placement?: Signal<NgpMenuPlacement>;\n /**\n * The offset of the menu.\n */\n readonly offset?: Signal<NgpOffset>;\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip?: Signal<NgpFlip>;\n /**\n * The container in which the menu should be attached.\n */\n readonly container?: Signal<HTMLElement | string | null>;\n\n /**\n * Configure shift behavior to keep the menu in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n shift: NgpShift;\n\n /**\n * How the menu behaves when the window is scrolled.\n */\n readonly scrollBehavior?: Signal<'reposition' | 'block' | 'close'>;\n /**\n * Context to provide to the menu.\n */\n readonly context?: Signal<T>;\n /**\n * Cooldown duration in milliseconds.\n */\n readonly cooldown?: Signal<number>;\n\n /**\n * Which trigger types are enabled.\n */\n readonly triggers?: Signal<NgpMenuTriggerType[]>;\n\n /**\n * The delay before showing the menu.\n */\n readonly showDelay?: Signal<number>;\n\n /**\n * The delay before hiding the menu.\n */\n readonly hideDelay?: Signal<number>;\n}\n\nexport const [\n NgpMenuTriggerStateToken,\n ngpMenuTrigger,\n _injectMenuTriggerState,\n provideMenuTriggerState,\n] = createPrimitive(\n 'NgpMenuTrigger',\n <T>({\n disabled: _disabled = signal(false),\n menu: _menu = signal<NgpOverlayContent<T> | undefined>(undefined),\n placement: _placement = signal('bottom-start' as NgpMenuPlacement),\n offset: _offset = signal(4),\n flip: _flip = signal(true),\n context: _context = signal<T>(undefined as T),\n container,\n scrollBehavior,\n cooldown,\n triggers = signal(['click'] as NgpMenuTriggerType[]),\n showDelay = signal(0),\n hideDelay = signal(0),\n }: NgpMenuTriggerProps<T>) => {\n const element = injectElementRef();\n const injector = inject(Injector);\n const viewContainerRef = inject(ViewContainerRef);\n const directionality = inject(Directionality);\n\n // Controlled properties\n const menu = controlled(_menu);\n const disabled = controlled(_disabled);\n const placement = controlled(_placement);\n const flip = controlled(_flip);\n const offset = controlled(_offset);\n const context = controlled(_context);\n\n // Internal state\n const overlay = signal<NgpOverlay<T> | null>(null);\n const open = computed(() => overlay()?.isOpen() ?? false);\n const openOrigin = signal<FocusOrigin>('program');\n const closeOrigin = signal<FocusOrigin>('program');\n\n // Track whether pointer is over trigger or content (for hover triggers)\n const pointerOverTrigger = signal(false);\n const pointerOverContent = signal(false);\n const isPointerOverMenuArea = computed(() => pointerOverTrigger() || pointerOverContent());\n\n // Reset pointer tracking when menu closes\n effect(() => {\n const isOpen = open();\n\n // When menu closes, reset pointer tracking state\n if (!isOpen) {\n pointerOverTrigger.set(false);\n pointerOverContent.set(false);\n }\n });\n\n // Computed signal to determine if focus should be restored\n // Only restore if opened via keyboard OR closed via keyboard\n const shouldRestoreFocus = computed(\n () => openOrigin() === 'keyboard' || closeOrigin() === 'keyboard',\n );\n\n // Host bindings\n attrBinding(element, 'aria-haspopup', 'true');\n attrBinding(element, 'aria-expanded', open);\n dataBinding(element, 'data-open', open);\n dataBinding(element, 'data-placement', placement);\n\n // Event listeners - conditionally add based on enabled triggers\n listener(element, 'click', onClick);\n listener(element, 'pointerenter', onPointerEnter);\n listener(element, 'pointerleave', onPointerLeave);\n listener(element, 'focus', onFocus);\n listener(element, 'blur', onBlur);\n listener(element, 'keydown', onKeydown);\n\n // Methods\n function onClick(event: MouseEvent): void {\n if (disabled?.() || !triggers().includes('click')) {\n return;\n }\n toggle(event);\n }\n\n function onPointerEnter(event: PointerEvent): void {\n if (disabled?.() || !triggers().includes('hover')) {\n return;\n }\n\n // Don't trigger on touch events\n if (event.pointerType === 'touch') {\n return;\n }\n\n pointerOverTrigger.set(true);\n\n // If already open, cancel any pending hide\n if (open()) {\n overlay()?.cancelPendingClose();\n return;\n }\n\n show('mouse');\n }\n\n function onPointerLeave(event: PointerEvent): void {\n if (disabled?.() || !triggers().includes('hover')) {\n return;\n }\n\n // Don't trigger on touch events\n if (event.pointerType === 'touch') {\n return;\n }\n\n pointerOverTrigger.set(false);\n\n // If the overlay hasn't been created, there's nothing to cancel\n if (!overlay()) {\n return;\n }\n\n // Use a small delay to allow moving to content\n setTimeout(() => {\n // Only hide if pointer is not over trigger or content\n if (!isPointerOverMenuArea()) {\n hide();\n }\n }, 50); // Small grace period for moving between trigger and content\n }\n\n function onFocus(): void {\n if (disabled?.() || !triggers().includes('focus')) {\n return;\n }\n\n // If already open, do nothing\n if (open()) {\n return;\n }\n\n show('keyboard');\n }\n\n function onBlur(event: FocusEvent): void {\n if (disabled?.() || !triggers().includes('focus')) {\n return;\n }\n\n // If the overlay hasn't been created, there's nothing to cancel\n if (!overlay()) {\n return;\n }\n\n // Check if focus is moving to an element inside the menu\n const relatedTarget = event.relatedTarget as HTMLElement | null;\n if (relatedTarget) {\n const menuElements = overlay()?.getElements() ?? [];\n const isFocusInMenu = menuElements.some(el => el.contains(relatedTarget));\n if (isFocusInMenu) {\n return;\n }\n }\n\n hide();\n }\n\n function onKeydown(event: KeyboardEvent): void {\n if (disabled?.()) {\n return;\n }\n\n const enabledTriggers = triggers();\n\n // Handle Enter key - toggle behavior\n if (event.key === 'Enter' && enabledTriggers.includes('enter')) {\n event.preventDefault();\n const origin: FocusOrigin = 'keyboard';\n if (open()) {\n hide(origin);\n } else {\n show(origin);\n }\n return;\n }\n\n // Handle arrow keys - placement-aware\n if (!enabledTriggers.includes('arrowkey')) {\n return;\n }\n\n const isArrowKey =\n event.key === 'ArrowUp' ||\n event.key === 'ArrowDown' ||\n event.key === 'ArrowLeft' ||\n event.key === 'ArrowRight';\n\n if (!isArrowKey) {\n return;\n }\n\n // Get RTL direction\n const isRtl = directionality.value === 'rtl';\n\n // Check if arrow direction matches placement\n const currentPlacement = placement();\n let shouldOpen = false;\n\n if (currentPlacement.startsWith('bottom') && event.key === 'ArrowDown') {\n shouldOpen = true;\n } else if (currentPlacement.startsWith('top') && event.key === 'ArrowUp') {\n shouldOpen = true;\n } else if (currentPlacement.startsWith('right')) {\n const isRightArrow = event.key === 'ArrowRight';\n const isLeftArrow = event.key === 'ArrowLeft';\n shouldOpen = (isRightArrow && !isRtl) || (isLeftArrow && isRtl);\n } else if (currentPlacement.startsWith('left')) {\n const isRightArrow = event.key === 'ArrowRight';\n const isLeftArrow = event.key === 'ArrowLeft';\n shouldOpen = (isLeftArrow && !isRtl) || (isRightArrow && isRtl);\n }\n\n if (shouldOpen && !open()) {\n event.preventDefault();\n show('keyboard');\n }\n }\n\n function toggle(event: MouseEvent): void {\n // determine the origin of the event, 0 is keyboard, 1 is mouse\n const origin: FocusOrigin = event.detail === 0 ? 'keyboard' : 'mouse';\n\n // if the menu is open then hide it\n if (open()) {\n hide(origin);\n } else {\n show(origin);\n }\n }\n\n function show(origin: FocusOrigin = 'program'): void {\n // Store the origin used to open the menu\n openOrigin.set(origin);\n\n // Create the overlay if it doesn't exist yet\n if (!overlay()) {\n createOverlayInstance();\n }\n\n // Show the overlay\n overlay()?.show();\n }\n\n function hide(origin: FocusOrigin = 'program'): void {\n const currentOverlay = overlay();\n if (!currentOverlay) {\n return;\n }\n\n // Hide the overlay (this will trigger onClose callback which updates closeOrigin)\n currentOverlay.hide({ origin });\n }\n\n function createOverlayInstance(): void {\n const menuContent = menu?.();\n\n if (!menuContent) {\n throw new Error('Menu must be either a TemplateRef or a ComponentType');\n }\n\n // Create config for the overlay\n const config: NgpOverlayConfig<T> = {\n content: menuContent,\n triggerElement: element.nativeElement,\n viewContainerRef,\n injector,\n context,\n container: container?.(),\n placement: placement,\n offset: offset(),\n flip: flip(),\n closeOnOutsideClick: true,\n closeOnEscape: true,\n restoreFocus: shouldRestoreFocus,\n onClose: (origin: FocusOrigin) => closeOrigin.set(origin),\n scrollBehaviour: scrollBehavior?.() ?? 'block',\n overlayType: 'menu',\n cooldown: cooldown?.(),\n showDelay: showDelay(),\n hideDelay: hideDelay(),\n };\n\n overlay.set(createOverlay(config));\n }\n\n function setMenu(newMenu: NgpOverlayContent<T> | undefined): void {\n menu.set(newMenu);\n }\n\n function setDisabled(isDisabled: boolean): void {\n disabled.set(isDisabled);\n\n if (isDisabled && open()) {\n hide();\n }\n }\n\n function setFlip(shouldFlip: NgpFlip): void {\n flip.set(shouldFlip);\n }\n\n function setPlacement(newPlacement: NgpMenuPlacement): void {\n placement.set(newPlacement);\n }\n\n function setOffset(newOffset: NgpOffset): void {\n offset.set(newOffset);\n }\n\n function setContext(newContext: T): void {\n context.set(newContext);\n }\n\n /**\n * Called by menu content when pointer enters/leaves\n * @internal\n */\n function setPointerOverContent(isOver: boolean): void {\n pointerOverContent.set(isOver);\n\n if (!isOver && open() && triggers().includes('hover')) {\n // Use a small delay to allow pointer to move back to trigger\n setTimeout(() => {\n // Only hide if pointer is not over trigger or content\n if (!isPointerOverMenuArea()) {\n hide();\n }\n }, 50);\n }\n }\n\n return {\n menu: deprecatedSetter(menu, 'setMenu'),\n placement: deprecatedSetter(placement, 'setPlacement'),\n offset: deprecatedSetter(offset, 'setOffset'),\n disabled: deprecatedSetter(disabled, 'setDisabled'),\n context: deprecatedSetter(context, 'setContext'),\n open,\n openOrigin,\n show,\n hide,\n toggle,\n setDisabled,\n setMenu,\n setFlip,\n setPlacement,\n setOffset,\n setContext,\n setPointerOverContent,\n flip,\n } satisfies NgpMenuTriggerState<T>;\n },\n);\n\nexport function injectMenuTriggerState<T>(): Signal<NgpMenuTriggerState<T>> {\n return _injectMenuTriggerState() as Signal<NgpMenuTriggerState<T>>;\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { computed, inject } from '@angular/core';\nimport { ngpFocusTrap } from 'ng-primitives/focus-trap';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { injectOverlay } from 'ng-primitives/portal';\nimport { attrBinding, createPrimitive, listener, styleBinding } from 'ng-primitives/state';\nimport { Subject } from 'rxjs';\nimport { injectMenuTriggerState } from '../menu-trigger/menu-trigger-state';\n\nexport interface NgpMenuState {\n /**\n * Close the menu and any parent menus.\n * @param origin - The focus origin\n */\n closeAllMenus(origin: FocusOrigin): void;\n /**\n * Subject that emits when submenus should be closed.\n * @internal\n */\n readonly closeSubmenus: Subject<HTMLElement>;\n}\n\nexport interface NgpMenuProps {}\n\nexport const [NgpMenuStateToken, ngpMenu, injectMenuState, provideMenuState] = createPrimitive(\n 'NgpMenu',\n ({}: NgpMenuProps) => {\n const element = injectElementRef();\n const overlay = injectOverlay();\n const directionality = inject(Directionality, { optional: true });\n const menuTrigger = injectMenuTriggerState();\n const parentMenu = injectMenuState({ optional: true, skipSelf: true });\n\n // Always trap focus in menus per WAI-ARIA guidelines (Tab should not navigate within menus)\n // Pass the open origin so focus trap uses the correct origin for :focus-visible styling\n const openOrigin = computed(() => menuTrigger()?.openOrigin() ?? 'program');\n ngpFocusTrap({\n focusOrigin: openOrigin,\n });\n\n // Host bindings\n attrBinding(element, 'role', 'menu');\n attrBinding(element, 'data-placement', overlay.finalPlacement);\n attrBinding(element, 'data-overlay', '');\n styleBinding(element, 'left.px', () => overlay.position().x ?? null);\n styleBinding(element, 'top.px', () => overlay.position().y ?? null);\n styleBinding(element, '--ngp-menu-trigger-width.px', overlay.triggerWidth);\n styleBinding(element, '--ngp-menu-transform-origin', overlay.transformOrigin);\n styleBinding(element, '--ngp-menu-available-width.px', overlay.availableWidth);\n styleBinding(element, '--ngp-menu-available-height.px', overlay.availableHeight);\n\n // Event listeners for pointer tracking and keyboard\n listener(element, 'pointerenter', onPointerEnter);\n listener(element, 'pointerleave', onPointerLeave);\n listener(element, 'keydown', onKeydown);\n\n // Subject to notify children to close submenus\n const closeSubmenus = new Subject<HTMLElement>();\n\n // Methods\n function onPointerEnter(): void {\n menuTrigger()?.setPointerOverContent(true);\n }\n\n function onPointerLeave(): void {\n menuTrigger()?.setPointerOverContent(false);\n }\n\n function onKeydown(event: KeyboardEvent): void {\n // Handle Escape key - close all menus and restore focus to root trigger\n // We handle this here instead of using overlay's closeOnEscape to ensure\n // proper focus restoration through the closeAllMenus chain\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n closeAllMenus('keyboard');\n return;\n }\n\n // Only handle arrow close keys for top-level menus (no parent submenu)\n // Submenus are handled by menu-item-state via NgpSubmenuTrigger\n if (parentMenu()) {\n return;\n }\n\n const placement = overlay.finalPlacement();\n if (!placement) {\n return;\n }\n\n const isRtl = (directionality?.value ?? 'ltr') === 'rtl';\n\n // Determine which arrow key should close based on placement\n // Note: Only Left/Right arrows close menus (for side-placed menus).\n // Up/Down arrows are reserved for roving focus navigation within the menu.\n let shouldClose = false;\n\n if (placement.startsWith('right')) {\n // Right-placed menu: Left Arrow closes (or Right Arrow in RTL)\n shouldClose = event.key === (isRtl ? 'ArrowRight' : 'ArrowLeft');\n } else if (placement.startsWith('left')) {\n // Left-placed menu: Right Arrow closes (or Left Arrow in RTL)\n shouldClose = event.key === (isRtl ? 'ArrowLeft' : 'ArrowRight');\n }\n\n if (shouldClose) {\n event.preventDefault();\n event.stopPropagation();\n menuTrigger()?.hide('keyboard');\n }\n }\n\n function closeAllMenus(origin: FocusOrigin): void {\n menuTrigger().hide(origin);\n parentMenu()?.closeAllMenus(origin);\n }\n\n return {\n closeAllMenus,\n closeSubmenus,\n } satisfies NgpMenuState;\n },\n);\n","import { FocusMonitor, FocusOrigin } from '@angular/cdk/a11y';\nimport {\n computed,\n inject,\n Injector,\n signal,\n Signal,\n ViewContainerRef,\n WritableSignal,\n} from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport {\n createOverlay,\n NgpFlip,\n NgpOffset,\n NgpOverlay,\n NgpOverlayConfig,\n NgpOverlayContent,\n} from 'ng-primitives/portal';\nimport {\n attrBinding,\n controlled,\n createPrimitive,\n dataBinding,\n deprecatedSetter,\n listener,\n} from 'ng-primitives/state';\nimport { safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { NgpMenuPlacement } from '../menu-trigger/menu-trigger';\nimport { injectMenuState } from '../menu/menu-state';\n\nexport interface NgpSubmenuTriggerState {\n /**\n * The menu template or component.\n */\n readonly menu: WritableSignal<NgpOverlayContent<any> | undefined>;\n\n /**\n * The computed placement of the menu.\n */\n readonly placement: WritableSignal<NgpMenuPlacement>;\n\n /**\n * Whether the menu is open.\n */\n readonly open: Signal<boolean>;\n\n /**\n * The offset of the menu.\n */\n readonly offset: WritableSignal<NgpOffset>;\n\n /**\n * The disabled state of the trigger.\n */\n readonly disabled: WritableSignal<boolean>;\n\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip: WritableSignal<NgpFlip>;\n\n /**\n * The focus origin used to open the submenu.\n * Used by the submenu's focus trap for :focus-visible styling.\n * @internal\n */\n readonly openOrigin: Signal<FocusOrigin>;\n\n /**\n * Show the menu.\n * @param origin - The focus origin (keyboard, mouse, touch, or program)\n */\n show(origin?: FocusOrigin): void;\n\n /**\n * Hide the menu.\n * @param origin - The focus origin\n */\n hide(origin?: FocusOrigin): void;\n\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void;\n\n /**\n * Set whether the trigger is disabled.\n * @param isDisabled - Whether the trigger is disabled\n */\n setDisabled(isDisabled: boolean): void;\n\n /**\n * Set the menu template or component.\n * @param menu - The menu content\n */\n setMenu(menu: NgpOverlayContent<any> | undefined): void;\n\n /**\n * Set the placement of the menu.\n * @param placement - The menu placement\n */\n setPlacement(placement: NgpMenuPlacement): void;\n\n /**\n * Set the offset of the menu.\n * @param offset - The menu offset\n */\n setOffset(offset: NgpOffset): void;\n\n /**\n * Set whether the menu should flip when there is not enough space.\n * @param shouldFlip - Whether the menu should flip\n */\n setFlip(shouldFlip: NgpFlip): void;\n\n /**\n * Focus the trigger element.\n * @param origin - The focus origin\n */\n focus(origin: FocusOrigin): void;\n\n /**\n * Set whether the pointer is over the menu content.\n * For submenus, this is a no-op as hover is handled via showSubmenuOnHover.\n * @param isOver - Whether the pointer is over the content\n * @internal\n */\n setPointerOverContent(isOver: boolean): void;\n}\n\nexport interface NgpSubmenuTriggerProps<T = unknown> {\n /**\n * Whether the trigger is disabled.\n */\n readonly disabled?: Signal<boolean>;\n /**\n * The menu template or component.\n */\n readonly menu?: Signal<NgpOverlayContent<T> | undefined>;\n /**\n * The placement of the menu.\n */\n readonly placement?: Signal<NgpMenuPlacement>;\n /**\n * The offset of the menu.\n */\n readonly offset?: Signal<NgpOffset>;\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip?: Signal<NgpFlip>;\n}\n\nexport const [\n NgpSubmenuTriggerStateToken,\n ngpSubmenuTrigger,\n injectSubmenuTriggerState,\n provideSubmenuTriggerState,\n] = createPrimitive(\n 'NgpSubmenuTrigger',\n <T>({\n disabled: _disabled = signal(false),\n menu: _menu = signal<NgpOverlayContent<T> | undefined>(undefined),\n placement: _placement = signal('right-start'),\n offset: _offset = signal(0),\n flip: _flip = signal(true),\n }: NgpSubmenuTriggerProps<T>) => {\n const element = injectElementRef();\n const injector = inject(Injector);\n const viewContainerRef = inject(ViewContainerRef);\n const parentMenu = injectMenuState({ optional: true });\n const focusMonitor = inject(FocusMonitor);\n\n // Controlled properties\n const menu = controlled(_menu);\n const disabled = controlled(_disabled);\n const placement = controlled(_placement);\n const flip = controlled(_flip);\n const offset = controlled(_offset);\n\n const overlay = signal<NgpOverlay<T> | null>(null);\n const open = computed(() => overlay()?.isOpen() ?? false);\n const openOrigin = signal<FocusOrigin>('program');\n\n // Subscribe to parent menu's closeSubmenus\n parentMenu()\n ?.closeSubmenus.pipe(safeTakeUntilDestroyed())\n .subscribe(submenuElement => {\n // if the element is not the trigger, we want to close the menu\n if (submenuElement === element.nativeElement) {\n return;\n }\n\n hide('mouse');\n });\n\n // Host bindings\n attrBinding(element, 'aria-haspopup', 'true');\n attrBinding(element, 'aria-expanded', open);\n dataBinding(element, 'data-open', open);\n\n // Event listeners\n listener(element, 'click', onClick);\n listener(element, 'keydown', handleArrowKey);\n listener(element, 'pointerenter', showSubmenuOnHover);\n\n // Methods\n function onClick(event: MouseEvent): void {\n if (disabled?.()) {\n return;\n }\n toggle(event);\n }\n\n function toggle(event: MouseEvent): void {\n // determine the origin of the event, 0 is keyboard, 1 is mouse\n const origin: FocusOrigin = event.detail === 0 ? 'keyboard' : 'mouse';\n\n // if the menu is open then hide it\n if (open()) {\n hide(origin);\n } else {\n show(origin);\n }\n }\n\n function show(origin: FocusOrigin = 'program'): void {\n // If the trigger is disabled, don't show the menu\n if (disabled?.()) {\n return;\n }\n\n // Store the origin used to open the menu (for focus-visible styling in submenu)\n openOrigin.set(origin);\n\n // Create the overlay if it doesn't exist yet\n if (!overlay()) {\n createOverlayInstance();\n }\n\n // Show the overlay\n overlay()?.show();\n }\n\n function hide(origin: FocusOrigin = 'program'): void {\n // If the trigger is disabled or the menu is not open, do nothing\n if (disabled?.() || !open()) {\n return;\n }\n\n // Hide the overlay\n overlay()?.hide({ origin });\n }\n\n function createOverlayInstance(): void {\n const menuContent = menu?.();\n\n if (!menuContent) {\n throw new Error('Menu must be either a TemplateRef or a ComponentType');\n }\n\n // Create config for the overlay\n // Note: restoreFocus is false because submenus should never auto-restore focus.\n // When closeAllMenus is called, the ROOT menu's overlay handles focus restoration.\n // When closing just the submenu (Left Arrow), the caller handles focus explicitly.\n // closeOnEscape is false because we handle Escape in menu-state.ts to ensure\n // proper focus restoration through closeAllMenus.\n const config: NgpOverlayConfig<T> = {\n content: menuContent,\n triggerElement: element.nativeElement,\n injector,\n placement,\n offset: offset(),\n flip: flip(),\n closeOnOutsideClick: true,\n closeOnEscape: false,\n restoreFocus: false,\n viewContainerRef,\n };\n\n overlay.set(createOverlay(config));\n }\n\n function handleArrowKey(event: Event): void {\n if (event instanceof KeyboardEvent === false) {\n return;\n }\n\n const direction = getComputedStyle(element.nativeElement).direction;\n const isRtl = direction === 'rtl';\n\n const isRightArrow = event.key === 'ArrowRight';\n const isLeftArrow = event.key === 'ArrowLeft';\n\n if ((isRightArrow && !isRtl) || (isLeftArrow && isRtl)) {\n event.preventDefault();\n show('keyboard');\n }\n }\n\n function showSubmenuOnHover(event: Event): void {\n if (event instanceof PointerEvent === false) {\n return;\n }\n\n // if this was triggered by a touch event, we don't want to show the submenu\n // as it will be shown by the click event - this prevents the submenu from being toggled\n if (event.pointerType === 'touch') {\n return;\n }\n\n show('mouse');\n }\n\n function setDisabled(isDisabled: boolean): void {\n disabled.set(isDisabled);\n\n if (isDisabled && open()) {\n hide();\n }\n }\n\n function setMenu(newMenu: NgpOverlayContent<T> | undefined): void {\n menu.set(newMenu);\n }\n\n function setPlacement(newPlacement: NgpMenuPlacement): void {\n placement.set(newPlacement);\n }\n\n function setOffset(newOffset: NgpOffset): void {\n offset.set(newOffset);\n }\n\n function setFlip(shouldFlip: NgpFlip): void {\n flip.set(shouldFlip);\n }\n\n function focus(origin: FocusOrigin): void {\n focusMonitor.focusVia(element.nativeElement, origin, { preventScroll: true });\n }\n\n // No-op for submenus - hover behavior is handled via showSubmenuOnHover on the trigger element\n\n function setPointerOverContent(_isOver: boolean): void {\n // Submenus don't need pointer tracking on content because:\n // 1. The submenu trigger handles hover via showSubmenuOnHover\n // 2. Closing on hover-out is handled by the parent menu's closeSubmenus mechanism\n }\n\n return {\n placement: deprecatedSetter(placement, 'setPlacement'),\n offset: deprecatedSetter(offset, 'setOffset'),\n disabled: deprecatedSetter(disabled, 'setDisabled'),\n menu: deprecatedSetter(menu, 'setMenu'),\n flip: deprecatedSetter(flip, 'setFlip'),\n open,\n openOrigin,\n show,\n hide,\n toggle,\n setDisabled,\n setMenu,\n setFlip,\n setPlacement,\n setOffset,\n focus,\n setPointerOverContent,\n } satisfies NgpSubmenuTriggerState;\n },\n);\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input } from '@angular/core';\nimport {\n coerceFlip,\n coerceOffset,\n NgpFlip,\n NgpFlipInput,\n NgpOffset,\n NgpOffsetInput,\n NgpOverlayContent,\n} from 'ng-primitives/portal';\nimport { NgpMenuPlacement } from '../menu-trigger/menu-trigger';\nimport { NgpMenuTriggerStateToken } from '../menu-trigger/menu-trigger-state';\nimport {\n NgpSubmenuTriggerStateToken,\n ngpSubmenuTrigger,\n provideSubmenuTriggerState,\n} from './submenu-trigger-state';\n\n@Directive({\n selector: '[ngpSubmenuTrigger]',\n exportAs: 'ngpSubmenuTrigger',\n providers: [\n provideSubmenuTriggerState(),\n // Also provide as NgpMenuTriggerStateToken so the submenu's menu-state\n // can find this trigger's openOrigin for :focus-visible styling\n { provide: NgpMenuTriggerStateToken, useExisting: NgpSubmenuTriggerStateToken },\n ],\n})\nexport class NgpSubmenuTrigger<T = unknown> {\n /**\n * Access the submenu template ref.\n */\n readonly menu = input<NgpOverlayContent<T>>(undefined, {\n alias: 'ngpSubmenuTrigger',\n });\n\n /**\n * Define if the trigger should be disabled.\n * @default false\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpSubmenuTriggerDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Define the placement of the menu relative to the trigger.\n * @default 'right-start'\n */\n readonly placement = input<NgpMenuPlacement>('right-start', {\n alias: 'ngpSubmenuTriggerPlacement',\n });\n\n /**\n * Define the offset of the menu relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 0\n */\n readonly offset = input<NgpOffset, NgpOffsetInput>(0, {\n alias: 'ngpSubmenuTriggerOffset',\n transform: coerceOffset,\n });\n\n /**\n * Define whether the menu should flip when there is not enough space for the menu.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n readonly flip = input<NgpFlip, NgpFlipInput>(true, {\n alias: 'ngpSubmenuTriggerFlip',\n transform: coerceFlip,\n });\n\n /**\n * Access the menu trigger state.\n */\n private readonly state = ngpSubmenuTrigger<T>({\n disabled: this.disabled,\n menu: this.menu,\n placement: this.placement,\n offset: this.offset,\n flip: this.flip,\n });\n\n /**\n * Show the menu.\n */\n show(): void {\n this.state.show();\n }\n\n /**\n * Hide the menu.\n */\n hide(origin: FocusOrigin = 'program'): void {\n this.state.hide(origin);\n }\n\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void {\n this.state.toggle(event);\n }\n\n /**\n * Focus the trigger element.\n * @param origin - The focus origin\n */\n focus(origin: FocusOrigin = 'program'): void {\n this.state.focus(origin);\n }\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { inject, Injector, signal, Signal } from '@angular/core';\nimport { ngpButton } from 'ng-primitives/button';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { attrBinding, createPrimitive, listener } from 'ng-primitives/state';\nimport { injectMenuState } from '../menu/menu-state';\nimport { NgpSubmenuTrigger } from '../submenu-trigger/submenu-trigger';\n\nexport interface NgpMenuItemState {}\n\nexport interface NgpMenuItemProps {\n /**\n * Whether the menu item is disabled.\n */\n readonly disabled?: Signal<boolean>;\n\n /**\n * Whether the menu should close when this item is selected.\n * @default signal(true)\n */\n readonly closeOnSelect?: Signal<boolean>;\n\n /**\n * The ARIA role for the menu item.\n * @default 'menuitem'\n */\n readonly role?: string;\n}\n\nexport const [NgpMenuItemStateToken, ngpMenuItem, injectMenuItemState, provideMenuItemState] =\n createPrimitive(\n 'NgpMenuItem',\n ({\n disabled = signal(false),\n closeOnSelect = signal(true),\n role = 'menuitem',\n }: NgpMenuItemProps) => {\n const element = injectElementRef();\n const injector = inject(Injector);\n const parentMenu = injectMenuState({ optional: true });\n\n ngpButton({ disabled });\n\n // Host bindings\n attrBinding(element, 'role', role);\n\n // Event listeners\n listener(element, 'click', onClick);\n listener(element, 'keydown', handleArrowKey);\n listener(element, 'mouseenter', showSubmenuOnHover);\n\n // Methods\n function onClick(event: MouseEvent): void {\n // we do this here to avoid circular dependency issues\n const trigger = injector.get(NgpSubmenuTrigger, null, { self: true, optional: true });\n\n const origin: FocusOrigin = event.detail === 0 ? 'keyboard' : 'mouse';\n\n // if this is a submenu trigger, we don't want to close the menu, we want to open the submenu\n // if closeOnSelect is false, we don't want to close the menu (e.g., checkbox/radio items)\n if (!trigger && closeOnSelect()) {\n parentMenu()?.closeAllMenus(origin);\n }\n }\n\n function handleArrowKey(event: Event): void {\n if (event instanceof KeyboardEvent === false) {\n return;\n }\n\n // if there is no parent menu, we don't want to do anything\n const trigger = injector.get(NgpSubmenuTrigger, null, { optional: true, skipSelf: true });\n\n if (!trigger) {\n return;\n }\n\n const direction = getComputedStyle(element.nativeElement).direction;\n const isRtl = direction === 'rtl';\n\n const isLeftArrow = event.key === 'ArrowLeft';\n const isRightArrow = event.key === 'ArrowRight';\n\n if ((isLeftArrow && !isRtl) || (isRightArrow && isRtl)) {\n event.preventDefault();\n\n if (trigger) {\n trigger.hide('keyboard');\n // Explicitly focus the submenu trigger since submenus have restoreFocus: false\n trigger.focus('keyboard');\n }\n }\n }\n\n function showSubmenuOnHover(): void {\n parentMenu()?.closeSubmenus.next(element.nativeElement);\n }\n\n return {} satisfies NgpMenuItemState;\n },\n );\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input } from '@angular/core';\nimport { ngpRovingFocusItem, provideRovingFocusItemState } from 'ng-primitives/roving-focus';\nimport { ngpMenuItem, provideMenuItemState } from './menu-item-state';\n\n/**\n * The `NgpMenuItem` directive represents a menu item.\n */\n@Directive({\n selector: '[ngpMenuItem]',\n exportAs: 'ngpMenuItem',\n providers: [provideMenuItemState(), provideRovingFocusItemState()],\n})\nexport class NgpMenuItem {\n /** Whether the menu item is disabled */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuItemDisabled',\n transform: booleanAttribute,\n });\n\n /** Whether the menu should close when this item is selected */\n readonly closeOnSelect = input<boolean, BooleanInput>(true, {\n alias: 'ngpMenuItemCloseOnSelect',\n transform: booleanAttribute,\n });\n\n constructor() {\n ngpMenuItem({ disabled: this.disabled, closeOnSelect: this.closeOnSelect });\n ngpRovingFocusItem({ disabled: this.disabled });\n }\n}\n","import { Signal, signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport {\n attrBinding,\n controlled,\n createPrimitive,\n dataBinding,\n emitter,\n listener,\n} from 'ng-primitives/state';\nimport { Observable } from 'rxjs';\nimport { ngpMenuItem } from '../menu-item/menu-item-state';\n\nexport interface NgpMenuItemCheckboxState {\n /**\n * Whether the checkbox is checked.\n */\n readonly checked: Signal<boolean>;\n\n /**\n * Emits when the checked state changes.\n */\n readonly checkedChange: Observable<boolean>;\n\n /**\n * Toggle the checkbox value.\n */\n toggle(): void;\n}\n\nexport interface NgpMenuItemCheckboxProps {\n /**\n * Whether the checkbox is checked.\n */\n readonly checked?: Signal<boolean>;\n\n /**\n * Whether the checkbox is disabled.\n */\n readonly disabled?: Signal<boolean>;\n\n /**\n * Callback fired when the checked state changes.\n */\n readonly onCheckedChange?: (checked: boolean) => void;\n}\n\nexport const [\n NgpMenuItemCheckboxStateToken,\n ngpMenuItemCheckbox,\n injectMenuItemCheckboxState,\n provideMenuItemCheckboxState,\n] = createPrimitive(\n 'NgpMenuItemCheckbox',\n ({\n checked: _checked = signal(false),\n disabled = signal(false),\n onCheckedChange,\n }: NgpMenuItemCheckboxProps): NgpMenuItemCheckboxState => {\n const element = injectElementRef();\n const checked = controlled(_checked);\n const checkedChange = emitter<boolean>();\n\n // Use base menu item behavior but don't close on select\n ngpMenuItem({ disabled, closeOnSelect: signal(false), role: 'menuitemcheckbox' });\n\n // Host bindings\n attrBinding(element, 'aria-checked', checked);\n dataBinding(element, 'data-checked', checked);\n\n // Toggle on click\n listener(element, 'click', () => toggle());\n\n function toggle(): void {\n if (disabled()) {\n return;\n }\n\n const nextChecked = !checked();\n checked.set(nextChecked);\n onCheckedChange?.(nextChecked);\n checkedChange.emit(nextChecked);\n }\n\n return {\n checked,\n checkedChange: checkedChange.asObservable(),\n toggle,\n } satisfies NgpMenuItemCheckboxState;\n },\n);\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input, output } from '@angular/core';\nimport { ngpRovingFocusItem, provideRovingFocusItemState } from 'ng-primitives/roving-focus';\nimport { ngpMenuItemCheckbox, provideMenuItemCheckboxState } from './menu-item-checkbox-state';\n\n/**\n * The `NgpMenuItemCheckbox` directive represents a menu item that can be toggled on and off.\n */\n@Directive({\n selector: '[ngpMenuItemCheckbox]',\n exportAs: 'ngpMenuItemCheckbox',\n providers: [provideMenuItemCheckboxState(), provideRovingFocusItemState()],\n})\nexport class NgpMenuItemCheckbox {\n /** Whether the checkbox is checked */\n readonly checked = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuItemCheckboxChecked',\n transform: booleanAttribute,\n });\n\n /** Event emitted when the checked state changes */\n readonly checkedChange = output<boolean>({\n alias: 'ngpMenuItemCheckboxCheckedChange',\n });\n\n /** Whether the menu item checkbox is disabled */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuItemCheckboxDisabled',\n transform: booleanAttribute,\n });\n\n constructor() {\n ngpMenuItemCheckbox({\n checked: this.checked,\n disabled: this.disabled,\n onCheckedChange: value => this.checkedChange.emit(value),\n });\n ngpRovingFocusItem({ disabled: this.disabled });\n }\n}\n","import { Signal, signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { attrBinding, controlled, createPrimitive, emitter } from 'ng-primitives/state';\nimport { Observable } from 'rxjs';\n\nexport interface NgpMenuItemRadioGroupState {\n /**\n * The current value of the radio group.\n */\n readonly value: Signal<string | null>;\n\n /**\n * Emits when the value changes.\n */\n readonly valueChange: Observable<string>;\n\n /**\n * Select a radio item by value.\n */\n select(value: string): void;\n}\n\nexport interface NgpMenuItemRadioGroupProps {\n /**\n * The current value of the radio group.\n */\n readonly value?: Signal<string | null>;\n\n /**\n * Callback fired when the value changes.\n */\n readonly onValueChange?: (value: string) => void;\n}\n\nexport const [\n NgpMenuItemRadioGroupStateToken,\n ngpMenuItemRadioGroup,\n injectMenuItemRadioGroupState,\n provideMenuItemRadioGroupState,\n] = createPrimitive(\n 'NgpMenuItemRadioGroup',\n ({\n value: _value = signal(null),\n onValueChange,\n }: NgpMenuItemRadioGroupProps): NgpMenuItemRadioGroupState => {\n const element = injectElementRef();\n const value = controlled(_value);\n const valueChange = emitter<string>();\n\n // Host bindings\n attrBinding(element, 'role', 'group');\n\n function select(newValue: string): void {\n if (value() === newValue) {\n return;\n }\n\n value.set(newValue);\n onValueChange?.(newValue);\n valueChange.emit(newValue);\n }\n\n return {\n value,\n valueChange: valueChange.asObservable(),\n select,\n } satisfies NgpMenuItemRadioGroupState;\n },\n);\n","import { computed, Signal, signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { attrBinding, createPrimitive, dataBinding, listener } from 'ng-primitives/state';\nimport { injectMenuItemRadioGroupState } from '../menu-item-radio-group/menu-item-radio-group-state';\nimport { ngpMenuItem } from '../menu-item/menu-item-state';\n\nexport interface NgpMenuItemRadioState {\n /**\n * Whether the radio item is checked.\n */\n readonly checked: Signal<boolean>;\n}\n\nexport interface NgpMenuItemRadioProps {\n /**\n * The value this radio item represents.\n */\n readonly value: Signal<string>;\n\n /**\n * Whether the radio item is disabled.\n */\n readonly disabled?: Signal<boolean>;\n}\n\nexport const [\n NgpMenuItemRadioStateToken,\n ngpMenuItemRadio,\n injectMenuItemRadioState,\n provideMenuItemRadioState,\n] = createPrimitive(\n 'NgpMenuItemRadio',\n ({ value, disabled = signal(false) }: NgpMenuItemRadioProps): NgpMenuItemRadioState => {\n const element = injectElementRef();\n const radioGroup = injectMenuItemRadioGroupState();\n\n // Use base menu item behavior but don't close on select\n ngpMenuItem({ disabled, closeOnSelect: signal(false), role: 'menuitemradio' });\n\n // Computed checked state\n const checked = computed(() => radioGroup()?.value() === value());\n\n // Host bindings\n attrBinding(element, 'aria-checked', checked);\n dataBinding(element, 'data-checked', checked);\n\n // Select on click\n listener(element, 'click', () => {\n if (disabled()) {\n return;\n }\n radioGroup()?.select(value());\n });\n\n return {\n checked,\n } satisfies NgpMenuItemRadioState;\n },\n);\n","import { computed, Directive } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { dataBinding } from 'ng-primitives/state';\nimport { injectMenuItemCheckboxState } from '../menu-item-checkbox/menu-item-checkbox-state';\nimport { injectMenuItemRadioState } from '../menu-item-radio/menu-item-radio-state';\n\n/**\n * The `NgpMenuItemIndicator` directive renders inside a checkbox or radio menu item\n * and exposes `data-checked` based on the parent item's checked state.\n */\n@Directive({\n selector: '[ngpMenuItemIndicator]',\n exportAs: 'ngpMenuItemIndicator',\n})\nexport class NgpMenuItemIndicator {\n constructor() {\n const element = injectElementRef();\n const checkboxState = injectMenuItemCheckboxState({ optional: true });\n const radioState = injectMenuItemRadioState({ optional: true });\n\n const checked = computed(() => checkboxState()?.checked() ?? radioState()?.checked() ?? false);\n\n dataBinding(element, 'data-checked', checked);\n }\n}\n","import { Directive, input, output } from '@angular/core';\nimport {\n ngpMenuItemRadioGroup,\n provideMenuItemRadioGroupState,\n} from './menu-item-radio-group-state';\n\n/**\n * The `NgpMenuItemRadioGroup` directive represents a group of radio menu items.\n */\n@Directive({\n selector: '[ngpMenuItemRadioGroup]',\n exportAs: 'ngpMenuItemRadioGroup',\n providers: [provideMenuItemRadioGroupState()],\n})\nexport class NgpMenuItemRadioGroup {\n /** The current value of the radio group */\n readonly value = input<string | null>(null, {\n alias: 'ngpMenuItemRadioGroupValue',\n });\n\n /** Event emitted when the value changes */\n readonly valueChange = output<string>({\n alias: 'ngpMenuItemRadioGroupValueChange',\n });\n\n constructor() {\n ngpMenuItemRadioGroup({\n value: this.value,\n onValueChange: value => this.valueChange.emit(value),\n });\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input } from '@angular/core';\nimport { ngpRovingFocusItem, provideRovingFocusItemState } from 'ng-primitives/roving-focus';\nimport { ngpMenuItemRadio, provideMenuItemRadioState } from './menu-item-radio-state';\n\n/**\n * The `NgpMenuItemRadio` directive represents a radio menu item within a radio group.\n */\n@Directive({\n selector: '[ngpMenuItemRadio]',\n exportAs: 'ngpMenuItemRadio',\n providers: [provideMenuItemRadioState(), provideRovingFocusItemState()],\n})\nexport class NgpMenuItemRadio {\n /** The value this radio item represents */\n readonly value = input.required<string>({\n alias: 'ngpMenuItemRadioValue',\n });\n\n /** Whether the radio item is disabled */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuItemRadioDisabled',\n transform: booleanAttribute,\n });\n\n constructor() {\n ngpMenuItemRadio({ value: this.value, disabled: this.disabled });\n ngpRovingFocusItem({ disabled: this.disabled });\n }\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input, numberAttribute, Signal } from '@angular/core';\nimport {\n coerceFlip,\n coerceOffset,\n coerceShift,\n NgpFlip,\n NgpFlipInput,\n NgpOffset,\n NgpOffsetInput,\n NgpOverlayContent,\n NgpShift,\n NgpShiftInput,\n} from 'ng-primitives/portal';\nimport { injectMenuConfig, NgpMenuTriggerType } from '../config/menu-config';\nimport { ngpMenuTrigger, provideMenuTriggerState } from './menu-trigger-state';\n\n/**\n * The `NgpMenuTrigger` directive allows you to turn an element into a menu trigger.\n */\n@Directive({\n selector: '[ngpMenuTrigger]',\n exportAs: 'ngpMenuTrigger',\n providers: [provideMenuTriggerState()],\n})\nexport class NgpMenuTrigger<T = unknown> {\n /**\n * Access the global menu configuration.\n */\n private readonly config = injectMenuConfig();\n\n /**\n * Access the menu template ref or ComponentType.\n */\n readonly menu = input<NgpOverlayContent<T>>(undefined, {\n alias: 'ngpMenuTrigger',\n });\n\n /**\n * Define if the trigger should be disabled.\n * @default false\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuTriggerDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Define the placement of the menu relative to the trigger.\n * @default 'bottom-start'\n */\n readonly placement = input<NgpMenuPlacement>(this.config.placement, {\n alias: 'ngpMenuTriggerPlacement',\n });\n\n /**\n * Define the offset of the menu relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 4\n */\n readonly offset = input<NgpOffset, NgpOffsetInput>(this.config.offset, {\n alias: 'ngpMenuTriggerOffset',\n transform: coerceOffset,\n });\n\n /**\n * Define whether the menu should flip when there is not enough space for the menu.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n readonly flip = input<NgpFlip, NgpFlipInput>(this.config.flip, {\n alias: 'ngpMenuTriggerFlip',\n transform: coerceFlip,\n });\n\n /**\n * Configure shift behavior to keep the menu in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n readonly shift = input<NgpShift, NgpShiftInput>(this.config.shift, {\n alias: 'ngpMenuTriggerShift',\n transform: coerceShift,\n });\n\n /**\n * Define the container in which the menu should be attached.\n * @default document.body\n */\n readonly container = input<HTMLElement | string | null>(this.config.container, {\n alias: 'ngpMenuTriggerContainer',\n });\n\n /**\n * Defines how the menu behaves when the window is scrolled.\n * @default 'block'\n */\n readonly scrollBehavior = input<'reposition' | 'block' | 'close'>(this.config.scrollBehavior, {\n alias: 'ngpMenuTriggerScrollBehavior',\n });\n\n /**\n * Define the cooldown duration in milliseconds.\n * When moving from one menu to another within this duration,\n * the showDelay is skipped for the new menu.\n * @default 0\n */\n readonly cooldown = input<number, NumberInput>(this.config.cooldown, {\n alias: 'ngpMenuTriggerCooldown',\n transform: numberAttribute,\n });\n\n /**\n * Provide context to the menu. This can be used to pass data to the menu content.\n */\n readonly context = input<T>(undefined, {\n alias: 'ngpMenuTriggerContext',\n });\n\n /**\n * Define which trigger types are enabled for the menu.\n * @default ['click']\n */\n readonly triggers = input<NgpMenuTriggerType[]>(this.config.triggers, {\n alias: 'ngpMenuTriggerOpenTriggers',\n });\n\n /**\n * Define the delay before the menu is displayed (hover/focus triggers).\n * @default 0\n */\n readonly showDelay = input<number, NumberInput>(this.config.showDelay, {\n alias: 'ngpMenuTriggerShowDelay',\n transform: numberAttribute,\n });\n\n /**\n * Define the delay before the menu is hidden (hover/focus triggers).\n * @default 0\n */\n readonly hideDelay = input<number, NumberInput>(this.config.hideDelay, {\n alias: 'ngpMenuTriggerHideDelay',\n transform: numberAttribute,\n });\n\n /**\n * The menu trigger state.\n */\n private readonly state = ngpMenuTrigger<T>({\n disabled: this.disabled,\n menu: this.menu,\n placement: this.placement,\n offset: this.offset,\n flip: this.flip,\n shift: this.shift(),\n container: this.container,\n scrollBehavior: this.scrollBehavior,\n cooldown: this.cooldown,\n context: this.context as Signal<T>,\n triggers: this.triggers,\n showDelay: this.showDelay,\n hideDelay: this.hideDelay,\n });\n\n /**\n * Show the menu.\n */\n show(): void {\n this.state.show();\n }\n\n /**\n * Hide the menu.\n * @param origin - The focus origin\n * @internal\n */\n hide(origin?: FocusOrigin): void {\n this.state.hide(origin);\n }\n\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void {\n this.state.toggle(event);\n }\n}\n\nexport type NgpMenuPlacement =\n | 'top'\n | 'right'\n | 'bottom'\n | 'left'\n | 'top-start'\n | 'top-end'\n | 'right-start'\n | 'right-end'\n | 'bottom-start'\n | 'bottom-end'\n | 'left-start'\n | 'left-end';\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input } from '@angular/core';\nimport { provideFocusTrapState } from 'ng-primitives/focus-trap';\nimport { ngpRovingFocusGroup, provideRovingFocusGroupState } from 'ng-primitives/roving-focus';\nimport { injectMenuConfig } from '../config/menu-config';\nimport { ngpMenu, provideMenuState } from './menu-state';\n\n/**\n * The `NgpMenu` is a container for menu items.\n */\n@Directive({\n selector: '[ngpMenu]',\n exportAs: 'ngpMenu',\n providers: [\n // ensure we don't inherit the focus group from the parent menu if there is one\n provideRovingFocusGroupState({ inherit: false }),\n provideMenuState({ inherit: false }),\n provideFocusTrapState(),\n ],\n})\nexport class NgpMenu {\n private readonly config = injectMenuConfig();\n\n /**\n * Whether focus should wrap around when reaching the end of the menu.\n * @default true\n */\n readonly wrap = input<boolean, BooleanInput>(this.config.wrap, {\n alias: 'ngpMenuWrap',\n transform: booleanAttribute,\n });\n\n private readonly state = ngpMenu({ wrap: this.wrap });\n\n constructor() {\n ngpRovingFocusGroup({ inherit: false, wrap: this.wrap });\n }\n\n /** @internal Close the menu and any parent menus */\n closeAllMenus(origin: FocusOrigin): void {\n this.state.closeAllMenus(origin);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/menu/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import * as _angular_core from '@angular/core';
|
|
|
4
4
|
import { Provider, Signal, WritableSignal } from '@angular/core';
|
|
5
5
|
import { FocusOrigin } from '@angular/cdk/a11y';
|
|
6
6
|
import { BooleanInput, NumberInput } from '@angular/cdk/coercion';
|
|
7
|
-
import { Subject } from 'rxjs';
|
|
7
|
+
import { Observable, Subject } from 'rxjs';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* The `NgpMenuTrigger` directive allows you to turn an element into a menu trigger.
|
|
@@ -182,9 +182,11 @@ declare function provideMenuConfig(config: Partial<NgpMenuConfig>): Provider[];
|
|
|
182
182
|
declare class NgpMenuItem {
|
|
183
183
|
/** Whether the menu item is disabled */
|
|
184
184
|
readonly disabled: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
|
|
185
|
+
/** Whether the menu should close when this item is selected */
|
|
186
|
+
readonly closeOnSelect: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
|
|
185
187
|
constructor();
|
|
186
188
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgpMenuItem, never>;
|
|
187
|
-
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgpMenuItem, "[ngpMenuItem]", ["ngpMenuItem"], { "disabled": { "alias": "ngpMenuItemDisabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
189
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgpMenuItem, "[ngpMenuItem]", ["ngpMenuItem"], { "disabled": { "alias": "ngpMenuItemDisabled"; "required": false; "isSignal": true; }; "closeOnSelect": { "alias": "ngpMenuItemCloseOnSelect"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
188
190
|
}
|
|
189
191
|
|
|
190
192
|
interface NgpMenuItemState {
|
|
@@ -194,6 +196,16 @@ interface NgpMenuItemProps {
|
|
|
194
196
|
* Whether the menu item is disabled.
|
|
195
197
|
*/
|
|
196
198
|
readonly disabled?: Signal<boolean>;
|
|
199
|
+
/**
|
|
200
|
+
* Whether the menu should close when this item is selected.
|
|
201
|
+
* @default signal(true)
|
|
202
|
+
*/
|
|
203
|
+
readonly closeOnSelect?: Signal<boolean>;
|
|
204
|
+
/**
|
|
205
|
+
* The ARIA role for the menu item.
|
|
206
|
+
* @default 'menuitem'
|
|
207
|
+
*/
|
|
208
|
+
readonly role?: string;
|
|
197
209
|
}
|
|
198
210
|
declare const injectMenuItemState: {
|
|
199
211
|
(): Signal<{}>;
|
|
@@ -212,6 +224,176 @@ declare const provideMenuItemState: (opts?: {
|
|
|
212
224
|
inherit?: boolean;
|
|
213
225
|
}) => _angular_core.FactoryProvider;
|
|
214
226
|
|
|
227
|
+
/**
|
|
228
|
+
* The `NgpMenuItemCheckbox` directive represents a menu item that can be toggled on and off.
|
|
229
|
+
*/
|
|
230
|
+
declare class NgpMenuItemCheckbox {
|
|
231
|
+
/** Whether the checkbox is checked */
|
|
232
|
+
readonly checked: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
|
|
233
|
+
/** Event emitted when the checked state changes */
|
|
234
|
+
readonly checkedChange: _angular_core.OutputEmitterRef<boolean>;
|
|
235
|
+
/** Whether the menu item checkbox is disabled */
|
|
236
|
+
readonly disabled: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
|
|
237
|
+
constructor();
|
|
238
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgpMenuItemCheckbox, never>;
|
|
239
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgpMenuItemCheckbox, "[ngpMenuItemCheckbox]", ["ngpMenuItemCheckbox"], { "checked": { "alias": "ngpMenuItemCheckboxChecked"; "required": false; "isSignal": true; }; "disabled": { "alias": "ngpMenuItemCheckboxDisabled"; "required": false; "isSignal": true; }; }, { "checkedChange": "ngpMenuItemCheckboxCheckedChange"; }, never, never, true, never>;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
interface NgpMenuItemCheckboxState {
|
|
243
|
+
/**
|
|
244
|
+
* Whether the checkbox is checked.
|
|
245
|
+
*/
|
|
246
|
+
readonly checked: Signal<boolean>;
|
|
247
|
+
/**
|
|
248
|
+
* Emits when the checked state changes.
|
|
249
|
+
*/
|
|
250
|
+
readonly checkedChange: Observable<boolean>;
|
|
251
|
+
/**
|
|
252
|
+
* Toggle the checkbox value.
|
|
253
|
+
*/
|
|
254
|
+
toggle(): void;
|
|
255
|
+
}
|
|
256
|
+
interface NgpMenuItemCheckboxProps {
|
|
257
|
+
/**
|
|
258
|
+
* Whether the checkbox is checked.
|
|
259
|
+
*/
|
|
260
|
+
readonly checked?: Signal<boolean>;
|
|
261
|
+
/**
|
|
262
|
+
* Whether the checkbox is disabled.
|
|
263
|
+
*/
|
|
264
|
+
readonly disabled?: Signal<boolean>;
|
|
265
|
+
/**
|
|
266
|
+
* Callback fired when the checked state changes.
|
|
267
|
+
*/
|
|
268
|
+
readonly onCheckedChange?: (checked: boolean) => void;
|
|
269
|
+
}
|
|
270
|
+
declare const injectMenuItemCheckboxState: {
|
|
271
|
+
(): Signal<NgpMenuItemCheckboxState>;
|
|
272
|
+
(options: {
|
|
273
|
+
hoisted: true;
|
|
274
|
+
optional?: boolean;
|
|
275
|
+
skipSelf?: boolean;
|
|
276
|
+
}): Signal<NgpMenuItemCheckboxState | null>;
|
|
277
|
+
(options?: {
|
|
278
|
+
hoisted?: boolean;
|
|
279
|
+
optional?: boolean;
|
|
280
|
+
skipSelf?: boolean;
|
|
281
|
+
}): Signal<NgpMenuItemCheckboxState> | Signal<NgpMenuItemCheckboxState | null>;
|
|
282
|
+
};
|
|
283
|
+
declare const provideMenuItemCheckboxState: (opts?: {
|
|
284
|
+
inherit?: boolean;
|
|
285
|
+
}) => _angular_core.FactoryProvider;
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* The `NgpMenuItemIndicator` directive renders inside a checkbox or radio menu item
|
|
289
|
+
* and exposes `data-checked` based on the parent item's checked state.
|
|
290
|
+
*/
|
|
291
|
+
declare class NgpMenuItemIndicator {
|
|
292
|
+
constructor();
|
|
293
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgpMenuItemIndicator, never>;
|
|
294
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgpMenuItemIndicator, "[ngpMenuItemIndicator]", ["ngpMenuItemIndicator"], {}, {}, never, never, true, never>;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* The `NgpMenuItemRadioGroup` directive represents a group of radio menu items.
|
|
299
|
+
*/
|
|
300
|
+
declare class NgpMenuItemRadioGroup {
|
|
301
|
+
/** The current value of the radio group */
|
|
302
|
+
readonly value: _angular_core.InputSignal<string | null>;
|
|
303
|
+
/** Event emitted when the value changes */
|
|
304
|
+
readonly valueChange: _angular_core.OutputEmitterRef<string>;
|
|
305
|
+
constructor();
|
|
306
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgpMenuItemRadioGroup, never>;
|
|
307
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgpMenuItemRadioGroup, "[ngpMenuItemRadioGroup]", ["ngpMenuItemRadioGroup"], { "value": { "alias": "ngpMenuItemRadioGroupValue"; "required": false; "isSignal": true; }; }, { "valueChange": "ngpMenuItemRadioGroupValueChange"; }, never, never, true, never>;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
interface NgpMenuItemRadioGroupState {
|
|
311
|
+
/**
|
|
312
|
+
* The current value of the radio group.
|
|
313
|
+
*/
|
|
314
|
+
readonly value: Signal<string | null>;
|
|
315
|
+
/**
|
|
316
|
+
* Emits when the value changes.
|
|
317
|
+
*/
|
|
318
|
+
readonly valueChange: Observable<string>;
|
|
319
|
+
/**
|
|
320
|
+
* Select a radio item by value.
|
|
321
|
+
*/
|
|
322
|
+
select(value: string): void;
|
|
323
|
+
}
|
|
324
|
+
interface NgpMenuItemRadioGroupProps {
|
|
325
|
+
/**
|
|
326
|
+
* The current value of the radio group.
|
|
327
|
+
*/
|
|
328
|
+
readonly value?: Signal<string | null>;
|
|
329
|
+
/**
|
|
330
|
+
* Callback fired when the value changes.
|
|
331
|
+
*/
|
|
332
|
+
readonly onValueChange?: (value: string) => void;
|
|
333
|
+
}
|
|
334
|
+
declare const injectMenuItemRadioGroupState: {
|
|
335
|
+
(): Signal<NgpMenuItemRadioGroupState>;
|
|
336
|
+
(options: {
|
|
337
|
+
hoisted: true;
|
|
338
|
+
optional?: boolean;
|
|
339
|
+
skipSelf?: boolean;
|
|
340
|
+
}): Signal<NgpMenuItemRadioGroupState | null>;
|
|
341
|
+
(options?: {
|
|
342
|
+
hoisted?: boolean;
|
|
343
|
+
optional?: boolean;
|
|
344
|
+
skipSelf?: boolean;
|
|
345
|
+
}): Signal<NgpMenuItemRadioGroupState> | Signal<NgpMenuItemRadioGroupState | null>;
|
|
346
|
+
};
|
|
347
|
+
declare const provideMenuItemRadioGroupState: (opts?: {
|
|
348
|
+
inherit?: boolean;
|
|
349
|
+
}) => _angular_core.FactoryProvider;
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* The `NgpMenuItemRadio` directive represents a radio menu item within a radio group.
|
|
353
|
+
*/
|
|
354
|
+
declare class NgpMenuItemRadio {
|
|
355
|
+
/** The value this radio item represents */
|
|
356
|
+
readonly value: _angular_core.InputSignal<string>;
|
|
357
|
+
/** Whether the radio item is disabled */
|
|
358
|
+
readonly disabled: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
|
|
359
|
+
constructor();
|
|
360
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgpMenuItemRadio, never>;
|
|
361
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgpMenuItemRadio, "[ngpMenuItemRadio]", ["ngpMenuItemRadio"], { "value": { "alias": "ngpMenuItemRadioValue"; "required": true; "isSignal": true; }; "disabled": { "alias": "ngpMenuItemRadioDisabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
interface NgpMenuItemRadioState {
|
|
365
|
+
/**
|
|
366
|
+
* Whether the radio item is checked.
|
|
367
|
+
*/
|
|
368
|
+
readonly checked: Signal<boolean>;
|
|
369
|
+
}
|
|
370
|
+
interface NgpMenuItemRadioProps {
|
|
371
|
+
/**
|
|
372
|
+
* The value this radio item represents.
|
|
373
|
+
*/
|
|
374
|
+
readonly value: Signal<string>;
|
|
375
|
+
/**
|
|
376
|
+
* Whether the radio item is disabled.
|
|
377
|
+
*/
|
|
378
|
+
readonly disabled?: Signal<boolean>;
|
|
379
|
+
}
|
|
380
|
+
declare const injectMenuItemRadioState: {
|
|
381
|
+
(): Signal<NgpMenuItemRadioState>;
|
|
382
|
+
(options: {
|
|
383
|
+
hoisted: true;
|
|
384
|
+
optional?: boolean;
|
|
385
|
+
skipSelf?: boolean;
|
|
386
|
+
}): Signal<NgpMenuItemRadioState | null>;
|
|
387
|
+
(options?: {
|
|
388
|
+
hoisted?: boolean;
|
|
389
|
+
optional?: boolean;
|
|
390
|
+
skipSelf?: boolean;
|
|
391
|
+
}): Signal<NgpMenuItemRadioState> | Signal<NgpMenuItemRadioState | null>;
|
|
392
|
+
};
|
|
393
|
+
declare const provideMenuItemRadioState: (opts?: {
|
|
394
|
+
inherit?: boolean;
|
|
395
|
+
}) => _angular_core.FactoryProvider;
|
|
396
|
+
|
|
215
397
|
interface NgpMenuTriggerState<T = unknown> {
|
|
216
398
|
/**
|
|
217
399
|
* The menu template or component.
|
|
@@ -669,5 +851,5 @@ declare const provideSubmenuTriggerState: (opts?: {
|
|
|
669
851
|
inherit?: boolean;
|
|
670
852
|
}) => _angular_core.FactoryProvider;
|
|
671
853
|
|
|
672
|
-
export { NgpMenu, NgpMenuItem, NgpMenuTrigger, NgpSubmenuTrigger, injectMenuItemState, injectMenuState, injectMenuTriggerState, injectSubmenuTriggerState, provideMenuConfig, provideMenuItemState, provideMenuState, provideMenuTriggerState, provideSubmenuTriggerState };
|
|
673
|
-
export type { NgpMenuConfig, NgpMenuItemProps, NgpMenuItemState, NgpMenuPlacement, NgpMenuProps, NgpMenuState, NgpMenuTriggerProps, NgpMenuTriggerState, NgpSubmenuTriggerProps, NgpSubmenuTriggerState };
|
|
854
|
+
export { NgpMenu, NgpMenuItem, NgpMenuItemCheckbox, NgpMenuItemIndicator, NgpMenuItemRadio, NgpMenuItemRadioGroup, NgpMenuTrigger, NgpSubmenuTrigger, injectMenuItemCheckboxState, injectMenuItemRadioGroupState, injectMenuItemRadioState, injectMenuItemState, injectMenuState, injectMenuTriggerState, injectSubmenuTriggerState, provideMenuConfig, provideMenuItemCheckboxState, provideMenuItemRadioGroupState, provideMenuItemRadioState, provideMenuItemState, provideMenuState, provideMenuTriggerState, provideSubmenuTriggerState };
|
|
855
|
+
export type { NgpMenuConfig, NgpMenuItemCheckboxProps, NgpMenuItemCheckboxState, NgpMenuItemProps, NgpMenuItemRadioGroupProps, NgpMenuItemRadioGroupState, NgpMenuItemRadioProps, NgpMenuItemRadioState, NgpMenuItemState, NgpMenuPlacement, NgpMenuProps, NgpMenuState, NgpMenuTriggerProps, NgpMenuTriggerState, NgpSubmenuTriggerProps, NgpSubmenuTriggerState };
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "ng-primitives",
|
|
3
3
|
"description": "Angular Primitives is a low-level headless UI component library with a focus on accessibility, customization, and developer experience. ",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.111.0",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"angular",
|
|
8
8
|
"primitives",
|