@spartan-ng/cli 0.0.1-alpha.707 → 0.0.1-alpha.708

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 (406) hide show
  1. package/package.json +8 -8
  2. package/src/generators/base/generator.js +39 -43
  3. package/src/generators/base/generator.js.map +1 -1
  4. package/src/generators/base/lib/build-dependency-array.js +10 -14
  5. package/src/generators/base/lib/build-dependency-array.js.map +1 -1
  6. package/src/generators/base/lib/deleteFiles.js +3 -6
  7. package/src/generators/base/lib/deleteFiles.js.map +1 -1
  8. package/src/generators/base/lib/generate-as.js +1 -4
  9. package/src/generators/base/lib/generate-as.js.map +1 -1
  10. package/src/generators/base/lib/get-target-library-directory.js +5 -9
  11. package/src/generators/base/lib/get-target-library-directory.js.map +1 -1
  12. package/src/generators/base/lib/initialize-angular-library.js +24 -30
  13. package/src/generators/base/lib/initialize-angular-library.js.map +1 -1
  14. package/src/generators/base/lib/single-lib-name.js +1 -4
  15. package/src/generators/base/lib/single-lib-name.js.map +1 -1
  16. package/src/generators/base/lib/styles/create-style-map.js +8 -13
  17. package/src/generators/base/lib/styles/create-style-map.js.map +1 -1
  18. package/src/generators/base/lib/styles/index.js +3 -6
  19. package/src/generators/base/lib/styles/index.js.map +1 -1
  20. package/src/generators/base/lib/styles/transform-style-map.js +23 -27
  21. package/src/generators/base/lib/styles/transform-style-map.js.map +1 -1
  22. package/src/generators/base/lib/styles/transform.js +5 -8
  23. package/src/generators/base/lib/styles/transform.js.map +1 -1
  24. package/src/generators/base/lib/supported-libs.js +0 -2
  25. package/src/generators/base/versions.js +6 -9
  26. package/src/generators/base/versions.js.map +1 -1
  27. package/src/generators/healthcheck/compat.js +3 -5
  28. package/src/generators/healthcheck/compat.js.map +1 -1
  29. package/src/generators/healthcheck/generator.js +72 -75
  30. package/src/generators/healthcheck/generator.js.map +1 -1
  31. package/src/generators/healthcheck/healthchecks/brain-imports.js +9 -13
  32. package/src/generators/healthcheck/healthchecks/brain-imports.js.map +1 -1
  33. package/src/generators/healthcheck/healthchecks/brn-accordion-trigger.js +20 -24
  34. package/src/generators/healthcheck/healthchecks/brn-accordion-trigger.js.map +1 -1
  35. package/src/generators/healthcheck/healthchecks/brn-checkbox-changed-event-rename.js +7 -11
  36. package/src/generators/healthcheck/healthchecks/brn-checkbox-changed-event-rename.js.map +1 -1
  37. package/src/generators/healthcheck/healthchecks/brn-collapsible.js +7 -10
  38. package/src/generators/healthcheck/healthchecks/brn-collapsible.js.map +1 -1
  39. package/src/generators/healthcheck/healthchecks/brn-radio.js +7 -10
  40. package/src/generators/healthcheck/healthchecks/brn-radio.js.map +1 -1
  41. package/src/generators/healthcheck/healthchecks/brn-select.js +7 -11
  42. package/src/generators/healthcheck/healthchecks/brn-select.js.map +1 -1
  43. package/src/generators/healthcheck/healthchecks/brn-separator.js +7 -10
  44. package/src/generators/healthcheck/healthchecks/brn-separator.js.map +1 -1
  45. package/src/generators/healthcheck/healthchecks/brn-switch-changed-event-rename.js +7 -11
  46. package/src/generators/healthcheck/healthchecks/brn-switch-changed-event-rename.js.map +1 -1
  47. package/src/generators/healthcheck/healthchecks/brn-toggle-group-2.js +7 -11
  48. package/src/generators/healthcheck/healthchecks/brn-toggle-group-2.js.map +1 -1
  49. package/src/generators/healthcheck/healthchecks/brn-toggle-group.js +7 -10
  50. package/src/generators/healthcheck/healthchecks/brn-toggle-group.js.map +1 -1
  51. package/src/generators/healthcheck/healthchecks/brn-toggle.js +7 -11
  52. package/src/generators/healthcheck/healthchecks/brn-toggle.js.map +1 -1
  53. package/src/generators/healthcheck/healthchecks/core-imports.js +7 -10
  54. package/src/generators/healthcheck/healthchecks/core-imports.js.map +1 -1
  55. package/src/generators/healthcheck/healthchecks/helm-imports.js +9 -13
  56. package/src/generators/healthcheck/healthchecks/helm-imports.js.map +1 -1
  57. package/src/generators/healthcheck/healthchecks/hlm-date-picker.js +7 -11
  58. package/src/generators/healthcheck/healthchecks/hlm-date-picker.js.map +1 -1
  59. package/src/generators/healthcheck/healthchecks/hlm-dialog-portal.js +7 -11
  60. package/src/generators/healthcheck/healthchecks/hlm-dialog-portal.js.map +1 -1
  61. package/src/generators/healthcheck/healthchecks/hlm-dialog.js +8 -12
  62. package/src/generators/healthcheck/healthchecks/hlm-dialog.js.map +1 -1
  63. package/src/generators/healthcheck/healthchecks/hlm-form-field.js +7 -11
  64. package/src/generators/healthcheck/healthchecks/hlm-form-field.js.map +1 -1
  65. package/src/generators/healthcheck/healthchecks/hlm-icon.js +7 -10
  66. package/src/generators/healthcheck/healthchecks/hlm-icon.js.map +1 -1
  67. package/src/generators/healthcheck/healthchecks/hlm-input-id.js +7 -11
  68. package/src/generators/healthcheck/healthchecks/hlm-input-id.js.map +1 -1
  69. package/src/generators/healthcheck/healthchecks/hlm-menu.js +8 -12
  70. package/src/generators/healthcheck/healthchecks/hlm-menu.js.map +1 -1
  71. package/src/generators/healthcheck/healthchecks/hlm-progress.js +7 -11
  72. package/src/generators/healthcheck/healthchecks/hlm-progress.js.map +1 -1
  73. package/src/generators/healthcheck/healthchecks/hlm-scroll-area.js +7 -10
  74. package/src/generators/healthcheck/healthchecks/hlm-scroll-area.js.map +1 -1
  75. package/src/generators/healthcheck/healthchecks/hlm-select.js +10 -14
  76. package/src/generators/healthcheck/healthchecks/hlm-select.js.map +1 -1
  77. package/src/generators/healthcheck/healthchecks/hlm.js +7 -11
  78. package/src/generators/healthcheck/healthchecks/hlm.js.map +1 -1
  79. package/src/generators/healthcheck/healthchecks/module-imports.js +9 -13
  80. package/src/generators/healthcheck/healthchecks/module-imports.js.map +1 -1
  81. package/src/generators/healthcheck/healthchecks/naming-conventions.js +9 -13
  82. package/src/generators/healthcheck/healthchecks/naming-conventions.js.map +1 -1
  83. package/src/generators/healthcheck/healthchecks/sonner.js +7 -11
  84. package/src/generators/healthcheck/healthchecks/sonner.js.map +1 -1
  85. package/src/generators/healthcheck/healthchecks/version.js +9 -13
  86. package/src/generators/healthcheck/healthchecks/version.js.map +1 -1
  87. package/src/generators/healthcheck/healthchecks.js +5 -9
  88. package/src/generators/healthcheck/healthchecks.js.map +1 -1
  89. package/src/generators/healthcheck/utils/prompt.js +1 -4
  90. package/src/generators/healthcheck/utils/prompt.js.map +1 -1
  91. package/src/generators/healthcheck/utils/reporter.js +19 -23
  92. package/src/generators/healthcheck/utils/reporter.js.map +1 -1
  93. package/src/generators/healthcheck/utils/runner.js +6 -9
  94. package/src/generators/healthcheck/utils/runner.js.map +1 -1
  95. package/src/generators/info/compat.js +3 -5
  96. package/src/generators/info/compat.js.map +1 -1
  97. package/src/generators/info/generator.js +8 -44
  98. package/src/generators/info/generator.js.map +1 -1
  99. package/src/generators/info/lib/collect-info.js +7 -10
  100. package/src/generators/info/lib/collect-info.js.map +1 -1
  101. package/src/generators/init/compat.js +3 -5
  102. package/src/generators/init/compat.js.map +1 -1
  103. package/src/generators/init/generator.js +14 -18
  104. package/src/generators/init/generator.js.map +1 -1
  105. package/src/generators/migrate-brain-accordion-trigger/compat.js +3 -6
  106. package/src/generators/migrate-brain-accordion-trigger/compat.js.map +1 -1
  107. package/src/generators/migrate-brain-accordion-trigger/generator.js +18 -21
  108. package/src/generators/migrate-brain-accordion-trigger/generator.js.map +1 -1
  109. package/src/generators/migrate-brain-accordion-trigger/utils/html-utils.js +10 -20
  110. package/src/generators/migrate-brain-accordion-trigger/utils/html-utils.js.map +1 -1
  111. package/src/generators/migrate-brain-accordion-trigger/utils/shared-utils.js +17 -24
  112. package/src/generators/migrate-brain-accordion-trigger/utils/shared-utils.js.map +1 -1
  113. package/src/generators/migrate-brain-imports/compat.js +3 -5
  114. package/src/generators/migrate-brain-imports/compat.js.map +1 -1
  115. package/src/generators/migrate-brain-imports/generator.js +21 -26
  116. package/src/generators/migrate-brain-imports/generator.js.map +1 -1
  117. package/src/generators/migrate-brain-imports/import-map.js +1 -3
  118. package/src/generators/migrate-brain-imports/import-map.js.map +1 -1
  119. package/src/generators/migrate-brain-imports/utils/binary-extensions.js +3 -6
  120. package/src/generators/migrate-brain-imports/utils/binary-extensions.js.map +1 -1
  121. package/src/generators/migrate-brn-checkbox-changed-event/compat.js +3 -6
  122. package/src/generators/migrate-brn-checkbox-changed-event/compat.js.map +1 -1
  123. package/src/generators/migrate-brn-checkbox-changed-event/generator.js +6 -9
  124. package/src/generators/migrate-brn-checkbox-changed-event/generator.js.map +1 -1
  125. package/src/generators/migrate-brn-select/compat.js +3 -5
  126. package/src/generators/migrate-brn-select/compat.js.map +1 -1
  127. package/src/generators/migrate-brn-select/generator.js +7 -10
  128. package/src/generators/migrate-brn-select/generator.js.map +1 -1
  129. package/src/generators/migrate-brn-switch-changed-event/compat.js +3 -6
  130. package/src/generators/migrate-brn-switch-changed-event/compat.js.map +1 -1
  131. package/src/generators/migrate-brn-switch-changed-event/generator.js +6 -9
  132. package/src/generators/migrate-brn-switch-changed-event/generator.js.map +1 -1
  133. package/src/generators/migrate-brn-toggle-group/compat.js +3 -6
  134. package/src/generators/migrate-brn-toggle-group/compat.js.map +1 -1
  135. package/src/generators/migrate-brn-toggle-group/generator.js +7 -10
  136. package/src/generators/migrate-brn-toggle-group/generator.js.map +1 -1
  137. package/src/generators/migrate-collapsible/compat.js +3 -6
  138. package/src/generators/migrate-collapsible/compat.js.map +1 -1
  139. package/src/generators/migrate-collapsible/generator.js +7 -10
  140. package/src/generators/migrate-collapsible/generator.js.map +1 -1
  141. package/src/generators/migrate-core/compat.js +3 -5
  142. package/src/generators/migrate-core/compat.js.map +1 -1
  143. package/src/generators/migrate-core/generator.js +7 -10
  144. package/src/generators/migrate-core/generator.js.map +1 -1
  145. package/src/generators/migrate-date-picker/compat.js +3 -6
  146. package/src/generators/migrate-date-picker/compat.js.map +1 -1
  147. package/src/generators/migrate-date-picker/generator.js +6 -9
  148. package/src/generators/migrate-date-picker/generator.js.map +1 -1
  149. package/src/generators/migrate-dialog/compat.js +3 -5
  150. package/src/generators/migrate-dialog/compat.js.map +1 -1
  151. package/src/generators/migrate-dialog/generator.js +8 -12
  152. package/src/generators/migrate-dialog/generator.js.map +1 -1
  153. package/src/generators/migrate-dialog-portal/compat.js +3 -5
  154. package/src/generators/migrate-dialog-portal/compat.js.map +1 -1
  155. package/src/generators/migrate-dialog-portal/generator.js +9 -12
  156. package/src/generators/migrate-dialog-portal/generator.js.map +1 -1
  157. package/src/generators/migrate-form-field/compat.js +3 -5
  158. package/src/generators/migrate-form-field/compat.js.map +1 -1
  159. package/src/generators/migrate-form-field/generator.js +10 -13
  160. package/src/generators/migrate-form-field/generator.js.map +1 -1
  161. package/src/generators/migrate-helm-imports/compat.js +3 -5
  162. package/src/generators/migrate-helm-imports/compat.js.map +1 -1
  163. package/src/generators/migrate-helm-imports/generator.js +13 -17
  164. package/src/generators/migrate-helm-imports/generator.js.map +1 -1
  165. package/src/generators/migrate-helm-imports/import-map.js +1 -3
  166. package/src/generators/migrate-helm-imports/import-map.js.map +1 -1
  167. package/src/generators/migrate-helm-libraries/compat.js +3 -6
  168. package/src/generators/migrate-helm-libraries/compat.js.map +1 -1
  169. package/src/generators/migrate-helm-libraries/generator.js +31 -67
  170. package/src/generators/migrate-helm-libraries/generator.js.map +1 -1
  171. package/src/generators/migrate-hlm/compat.js +3 -6
  172. package/src/generators/migrate-hlm/compat.js.map +1 -1
  173. package/src/generators/migrate-hlm/generator.js +11 -47
  174. package/src/generators/migrate-hlm/generator.js.map +1 -1
  175. package/src/generators/migrate-icon/compat.js +3 -5
  176. package/src/generators/migrate-icon/compat.js.map +1 -1
  177. package/src/generators/migrate-icon/generator.js +34 -38
  178. package/src/generators/migrate-icon/generator.js.map +1 -1
  179. package/src/generators/migrate-input-id/compat.js +3 -6
  180. package/src/generators/migrate-input-id/compat.js.map +1 -1
  181. package/src/generators/migrate-input-id/generator.js +6 -9
  182. package/src/generators/migrate-input-id/generator.js.map +1 -1
  183. package/src/generators/migrate-menu/compat.js +3 -5
  184. package/src/generators/migrate-menu/compat.js.map +1 -1
  185. package/src/generators/migrate-menu/generator.js +14 -18
  186. package/src/generators/migrate-menu/generator.js.map +1 -1
  187. package/src/generators/migrate-module-imports/compat.js +3 -5
  188. package/src/generators/migrate-module-imports/compat.js.map +1 -1
  189. package/src/generators/migrate-module-imports/generator.js +15 -19
  190. package/src/generators/migrate-module-imports/generator.js.map +1 -1
  191. package/src/generators/migrate-module-imports/import-map.js +1 -3
  192. package/src/generators/migrate-module-imports/import-map.js.map +1 -1
  193. package/src/generators/migrate-naming-convention/__snapshots__/generator.spec.ts.snap +1 -1
  194. package/src/generators/migrate-naming-convention/compat.js +3 -6
  195. package/src/generators/migrate-naming-convention/compat.js.map +1 -1
  196. package/src/generators/migrate-naming-convention/generator.js +12 -15
  197. package/src/generators/migrate-naming-convention/generator.js.map +1 -1
  198. package/src/generators/migrate-progress/compat.js +3 -5
  199. package/src/generators/migrate-progress/compat.js.map +1 -1
  200. package/src/generators/migrate-progress/generator.js +5 -8
  201. package/src/generators/migrate-progress/generator.js.map +1 -1
  202. package/src/generators/migrate-radio/compat.js +3 -6
  203. package/src/generators/migrate-radio/compat.js.map +1 -1
  204. package/src/generators/migrate-radio/generator.js +7 -10
  205. package/src/generators/migrate-radio/generator.js.map +1 -1
  206. package/src/generators/migrate-scroll-area/compat.js +3 -5
  207. package/src/generators/migrate-scroll-area/compat.js.map +1 -1
  208. package/src/generators/migrate-scroll-area/generator.js +20 -24
  209. package/src/generators/migrate-scroll-area/generator.js.map +1 -1
  210. package/src/generators/migrate-select/compat.js +3 -6
  211. package/src/generators/migrate-select/compat.js.map +1 -1
  212. package/src/generators/migrate-select/generator.js +9 -12
  213. package/src/generators/migrate-select/generator.js.map +1 -1
  214. package/src/generators/migrate-separator/compat.js +3 -6
  215. package/src/generators/migrate-separator/compat.js.map +1 -1
  216. package/src/generators/migrate-separator/generator.js +7 -10
  217. package/src/generators/migrate-separator/generator.js.map +1 -1
  218. package/src/generators/migrate-sonner/compat.js +3 -5
  219. package/src/generators/migrate-sonner/compat.js.map +1 -1
  220. package/src/generators/migrate-sonner/generator.js +6 -9
  221. package/src/generators/migrate-sonner/generator.js.map +1 -1
  222. package/src/generators/migrate-toggle/compat.js +3 -6
  223. package/src/generators/migrate-toggle/compat.js.map +1 -1
  224. package/src/generators/migrate-toggle/generator.js +7 -10
  225. package/src/generators/migrate-toggle/generator.js.map +1 -1
  226. package/src/generators/migrate-toggle-group/compat.js +3 -6
  227. package/src/generators/migrate-toggle-group/compat.js.map +1 -1
  228. package/src/generators/migrate-toggle-group/generator.js +8 -11
  229. package/src/generators/migrate-toggle-group/generator.js.map +1 -1
  230. package/src/generators/theme/__snapshots__/generator.spec.ts.snap +1 -1
  231. package/src/generators/theme/compat.js +3 -6
  232. package/src/generators/theme/compat.js.map +1 -1
  233. package/src/generators/theme/generator.js +10 -13
  234. package/src/generators/theme/generator.js.map +1 -1
  235. package/src/generators/theme/libs/add-theme-to-application-styles.js +14 -17
  236. package/src/generators/theme/libs/add-theme-to-application-styles.js.map +1 -1
  237. package/src/generators/theme/libs/colors.js +3 -6
  238. package/src/generators/theme/libs/colors.js.map +1 -1
  239. package/src/generators/ui/add-dependent-primitive.js +5 -9
  240. package/src/generators/ui/add-dependent-primitive.js.map +1 -1
  241. package/src/generators/ui/compat.js +3 -6
  242. package/src/generators/ui/compat.js.map +1 -1
  243. package/src/generators/ui/generator.js +17 -54
  244. package/src/generators/ui/generator.js.map +1 -1
  245. package/src/generators/ui/libs/accordion/generator.js +3 -7
  246. package/src/generators/ui/libs/accordion/generator.js.map +1 -1
  247. package/src/generators/ui/libs/alert/generator.js +3 -7
  248. package/src/generators/ui/libs/alert/generator.js.map +1 -1
  249. package/src/generators/ui/libs/alert-dialog/generator.js +3 -7
  250. package/src/generators/ui/libs/alert-dialog/generator.js.map +1 -1
  251. package/src/generators/ui/libs/aspect-ratio/generator.js +3 -7
  252. package/src/generators/ui/libs/aspect-ratio/generator.js.map +1 -1
  253. package/src/generators/ui/libs/autocomplete/generator.js +3 -7
  254. package/src/generators/ui/libs/autocomplete/generator.js.map +1 -1
  255. package/src/generators/ui/libs/avatar/generator.js +3 -7
  256. package/src/generators/ui/libs/avatar/generator.js.map +1 -1
  257. package/src/generators/ui/libs/badge/generator.js +3 -7
  258. package/src/generators/ui/libs/badge/generator.js.map +1 -1
  259. package/src/generators/ui/libs/breadcrumb/generator.js +3 -7
  260. package/src/generators/ui/libs/breadcrumb/generator.js.map +1 -1
  261. package/src/generators/ui/libs/button/generator.js +3 -7
  262. package/src/generators/ui/libs/button/generator.js.map +1 -1
  263. package/src/generators/ui/libs/button-group/generator.js +3 -7
  264. package/src/generators/ui/libs/button-group/generator.js.map +1 -1
  265. package/src/generators/ui/libs/calendar/generator.js +3 -7
  266. package/src/generators/ui/libs/calendar/generator.js.map +1 -1
  267. package/src/generators/ui/libs/card/files/lib/hlm-card-action.ts.template +1 -3
  268. package/src/generators/ui/libs/card/files/lib/hlm-card-content.ts.template +1 -3
  269. package/src/generators/ui/libs/card/files/lib/hlm-card-description.ts.template +1 -3
  270. package/src/generators/ui/libs/card/files/lib/hlm-card-footer.ts.template +1 -3
  271. package/src/generators/ui/libs/card/files/lib/hlm-card-header.ts.template +2 -4
  272. package/src/generators/ui/libs/card/files/lib/hlm-card-title.ts.template +1 -3
  273. package/src/generators/ui/libs/card/generator.js +3 -7
  274. package/src/generators/ui/libs/card/generator.js.map +1 -1
  275. package/src/generators/ui/libs/carousel/generator.js +3 -7
  276. package/src/generators/ui/libs/carousel/generator.js.map +1 -1
  277. package/src/generators/ui/libs/checkbox/generator.js +3 -7
  278. package/src/generators/ui/libs/checkbox/generator.js.map +1 -1
  279. package/src/generators/ui/libs/collapsible/generator.js +3 -7
  280. package/src/generators/ui/libs/collapsible/generator.js.map +1 -1
  281. package/src/generators/ui/libs/combobox/generator.js +3 -7
  282. package/src/generators/ui/libs/combobox/generator.js.map +1 -1
  283. package/src/generators/ui/libs/command/generator.js +3 -7
  284. package/src/generators/ui/libs/command/generator.js.map +1 -1
  285. package/src/generators/ui/libs/context-menu/generator.js +3 -7
  286. package/src/generators/ui/libs/context-menu/generator.js.map +1 -1
  287. package/src/generators/ui/libs/date-picker/files/index.ts.template +17 -4
  288. package/src/generators/ui/libs/date-picker/files/lib/hlm-date-picker-anchor.ts.template +28 -0
  289. package/src/generators/ui/libs/date-picker/files/lib/hlm-date-picker-input.ts.template +175 -0
  290. package/src/generators/ui/libs/date-picker/files/lib/hlm-date-picker-multi.ts.template +34 -72
  291. package/src/generators/ui/libs/date-picker/files/lib/hlm-date-picker-trigger.token.ts.template +11 -0
  292. package/src/generators/ui/libs/date-picker/files/lib/hlm-date-picker-trigger.ts.template +87 -0
  293. package/src/generators/ui/libs/date-picker/files/lib/hlm-date-picker.token.ts.template +45 -1
  294. package/src/generators/ui/libs/date-picker/files/lib/hlm-date-picker.ts.template +61 -80
  295. package/src/generators/ui/libs/date-picker/files/lib/hlm-date-range-picker.ts.template +38 -74
  296. package/src/generators/ui/libs/date-picker/generator.js +3 -7
  297. package/src/generators/ui/libs/date-picker/generator.js.map +1 -1
  298. package/src/generators/ui/libs/dialog/generator.js +3 -7
  299. package/src/generators/ui/libs/dialog/generator.js.map +1 -1
  300. package/src/generators/ui/libs/dropdown-menu/generator.js +3 -7
  301. package/src/generators/ui/libs/dropdown-menu/generator.js.map +1 -1
  302. package/src/generators/ui/libs/empty/generator.js +3 -7
  303. package/src/generators/ui/libs/empty/generator.js.map +1 -1
  304. package/src/generators/ui/libs/field/files/lib/hlm-field-error.ts.template +1 -1
  305. package/src/generators/ui/libs/field/generator.js +3 -7
  306. package/src/generators/ui/libs/field/generator.js.map +1 -1
  307. package/src/generators/ui/libs/hover-card/generator.js +3 -7
  308. package/src/generators/ui/libs/hover-card/generator.js.map +1 -1
  309. package/src/generators/ui/libs/icon/generator.js +3 -7
  310. package/src/generators/ui/libs/icon/generator.js.map +1 -1
  311. package/src/generators/ui/libs/input/generator.js +3 -7
  312. package/src/generators/ui/libs/input/generator.js.map +1 -1
  313. package/src/generators/ui/libs/input-group/generator.js +3 -7
  314. package/src/generators/ui/libs/input-group/generator.js.map +1 -1
  315. package/src/generators/ui/libs/input-otp/generator.js +3 -7
  316. package/src/generators/ui/libs/input-otp/generator.js.map +1 -1
  317. package/src/generators/ui/libs/item/generator.js +3 -7
  318. package/src/generators/ui/libs/item/generator.js.map +1 -1
  319. package/src/generators/ui/libs/kbd/generator.js +3 -7
  320. package/src/generators/ui/libs/kbd/generator.js.map +1 -1
  321. package/src/generators/ui/libs/label/generator.js +3 -7
  322. package/src/generators/ui/libs/label/generator.js.map +1 -1
  323. package/src/generators/ui/libs/menubar/generator.js +3 -7
  324. package/src/generators/ui/libs/menubar/generator.js.map +1 -1
  325. package/src/generators/ui/libs/native-select/generator.js +3 -7
  326. package/src/generators/ui/libs/native-select/generator.js.map +1 -1
  327. package/src/generators/ui/libs/navigation-menu/generator.js +3 -7
  328. package/src/generators/ui/libs/navigation-menu/generator.js.map +1 -1
  329. package/src/generators/ui/libs/pagination/generator.js +3 -7
  330. package/src/generators/ui/libs/pagination/generator.js.map +1 -1
  331. package/src/generators/ui/libs/popover/generator.js +3 -7
  332. package/src/generators/ui/libs/popover/generator.js.map +1 -1
  333. package/src/generators/ui/libs/progress/generator.js +3 -7
  334. package/src/generators/ui/libs/progress/generator.js.map +1 -1
  335. package/src/generators/ui/libs/radio-group/generator.js +3 -7
  336. package/src/generators/ui/libs/radio-group/generator.js.map +1 -1
  337. package/src/generators/ui/libs/resizable/generator.js +3 -7
  338. package/src/generators/ui/libs/resizable/generator.js.map +1 -1
  339. package/src/generators/ui/libs/scroll-area/generator.js +3 -7
  340. package/src/generators/ui/libs/scroll-area/generator.js.map +1 -1
  341. package/src/generators/ui/libs/select/generator.js +3 -7
  342. package/src/generators/ui/libs/select/generator.js.map +1 -1
  343. package/src/generators/ui/libs/separator/generator.js +3 -7
  344. package/src/generators/ui/libs/separator/generator.js.map +1 -1
  345. package/src/generators/ui/libs/sheet/generator.js +3 -7
  346. package/src/generators/ui/libs/sheet/generator.js.map +1 -1
  347. package/src/generators/ui/libs/sidebar/generator.js +3 -7
  348. package/src/generators/ui/libs/sidebar/generator.js.map +1 -1
  349. package/src/generators/ui/libs/skeleton/generator.js +3 -7
  350. package/src/generators/ui/libs/skeleton/generator.js.map +1 -1
  351. package/src/generators/ui/libs/slider/generator.js +3 -7
  352. package/src/generators/ui/libs/slider/generator.js.map +1 -1
  353. package/src/generators/ui/libs/sonner/generator.js +3 -7
  354. package/src/generators/ui/libs/sonner/generator.js.map +1 -1
  355. package/src/generators/ui/libs/spinner/generator.js +3 -7
  356. package/src/generators/ui/libs/spinner/generator.js.map +1 -1
  357. package/src/generators/ui/libs/switch/generator.js +3 -7
  358. package/src/generators/ui/libs/switch/generator.js.map +1 -1
  359. package/src/generators/ui/libs/table/generator.js +3 -7
  360. package/src/generators/ui/libs/table/generator.js.map +1 -1
  361. package/src/generators/ui/libs/tabs/generator.js +3 -7
  362. package/src/generators/ui/libs/tabs/generator.js.map +1 -1
  363. package/src/generators/ui/libs/textarea/generator.js +3 -7
  364. package/src/generators/ui/libs/textarea/generator.js.map +1 -1
  365. package/src/generators/ui/libs/toggle/generator.js +3 -7
  366. package/src/generators/ui/libs/toggle/generator.js.map +1 -1
  367. package/src/generators/ui/libs/toggle-group/generator.js +3 -7
  368. package/src/generators/ui/libs/toggle-group/generator.js.map +1 -1
  369. package/src/generators/ui/libs/tooltip/generator.js +3 -7
  370. package/src/generators/ui/libs/tooltip/generator.js.map +1 -1
  371. package/src/generators/ui/libs/typography/generator.js +3 -7
  372. package/src/generators/ui/libs/typography/generator.js.map +1 -1
  373. package/src/generators/ui/libs/utils/generator.js +3 -7
  374. package/src/generators/ui/libs/utils/generator.js.map +1 -1
  375. package/src/generators/ui/primitive-deps.js +4 -8
  376. package/src/generators/ui/primitive-deps.js.map +1 -1
  377. package/src/generators/ui/primitives.js +0 -2
  378. package/src/generators/ui/style-luma.css +9 -4
  379. package/src/generators/ui/style-lyra.css +10 -5
  380. package/src/generators/ui/style-maia.css +10 -5
  381. package/src/generators/ui/style-mira.css +10 -5
  382. package/src/generators/ui/style-nova.css +10 -5
  383. package/src/generators/ui/style-vega.css +10 -5
  384. package/src/generators/ui/supported-ui-libraries.json +140 -140
  385. package/src/index.js +5 -11
  386. package/src/index.js.map +1 -1
  387. package/src/registry/index.js +1 -4
  388. package/src/registry/index.js.map +1 -1
  389. package/src/registry/schema.js +117 -120
  390. package/src/registry/schema.js.map +1 -1
  391. package/src/utils/config.js +19 -25
  392. package/src/utils/config.js.map +1 -1
  393. package/src/utils/get-project-names.js +3 -7
  394. package/src/utils/get-project-names.js.map +1 -1
  395. package/src/utils/get-tailwind-version.js +4 -9
  396. package/src/utils/get-tailwind-version.js.map +1 -1
  397. package/src/utils/hlm-class.js +9 -13
  398. package/src/utils/hlm-class.js.map +1 -1
  399. package/src/utils/import-alias.js +1 -4
  400. package/src/utils/import-alias.js.map +1 -1
  401. package/src/utils/tsconfig.js +5 -8
  402. package/src/utils/tsconfig.js.map +1 -1
  403. package/src/utils/version-utils.js +6 -9
  404. package/src/utils/version-utils.js.map +1 -1
  405. package/src/utils/visit-files.js +3 -6
  406. package/src/utils/visit-files.js.map +1 -1
@@ -0,0 +1,87 @@
1
+ import { BooleanInput } from '@angular/cdk/coercion';
2
+ import { booleanAttribute, ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';
3
+ import { NgIcon, provideIcons } from '@ng-icons/core';
4
+ import { lucideChevronDown } from '@ng-icons/lucide';
5
+ import { BrnFieldControl, BrnFieldControlDescribedBy } from '@spartan-ng/brain/field';
6
+ import { ButtonVariants, HlmButtonImports } from '<%- importAlias %>/button';
7
+ import { HlmPopoverTrigger } from '<%- importAlias %>/popover';
8
+ import { hlm } from '<%- importAlias %>/utils';
9
+ import { ClassValue } from 'clsx';
10
+ import { HlmDatePickerTriggerBase, provideHlmDatePickerTrigger } from './hlm-date-picker-trigger.token';
11
+ import { injectHlmDatePicker } from './hlm-date-picker.token';
12
+
13
+ @Component({
14
+ selector: 'hlm-date-picker-trigger',
15
+ imports: [HlmButtonImports, HlmPopoverTrigger, NgIcon, BrnFieldControlDescribedBy],
16
+ providers: [provideIcons({ lucideChevronDown }), provideHlmDatePickerTrigger(HlmDatePickerTrigger)],
17
+ changeDetection: ChangeDetectionStrategy.OnPush,
18
+ host: { 'data-slot': 'date-picker-trigger' },
19
+ template: `
20
+ <button
21
+ [id]="buttonId()"
22
+ type="button"
23
+ [class]="_computedClass()"
24
+ [disabled]="_disabled()"
25
+ [attr.aria-invalid]="_ariaInvalid()"
26
+ [attr.data-invalid]="_ariaInvalid()"
27
+ [attr.data-touched]="_touched?.() ? 'true' : null"
28
+ [attr.data-dirty]="_dirty?.() ? 'true' : null"
29
+ [attr.data-matches-spartan-invalid]="_spartanInvalid() ? 'true' : null"
30
+ hlmBtn
31
+ [variant]="variant()"
32
+ hlmPopoverTrigger
33
+ [hlmPopoverTriggerFor]="_popover()"
34
+ brnFieldControlDescribedBy
35
+ [attr.data-placeholder]="_isPlaceholder() ? '' : null"
36
+ >
37
+ <span class="truncate">
38
+ @if (_formattedDate(); as formattedDate) {
39
+ {{ formattedDate }}
40
+ } @else {
41
+ <ng-content />
42
+ }
43
+ </span>
44
+
45
+ @if (showTrigger()) {
46
+ <ng-icon name="lucideChevronDown" />
47
+ }
48
+ </button>
49
+ `,
50
+ })
51
+ export class HlmDatePickerTrigger implements HlmDatePickerTriggerBase {
52
+ private static _nextId = 0;
53
+
54
+ private readonly _fieldControl = inject(BrnFieldControl, { optional: true });
55
+ private readonly _datePicker = injectHlmDatePicker();
56
+
57
+ private readonly _invalid = this._fieldControl?.invalid;
58
+ protected readonly _spartanInvalid = computed(() => this.forceInvalid() || this._fieldControl?.spartanInvalid());
59
+ protected readonly _dirty = this._fieldControl?.dirty;
60
+ protected readonly _touched = this._fieldControl?.touched;
61
+
62
+ protected readonly _ariaInvalid = computed(() => (this._invalid?.() ? 'true' : null));
63
+
64
+ public readonly userClass = input<ClassValue>('', { alias: 'class' });
65
+ protected readonly _computedClass = computed(() =>
66
+ hlm('spartan-date-picker-trigger w-64 justify-between', this.userClass()),
67
+ );
68
+
69
+ protected readonly _isPlaceholder = computed(() => !this._datePicker.hasDate());
70
+
71
+ /** The id of the button that opens the date picker. */
72
+ public readonly buttonId = input<string>(`hlm-date-picker-${++HlmDatePickerTrigger._nextId}`);
73
+
74
+ /** @internal The id of the button that opens the date picker, used for labeling. */
75
+ public readonly triggerId = this.buttonId;
76
+
77
+ /** Forces the invalid state visually, regardless of form control state. */
78
+ public readonly forceInvalid = input<boolean, BooleanInput>(false, { transform: booleanAttribute });
79
+
80
+ public readonly variant = input<ButtonVariants['variant']>('outline');
81
+
82
+ public readonly showTrigger = input<boolean, BooleanInput>(true, { transform: booleanAttribute });
83
+
84
+ protected readonly _popover = this._datePicker.popover;
85
+ protected readonly _disabled = this._datePicker.disabledState;
86
+ protected readonly _formattedDate = this._datePicker.formattedDate;
87
+ }
@@ -1,4 +1,36 @@
1
- import { inject, InjectionToken, type ValueProvider } from '@angular/core';
1
+ import {
2
+ type ExistingProvider,
3
+ inject,
4
+ InjectionToken,
5
+ type Signal,
6
+ type Type,
7
+ type ValueProvider,
8
+ } from '@angular/core';
9
+ import type { BrnPopover } from '@spartan-ng/brain/popover';
10
+
11
+ export interface HlmDatePickerBase<T> {
12
+ popover: Signal<BrnPopover>;
13
+ disabledState: Signal<boolean>;
14
+ formattedDate: Signal<string | undefined>;
15
+ hasDate: Signal<boolean>;
16
+ /** Commit a date to the picker (e.g. from a parsed input). Pass `undefined` to clear. Optional. */
17
+ updateDate?(value: T | undefined): void;
18
+ // used for ControlValueAccessor
19
+ touched?(): void;
20
+ }
21
+
22
+ export const HlmDatePickerToken = new InjectionToken<HlmDatePickerBase<unknown>>('HlmDatePickerToken');
23
+
24
+ export function provideHlmDatePicker(instance: Type<HlmDatePickerBase<unknown>>): ExistingProvider {
25
+ return { provide: HlmDatePickerToken, useExisting: instance };
26
+ }
27
+
28
+ /**
29
+ * Inject the date picker component.
30
+ */
31
+ export function injectHlmDatePicker<T>(): HlmDatePickerBase<T> {
32
+ return inject(HlmDatePickerToken) as HlmDatePickerBase<T>;
33
+ }
2
34
 
3
35
  export interface HlmDatePickerConfig<T> {
4
36
  /**
@@ -21,12 +53,24 @@ export interface HlmDatePickerConfig<T> {
21
53
  * @returns transformed date
22
54
  */
23
55
  transformDate: (date: T) => T;
56
+
57
+ /**
58
+ * Parse a user-entered string into a date.
59
+ *
60
+ * @param value the raw string from the input
61
+ * @returns the parsed date, or `undefined` when the value can't be parsed
62
+ */
63
+ parseDate: (value: string) => T | undefined;
24
64
  }
25
65
 
26
66
  function getDefaultConfig<T>(): HlmDatePickerConfig<T> {
27
67
  return {
28
68
  formatDate: (date) => (date instanceof Date ? date.toDateString() : `${date}`),
29
69
  transformDate: (date) => date,
70
+ parseDate: (value) => {
71
+ const date = new Date(value);
72
+ return isNaN(date.getTime()) ? undefined : (date as T);
73
+ },
30
74
  autoCloseOnSelect: false,
31
75
  };
32
76
  }
@@ -4,25 +4,23 @@ import {
4
4
  ChangeDetectionStrategy,
5
5
  Component,
6
6
  computed,
7
+ contentChild,
7
8
  forwardRef,
8
- inject,
9
9
  input,
10
10
  linkedSignal,
11
11
  output,
12
12
  signal,
13
+ viewChild,
13
14
  } from '@angular/core';
14
15
  import { type ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
15
- import { NgIcon, provideIcons } from '@ng-icons/core';
16
- import { lucideChevronDown } from '@ng-icons/lucide';
17
16
  import type { BrnDialogState } from '@spartan-ng/brain/dialog';
18
- import { BrnFieldControl, BrnFieldControlDescribedBy, provideBrnLabelable } from '@spartan-ng/brain/field';
17
+ import { BrnFieldControl, provideBrnLabelable } from '@spartan-ng/brain/field';
19
18
  import type { ChangeFn, TouchFn } from '@spartan-ng/brain/forms';
19
+ import { BrnPopover } from '@spartan-ng/brain/popover';
20
20
  import { HlmCalendar } from '<%- importAlias %>/calendar';
21
- import { HlmIcon } from '<%- importAlias %>/icon';
22
21
  import { HlmPopoverImports } from '<%- importAlias %>/popover';
23
- import { hlm } from '<%- importAlias %>/utils';
24
- import type { ClassValue } from 'clsx';
25
- import { injectHlmDatePickerConfig } from './hlm-date-picker.token';
22
+ import { HlmDatePickerTriggerToken } from './hlm-date-picker-trigger.token';
23
+ import { HlmDatePickerBase, injectHlmDatePickerConfig, provideHlmDatePicker } from './hlm-date-picker.token';
26
24
 
27
25
  export const HLM_DATE_PICKER_VALUE_ACCESSOR = {
28
26
  provide: NG_VALUE_ACCESSOR,
@@ -30,92 +28,46 @@ export const HLM_DATE_PICKER_VALUE_ACCESSOR = {
30
28
  multi: true,
31
29
  };
32
30
 
33
- let nextId = 0;
34
-
35
31
  @Component({
36
32
  selector: 'hlm-date-picker',
37
- imports: [NgIcon, HlmIcon, BrnFieldControlDescribedBy, HlmPopoverImports, HlmCalendar],
38
- providers: [HLM_DATE_PICKER_VALUE_ACCESSOR, provideIcons({ lucideChevronDown }), provideBrnLabelable(HlmDatePicker)],
33
+ imports: [HlmPopoverImports, HlmCalendar],
34
+ providers: [HLM_DATE_PICKER_VALUE_ACCESSOR, provideHlmDatePicker(HlmDatePicker), provideBrnLabelable(HlmDatePicker)],
39
35
  changeDetection: ChangeDetectionStrategy.OnPush,
40
36
  hostDirectives: [BrnFieldControl],
41
- host: {
42
- class: 'block',
43
- },
37
+ host: { class: 'block' },
44
38
  template: `
45
39
  <hlm-popover
46
40
  sideOffset="5"
41
+ autoFocus="first-heading"
47
42
  [state]="_popoverState()"
48
43
  (stateChanged)="_popoverState.set($event)"
49
44
  (closed)="_onTouched?.()"
50
45
  >
51
- <button
52
- [id]="buttonId()"
53
- type="button"
54
- [class]="_computedClass()"
55
- [disabled]="_mutableDisabled()"
56
- [attr.aria-invalid]="_ariaInvalid()"
57
- [attr.data-invalid]="_ariaInvalid()"
58
- [attr.data-touched]="_touched?.() ? 'true' : null"
59
- [attr.data-dirty]="_dirty?.() ? 'true' : null"
60
- [attr.data-matches-spartan-invalid]="_spartanInvalid?.() ? 'true' : null"
61
- hlmPopoverTrigger
62
- brnFieldControlDescribedBy
63
- >
64
- <span class="truncate">
65
- @if (_formattedDate(); as formattedDate) {
66
- {{ formattedDate }}
67
- } @else {
68
- <ng-content />
69
- }
70
- </span>
71
-
72
- <ng-icon hlm size="sm" name="lucideChevronDown" />
73
- </button>
46
+ <ng-content />
74
47
 
75
48
  <hlm-popover-content class="w-fit p-0" *hlmPopoverPortal="let ctx">
49
+ <ng-content select="[hlmDatePickerHeader]" />
76
50
  <hlm-calendar
77
- calendarClass="border-0 rounded-none"
51
+ calendarClass="rounded-none border-0"
78
52
  [captionLayout]="captionLayout()"
79
53
  [date]="_mutableDate()"
54
+ [defaultFocusedDate]="_mutableDate() ?? defaultFocusedDate()"
80
55
  [min]="min()"
81
56
  [max]="max()"
82
- [disabled]="_mutableDisabled()"
57
+ [disabled]="_disabled()"
83
58
  (dateChange)="_handleChange($event)"
84
59
  />
60
+ <ng-content select="[hlmDatePickerFooter]" />
85
61
  </hlm-popover-content>
86
62
  </hlm-popover>
87
63
  `,
88
64
  })
89
- export class HlmDatePicker<T> implements ControlValueAccessor {
65
+ export class HlmDatePicker<T> implements HlmDatePickerBase<T>, ControlValueAccessor {
90
66
  private readonly _config = injectHlmDatePickerConfig<T>();
91
- private readonly _fieldControl = inject(BrnFieldControl, { optional: true });
92
-
93
- private readonly _invalid = this._fieldControl?.invalid;
94
- protected readonly _spartanInvalid = this._fieldControl?.spartanInvalid;
95
- protected readonly _dirty = this._fieldControl?.dirty;
96
- protected readonly _touched = this._fieldControl?.touched;
97
-
98
- protected readonly _errorStateClass = computed(() =>
99
- this._spartanInvalid?.()
100
- ? 'border-destructive focus-visible:border-destructive focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40'
101
- : '',
102
- );
103
- protected readonly _ariaInvalid = computed(() => (this._invalid?.() ? 'true' : null));
104
-
105
- public readonly userClass = input<ClassValue>('', { alias: 'class' });
106
- protected readonly _computedClass = computed(() =>
107
- hlm(
108
- 'ring-offset-background border-input bg-background hover:bg-accent dark:bg-input/30 dark:hover:bg-input/50 inline-flex h-9 w-[280px] cursor-default items-center justify-between gap-2 rounded-md border px-3 py-2 text-left text-sm font-normal whitespace-nowrap transition-all disabled:pointer-events-none disabled:opacity-50',
109
- 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none',
110
- 'disabled:pointer-events-none disabled:opacity-50',
111
- '[&_ng-icon]:pointer-events-none [&_ng-icon]:shrink-0',
112
- this._errorStateClass(),
113
- this.userClass(),
114
- ),
115
- );
116
-
117
- /** The id of the button that opens the date picker. */
118
- public readonly buttonId = input<string>(`hlm-date-picker-${++nextId}`);
67
+
68
+ public readonly popover = viewChild.required(BrnPopover);
69
+
70
+ private readonly _trigger = contentChild(HlmDatePickerTriggerToken);
119
71
 
120
72
  /** Show dropdowns to navigate between months or years. */
121
73
  public readonly captionLayout = input<'dropdown' | 'label' | 'dropdown-months' | 'dropdown-years'>('label');
@@ -134,6 +86,9 @@ export class HlmDatePicker<T> implements ControlValueAccessor {
134
86
  /** The selected value. */
135
87
  public readonly date = input<T>();
136
88
 
89
+ /** The date the calendar focuses on first open when no date is selected. */
90
+ public readonly defaultFocusedDate = input<T>();
91
+
137
92
  protected readonly _mutableDate = linkedSignal(this.date);
138
93
 
139
94
  /** If true, the date picker will close when a date is selected. */
@@ -149,33 +104,49 @@ export class HlmDatePicker<T> implements ControlValueAccessor {
149
104
 
150
105
  protected readonly _popoverState = signal<BrnDialogState | null>(null);
151
106
 
152
- protected readonly _mutableDisabled = linkedSignal(this.disabled);
107
+ protected readonly _disabled = linkedSignal(this.disabled);
153
108
 
154
- protected readonly _formattedDate = computed(() => {
109
+ /** @internal The disabled state as a readonly signal */
110
+ public readonly disabledState = this._disabled.asReadonly();
111
+
112
+ public readonly formattedDate = computed(() => {
155
113
  const date = this._mutableDate();
156
114
  return date ? this.formatDate()(date) : undefined;
157
115
  });
158
116
 
159
117
  public readonly dateChange = output<T>();
160
118
 
161
- public readonly labelableId = this.buttonId;
119
+ public readonly labelableId = computed(() => this._trigger()?.triggerId());
120
+
121
+ public readonly hasDate = computed(() => !!this._mutableDate());
162
122
 
163
123
  protected _onChange?: ChangeFn<T>;
164
124
  protected _onTouched?: TouchFn;
165
125
 
166
- protected _handleChange(value: T) {
167
- if (this._mutableDisabled()) return;
168
- const transformedDate = value !== undefined ? this.transformDate()(value) : value;
169
-
170
- this._mutableDate.set(transformedDate);
171
- this._onChange?.(transformedDate);
172
- this.dateChange.emit(transformedDate);
126
+ protected _handleChange(value: T | undefined) {
127
+ if (this._disabled()) return;
128
+ this.updateDate(value);
173
129
 
174
130
  if (this.autoCloseOnSelect()) {
175
131
  this._popoverState.set('closed');
176
132
  }
177
133
  }
178
134
 
135
+ /**
136
+ * Commit a date to the picker. Updates the internal model, notifies form
137
+ * controls, and emits `dateChange`. Unlike `_handleChange`, this does not
138
+ * close the popover - it's intended to be called from a text input that
139
+ * is parsing user-entered values while typing.
140
+ */
141
+ public updateDate(value: T | undefined) {
142
+ if (this._disabled()) return;
143
+ const transformedDate = value !== undefined ? this.transformDate()(value) : undefined;
144
+
145
+ this._mutableDate.set(transformedDate);
146
+ this._onChange?.(transformedDate as T);
147
+ this.dateChange.emit(transformedDate as T);
148
+ }
149
+
179
150
  /** CONTROL VALUE ACCESSOR */
180
151
  public writeValue(value: T | null): void {
181
152
  this._mutableDate.set(value ? this.transformDate()(value) : undefined);
@@ -189,8 +160,12 @@ export class HlmDatePicker<T> implements ControlValueAccessor {
189
160
  this._onTouched = fn;
190
161
  }
191
162
 
163
+ public touched(): void {
164
+ this._onTouched?.();
165
+ }
166
+
192
167
  public setDisabledState(isDisabled: boolean): void {
193
- this._mutableDisabled.set(isDisabled);
168
+ this._disabled.set(isDisabled);
194
169
  }
195
170
 
196
171
  public open() {
@@ -200,4 +175,10 @@ export class HlmDatePicker<T> implements ControlValueAccessor {
200
175
  public close() {
201
176
  this._popoverState.set('closed');
202
177
  }
178
+
179
+ public reset() {
180
+ this._mutableDate.set(undefined);
181
+ this._onChange?.(undefined as T);
182
+ this.dateChange.emit(undefined as T);
183
+ }
203
184
  }
@@ -4,25 +4,24 @@ import {
4
4
  ChangeDetectionStrategy,
5
5
  Component,
6
6
  computed,
7
+ contentChild,
7
8
  forwardRef,
8
- inject,
9
9
  input,
10
10
  linkedSignal,
11
11
  output,
12
12
  signal,
13
13
  untracked,
14
+ viewChild,
14
15
  } from '@angular/core';
15
16
  import { type ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
16
- import { provideIcons } from '@ng-icons/core';
17
- import { lucideChevronDown } from '@ng-icons/lucide';
18
17
  import type { BrnDialogState } from '@spartan-ng/brain/dialog';
19
- import { BrnFieldControl, BrnFieldControlDescribedBy, provideBrnLabelable } from '@spartan-ng/brain/field';
18
+ import { BrnFieldControl, provideBrnLabelable } from '@spartan-ng/brain/field';
20
19
  import type { ChangeFn, TouchFn } from '@spartan-ng/brain/forms';
20
+ import { BrnPopover } from '@spartan-ng/brain/popover';
21
21
  import { HlmCalendarRange } from '<%- importAlias %>/calendar';
22
- import { HlmIconImports } from '<%- importAlias %>/icon';
23
22
  import { HlmPopoverImports } from '<%- importAlias %>/popover';
24
- import { hlm } from '<%- importAlias %>/utils';
25
- import type { ClassValue } from 'clsx';
23
+ import { HlmDatePickerTriggerToken } from './hlm-date-picker-trigger.token';
24
+ import { HlmDatePickerBase, provideHlmDatePicker } from './hlm-date-picker.token';
26
25
  import { injectHlmDateRangePickerConfig } from './hlm-date-range-picker.token';
27
26
 
28
27
  export const HLM_DATE_RANGE_PICKER_VALUE_ACCESSOR = {
@@ -31,21 +30,17 @@ export const HLM_DATE_RANGE_PICKER_VALUE_ACCESSOR = {
31
30
  multi: true,
32
31
  };
33
32
 
34
- let nextId = 0;
35
-
36
33
  @Component({
37
34
  selector: 'hlm-date-range-picker',
38
- imports: [HlmIconImports, HlmPopoverImports, HlmCalendarRange, BrnFieldControlDescribedBy],
35
+ imports: [HlmPopoverImports, HlmCalendarRange],
39
36
  providers: [
40
37
  HLM_DATE_RANGE_PICKER_VALUE_ACCESSOR,
41
- provideIcons({ lucideChevronDown }),
38
+ provideHlmDatePicker(HlmDateRangePicker),
42
39
  provideBrnLabelable(HlmDateRangePicker),
43
40
  ],
44
41
  changeDetection: ChangeDetectionStrategy.OnPush,
45
42
  hostDirectives: [BrnFieldControl],
46
- host: {
47
- class: 'block',
48
- },
43
+ host: { class: 'block' },
49
44
  template: `
50
45
  <hlm-popover
51
46
  sideOffset="5"
@@ -53,31 +48,10 @@ let nextId = 0;
53
48
  (stateChanged)="_popoverState.set($event)"
54
49
  (closed)="_onClose(); _onTouched?.()"
55
50
  >
56
- <button
57
- [id]="buttonId()"
58
- type="button"
59
- [class]="_computedClass()"
60
- [disabled]="_mutableDisabled()"
61
- [attr.aria-invalid]="_ariaInvalid()"
62
- [attr.data-invalid]="_ariaInvalid()"
63
- [attr.data-touched]="_touched?.() ? 'true' : null"
64
- [attr.data-dirty]="_dirty?.() ? 'true' : null"
65
- [attr.data-matches-spartan-invalid]="_spartanInvalid?.() ? 'true' : null"
66
- hlmPopoverTrigger
67
- brnFieldControlDescribedBy
68
- >
69
- <span class="truncate">
70
- @if (_formattedDate(); as formattedDate) {
71
- {{ formattedDate }}
72
- } @else {
73
- <ng-content />
74
- }
75
- </span>
76
-
77
- <ng-icon hlm size="sm" name="lucideChevronDown" />
78
- </button>
51
+ <ng-content />
79
52
 
80
53
  <hlm-popover-content class="w-fit p-0" *hlmPopoverPortal="let ctx">
54
+ <ng-content select="[hlmDatePickerHeader]" />
81
55
  <hlm-calendar-range
82
56
  calendarClass="border-0 rounded-none"
83
57
  [startDate]="_start()"
@@ -85,44 +59,21 @@ let nextId = 0;
85
59
  [endDate]="_end()"
86
60
  [min]="min()"
87
61
  [max]="max()"
88
- [disabled]="_mutableDisabled()"
62
+ [disabled]="_disabled()"
89
63
  (startDateChange)="_handleStartDayChange($event)"
90
64
  (endDateChange)="_handleEndDateChange($event)"
91
65
  />
66
+ <ng-content select="[hlmDatePickerFooter]" />
92
67
  </hlm-popover-content>
93
68
  </hlm-popover>
94
69
  `,
95
70
  })
96
- export class HlmDateRangePicker<T> implements ControlValueAccessor {
71
+ export class HlmDateRangePicker<T> implements HlmDatePickerBase<T>, ControlValueAccessor {
97
72
  private readonly _config = injectHlmDateRangePickerConfig<T>();
98
- private readonly _fieldControl = inject(BrnFieldControl, { optional: true });
99
-
100
- protected readonly _spartanInvalid = this._fieldControl?.spartanInvalid;
101
- protected readonly _touched = this._fieldControl?.touched;
102
- protected readonly _dirty = this._fieldControl?.dirty;
103
- protected readonly _invalid = this._fieldControl?.invalid;
104
-
105
- protected readonly _errorStateClass = computed(() =>
106
- this._spartanInvalid?.()
107
- ? 'border-destructive focus-visible:border-destructive focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40'
108
- : '',
109
- );
110
- protected readonly _ariaInvalid = computed(() => (this._invalid?.() ? 'true' : null));
111
-
112
- public readonly userClass = input<ClassValue>('', { alias: 'class' });
113
- protected readonly _computedClass = computed(() =>
114
- hlm(
115
- 'ring-offset-background border-input bg-background hover:bg-accent dark:bg-input/30 dark:hover:bg-input/50 inline-flex h-9 w-[280px] cursor-default items-center justify-between gap-2 rounded-md border px-3 py-2 text-left text-sm font-normal whitespace-nowrap transition-all disabled:pointer-events-none disabled:opacity-50',
116
- 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none',
117
- 'disabled:pointer-events-none disabled:opacity-50',
118
- '[&_ng-icon]:pointer-events-none [&_ng-icon]:shrink-0',
119
- this._errorStateClass(),
120
- this.userClass(),
121
- ),
122
- );
123
-
124
- /** The id of the button that opens the date picker. */
125
- public readonly buttonId = input<string>(`hlm-date-picker-range-${++nextId}`);
73
+
74
+ public readonly popover = viewChild.required(BrnPopover);
75
+
76
+ private readonly _trigger = contentChild(HlmDatePickerTriggerToken);
126
77
 
127
78
  /** Show dropdowns to navigate between months or years. */
128
79
  public readonly captionLayout = input<'dropdown' | 'label' | 'dropdown-months' | 'dropdown-years'>('label');
@@ -159,9 +110,12 @@ export class HlmDateRangePicker<T> implements ControlValueAccessor {
159
110
 
160
111
  protected readonly _popoverState = signal<BrnDialogState | null>(null);
161
112
 
162
- protected readonly _mutableDisabled = linkedSignal(this.disabled);
113
+ protected readonly _disabled = linkedSignal(this.disabled);
114
+
115
+ /** @internal The disabled state as a readonly signal */
116
+ public readonly disabledState = this._disabled.asReadonly();
163
117
 
164
- protected readonly _formattedDate = computed(() => {
118
+ public readonly formattedDate = computed(() => {
165
119
  const start = this._start();
166
120
  const end = this._end();
167
121
  return start || end ? this.formatDates()([start, end]) : undefined;
@@ -169,18 +123,20 @@ export class HlmDateRangePicker<T> implements ControlValueAccessor {
169
123
 
170
124
  public readonly dateChange = output<[T, T] | null>();
171
125
 
172
- public readonly labelableId = this.buttonId;
126
+ public readonly labelableId = computed(() => this._trigger()?.triggerId());
127
+
128
+ public readonly hasDate = computed(() => !!this._start() || !!this._end());
173
129
 
174
130
  protected _onChange?: ChangeFn<[T, T] | null>;
175
131
  protected _onTouched?: TouchFn;
176
132
 
177
- protected _handleStartDayChange(value: T) {
133
+ protected _handleStartDayChange(value: T | undefined) {
178
134
  this._start.set(value);
179
135
  }
180
136
 
181
- protected _handleEndDateChange(value: T): void {
137
+ protected _handleEndDateChange(value: T | undefined): void {
182
138
  this._end.set(value);
183
- if (this._mutableDisabled()) return;
139
+ if (this._disabled()) return;
184
140
 
185
141
  const start = this._start();
186
142
  if (start && value) {
@@ -215,7 +171,7 @@ export class HlmDateRangePicker<T> implements ControlValueAccessor {
215
171
  }
216
172
 
217
173
  public setDisabledState(isDisabled: boolean): void {
218
- this._mutableDisabled.set(isDisabled);
174
+ this._disabled.set(isDisabled);
219
175
  }
220
176
 
221
177
  public open() {
@@ -226,6 +182,14 @@ export class HlmDateRangePicker<T> implements ControlValueAccessor {
226
182
  this._popoverState.set('closed');
227
183
  }
228
184
 
185
+ public reset() {
186
+ this._mutableDate.set(undefined);
187
+ this._start.set(undefined);
188
+ this._end.set(undefined);
189
+ this._onChange?.(null);
190
+ this.dateChange.emit(null);
191
+ }
192
+
229
193
  protected _onClose(): void {
230
194
  const dates = this._mutableDate();
231
195
  if (this._start() && !this._end() && dates) {
@@ -1,9 +1,5 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generator = generator;
4
- const tslib_1 = require("tslib");
5
- const generator_1 = tslib_1.__importDefault(require("../../../base/generator"));
6
- async function generator(tree, options) {
7
- return await (0, generator_1.default)(tree, { ...options, name: 'date-picker' });
1
+ import hlmBaseGenerator from '../../../base/generator';
2
+ export async function generator(tree, options) {
3
+ return await hlmBaseGenerator(tree, { ...options, name: 'date-picker' });
8
4
  }
9
5
  //# sourceMappingURL=generator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../../libs/cli/src/generators/ui/libs/date-picker/generator.ts"],"names":[],"mappings":";;AAIA,8BAEC;;AALD,gFAAuD;AAGhD,KAAK,UAAU,SAAS,CAAC,IAAU,EAAE,OAA+B;IAC1E,OAAO,MAAM,IAAA,mBAAgB,EAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;AAC1E,CAAC"}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../../libs/cli/src/generators/ui/libs/date-picker/generator.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,MAAM,yBAAyB,CAAC;AAGvD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAU,EAAE,OAA+B;IAC1E,OAAO,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;AAC1E,CAAC"}
@@ -1,9 +1,5 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generator = generator;
4
- const tslib_1 = require("tslib");
5
- const generator_1 = tslib_1.__importDefault(require("../../../base/generator"));
6
- async function generator(tree, options) {
7
- return await (0, generator_1.default)(tree, { ...options, name: 'dialog' });
1
+ import hlmBaseGenerator from '../../../base/generator';
2
+ export async function generator(tree, options) {
3
+ return await hlmBaseGenerator(tree, { ...options, name: 'dialog' });
8
4
  }
9
5
  //# sourceMappingURL=generator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../../libs/cli/src/generators/ui/libs/dialog/generator.ts"],"names":[],"mappings":";;AAIA,8BAEC;;AALD,gFAAuD;AAGhD,KAAK,UAAU,SAAS,CAAC,IAAU,EAAE,OAA+B;IAC1E,OAAO,MAAM,IAAA,mBAAgB,EAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;AACrE,CAAC"}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../../libs/cli/src/generators/ui/libs/dialog/generator.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,MAAM,yBAAyB,CAAC;AAGvD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAU,EAAE,OAA+B;IAC1E,OAAO,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;AACrE,CAAC"}
@@ -1,9 +1,5 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generator = generator;
4
- const tslib_1 = require("tslib");
5
- const generator_1 = tslib_1.__importDefault(require("../../../base/generator"));
6
- async function generator(tree, options) {
7
- return await (0, generator_1.default)(tree, { ...options, name: 'dropdown-menu' });
1
+ import hlmBaseGenerator from '../../../base/generator';
2
+ export async function generator(tree, options) {
3
+ return await hlmBaseGenerator(tree, { ...options, name: 'dropdown-menu' });
8
4
  }
9
5
  //# sourceMappingURL=generator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../../libs/cli/src/generators/ui/libs/dropdown-menu/generator.ts"],"names":[],"mappings":";;AAIA,8BAEC;;AALD,gFAAuD;AAGhD,KAAK,UAAU,SAAS,CAAC,IAAU,EAAE,OAA+B;IAC1E,OAAO,MAAM,IAAA,mBAAgB,EAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;AAC5E,CAAC"}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../../libs/cli/src/generators/ui/libs/dropdown-menu/generator.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,MAAM,yBAAyB,CAAC;AAGvD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAU,EAAE,OAA+B;IAC1E,OAAO,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;AAC5E,CAAC"}
@@ -1,9 +1,5 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generator = generator;
4
- const tslib_1 = require("tslib");
5
- const generator_1 = tslib_1.__importDefault(require("../../../base/generator"));
6
- async function generator(tree, options) {
7
- return await (0, generator_1.default)(tree, { ...options, name: 'empty' });
1
+ import hlmBaseGenerator from '../../../base/generator';
2
+ export async function generator(tree, options) {
3
+ return await hlmBaseGenerator(tree, { ...options, name: 'empty' });
8
4
  }
9
5
  //# sourceMappingURL=generator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../../libs/cli/src/generators/ui/libs/empty/generator.ts"],"names":[],"mappings":";;AAIA,8BAEC;;AALD,gFAAuD;AAGhD,KAAK,UAAU,SAAS,CAAC,IAAU,EAAE,OAA+B;IAC1E,OAAO,MAAM,IAAA,mBAAgB,EAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AACpE,CAAC"}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../../libs/cli/src/generators/ui/libs/empty/generator.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,MAAM,yBAAyB,CAAC;AAGvD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAU,EAAE,OAA+B;IAC1E,OAAO,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AACpE,CAAC"}