@egose/shadcn-theme-ng 0.0.27 → 0.1.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.
Files changed (316) hide show
  1. package/README.md +130 -13
  2. package/accordion/README.md +3 -0
  3. package/accordion/fesm2022/accordion.mjs +148 -0
  4. package/accordion/package.json +25 -0
  5. package/accordion/types/accordion.d.ts +49 -0
  6. package/alert/README.md +2 -63
  7. package/alert/fesm2022/alert.mjs +58 -53
  8. package/alert/package.json +25 -0
  9. package/alert-dialog/README.md +11 -0
  10. package/alert-dialog/fesm2022/alert-dialog.mjs +287 -0
  11. package/alert-dialog/package.json +25 -0
  12. package/alert-dialog/types/alert-dialog.d.ts +90 -0
  13. package/aspect-ratio/README.md +11 -0
  14. package/aspect-ratio/fesm2022/aspect-ratio.mjs +62 -0
  15. package/aspect-ratio/package.json +25 -0
  16. package/aspect-ratio/types/aspect-ratio.d.ts +21 -0
  17. package/autocomplete/README.md +3 -0
  18. package/autocomplete/fesm2022/autocomplete.mjs +391 -0
  19. package/autocomplete/package.json +24 -0
  20. package/autocomplete/types/autocomplete.d.ts +96 -0
  21. package/avatar/README.md +11 -0
  22. package/avatar/fesm2022/avatar.mjs +178 -0
  23. package/avatar/package.json +25 -0
  24. package/avatar/types/avatar.d.ts +50 -0
  25. package/badge/README.md +2 -63
  26. package/badge/fesm2022/badge.mjs +69 -63
  27. package/badge/package.json +25 -0
  28. package/basic-alert/README.md +2 -63
  29. package/basic-alert/fesm2022/basic-alert.mjs +14 -22
  30. package/basic-alert/package.json +24 -0
  31. package/breadcrumb/README.md +11 -0
  32. package/breadcrumb/fesm2022/breadcrumb.mjs +218 -0
  33. package/breadcrumb/package.json +25 -0
  34. package/breadcrumb/types/breadcrumb.d.ts +57 -0
  35. package/button/README.md +2 -63
  36. package/button/fesm2022/button.mjs +201 -177
  37. package/button/package.json +25 -0
  38. package/button/{index.d.ts → types/button.d.ts} +31 -10
  39. package/button-group/README.md +11 -0
  40. package/button-group/fesm2022/button-group.mjs +102 -0
  41. package/button-group/package.json +25 -0
  42. package/button-group/types/button-group.d.ts +30 -0
  43. package/calendar/README.md +2 -63
  44. package/calendar/fesm2022/calendar.mjs +178 -570
  45. package/calendar/package.json +24 -0
  46. package/calendar/types/calendar.d.ts +94 -0
  47. package/card/README.md +11 -0
  48. package/card/fesm2022/card.mjs +169 -0
  49. package/card/package.json +25 -0
  50. package/card/types/card.d.ts +54 -0
  51. package/carousel/README.md +11 -0
  52. package/carousel/fesm2022/carousel.mjs +267 -0
  53. package/carousel/package.json +25 -0
  54. package/carousel/types/carousel.d.ts +84 -0
  55. package/checkbox/README.md +3 -0
  56. package/checkbox/fesm2022/checkbox.mjs +113 -0
  57. package/checkbox/package.json +24 -0
  58. package/checkbox/types/checkbox.d.ts +56 -0
  59. package/collapsible/README.md +11 -0
  60. package/collapsible/fesm2022/collapsible.mjs +77 -0
  61. package/collapsible/package.json +25 -0
  62. package/collapsible/types/collapsible.d.ts +27 -0
  63. package/combobox/README.md +11 -0
  64. package/combobox/fesm2022/combobox.mjs +547 -0
  65. package/combobox/package.json +25 -0
  66. package/combobox/types/combobox.d.ts +151 -0
  67. package/command/README.md +11 -0
  68. package/command/fesm2022/command.mjs +301 -0
  69. package/command/package.json +25 -0
  70. package/command/types/command.d.ts +89 -0
  71. package/confirmation-dialog/README.md +3 -0
  72. package/confirmation-dialog/fesm2022/confirmation-dialog.mjs +79 -0
  73. package/confirmation-dialog/package.json +24 -0
  74. package/confirmation-dialog/types/confirmation-dialog.d.ts +28 -0
  75. package/context-menu/README.md +11 -0
  76. package/context-menu/fesm2022/context-menu.mjs +89 -0
  77. package/context-menu/package.json +25 -0
  78. package/context-menu/types/context-menu.d.ts +34 -0
  79. package/date-picker/README.md +2 -63
  80. package/date-picker/fesm2022/date-picker.mjs +1104 -352
  81. package/date-picker/package.json +24 -0
  82. package/date-picker/types/date-picker.d.ts +555 -0
  83. package/dialog/README.md +3 -0
  84. package/dialog/fesm2022/dialog.mjs +281 -0
  85. package/dialog/package.json +24 -0
  86. package/dialog/types/dialog.d.ts +95 -0
  87. package/drawer/README.md +11 -0
  88. package/drawer/fesm2022/drawer.mjs +261 -0
  89. package/drawer/package.json +25 -0
  90. package/drawer/types/drawer.d.ts +76 -0
  91. package/dropdown-menu/README.md +11 -0
  92. package/dropdown-menu/fesm2022/dropdown-menu.mjs +554 -0
  93. package/dropdown-menu/package.json +25 -0
  94. package/dropdown-menu/types/dropdown-menu.d.ts +180 -0
  95. package/empty/README.md +11 -0
  96. package/empty/fesm2022/empty.mjs +151 -0
  97. package/empty/package.json +25 -0
  98. package/empty/types/empty.d.ts +54 -0
  99. package/field/README.md +11 -0
  100. package/field/fesm2022/field.mjs +351 -0
  101. package/field/package.json +25 -0
  102. package/field/types/field.d.ts +107 -0
  103. package/form-checkbox/README.md +3 -0
  104. package/form-checkbox/fesm2022/form-checkbox.mjs +94 -0
  105. package/form-checkbox/package.json +24 -0
  106. package/form-checkbox/types/form-checkbox.d.ts +33 -0
  107. package/form-date-picker/README.md +2 -63
  108. package/form-date-picker/fesm2022/form-date-picker.mjs +74 -120
  109. package/form-date-picker/package.json +24 -0
  110. package/form-date-picker/{index.d.ts → types/form-date-picker.d.ts} +7 -1
  111. package/form-field/README.md +2 -63
  112. package/form-field/fesm2022/form-field.mjs +54 -28
  113. package/form-field/package.json +25 -0
  114. package/form-field/types/form-field.d.ts +46 -0
  115. package/form-field-simple/README.md +2 -63
  116. package/form-field-simple/fesm2022/form-field-simple.mjs +15 -10
  117. package/form-field-simple/package.json +24 -0
  118. package/form-searchable-multiselect/README.md +3 -0
  119. package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs +98 -0
  120. package/form-searchable-multiselect/package.json +24 -0
  121. package/form-searchable-multiselect/types/form-searchable-multiselect.d.ts +36 -0
  122. package/form-select/README.md +2 -63
  123. package/form-select/fesm2022/form-select.mjs +85 -141
  124. package/form-select/package.json +24 -0
  125. package/form-select/{index.d.ts → types/form-select.d.ts} +7 -1
  126. package/form-text-input/README.md +2 -63
  127. package/form-text-input/fesm2022/form-text-input.mjs +86 -171
  128. package/form-text-input/package.json +24 -0
  129. package/form-text-input/{index.d.ts → types/form-text-input.d.ts} +9 -12
  130. package/form-textarea/README.md +2 -63
  131. package/form-textarea/fesm2022/form-textarea.mjs +77 -128
  132. package/form-textarea/package.json +24 -0
  133. package/form-textarea/{index.d.ts → types/form-textarea.d.ts} +8 -1
  134. package/hover-card/README.md +11 -0
  135. package/hover-card/fesm2022/hover-card.mjs +123 -0
  136. package/hover-card/package.json +25 -0
  137. package/hover-card/types/hover-card.d.ts +36 -0
  138. package/icon/README.md +2 -63
  139. package/icon/fesm2022/icon.mjs +12 -10
  140. package/icon/package.json +25 -0
  141. package/input/README.md +2 -63
  142. package/input/fesm2022/input.mjs +25 -70
  143. package/input/package.json +25 -0
  144. package/input/types/input.d.ts +19 -0
  145. package/input-group/README.md +11 -0
  146. package/input-group/fesm2022/input-group.mjs +199 -0
  147. package/input-group/package.json +25 -0
  148. package/input-group/types/input-group.d.ts +52 -0
  149. package/input-otp/README.md +11 -0
  150. package/input-otp/fesm2022/input-otp.mjs +141 -0
  151. package/input-otp/package.json +25 -0
  152. package/input-otp/types/input-otp.d.ts +43 -0
  153. package/item/README.md +11 -0
  154. package/item/fesm2022/item.mjs +278 -0
  155. package/item/package.json +25 -0
  156. package/item/types/item.d.ts +101 -0
  157. package/kbd/README.md +11 -0
  158. package/kbd/fesm2022/kbd.mjs +61 -0
  159. package/kbd/package.json +25 -0
  160. package/kbd/types/kbd.d.ts +22 -0
  161. package/label/README.md +2 -63
  162. package/label/fesm2022/label.mjs +12 -11
  163. package/label/package.json +25 -0
  164. package/label/{index.d.ts → types/label.d.ts} +1 -1
  165. package/layout-simple/README.md +3 -0
  166. package/layout-simple/fesm2022/layout-simple.mjs +388 -0
  167. package/layout-simple/package.json +24 -0
  168. package/layout-simple/types/layout-simple.d.ts +167 -0
  169. package/menu/README.md +3 -0
  170. package/menu/fesm2022/menu.mjs +455 -0
  171. package/menu/package.json +24 -0
  172. package/menu/types/menu.d.ts +137 -0
  173. package/menubar/README.md +11 -0
  174. package/menubar/fesm2022/menubar.mjs +108 -0
  175. package/menubar/package.json +25 -0
  176. package/menubar/types/menubar.d.ts +40 -0
  177. package/native-select/README.md +11 -0
  178. package/native-select/fesm2022/native-select.mjs +207 -0
  179. package/native-select/package.json +25 -0
  180. package/native-select/types/native-select.d.ts +70 -0
  181. package/navigation-menu/README.md +11 -0
  182. package/navigation-menu/fesm2022/navigation-menu.mjs +194 -0
  183. package/navigation-menu/package.json +25 -0
  184. package/navigation-menu/types/navigation-menu.d.ts +54 -0
  185. package/package.json +284 -63
  186. package/pagination/README.md +11 -0
  187. package/pagination/fesm2022/pagination.mjs +522 -0
  188. package/pagination/package.json +25 -0
  189. package/pagination/types/pagination.d.ts +192 -0
  190. package/popover/README.md +2 -63
  191. package/popover/fesm2022/popover.mjs +124 -30
  192. package/popover/package.json +24 -0
  193. package/popover/types/popover.d.ts +54 -0
  194. package/progress/README.md +11 -0
  195. package/progress/fesm2022/progress.mjs +77 -0
  196. package/progress/package.json +25 -0
  197. package/progress/types/progress.d.ts +27 -0
  198. package/radio-group/README.md +3 -0
  199. package/radio-group/fesm2022/radio-group.mjs +207 -0
  200. package/radio-group/package.json +25 -0
  201. package/radio-group/types/radio-group.d.ts +71 -0
  202. package/resizable/README.md +11 -0
  203. package/resizable/fesm2022/resizable.mjs +103 -0
  204. package/resizable/package.json +25 -0
  205. package/resizable/types/resizable.d.ts +32 -0
  206. package/scroll-area/README.md +11 -0
  207. package/scroll-area/fesm2022/scroll-area.mjs +51 -0
  208. package/scroll-area/package.json +25 -0
  209. package/scroll-area/types/scroll-area.d.ts +16 -0
  210. package/searchable-multiselect/README.md +3 -0
  211. package/searchable-multiselect/fesm2022/searchable-multiselect.mjs +136 -0
  212. package/searchable-multiselect/package.json +24 -0
  213. package/searchable-multiselect/types/searchable-multiselect.d.ts +45 -0
  214. package/select/README.md +2 -63
  215. package/select/fesm2022/select.mjs +340 -198
  216. package/select/package.json +25 -0
  217. package/select/types/select.d.ts +121 -0
  218. package/separator/README.md +2 -63
  219. package/separator/fesm2022/separator.mjs +17 -15
  220. package/separator/package.json +24 -0
  221. package/separator/{index.d.ts → types/separator.d.ts} +4 -5
  222. package/sheet/README.md +2 -63
  223. package/sheet/fesm2022/sheet.mjs +56 -61
  224. package/sheet/package.json +24 -0
  225. package/sidebar/README.md +11 -0
  226. package/sidebar/fesm2022/sidebar.mjs +846 -0
  227. package/sidebar/package.json +25 -0
  228. package/sidebar/types/sidebar.d.ts +237 -0
  229. package/skeleton/README.md +11 -0
  230. package/skeleton/fesm2022/skeleton.mjs +44 -0
  231. package/skeleton/package.json +25 -0
  232. package/skeleton/types/skeleton.d.ts +16 -0
  233. package/slider/README.md +11 -0
  234. package/slider/fesm2022/slider.mjs +74 -0
  235. package/slider/package.json +25 -0
  236. package/slider/types/slider.d.ts +19 -0
  237. package/sonner/README.md +2 -63
  238. package/sonner/fesm2022/sonner.mjs +34 -39
  239. package/sonner/package.json +25 -0
  240. package/spinner/README.md +2 -63
  241. package/spinner/fesm2022/spinner.mjs +20 -16
  242. package/spinner/package.json +25 -0
  243. package/switch/README.md +2 -63
  244. package/switch/fesm2022/switch.mjs +28 -27
  245. package/switch/package.json +25 -0
  246. package/table/README.md +11 -0
  247. package/table/fesm2022/table.mjs +211 -0
  248. package/table/package.json +25 -0
  249. package/table/types/table.d.ts +87 -0
  250. package/tabs/README.md +3 -0
  251. package/tabs/fesm2022/tabs.mjs +210 -0
  252. package/tabs/package.json +25 -0
  253. package/tabs/types/tabs.d.ts +71 -0
  254. package/textarea/README.md +11 -0
  255. package/textarea/fesm2022/textarea.mjs +47 -0
  256. package/textarea/package.json +25 -0
  257. package/textarea/types/textarea.d.ts +18 -0
  258. package/toggle/README.md +11 -0
  259. package/toggle/fesm2022/toggle.mjs +78 -0
  260. package/toggle/package.json +25 -0
  261. package/toggle/types/toggle.d.ts +27 -0
  262. package/toggle-group/README.md +11 -0
  263. package/toggle-group/fesm2022/toggle-group.mjs +117 -0
  264. package/toggle-group/package.json +25 -0
  265. package/toggle-group/types/toggle-group.d.ts +45 -0
  266. package/tooltip/README.md +3 -0
  267. package/tooltip/fesm2022/tooltip.mjs +72 -0
  268. package/tooltip/package.json +25 -0
  269. package/tooltip/types/tooltip.d.ts +22 -0
  270. package/typography/README.md +11 -0
  271. package/typography/fesm2022/typography.mjs +242 -0
  272. package/typography/package.json +25 -0
  273. package/typography/types/typography.d.ts +94 -0
  274. package/utils/README.md +2 -63
  275. package/utils/fesm2022/utils.mjs +209 -2
  276. package/utils/package.json +25 -0
  277. package/utils/types/utils.d.ts +13 -0
  278. package/alert/fesm2022/alert.mjs.map +0 -1
  279. package/badge/fesm2022/badge.mjs.map +0 -1
  280. package/basic-alert/fesm2022/basic-alert.mjs.map +0 -1
  281. package/button/fesm2022/button.mjs.map +0 -1
  282. package/calendar/fesm2022/calendar.mjs.map +0 -1
  283. package/calendar/index.d.ts +0 -111
  284. package/date-picker/fesm2022/date-picker.mjs.map +0 -1
  285. package/date-picker/index.d.ts +0 -227
  286. package/form-date-picker/fesm2022/form-date-picker.mjs.map +0 -1
  287. package/form-field/fesm2022/form-field.mjs.map +0 -1
  288. package/form-field/index.d.ts +0 -37
  289. package/form-field-simple/fesm2022/form-field-simple.mjs.map +0 -1
  290. package/form-select/fesm2022/form-select.mjs.map +0 -1
  291. package/form-text-input/fesm2022/form-text-input.mjs.map +0 -1
  292. package/form-textarea/fesm2022/form-textarea.mjs.map +0 -1
  293. package/icon/fesm2022/icon.mjs.map +0 -1
  294. package/input/fesm2022/input.mjs.map +0 -1
  295. package/input/index.d.ts +0 -41
  296. package/label/fesm2022/label.mjs.map +0 -1
  297. package/popover/fesm2022/popover.mjs.map +0 -1
  298. package/popover/index.d.ts +0 -30
  299. package/select/fesm2022/select.mjs.map +0 -1
  300. package/select/index.d.ts +0 -92
  301. package/separator/fesm2022/separator.mjs.map +0 -1
  302. package/sheet/fesm2022/sheet.mjs.map +0 -1
  303. package/sonner/fesm2022/sonner.mjs.map +0 -1
  304. package/spinner/fesm2022/spinner.mjs.map +0 -1
  305. package/switch/fesm2022/switch.mjs.map +0 -1
  306. package/utils/fesm2022/utils.mjs.map +0 -1
  307. package/utils/index.d.ts +0 -5
  308. /package/alert/{index.d.ts → types/alert.d.ts} +0 -0
  309. /package/badge/{index.d.ts → types/badge.d.ts} +0 -0
  310. /package/basic-alert/{index.d.ts → types/basic-alert.d.ts} +0 -0
  311. /package/form-field-simple/{index.d.ts → types/form-field-simple.d.ts} +0 -0
  312. /package/icon/{index.d.ts → types/icon.d.ts} +0 -0
  313. /package/sheet/{index.d.ts → types/sheet.d.ts} +0 -0
  314. /package/sonner/{index.d.ts → types/sonner.d.ts} +0 -0
  315. /package/spinner/{index.d.ts → types/spinner.d.ts} +0 -0
  316. /package/switch/{index.d.ts → types/switch.d.ts} +0 -0
@@ -0,0 +1,554 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, ElementRef, DOCUMENT, DestroyRef, signal, input, numberAttribute, Directive, booleanAttribute, ChangeDetectionStrategy, Component, HOST_TAG_NAME, InjectionToken, computed, effect, forwardRef, NgModule } from '@angular/core';
3
+ import * as i1 from '@angular/cdk/menu';
4
+ import { CdkMenu, CdkMenuItem, CdkMenuItemCheckbox, CdkMenuItemSelectable, CdkMenuGroup, CdkMenuItemRadio, CdkMenuTrigger } from '@angular/cdk/menu';
5
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
+ import { MENU_SIDE, deriveMenuSideFromTransformOrigin, createMenuPosition } from '@spartan-ng/brain/core';
7
+ import { classes } from '@egose/shadcn-theme-ng/utils';
8
+ import { InputModalityDetector } from '@angular/cdk/a11y';
9
+ import { NgIcon, provideIcons } from '@ng-icons/core';
10
+ import { lucideCheck, lucideChevronRight } from '@ng-icons/lucide';
11
+
12
+ class HlmDropdownMenu {
13
+ _host = inject(CdkMenu);
14
+ _elementRef = inject((ElementRef));
15
+ _document = inject(DOCUMENT);
16
+ _destroyRef = inject(DestroyRef);
17
+ // The trigger provides its configured side; CDK parents this content's injector under the trigger's.
18
+ _menuSide = inject(MENU_SIDE, { optional: true });
19
+ _state = signal('open', /* @ts-ignore */
20
+ ...(ngDevMode ? [{ debugName: "_state" }] : /* istanbul ignore next */ []));
21
+ _side = signal(this._menuSide?.side() ?? 'bottom', /* @ts-ignore */
22
+ ...(ngDevMode ? [{ debugName: "_side" }] : /* istanbul ignore next */ []));
23
+ sideOffset = input(1, { ...(ngDevMode ? { debugName: "sideOffset" } : /* istanbul ignore next */ {}), transform: numberAttribute });
24
+ constructor() {
25
+ classes(() => "motion-safe:data-open:animate-in motion-safe:data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open: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 ring-foreground/10 bg-popover text-popover-foreground min-w-32 rounded-md p-1 shadow-md ring-1 duration-100 my-[--spacing(var(--side-offset))] overflow-x-hidden overflow-y-auto outline-none");
26
+ this.setSideFromTransformOrigin();
27
+ // this is a best effort, but does not seem to work currently
28
+ // TODO: figure out a way for us to know the host is about to be closed. might not be possible with CDK
29
+ this._host.closed.pipe(takeUntilDestroyed()).subscribe(() => this._state.set('closed'));
30
+ }
31
+ setSideFromTransformOrigin() {
32
+ const side = this._menuSide?.side() ?? 'bottom';
33
+ const view = this._document.defaultView;
34
+ if (!view)
35
+ return;
36
+ // CDK sets transform-origin on this element synchronously on attach; read it next tick and derive side
37
+ const timer = view.setTimeout(() => {
38
+ this._side.set(deriveMenuSideFromTransformOrigin(this._elementRef.nativeElement.style.transformOrigin, side));
39
+ });
40
+ this._destroyRef.onDestroy(() => view.clearTimeout(timer));
41
+ }
42
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenu, deps: [], target: i0.ɵɵFactoryTarget.Directive });
43
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.3", type: HlmDropdownMenu, isStandalone: true, selector: "[hlmDropdownMenu],hlm-dropdown-menu", inputs: { sideOffset: { classPropertyName: "sideOffset", publicName: "sideOffset", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "dropdown-menu" }, properties: { "attr.data-state": "_state()", "attr.data-side": "_side()", "style.--side-offset": "sideOffset()" } }, hostDirectives: [{ directive: i1.CdkMenu }], ngImport: i0 });
44
+ }
45
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenu, decorators: [{
46
+ type: Directive,
47
+ args: [{
48
+ selector: '[hlmDropdownMenu],hlm-dropdown-menu',
49
+ hostDirectives: [CdkMenu],
50
+ host: {
51
+ 'data-slot': 'dropdown-menu',
52
+ '[attr.data-state]': '_state()',
53
+ '[attr.data-side]': '_side()',
54
+ '[style.--side-offset]': 'sideOffset()',
55
+ },
56
+ }]
57
+ }], ctorParameters: () => [], propDecorators: { sideOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "sideOffset", required: false }] }] } });
58
+
59
+ /**
60
+ * @internal
61
+ * Moves DOM focus to the hovered menu item. CDK menus only move focus with the keyboard, so on a pointer
62
+ * the highlight would otherwise stay on the last keyboard-focused item (leaving two rows highlighted) and,
63
+ * when a submenu closes, focus would fall to <body>, the menu stack would report no focus, and the whole
64
+ * dropdown would collapse. Following the pointer with focus (Radix/shadcn behaviour) keeps a single
65
+ * highlight and keeps focus inside the menu stack. setActiveMenuItem also syncs the key manager so keyboard
66
+ * navigation continues from the hovered item.
67
+ *
68
+ * Applied as a host directive on every dropdown item type (item, checkbox, radio, sub-trigger).
69
+ */
70
+ class HlmDropdownMenuFocusOnHover {
71
+ _cdkMenuItem = inject(CdkMenuItem, { self: true });
72
+ _parentMenu = inject(CdkMenu, { optional: true });
73
+ _inputModality = inject(InputModalityDetector);
74
+ _focusOnHover() {
75
+ // Only skip synthetic hovers from touch taps; every real hover (mouse, or keyboard-then-hover,
76
+ // which leaves the modality as 'keyboard') should move focus to keep a single highlight.
77
+ if (this._inputModality.mostRecentModality === 'touch' || this._cdkMenuItem.disabled) {
78
+ return;
79
+ }
80
+ this._parentMenu?.setActiveMenuItem(this._cdkMenuItem);
81
+ }
82
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuFocusOnHover, deps: [], target: i0.ɵɵFactoryTarget.Directive });
83
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.3", type: HlmDropdownMenuFocusOnHover, isStandalone: true, selector: "[hlmDropdownMenuFocusOnHover]", host: { listeners: { "mouseenter": "_focusOnHover()" } }, ngImport: i0 });
84
+ }
85
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuFocusOnHover, decorators: [{
86
+ type: Directive,
87
+ args: [{
88
+ selector: '[hlmDropdownMenuFocusOnHover]',
89
+ host: {
90
+ '(mouseenter)': '_focusOnHover()',
91
+ },
92
+ }]
93
+ }] });
94
+
95
+ /** @internal. Use HlmDropdownMenuCheckbox instead. */
96
+ class HlmDropdownMenuCheckboxCdk extends CdkMenuItemCheckbox {
97
+ keepOpen = input(true, { ...(ngDevMode ? { debugName: "keepOpen" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
98
+ trigger(options) {
99
+ super.trigger({ ...options, keepOpen: this.keepOpen() });
100
+ }
101
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuCheckboxCdk, deps: null, target: i0.ɵɵFactoryTarget.Directive });
102
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.3", type: HlmDropdownMenuCheckboxCdk, isStandalone: true, selector: "[hlmDropdownMenuCheckboxCdk]", inputs: { keepOpen: { classPropertyName: "keepOpen", publicName: "keepOpen", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
103
+ { provide: CdkMenuItemCheckbox, useExisting: HlmDropdownMenuCheckboxCdk },
104
+ { provide: CdkMenuItemSelectable, useExisting: HlmDropdownMenuCheckboxCdk },
105
+ { provide: CdkMenuItem, useExisting: CdkMenuItemSelectable },
106
+ ], usesInheritance: true, ngImport: i0 });
107
+ }
108
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuCheckboxCdk, decorators: [{
109
+ type: Directive,
110
+ args: [{
111
+ selector: '[hlmDropdownMenuCheckboxCdk]',
112
+ providers: [
113
+ { provide: CdkMenuItemCheckbox, useExisting: HlmDropdownMenuCheckboxCdk },
114
+ { provide: CdkMenuItemSelectable, useExisting: HlmDropdownMenuCheckboxCdk },
115
+ { provide: CdkMenuItem, useExisting: CdkMenuItemSelectable },
116
+ ],
117
+ }]
118
+ }], propDecorators: { keepOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "keepOpen", required: false }] }] } });
119
+ class HlmDropdownMenuCheckbox {
120
+ _cdkMenuItem = inject(HlmDropdownMenuCheckboxCdk);
121
+ inset = input(false, { ...(ngDevMode ? { debugName: "inset" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
122
+ constructor() {
123
+ classes(() => "hover:bg-accent focus:bg-accent hover:text-accent-foreground focus:text-accent-foreground gap-2 rounded-sm py-1.5 ps-2 pe-8 text-sm data-inset:ps-8 [&_ng-icon:not([class*='text-'])]:text-[length:--spacing(4)] group/dropdown-menu-checkbox relative flex w-full cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_ng-icon]:pointer-events-none [&_ng-icon]:shrink-0");
124
+ }
125
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuCheckbox, deps: [], target: i0.ɵɵFactoryTarget.Directive });
126
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.3", type: HlmDropdownMenuCheckbox, isStandalone: true, selector: "[hlmDropdownMenuCheckbox],[hlmDropdownMenuCheckboxItem]", inputs: { inset: { classPropertyName: "inset", publicName: "inset", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "dropdown-menu-checkbox-item" }, properties: { "attr.data-disabled": "_cdkMenuItem.disabled ? \"\" : null", "attr.data-checked": "_cdkMenuItem.checked ? \"\" : null", "attr.data-inset": "inset() ? \"\" : null" } }, hostDirectives: [{ directive: HlmDropdownMenuCheckboxCdk, inputs: ["cdkMenuItemDisabled", "disabled", "cdkMenuItemChecked", "checked", "keepOpen", "keepOpen"], outputs: ["cdkMenuItemTriggered", "triggered"] }, { directive: HlmDropdownMenuFocusOnHover }], ngImport: i0 });
127
+ }
128
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuCheckbox, decorators: [{
129
+ type: Directive,
130
+ args: [{
131
+ selector: '[hlmDropdownMenuCheckbox],[hlmDropdownMenuCheckboxItem]',
132
+ hostDirectives: [
133
+ {
134
+ directive: HlmDropdownMenuCheckboxCdk,
135
+ inputs: ['cdkMenuItemDisabled: disabled', 'cdkMenuItemChecked: checked', 'keepOpen'],
136
+ outputs: ['cdkMenuItemTriggered: triggered'],
137
+ },
138
+ HlmDropdownMenuFocusOnHover,
139
+ ],
140
+ host: {
141
+ 'data-slot': 'dropdown-menu-checkbox-item',
142
+ '[attr.data-disabled]': '_cdkMenuItem.disabled ? "" : null',
143
+ '[attr.data-checked]': '_cdkMenuItem.checked ? "" : null',
144
+ '[attr.data-inset]': 'inset() ? "" : null',
145
+ },
146
+ }]
147
+ }], ctorParameters: () => [], propDecorators: { inset: [{ type: i0.Input, args: [{ isSignal: true, alias: "inset", required: false }] }] } });
148
+
149
+ class HlmDropdownMenuCheckboxIndicator {
150
+ constructor() {
151
+ classes(() => "absolute end-2 flex items-center justify-center [&_ng-icon]:text-[length:--spacing(4)] pointer-events-none opacity-0 group-data-checked/dropdown-menu-checkbox:opacity-100");
152
+ }
153
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuCheckboxIndicator, deps: [], target: i0.ɵɵFactoryTarget.Component });
154
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.3", type: HlmDropdownMenuCheckboxIndicator, isStandalone: true, selector: "hlm-dropdown-menu-checkbox-indicator", host: { attributes: { "data-slot": "dropdown-menu-checkbox-item-indicator" } }, providers: [provideIcons({ lucideCheck })], ngImport: i0, template: ` <ng-icon name="lucideCheck" /> `, isInline: true, dependencies: [{ kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
155
+ }
156
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuCheckboxIndicator, decorators: [{
157
+ type: Component,
158
+ args: [{
159
+ selector: 'hlm-dropdown-menu-checkbox-indicator',
160
+ imports: [NgIcon],
161
+ providers: [provideIcons({ lucideCheck })],
162
+ changeDetection: ChangeDetectionStrategy.OnPush,
163
+ host: { 'data-slot': 'dropdown-menu-checkbox-item-indicator' },
164
+ template: ` <ng-icon name="lucideCheck" /> `,
165
+ }]
166
+ }], ctorParameters: () => [] });
167
+
168
+ class HlmDropdownMenuGroup {
169
+ constructor() {
170
+ classes(() => "block");
171
+ }
172
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
173
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.3", type: HlmDropdownMenuGroup, isStandalone: true, selector: "[hlmDropdownMenuGroup],hlm-dropdown-menu-group", host: { attributes: { "data-slot": "dropdown-menu-group" } }, hostDirectives: [{ directive: i1.CdkMenuGroup }], ngImport: i0 });
174
+ }
175
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuGroup, decorators: [{
176
+ type: Directive,
177
+ args: [{
178
+ selector: '[hlmDropdownMenuGroup],hlm-dropdown-menu-group',
179
+ hostDirectives: [CdkMenuGroup],
180
+ host: { 'data-slot': 'dropdown-menu-group' },
181
+ }]
182
+ }], ctorParameters: () => [] });
183
+
184
+ class HlmDropdownMenuItem {
185
+ _isButton = inject(HOST_TAG_NAME) === 'button';
186
+ disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
187
+ variant = input('default', /* @ts-ignore */
188
+ ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
189
+ inset = input(false, { ...(ngDevMode ? { debugName: "inset" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
190
+ constructor() {
191
+ classes(() => "hover:bg-accent focus:bg-accent hover:text-accent-foreground focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:hover:bg-destructive/10 data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:hover:bg-destructive/20 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:hover:text-destructive data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[ng-icon]:text-destructive not-data-[variant=destructive]:hover:**:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground gap-2 rounded-sm px-2 py-1.5 text-sm data-inset:ps-8 [&_ng-icon:not([class*='text-'])]:text-[length:--spacing(4)] group/dropdown-menu-item relative flex w-full cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_ng-icon]:pointer-events-none [&_ng-icon]:shrink-0");
192
+ }
193
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
194
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.3", type: HlmDropdownMenuItem, isStandalone: true, selector: "[hlmDropdownMenuItem],hlm-dropdown-menu-item", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, inset: { classPropertyName: "inset", publicName: "inset", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "dropdown-menu-item" }, properties: { "attr.disabled": "_isButton && disabled() ? \"\" : null", "attr.data-disabled": "disabled() ? \"\" : null", "attr.data-variant": "variant()", "attr.data-inset": "inset() ? \"\" : null" } }, hostDirectives: [{ directive: i1.CdkMenuItem, inputs: ["cdkMenuItemDisabled", "disabled"], outputs: ["cdkMenuItemTriggered", "triggered"] }, { directive: HlmDropdownMenuFocusOnHover }], ngImport: i0 });
195
+ }
196
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuItem, decorators: [{
197
+ type: Directive,
198
+ args: [{
199
+ selector: '[hlmDropdownMenuItem],hlm-dropdown-menu-item',
200
+ hostDirectives: [
201
+ {
202
+ directive: CdkMenuItem,
203
+ inputs: ['cdkMenuItemDisabled: disabled'],
204
+ outputs: ['cdkMenuItemTriggered: triggered'],
205
+ },
206
+ HlmDropdownMenuFocusOnHover,
207
+ ],
208
+ host: {
209
+ 'data-slot': 'dropdown-menu-item',
210
+ '[attr.disabled]': '_isButton && disabled() ? "" : null',
211
+ '[attr.data-disabled]': 'disabled() ? "" : null',
212
+ '[attr.data-variant]': 'variant()',
213
+ '[attr.data-inset]': 'inset() ? "" : null',
214
+ },
215
+ }]
216
+ }], ctorParameters: () => [], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], inset: [{ type: i0.Input, args: [{ isSignal: true, alias: "inset", required: false }] }] } });
217
+
218
+ class HlmDropdownMenuItemSubIndicator {
219
+ constructor() {
220
+ classes(() => "ms-auto flex items-center justify-center");
221
+ }
222
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuItemSubIndicator, deps: [], target: i0.ɵɵFactoryTarget.Component });
223
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.3", type: HlmDropdownMenuItemSubIndicator, isStandalone: true, selector: "hlm-dropdown-menu-item-sub-indicator", providers: [provideIcons({ lucideChevronRight })], ngImport: i0, template: " <ng-icon name=\"lucideChevronRight\" class=\"text-[length:--spacing(4)] rtl:rotate-180\" /> ", isInline: true, dependencies: [{ kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
224
+ }
225
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuItemSubIndicator, decorators: [{
226
+ type: Component,
227
+ args: [{
228
+ selector: 'hlm-dropdown-menu-item-sub-indicator',
229
+ imports: [NgIcon],
230
+ providers: [provideIcons({ lucideChevronRight })],
231
+ changeDetection: ChangeDetectionStrategy.OnPush,
232
+ template: " <ng-icon name=\"lucideChevronRight\" class=\"text-[length:--spacing(4)] rtl:rotate-180\" /> ",
233
+ }]
234
+ }], ctorParameters: () => [] });
235
+
236
+ class HlmDropdownMenuLabel {
237
+ inset = input(false, { ...(ngDevMode ? { debugName: "inset" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
238
+ constructor() {
239
+ classes(() => "text-muted-foreground px-2 py-1.5 text-xs font-medium data-inset:ps-8 block");
240
+ }
241
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuLabel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
242
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.3", type: HlmDropdownMenuLabel, isStandalone: true, selector: "[hlmDropdownMenuLabel],hlm-dropdown-menu-label", inputs: { inset: { classPropertyName: "inset", publicName: "inset", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "dropdown-menu-label" }, properties: { "attr.data-inset": "inset() ? \"\" : null" } }, ngImport: i0 });
243
+ }
244
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuLabel, decorators: [{
245
+ type: Directive,
246
+ args: [{
247
+ selector: '[hlmDropdownMenuLabel],hlm-dropdown-menu-label',
248
+ host: {
249
+ 'data-slot': 'dropdown-menu-label',
250
+ '[attr.data-inset]': 'inset() ? "" : null',
251
+ },
252
+ }]
253
+ }], ctorParameters: () => [], propDecorators: { inset: [{ type: i0.Input, args: [{ isSignal: true, alias: "inset", required: false }] }] } });
254
+
255
+ /** @internal. Use HlmDropdownMenuRadio instead. */
256
+ class HlmDropdownMenuRadioCdk extends CdkMenuItemRadio {
257
+ keepOpen = input(true, { ...(ngDevMode ? { debugName: "keepOpen" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
258
+ trigger(options) {
259
+ super.trigger({ ...options, keepOpen: this.keepOpen() });
260
+ }
261
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuRadioCdk, deps: null, target: i0.ɵɵFactoryTarget.Directive });
262
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.3", type: HlmDropdownMenuRadioCdk, isStandalone: true, selector: "[hlmDropdownMenuRadioCdk]", inputs: { keepOpen: { classPropertyName: "keepOpen", publicName: "keepOpen", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
263
+ { provide: CdkMenuItemRadio, useExisting: HlmDropdownMenuRadioCdk },
264
+ { provide: CdkMenuItemSelectable, useExisting: HlmDropdownMenuRadioCdk },
265
+ { provide: CdkMenuItem, useExisting: CdkMenuItemSelectable },
266
+ ], usesInheritance: true, ngImport: i0 });
267
+ }
268
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuRadioCdk, decorators: [{
269
+ type: Directive,
270
+ args: [{
271
+ selector: '[hlmDropdownMenuRadioCdk]',
272
+ providers: [
273
+ { provide: CdkMenuItemRadio, useExisting: HlmDropdownMenuRadioCdk },
274
+ { provide: CdkMenuItemSelectable, useExisting: HlmDropdownMenuRadioCdk },
275
+ { provide: CdkMenuItem, useExisting: CdkMenuItemSelectable },
276
+ ],
277
+ }]
278
+ }], propDecorators: { keepOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "keepOpen", required: false }] }] } });
279
+ class HlmDropdownMenuRadio {
280
+ _cdkMenuItem = inject(HlmDropdownMenuRadioCdk);
281
+ constructor() {
282
+ classes(() => "hover:bg-accent focus:bg-accent hover:text-accent-foreground focus:text-accent-foreground gap-2 rounded-sm py-1.5 ps-2 pe-8 text-sm data-inset:ps-8 [&_ng-icon:not([class*='text-'])]:text-[length:--spacing(4)] group/dropdown-menu-radio relative flex w-full cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_ng-icon]:pointer-events-none [&_ng-icon]:shrink-0");
283
+ }
284
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuRadio, deps: [], target: i0.ɵɵFactoryTarget.Directive });
285
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.3", type: HlmDropdownMenuRadio, isStandalone: true, selector: "[hlmDropdownMenuRadio]", host: { attributes: { "data-slot": "dropdown-menu-radio-item" }, properties: { "attr.data-disabled": "_cdkMenuItem.disabled ? \"\" : null", "attr.data-checked": "_cdkMenuItem.checked ? \"\" : null" } }, hostDirectives: [{ directive: HlmDropdownMenuRadioCdk, inputs: ["cdkMenuItemDisabled", "disabled", "cdkMenuItemChecked", "checked", "keepOpen", "keepOpen"], outputs: ["cdkMenuItemTriggered", "triggered"] }, { directive: HlmDropdownMenuFocusOnHover }], ngImport: i0 });
286
+ }
287
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuRadio, decorators: [{
288
+ type: Directive,
289
+ args: [{
290
+ selector: '[hlmDropdownMenuRadio]',
291
+ hostDirectives: [
292
+ {
293
+ directive: HlmDropdownMenuRadioCdk,
294
+ inputs: ['cdkMenuItemDisabled: disabled', 'cdkMenuItemChecked: checked', 'keepOpen'],
295
+ outputs: ['cdkMenuItemTriggered: triggered'],
296
+ },
297
+ HlmDropdownMenuFocusOnHover,
298
+ ],
299
+ host: {
300
+ 'data-slot': 'dropdown-menu-radio-item',
301
+ '[attr.data-disabled]': '_cdkMenuItem.disabled ? "" : null',
302
+ '[attr.data-checked]': '_cdkMenuItem.checked ? "" : null',
303
+ },
304
+ }]
305
+ }], ctorParameters: () => [] });
306
+
307
+ class HlmDropdownMenuRadioIndicator {
308
+ constructor() {
309
+ classes(() => "absolute end-2 flex items-center justify-center [&_ng-icon]:text-[length:--spacing(4)] pointer-events-none opacity-0 group-data-checked/dropdown-menu-radio:opacity-100");
310
+ }
311
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuRadioIndicator, deps: [], target: i0.ɵɵFactoryTarget.Component });
312
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.3", type: HlmDropdownMenuRadioIndicator, isStandalone: true, selector: "hlm-dropdown-menu-radio-indicator", host: { attributes: { "data-slot": "dropdown-menu-radio-item-indicator" } }, providers: [provideIcons({ lucideCheck })], ngImport: i0, template: ` <ng-icon name="lucideCheck" /> `, isInline: true, dependencies: [{ kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
313
+ }
314
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuRadioIndicator, decorators: [{
315
+ type: Component,
316
+ args: [{
317
+ selector: 'hlm-dropdown-menu-radio-indicator',
318
+ imports: [NgIcon],
319
+ providers: [provideIcons({ lucideCheck })],
320
+ changeDetection: ChangeDetectionStrategy.OnPush,
321
+ host: { 'data-slot': 'dropdown-menu-radio-item-indicator' },
322
+ template: ` <ng-icon name="lucideCheck" /> `,
323
+ }]
324
+ }], ctorParameters: () => [] });
325
+
326
+ class HlmDropdownMenuSeparator {
327
+ constructor() {
328
+ classes(() => "bg-border -mx-1 my-1 h-px block");
329
+ }
330
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuSeparator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
331
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.3", type: HlmDropdownMenuSeparator, isStandalone: true, selector: "[hlmDropdownMenuSeparator],hlm-dropdown-menu-separator", host: { attributes: { "data-slot": "dropdown-menu-separator" } }, ngImport: i0 });
332
+ }
333
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuSeparator, decorators: [{
334
+ type: Directive,
335
+ args: [{
336
+ selector: '[hlmDropdownMenuSeparator],hlm-dropdown-menu-separator',
337
+ host: { 'data-slot': 'dropdown-menu-separator' },
338
+ }]
339
+ }], ctorParameters: () => [] });
340
+
341
+ class HlmDropdownMenuShortcut {
342
+ constructor() {
343
+ classes(() => "text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground ml-auto text-xs tracking-widest");
344
+ }
345
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuShortcut, deps: [], target: i0.ɵɵFactoryTarget.Directive });
346
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.3", type: HlmDropdownMenuShortcut, isStandalone: true, selector: "[hlmDropdownMenuShortcut],hlm-dropdown-menu-shortcut", host: { attributes: { "data-slot": "dropdown-menu-shortcut" } }, ngImport: i0 });
347
+ }
348
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuShortcut, decorators: [{
349
+ type: Directive,
350
+ args: [{
351
+ selector: '[hlmDropdownMenuShortcut],hlm-dropdown-menu-shortcut',
352
+ host: { 'data-slot': 'dropdown-menu-shortcut' },
353
+ }]
354
+ }], ctorParameters: () => [] });
355
+
356
+ class HlmDropdownMenuSub {
357
+ _host = inject(CdkMenu);
358
+ _elementRef = inject((ElementRef));
359
+ _document = inject(DOCUMENT);
360
+ _destroyRef = inject(DestroyRef);
361
+ // The sub-trigger provides its configured side; CDK parents this content's injector under it.
362
+ _menuSide = inject(MENU_SIDE, { optional: true });
363
+ _state = signal('open', /* @ts-ignore */
364
+ ...(ngDevMode ? [{ debugName: "_state" }] : /* istanbul ignore next */ []));
365
+ _side = signal(this._menuSide?.side() ?? 'right', /* @ts-ignore */
366
+ ...(ngDevMode ? [{ debugName: "_side" }] : /* istanbul ignore next */ []));
367
+ constructor() {
368
+ this.setSideFromTransformOrigin();
369
+ // this is a best effort, but does not seem to work currently
370
+ // TODO: figure out a way for us to know the host is about to be closed. might not be possible with CDK
371
+ this._host.closed.pipe(takeUntilDestroyed()).subscribe(() => this._state.set('closed'));
372
+ classes(() => "motion-safe:data-open:animate-in motion-safe:data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open: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 ring-foreground/10 bg-popover text-popover-foreground min-w-[96px] rounded-md p-1 shadow-lg ring-1 duration-100 w-auto");
373
+ }
374
+ setSideFromTransformOrigin() {
375
+ const side = this._menuSide?.side() ?? 'right';
376
+ const view = this._document.defaultView;
377
+ if (!view)
378
+ return;
379
+ // CDK sets transform-origin on this element synchronously on attach; read it next tick and derive side
380
+ const timer = view.setTimeout(() => {
381
+ this._side.set(deriveMenuSideFromTransformOrigin(this._elementRef.nativeElement.style.transformOrigin, side));
382
+ });
383
+ this._destroyRef.onDestroy(() => view.clearTimeout(timer));
384
+ }
385
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuSub, deps: [], target: i0.ɵɵFactoryTarget.Directive });
386
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.3", type: HlmDropdownMenuSub, isStandalone: true, selector: "[hlmDropdownMenuSub],hlm-dropdown-menu-sub", host: { attributes: { "data-slot": "dropdown-menu-sub" }, properties: { "attr.data-state": "_state()", "attr.data-side": "_side()" } }, hostDirectives: [{ directive: i1.CdkMenu }], ngImport: i0 });
387
+ }
388
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuSub, decorators: [{
389
+ type: Directive,
390
+ args: [{
391
+ selector: '[hlmDropdownMenuSub],hlm-dropdown-menu-sub',
392
+ hostDirectives: [CdkMenu],
393
+ host: {
394
+ 'data-slot': 'dropdown-menu-sub',
395
+ '[attr.data-state]': '_state()',
396
+ '[attr.data-side]': '_side()',
397
+ },
398
+ }]
399
+ }], ctorParameters: () => [] });
400
+
401
+ const defaultConfig = {
402
+ align: 'start',
403
+ side: 'bottom',
404
+ };
405
+ const HlmDropdownMenuConfigToken = new InjectionToken('HlmDropdownMenuConfig');
406
+ function provideHlmDropdownMenuConfig(config) {
407
+ return { provide: HlmDropdownMenuConfigToken, useValue: { ...defaultConfig, ...config } };
408
+ }
409
+ function injectHlmDropdownMenuConfig() {
410
+ return inject(HlmDropdownMenuConfigToken, { optional: true }) ?? defaultConfig;
411
+ }
412
+
413
+ class HlmDropdownMenuSubTrigger {
414
+ _cdkTrigger = inject(CdkMenuTrigger, { host: true });
415
+ _config = injectHlmDropdownMenuConfig();
416
+ align = input(this._config.align, /* @ts-ignore */
417
+ ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
418
+ side = input(this._config.side, /* @ts-ignore */
419
+ ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
420
+ _menuPosition = computed(() => createMenuPosition(this.align(), this.side()), /* @ts-ignore */
421
+ ...(ngDevMode ? [{ debugName: "_menuPosition" }] : /* istanbul ignore next */ []));
422
+ constructor() {
423
+ // CDK sets transform-origin on the submenu content from the resolved position; the content reads it
424
+ // to animate from the anchored corner and to derive its data-side. Cast tolerates @angular/cdk < 21.2
425
+ // (we still support >=21.0), where the property is absent and the assignment is a harmless no-op.
426
+ this._cdkTrigger.transformOriginSelector =
427
+ '[data-slot="dropdown-menu-sub"]';
428
+ effect(() => {
429
+ this._cdkTrigger.menuPosition = this._menuPosition();
430
+ });
431
+ classes(() => "aria-expanded:bg-accent aria-expanded:text-accent-foreground");
432
+ }
433
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuSubTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });
434
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.3", type: HlmDropdownMenuSubTrigger, isStandalone: true, selector: "[hlmDropdownMenuSubTrigger]", inputs: { align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, side: { classPropertyName: "side", publicName: "side", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "dropdown-menu-sub-trigger" } }, providers: [{ provide: MENU_SIDE, useExisting: forwardRef(() => HlmDropdownMenuSubTrigger) }], hostDirectives: [{ directive: i1.CdkMenuTrigger, inputs: ["cdkMenuTriggerFor", "hlmDropdownMenuSubTrigger", "cdkMenuTriggerData", "hlmDropdownMenuTriggerData"], outputs: ["cdkMenuOpened", "hlmDropdownMenuSubOpened", "cdkMenuClosed", "hlmDropdownMenuSubClosed"] }], ngImport: i0 });
435
+ }
436
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuSubTrigger, decorators: [{
437
+ type: Directive,
438
+ args: [{
439
+ selector: '[hlmDropdownMenuSubTrigger]',
440
+ providers: [{ provide: MENU_SIDE, useExisting: forwardRef(() => HlmDropdownMenuSubTrigger) }],
441
+ hostDirectives: [
442
+ {
443
+ directive: CdkMenuTrigger,
444
+ inputs: ['cdkMenuTriggerFor: hlmDropdownMenuSubTrigger', 'cdkMenuTriggerData: hlmDropdownMenuTriggerData'],
445
+ outputs: ['cdkMenuOpened: hlmDropdownMenuSubOpened', 'cdkMenuClosed: hlmDropdownMenuSubClosed'],
446
+ },
447
+ ],
448
+ host: { 'data-slot': 'dropdown-menu-sub-trigger' },
449
+ }]
450
+ }], ctorParameters: () => [], propDecorators: { align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], side: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }] } });
451
+
452
+ class HlmDropdownMenuTrigger {
453
+ _cdkTrigger = inject(CdkMenuTrigger, { host: true });
454
+ _config = injectHlmDropdownMenuConfig();
455
+ align = input(this._config.align, /* @ts-ignore */
456
+ ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
457
+ side = input(this._config.side, /* @ts-ignore */
458
+ ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
459
+ _menuPosition = computed(() => createMenuPosition(this.align(), this.side()), /* @ts-ignore */
460
+ ...(ngDevMode ? [{ debugName: "_menuPosition" }] : /* istanbul ignore next */ []));
461
+ constructor() {
462
+ // CDK sets transform-origin on the menu content from the resolved position; the content reads it to
463
+ // animate from the anchored corner and to derive its data-side. Cast tolerates @angular/cdk < 21.2
464
+ // (we still support >=21.0), where the property is absent and the assignment is a harmless no-op.
465
+ this._cdkTrigger.transformOriginSelector = '[data-slot="dropdown-menu"]';
466
+ effect(() => {
467
+ this._cdkTrigger.menuPosition = this._menuPosition();
468
+ });
469
+ }
470
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });
471
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.3", type: HlmDropdownMenuTrigger, isStandalone: true, selector: "[hlmDropdownMenuTrigger]", inputs: { align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, side: { classPropertyName: "side", publicName: "side", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "dropdown-menu-trigger" } }, providers: [{ provide: MENU_SIDE, useExisting: forwardRef(() => HlmDropdownMenuTrigger) }], hostDirectives: [{ directive: i1.CdkMenuTrigger, inputs: ["cdkMenuTriggerFor", "hlmDropdownMenuTrigger", "cdkMenuTriggerData", "hlmDropdownMenuTriggerData"], outputs: ["cdkMenuOpened", "hlmDropdownMenuOpened", "cdkMenuClosed", "hlmDropdownMenuClosed"] }], ngImport: i0 });
472
+ }
473
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuTrigger, decorators: [{
474
+ type: Directive,
475
+ args: [{
476
+ selector: '[hlmDropdownMenuTrigger]',
477
+ providers: [{ provide: MENU_SIDE, useExisting: forwardRef(() => HlmDropdownMenuTrigger) }],
478
+ hostDirectives: [
479
+ {
480
+ directive: CdkMenuTrigger,
481
+ inputs: ['cdkMenuTriggerFor: hlmDropdownMenuTrigger', 'cdkMenuTriggerData: hlmDropdownMenuTriggerData'],
482
+ outputs: ['cdkMenuOpened: hlmDropdownMenuOpened', 'cdkMenuClosed: hlmDropdownMenuClosed'],
483
+ },
484
+ ],
485
+ host: { 'data-slot': 'dropdown-menu-trigger' },
486
+ }]
487
+ }], ctorParameters: () => [], propDecorators: { align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], side: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }] } });
488
+
489
+ /*
490
+ * Public API Surface of dropdown-menu
491
+ */
492
+ const HlmDropdownMenuImports = [
493
+ HlmDropdownMenu,
494
+ HlmDropdownMenuCheckbox,
495
+ HlmDropdownMenuCheckboxIndicator,
496
+ HlmDropdownMenuGroup,
497
+ HlmDropdownMenuItem,
498
+ HlmDropdownMenuItemSubIndicator,
499
+ HlmDropdownMenuLabel,
500
+ HlmDropdownMenuRadio,
501
+ HlmDropdownMenuRadioIndicator,
502
+ HlmDropdownMenuSeparator,
503
+ HlmDropdownMenuShortcut,
504
+ HlmDropdownMenuSub,
505
+ HlmDropdownMenuSubTrigger,
506
+ HlmDropdownMenuTrigger,
507
+ ];
508
+ class HlmDropdownMenuModule {
509
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
510
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuModule, imports: [HlmDropdownMenu,
511
+ HlmDropdownMenuCheckbox,
512
+ HlmDropdownMenuCheckboxIndicator,
513
+ HlmDropdownMenuGroup,
514
+ HlmDropdownMenuItem,
515
+ HlmDropdownMenuItemSubIndicator,
516
+ HlmDropdownMenuLabel,
517
+ HlmDropdownMenuRadio,
518
+ HlmDropdownMenuRadioIndicator,
519
+ HlmDropdownMenuSeparator,
520
+ HlmDropdownMenuShortcut,
521
+ HlmDropdownMenuSub,
522
+ HlmDropdownMenuSubTrigger,
523
+ HlmDropdownMenuTrigger], exports: [HlmDropdownMenu,
524
+ HlmDropdownMenuCheckbox,
525
+ HlmDropdownMenuCheckboxIndicator,
526
+ HlmDropdownMenuGroup,
527
+ HlmDropdownMenuItem,
528
+ HlmDropdownMenuItemSubIndicator,
529
+ HlmDropdownMenuLabel,
530
+ HlmDropdownMenuRadio,
531
+ HlmDropdownMenuRadioIndicator,
532
+ HlmDropdownMenuSeparator,
533
+ HlmDropdownMenuShortcut,
534
+ HlmDropdownMenuSub,
535
+ HlmDropdownMenuSubTrigger,
536
+ HlmDropdownMenuTrigger] });
537
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuModule, imports: [HlmDropdownMenuCheckboxIndicator,
538
+ HlmDropdownMenuItemSubIndicator,
539
+ HlmDropdownMenuRadioIndicator] });
540
+ }
541
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDropdownMenuModule, decorators: [{
542
+ type: NgModule,
543
+ args: [{
544
+ imports: [...HlmDropdownMenuImports],
545
+ exports: [...HlmDropdownMenuImports],
546
+ }]
547
+ }] });
548
+
549
+ /**
550
+ * Generated bundle index. Do not edit.
551
+ */
552
+
553
+ export { HlmDropdownMenu, HlmDropdownMenuCheckbox, HlmDropdownMenuCheckboxCdk, HlmDropdownMenuCheckboxIndicator, HlmDropdownMenuFocusOnHover, HlmDropdownMenuGroup, HlmDropdownMenuImports, HlmDropdownMenuItem, HlmDropdownMenuItemSubIndicator, HlmDropdownMenuLabel, HlmDropdownMenuModule, HlmDropdownMenuRadio, HlmDropdownMenuRadioCdk, HlmDropdownMenuRadioIndicator, HlmDropdownMenuSeparator, HlmDropdownMenuShortcut, HlmDropdownMenuSub, HlmDropdownMenuSubTrigger, HlmDropdownMenuTrigger, injectHlmDropdownMenuConfig, provideHlmDropdownMenuConfig };
554
+
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "dropdown-menu",
3
+ "version": "0.0.1",
4
+ "peerDependencies": {
5
+ "@angular/common": "^22.0.0",
6
+ "@angular/core": "^22.0.0",
7
+ "@spartan-ng/brain": "^1.1.1"
8
+ },
9
+ "dependencies": {
10
+ "tslib": "^2.3.0"
11
+ },
12
+ "sideEffects": false,
13
+ "module": "fesm2022/dropdown-menu.mjs",
14
+ "typings": "types/dropdown-menu.d.ts",
15
+ "exports": {
16
+ "./package.json": {
17
+ "default": "./package.json"
18
+ },
19
+ ".": {
20
+ "types": "./types/dropdown-menu.d.ts",
21
+ "default": "./fesm2022/dropdown-menu.mjs"
22
+ }
23
+ },
24
+ "type": "module"
25
+ }