1
1
import { computed , Directive , effect , input , TemplateRef } from '@angular/core' ;
2
- import { NgpMenu , NgpMenuItem , NgpMenuTrigger } from "ng-primitives/menu" ;
3
- import { injectPopoverTriggerState } from 'ng-primitives/popover' ;
2
+ import { NgpMenu , NgpMenuItem , NgpMenuTrigger , NgpSubmenuTrigger } from "ng-primitives/menu" ;
4
3
import { tv } from 'tailwind-variants' ;
5
4
6
5
const menuVariants = tv ( {
7
6
slots : {
8
- base : 'absolute bg-popover text-popover-foreground data-[enter]:animate-in data-[exit]:animate-out data-[exit]:fade-out-0 data-[enter]:fade-in-0 data-[exit]:zoom-out-95 data-[enter]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--ngp-popover -transform-origin) overflow-x-hidden overflow-y-auto rounded-md border border-border p-1 shadow-md' ,
9
- itemVariant : "w-full data-[focus-visible]:bg-accent data-[focus-visible]:text-accent-foreground data-[hover]:bg-accent data-[hover]:text-accent-foreground relative flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4" ,
7
+ base : 'absolute bg-popover text-popover-foreground data-[enter]:animate-in data-[exit]:animate-out data-[exit]:fade-out-0 data-[enter]:fade-in-0 data-[exit]:zoom-out-95 data-[enter]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--ngp-menu -transform-origin) overflow-x-hidden overflow-y-auto rounded-md border border-border p-1 shadow-md' ,
8
+ itemVariant : "w-full data-[focus-visible]:bg-accent data-[focus-visible]:text-accent-foreground data-[hover]:bg-accent data-[hover]:text-accent-foreground data-[open]:bg-accent data-[open]:text-accent-foreground relative flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4" ,
10
9
shortcutVariant : 'text-muted-foreground ml-auto text-xs tracking-widest' ,
11
10
separatorVariant : 'bg-border -mx-1 my-1 h-px' ,
12
- labelVariant : 'px-2 py-1.5 text-sm font-medium data-[inset]:pl-8' ,
11
+ labelVariant : 'px-2 py-1.5 text-sm font-medium data-[inset]:pl-8'
13
12
}
14
13
} ) ;
15
14
@@ -31,16 +30,12 @@ export class UiMenu {
31
30
@Directive ( {
32
31
selector : '[uiMenuTrigger]' ,
33
32
exportAs : 'uiMenuTrigger' ,
34
- hostDirectives : [ NgpMenuTrigger ] ,
33
+ hostDirectives : [ {
34
+ directive : NgpMenuTrigger ,
35
+ inputs : [ 'ngpMenuTrigger: uiMenuTrigger' ]
36
+ } ] ,
35
37
} )
36
38
export class UiMenuTrigger {
37
- private readonly state = injectPopoverTriggerState ( ) ;
38
- readonly trigger = input . required < TemplateRef < any > > ( {
39
- alias : 'uiMenuTrigger' ,
40
- } ) ;
41
- constructor ( ) {
42
- effect ( ( ) => this . state ( ) . popover . set ( this . trigger ( ) ) ) ;
43
- }
44
39
}
45
40
46
41
@Directive ( {
@@ -90,4 +85,17 @@ export class UiMenuLabel {
90
85
export class UiMenuItem {
91
86
inputClass = input < string > ( '' , { alias : 'class' } ) ;
92
87
computedClass = computed ( ( ) => itemVariant ( { class : this . inputClass ( ) } ) ) ;
88
+ }
89
+
90
+ @Directive ( {
91
+ selector : '[uiSubmenuTrigger]' ,
92
+ exportAs : 'uiSubmenuTrigger' ,
93
+ hostDirectives : [ {
94
+ directive : NgpSubmenuTrigger ,
95
+ inputs : [ 'ngpSubmenuTrigger: uiSubmenuTrigger' ]
96
+ } ] ,
97
+ } )
98
+ export class UiSubmenuTrigger {
99
+ inputClass = input < string > ( '' , { alias : 'class' } ) ;
100
+ computedClass = computed ( ( ) => itemVariant ( { class : this . inputClass ( ) } ) ) ;
93
101
}
0 commit comments