@egose/shadcn-theme-ng 0.0.27 → 0.0.28

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 (334) hide show
  1. package/accordion/README.md +64 -0
  2. package/accordion/fesm2022/accordion.mjs +160 -0
  3. package/accordion/fesm2022/accordion.mjs.map +1 -0
  4. package/accordion/package.json +25 -0
  5. package/accordion/types/accordion.d.ts +49 -0
  6. package/alert/fesm2022/alert.mjs +29 -24
  7. package/alert/fesm2022/alert.mjs.map +1 -1
  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/fesm2022/alert-dialog.mjs.map +1 -0
  12. package/alert-dialog/package.json +25 -0
  13. package/alert-dialog/types/alert-dialog.d.ts +90 -0
  14. package/aspect-ratio/README.md +11 -0
  15. package/aspect-ratio/fesm2022/aspect-ratio.mjs +62 -0
  16. package/aspect-ratio/fesm2022/aspect-ratio.mjs.map +1 -0
  17. package/aspect-ratio/package.json +25 -0
  18. package/aspect-ratio/types/aspect-ratio.d.ts +21 -0
  19. package/autocomplete/README.md +64 -0
  20. package/autocomplete/fesm2022/autocomplete.mjs +409 -0
  21. package/autocomplete/fesm2022/autocomplete.mjs.map +1 -0
  22. package/autocomplete/package.json +24 -0
  23. package/autocomplete/types/autocomplete.d.ts +96 -0
  24. package/avatar/README.md +11 -0
  25. package/avatar/fesm2022/avatar.mjs +178 -0
  26. package/avatar/fesm2022/avatar.mjs.map +1 -0
  27. package/avatar/package.json +25 -0
  28. package/avatar/types/avatar.d.ts +50 -0
  29. package/badge/fesm2022/badge.mjs +15 -9
  30. package/badge/fesm2022/badge.mjs.map +1 -1
  31. package/badge/package.json +25 -0
  32. package/basic-alert/fesm2022/basic-alert.mjs +11 -7
  33. package/basic-alert/fesm2022/basic-alert.mjs.map +1 -1
  34. package/basic-alert/package.json +24 -0
  35. package/breadcrumb/README.md +11 -0
  36. package/breadcrumb/fesm2022/breadcrumb.mjs +224 -0
  37. package/breadcrumb/fesm2022/breadcrumb.mjs.map +1 -0
  38. package/breadcrumb/package.json +25 -0
  39. package/breadcrumb/types/breadcrumb.d.ts +57 -0
  40. package/button/fesm2022/button.mjs +99 -25
  41. package/button/fesm2022/button.mjs.map +1 -1
  42. package/button/package.json +25 -0
  43. package/button/{index.d.ts → types/button.d.ts} +30 -9
  44. package/button-group/README.md +11 -0
  45. package/button-group/fesm2022/button-group.mjs +102 -0
  46. package/button-group/fesm2022/button-group.mjs.map +1 -0
  47. package/button-group/package.json +25 -0
  48. package/button-group/types/button-group.d.ts +30 -0
  49. package/calendar/fesm2022/calendar.mjs +868 -546
  50. package/calendar/fesm2022/calendar.mjs.map +1 -1
  51. package/calendar/package.json +24 -0
  52. package/calendar/types/calendar.d.ts +94 -0
  53. package/card/README.md +11 -0
  54. package/card/fesm2022/card.mjs +169 -0
  55. package/card/fesm2022/card.mjs.map +1 -0
  56. package/card/package.json +25 -0
  57. package/card/types/card.d.ts +54 -0
  58. package/carousel/README.md +11 -0
  59. package/carousel/fesm2022/carousel.mjs +309 -0
  60. package/carousel/fesm2022/carousel.mjs.map +1 -0
  61. package/carousel/package.json +25 -0
  62. package/carousel/types/carousel.d.ts +84 -0
  63. package/checkbox/README.md +64 -0
  64. package/checkbox/fesm2022/checkbox.mjs +151 -0
  65. package/checkbox/fesm2022/checkbox.mjs.map +1 -0
  66. package/checkbox/package.json +24 -0
  67. package/checkbox/types/checkbox.d.ts +55 -0
  68. package/collapsible/README.md +11 -0
  69. package/collapsible/fesm2022/collapsible.mjs +77 -0
  70. package/collapsible/fesm2022/collapsible.mjs.map +1 -0
  71. package/collapsible/package.json +25 -0
  72. package/collapsible/types/collapsible.d.ts +27 -0
  73. package/combobox/README.md +11 -0
  74. package/combobox/fesm2022/combobox.mjs +683 -0
  75. package/combobox/fesm2022/combobox.mjs.map +1 -0
  76. package/combobox/package.json +25 -0
  77. package/combobox/types/combobox.d.ts +151 -0
  78. package/command/README.md +11 -0
  79. package/command/fesm2022/command.mjs +361 -0
  80. package/command/fesm2022/command.mjs.map +1 -0
  81. package/command/package.json +25 -0
  82. package/command/types/command.d.ts +89 -0
  83. package/confirmation-dialog/README.md +64 -0
  84. package/confirmation-dialog/fesm2022/confirmation-dialog.mjs +104 -0
  85. package/confirmation-dialog/fesm2022/confirmation-dialog.mjs.map +1 -0
  86. package/confirmation-dialog/package.json +24 -0
  87. package/confirmation-dialog/types/confirmation-dialog.d.ts +24 -0
  88. package/context-menu/README.md +11 -0
  89. package/context-menu/fesm2022/context-menu.mjs +89 -0
  90. package/context-menu/fesm2022/context-menu.mjs.map +1 -0
  91. package/context-menu/package.json +25 -0
  92. package/context-menu/types/context-menu.d.ts +34 -0
  93. package/date-picker/fesm2022/date-picker.mjs +1262 -307
  94. package/date-picker/fesm2022/date-picker.mjs.map +1 -1
  95. package/date-picker/package.json +24 -0
  96. package/date-picker/types/date-picker.d.ts +551 -0
  97. package/dialog/README.md +64 -0
  98. package/dialog/fesm2022/dialog.mjs +307 -0
  99. package/dialog/fesm2022/dialog.mjs.map +1 -0
  100. package/dialog/package.json +24 -0
  101. package/dialog/types/dialog.d.ts +95 -0
  102. package/drawer/README.md +11 -0
  103. package/drawer/fesm2022/drawer.mjs +271 -0
  104. package/drawer/fesm2022/drawer.mjs.map +1 -0
  105. package/drawer/package.json +25 -0
  106. package/drawer/types/drawer.d.ts +76 -0
  107. package/dropdown-menu/README.md +11 -0
  108. package/dropdown-menu/fesm2022/dropdown-menu.mjs +542 -0
  109. package/dropdown-menu/fesm2022/dropdown-menu.mjs.map +1 -0
  110. package/dropdown-menu/package.json +25 -0
  111. package/dropdown-menu/types/dropdown-menu.d.ts +176 -0
  112. package/empty/README.md +11 -0
  113. package/empty/fesm2022/empty.mjs +151 -0
  114. package/empty/fesm2022/empty.mjs.map +1 -0
  115. package/empty/package.json +25 -0
  116. package/empty/types/empty.d.ts +54 -0
  117. package/field/README.md +11 -0
  118. package/field/fesm2022/field.mjs +367 -0
  119. package/field/fesm2022/field.mjs.map +1 -0
  120. package/field/package.json +25 -0
  121. package/field/types/field.d.ts +107 -0
  122. package/form-checkbox/README.md +64 -0
  123. package/form-checkbox/fesm2022/form-checkbox.mjs +154 -0
  124. package/form-checkbox/fesm2022/form-checkbox.mjs.map +1 -0
  125. package/form-checkbox/package.json +24 -0
  126. package/form-checkbox/types/form-checkbox.d.ts +27 -0
  127. package/form-date-picker/fesm2022/form-date-picker.mjs +57 -50
  128. package/form-date-picker/fesm2022/form-date-picker.mjs.map +1 -1
  129. package/form-date-picker/package.json +24 -0
  130. package/form-field/fesm2022/form-field.mjs +37 -25
  131. package/form-field/fesm2022/form-field.mjs.map +1 -1
  132. package/form-field/package.json +25 -0
  133. package/form-field/{index.d.ts → types/form-field.d.ts} +4 -3
  134. package/form-field-simple/fesm2022/form-field-simple.mjs +14 -9
  135. package/form-field-simple/fesm2022/form-field-simple.mjs.map +1 -1
  136. package/form-field-simple/package.json +24 -0
  137. package/form-searchable-multiselect/README.md +64 -0
  138. package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs +158 -0
  139. package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs.map +1 -0
  140. package/form-searchable-multiselect/package.json +24 -0
  141. package/form-searchable-multiselect/types/form-searchable-multiselect.d.ts +30 -0
  142. package/form-select/fesm2022/form-select.mjs +131 -70
  143. package/form-select/fesm2022/form-select.mjs.map +1 -1
  144. package/form-select/package.json +24 -0
  145. package/form-text-input/fesm2022/form-text-input.mjs +66 -37
  146. package/form-text-input/fesm2022/form-text-input.mjs.map +1 -1
  147. package/form-text-input/package.json +24 -0
  148. package/form-textarea/fesm2022/form-textarea.mjs +53 -29
  149. package/form-textarea/fesm2022/form-textarea.mjs.map +1 -1
  150. package/form-textarea/package.json +24 -0
  151. package/hover-card/README.md +11 -0
  152. package/hover-card/fesm2022/hover-card.mjs +123 -0
  153. package/hover-card/fesm2022/hover-card.mjs.map +1 -0
  154. package/hover-card/package.json +25 -0
  155. package/hover-card/types/hover-card.d.ts +36 -0
  156. package/icon/fesm2022/icon.mjs +11 -9
  157. package/icon/fesm2022/icon.mjs.map +1 -1
  158. package/icon/package.json +25 -0
  159. package/input/fesm2022/input.mjs +21 -71
  160. package/input/fesm2022/input.mjs.map +1 -1
  161. package/input/package.json +25 -0
  162. package/input/types/input.d.ts +18 -0
  163. package/input-group/README.md +11 -0
  164. package/input-group/fesm2022/input-group.mjs +199 -0
  165. package/input-group/fesm2022/input-group.mjs.map +1 -0
  166. package/input-group/package.json +25 -0
  167. package/input-group/types/input-group.d.ts +52 -0
  168. package/input-otp/README.md +11 -0
  169. package/input-otp/fesm2022/input-otp.mjs +141 -0
  170. package/input-otp/fesm2022/input-otp.mjs.map +1 -0
  171. package/input-otp/package.json +25 -0
  172. package/input-otp/types/input-otp.d.ts +43 -0
  173. package/item/README.md +11 -0
  174. package/item/fesm2022/item.mjs +278 -0
  175. package/item/fesm2022/item.mjs.map +1 -0
  176. package/item/package.json +25 -0
  177. package/item/types/item.d.ts +101 -0
  178. package/kbd/README.md +11 -0
  179. package/kbd/fesm2022/kbd.mjs +61 -0
  180. package/kbd/fesm2022/kbd.mjs.map +1 -0
  181. package/kbd/package.json +25 -0
  182. package/kbd/types/kbd.d.ts +22 -0
  183. package/label/fesm2022/label.mjs +10 -9
  184. package/label/fesm2022/label.mjs.map +1 -1
  185. package/label/package.json +25 -0
  186. package/layout-simple/README.md +64 -0
  187. package/layout-simple/fesm2022/layout-simple.mjs +719 -0
  188. package/layout-simple/fesm2022/layout-simple.mjs.map +1 -0
  189. package/layout-simple/package.json +24 -0
  190. package/layout-simple/types/layout-simple.d.ts +153 -0
  191. package/menubar/README.md +11 -0
  192. package/menubar/fesm2022/menubar.mjs +108 -0
  193. package/menubar/fesm2022/menubar.mjs.map +1 -0
  194. package/menubar/package.json +25 -0
  195. package/menubar/types/menubar.d.ts +40 -0
  196. package/native-select/README.md +11 -0
  197. package/native-select/fesm2022/native-select.mjs +207 -0
  198. package/native-select/fesm2022/native-select.mjs.map +1 -0
  199. package/native-select/package.json +25 -0
  200. package/native-select/types/native-select.d.ts +70 -0
  201. package/navigation-menu/README.md +11 -0
  202. package/navigation-menu/fesm2022/navigation-menu.mjs +206 -0
  203. package/navigation-menu/fesm2022/navigation-menu.mjs.map +1 -0
  204. package/navigation-menu/package.json +25 -0
  205. package/navigation-menu/types/navigation-menu.d.ts +54 -0
  206. package/package.json +239 -47
  207. package/pagination/README.md +11 -0
  208. package/pagination/fesm2022/pagination.mjs +808 -0
  209. package/pagination/fesm2022/pagination.mjs.map +1 -0
  210. package/pagination/package.json +25 -0
  211. package/pagination/types/pagination.d.ts +192 -0
  212. package/popover/fesm2022/popover.mjs +123 -29
  213. package/popover/fesm2022/popover.mjs.map +1 -1
  214. package/popover/package.json +24 -0
  215. package/popover/types/popover.d.ts +54 -0
  216. package/progress/README.md +11 -0
  217. package/progress/fesm2022/progress.mjs +77 -0
  218. package/progress/fesm2022/progress.mjs.map +1 -0
  219. package/progress/package.json +25 -0
  220. package/progress/types/progress.d.ts +27 -0
  221. package/radio-group/README.md +64 -0
  222. package/radio-group/fesm2022/radio-group.mjs +204 -0
  223. package/radio-group/fesm2022/radio-group.mjs.map +1 -0
  224. package/radio-group/package.json +25 -0
  225. package/radio-group/types/radio-group.d.ts +71 -0
  226. package/resizable/README.md +11 -0
  227. package/resizable/fesm2022/resizable.mjs +111 -0
  228. package/resizable/fesm2022/resizable.mjs.map +1 -0
  229. package/resizable/package.json +25 -0
  230. package/resizable/types/resizable.d.ts +32 -0
  231. package/scroll-area/README.md +11 -0
  232. package/scroll-area/fesm2022/scroll-area.mjs +51 -0
  233. package/scroll-area/fesm2022/scroll-area.mjs.map +1 -0
  234. package/scroll-area/package.json +25 -0
  235. package/scroll-area/types/scroll-area.d.ts +16 -0
  236. package/searchable-multiselect/README.md +64 -0
  237. package/searchable-multiselect/fesm2022/searchable-multiselect.mjs +225 -0
  238. package/searchable-multiselect/fesm2022/searchable-multiselect.mjs.map +1 -0
  239. package/searchable-multiselect/package.json +24 -0
  240. package/searchable-multiselect/types/searchable-multiselect.d.ts +39 -0
  241. package/select/fesm2022/select.mjs +373 -191
  242. package/select/fesm2022/select.mjs.map +1 -1
  243. package/select/package.json +25 -0
  244. package/select/types/select.d.ts +119 -0
  245. package/separator/fesm2022/separator.mjs +16 -14
  246. package/separator/fesm2022/separator.mjs.map +1 -1
  247. package/separator/package.json +24 -0
  248. package/separator/{index.d.ts → types/separator.d.ts} +4 -5
  249. package/sheet/fesm2022/sheet.mjs +49 -42
  250. package/sheet/fesm2022/sheet.mjs.map +1 -1
  251. package/sheet/package.json +24 -0
  252. package/sidebar/README.md +11 -0
  253. package/sidebar/fesm2022/sidebar.mjs +948 -0
  254. package/sidebar/fesm2022/sidebar.mjs.map +1 -0
  255. package/sidebar/package.json +25 -0
  256. package/sidebar/types/sidebar.d.ts +237 -0
  257. package/skeleton/README.md +11 -0
  258. package/skeleton/fesm2022/skeleton.mjs +44 -0
  259. package/skeleton/fesm2022/skeleton.mjs.map +1 -0
  260. package/skeleton/package.json +25 -0
  261. package/skeleton/types/skeleton.d.ts +16 -0
  262. package/slider/README.md +11 -0
  263. package/slider/fesm2022/slider.mjs +144 -0
  264. package/slider/fesm2022/slider.mjs.map +1 -0
  265. package/slider/package.json +25 -0
  266. package/slider/types/slider.d.ts +19 -0
  267. package/sonner/fesm2022/sonner.mjs +29 -34
  268. package/sonner/fesm2022/sonner.mjs.map +1 -1
  269. package/sonner/package.json +25 -0
  270. package/spinner/fesm2022/spinner.mjs +17 -13
  271. package/spinner/fesm2022/spinner.mjs.map +1 -1
  272. package/spinner/package.json +25 -0
  273. package/switch/fesm2022/switch.mjs +27 -24
  274. package/switch/fesm2022/switch.mjs.map +1 -1
  275. package/switch/package.json +25 -0
  276. package/table/README.md +11 -0
  277. package/table/fesm2022/table.mjs +211 -0
  278. package/table/fesm2022/table.mjs.map +1 -0
  279. package/table/package.json +25 -0
  280. package/table/types/table.d.ts +87 -0
  281. package/tabs/README.md +64 -0
  282. package/tabs/fesm2022/tabs.mjs +286 -0
  283. package/tabs/fesm2022/tabs.mjs.map +1 -0
  284. package/tabs/package.json +25 -0
  285. package/tabs/types/tabs.d.ts +71 -0
  286. package/textarea/README.md +11 -0
  287. package/textarea/fesm2022/textarea.mjs +47 -0
  288. package/textarea/fesm2022/textarea.mjs.map +1 -0
  289. package/textarea/package.json +25 -0
  290. package/textarea/types/textarea.d.ts +18 -0
  291. package/toggle/README.md +11 -0
  292. package/toggle/fesm2022/toggle.mjs +78 -0
  293. package/toggle/fesm2022/toggle.mjs.map +1 -0
  294. package/toggle/package.json +25 -0
  295. package/toggle/types/toggle.d.ts +27 -0
  296. package/toggle-group/README.md +11 -0
  297. package/toggle-group/fesm2022/toggle-group.mjs +117 -0
  298. package/toggle-group/fesm2022/toggle-group.mjs.map +1 -0
  299. package/toggle-group/package.json +25 -0
  300. package/toggle-group/types/toggle-group.d.ts +39 -0
  301. package/tooltip/README.md +64 -0
  302. package/tooltip/fesm2022/tooltip.mjs +72 -0
  303. package/tooltip/fesm2022/tooltip.mjs.map +1 -0
  304. package/tooltip/package.json +25 -0
  305. package/tooltip/types/tooltip.d.ts +22 -0
  306. package/typography/README.md +11 -0
  307. package/typography/fesm2022/typography.mjs +242 -0
  308. package/typography/fesm2022/typography.mjs.map +1 -0
  309. package/typography/package.json +25 -0
  310. package/typography/types/typography.d.ts +94 -0
  311. package/utils/fesm2022/utils.mjs +184 -1
  312. package/utils/fesm2022/utils.mjs.map +1 -1
  313. package/utils/package.json +25 -0
  314. package/utils/types/utils.d.ts +13 -0
  315. package/calendar/index.d.ts +0 -111
  316. package/date-picker/index.d.ts +0 -227
  317. package/input/index.d.ts +0 -41
  318. package/popover/index.d.ts +0 -30
  319. package/select/index.d.ts +0 -92
  320. package/utils/index.d.ts +0 -5
  321. /package/alert/{index.d.ts → types/alert.d.ts} +0 -0
  322. /package/badge/{index.d.ts → types/badge.d.ts} +0 -0
  323. /package/basic-alert/{index.d.ts → types/basic-alert.d.ts} +0 -0
  324. /package/form-date-picker/{index.d.ts → types/form-date-picker.d.ts} +0 -0
  325. /package/form-field-simple/{index.d.ts → types/form-field-simple.d.ts} +0 -0
  326. /package/form-select/{index.d.ts → types/form-select.d.ts} +0 -0
  327. /package/form-text-input/{index.d.ts → types/form-text-input.d.ts} +0 -0
  328. /package/form-textarea/{index.d.ts → types/form-textarea.d.ts} +0 -0
  329. /package/icon/{index.d.ts → types/icon.d.ts} +0 -0
  330. /package/label/{index.d.ts → types/label.d.ts} +0 -0
  331. /package/sheet/{index.d.ts → types/sheet.d.ts} +0 -0
  332. /package/sonner/{index.d.ts → types/sonner.d.ts} +0 -0
  333. /package/spinner/{index.d.ts → types/spinner.d.ts} +0 -0
  334. /package/switch/{index.d.ts → types/switch.d.ts} +0 -0
@@ -1,627 +1,949 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, computed, booleanAttribute, model, numberAttribute, viewChild, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
2
+ import { input, inject, computed, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
3
+ import { NgTemplateOutlet } from '@angular/common';
3
4
  import { provideIcons, NgIcon } from '@ng-icons/core';
4
5
  import { lucideChevronRight, lucideChevronLeft } from '@ng-icons/lucide';
5
- import { injectBrnCalendarI18n, BrnCalendar, BrnCalendarHeader, BrnCalendarNextButton, BrnCalendarPreviousButton, BrnCalendarWeekday, BrnCalendarWeek, BrnCalendarCellButton, BrnCalendarCell, BrnCalendarGrid, BrnCalendarMulti, BrnCalendarRange } from '@spartan-ng/brain/calendar';
6
+ import * as i1 from '@spartan-ng/brain/calendar';
7
+ import { injectBrnCalendarI18n, BrnCalendar, BrnCalendarImports, BrnCalendarMulti, BrnCalendarRange, BrnMonthYearCalendar } from '@spartan-ng/brain/calendar';
6
8
  import { injectDateAdapter } from '@spartan-ng/brain/date-time';
7
- import { buttonVariants } from '@egose/shadcn-theme-ng/button';
8
- import { HlmIcon } from '@egose/shadcn-theme-ng/icon';
9
- import { hlm } from '@egose/shadcn-theme-ng/utils';
9
+ import * as i3 from '@egose/shadcn-theme-ng/button';
10
+ import { buttonVariants, HlmButtonImports } from '@egose/shadcn-theme-ng/button';
11
+ import * as i2 from '@egose/shadcn-theme-ng/select';
12
+ import { HlmSelectImports } from '@egose/shadcn-theme-ng/select';
13
+ import { hlm, classes } from '@egose/shadcn-theme-ng/utils';
10
14
 
11
15
  class HlmCalendar {
12
- calendarClass = input('', ...(ngDevMode ? [{ debugName: "calendarClass" }] : []));
13
- _computedCalenderClass = computed(() => hlm('rounded-md border p-3', this.calendarClass()), ...(ngDevMode ? [{ debugName: "_computedCalenderClass" }] : []));
14
16
  /** Access the calendar i18n */
15
17
  _i18n = injectBrnCalendarI18n();
16
18
  /** Access the date time adapter */
17
19
  _dateAdapter = injectDateAdapter();
18
- /** The minimum date that can be selected.*/
19
- min = input(...(ngDevMode ? [undefined, { debugName: "min" }] : []));
20
- /** The maximum date that can be selected. */
21
- max = input(...(ngDevMode ? [undefined, { debugName: "max" }] : []));
22
- /** Determine if the date picker is disabled. */
23
- disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", transform: booleanAttribute }] : [{
24
- transform: booleanAttribute,
25
- }]));
26
- /** The selected value. */
27
- date = model(...(ngDevMode ? [undefined, { debugName: "date" }] : []));
28
- /** Whether a specific date is disabled. */
29
- dateDisabled = input(() => false, ...(ngDevMode ? [{ debugName: "dateDisabled" }] : []));
30
- /** The day the week starts on */
31
- weekStartsOn = input(undefined, ...(ngDevMode ? [{ debugName: "weekStartsOn", transform: (v) => numberAttribute(v) }] : [{
32
- transform: (v) => numberAttribute(v),
33
- }]));
34
- /** The default focused date. */
35
- defaultFocusedDate = input(...(ngDevMode ? [undefined, { debugName: "defaultFocusedDate" }] : []));
20
+ /** Show dropdowns to navigate between months or years. */
21
+ captionLayout = input('label', /* @ts-ignore */
22
+ ...(ngDevMode ? [{ debugName: "captionLayout" }] : /* istanbul ignore next */ []));
36
23
  /** Access the calendar directive */
37
- _calendar = viewChild.required(BrnCalendar);
24
+ _calendar = inject(BrnCalendar);
38
25
  /** Get the heading for the current month and year */
39
- _heading = computed(() => this._i18n
40
- .config()
41
- .formatHeader(this._dateAdapter.getMonth(this._calendar().focusedDate()), this._dateAdapter.getYear(this._calendar().focusedDate())), ...(ngDevMode ? [{ debugName: "_heading" }] : []));
42
- _btnClass = hlm(buttonVariants({ variant: 'ghost' }), 'size-8 p-0 font-normal aria-selected:opacity-100', 'data-[outside]:text-muted-foreground data-[outside]:aria-selected:bg-secondary/50 data-[outside]:aria-selected:text-muted-foreground data-[outside]:opacity-50 data-[outside]:aria-selected:opacity-30', 'data-[today]:bg-secondary data-[today]:text-secondary-foreground', 'data-[selected]:bg-primary data-[selected]:text-primary-foreground data-[selected]:hover:bg-primary data-[selected]:focus:bg-primary data-[selected]:focus:text-primary-foreground', 'data-[disabled]:text-muted-foreground data-[disabled]:opacity-50');
43
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: HlmCalendar, deps: [], target: i0.ɵɵFactoryTarget.Component });
44
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: HlmCalendar, isStandalone: true, selector: "hlm-calendar", inputs: { calendarClass: { classPropertyName: "calendarClass", publicName: "calendarClass", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, date: { classPropertyName: "date", publicName: "date", isSignal: true, isRequired: false, transformFunction: null }, dateDisabled: { classPropertyName: "dateDisabled", publicName: "dateDisabled", isSignal: true, isRequired: false, transformFunction: null }, weekStartsOn: { classPropertyName: "weekStartsOn", publicName: "weekStartsOn", isSignal: true, isRequired: false, transformFunction: null }, defaultFocusedDate: { classPropertyName: "defaultFocusedDate", publicName: "defaultFocusedDate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { date: "dateChange" }, viewQueries: [{ propertyName: "_calendar", first: true, predicate: BrnCalendar, descendants: true, isSignal: true }], ngImport: i0, template: `
45
- <div
46
- brnCalendar
47
- [min]="min()"
48
- [max]="max()"
49
- [disabled]="disabled()"
50
- [(date)]="date"
51
- [dateDisabled]="dateDisabled()"
52
- [weekStartsOn]="weekStartsOn()"
53
- [defaultFocusedDate]="defaultFocusedDate()"
54
- [class]="_computedCalenderClass()"
55
- >
56
- <div class="inline-flex flex-col space-y-4">
57
- <!-- Header -->
58
- <div class="space-y-4">
59
- <div class="relative flex items-center justify-center pt-1">
60
- <div brnCalendarHeader class="text-sm font-medium">
61
- {{ _heading() }}
62
- </div>
63
-
64
- <div class="flex items-center space-x-1">
65
- <button
66
- brnCalendarPreviousButton
67
- class="focus-visible:ring-ring hover:bg-secondary hover:text-secondary-foreground text-popover-foreground absolute left-1 inline-flex size-8 items-center justify-center whitespace-nowrap rounded-md bg-transparent p-0 text-sm font-medium transition-colors hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50"
68
- >
69
- <ng-icon hlm name="lucideChevronLeft" size="sm" />
70
- </button>
26
+ _heading = computed(() => {
27
+ const config = this._i18n.config();
28
+ const date = this._calendar.focusedDate();
29
+ return {
30
+ header: config.formatHeader(this._dateAdapter.getMonth(date), this._dateAdapter.getYear(date)),
31
+ month: config.formatMonth(this._dateAdapter.getMonth(date)),
32
+ year: config.formatYear(this._dateAdapter.getYear(date)),
33
+ };
34
+ }, /* @ts-ignore */
35
+ ...(ngDevMode ? [{ debugName: "_heading" }] : /* istanbul ignore next */ []));
36
+ _btnClass = hlm(buttonVariants({ variant: 'ghost', size: 'icon' }), 'data-[today=true]:bg-muted group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-ring/50 data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground data-[range-middle=true]:bg-muted data-[range-middle=true]:text-foreground data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground dark:hover:bg-muted/50 dark:hover:text-foreground relative isolate z-10 flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 border-0 leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-[3px] data-[range-end=true]:rounded-(--cell-radius) data-[range-end=true]:rounded-e-(--cell-radius) data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-(--cell-radius) data-[range-start=true]:rounded-s-(--cell-radius) [&>span]:text-xs [&>span]:opacity-70', 'data-[outside=true]:opacity-50', "data-[highlighted]:before:content-['']", 'data-[highlighted]:before:absolute', 'data-[highlighted]:before:bottom-1', 'data-[highlighted]:before:start-1/2', 'data-[highlighted]:before:h-1', 'data-[highlighted]:before:w-1', 'data-[highlighted]:before:-translate-x-1/2', 'data-[highlighted]:before:rounded-full', 'data-[highlighted]:before:bg-destructive');
37
+ _selectClass = 'gap-0 px-1.5 py-2 [&>ng-icon]:ms-1';
38
+ constructor() {
39
+ classes(() => 'p-3 [--cell-radius:var(--radius-md)] [--cell-size:--spacing(8)] group/calendar bg-background block in-data-[slot=card-content]:bg-transparent in-data-[slot=popover-content]:bg-transparent');
40
+ }
41
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmCalendar, deps: [], target: i0.ɵɵFactoryTarget.Component });
42
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: HlmCalendar, isStandalone: true, selector: "hlm-calendar", inputs: { captionLayout: { classPropertyName: "captionLayout", publicName: "captionLayout", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "calendar" } }, hostDirectives: [{ directive: i1.BrnCalendar, inputs: ["min", "min", "max", "max", "disabled", "disabled", "date", "date", "dateDisabled", "dateDisabled", "weekStartsOn", "weekStartsOn", "highlightDays", "highlightDays", "defaultFocusedDate", "defaultFocusedDate"], outputs: ["dateChange", "dateChange"] }], ngImport: i0, template: `
43
+ <div class="inline-flex flex-col gap-4">
44
+ <!-- Header -->
45
+ <div class="flex w-full items-center justify-between gap-1.5">
46
+ <ng-template #month>
47
+ <hlm-select brnCalendarMonthSelect class="order-1">
48
+ <hlm-select-trigger size="sm" [class]="_selectClass">
49
+ <hlm-select-value />
50
+ </hlm-select-trigger>
51
+ <hlm-select-content *hlmSelectPortal class="max-h-80">
52
+ <hlm-select-group>
53
+ @for (month of _i18n.config().months(); track month) {
54
+ <hlm-select-item [value]="month">{{ month }}</hlm-select-item>
55
+ }
56
+ </hlm-select-group>
57
+ </hlm-select-content>
58
+ </hlm-select>
59
+ </ng-template>
60
+ <ng-template #year>
61
+ <hlm-select brnCalendarYearSelect class="order-3">
62
+ <hlm-select-trigger size="sm" [class]="_selectClass">
63
+ <hlm-select-value />
64
+ </hlm-select-trigger>
65
+ <hlm-select-content *hlmSelectPortal class="max-h-80">
66
+ <hlm-select-group>
67
+ @for (year of _i18n.config().years(); track year) {
68
+ <hlm-select-item [value]="year">{{ year }}</hlm-select-item>
69
+ }
70
+ </hlm-select-group>
71
+ </hlm-select-content>
72
+ </hlm-select>
73
+ </ng-template>
74
+ @let heading = _heading();
71
75
 
72
- <button
73
- brnCalendarNextButton
74
- class="focus-visible:ring-ring hover:bg-secondary hover:text-secondary-foreground text-popover-foreground absolute right-1 inline-flex size-8 items-center justify-center whitespace-nowrap rounded-md bg-transparent p-0 text-sm font-medium transition-colors hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50"
75
- >
76
- <ng-icon hlm name="lucideChevronRight" size="sm" />
77
- </button>
78
- </div>
79
- </div>
80
- </div>
81
-
82
- <table class="w-full border-collapse space-y-1" brnCalendarGrid>
83
- <thead>
84
- <tr class="flex">
85
- <th
86
- *brnCalendarWeekday="let weekday"
87
- scope="col"
88
- class="text-muted-foreground w-8 rounded-md text-[0.8rem] font-normal"
89
- [attr.aria-label]="_i18n.config().labelWeekday(weekday)"
90
- >
91
- {{ _i18n.config().formatWeekdayName(weekday) }}
92
- </th>
93
- </tr>
94
- </thead>
95
-
96
- <tbody role="rowgroup">
97
- <tr *brnCalendarWeek="let week" class="mt-2 flex w-full">
98
- @for (date of week; track _dateAdapter.getTime(date)) {
99
- <td
100
- brnCalendarCell
101
- class="data-[selected]:data-[outside]:bg-secondary/50 data-[selected]:bg-secondary relative size-8 p-0 text-center text-sm focus-within:relative focus-within:z-20 first:data-[selected]:rounded-l-md last:data-[selected]:rounded-r-md [&:has([aria-selected].day-range-end)]:rounded-r-md"
102
- >
103
- <button brnCalendarCellButton [date]="date" [class]="_btnClass">
104
- {{ _dateAdapter.getDate(date) }}
105
- </button>
106
- </td>
107
- }
108
- </tr>
109
- </tbody>
110
- </table>
76
+ <button
77
+ brnCalendarPreviousButton
78
+ variant="ghost"
79
+ hlmBtn
80
+ class="order-first size-(--cell-size) p-0 select-none aria-disabled:opacity-50"
81
+ >
82
+ <ng-icon name="lucideChevronLeft" class="rtl:rotate-180" />
83
+ </button>
84
+
85
+ @switch (captionLayout()) {
86
+ @case ('dropdown') {
87
+ <ng-container [ngTemplateOutlet]="month" />
88
+ <ng-container [ngTemplateOutlet]="year" />
89
+ }
90
+ @case ('dropdown-months') {
91
+ <ng-container [ngTemplateOutlet]="month" />
92
+ <div brnCalendarHeader class="order-4 text-sm font-medium">{{ heading.year }}</div>
93
+ }
94
+ @case ('dropdown-years') {
95
+ <div brnCalendarHeader class="order-2 text-sm font-medium">{{ heading.month }}</div>
96
+ <ng-container [ngTemplateOutlet]="year" />
97
+ }
98
+ @case ('label') {
99
+ <div brnCalendarHeader class="order-5 text-sm font-medium">{{ heading.header }}</div>
100
+ }
101
+ }
102
+
103
+ <button
104
+ brnCalendarNextButton
105
+ hlmBtn
106
+ variant="ghost"
107
+ class="order-last size-(--cell-size) p-0 select-none aria-disabled:opacity-50"
108
+ >
109
+ <ng-icon name="lucideChevronRight" class="rtl:rotate-180" />
110
+ </button>
111
111
  </div>
112
+
113
+ <table class="w-full border-collapse space-y-1" brnCalendarGrid>
114
+ <thead aria-hidden="true">
115
+ <tr class="flex">
116
+ <th
117
+ *brnCalendarWeekday="let weekday"
118
+ scope="col"
119
+ class="text-muted-foreground flex-1 rounded-(--cell-radius) text-[0.8rem] font-normal select-none"
120
+ [attr.aria-label]="_i18n.config().labelWeekday(weekday)"
121
+ >
122
+ {{ _i18n.config().formatWeekdayName(weekday) }}
123
+ </th>
124
+ </tr>
125
+ </thead>
126
+
127
+ <tbody role="rowgroup">
128
+ <tr *brnCalendarWeek="let week" class="mt-2 flex w-full">
129
+ @for (date of week; track _dateAdapter.getTime(date)) {
130
+ <td
131
+ brnCalendarCell
132
+ class="group/day relative aspect-square h-full w-full rounded-(--cell-radius) p-0 text-center select-none [&:first-child[data-selected=true]_button]:rounded-s-(--cell-radius) [&:last-child[data-selected=true]_button]:rounded-e-(--cell-radius)"
133
+ >
134
+ <button brnCalendarCellButton [date]="date" [class]="_btnClass">
135
+ {{ _dateAdapter.getDate(date) }}
136
+ </button>
137
+ </td>
138
+ }
139
+ </tr>
140
+ </tbody>
141
+ </table>
112
142
  </div>
113
- `, isInline: true, dependencies: [{ kind: "directive", type: BrnCalendar, selector: "[brnCalendar]", inputs: ["min", "max", "disabled", "date", "dateDisabled", "weekStartsOn", "defaultFocusedDate"], outputs: ["dateChange"] }, { kind: "directive", type: BrnCalendarHeader, selector: "[brnCalendarHeader]", inputs: ["id"] }, { kind: "directive", type: BrnCalendarNextButton, selector: "[brnCalendarNextButton]" }, { kind: "directive", type: BrnCalendarPreviousButton, selector: "[brnCalendarPreviousButton]" }, { kind: "directive", type: BrnCalendarWeekday, selector: "[brnCalendarWeekday]" }, { kind: "directive", type: BrnCalendarWeek, selector: "[brnCalendarWeek]" }, { kind: "directive", type: BrnCalendarCellButton, selector: "button[brnCalendarCellButton]", inputs: ["date"] }, { kind: "directive", type: BrnCalendarCell, selector: "[brnCalendarCell]" }, { kind: "directive", type: BrnCalendarGrid, selector: "[brnCalendarGrid]" }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: HlmIcon, selector: "ng-icon[hlm]", inputs: ["size"] }], viewProviders: [provideIcons({ lucideChevronLeft, lucideChevronRight })], changeDetection: i0.ChangeDetectionStrategy.OnPush });
143
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.BrnCalendarCellButton, selector: "button[brnCalendarCellButton]", inputs: ["date"] }, { kind: "directive", type: i1.BrnCalendarGrid, selector: "[brnCalendarGrid]" }, { kind: "directive", type: i1.BrnCalendarHeader, selector: "[brnCalendarHeader]", inputs: ["id"] }, { kind: "directive", type: i1.BrnCalendarNextButton, selector: "[brnCalendarNextButton]" }, { kind: "directive", type: i1.BrnCalendarPreviousButton, selector: "[brnCalendarPreviousButton]" }, { kind: "directive", type: i1.BrnCalendarWeek, selector: "[brnCalendarWeek]" }, { kind: "directive", type: i1.BrnCalendarWeekday, selector: "[brnCalendarWeekday]" }, { kind: "directive", type: i1.BrnCalendarCell, selector: "[brnCalendarCell]" }, { kind: "directive", type: i1.BrnCalendarMonthSelect, selector: "brnSelect[brnCalendarMonthSelect],hlm-select[brnCalendarMonthSelect]" }, { kind: "directive", type: i1.BrnCalendarYearSelect, selector: "brnSelect[brnCalendarYearSelect],hlm-select[brnCalendarYearSelect]" }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: i2.HlmSelect, selector: "[hlmSelect],hlm-select" }, { kind: "component", type: i2.HlmSelectContent, selector: "hlm-select-content", inputs: ["showScroll"] }, { kind: "directive", type: i2.HlmSelectGroup, selector: "[hlmSelectGroup],hlm-select-group" }, { kind: "component", type: i2.HlmSelectItem, selector: "hlm-select-item" }, { kind: "directive", type: i2.HlmSelectPortal, selector: "[hlmSelectPortal]" }, { kind: "component", type: i2.HlmSelectTrigger, selector: "hlm-select-trigger", inputs: ["class", "buttonId", "size", "forceInvalid"] }, { kind: "directive", type: i2.HlmSelectValue, selector: "[hlmSelectValue],hlm-select-value" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.HlmBtn, selector: "button[hlmBtn], a[hlmBtn]", inputs: ["variant", "size", "class", "type"], exportAs: ["hlmBtn"] }], viewProviders: [provideIcons({ lucideChevronLeft, lucideChevronRight })], changeDetection: i0.ChangeDetectionStrategy.OnPush });
114
144
  }
115
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: HlmCalendar, decorators: [{
145
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmCalendar, decorators: [{
116
146
  type: Component,
117
147
  args: [{
118
148
  selector: 'hlm-calendar',
119
- imports: [
120
- BrnCalendar,
121
- BrnCalendarHeader,
122
- BrnCalendarNextButton,
123
- BrnCalendarPreviousButton,
124
- BrnCalendarWeekday,
125
- BrnCalendarWeek,
126
- BrnCalendarCellButton,
127
- BrnCalendarCell,
128
- BrnCalendarGrid,
129
- NgIcon,
130
- HlmIcon,
131
- ],
149
+ imports: [BrnCalendarImports, NgIcon, HlmSelectImports, NgTemplateOutlet, HlmButtonImports],
132
150
  viewProviders: [provideIcons({ lucideChevronLeft, lucideChevronRight })],
151
+ changeDetection: ChangeDetectionStrategy.OnPush,
152
+ hostDirectives: [
153
+ {
154
+ directive: BrnCalendar,
155
+ inputs: ['min', 'max', 'disabled', 'date', 'dateDisabled', 'weekStartsOn', 'highlightDays', 'defaultFocusedDate'],
156
+ outputs: ['dateChange'],
157
+ },
158
+ ],
159
+ host: { 'data-slot': 'calendar' },
133
160
  template: `
134
- <div
135
- brnCalendar
136
- [min]="min()"
137
- [max]="max()"
138
- [disabled]="disabled()"
139
- [(date)]="date"
140
- [dateDisabled]="dateDisabled()"
141
- [weekStartsOn]="weekStartsOn()"
142
- [defaultFocusedDate]="defaultFocusedDate()"
143
- [class]="_computedCalenderClass()"
144
- >
145
- <div class="inline-flex flex-col space-y-4">
146
- <!-- Header -->
147
- <div class="space-y-4">
148
- <div class="relative flex items-center justify-center pt-1">
149
- <div brnCalendarHeader class="text-sm font-medium">
150
- {{ _heading() }}
151
- </div>
152
-
153
- <div class="flex items-center space-x-1">
154
- <button
155
- brnCalendarPreviousButton
156
- class="focus-visible:ring-ring hover:bg-secondary hover:text-secondary-foreground text-popover-foreground absolute left-1 inline-flex size-8 items-center justify-center whitespace-nowrap rounded-md bg-transparent p-0 text-sm font-medium transition-colors hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50"
157
- >
158
- <ng-icon hlm name="lucideChevronLeft" size="sm" />
159
- </button>
161
+ <div class="inline-flex flex-col gap-4">
162
+ <!-- Header -->
163
+ <div class="flex w-full items-center justify-between gap-1.5">
164
+ <ng-template #month>
165
+ <hlm-select brnCalendarMonthSelect class="order-1">
166
+ <hlm-select-trigger size="sm" [class]="_selectClass">
167
+ <hlm-select-value />
168
+ </hlm-select-trigger>
169
+ <hlm-select-content *hlmSelectPortal class="max-h-80">
170
+ <hlm-select-group>
171
+ @for (month of _i18n.config().months(); track month) {
172
+ <hlm-select-item [value]="month">{{ month }}</hlm-select-item>
173
+ }
174
+ </hlm-select-group>
175
+ </hlm-select-content>
176
+ </hlm-select>
177
+ </ng-template>
178
+ <ng-template #year>
179
+ <hlm-select brnCalendarYearSelect class="order-3">
180
+ <hlm-select-trigger size="sm" [class]="_selectClass">
181
+ <hlm-select-value />
182
+ </hlm-select-trigger>
183
+ <hlm-select-content *hlmSelectPortal class="max-h-80">
184
+ <hlm-select-group>
185
+ @for (year of _i18n.config().years(); track year) {
186
+ <hlm-select-item [value]="year">{{ year }}</hlm-select-item>
187
+ }
188
+ </hlm-select-group>
189
+ </hlm-select-content>
190
+ </hlm-select>
191
+ </ng-template>
192
+ @let heading = _heading();
160
193
 
161
- <button
162
- brnCalendarNextButton
163
- class="focus-visible:ring-ring hover:bg-secondary hover:text-secondary-foreground text-popover-foreground absolute right-1 inline-flex size-8 items-center justify-center whitespace-nowrap rounded-md bg-transparent p-0 text-sm font-medium transition-colors hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50"
164
- >
165
- <ng-icon hlm name="lucideChevronRight" size="sm" />
166
- </button>
167
- </div>
168
- </div>
169
- </div>
170
-
171
- <table class="w-full border-collapse space-y-1" brnCalendarGrid>
172
- <thead>
173
- <tr class="flex">
174
- <th
175
- *brnCalendarWeekday="let weekday"
176
- scope="col"
177
- class="text-muted-foreground w-8 rounded-md text-[0.8rem] font-normal"
178
- [attr.aria-label]="_i18n.config().labelWeekday(weekday)"
179
- >
180
- {{ _i18n.config().formatWeekdayName(weekday) }}
181
- </th>
182
- </tr>
183
- </thead>
184
-
185
- <tbody role="rowgroup">
186
- <tr *brnCalendarWeek="let week" class="mt-2 flex w-full">
187
- @for (date of week; track _dateAdapter.getTime(date)) {
188
- <td
189
- brnCalendarCell
190
- class="data-[selected]:data-[outside]:bg-secondary/50 data-[selected]:bg-secondary relative size-8 p-0 text-center text-sm focus-within:relative focus-within:z-20 first:data-[selected]:rounded-l-md last:data-[selected]:rounded-r-md [&:has([aria-selected].day-range-end)]:rounded-r-md"
191
- >
192
- <button brnCalendarCellButton [date]="date" [class]="_btnClass">
193
- {{ _dateAdapter.getDate(date) }}
194
- </button>
195
- </td>
196
- }
197
- </tr>
198
- </tbody>
199
- </table>
194
+ <button
195
+ brnCalendarPreviousButton
196
+ variant="ghost"
197
+ hlmBtn
198
+ class="order-first size-(--cell-size) p-0 select-none aria-disabled:opacity-50"
199
+ >
200
+ <ng-icon name="lucideChevronLeft" class="rtl:rotate-180" />
201
+ </button>
202
+
203
+ @switch (captionLayout()) {
204
+ @case ('dropdown') {
205
+ <ng-container [ngTemplateOutlet]="month" />
206
+ <ng-container [ngTemplateOutlet]="year" />
207
+ }
208
+ @case ('dropdown-months') {
209
+ <ng-container [ngTemplateOutlet]="month" />
210
+ <div brnCalendarHeader class="order-4 text-sm font-medium">{{ heading.year }}</div>
211
+ }
212
+ @case ('dropdown-years') {
213
+ <div brnCalendarHeader class="order-2 text-sm font-medium">{{ heading.month }}</div>
214
+ <ng-container [ngTemplateOutlet]="year" />
215
+ }
216
+ @case ('label') {
217
+ <div brnCalendarHeader class="order-5 text-sm font-medium">{{ heading.header }}</div>
218
+ }
219
+ }
220
+
221
+ <button
222
+ brnCalendarNextButton
223
+ hlmBtn
224
+ variant="ghost"
225
+ class="order-last size-(--cell-size) p-0 select-none aria-disabled:opacity-50"
226
+ >
227
+ <ng-icon name="lucideChevronRight" class="rtl:rotate-180" />
228
+ </button>
200
229
  </div>
230
+
231
+ <table class="w-full border-collapse space-y-1" brnCalendarGrid>
232
+ <thead aria-hidden="true">
233
+ <tr class="flex">
234
+ <th
235
+ *brnCalendarWeekday="let weekday"
236
+ scope="col"
237
+ class="text-muted-foreground flex-1 rounded-(--cell-radius) text-[0.8rem] font-normal select-none"
238
+ [attr.aria-label]="_i18n.config().labelWeekday(weekday)"
239
+ >
240
+ {{ _i18n.config().formatWeekdayName(weekday) }}
241
+ </th>
242
+ </tr>
243
+ </thead>
244
+
245
+ <tbody role="rowgroup">
246
+ <tr *brnCalendarWeek="let week" class="mt-2 flex w-full">
247
+ @for (date of week; track _dateAdapter.getTime(date)) {
248
+ <td
249
+ brnCalendarCell
250
+ class="group/day relative aspect-square h-full w-full rounded-(--cell-radius) p-0 text-center select-none [&:first-child[data-selected=true]_button]:rounded-s-(--cell-radius) [&:last-child[data-selected=true]_button]:rounded-e-(--cell-radius)"
251
+ >
252
+ <button brnCalendarCellButton [date]="date" [class]="_btnClass">
253
+ {{ _dateAdapter.getDate(date) }}
254
+ </button>
255
+ </td>
256
+ }
257
+ </tr>
258
+ </tbody>
259
+ </table>
201
260
  </div>
202
261
  `,
203
- changeDetection: ChangeDetectionStrategy.OnPush,
204
262
  }]
205
- }], propDecorators: { calendarClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "calendarClass", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], date: [{ type: i0.Input, args: [{ isSignal: true, alias: "date", required: false }] }, { type: i0.Output, args: ["dateChange"] }], dateDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateDisabled", required: false }] }], weekStartsOn: [{ type: i0.Input, args: [{ isSignal: true, alias: "weekStartsOn", required: false }] }], defaultFocusedDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultFocusedDate", required: false }] }], _calendar: [{ type: i0.ViewChild, args: [i0.forwardRef(() => BrnCalendar), { isSignal: true }] }] } });
263
+ }], ctorParameters: () => [], propDecorators: { captionLayout: [{ type: i0.Input, args: [{ isSignal: true, alias: "captionLayout", required: false }] }] } });
206
264
 
207
265
  class HlmCalendarMulti {
208
- calendarClass = input('', ...(ngDevMode ? [{ debugName: "calendarClass" }] : []));
209
- _computedCalenderClass = computed(() => hlm('rounded-md border p-3', this.calendarClass()), ...(ngDevMode ? [{ debugName: "_computedCalenderClass" }] : []));
266
+ /** Show dropdowns to navigate between months or years. */
267
+ captionLayout = input('label', /* @ts-ignore */
268
+ ...(ngDevMode ? [{ debugName: "captionLayout" }] : /* istanbul ignore next */ []));
210
269
  /** Access the calendar i18n */
211
270
  _i18n = injectBrnCalendarI18n();
212
271
  /** Access the date time adapter */
213
272
  _dateAdapter = injectDateAdapter();
214
- /** The minimum date that can be selected.*/
215
- min = input(...(ngDevMode ? [undefined, { debugName: "min" }] : []));
216
- /** The maximum date that can be selected. */
217
- max = input(...(ngDevMode ? [undefined, { debugName: "max" }] : []));
218
- /** The minimum selectable dates. */
219
- minSelection = input(undefined, ...(ngDevMode ? [{ debugName: "minSelection", transform: numberAttribute }] : [{
220
- transform: numberAttribute,
221
- }]));
222
- /** The maximum selectable dates. */
223
- maxSelection = input(undefined, ...(ngDevMode ? [{ debugName: "maxSelection", transform: numberAttribute }] : [{
224
- transform: numberAttribute,
225
- }]));
226
- /** Determine if the date picker is disabled. */
227
- disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", transform: booleanAttribute }] : [{
228
- transform: booleanAttribute,
229
- }]));
230
- /** The selected value. */
231
- date = model(...(ngDevMode ? [undefined, { debugName: "date" }] : []));
232
- /** Whether a specific date is disabled. */
233
- dateDisabled = input(() => false, ...(ngDevMode ? [{ debugName: "dateDisabled" }] : []));
234
- /** The day the week starts on */
235
- weekStartsOn = input(undefined, ...(ngDevMode ? [{ debugName: "weekStartsOn", transform: (v) => numberAttribute(v) }] : [{
236
- transform: (v) => numberAttribute(v),
237
- }]));
238
- /** The default focused date. */
239
- defaultFocusedDate = input(...(ngDevMode ? [undefined, { debugName: "defaultFocusedDate" }] : []));
240
273
  /** Access the calendar directive */
241
- _calendar = viewChild.required(BrnCalendarMulti);
274
+ _calendar = inject(BrnCalendarMulti);
242
275
  /** Get the heading for the current month and year */
243
- _heading = computed(() => this._i18n
244
- .config()
245
- .formatHeader(this._dateAdapter.getMonth(this._calendar().focusedDate()), this._dateAdapter.getYear(this._calendar().focusedDate())), ...(ngDevMode ? [{ debugName: "_heading" }] : []));
246
- _btnClass = hlm(buttonVariants({ variant: 'ghost' }), 'size-8 p-0 font-normal aria-selected:opacity-100', 'data-[outside]:text-muted-foreground data-[outside]:aria-selected:bg-accent/50 data-[outside]:aria-selected:text-muted-foreground data-[outside]:opacity-50 data-[outside]:aria-selected:opacity-30', 'data-[today]:bg-accent data-[today]:text-accent-foreground', 'data-[selected]:bg-primary data-[selected]:text-primary-foreground data-[selected]:hover:bg-primary data-[selected]:hover:text-primary-foreground data-[selected]:focus:bg-primary data-[selected]:focus:text-primary-foreground', 'data-[disabled]:text-muted-foreground data-[disabled]:opacity-50');
247
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: HlmCalendarMulti, deps: [], target: i0.ɵɵFactoryTarget.Component });
248
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: HlmCalendarMulti, isStandalone: true, selector: "hlm-calendar-multi", inputs: { calendarClass: { classPropertyName: "calendarClass", publicName: "calendarClass", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, minSelection: { classPropertyName: "minSelection", publicName: "minSelection", isSignal: true, isRequired: false, transformFunction: null }, maxSelection: { classPropertyName: "maxSelection", publicName: "maxSelection", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, date: { classPropertyName: "date", publicName: "date", isSignal: true, isRequired: false, transformFunction: null }, dateDisabled: { classPropertyName: "dateDisabled", publicName: "dateDisabled", isSignal: true, isRequired: false, transformFunction: null }, weekStartsOn: { classPropertyName: "weekStartsOn", publicName: "weekStartsOn", isSignal: true, isRequired: false, transformFunction: null }, defaultFocusedDate: { classPropertyName: "defaultFocusedDate", publicName: "defaultFocusedDate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { date: "dateChange" }, viewQueries: [{ propertyName: "_calendar", first: true, predicate: BrnCalendarMulti, descendants: true, isSignal: true }], ngImport: i0, template: `
249
- <div
250
- brnCalendarMulti
251
- [min]="min()"
252
- [max]="max()"
253
- [minSelection]="minSelection()"
254
- [maxSelection]="maxSelection()"
255
- [disabled]="disabled()"
256
- [(date)]="date"
257
- [dateDisabled]="dateDisabled()"
258
- [weekStartsOn]="weekStartsOn()"
259
- [defaultFocusedDate]="defaultFocusedDate()"
260
- [class]="_computedCalenderClass()"
261
- >
262
- <div class="inline-flex flex-col space-y-4">
263
- <!-- Header -->
264
- <div class="space-y-4">
265
- <div class="relative flex items-center justify-center pt-1">
266
- <div brnCalendarHeader class="text-sm font-medium">
267
- {{ _heading() }}
268
- </div>
269
-
270
- <div class="flex items-center space-x-1">
271
- <button
272
- brnCalendarPreviousButton
273
- class="ring-offset-background focus-visible:ring-ring border-input hover:bg-accent hover:text-accent-foreground absolute left-1 inline-flex h-7 w-7 items-center justify-center whitespace-nowrap rounded-md border bg-transparent p-0 text-sm font-medium opacity-50 transition-colors hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50"
274
- >
275
- <ng-icon hlm name="lucideChevronLeft" size="sm" />
276
- </button>
276
+ _heading = computed(() => {
277
+ const config = this._i18n.config();
278
+ const date = this._calendar.focusedDate();
279
+ return {
280
+ header: config.formatHeader(this._dateAdapter.getMonth(date), this._dateAdapter.getYear(date)),
281
+ month: config.formatMonth(this._dateAdapter.getMonth(date)),
282
+ year: config.formatYear(this._dateAdapter.getYear(date)),
283
+ };
284
+ }, /* @ts-ignore */
285
+ ...(ngDevMode ? [{ debugName: "_heading" }] : /* istanbul ignore next */ []));
286
+ _btnClass = hlm(buttonVariants({ variant: 'ghost', size: 'icon' }), 'data-[today=true]:bg-muted group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-ring/50 data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground data-[range-middle=true]:bg-muted data-[range-middle=true]:text-foreground data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground dark:hover:bg-muted/50 dark:hover:text-foreground relative isolate z-10 flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 border-0 leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-[3px] data-[range-end=true]:rounded-(--cell-radius) data-[range-end=true]:rounded-e-(--cell-radius) data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-(--cell-radius) data-[range-start=true]:rounded-s-(--cell-radius) [&>span]:text-xs [&>span]:opacity-70', 'data-[outside=true]:opacity-50', "data-[highlighted]:before:content-['']", 'data-[highlighted]:before:absolute', 'data-[highlighted]:before:bottom-1', 'data-[highlighted]:before:start-1/2', 'data-[highlighted]:before:h-1', 'data-[highlighted]:before:w-1', 'data-[highlighted]:before:-translate-x-1/2', 'data-[highlighted]:before:rounded-full', 'data-[highlighted]:before:bg-destructive');
287
+ _selectClass = 'gap-0 px-1.5 py-2 [&>ng-icon]:ms-1';
288
+ constructor() {
289
+ classes(() => 'p-3 [--cell-radius:var(--radius-md)] [--cell-size:--spacing(8)] group/calendar bg-background block in-data-[slot=card-content]:bg-transparent in-data-[slot=popover-content]:bg-transparent');
290
+ }
291
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmCalendarMulti, deps: [], target: i0.ɵɵFactoryTarget.Component });
292
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: HlmCalendarMulti, isStandalone: true, selector: "hlm-calendar-multi", inputs: { captionLayout: { classPropertyName: "captionLayout", publicName: "captionLayout", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "calendar" } }, hostDirectives: [{ directive: i1.BrnCalendarMulti, inputs: ["min", "min", "max", "max", "minSelection", "minSelection", "maxSelection", "maxSelection", "disabled", "disabled", "date", "date", "dateDisabled", "dateDisabled", "weekStartsOn", "weekStartsOn", "highlightDays", "highlightDays", "defaultFocusedDate", "defaultFocusedDate"], outputs: ["dateChange", "dateChange"] }], ngImport: i0, template: `
293
+ <div class="inline-flex flex-col space-y-4">
294
+ <!-- Header -->
295
+ <div class="flex w-full items-center justify-between gap-1.5">
296
+ <ng-template #month>
297
+ <hlm-select brnCalendarMonthSelect class="order-1">
298
+ <hlm-select-trigger size="sm" [class]="_selectClass">
299
+ <hlm-select-value />
300
+ </hlm-select-trigger>
301
+ <hlm-select-content *hlmSelectPortal class="max-h-80">
302
+ <hlm-select-group>
303
+ @for (month of _i18n.config().months(); track month) {
304
+ <hlm-select-item [value]="month">{{ month }}</hlm-select-item>
305
+ }
306
+ </hlm-select-group>
307
+ </hlm-select-content>
308
+ </hlm-select>
309
+ </ng-template>
310
+ <ng-template #year>
311
+ <hlm-select brnCalendarYearSelect class="order-3">
312
+ <hlm-select-trigger size="sm" [class]="_selectClass">
313
+ <hlm-select-value />
314
+ </hlm-select-trigger>
315
+ <hlm-select-content *hlmSelectPortal class="max-h-80">
316
+ <hlm-select-group>
317
+ @for (year of _i18n.config().years(); track year) {
318
+ <hlm-select-item [value]="year">{{ year }}</hlm-select-item>
319
+ }
320
+ </hlm-select-group>
321
+ </hlm-select-content>
322
+ </hlm-select>
323
+ </ng-template>
324
+ @let heading = _heading();
277
325
 
278
- <button
279
- brnCalendarNextButton
280
- class="ring-offset-background focus-visible:ring-ring border-input hover:bg-accent hover:text-accent-foreground absolute right-1 inline-flex h-7 w-7 items-center justify-center whitespace-nowrap rounded-md border bg-transparent p-0 text-sm font-medium opacity-50 transition-colors hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50"
281
- >
282
- <ng-icon hlm name="lucideChevronRight" size="sm" />
283
- </button>
284
- </div>
285
- </div>
286
- </div>
287
-
288
- <table class="w-full border-collapse space-y-1" brnCalendarGrid>
289
- <thead>
290
- <tr class="flex">
291
- <th
292
- *brnCalendarWeekday="let weekday"
293
- scope="col"
294
- class="text-muted-foreground w-8 rounded-md text-[0.8rem] font-normal"
295
- [attr.aria-label]="_i18n.config().labelWeekday(weekday)"
296
- >
297
- {{ _i18n.config().formatWeekdayName(weekday) }}
298
- </th>
299
- </tr>
300
- </thead>
301
-
302
- <tbody role="rowgroup">
303
- <tr *brnCalendarWeek="let week" class="mt-2 flex w-full">
304
- @for (date of week; track _dateAdapter.getTime(date)) {
305
- <td
306
- brnCalendarCell
307
- class="data-[selected]:data-[outside]:bg-accent/50 data-[selected]:bg-accent relative h-8 w-8 p-0 text-center text-sm focus-within:relative focus-within:z-20 first:data-[selected]:rounded-l-md last:data-[selected]:rounded-r-md [&:has([aria-selected].day-range-end)]:rounded-r-md"
308
- >
309
- <button brnCalendarCellButton [date]="date" [class]="_btnClass">
310
- {{ _dateAdapter.getDate(date) }}
311
- </button>
312
- </td>
313
- }
314
- </tr>
315
- </tbody>
316
- </table>
326
+ <button
327
+ brnCalendarPreviousButton
328
+ variant="ghost"
329
+ hlmBtn
330
+ class="order-first size-(--cell-size) p-0 select-none aria-disabled:opacity-50"
331
+ >
332
+ <ng-icon name="lucideChevronLeft" class="rtl:rotate-180" />
333
+ </button>
334
+
335
+ @switch (captionLayout()) {
336
+ @case ('dropdown') {
337
+ <ng-container [ngTemplateOutlet]="month" />
338
+ <ng-container [ngTemplateOutlet]="year" />
339
+ }
340
+ @case ('dropdown-months') {
341
+ <ng-container [ngTemplateOutlet]="month" />
342
+ <div brnCalendarHeader class="order-4 text-sm font-medium">{{ heading.year }}</div>
343
+ }
344
+ @case ('dropdown-years') {
345
+ <div brnCalendarHeader class="order-2 text-sm font-medium">{{ heading.month }}</div>
346
+ <ng-container [ngTemplateOutlet]="year" />
347
+ }
348
+ @case ('label') {
349
+ <div brnCalendarHeader class="order-5 text-sm font-medium">{{ heading.header }}</div>
350
+ }
351
+ }
352
+
353
+ <button
354
+ brnCalendarNextButton
355
+ hlmBtn
356
+ variant="ghost"
357
+ class="order-last size-(--cell-size) p-0 select-none aria-disabled:opacity-50"
358
+ >
359
+ <ng-icon name="lucideChevronRight" class="rtl:rotate-180" />
360
+ </button>
317
361
  </div>
362
+
363
+ <table class="w-full border-collapse" brnCalendarGrid>
364
+ <thead aria-hidden="true">
365
+ <tr class="flex">
366
+ <th
367
+ *brnCalendarWeekday="let weekday"
368
+ scope="col"
369
+ class="text-muted-foreground flex-1 rounded-(--cell-radius) text-[0.8rem] font-normal select-none"
370
+ [attr.aria-label]="_i18n.config().labelWeekday(weekday)"
371
+ >
372
+ {{ _i18n.config().formatWeekdayName(weekday) }}
373
+ </th>
374
+ </tr>
375
+ </thead>
376
+
377
+ <tbody role="rowgroup">
378
+ <tr *brnCalendarWeek="let week" class="mt-2 flex w-full">
379
+ @for (date of week; track _dateAdapter.getTime(date)) {
380
+ <td
381
+ brnCalendarCell
382
+ class="group/day relative aspect-square h-full w-full rounded-(--cell-radius) p-0 text-center select-none [&:first-child[data-selected=true]_button]:rounded-s-(--cell-radius) [&:last-child[data-selected=true]_button]:rounded-e-(--cell-radius)"
383
+ >
384
+ <button brnCalendarCellButton [date]="date" [class]="_btnClass">
385
+ {{ _dateAdapter.getDate(date) }}
386
+ </button>
387
+ </td>
388
+ }
389
+ </tr>
390
+ </tbody>
391
+ </table>
318
392
  </div>
319
- `, isInline: true, dependencies: [{ kind: "directive", type: BrnCalendarMulti, selector: "[brnCalendarMulti]", inputs: ["min", "max", "minSelection", "maxSelection", "disabled", "date", "dateDisabled", "weekStartsOn", "defaultFocusedDate"], outputs: ["dateChange"] }, { kind: "directive", type: BrnCalendarHeader, selector: "[brnCalendarHeader]", inputs: ["id"] }, { kind: "directive", type: BrnCalendarNextButton, selector: "[brnCalendarNextButton]" }, { kind: "directive", type: BrnCalendarPreviousButton, selector: "[brnCalendarPreviousButton]" }, { kind: "directive", type: BrnCalendarWeekday, selector: "[brnCalendarWeekday]" }, { kind: "directive", type: BrnCalendarWeek, selector: "[brnCalendarWeek]" }, { kind: "directive", type: BrnCalendarCellButton, selector: "button[brnCalendarCellButton]", inputs: ["date"] }, { kind: "directive", type: BrnCalendarCell, selector: "[brnCalendarCell]" }, { kind: "directive", type: BrnCalendarGrid, selector: "[brnCalendarGrid]" }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: HlmIcon, selector: "ng-icon[hlm]", inputs: ["size"] }], viewProviders: [provideIcons({ lucideChevronLeft, lucideChevronRight })], changeDetection: i0.ChangeDetectionStrategy.OnPush });
393
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.BrnCalendarCellButton, selector: "button[brnCalendarCellButton]", inputs: ["date"] }, { kind: "directive", type: i1.BrnCalendarGrid, selector: "[brnCalendarGrid]" }, { kind: "directive", type: i1.BrnCalendarHeader, selector: "[brnCalendarHeader]", inputs: ["id"] }, { kind: "directive", type: i1.BrnCalendarNextButton, selector: "[brnCalendarNextButton]" }, { kind: "directive", type: i1.BrnCalendarPreviousButton, selector: "[brnCalendarPreviousButton]" }, { kind: "directive", type: i1.BrnCalendarWeek, selector: "[brnCalendarWeek]" }, { kind: "directive", type: i1.BrnCalendarWeekday, selector: "[brnCalendarWeekday]" }, { kind: "directive", type: i1.BrnCalendarCell, selector: "[brnCalendarCell]" }, { kind: "directive", type: i1.BrnCalendarMonthSelect, selector: "brnSelect[brnCalendarMonthSelect],hlm-select[brnCalendarMonthSelect]" }, { kind: "directive", type: i1.BrnCalendarYearSelect, selector: "brnSelect[brnCalendarYearSelect],hlm-select[brnCalendarYearSelect]" }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.HlmSelect, selector: "[hlmSelect],hlm-select" }, { kind: "component", type: i2.HlmSelectContent, selector: "hlm-select-content", inputs: ["showScroll"] }, { kind: "directive", type: i2.HlmSelectGroup, selector: "[hlmSelectGroup],hlm-select-group" }, { kind: "component", type: i2.HlmSelectItem, selector: "hlm-select-item" }, { kind: "directive", type: i2.HlmSelectPortal, selector: "[hlmSelectPortal]" }, { kind: "component", type: i2.HlmSelectTrigger, selector: "hlm-select-trigger", inputs: ["class", "buttonId", "size", "forceInvalid"] }, { kind: "directive", type: i2.HlmSelectValue, selector: "[hlmSelectValue],hlm-select-value" }, { kind: "directive", type: i3.HlmBtn, selector: "button[hlmBtn], a[hlmBtn]", inputs: ["variant", "size", "class", "type"], exportAs: ["hlmBtn"] }], viewProviders: [provideIcons({ lucideChevronLeft, lucideChevronRight })], changeDetection: i0.ChangeDetectionStrategy.OnPush });
320
394
  }
321
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: HlmCalendarMulti, decorators: [{
395
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmCalendarMulti, decorators: [{
322
396
  type: Component,
323
397
  args: [{
324
398
  selector: 'hlm-calendar-multi',
325
- imports: [
326
- BrnCalendarMulti,
327
- BrnCalendarHeader,
328
- BrnCalendarNextButton,
329
- BrnCalendarPreviousButton,
330
- BrnCalendarWeekday,
331
- BrnCalendarWeek,
332
- BrnCalendarCellButton,
333
- BrnCalendarCell,
334
- BrnCalendarGrid,
335
- NgIcon,
336
- HlmIcon,
337
- ],
399
+ imports: [BrnCalendarImports, NgIcon, NgTemplateOutlet, HlmSelectImports, HlmButtonImports],
338
400
  viewProviders: [provideIcons({ lucideChevronLeft, lucideChevronRight })],
401
+ changeDetection: ChangeDetectionStrategy.OnPush,
402
+ hostDirectives: [
403
+ {
404
+ directive: BrnCalendarMulti,
405
+ inputs: [
406
+ 'min',
407
+ 'max',
408
+ 'minSelection',
409
+ 'maxSelection',
410
+ 'disabled',
411
+ 'date',
412
+ 'dateDisabled',
413
+ 'weekStartsOn',
414
+ 'highlightDays',
415
+ 'defaultFocusedDate',
416
+ ],
417
+ outputs: ['dateChange'],
418
+ },
419
+ ],
420
+ host: { 'data-slot': 'calendar' },
339
421
  template: `
340
- <div
341
- brnCalendarMulti
342
- [min]="min()"
343
- [max]="max()"
344
- [minSelection]="minSelection()"
345
- [maxSelection]="maxSelection()"
346
- [disabled]="disabled()"
347
- [(date)]="date"
348
- [dateDisabled]="dateDisabled()"
349
- [weekStartsOn]="weekStartsOn()"
350
- [defaultFocusedDate]="defaultFocusedDate()"
351
- [class]="_computedCalenderClass()"
352
- >
353
- <div class="inline-flex flex-col space-y-4">
354
- <!-- Header -->
355
- <div class="space-y-4">
356
- <div class="relative flex items-center justify-center pt-1">
357
- <div brnCalendarHeader class="text-sm font-medium">
358
- {{ _heading() }}
359
- </div>
360
-
361
- <div class="flex items-center space-x-1">
362
- <button
363
- brnCalendarPreviousButton
364
- class="ring-offset-background focus-visible:ring-ring border-input hover:bg-accent hover:text-accent-foreground absolute left-1 inline-flex h-7 w-7 items-center justify-center whitespace-nowrap rounded-md border bg-transparent p-0 text-sm font-medium opacity-50 transition-colors hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50"
365
- >
366
- <ng-icon hlm name="lucideChevronLeft" size="sm" />
367
- </button>
422
+ <div class="inline-flex flex-col space-y-4">
423
+ <!-- Header -->
424
+ <div class="flex w-full items-center justify-between gap-1.5">
425
+ <ng-template #month>
426
+ <hlm-select brnCalendarMonthSelect class="order-1">
427
+ <hlm-select-trigger size="sm" [class]="_selectClass">
428
+ <hlm-select-value />
429
+ </hlm-select-trigger>
430
+ <hlm-select-content *hlmSelectPortal class="max-h-80">
431
+ <hlm-select-group>
432
+ @for (month of _i18n.config().months(); track month) {
433
+ <hlm-select-item [value]="month">{{ month }}</hlm-select-item>
434
+ }
435
+ </hlm-select-group>
436
+ </hlm-select-content>
437
+ </hlm-select>
438
+ </ng-template>
439
+ <ng-template #year>
440
+ <hlm-select brnCalendarYearSelect class="order-3">
441
+ <hlm-select-trigger size="sm" [class]="_selectClass">
442
+ <hlm-select-value />
443
+ </hlm-select-trigger>
444
+ <hlm-select-content *hlmSelectPortal class="max-h-80">
445
+ <hlm-select-group>
446
+ @for (year of _i18n.config().years(); track year) {
447
+ <hlm-select-item [value]="year">{{ year }}</hlm-select-item>
448
+ }
449
+ </hlm-select-group>
450
+ </hlm-select-content>
451
+ </hlm-select>
452
+ </ng-template>
453
+ @let heading = _heading();
368
454
 
369
- <button
370
- brnCalendarNextButton
371
- class="ring-offset-background focus-visible:ring-ring border-input hover:bg-accent hover:text-accent-foreground absolute right-1 inline-flex h-7 w-7 items-center justify-center whitespace-nowrap rounded-md border bg-transparent p-0 text-sm font-medium opacity-50 transition-colors hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50"
372
- >
373
- <ng-icon hlm name="lucideChevronRight" size="sm" />
374
- </button>
375
- </div>
376
- </div>
377
- </div>
378
-
379
- <table class="w-full border-collapse space-y-1" brnCalendarGrid>
380
- <thead>
381
- <tr class="flex">
382
- <th
383
- *brnCalendarWeekday="let weekday"
384
- scope="col"
385
- class="text-muted-foreground w-8 rounded-md text-[0.8rem] font-normal"
386
- [attr.aria-label]="_i18n.config().labelWeekday(weekday)"
387
- >
388
- {{ _i18n.config().formatWeekdayName(weekday) }}
389
- </th>
390
- </tr>
391
- </thead>
392
-
393
- <tbody role="rowgroup">
394
- <tr *brnCalendarWeek="let week" class="mt-2 flex w-full">
395
- @for (date of week; track _dateAdapter.getTime(date)) {
396
- <td
397
- brnCalendarCell
398
- class="data-[selected]:data-[outside]:bg-accent/50 data-[selected]:bg-accent relative h-8 w-8 p-0 text-center text-sm focus-within:relative focus-within:z-20 first:data-[selected]:rounded-l-md last:data-[selected]:rounded-r-md [&:has([aria-selected].day-range-end)]:rounded-r-md"
399
- >
400
- <button brnCalendarCellButton [date]="date" [class]="_btnClass">
401
- {{ _dateAdapter.getDate(date) }}
402
- </button>
403
- </td>
404
- }
405
- </tr>
406
- </tbody>
407
- </table>
455
+ <button
456
+ brnCalendarPreviousButton
457
+ variant="ghost"
458
+ hlmBtn
459
+ class="order-first size-(--cell-size) p-0 select-none aria-disabled:opacity-50"
460
+ >
461
+ <ng-icon name="lucideChevronLeft" class="rtl:rotate-180" />
462
+ </button>
463
+
464
+ @switch (captionLayout()) {
465
+ @case ('dropdown') {
466
+ <ng-container [ngTemplateOutlet]="month" />
467
+ <ng-container [ngTemplateOutlet]="year" />
468
+ }
469
+ @case ('dropdown-months') {
470
+ <ng-container [ngTemplateOutlet]="month" />
471
+ <div brnCalendarHeader class="order-4 text-sm font-medium">{{ heading.year }}</div>
472
+ }
473
+ @case ('dropdown-years') {
474
+ <div brnCalendarHeader class="order-2 text-sm font-medium">{{ heading.month }}</div>
475
+ <ng-container [ngTemplateOutlet]="year" />
476
+ }
477
+ @case ('label') {
478
+ <div brnCalendarHeader class="order-5 text-sm font-medium">{{ heading.header }}</div>
479
+ }
480
+ }
481
+
482
+ <button
483
+ brnCalendarNextButton
484
+ hlmBtn
485
+ variant="ghost"
486
+ class="order-last size-(--cell-size) p-0 select-none aria-disabled:opacity-50"
487
+ >
488
+ <ng-icon name="lucideChevronRight" class="rtl:rotate-180" />
489
+ </button>
408
490
  </div>
491
+
492
+ <table class="w-full border-collapse" brnCalendarGrid>
493
+ <thead aria-hidden="true">
494
+ <tr class="flex">
495
+ <th
496
+ *brnCalendarWeekday="let weekday"
497
+ scope="col"
498
+ class="text-muted-foreground flex-1 rounded-(--cell-radius) text-[0.8rem] font-normal select-none"
499
+ [attr.aria-label]="_i18n.config().labelWeekday(weekday)"
500
+ >
501
+ {{ _i18n.config().formatWeekdayName(weekday) }}
502
+ </th>
503
+ </tr>
504
+ </thead>
505
+
506
+ <tbody role="rowgroup">
507
+ <tr *brnCalendarWeek="let week" class="mt-2 flex w-full">
508
+ @for (date of week; track _dateAdapter.getTime(date)) {
509
+ <td
510
+ brnCalendarCell
511
+ class="group/day relative aspect-square h-full w-full rounded-(--cell-radius) p-0 text-center select-none [&:first-child[data-selected=true]_button]:rounded-s-(--cell-radius) [&:last-child[data-selected=true]_button]:rounded-e-(--cell-radius)"
512
+ >
513
+ <button brnCalendarCellButton [date]="date" [class]="_btnClass">
514
+ {{ _dateAdapter.getDate(date) }}
515
+ </button>
516
+ </td>
517
+ }
518
+ </tr>
519
+ </tbody>
520
+ </table>
409
521
  </div>
410
522
  `,
411
- changeDetection: ChangeDetectionStrategy.OnPush,
412
523
  }]
413
- }], propDecorators: { calendarClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "calendarClass", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], minSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "minSelection", required: false }] }], maxSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxSelection", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], date: [{ type: i0.Input, args: [{ isSignal: true, alias: "date", required: false }] }, { type: i0.Output, args: ["dateChange"] }], dateDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateDisabled", required: false }] }], weekStartsOn: [{ type: i0.Input, args: [{ isSignal: true, alias: "weekStartsOn", required: false }] }], defaultFocusedDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultFocusedDate", required: false }] }], _calendar: [{ type: i0.ViewChild, args: [i0.forwardRef(() => BrnCalendarMulti), { isSignal: true }] }] } });
524
+ }], ctorParameters: () => [], propDecorators: { captionLayout: [{ type: i0.Input, args: [{ isSignal: true, alias: "captionLayout", required: false }] }] } });
414
525
 
415
526
  class HlmCalendarRange {
416
- calendarClass = input('', ...(ngDevMode ? [{ debugName: "calendarClass" }] : []));
417
- _computedCalenderClass = computed(() => hlm('rounded-md border p-3', this.calendarClass()), ...(ngDevMode ? [{ debugName: "_computedCalenderClass" }] : []));
527
+ /** Show dropdowns to navigate between months or years. */
528
+ captionLayout = input('label', /* @ts-ignore */
529
+ ...(ngDevMode ? [{ debugName: "captionLayout" }] : /* istanbul ignore next */ []));
418
530
  /** Access the calendar i18n */
419
531
  _i18n = injectBrnCalendarI18n();
420
532
  /** Access the date time adapter */
421
533
  _dateAdapter = injectDateAdapter();
422
- /** The minimum date that can be selected.*/
423
- min = input(...(ngDevMode ? [undefined, { debugName: "min" }] : []));
424
- /** The maximum date that can be selected. */
425
- max = input(...(ngDevMode ? [undefined, { debugName: "max" }] : []));
426
- /** Determine if the date picker is disabled. */
427
- disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", transform: booleanAttribute }] : [{
428
- transform: booleanAttribute,
429
- }]));
430
- /** The start date of the range. */
431
- startDate = model(...(ngDevMode ? [undefined, { debugName: "startDate" }] : []));
432
- /** The end date of the range. */
433
- endDate = model(...(ngDevMode ? [undefined, { debugName: "endDate" }] : []));
434
- /** Whether a specific date is disabled. */
435
- dateDisabled = input(() => false, ...(ngDevMode ? [{ debugName: "dateDisabled" }] : []));
436
- /** The day the week starts on */
437
- weekStartsOn = input(undefined, ...(ngDevMode ? [{ debugName: "weekStartsOn", transform: (v) => numberAttribute(v) }] : [{
438
- transform: (v) => numberAttribute(v),
439
- }]));
440
- /** The default focused date. */
441
- defaultFocusedDate = input(...(ngDevMode ? [undefined, { debugName: "defaultFocusedDate" }] : []));
442
534
  /** Access the calendar directive */
443
- _calendar = viewChild.required(BrnCalendarRange);
535
+ _calendar = inject(BrnCalendarRange);
444
536
  /** Get the heading for the current month and year */
445
- _heading = computed(() => this._i18n
446
- .config()
447
- .formatHeader(this._dateAdapter.getMonth(this._calendar().focusedDate()), this._dateAdapter.getYear(this._calendar().focusedDate())), ...(ngDevMode ? [{ debugName: "_heading" }] : []));
448
- _btnClass = hlm(buttonVariants({ variant: 'ghost' }), 'size-8 p-0 font-normal aria-selected:opacity-100', 'data-[outside]:text-muted-foreground data-[outside]:aria-selected:text-muted-foreground', 'data-[today]:bg-accent data-[today]:text-accent-foreground', 'data-[selected]:bg-primary data-[selected]:text-primary-foreground data-[selected]:focus:bg-primary data-[selected]:focus:text-primary-foreground', 'data-[disabled]:text-muted-foreground data-[disabled]:opacity-50', 'data-[range-start]:rounded-l-md', 'data-[range-end]:rounded-r-md', 'data-[range-between]:bg-accent data-[range-between]:text-accent-foreground data-[range-between]:rounded-none');
449
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: HlmCalendarRange, deps: [], target: i0.ɵɵFactoryTarget.Component });
450
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: HlmCalendarRange, isStandalone: true, selector: "hlm-calendar-range", inputs: { calendarClass: { classPropertyName: "calendarClass", publicName: "calendarClass", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, startDate: { classPropertyName: "startDate", publicName: "startDate", isSignal: true, isRequired: false, transformFunction: null }, endDate: { classPropertyName: "endDate", publicName: "endDate", isSignal: true, isRequired: false, transformFunction: null }, dateDisabled: { classPropertyName: "dateDisabled", publicName: "dateDisabled", isSignal: true, isRequired: false, transformFunction: null }, weekStartsOn: { classPropertyName: "weekStartsOn", publicName: "weekStartsOn", isSignal: true, isRequired: false, transformFunction: null }, defaultFocusedDate: { classPropertyName: "defaultFocusedDate", publicName: "defaultFocusedDate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { startDate: "startDateChange", endDate: "endDateChange" }, viewQueries: [{ propertyName: "_calendar", first: true, predicate: BrnCalendarRange, descendants: true, isSignal: true }], ngImport: i0, template: `
451
- <div
452
- brnCalendarRange
453
- [min]="min()"
454
- [max]="max()"
455
- [disabled]="disabled()"
456
- [(startDate)]="startDate"
457
- [(endDate)]="endDate"
458
- [dateDisabled]="dateDisabled()"
459
- [weekStartsOn]="weekStartsOn()"
460
- [defaultFocusedDate]="defaultFocusedDate()"
461
- [class]="_computedCalenderClass()"
462
- >
463
- <div class="inline-flex flex-col space-y-4">
464
- <!-- Header -->
465
- <div class="space-y-4">
466
- <div class="relative flex items-center justify-center pt-1">
467
- <div brnCalendarHeader class="text-sm font-medium">
468
- {{ _heading() }}
469
- </div>
470
-
471
- <div class="flex items-center space-x-1">
472
- <button
473
- brnCalendarPreviousButton
474
- class="ring-offset-background focus-visible:ring-ring border-input hover:bg-accent hover:text-accent-foreground absolute left-1 inline-flex h-7 w-7 items-center justify-center whitespace-nowrap rounded-md border bg-transparent p-0 text-sm font-medium opacity-50 transition-colors hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50"
475
- >
476
- <ng-icon hlm name="lucideChevronLeft" size="sm" />
477
- </button>
537
+ _heading = computed(() => {
538
+ const config = this._i18n.config();
539
+ const date = this._calendar.focusedDate();
540
+ return {
541
+ header: config.formatHeader(this._dateAdapter.getMonth(date), this._dateAdapter.getYear(date)),
542
+ month: config.formatMonth(this._dateAdapter.getMonth(date)),
543
+ year: config.formatYear(this._dateAdapter.getYear(date)),
544
+ };
545
+ }, /* @ts-ignore */
546
+ ...(ngDevMode ? [{ debugName: "_heading" }] : /* istanbul ignore next */ []));
547
+ _btnClass = hlm(buttonVariants({ variant: 'ghost', size: 'icon' }), 'data-[today=true]:bg-muted group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-ring/50 data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground data-[range-middle=true]:bg-muted data-[range-middle=true]:text-foreground data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground dark:hover:bg-muted/50 dark:hover:text-foreground relative isolate z-10 flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 border-0 leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-[3px] data-[range-end=true]:rounded-(--cell-radius) data-[range-end=true]:rounded-e-(--cell-radius) data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-(--cell-radius) data-[range-start=true]:rounded-s-(--cell-radius) [&>span]:text-xs [&>span]:opacity-70', 'data-[outside=true]:opacity-50', "data-[highlighted]:before:content-['']", 'data-[highlighted]:before:absolute', 'data-[highlighted]:before:bottom-1', 'data-[highlighted]:before:start-1/2', 'data-[highlighted]:before:h-1', 'data-[highlighted]:before:w-1', 'data-[highlighted]:before:-translate-x-1/2', 'data-[highlighted]:before:rounded-full', 'data-[highlighted]:before:bg-destructive');
548
+ _selectClass = 'gap-0 px-1.5 py-2 [&>ng-icon]:ms-1';
549
+ constructor() {
550
+ classes(() => 'p-3 [--cell-radius:var(--radius-md)] [--cell-size:--spacing(8)] group/calendar bg-background block in-data-[slot=card-content]:bg-transparent in-data-[slot=popover-content]:bg-transparent');
551
+ }
552
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmCalendarRange, deps: [], target: i0.ɵɵFactoryTarget.Component });
553
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: HlmCalendarRange, isStandalone: true, selector: "hlm-calendar-range", inputs: { captionLayout: { classPropertyName: "captionLayout", publicName: "captionLayout", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "calendar" } }, hostDirectives: [{ directive: i1.BrnCalendarRange, inputs: ["min", "min", "max", "max", "disabled", "disabled", "startDate", "startDate", "endDate", "endDate", "dateDisabled", "dateDisabled", "weekStartsOn", "weekStartsOn", "highlightDays", "highlightDays", "defaultFocusedDate", "defaultFocusedDate"], outputs: ["endDateChange", "endDateChange", "startDateChange", "startDateChange"] }], ngImport: i0, template: `
554
+ <div class="inline-flex flex-col space-y-4">
555
+ <!-- Header -->
556
+ <div class="flex w-full items-center justify-between gap-1.5">
557
+ <ng-template #month>
558
+ <hlm-select brnCalendarMonthSelect class="order-1">
559
+ <hlm-select-trigger size="sm" [class]="_selectClass">
560
+ <hlm-select-value />
561
+ </hlm-select-trigger>
562
+ <hlm-select-content *hlmSelectPortal class="max-h-80">
563
+ <hlm-select-group>
564
+ @for (month of _i18n.config().months(); track month) {
565
+ <hlm-select-item [value]="month">{{ month }}</hlm-select-item>
566
+ }
567
+ </hlm-select-group>
568
+ </hlm-select-content>
569
+ </hlm-select>
570
+ </ng-template>
571
+ <ng-template #year>
572
+ <hlm-select brnCalendarYearSelect class="order-3">
573
+ <hlm-select-trigger size="sm" [class]="_selectClass">
574
+ <hlm-select-value />
575
+ </hlm-select-trigger>
576
+ <hlm-select-content *hlmSelectPortal class="max-h-80">
577
+ <hlm-select-group>
578
+ @for (year of _i18n.config().years(); track year) {
579
+ <hlm-select-item [value]="year">{{ year }}</hlm-select-item>
580
+ }
581
+ </hlm-select-group>
582
+ </hlm-select-content>
583
+ </hlm-select>
584
+ </ng-template>
585
+ @let heading = _heading();
478
586
 
479
- <button
480
- brnCalendarNextButton
481
- class="ring-offset-background focus-visible:ring-ring border-input hover:bg-accent hover:text-accent-foreground absolute right-1 inline-flex h-7 w-7 items-center justify-center whitespace-nowrap rounded-md border bg-transparent p-0 text-sm font-medium opacity-50 transition-colors hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50"
482
- >
483
- <ng-icon hlm name="lucideChevronRight" size="sm" />
484
- </button>
485
- </div>
486
- </div>
487
- </div>
488
-
489
- <table class="w-full border-collapse space-y-1" brnCalendarGrid>
490
- <thead>
491
- <tr class="flex">
492
- <th
493
- *brnCalendarWeekday="let weekday"
494
- scope="col"
495
- class="text-muted-foreground w-8 rounded-md text-[0.8rem] font-normal"
496
- [attr.aria-label]="_i18n.config().labelWeekday(weekday)"
497
- >
498
- {{ _i18n.config().formatWeekdayName(weekday) }}
499
- </th>
500
- </tr>
501
- </thead>
502
-
503
- <tbody role="rowgroup">
504
- <tr *brnCalendarWeek="let week" class="mt-2 flex w-full">
505
- @for (date of week; track _dateAdapter.getTime(date)) {
506
- <td
507
- brnCalendarCell
508
- class="data-[selected]:data-[outside]:bg-accent/50 data-[selected]:bg-accent relative h-8 w-8 p-0 text-center text-sm focus-within:relative focus-within:z-20 first:data-[selected]:rounded-l-md last:data-[selected]:rounded-r-md [&:has([aria-selected].day-range-end)]:rounded-r-md"
509
- >
510
- <button brnCalendarCellButton [date]="date" [class]="_btnClass">
511
- {{ _dateAdapter.getDate(date) }}
512
- </button>
513
- </td>
514
- }
515
- </tr>
516
- </tbody>
517
- </table>
587
+ <button
588
+ brnCalendarPreviousButton
589
+ variant="ghost"
590
+ hlmBtn
591
+ class="order-first size-(--cell-size) p-0 select-none aria-disabled:opacity-50"
592
+ >
593
+ <ng-icon name="lucideChevronLeft" class="rtl:rotate-180" />
594
+ </button>
595
+
596
+ @switch (captionLayout()) {
597
+ @case ('dropdown') {
598
+ <ng-container [ngTemplateOutlet]="month" />
599
+ <ng-container [ngTemplateOutlet]="year" />
600
+ }
601
+ @case ('dropdown-months') {
602
+ <ng-container [ngTemplateOutlet]="month" />
603
+ <div brnCalendarHeader class="order-4 text-sm font-medium">{{ heading.year }}</div>
604
+ }
605
+ @case ('dropdown-years') {
606
+ <div brnCalendarHeader class="order-2 text-sm font-medium">{{ heading.month }}</div>
607
+ <ng-container [ngTemplateOutlet]="year" />
608
+ }
609
+ @case ('label') {
610
+ <div brnCalendarHeader class="order-5 text-sm font-medium">{{ heading.header }}</div>
611
+ }
612
+ }
613
+
614
+ <button
615
+ brnCalendarNextButton
616
+ hlmBtn
617
+ variant="ghost"
618
+ class="order-last size-(--cell-size) p-0 select-none aria-disabled:opacity-50"
619
+ >
620
+ <ng-icon name="lucideChevronRight" class="rtl:rotate-180" />
621
+ </button>
518
622
  </div>
623
+
624
+ <table class="w-full border-collapse space-y-1" brnCalendarGrid>
625
+ <thead aria-hidden="true">
626
+ <tr class="flex">
627
+ <th
628
+ *brnCalendarWeekday="let weekday"
629
+ scope="col"
630
+ class="text-muted-foreground flex-1 rounded-(--cell-radius) text-[0.8rem] font-normal select-none"
631
+ [attr.aria-label]="_i18n.config().labelWeekday(weekday)"
632
+ >
633
+ {{ _i18n.config().formatWeekdayName(weekday) }}
634
+ </th>
635
+ </tr>
636
+ </thead>
637
+
638
+ <tbody role="rowgroup">
639
+ <tr *brnCalendarWeek="let week" class="mt-2 flex w-full">
640
+ @for (date of week; track _dateAdapter.getTime(date)) {
641
+ <td
642
+ brnCalendarCell
643
+ class="group/day has-[button[data-range-start=true]]:bg-muted has-[button[data-range-start=true]]:after:bg-muted has-[button[data-range-end=true]]:bg-muted has-[button[data-range-end=true]]:after:bg-muted relative isolate z-0 aspect-square h-full w-full rounded-(--cell-radius) p-0 text-center select-none has-[button[data-range-end=true]]:rounded-e-(--cell-radius) has-[button[data-range-end=true]]:after:absolute has-[button[data-range-end=true]]:after:inset-y-0 has-[button[data-range-end=true]]:after:start-0 has-[button[data-range-end=true]]:after:w-4 has-[button[data-range-start=true]]:rounded-s-(--cell-radius) has-[button[data-range-start=true]]:after:absolute has-[button[data-range-start=true]]:after:inset-y-0 has-[button[data-range-start=true]]:after:end-0 has-[button[data-range-start=true]]:after:w-4 [&:first-child[data-selected=true]_button]:rounded-s-(--cell-radius) [&:last-child[data-selected=true]_button]:rounded-e-(--cell-radius)"
644
+ >
645
+ <button brnCalendarCellButton [date]="date" [class]="_btnClass">
646
+ {{ _dateAdapter.getDate(date) }}
647
+ </button>
648
+ </td>
649
+ }
650
+ </tr>
651
+ </tbody>
652
+ </table>
519
653
  </div>
520
- `, isInline: true, dependencies: [{ kind: "directive", type: BrnCalendarHeader, selector: "[brnCalendarHeader]", inputs: ["id"] }, { kind: "directive", type: BrnCalendarNextButton, selector: "[brnCalendarNextButton]" }, { kind: "directive", type: BrnCalendarPreviousButton, selector: "[brnCalendarPreviousButton]" }, { kind: "directive", type: BrnCalendarWeekday, selector: "[brnCalendarWeekday]" }, { kind: "directive", type: BrnCalendarWeek, selector: "[brnCalendarWeek]" }, { kind: "directive", type: BrnCalendarCellButton, selector: "button[brnCalendarCellButton]", inputs: ["date"] }, { kind: "directive", type: BrnCalendarCell, selector: "[brnCalendarCell]" }, { kind: "directive", type: BrnCalendarGrid, selector: "[brnCalendarGrid]" }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: HlmIcon, selector: "ng-icon[hlm]", inputs: ["size"] }, { kind: "directive", type: BrnCalendarRange, selector: "[brnCalendarRange]", inputs: ["min", "max", "disabled", "dateDisabled", "weekStartsOn", "defaultFocusedDate", "startDate", "endDate"], outputs: ["startDateChange", "endDateChange"] }], viewProviders: [provideIcons({ lucideChevronLeft, lucideChevronRight })], changeDetection: i0.ChangeDetectionStrategy.OnPush });
654
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.BrnCalendarCellButton, selector: "button[brnCalendarCellButton]", inputs: ["date"] }, { kind: "directive", type: i1.BrnCalendarGrid, selector: "[brnCalendarGrid]" }, { kind: "directive", type: i1.BrnCalendarHeader, selector: "[brnCalendarHeader]", inputs: ["id"] }, { kind: "directive", type: i1.BrnCalendarNextButton, selector: "[brnCalendarNextButton]" }, { kind: "directive", type: i1.BrnCalendarPreviousButton, selector: "[brnCalendarPreviousButton]" }, { kind: "directive", type: i1.BrnCalendarWeek, selector: "[brnCalendarWeek]" }, { kind: "directive", type: i1.BrnCalendarWeekday, selector: "[brnCalendarWeekday]" }, { kind: "directive", type: i1.BrnCalendarCell, selector: "[brnCalendarCell]" }, { kind: "directive", type: i1.BrnCalendarMonthSelect, selector: "brnSelect[brnCalendarMonthSelect],hlm-select[brnCalendarMonthSelect]" }, { kind: "directive", type: i1.BrnCalendarYearSelect, selector: "brnSelect[brnCalendarYearSelect],hlm-select[brnCalendarYearSelect]" }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: i2.HlmSelect, selector: "[hlmSelect],hlm-select" }, { kind: "component", type: i2.HlmSelectContent, selector: "hlm-select-content", inputs: ["showScroll"] }, { kind: "directive", type: i2.HlmSelectGroup, selector: "[hlmSelectGroup],hlm-select-group" }, { kind: "component", type: i2.HlmSelectItem, selector: "hlm-select-item" }, { kind: "directive", type: i2.HlmSelectPortal, selector: "[hlmSelectPortal]" }, { kind: "component", type: i2.HlmSelectTrigger, selector: "hlm-select-trigger", inputs: ["class", "buttonId", "size", "forceInvalid"] }, { kind: "directive", type: i2.HlmSelectValue, selector: "[hlmSelectValue],hlm-select-value" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.HlmBtn, selector: "button[hlmBtn], a[hlmBtn]", inputs: ["variant", "size", "class", "type"], exportAs: ["hlmBtn"] }], viewProviders: [provideIcons({ lucideChevronLeft, lucideChevronRight })], changeDetection: i0.ChangeDetectionStrategy.OnPush });
521
655
  }
522
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: HlmCalendarRange, decorators: [{
656
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmCalendarRange, decorators: [{
523
657
  type: Component,
524
658
  args: [{
525
659
  selector: 'hlm-calendar-range',
526
- imports: [
527
- BrnCalendarHeader,
528
- BrnCalendarNextButton,
529
- BrnCalendarPreviousButton,
530
- BrnCalendarWeekday,
531
- BrnCalendarWeek,
532
- BrnCalendarCellButton,
533
- BrnCalendarCell,
534
- BrnCalendarGrid,
535
- NgIcon,
536
- HlmIcon,
537
- BrnCalendarRange,
538
- ],
660
+ imports: [BrnCalendarImports, NgIcon, HlmSelectImports, NgTemplateOutlet, HlmButtonImports],
539
661
  viewProviders: [provideIcons({ lucideChevronLeft, lucideChevronRight })],
662
+ changeDetection: ChangeDetectionStrategy.OnPush,
663
+ hostDirectives: [
664
+ {
665
+ directive: BrnCalendarRange,
666
+ inputs: [
667
+ 'min',
668
+ 'max',
669
+ 'disabled',
670
+ 'startDate',
671
+ 'endDate',
672
+ 'dateDisabled',
673
+ 'weekStartsOn',
674
+ 'highlightDays',
675
+ 'defaultFocusedDate',
676
+ ],
677
+ outputs: ['endDateChange', 'startDateChange'],
678
+ },
679
+ ],
680
+ host: { 'data-slot': 'calendar' },
540
681
  template: `
541
- <div
542
- brnCalendarRange
543
- [min]="min()"
544
- [max]="max()"
545
- [disabled]="disabled()"
546
- [(startDate)]="startDate"
547
- [(endDate)]="endDate"
548
- [dateDisabled]="dateDisabled()"
549
- [weekStartsOn]="weekStartsOn()"
550
- [defaultFocusedDate]="defaultFocusedDate()"
551
- [class]="_computedCalenderClass()"
552
- >
553
- <div class="inline-flex flex-col space-y-4">
554
- <!-- Header -->
555
- <div class="space-y-4">
556
- <div class="relative flex items-center justify-center pt-1">
557
- <div brnCalendarHeader class="text-sm font-medium">
558
- {{ _heading() }}
559
- </div>
560
-
561
- <div class="flex items-center space-x-1">
562
- <button
563
- brnCalendarPreviousButton
564
- class="ring-offset-background focus-visible:ring-ring border-input hover:bg-accent hover:text-accent-foreground absolute left-1 inline-flex h-7 w-7 items-center justify-center whitespace-nowrap rounded-md border bg-transparent p-0 text-sm font-medium opacity-50 transition-colors hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50"
565
- >
566
- <ng-icon hlm name="lucideChevronLeft" size="sm" />
567
- </button>
682
+ <div class="inline-flex flex-col space-y-4">
683
+ <!-- Header -->
684
+ <div class="flex w-full items-center justify-between gap-1.5">
685
+ <ng-template #month>
686
+ <hlm-select brnCalendarMonthSelect class="order-1">
687
+ <hlm-select-trigger size="sm" [class]="_selectClass">
688
+ <hlm-select-value />
689
+ </hlm-select-trigger>
690
+ <hlm-select-content *hlmSelectPortal class="max-h-80">
691
+ <hlm-select-group>
692
+ @for (month of _i18n.config().months(); track month) {
693
+ <hlm-select-item [value]="month">{{ month }}</hlm-select-item>
694
+ }
695
+ </hlm-select-group>
696
+ </hlm-select-content>
697
+ </hlm-select>
698
+ </ng-template>
699
+ <ng-template #year>
700
+ <hlm-select brnCalendarYearSelect class="order-3">
701
+ <hlm-select-trigger size="sm" [class]="_selectClass">
702
+ <hlm-select-value />
703
+ </hlm-select-trigger>
704
+ <hlm-select-content *hlmSelectPortal class="max-h-80">
705
+ <hlm-select-group>
706
+ @for (year of _i18n.config().years(); track year) {
707
+ <hlm-select-item [value]="year">{{ year }}</hlm-select-item>
708
+ }
709
+ </hlm-select-group>
710
+ </hlm-select-content>
711
+ </hlm-select>
712
+ </ng-template>
713
+ @let heading = _heading();
714
+
715
+ <button
716
+ brnCalendarPreviousButton
717
+ variant="ghost"
718
+ hlmBtn
719
+ class="order-first size-(--cell-size) p-0 select-none aria-disabled:opacity-50"
720
+ >
721
+ <ng-icon name="lucideChevronLeft" class="rtl:rotate-180" />
722
+ </button>
723
+
724
+ @switch (captionLayout()) {
725
+ @case ('dropdown') {
726
+ <ng-container [ngTemplateOutlet]="month" />
727
+ <ng-container [ngTemplateOutlet]="year" />
728
+ }
729
+ @case ('dropdown-months') {
730
+ <ng-container [ngTemplateOutlet]="month" />
731
+ <div brnCalendarHeader class="order-4 text-sm font-medium">{{ heading.year }}</div>
732
+ }
733
+ @case ('dropdown-years') {
734
+ <div brnCalendarHeader class="order-2 text-sm font-medium">{{ heading.month }}</div>
735
+ <ng-container [ngTemplateOutlet]="year" />
736
+ }
737
+ @case ('label') {
738
+ <div brnCalendarHeader class="order-5 text-sm font-medium">{{ heading.header }}</div>
739
+ }
740
+ }
741
+
742
+ <button
743
+ brnCalendarNextButton
744
+ hlmBtn
745
+ variant="ghost"
746
+ class="order-last size-(--cell-size) p-0 select-none aria-disabled:opacity-50"
747
+ >
748
+ <ng-icon name="lucideChevronRight" class="rtl:rotate-180" />
749
+ </button>
750
+ </div>
568
751
 
569
- <button
570
- brnCalendarNextButton
571
- class="ring-offset-background focus-visible:ring-ring border-input hover:bg-accent hover:text-accent-foreground absolute right-1 inline-flex h-7 w-7 items-center justify-center whitespace-nowrap rounded-md border bg-transparent p-0 text-sm font-medium opacity-50 transition-colors hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50"
752
+ <table class="w-full border-collapse space-y-1" brnCalendarGrid>
753
+ <thead aria-hidden="true">
754
+ <tr class="flex">
755
+ <th
756
+ *brnCalendarWeekday="let weekday"
757
+ scope="col"
758
+ class="text-muted-foreground flex-1 rounded-(--cell-radius) text-[0.8rem] font-normal select-none"
759
+ [attr.aria-label]="_i18n.config().labelWeekday(weekday)"
760
+ >
761
+ {{ _i18n.config().formatWeekdayName(weekday) }}
762
+ </th>
763
+ </tr>
764
+ </thead>
765
+
766
+ <tbody role="rowgroup">
767
+ <tr *brnCalendarWeek="let week" class="mt-2 flex w-full">
768
+ @for (date of week; track _dateAdapter.getTime(date)) {
769
+ <td
770
+ brnCalendarCell
771
+ class="group/day has-[button[data-range-start=true]]:bg-muted has-[button[data-range-start=true]]:after:bg-muted has-[button[data-range-end=true]]:bg-muted has-[button[data-range-end=true]]:after:bg-muted relative isolate z-0 aspect-square h-full w-full rounded-(--cell-radius) p-0 text-center select-none has-[button[data-range-end=true]]:rounded-e-(--cell-radius) has-[button[data-range-end=true]]:after:absolute has-[button[data-range-end=true]]:after:inset-y-0 has-[button[data-range-end=true]]:after:start-0 has-[button[data-range-end=true]]:after:w-4 has-[button[data-range-start=true]]:rounded-s-(--cell-radius) has-[button[data-range-start=true]]:after:absolute has-[button[data-range-start=true]]:after:inset-y-0 has-[button[data-range-start=true]]:after:end-0 has-[button[data-range-start=true]]:after:w-4 [&:first-child[data-selected=true]_button]:rounded-s-(--cell-radius) [&:last-child[data-selected=true]_button]:rounded-e-(--cell-radius)"
572
772
  >
573
- <ng-icon hlm name="lucideChevronRight" size="sm" />
773
+ <button brnCalendarCellButton [date]="date" [class]="_btnClass">
774
+ {{ _dateAdapter.getDate(date) }}
775
+ </button>
776
+ </td>
777
+ }
778
+ </tr>
779
+ </tbody>
780
+ </table>
781
+ </div>
782
+ `,
783
+ }]
784
+ }], ctorParameters: () => [], propDecorators: { captionLayout: [{ type: i0.Input, args: [{ isSignal: true, alias: "captionLayout", required: false }] }] } });
785
+
786
+ class HlmMonthYearCalendar {
787
+ /** Access the calendar i18n */
788
+ _i18n = injectBrnCalendarI18n();
789
+ /** Access the date adapter */
790
+ _dateAdapter = injectDateAdapter();
791
+ /** Access the picker directive */
792
+ _picker = inject((BrnMonthYearCalendar));
793
+ /** The heading for the current view. */
794
+ _heading = computed(() => {
795
+ const config = this._i18n.config();
796
+ if (this._picker.view() === 'month') {
797
+ return config.formatYear(this._dateAdapter.getYear(this._picker.focusedDate()));
798
+ }
799
+ const { start, end } = this._picker.yearRange();
800
+ return `${config.formatYear(start)} – ${config.formatYear(end)}`;
801
+ }, /* @ts-ignore */
802
+ ...(ngDevMode ? [{ debugName: "_heading" }] : /* istanbul ignore next */ []));
803
+ _btnClass = hlm(buttonVariants({ variant: 'ghost' }), 'data-[today=true]:bg-muted', 'data-[selected=true]:bg-primary data-[selected=true]:text-primary-foreground data-[selected=true]:hover:bg-primary data-[selected=true]:hover:text-primary-foreground', 'data-[focused=true]:border-ring data-[focused=true]:ring-ring/50 data-[focused=true]:ring-[3px]', 'aria-disabled:pointer-events-none aria-disabled:opacity-50', 'h-(--cell-size)');
804
+ constructor() {
805
+ classes(() => 'p-3 [--cell-radius:var(--radius-md)] [--cell-size:--spacing(8)] group/calendar bg-background block in-data-[slot=card-content]:bg-transparent in-data-[slot=popover-content]:bg-transparent');
806
+ }
807
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmMonthYearCalendar, deps: [], target: i0.ɵɵFactoryTarget.Component });
808
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: HlmMonthYearCalendar, isStandalone: true, selector: "hlm-month-year-calendar", host: { attributes: { "data-slot": "month-year-calendar" } }, hostDirectives: [{ directive: i1.BrnMonthYearCalendar, inputs: ["min", "min", "max", "max", "disabled", "disabled", "date", "date", "defaultFocusedDate", "defaultFocusedDate", "view", "view"], outputs: ["dateChange", "dateChange"] }], ngImport: i0, template: `
809
+ <div class="flex flex-col gap-4">
810
+ <!-- Header -->
811
+ <div class="flex w-full items-center justify-between gap-1.5">
812
+ <button
813
+ brnMonthYearCalendarPreviousButton
814
+ hlmBtn
815
+ variant="ghost"
816
+ class="order-first size-(--cell-size) p-0 select-none aria-disabled:opacity-50"
817
+ >
818
+ <ng-icon name="lucideChevronLeft" class="rtl:rotate-180" />
819
+ </button>
820
+
821
+ <button
822
+ hlmBtn
823
+ variant="ghost"
824
+ class="h-(--cell-size) py-0 select-none aria-disabled:opacity-50"
825
+ brnMonthYearCalendarHeader
826
+ >
827
+ {{ _heading() }}
828
+ </button>
829
+
830
+ <button
831
+ brnMonthYearCalendarNextButton
832
+ hlmBtn
833
+ variant="ghost"
834
+ class="order-last size-(--cell-size) p-0 select-none aria-disabled:opacity-50"
835
+ >
836
+ <ng-icon name="lucideChevronRight" class="rtl:rotate-180" />
837
+ </button>
838
+ </div>
839
+
840
+ <!-- Grid -->
841
+ @switch (_picker.view()) {
842
+ @case ('year') {
843
+ <div brnMonthYearCalendarGrid class="grid grid-cols-4 gap-2">
844
+ @for (year of _picker.years(); track _dateAdapter.getYear(year)) {
845
+ <button brnMonthYearCalendarYearButton [date]="year" [class]="_btnClass">
846
+ {{ _i18n.config().formatYear(_dateAdapter.getYear(year)) }}
574
847
  </button>
575
- </div>
848
+ }
576
849
  </div>
577
- </div>
578
-
579
- <table class="w-full border-collapse space-y-1" brnCalendarGrid>
580
- <thead>
581
- <tr class="flex">
582
- <th
583
- *brnCalendarWeekday="let weekday"
584
- scope="col"
585
- class="text-muted-foreground w-8 rounded-md text-[0.8rem] font-normal"
586
- [attr.aria-label]="_i18n.config().labelWeekday(weekday)"
587
- >
588
- {{ _i18n.config().formatWeekdayName(weekday) }}
589
- </th>
590
- </tr>
591
- </thead>
592
-
593
- <tbody role="rowgroup">
594
- <tr *brnCalendarWeek="let week" class="mt-2 flex w-full">
595
- @for (date of week; track _dateAdapter.getTime(date)) {
596
- <td
597
- brnCalendarCell
598
- class="data-[selected]:data-[outside]:bg-accent/50 data-[selected]:bg-accent relative h-8 w-8 p-0 text-center text-sm focus-within:relative focus-within:z-20 first:data-[selected]:rounded-l-md last:data-[selected]:rounded-r-md [&:has([aria-selected].day-range-end)]:rounded-r-md"
599
- >
600
- <button brnCalendarCellButton [date]="date" [class]="_btnClass">
601
- {{ _dateAdapter.getDate(date) }}
602
- </button>
603
- </td>
604
- }
605
- </tr>
606
- </tbody>
607
- </table>
850
+ }
851
+ @case ('month') {
852
+ <div brnMonthYearCalendarGrid class="grid grid-cols-4 gap-2">
853
+ @for (month of _picker.months(); track _dateAdapter.getMonth(month)) {
854
+ <button brnMonthYearCalendarMonthButton [date]="month" [class]="_btnClass">
855
+ {{ _i18n.config().months()[_dateAdapter.getMonth(month)] }}
856
+ </button>
857
+ }
858
+ </div>
859
+ }
860
+ }
861
+ </div>
862
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.BrnMonthYearCalendarGrid, selector: "[brnMonthYearCalendarGrid]" }, { kind: "directive", type: i1.BrnMonthYearCalendarHeader, selector: "button[brnMonthYearCalendarHeader]", inputs: ["id"] }, { kind: "directive", type: i1.BrnMonthYearCalendarMonthButton, selector: "button[brnMonthYearCalendarMonthButton]", inputs: ["date"] }, { kind: "directive", type: i1.BrnMonthYearCalendarNextButton, selector: "button[brnMonthYearCalendarNextButton]" }, { kind: "directive", type: i1.BrnMonthYearCalendarPreviousButton, selector: "button[brnMonthYearCalendarPreviousButton]" }, { kind: "directive", type: i1.BrnMonthYearCalendarYearButton, selector: "button[brnMonthYearCalendarYearButton]", inputs: ["date"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: i3.HlmBtn, selector: "button[hlmBtn], a[hlmBtn]", inputs: ["variant", "size", "class", "type"], exportAs: ["hlmBtn"] }], viewProviders: [provideIcons({ lucideChevronLeft, lucideChevronRight })], changeDetection: i0.ChangeDetectionStrategy.OnPush });
863
+ }
864
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmMonthYearCalendar, decorators: [{
865
+ type: Component,
866
+ args: [{
867
+ selector: 'hlm-month-year-calendar',
868
+ imports: [BrnCalendarImports, NgIcon, HlmButtonImports],
869
+ viewProviders: [provideIcons({ lucideChevronLeft, lucideChevronRight })],
870
+ changeDetection: ChangeDetectionStrategy.OnPush,
871
+ hostDirectives: [
872
+ {
873
+ directive: BrnMonthYearCalendar,
874
+ inputs: ['min', 'max', 'disabled', 'date', 'defaultFocusedDate', 'view'],
875
+ outputs: ['dateChange'],
876
+ },
877
+ ],
878
+ host: { 'data-slot': 'month-year-calendar' },
879
+ template: `
880
+ <div class="flex flex-col gap-4">
881
+ <!-- Header -->
882
+ <div class="flex w-full items-center justify-between gap-1.5">
883
+ <button
884
+ brnMonthYearCalendarPreviousButton
885
+ hlmBtn
886
+ variant="ghost"
887
+ class="order-first size-(--cell-size) p-0 select-none aria-disabled:opacity-50"
888
+ >
889
+ <ng-icon name="lucideChevronLeft" class="rtl:rotate-180" />
890
+ </button>
891
+
892
+ <button
893
+ hlmBtn
894
+ variant="ghost"
895
+ class="h-(--cell-size) py-0 select-none aria-disabled:opacity-50"
896
+ brnMonthYearCalendarHeader
897
+ >
898
+ {{ _heading() }}
899
+ </button>
900
+
901
+ <button
902
+ brnMonthYearCalendarNextButton
903
+ hlmBtn
904
+ variant="ghost"
905
+ class="order-last size-(--cell-size) p-0 select-none aria-disabled:opacity-50"
906
+ >
907
+ <ng-icon name="lucideChevronRight" class="rtl:rotate-180" />
908
+ </button>
608
909
  </div>
910
+
911
+ <!-- Grid -->
912
+ @switch (_picker.view()) {
913
+ @case ('year') {
914
+ <div brnMonthYearCalendarGrid class="grid grid-cols-4 gap-2">
915
+ @for (year of _picker.years(); track _dateAdapter.getYear(year)) {
916
+ <button brnMonthYearCalendarYearButton [date]="year" [class]="_btnClass">
917
+ {{ _i18n.config().formatYear(_dateAdapter.getYear(year)) }}
918
+ </button>
919
+ }
920
+ </div>
921
+ }
922
+ @case ('month') {
923
+ <div brnMonthYearCalendarGrid class="grid grid-cols-4 gap-2">
924
+ @for (month of _picker.months(); track _dateAdapter.getMonth(month)) {
925
+ <button brnMonthYearCalendarMonthButton [date]="month" [class]="_btnClass">
926
+ {{ _i18n.config().months()[_dateAdapter.getMonth(month)] }}
927
+ </button>
928
+ }
929
+ </div>
930
+ }
931
+ }
609
932
  </div>
610
933
  `,
611
- changeDetection: ChangeDetectionStrategy.OnPush,
612
934
  }]
613
- }], propDecorators: { calendarClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "calendarClass", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], startDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "startDate", required: false }] }, { type: i0.Output, args: ["startDateChange"] }], endDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "endDate", required: false }] }, { type: i0.Output, args: ["endDateChange"] }], dateDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateDisabled", required: false }] }], weekStartsOn: [{ type: i0.Input, args: [{ isSignal: true, alias: "weekStartsOn", required: false }] }], defaultFocusedDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultFocusedDate", required: false }] }], _calendar: [{ type: i0.ViewChild, args: [i0.forwardRef(() => BrnCalendarRange), { isSignal: true }] }] } });
935
+ }], ctorParameters: () => [] });
614
936
 
615
937
  /*
616
938
  * Public API Surface of calendar
617
939
  */
618
- const HlmCalendarImports = [HlmCalendar, HlmCalendarMulti, HlmCalendarRange];
940
+ const HlmCalendarImports = [HlmCalendar, HlmCalendarMulti, HlmCalendarRange, HlmMonthYearCalendar];
619
941
  class HlmCalendarModule {
620
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: HlmCalendarModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
621
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.15", ngImport: i0, type: HlmCalendarModule, imports: [HlmCalendar, HlmCalendarMulti, HlmCalendarRange], exports: [HlmCalendar, HlmCalendarMulti, HlmCalendarRange] });
622
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: HlmCalendarModule, imports: [HlmCalendarImports] });
942
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmCalendarModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
943
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.7", ngImport: i0, type: HlmCalendarModule, imports: [HlmCalendar, HlmCalendarMulti, HlmCalendarRange, HlmMonthYearCalendar], exports: [HlmCalendar, HlmCalendarMulti, HlmCalendarRange, HlmMonthYearCalendar] });
944
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmCalendarModule, imports: [HlmCalendarImports] });
623
945
  }
624
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: HlmCalendarModule, decorators: [{
946
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmCalendarModule, decorators: [{
625
947
  type: NgModule,
626
948
  args: [{
627
949
  imports: [...HlmCalendarImports],
@@ -633,5 +955,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
633
955
  * Generated bundle index. Do not edit.
634
956
  */
635
957
 
636
- export { HlmCalendar, HlmCalendarImports, HlmCalendarModule, HlmCalendarMulti, HlmCalendarRange };
958
+ export { HlmCalendar, HlmCalendarImports, HlmCalendarModule, HlmCalendarMulti, HlmCalendarRange, HlmMonthYearCalendar };
637
959
  //# sourceMappingURL=calendar.mjs.map