@salesforce/ui-bundle-template-base-angular-app 11.60.0 → 11.62.1

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 (192) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/package.json +1 -1
  3. package/src/force-app/main/default/uiBundles/base-angular-app/angular.json +2 -7
  4. package/src/force-app/main/default/uiBundles/base-angular-app/components.json +6 -0
  5. package/src/force-app/main/default/uiBundles/base-angular-app/eslint.config.js +9 -1
  6. package/src/force-app/main/default/uiBundles/base-angular-app/package.json +16 -11
  7. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/app.config.ts +4 -6
  8. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/alert/alert.html +9 -13
  9. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/alert/alert.ts +16 -28
  10. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/button/button.html +19 -10
  11. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/button/button.ts +34 -25
  12. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/card/card.ts +40 -50
  13. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/collapsible/collapsible.html +38 -10
  14. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/collapsible/collapsible.ts +6 -11
  15. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/date-picker/date-picker.html +17 -22
  16. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/date-picker/date-picker.ts +29 -21
  17. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/date-range-picker/date-range-picker.html +16 -30
  18. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/date-range-picker/date-range-picker.ts +39 -36
  19. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/dialog/dialog.html +13 -30
  20. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/dialog/dialog.ts +6 -21
  21. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/dropdown-menu/dropdown-menu.html +20 -0
  22. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/dropdown-menu/dropdown-menu.ts +100 -0
  23. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/field/field.html +5 -11
  24. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/field/field.ts +10 -18
  25. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/field-appearance.ts +8 -0
  26. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/icon/icon.ts +62 -0
  27. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/input/input.html +32 -17
  28. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/input/input.ts +57 -14
  29. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/label/label.ts +8 -4
  30. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/paginator/paginator.html +74 -10
  31. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/paginator/paginator.ts +74 -18
  32. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/paginator/types.ts +13 -0
  33. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/popover/popover.html +10 -38
  34. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/popover/popover.ts +12 -15
  35. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/select/select.html +34 -22
  36. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/select/select.ts +25 -34
  37. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/separator/separator.ts +11 -36
  38. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/skeleton/skeleton.ts +5 -9
  39. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/spinner/spinner.ts +14 -21
  40. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/alert/hlm-alert-action.ts +14 -0
  41. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/alert/hlm-alert-description.ts +17 -0
  42. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/alert/hlm-alert-title.ts +17 -0
  43. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/alert/hlm-alert.ts +35 -0
  44. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/alert/index.ts +16 -0
  45. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/button/hlm-button.token.ts +22 -0
  46. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/button/hlm-button.ts +72 -0
  47. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/button/index.ts +6 -0
  48. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/calendar/hlm-calendar-multi.ts +195 -0
  49. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/calendar/hlm-calendar-range.ts +194 -0
  50. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/calendar/hlm-calendar.ts +189 -0
  51. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/calendar/hlm-month-year-calendar.ts +119 -0
  52. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/calendar/index.ts +16 -0
  53. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/card/hlm-card-action.ts +12 -0
  54. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/card/hlm-card-avatar.ts +14 -0
  55. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/card/hlm-card-content.ts +12 -0
  56. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/card/hlm-card-description.ts +12 -0
  57. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/card/hlm-card-footer.ts +12 -0
  58. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/card/hlm-card-header.ts +15 -0
  59. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/card/hlm-card-title.ts +12 -0
  60. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/card/hlm-card.token.ts +19 -0
  61. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/card/hlm-card.ts +22 -0
  62. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/card/index.ts +28 -0
  63. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/collapsible/hlm-collapsible-content.ts +14 -0
  64. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/collapsible/hlm-collapsible-trigger.ts +9 -0
  65. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/collapsible/hlm-collapsible.ts +15 -0
  66. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/collapsible/index.ts +13 -0
  67. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/date-picker/hlm-date-multi-input.ts +104 -0
  68. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/date-picker/hlm-date-picker-anchor.ts +23 -0
  69. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/date-picker/hlm-date-picker-input.ts +118 -0
  70. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/date-picker/hlm-date-picker-multi.token.ts +109 -0
  71. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/date-picker/hlm-date-picker-multi.ts +220 -0
  72. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/date-picker/hlm-date-picker-trigger.ts +104 -0
  73. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/date-picker/hlm-date-picker.token.ts +69 -0
  74. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/date-picker/hlm-date-picker.ts +203 -0
  75. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/date-picker/hlm-date-range-input.ts +120 -0
  76. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/date-picker/hlm-date-range-picker.token.ts +86 -0
  77. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/date-picker/hlm-date-range-picker.ts +252 -0
  78. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/date-picker/hlm-month-year-input.ts +105 -0
  79. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/date-picker/hlm-month-year-picker.token.ts +89 -0
  80. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/date-picker/hlm-month-year-picker.ts +196 -0
  81. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/date-picker/index.ts +38 -0
  82. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dialog/hlm-dialog-close.ts +9 -0
  83. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dialog/hlm-dialog-content.ts +74 -0
  84. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dialog/hlm-dialog-description.ts +17 -0
  85. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dialog/hlm-dialog-footer.ts +15 -0
  86. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dialog/hlm-dialog-header.ts +12 -0
  87. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dialog/hlm-dialog-overlay.ts +27 -0
  88. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dialog/hlm-dialog-portal.ts +8 -0
  89. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dialog/hlm-dialog-title.ts +14 -0
  90. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dialog/hlm-dialog-trigger.ts +14 -0
  91. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dialog/hlm-dialog.service.ts +46 -0
  92. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dialog/hlm-dialog.ts +24 -0
  93. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dialog/index.ts +35 -0
  94. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dropdown-menu/hlm-dropdown-menu-checkbox-indicator.ts +21 -0
  95. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dropdown-menu/hlm-dropdown-menu-checkbox.ts +54 -0
  96. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dropdown-menu/hlm-dropdown-menu-focus-on-hover.ts +35 -0
  97. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dropdown-menu/hlm-dropdown-menu-group.ts +14 -0
  98. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dropdown-menu/hlm-dropdown-menu-item-sub-indicator.ts +19 -0
  99. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dropdown-menu/hlm-dropdown-menu-item.ts +42 -0
  100. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dropdown-menu/hlm-dropdown-menu-label.ts +20 -0
  101. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dropdown-menu/hlm-dropdown-menu-radio-indicator.ts +21 -0
  102. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dropdown-menu/hlm-dropdown-menu-radio.ts +49 -0
  103. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dropdown-menu/hlm-dropdown-menu-separator.ts +12 -0
  104. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dropdown-menu/hlm-dropdown-menu-shortcut.ts +15 -0
  105. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dropdown-menu/hlm-dropdown-menu-sub-trigger.ts +52 -0
  106. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dropdown-menu/hlm-dropdown-menu-sub.ts +53 -0
  107. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dropdown-menu/hlm-dropdown-menu-token.ts +26 -0
  108. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dropdown-menu/hlm-dropdown-menu-trigger.ts +46 -0
  109. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dropdown-menu/hlm-dropdown-menu.ts +57 -0
  110. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/dropdown-menu/index.ts +49 -0
  111. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/field/hlm-field-content.ts +12 -0
  112. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/field/hlm-field-description.ts +53 -0
  113. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/field/hlm-field-error.ts +100 -0
  114. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/field/hlm-field-group.ts +15 -0
  115. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/field/hlm-field-label.ts +17 -0
  116. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/field/hlm-field-legend.ts +19 -0
  117. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/field/hlm-field-separator.ts +24 -0
  118. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/field/hlm-field-set.ts +15 -0
  119. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/field/hlm-field-title.ts +15 -0
  120. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/field/hlm-field.ts +47 -0
  121. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/field/index.ts +34 -0
  122. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/input/hlm-input.ts +21 -0
  123. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/input/index.ts +5 -0
  124. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/input-group/hlm-input-group-addon.ts +40 -0
  125. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/input-group/hlm-input-group-button.ts +47 -0
  126. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/input-group/hlm-input-group-input.ts +17 -0
  127. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/input-group/hlm-input-group-text.ts +14 -0
  128. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/input-group/hlm-input-group.ts +18 -0
  129. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/input-group/index.ts +19 -0
  130. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/label/hlm-label.ts +17 -0
  131. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/label/index.ts +5 -0
  132. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/label/label.html +11 -0
  133. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/pagination/hlm-numbered-pagination-query-params.ts +191 -0
  134. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/pagination/hlm-numbered-pagination.ts +290 -0
  135. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/pagination/hlm-pagination-content.ts +12 -0
  136. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/pagination/hlm-pagination-ellipsis.ts +27 -0
  137. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/pagination/hlm-pagination-item.ts +7 -0
  138. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/pagination/hlm-pagination-link.ts +51 -0
  139. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/pagination/hlm-pagination-next.ts +65 -0
  140. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/pagination/hlm-pagination-previous.ts +65 -0
  141. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/pagination/hlm-pagination.ts +19 -0
  142. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/pagination/index.ts +31 -0
  143. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/popover/hlm-popover-content.ts +25 -0
  144. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/popover/hlm-popover-description.ts +12 -0
  145. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/popover/hlm-popover-header.ts +12 -0
  146. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/popover/hlm-popover-portal.ts +8 -0
  147. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/popover/hlm-popover-title.ts +12 -0
  148. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/popover/hlm-popover-trigger.ts +14 -0
  149. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/popover/hlm-popover.ts +23 -0
  150. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/popover/index.ts +25 -0
  151. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/select/hlm-select-content.ts +44 -0
  152. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/select/hlm-select-group.ts +14 -0
  153. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/select/hlm-select-item.ts +36 -0
  154. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/select/hlm-select-label.ts +14 -0
  155. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/select/hlm-select-multiple.ts +37 -0
  156. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/select/hlm-select-placeholder.ts +17 -0
  157. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/select/hlm-select-portal.ts +8 -0
  158. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/select/hlm-select-scroll-down.ts +22 -0
  159. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/select/hlm-select-scroll-up.ts +22 -0
  160. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/select/hlm-select-separator.ts +14 -0
  161. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/select/hlm-select-trigger.ts +59 -0
  162. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/select/hlm-select-value-template.ts +5 -0
  163. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/select/hlm-select-value.ts +18 -0
  164. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/select/hlm-select-values-content.ts +9 -0
  165. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/select/hlm-select-values.ts +5 -0
  166. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/select/hlm-select.ts +37 -0
  167. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/select/index.ts +52 -0
  168. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/separator/hlm-separator.ts +19 -0
  169. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/separator/index.ts +5 -0
  170. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/skeleton/hlm-skeleton.ts +14 -0
  171. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/skeleton/index.ts +5 -0
  172. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spinner/hlm-spinner.ts +26 -0
  173. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spinner/index.ts +5 -0
  174. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/utils/hlm.ts +313 -0
  175. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/utils/index.ts +2 -0
  176. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/utils/provide-spartan-hlm.ts +34 -0
  177. package/src/force-app/main/default/uiBundles/base-angular-app/src/index.html +0 -1
  178. package/src/force-app/main/default/uiBundles/base-angular-app/src/{styles.scss → styles.css} +7 -38
  179. package/src/force-app/main/default/uiBundles/base-angular-app/tsconfig.json +4 -1
  180. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/_field-size.scss +0 -42
  181. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/button/button.scss +0 -112
  182. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/card/card.scss +0 -34
  183. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/date-picker/date-picker.scss +0 -36
  184. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/date-range-picker/date-range-picker.scss +0 -33
  185. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/input/input.scss +0 -35
  186. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/label/label.html +0 -3
  187. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/select/select.scss +0 -35
  188. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/separator/separator.html +0 -1
  189. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/separator/separator.scss +0 -23
  190. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/skeleton/skeleton.html +0 -1
  191. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/skeleton/skeleton.scss +0 -28
  192. package/src/force-app/main/default/uiBundles/base-angular-app/src/theme.scss +0 -39
@@ -0,0 +1,194 @@
1
+ import { NgTemplateOutlet } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';
3
+ import { NgIcon, provideIcons } from '@ng-icons/core';
4
+ import { lucideChevronLeft, lucideChevronRight } from '@ng-icons/lucide';
5
+ import {
6
+ BrnCalendarImports,
7
+ BrnCalendarRange,
8
+ injectBrnCalendarI18n,
9
+ } from '@spartan-ng/brain/calendar';
10
+ import { injectDateAdapter } from '@spartan-ng/brain/date-time';
11
+ import { buttonVariants, HlmButtonImports } from '@spartan-ng/styles/button';
12
+ import { HlmSelectImports } from '@spartan-ng/styles/select';
13
+ import { classes, hlm } from '@spartan-ng/styles/utils';
14
+
15
+ @Component({
16
+ selector: 'hlm-calendar-range',
17
+ imports: [BrnCalendarImports, NgIcon, HlmSelectImports, NgTemplateOutlet, HlmButtonImports],
18
+ viewProviders: [provideIcons({ lucideChevronLeft, lucideChevronRight })],
19
+ changeDetection: ChangeDetectionStrategy.OnPush,
20
+ hostDirectives: [
21
+ {
22
+ directive: BrnCalendarRange,
23
+ inputs: [
24
+ 'min',
25
+ 'max',
26
+ 'disabled',
27
+ 'startDate',
28
+ 'endDate',
29
+ 'dateDisabled',
30
+ 'weekStartsOn',
31
+ 'highlightDays',
32
+ 'defaultFocusedDate',
33
+ ],
34
+ outputs: ['endDateChange', 'startDateChange'],
35
+ },
36
+ ],
37
+ host: { 'data-slot': 'calendar' },
38
+ template: `
39
+ <div class="inline-flex flex-col space-y-4">
40
+ <!-- Header -->
41
+ <div class="flex w-full items-center justify-between gap-1.5">
42
+ <ng-template #month>
43
+ <hlm-select brnCalendarMonthSelect class="order-1">
44
+ <hlm-select-trigger size="sm" [class]="_selectClass">
45
+ <hlm-select-value />
46
+ </hlm-select-trigger>
47
+ <hlm-select-content *hlmSelectPortal class="max-h-80">
48
+ <hlm-select-group>
49
+ @for (month of _i18n.config().months(); track month) {
50
+ <hlm-select-item [value]="month">{{ month }}</hlm-select-item>
51
+ }
52
+ </hlm-select-group>
53
+ </hlm-select-content>
54
+ </hlm-select>
55
+ </ng-template>
56
+ <ng-template #year>
57
+ <hlm-select brnCalendarYearSelect class="order-3">
58
+ <hlm-select-trigger size="sm" [class]="_selectClass">
59
+ <hlm-select-value />
60
+ </hlm-select-trigger>
61
+ <hlm-select-content *hlmSelectPortal class="max-h-80">
62
+ <hlm-select-group>
63
+ @for (year of _i18n.config().years(); track year) {
64
+ <hlm-select-item [value]="year">{{ year }}</hlm-select-item>
65
+ }
66
+ </hlm-select-group>
67
+ </hlm-select-content>
68
+ </hlm-select>
69
+ </ng-template>
70
+ @let heading = _heading();
71
+
72
+ <button
73
+ brnCalendarPreviousButton
74
+ variant="ghost"
75
+ hlmBtn
76
+ class="order-first size-(--cell-size) p-0 select-none aria-disabled:opacity-50"
77
+ >
78
+ <ng-icon name="lucideChevronLeft" class="rtl:rotate-180" />
79
+ </button>
80
+
81
+ @switch (captionLayout()) {
82
+ @case ('dropdown') {
83
+ <ng-container [ngTemplateOutlet]="month" />
84
+ <ng-container [ngTemplateOutlet]="year" />
85
+ }
86
+ @case ('dropdown-months') {
87
+ <ng-container [ngTemplateOutlet]="month" />
88
+ <div brnCalendarHeader class="order-4 text-sm font-medium">{{ heading.year }}</div>
89
+ }
90
+ @case ('dropdown-years') {
91
+ <div brnCalendarHeader class="order-2 text-sm font-medium">{{ heading.month }}</div>
92
+ <ng-container [ngTemplateOutlet]="year" />
93
+ }
94
+ @case ('label') {
95
+ <div brnCalendarHeader class="order-5 text-sm font-medium">{{ heading.header }}</div>
96
+ }
97
+ }
98
+
99
+ <button
100
+ brnCalendarNextButton
101
+ hlmBtn
102
+ variant="ghost"
103
+ class="order-last size-(--cell-size) p-0 select-none aria-disabled:opacity-50"
104
+ >
105
+ <ng-icon name="lucideChevronRight" class="rtl:rotate-180" />
106
+ </button>
107
+ </div>
108
+
109
+ <table class="w-full border-collapse space-y-1" brnCalendarGrid>
110
+ <thead aria-hidden="true">
111
+ <tr class="flex">
112
+ <th
113
+ *brnCalendarWeekday="let weekday"
114
+ scope="col"
115
+ class="text-muted-foreground flex-1 rounded-(--cell-radius) text-[0.8rem] font-normal select-none"
116
+ [attr.aria-label]="_i18n.config().labelWeekday(weekday)"
117
+ >
118
+ {{ _i18n.config().formatWeekdayName(weekday) }}
119
+ </th>
120
+ </tr>
121
+ </thead>
122
+
123
+ <tbody role="rowgroup">
124
+ <tr *brnCalendarWeek="let week" class="mt-2 flex w-full">
125
+ @for (date of week; track _dateAdapter.getTime(date)) {
126
+ <td
127
+ brnCalendarCell
128
+ 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)"
129
+ >
130
+ <button brnCalendarCellButton [date]="date" [class]="_btnClass">
131
+ {{ _dateAdapter.getDate(date) }}
132
+ </button>
133
+ </td>
134
+ }
135
+ </tr>
136
+ </tbody>
137
+ </table>
138
+ </div>
139
+ `,
140
+ })
141
+ export class HlmCalendarRange<T> {
142
+ /** Show dropdowns to navigate between months or years. */
143
+ public readonly captionLayout = input<
144
+ 'dropdown' | 'label' | 'dropdown-months' | 'dropdown-years'
145
+ >('label');
146
+
147
+ /** Access the calendar i18n */
148
+ protected readonly _i18n = injectBrnCalendarI18n();
149
+
150
+ /** Access the date time adapter */
151
+ protected readonly _dateAdapter = injectDateAdapter<T>();
152
+
153
+ /** Access the calendar directive */
154
+ private readonly _calendar = inject(BrnCalendarRange);
155
+
156
+ /** Get the heading for the current month and year */
157
+ protected readonly _heading = computed(() => {
158
+ const config = this._i18n.config();
159
+ const date = this._calendar.focusedDate();
160
+
161
+ return {
162
+ header: config.formatHeader(
163
+ this._dateAdapter.getMonth(date),
164
+ this._dateAdapter.getYear(date),
165
+ ),
166
+ month: config.formatMonth(this._dateAdapter.getMonth(date)),
167
+ year: config.formatYear(this._dateAdapter.getYear(date)),
168
+ };
169
+ });
170
+
171
+ protected readonly _btnClass = hlm(
172
+ buttonVariants({ variant: 'ghost', size: 'icon' }),
173
+ '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',
174
+ 'data-[outside=true]:opacity-50',
175
+ "data-[highlighted]:before:content-['']",
176
+ 'data-[highlighted]:before:absolute',
177
+ 'data-[highlighted]:before:bottom-1',
178
+ 'data-[highlighted]:before:start-1/2',
179
+ 'data-[highlighted]:before:h-1',
180
+ 'data-[highlighted]:before:w-1',
181
+ 'data-[highlighted]:before:-translate-x-1/2',
182
+ 'data-[highlighted]:before:rounded-full',
183
+ 'data-[highlighted]:before:bg-destructive',
184
+ );
185
+
186
+ protected readonly _selectClass = 'gap-0 px-1.5 py-2 [&>ng-icon]:ms-1';
187
+
188
+ constructor() {
189
+ classes(
190
+ () =>
191
+ 'p-2 [--cell-radius:var(--radius-md)] [--cell-size:--spacing(7)] group/calendar bg-background block in-data-[slot=card-content]:bg-transparent in-data-[slot=popover-content]:bg-transparent',
192
+ );
193
+ }
194
+ }
@@ -0,0 +1,189 @@
1
+ import { NgTemplateOutlet } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';
3
+ import { NgIcon, provideIcons } from '@ng-icons/core';
4
+ import { lucideChevronLeft, lucideChevronRight } from '@ng-icons/lucide';
5
+ import { BrnCalendar, BrnCalendarImports, injectBrnCalendarI18n } from '@spartan-ng/brain/calendar';
6
+ import { injectDateAdapter } from '@spartan-ng/brain/date-time';
7
+ import { buttonVariants, HlmButtonImports } from '@spartan-ng/styles/button';
8
+ import { HlmSelectImports } from '@spartan-ng/styles/select';
9
+ import { classes, hlm } from '@spartan-ng/styles/utils';
10
+
11
+ @Component({
12
+ selector: 'hlm-calendar',
13
+ imports: [BrnCalendarImports, NgIcon, HlmSelectImports, NgTemplateOutlet, HlmButtonImports],
14
+ viewProviders: [provideIcons({ lucideChevronLeft, lucideChevronRight })],
15
+ changeDetection: ChangeDetectionStrategy.OnPush,
16
+ hostDirectives: [
17
+ {
18
+ directive: BrnCalendar,
19
+ inputs: [
20
+ 'min',
21
+ 'max',
22
+ 'disabled',
23
+ 'date',
24
+ 'dateDisabled',
25
+ 'weekStartsOn',
26
+ 'highlightDays',
27
+ 'defaultFocusedDate',
28
+ ],
29
+ outputs: ['dateChange'],
30
+ },
31
+ ],
32
+ host: { 'data-slot': 'calendar' },
33
+ template: `
34
+ <div class="inline-flex flex-col gap-4">
35
+ <!-- Header -->
36
+ <div class="flex w-full items-center justify-between gap-1.5">
37
+ <ng-template #month>
38
+ <hlm-select brnCalendarMonthSelect class="order-1">
39
+ <hlm-select-trigger size="sm" [class]="_selectClass">
40
+ <hlm-select-value />
41
+ </hlm-select-trigger>
42
+ <hlm-select-content *hlmSelectPortal class="max-h-80">
43
+ <hlm-select-group>
44
+ @for (month of _i18n.config().months(); track month) {
45
+ <hlm-select-item [value]="month">{{ month }}</hlm-select-item>
46
+ }
47
+ </hlm-select-group>
48
+ </hlm-select-content>
49
+ </hlm-select>
50
+ </ng-template>
51
+ <ng-template #year>
52
+ <hlm-select brnCalendarYearSelect class="order-3">
53
+ <hlm-select-trigger size="sm" [class]="_selectClass">
54
+ <hlm-select-value />
55
+ </hlm-select-trigger>
56
+ <hlm-select-content *hlmSelectPortal class="max-h-80">
57
+ <hlm-select-group>
58
+ @for (year of _i18n.config().years(); track year) {
59
+ <hlm-select-item [value]="year">{{ year }}</hlm-select-item>
60
+ }
61
+ </hlm-select-group>
62
+ </hlm-select-content>
63
+ </hlm-select>
64
+ </ng-template>
65
+ @let heading = _heading();
66
+
67
+ <button
68
+ brnCalendarPreviousButton
69
+ variant="ghost"
70
+ hlmBtn
71
+ class="order-first size-(--cell-size) p-0 select-none aria-disabled:opacity-50"
72
+ >
73
+ <ng-icon name="lucideChevronLeft" class="rtl:rotate-180" />
74
+ </button>
75
+
76
+ @switch (captionLayout()) {
77
+ @case ('dropdown') {
78
+ <ng-container [ngTemplateOutlet]="month" />
79
+ <ng-container [ngTemplateOutlet]="year" />
80
+ }
81
+ @case ('dropdown-months') {
82
+ <ng-container [ngTemplateOutlet]="month" />
83
+ <div brnCalendarHeader class="order-4 text-sm font-medium">{{ heading.year }}</div>
84
+ }
85
+ @case ('dropdown-years') {
86
+ <div brnCalendarHeader class="order-2 text-sm font-medium">{{ heading.month }}</div>
87
+ <ng-container [ngTemplateOutlet]="year" />
88
+ }
89
+ @case ('label') {
90
+ <div brnCalendarHeader class="order-5 text-sm font-medium">{{ heading.header }}</div>
91
+ }
92
+ }
93
+
94
+ <button
95
+ brnCalendarNextButton
96
+ hlmBtn
97
+ variant="ghost"
98
+ class="order-last size-(--cell-size) p-0 select-none aria-disabled:opacity-50"
99
+ >
100
+ <ng-icon name="lucideChevronRight" class="rtl:rotate-180" />
101
+ </button>
102
+ </div>
103
+
104
+ <table class="w-full border-collapse space-y-1" brnCalendarGrid>
105
+ <thead aria-hidden="true">
106
+ <tr class="flex">
107
+ <th
108
+ *brnCalendarWeekday="let weekday"
109
+ scope="col"
110
+ class="text-muted-foreground flex-1 rounded-(--cell-radius) text-[0.8rem] font-normal select-none"
111
+ [attr.aria-label]="_i18n.config().labelWeekday(weekday)"
112
+ >
113
+ {{ _i18n.config().formatWeekdayName(weekday) }}
114
+ </th>
115
+ </tr>
116
+ </thead>
117
+
118
+ <tbody role="rowgroup">
119
+ <tr *brnCalendarWeek="let week" class="mt-2 flex w-full">
120
+ @for (date of week; track _dateAdapter.getTime(date)) {
121
+ <td
122
+ brnCalendarCell
123
+ 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)"
124
+ >
125
+ <button brnCalendarCellButton [date]="date" [class]="_btnClass">
126
+ {{ _dateAdapter.getDate(date) }}
127
+ </button>
128
+ </td>
129
+ }
130
+ </tr>
131
+ </tbody>
132
+ </table>
133
+ </div>
134
+ `,
135
+ })
136
+ export class HlmCalendar<T> {
137
+ /** Access the calendar i18n */
138
+ protected readonly _i18n = injectBrnCalendarI18n();
139
+
140
+ /** Access the date time adapter */
141
+ protected readonly _dateAdapter = injectDateAdapter<T>();
142
+
143
+ /** Show dropdowns to navigate between months or years. */
144
+ public readonly captionLayout = input<
145
+ 'dropdown' | 'label' | 'dropdown-months' | 'dropdown-years'
146
+ >('label');
147
+
148
+ /** Access the calendar directive */
149
+ private readonly _calendar = inject(BrnCalendar);
150
+
151
+ /** Get the heading for the current month and year */
152
+ protected readonly _heading = computed(() => {
153
+ const config = this._i18n.config();
154
+ const date = this._calendar.focusedDate();
155
+
156
+ return {
157
+ header: config.formatHeader(
158
+ this._dateAdapter.getMonth(date),
159
+ this._dateAdapter.getYear(date),
160
+ ),
161
+ month: config.formatMonth(this._dateAdapter.getMonth(date)),
162
+ year: config.formatYear(this._dateAdapter.getYear(date)),
163
+ };
164
+ });
165
+
166
+ protected readonly _btnClass = hlm(
167
+ buttonVariants({ variant: 'ghost', size: 'icon' }),
168
+ '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',
169
+ 'data-[outside=true]:opacity-50',
170
+ "data-[highlighted]:before:content-['']",
171
+ 'data-[highlighted]:before:absolute',
172
+ 'data-[highlighted]:before:bottom-1',
173
+ 'data-[highlighted]:before:start-1/2',
174
+ 'data-[highlighted]:before:h-1',
175
+ 'data-[highlighted]:before:w-1',
176
+ 'data-[highlighted]:before:-translate-x-1/2',
177
+ 'data-[highlighted]:before:rounded-full',
178
+ 'data-[highlighted]:before:bg-destructive',
179
+ );
180
+
181
+ protected readonly _selectClass = 'gap-0 px-1.5 py-2 [&>ng-icon]:ms-1';
182
+
183
+ constructor() {
184
+ classes(
185
+ () =>
186
+ 'p-2 [--cell-radius:var(--radius-md)] [--cell-size:--spacing(7)] group/calendar bg-background block in-data-[slot=card-content]:bg-transparent in-data-[slot=popover-content]:bg-transparent',
187
+ );
188
+ }
189
+ }
@@ -0,0 +1,119 @@
1
+ import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';
2
+ import { NgIcon, provideIcons } from '@ng-icons/core';
3
+ import { lucideChevronLeft, lucideChevronRight } from '@ng-icons/lucide';
4
+ import {
5
+ BrnCalendarImports,
6
+ BrnMonthYearCalendar,
7
+ injectBrnCalendarI18n,
8
+ } from '@spartan-ng/brain/calendar';
9
+ import { injectDateAdapter } from '@spartan-ng/brain/date-time';
10
+ import { buttonVariants, HlmButtonImports } from '@spartan-ng/styles/button';
11
+ import { classes, hlm } from '@spartan-ng/styles/utils';
12
+
13
+ @Component({
14
+ selector: 'hlm-month-year-calendar',
15
+ imports: [BrnCalendarImports, NgIcon, HlmButtonImports],
16
+ viewProviders: [provideIcons({ lucideChevronLeft, lucideChevronRight })],
17
+ changeDetection: ChangeDetectionStrategy.OnPush,
18
+ hostDirectives: [
19
+ {
20
+ directive: BrnMonthYearCalendar,
21
+ inputs: ['min', 'max', 'disabled', 'date', 'defaultFocusedDate', 'view'],
22
+ outputs: ['dateChange'],
23
+ },
24
+ ],
25
+ host: { 'data-slot': 'month-year-calendar' },
26
+ template: `
27
+ <div class="flex flex-col gap-4">
28
+ <!-- Header -->
29
+ <div class="flex w-full items-center justify-between gap-1.5">
30
+ <button
31
+ brnMonthYearCalendarPreviousButton
32
+ hlmBtn
33
+ variant="ghost"
34
+ class="order-first size-(--cell-size) p-0 select-none aria-disabled:opacity-50"
35
+ >
36
+ <ng-icon name="lucideChevronLeft" class="rtl:rotate-180" />
37
+ </button>
38
+
39
+ <button
40
+ hlmBtn
41
+ variant="ghost"
42
+ class="h-(--cell-size) py-0 select-none aria-disabled:opacity-50"
43
+ brnMonthYearCalendarHeader
44
+ >
45
+ {{ _heading() }}
46
+ </button>
47
+
48
+ <button
49
+ brnMonthYearCalendarNextButton
50
+ hlmBtn
51
+ variant="ghost"
52
+ class="order-last size-(--cell-size) p-0 select-none aria-disabled:opacity-50"
53
+ >
54
+ <ng-icon name="lucideChevronRight" class="rtl:rotate-180" />
55
+ </button>
56
+ </div>
57
+
58
+ <!-- Grid -->
59
+ @switch (_picker.view()) {
60
+ @case ('year') {
61
+ <div brnMonthYearCalendarGrid class="grid grid-cols-4 gap-2">
62
+ @for (year of _picker.years(); track _dateAdapter.getYear(year)) {
63
+ <button brnMonthYearCalendarYearButton [date]="year" [class]="_btnClass">
64
+ {{ _i18n.config().formatYear(_dateAdapter.getYear(year)) }}
65
+ </button>
66
+ }
67
+ </div>
68
+ }
69
+ @case ('month') {
70
+ <div brnMonthYearCalendarGrid class="grid grid-cols-4 gap-2">
71
+ @for (month of _picker.months(); track _dateAdapter.getMonth(month)) {
72
+ <button brnMonthYearCalendarMonthButton [date]="month" [class]="_btnClass">
73
+ {{ _i18n.config().months()[_dateAdapter.getMonth(month)] }}
74
+ </button>
75
+ }
76
+ </div>
77
+ }
78
+ }
79
+ </div>
80
+ `,
81
+ })
82
+ export class HlmMonthYearCalendar<T> {
83
+ /** Access the calendar i18n */
84
+ protected readonly _i18n = injectBrnCalendarI18n();
85
+
86
+ /** Access the date adapter */
87
+ protected readonly _dateAdapter = injectDateAdapter<T>();
88
+
89
+ /** Access the picker directive */
90
+ protected readonly _picker = inject(BrnMonthYearCalendar<T>);
91
+
92
+ /** The heading for the current view. */
93
+ protected readonly _heading = computed(() => {
94
+ const config = this._i18n.config();
95
+
96
+ if (this._picker.view() === 'month') {
97
+ return config.formatYear(this._dateAdapter.getYear(this._picker.focusedDate()));
98
+ }
99
+
100
+ const { start, end } = this._picker.yearRange();
101
+ return `${config.formatYear(start)} – ${config.formatYear(end)}`;
102
+ });
103
+
104
+ protected readonly _btnClass = hlm(
105
+ buttonVariants({ variant: 'ghost' }),
106
+ 'data-[today=true]:bg-muted',
107
+ 'data-[selected=true]:bg-primary data-[selected=true]:text-primary-foreground data-[selected=true]:hover:bg-primary data-[selected=true]:hover:text-primary-foreground',
108
+ 'data-[focused=true]:border-ring data-[focused=true]:ring-ring/50 data-[focused=true]:ring-[3px]',
109
+ 'aria-disabled:pointer-events-none aria-disabled:opacity-50',
110
+ 'h-(--cell-size)',
111
+ );
112
+
113
+ constructor() {
114
+ classes(
115
+ () =>
116
+ 'p-2 [--cell-radius:var(--radius-md)] [--cell-size:--spacing(7)] group/calendar bg-background block in-data-[slot=card-content]:bg-transparent in-data-[slot=popover-content]:bg-transparent',
117
+ );
118
+ }
119
+ }
@@ -0,0 +1,16 @@
1
+ import { HlmCalendar } from './hlm-calendar';
2
+ import { HlmCalendarMulti } from './hlm-calendar-multi';
3
+ import { HlmCalendarRange } from './hlm-calendar-range';
4
+ import { HlmMonthYearCalendar } from './hlm-month-year-calendar';
5
+
6
+ export * from './hlm-calendar';
7
+ export * from './hlm-calendar-multi';
8
+ export * from './hlm-calendar-range';
9
+ export * from './hlm-month-year-calendar';
10
+
11
+ export const HlmCalendarImports = [
12
+ HlmCalendar,
13
+ HlmCalendarMulti,
14
+ HlmCalendarRange,
15
+ HlmMonthYearCalendar,
16
+ ] as const;
@@ -0,0 +1,12 @@
1
+ import { Directive } from '@angular/core';
2
+ import { classes } from '@spartan-ng/styles/utils';
3
+
4
+ @Directive({
5
+ selector: '[hlmCardAction]',
6
+ host: { 'data-slot': 'card-action' },
7
+ })
8
+ export class HlmCardAction {
9
+ constructor() {
10
+ classes(() => 'col-end-[-1] row-span-2 row-start-1 self-start justify-self-end');
11
+ }
12
+ }
@@ -0,0 +1,14 @@
1
+ import { Directive } from '@angular/core';
2
+ import { classes } from '@spartan-ng/styles/utils';
3
+
4
+ @Directive({
5
+ selector: '[hlmCardAvatar]',
6
+ host: { 'data-slot': 'card-avatar' },
7
+ })
8
+ export class HlmCardAvatar {
9
+ constructor() {
10
+ classes(
11
+ () => 'col-start-1 row-span-2 row-start-1 self-center size-10 rounded-full object-cover',
12
+ );
13
+ }
14
+ }
@@ -0,0 +1,12 @@
1
+ import { Directive } from '@angular/core';
2
+ import { classes } from '@spartan-ng/styles/utils';
3
+
4
+ @Directive({
5
+ selector: '[hlmCardContent]',
6
+ host: { 'data-slot': 'card-content' },
7
+ })
8
+ export class HlmCardContent {
9
+ constructor() {
10
+ classes(() => 'px-(--card-spacing)');
11
+ }
12
+ }
@@ -0,0 +1,12 @@
1
+ import { Directive } from '@angular/core';
2
+ import { classes } from '@spartan-ng/styles/utils';
3
+
4
+ @Directive({
5
+ selector: '[hlmCardDescription]',
6
+ host: { 'data-slot': 'card-description' },
7
+ })
8
+ export class HlmCardDescription {
9
+ constructor() {
10
+ classes(() => 'text-muted-foreground text-sm');
11
+ }
12
+ }
@@ -0,0 +1,12 @@
1
+ import { Directive } from '@angular/core';
2
+ import { classes } from '@spartan-ng/styles/utils';
3
+
4
+ @Directive({
5
+ selector: '[hlmCardFooter],hlm-card-footer',
6
+ host: { 'data-slot': 'card-footer' },
7
+ })
8
+ export class HlmCardFooter {
9
+ constructor() {
10
+ classes(() => 'bg-muted/50 rounded-b-xl border-t p-(--card-spacing) flex items-center');
11
+ }
12
+ }
@@ -0,0 +1,15 @@
1
+ import { Directive } from '@angular/core';
2
+ import { classes } from '@spartan-ng/styles/utils';
3
+
4
+ @Directive({
5
+ selector: '[hlmCardHeader],hlm-card-header',
6
+ host: { 'data-slot': 'card-header' },
7
+ })
8
+ export class HlmCardHeader {
9
+ constructor() {
10
+ classes(
11
+ () =>
12
+ 'gap-1 rounded-t-xl px-(--card-spacing) [.border-b]:pb-(--card-spacing) group/card-header @container/card-header grid auto-rows-min items-start has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-avatar]:grid-cols-[auto_1fr] has-data-[slot=card-avatar]:has-data-[slot=card-action]:grid-cols-[auto_1fr_auto] has-data-[slot=card-avatar]:gap-x-3 has-data-[slot=card-description]:grid-rows-[auto_auto]',
13
+ );
14
+ }
15
+ }
@@ -0,0 +1,12 @@
1
+ import { Directive } from '@angular/core';
2
+ import { classes } from '@spartan-ng/styles/utils';
3
+
4
+ @Directive({
5
+ selector: '[hlmCardTitle]',
6
+ host: { 'data-slot': 'card-title' },
7
+ })
8
+ export class HlmCardTitle {
9
+ constructor() {
10
+ classes(() => 'text-base leading-snug font-medium group-data-[size=sm]/card:text-sm');
11
+ }
12
+ }
@@ -0,0 +1,19 @@
1
+ import { inject, InjectionToken, type ValueProvider } from '@angular/core';
2
+
3
+ export type HlmCardConfig = {
4
+ size: 'sm' | 'default';
5
+ };
6
+
7
+ const defaultConfig: HlmCardConfig = {
8
+ size: 'default',
9
+ };
10
+
11
+ const HlmCardConfigToken = new InjectionToken<HlmCardConfig>('HlmCardConfig');
12
+
13
+ export function provideHlmCardConfig(config: Partial<HlmCardConfig>): ValueProvider {
14
+ return { provide: HlmCardConfigToken, useValue: { ...defaultConfig, ...config } };
15
+ }
16
+
17
+ export function injectHlmCardConfig(): HlmCardConfig {
18
+ return inject(HlmCardConfigToken, { optional: true }) ?? defaultConfig;
19
+ }
@@ -0,0 +1,22 @@
1
+ import { Directive, input } from '@angular/core';
2
+ import { classes } from '@spartan-ng/styles/utils';
3
+ import { HlmCardConfig, injectHlmCardConfig } from './hlm-card.token';
4
+
5
+ @Directive({
6
+ selector: '[hlmCard],hlm-card',
7
+ host: {
8
+ 'data-slot': 'card',
9
+ '[attr.data-size]': 'size()',
10
+ },
11
+ })
12
+ export class HlmCard {
13
+ private readonly _defaultConfig = injectHlmCardConfig();
14
+ public readonly size = input<HlmCardConfig['size']>(this._defaultConfig.size);
15
+
16
+ constructor() {
17
+ classes(
18
+ () =>
19
+ 'ring-foreground/10 bg-card text-card-foreground gap-(--card-spacing) overflow-hidden rounded-xl py-(--card-spacing) text-sm ring-1 [--card-spacing:--spacing(4)] has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(3)] data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl group/card flex flex-col',
20
+ );
21
+ }
22
+ }