@salesforce/ui-bundle-template-app-angular-template-b2x 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 (232) hide show
  1. package/dist/CHANGELOG.md +24 -0
  2. package/dist/force-app/main/default/uiBundles/angularextapp/angular.json +2 -7
  3. package/dist/force-app/main/default/uiBundles/angularextapp/components.json +6 -0
  4. package/dist/force-app/main/default/uiBundles/angularextapp/eslint.config.js +9 -1
  5. package/dist/force-app/main/default/uiBundles/angularextapp/package.json +16 -11
  6. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/app.config.ts +4 -6
  7. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/app.routes.ts +2 -2
  8. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/alert/alert.html +9 -13
  9. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/alert/alert.ts +16 -28
  10. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/button/button.html +19 -10
  11. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/button/button.ts +34 -25
  12. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/card/card.ts +40 -50
  13. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/collapsible/collapsible.html +38 -10
  14. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/collapsible/collapsible.ts +6 -11
  15. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-picker/date-picker.html +17 -22
  16. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-picker/date-picker.ts +29 -21
  17. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-range-picker/date-range-picker.html +16 -30
  18. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-range-picker/date-range-picker.ts +39 -36
  19. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/dialog/dialog.html +13 -30
  20. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/dialog/dialog.ts +6 -21
  21. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/dropdown-menu/dropdown-menu.html +20 -0
  22. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/dropdown-menu/dropdown-menu.ts +100 -0
  23. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/field/field.html +5 -11
  24. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/field/field.ts +10 -18
  25. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/field-appearance.ts +8 -0
  26. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/icon/icon.ts +62 -0
  27. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/input/input.html +32 -17
  28. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/input/input.ts +57 -14
  29. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/label/label.ts +8 -4
  30. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/paginator/paginator.html +74 -10
  31. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/paginator/paginator.ts +74 -18
  32. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/paginator/types.ts +13 -0
  33. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/popover/popover.html +10 -38
  34. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/popover/popover.ts +12 -15
  35. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/select/select.html +34 -22
  36. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/select/select.ts +25 -34
  37. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/separator/separator.ts +11 -36
  38. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/skeleton/skeleton.ts +5 -9
  39. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/spinner/spinner.ts +14 -21
  40. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/auth-form/auth-form.html +2 -3
  41. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/menu/auth-menu/auth-menu.html +31 -21
  42. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/menu/auth-menu/auth-menu.ts +6 -18
  43. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/session/session.html +2 -2
  44. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/submit-button/submit-button.html +8 -4
  45. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/submit-button/submit-button.ts +4 -16
  46. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/breadcrumb/breadcrumb.html +4 -24
  47. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/breadcrumb/breadcrumb.ts +3 -16
  48. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/date-filter.ts +1 -1
  49. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/date-range-filter.html +2 -1
  50. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/date-range-filter.ts +6 -15
  51. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/filter-field-wrapper.html +2 -0
  52. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/filter-field-wrapper.ts +2 -17
  53. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/multi-select-filter.html +2 -1
  54. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/numeric-range-filter.ts +3 -21
  55. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/search-filter.html +3 -3
  56. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/search-filter.ts +9 -13
  57. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/select-filter.html +2 -5
  58. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/select-filter.ts +1 -15
  59. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/text-filter.html +2 -5
  60. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/text-filter.ts +3 -17
  61. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/pagination/pagination.ts +4 -20
  62. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/search-bar/search-bar.html +10 -59
  63. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/search-bar/search-bar.ts +13 -93
  64. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/sort-control/sort-control.html +3 -29
  65. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/sort-control/sort-control.ts +5 -12
  66. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/account-detail/account-detail-page.html +1 -23
  67. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/account-detail/account-detail-page.ts +3 -23
  68. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/account-search/account-search-page.html +1 -19
  69. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/account-search/account-search-page.ts +8 -36
  70. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/home/home.html +15 -4
  71. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/home/home.spec.ts +8 -6
  72. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/home/home.ts +56 -4
  73. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/alert/hlm-alert-action.ts +14 -0
  74. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/alert/hlm-alert-description.ts +17 -0
  75. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/alert/hlm-alert-title.ts +17 -0
  76. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/alert/hlm-alert.ts +35 -0
  77. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/alert/index.ts +16 -0
  78. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/button/hlm-button.token.ts +22 -0
  79. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/button/hlm-button.ts +72 -0
  80. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/button/index.ts +6 -0
  81. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/calendar/hlm-calendar-multi.ts +195 -0
  82. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/calendar/hlm-calendar-range.ts +194 -0
  83. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/calendar/hlm-calendar.ts +189 -0
  84. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/calendar/hlm-month-year-calendar.ts +119 -0
  85. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/calendar/index.ts +16 -0
  86. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/card/hlm-card-action.ts +12 -0
  87. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/card/hlm-card-avatar.ts +14 -0
  88. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/card/hlm-card-content.ts +12 -0
  89. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/card/hlm-card-description.ts +12 -0
  90. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/card/hlm-card-footer.ts +12 -0
  91. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/card/hlm-card-header.ts +15 -0
  92. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/card/hlm-card-title.ts +12 -0
  93. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/card/hlm-card.token.ts +19 -0
  94. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/card/hlm-card.ts +22 -0
  95. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/card/index.ts +28 -0
  96. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/collapsible/hlm-collapsible-content.ts +14 -0
  97. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/collapsible/hlm-collapsible-trigger.ts +9 -0
  98. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/collapsible/hlm-collapsible.ts +15 -0
  99. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/collapsible/index.ts +13 -0
  100. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-date-multi-input.ts +104 -0
  101. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-date-picker-anchor.ts +23 -0
  102. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-date-picker-input.ts +118 -0
  103. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-date-picker-multi.token.ts +109 -0
  104. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-date-picker-multi.ts +220 -0
  105. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-date-picker-trigger.ts +104 -0
  106. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-date-picker.token.ts +69 -0
  107. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-date-picker.ts +203 -0
  108. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-date-range-input.ts +120 -0
  109. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-date-range-picker.token.ts +86 -0
  110. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-date-range-picker.ts +252 -0
  111. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-month-year-input.ts +105 -0
  112. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-month-year-picker.token.ts +89 -0
  113. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-month-year-picker.ts +196 -0
  114. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/index.ts +38 -0
  115. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/hlm-dialog-close.ts +9 -0
  116. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/hlm-dialog-content.ts +74 -0
  117. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/hlm-dialog-description.ts +17 -0
  118. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/hlm-dialog-footer.ts +15 -0
  119. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/hlm-dialog-header.ts +12 -0
  120. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/hlm-dialog-overlay.ts +27 -0
  121. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/hlm-dialog-portal.ts +8 -0
  122. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/hlm-dialog-title.ts +14 -0
  123. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/hlm-dialog-trigger.ts +14 -0
  124. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/hlm-dialog.service.ts +46 -0
  125. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/hlm-dialog.ts +24 -0
  126. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/index.ts +35 -0
  127. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-checkbox-indicator.ts +21 -0
  128. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-checkbox.ts +54 -0
  129. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-focus-on-hover.ts +35 -0
  130. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-group.ts +14 -0
  131. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-item-sub-indicator.ts +19 -0
  132. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-item.ts +42 -0
  133. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-label.ts +20 -0
  134. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-radio-indicator.ts +21 -0
  135. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-radio.ts +49 -0
  136. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-separator.ts +12 -0
  137. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-shortcut.ts +15 -0
  138. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-sub-trigger.ts +52 -0
  139. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-sub.ts +53 -0
  140. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-token.ts +26 -0
  141. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-trigger.ts +46 -0
  142. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu.ts +57 -0
  143. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/index.ts +49 -0
  144. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/field/hlm-field-content.ts +12 -0
  145. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/field/hlm-field-description.ts +53 -0
  146. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/field/hlm-field-error.ts +100 -0
  147. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/field/hlm-field-group.ts +15 -0
  148. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/field/hlm-field-label.ts +17 -0
  149. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/field/hlm-field-legend.ts +19 -0
  150. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/field/hlm-field-separator.ts +24 -0
  151. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/field/hlm-field-set.ts +15 -0
  152. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/field/hlm-field-title.ts +15 -0
  153. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/field/hlm-field.ts +47 -0
  154. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/field/index.ts +34 -0
  155. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/input/hlm-input.ts +21 -0
  156. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/input/index.ts +5 -0
  157. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/input-group/hlm-input-group-addon.ts +40 -0
  158. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/input-group/hlm-input-group-button.ts +47 -0
  159. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/input-group/hlm-input-group-input.ts +17 -0
  160. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/input-group/hlm-input-group-text.ts +14 -0
  161. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/input-group/hlm-input-group.ts +18 -0
  162. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/input-group/index.ts +19 -0
  163. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/label/hlm-label.ts +17 -0
  164. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/label/index.ts +5 -0
  165. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/label/label.html +11 -0
  166. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/pagination/hlm-numbered-pagination-query-params.ts +191 -0
  167. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/pagination/hlm-numbered-pagination.ts +290 -0
  168. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/pagination/hlm-pagination-content.ts +12 -0
  169. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/pagination/hlm-pagination-ellipsis.ts +27 -0
  170. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/pagination/hlm-pagination-item.ts +7 -0
  171. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/pagination/hlm-pagination-link.ts +51 -0
  172. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/pagination/hlm-pagination-next.ts +65 -0
  173. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/pagination/hlm-pagination-previous.ts +65 -0
  174. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/pagination/hlm-pagination.ts +19 -0
  175. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/pagination/index.ts +31 -0
  176. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/popover/hlm-popover-content.ts +25 -0
  177. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/popover/hlm-popover-description.ts +12 -0
  178. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/popover/hlm-popover-header.ts +12 -0
  179. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/popover/hlm-popover-portal.ts +8 -0
  180. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/popover/hlm-popover-title.ts +12 -0
  181. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/popover/hlm-popover-trigger.ts +14 -0
  182. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/popover/hlm-popover.ts +23 -0
  183. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/popover/index.ts +25 -0
  184. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-content.ts +44 -0
  185. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-group.ts +14 -0
  186. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-item.ts +36 -0
  187. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-label.ts +14 -0
  188. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-multiple.ts +37 -0
  189. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-placeholder.ts +17 -0
  190. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-portal.ts +8 -0
  191. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-scroll-down.ts +22 -0
  192. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-scroll-up.ts +22 -0
  193. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-separator.ts +14 -0
  194. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-trigger.ts +59 -0
  195. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-value-template.ts +5 -0
  196. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-value.ts +18 -0
  197. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-values-content.ts +9 -0
  198. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-values.ts +5 -0
  199. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select.ts +37 -0
  200. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/index.ts +52 -0
  201. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/separator/hlm-separator.ts +19 -0
  202. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/separator/index.ts +5 -0
  203. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/skeleton/hlm-skeleton.ts +14 -0
  204. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/skeleton/index.ts +5 -0
  205. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spinner/hlm-spinner.ts +26 -0
  206. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spinner/index.ts +5 -0
  207. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/utils/hlm.ts +313 -0
  208. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/utils/index.ts +2 -0
  209. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/utils/provide-spartan-hlm.ts +34 -0
  210. package/dist/force-app/main/default/uiBundles/angularextapp/src/index.html +0 -1
  211. package/dist/force-app/main/default/uiBundles/angularextapp/src/{styles.scss → styles.css} +7 -38
  212. package/dist/force-app/main/default/uiBundles/angularextapp/tsconfig.json +4 -1
  213. package/dist/package-lock.json +2 -2
  214. package/dist/package.json +1 -1
  215. package/package.json +1 -1
  216. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/_field-size.scss +0 -42
  217. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/button/button.scss +0 -112
  218. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/card/card.scss +0 -34
  219. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-picker/date-picker.scss +0 -36
  220. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-range-picker/date-range-picker.scss +0 -33
  221. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/input/input.scss +0 -35
  222. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/label/label.html +0 -3
  223. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/select/select.scss +0 -35
  224. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/separator/separator.html +0 -1
  225. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/separator/separator.scss +0 -23
  226. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/skeleton/skeleton.html +0 -1
  227. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/skeleton/skeleton.scss +0 -28
  228. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/submit-button/submit-button.scss +0 -17
  229. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/account-detail/account-detail-page.scss +0 -7
  230. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/home/home-page.html +0 -18
  231. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/home/home-page.ts +0 -47
  232. package/dist/force-app/main/default/uiBundles/angularextapp/src/theme.scss +0 -39
package/dist/CHANGELOG.md CHANGED
@@ -3,6 +3,30 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [11.62.1](https://github.com/salesforce-experience-platform-emu/webapps/compare/v11.62.0...v11.62.1) (2026-08-17)
7
+
8
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
9
+
10
+
11
+
12
+
13
+
14
+ ## [11.62.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v11.61.0...v11.62.0) (2026-08-17)
15
+
16
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
17
+
18
+
19
+
20
+
21
+
22
+ ## [11.61.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v11.60.0...v11.61.0) (2026-08-17)
23
+
24
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
25
+
26
+
27
+
28
+
29
+
6
30
  ## [11.60.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v11.59.2...v11.60.0) (2026-08-17)
7
31
 
8
32
  **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
@@ -14,7 +14,7 @@
14
14
  "projectType": "application",
15
15
  "schematics": {
16
16
  "@schematics/angular:component": {
17
- "style": "scss"
17
+ "style": "css"
18
18
  }
19
19
  },
20
20
  "root": "",
@@ -37,12 +37,7 @@
37
37
  "input": "public"
38
38
  }
39
39
  ],
40
- "styles": ["src/theme.scss", "src/styles.scss"],
41
- "stylePreprocessorOptions": {
42
- "sass": {
43
- "silenceDeprecations": ["import"]
44
- }
45
- },
40
+ "styles": ["src/styles.css"],
46
41
  "plugins": []
47
42
  },
48
43
  "configurations": {
@@ -0,0 +1,6 @@
1
+ {
2
+ "$schema": "node_modules/@spartan-ng/cli/src/generators/ui/schema.json",
3
+ "componentsPath": "src/app/shared",
4
+ "importAlias": "@spartan-ng/styles",
5
+ "style": "nova"
6
+ }
@@ -12,7 +12,15 @@ const angularGraphqlPlugin = createPlugin({ schemaPath });
12
12
  export default tseslint.config(
13
13
  // Global ignores
14
14
  {
15
- ignores: ['dist/**/*', '.angular/**/*', 'coverage/**/*', 'node_modules/**/*'],
15
+ ignores: [
16
+ 'dist/**/*',
17
+ '.angular/**/*',
18
+ 'coverage/**/*',
19
+ 'node_modules/**/*',
20
+ // Vendored Spartan primitives use upstream hlm*/brn* selectors and are
21
+ // not authored here, so they can't satisfy the app-prefix/a11y rules.
22
+ '**/shared/**',
23
+ ],
16
24
  },
17
25
  // TypeScript files
18
26
  {
@@ -9,28 +9,32 @@
9
9
  "scripts": {
10
10
  "dev": "sf-angular-serve",
11
11
  "dev:design": "sf-angular-serve --design",
12
- "build": "ng build",
12
+ "build": "ng lint && ng build",
13
13
  "watch": "ng build --watch --configuration development",
14
14
  "test": "ng test",
15
15
  "lint": "ng lint",
16
- "build:e2e": "ng build && node scripts/rewrite-e2e-assets.mjs",
16
+ "build:e2e": "ng lint && ng build && node scripts/rewrite-e2e-assets.mjs",
17
17
  "e2e": "playwright test",
18
18
  "graphql:schema": "node scripts/get-graphql-schema.mjs",
19
19
  "graphql:codegen": "graphql-codegen"
20
20
  },
21
21
  "dependencies": {
22
- "@angular/animations": "^21.2.0",
23
22
  "@angular/cdk": "^21.2.0",
24
23
  "@angular/common": "^21.2.0",
25
24
  "@angular/compiler": "^21.2.0",
26
25
  "@angular/core": "^21.2.0",
27
26
  "@angular/forms": "^21.2.0",
28
- "@angular/material": "^21.2.0",
29
27
  "@angular/platform-browser": "^21.2.0",
30
28
  "@angular/router": "^21.2.0",
31
- "@salesforce/angular-plugin-ui-bundle": "^11.60.0",
32
- "@salesforce/platform-sdk": "^11.60.0",
29
+ "@ng-icons/core": "^32.2.0",
30
+ "@ng-icons/lucide": "^32.2.0",
31
+ "@salesforce/angular-plugin-ui-bundle": "^11.62.1",
32
+ "@salesforce/platform-sdk": "^11.62.1",
33
+ "@spartan-ng/brain": "^1.3.1",
34
+ "class-variance-authority": "^0.7.1",
35
+ "clsx": "^2.1.1",
33
36
  "rxjs": "~7.8.0",
37
+ "tailwind-merge": "^3.5.0",
34
38
  "tslib": "^2.3.0"
35
39
  },
36
40
  "devDependencies": {
@@ -40,11 +44,16 @@
40
44
  "@angular/cli": "^21.2.11",
41
45
  "@angular/compiler-cli": "^21.2.0",
42
46
  "@eslint/js": "^9.0.0",
47
+ "@graphql-codegen/cli": "^6.1.0",
48
+ "@graphql-codegen/typescript-operations": "^5.0.6",
43
49
  "@graphql-eslint/eslint-plugin": "^4.1.0",
44
50
  "@playwright/test": "^1.49.0",
51
+ "@spartan-ng/cli": "^1.3.1",
45
52
  "@tailwindcss/postcss": "^4.0.0",
46
53
  "angular-eslint": "^21.0.0",
47
54
  "eslint": "^9.0.0",
55
+ "graphql": "^16.11.0",
56
+ "graphql-codegen-typescript-operation-types": "^2.0.2",
48
57
  "jsdom": "^28.0.0",
49
58
  "postcss": "^8.5.0",
50
59
  "serve": "^14.2.5",
@@ -52,11 +61,7 @@
52
61
  "typescript": "~5.9.2",
53
62
  "typescript-eslint": "^8.0.0",
54
63
  "vitest": "^4.1.0",
55
- "@salesforce/graphiti": "^11.60.0",
56
- "@graphql-codegen/cli": "^6.1.0",
57
- "@graphql-codegen/typescript-operations": "^5.0.6",
58
- "graphql": "^16.11.0",
59
- "graphql-codegen-typescript-operation-types": "^2.0.2"
64
+ "@salesforce/graphiti": "^11.62.1"
60
65
  },
61
66
  "overrides": {
62
67
  "undici": "^7.28.0"
@@ -5,8 +5,8 @@
5
5
  */
6
6
  import { ApplicationConfig, provideBrowserGlobalErrorListeners } from '@angular/core';
7
7
  import { provideRouter } from '@angular/router';
8
- import { provideAnimationsAsync } from '@angular/platform-browser/animations/async';
9
- import { provideNativeDateAdapter } from '@angular/material/core';
8
+ import { provideNativeDateAdapter as provideBrnNativeDateAdapter } from '@spartan-ng/brain/date-time';
9
+ import { provideNgIconsConfig } from '@ng-icons/core';
10
10
 
11
11
  import { routes } from './app.routes';
12
12
 
@@ -14,9 +14,7 @@ export const appConfig: ApplicationConfig = {
14
14
  providers: [
15
15
  provideBrowserGlobalErrorListeners(),
16
16
  provideRouter(routes),
17
- provideAnimationsAsync(),
18
- // Enables mat-datepicker (used by the object-search Date / DateRange
19
- // filters) with the browser's native Date, avoiding a moment/luxon dep.
20
- provideNativeDateAdapter(),
17
+ provideBrnNativeDateAdapter(),
18
+ provideNgIconsConfig({ size: '1rem' }),
21
19
  ],
22
20
  };
@@ -1,4 +1,5 @@
1
1
  import { Routes } from '@angular/router';
2
+ import { HomeComponent } from './pages/home/home';
2
3
  import { NotFoundComponent } from './pages/not-found/not-found';
3
4
  import { authGuard } from "./features/authentication/auth/auth.guard";
4
5
  import { LoginPageComponent } from "./pages/login/login-page";
@@ -8,7 +9,6 @@ import { ResetPasswordPageComponent } from "./pages/reset-password/reset-passwor
8
9
  import { ProfilePageComponent } from "./pages/profile/profile-page";
9
10
  import { ChangePasswordPageComponent } from "./pages/change-password/change-password-page";
10
11
  import { AppLayoutComponent } from "./components/layout/app-layout/app-layout";
11
- import { HomePageComponent } from "./pages/home/home-page";
12
12
  import { AccountSearchPageComponent } from "./pages/account-search/account-search-page";
13
13
  import { AccountDetailPageComponent } from "./pages/account-detail/account-detail-page";
14
14
 
@@ -19,7 +19,7 @@ export const routes: Routes = [
19
19
  children: [
20
20
  {
21
21
  path: "",
22
- component: HomePageComponent,
22
+ component: HomeComponent,
23
23
  data: { showInNavigation: true, label: "Home" }
24
24
  },
25
25
  {
@@ -1,16 +1,18 @@
1
1
  @if (icon()) {
2
- <mat-icon class="row-span-2 translate-y-0.5 !size-4 !text-base leading-4" aria-hidden="true">{{
3
- icon()
4
- }}</mat-icon>
2
+ <ng-icon
3
+ [name]="icon()"
4
+ class="row-span-2 translate-y-0.5 size-4 text-base leading-4"
5
+ aria-hidden="true"
6
+ />
5
7
  }
8
+ <ng-content select="[icon]" />
6
9
 
7
10
  @if (title()) {
8
- <div data-slot="alert-title" class="col-start-2 font-medium">{{ title() }}</div>
11
+ <div hlmAlertTitle>{{ title() }}</div>
9
12
  }
10
13
  @if (description()) {
11
14
  <div
12
- data-slot="alert-description"
13
- class="col-start-2 text-sm"
15
+ hlmAlertDescription
14
16
  [class.text-muted-foreground]="variant() === 'default'"
15
17
  [class.text-destructive]="variant() === 'destructive'"
16
18
  >
@@ -18,14 +20,8 @@
18
20
  </div>
19
21
  }
20
22
 
21
- <!--
22
- Default slot for callers that project body content (e.g. app-status-alert
23
- composing a message with a link) instead of the `description` input. Sits in
24
- the second grid column to align with the icon. Inert when only inputs are used.
25
- -->
26
- <div class="col-start-2 text-sm">
23
+ <div class="text-sm empty:hidden group-has-[>ng-icon]/alert:col-start-2">
27
24
  <ng-content />
28
25
  </div>
29
26
 
30
- <!-- Optional caller-owned trailing control, pinned top-right. -->
31
27
  <ng-content select="app-alert-action" />
@@ -3,51 +3,39 @@
3
3
  * All rights reserved.
4
4
  * For full license text, see the LICENSE.txt file
5
5
  */
6
- import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';
7
- import { MatIconModule } from '@angular/material/icon';
6
+ import { ChangeDetectionStrategy, Component, input } from '@angular/core';
7
+ import { NgIcon, provideIcons } from '@ng-icons/core';
8
+ import {
9
+ HlmAlert,
10
+ HlmAlertAction,
11
+ HlmAlertDescription,
12
+ HlmAlertTitle,
13
+ } from '@spartan-ng/styles/alert';
14
+ import { APP_ICONS, type AppIconName } from '../icon/icon';
8
15
 
9
- /** Visual variant. */
10
16
  export type AppAlertVariant = 'default' | 'destructive';
11
17
 
12
- const BASE_CLASSES =
13
- 'relative w-full grid grid-cols-[auto_1fr] items-start gap-x-2 gap-y-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-[app-alert-action]:pr-18';
14
- const VARIANT_CLASSES: Record<AppAlertVariant, string> = {
15
- default: 'bg-card text-card-foreground',
16
- destructive: 'bg-card text-destructive',
17
- };
18
-
19
- /** Alert banner. Optional trailing control via the `app-alert-action` slot. */
20
18
  @Component({
21
19
  selector: 'app-alert',
22
20
  changeDetection: ChangeDetectionStrategy.OnPush,
23
- imports: [MatIconModule],
21
+ imports: [NgIcon, HlmAlertTitle, HlmAlertDescription],
22
+ providers: [provideIcons(APP_ICONS)],
23
+ hostDirectives: [{ directive: HlmAlert, inputs: ['variant'] }],
24
24
  templateUrl: './alert.html',
25
- host: {
26
- 'data-slot': 'alert',
27
- role: 'alert',
28
- '[class]': 'hostClass()',
29
- },
30
25
  })
31
26
  export class AlertComponent {
32
27
  readonly variant = input<AppAlertVariant>('default');
33
28
  readonly title = input<string>('');
34
29
  readonly description = input<string>('');
35
- /** Material icon ligature name, e.g. `info`, `error`, `warning`. */
36
- readonly icon = input<string>('');
37
-
38
- protected readonly hostClass = computed(
39
- () => `${BASE_CLASSES} ${VARIANT_CLASSES[this.variant()]}`,
40
- );
30
+ readonly icon = input<AppIconName | ''>('');
41
31
  }
42
32
 
43
- /** Trailing action slot for `app-alert`, pinned to the top-right. */
44
33
  @Component({
45
34
  selector: 'app-alert-action',
46
35
  changeDetection: ChangeDetectionStrategy.OnPush,
36
+ hostDirectives: [HlmAlertAction],
47
37
  template: '<ng-content />',
48
- host: {
49
- 'data-slot': 'alert-action',
50
- class: 'absolute top-2 right-2',
51
- },
52
38
  })
53
39
  export class AlertActionComponent {}
40
+
41
+ export const AlertImports = [AlertComponent, AlertActionComponent] as const;
@@ -1,18 +1,27 @@
1
1
  <button
2
- [matButton]="matAppearance()"
3
- [class]="buttonClass()"
4
- [class.destructive]="isDestructive()"
2
+ hlmBtn
3
+ [variant]="hlmVariant()"
4
+ [size]="size()"
5
+ [disabled]="disabled() || loading()"
5
6
  [type]="type()"
6
- [disabled]="disabled()"
7
7
  [attr.aria-label]="ariaLabel()"
8
8
  [attr.aria-expanded]="ariaExpanded()"
9
+ [attr.aria-busy]="loading() || null"
10
+ [class]="classes()"
9
11
  (click)="clicked.emit($event)"
10
12
  >
11
- @if (icon()) {
12
- <mat-icon aria-hidden="true">{{ icon() }}</mat-icon>
13
- }
14
- <ng-content />
15
- @if (iconEnd()) {
16
- <mat-icon aria-hidden="true" iconPositionEnd>{{ iconEnd() }}</mat-icon>
13
+ @if (loading()) {
14
+ <app-spinner data-icon="inline-start" class="flex items-center" aria-hidden="true" />
15
+ @if (loadingLabel()) {
16
+ {{ loadingLabel() }}
17
+ }
18
+ } @else {
19
+ @if (icon()) {
20
+ <ng-icon [name]="icon()" class="size-4" aria-hidden="true" />
21
+ }
22
+ <ng-content />
23
+ @if (iconEnd()) {
24
+ <ng-icon [name]="iconEnd()" class="size-4" aria-hidden="true" />
25
+ }
17
26
  }
18
27
  </button>
@@ -3,14 +3,20 @@
3
3
  * All rights reserved.
4
4
  * For full license text, see the LICENSE.txt file
5
5
  */
6
- import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';
7
- import { MatButtonModule, type MatButtonAppearance } from '@angular/material/button';
8
- import { MatIconModule } from '@angular/material/icon';
6
+ import {
7
+ ChangeDetectionStrategy,
8
+ Component,
9
+ booleanAttribute,
10
+ computed,
11
+ input,
12
+ output,
13
+ } from '@angular/core';
14
+ import { NgIcon, provideIcons } from '@ng-icons/core';
15
+ import { HlmButtonImports } from '@spartan-ng/styles/button';
16
+ import { APP_ICONS, type AppIconName } from '../icon/icon';
17
+ import { SpinnerComponent } from '../spinner/spinner';
9
18
 
10
- /** Material's appearances plus `destructive`, which Material doesn't provide. */
11
- export type AppButtonAppearance = MatButtonAppearance | 'destructive';
12
-
13
- /** Button size variants. */
19
+ export type AppButtonAppearance = 'filled' | 'outlined' | 'text' | 'destructive';
14
20
  export type AppButtonSize =
15
21
  | 'default'
16
22
  | 'xs'
@@ -21,37 +27,40 @@ export type AppButtonSize =
21
27
  | 'icon-sm'
22
28
  | 'icon-lg';
23
29
 
24
- /**
25
- * Thin wrapper over `matButton`. Adds a `destructive` appearance and a `size`
26
- * scale Material lacks; inputs drive the inner button (a host class/aria attr
27
- * would land on `<app-button>`, not the real `<button>`).
28
- */
30
+ const APPEARANCE_TO_VARIANT: Record<AppButtonAppearance, string> = {
31
+ filled: 'default',
32
+ outlined: 'outline',
33
+ text: 'ghost',
34
+ destructive: 'destructive',
35
+ };
36
+
29
37
  @Component({
30
38
  selector: 'app-button',
31
39
  changeDetection: ChangeDetectionStrategy.OnPush,
32
- imports: [MatButtonModule, MatIconModule],
40
+ imports: [HlmButtonImports, NgIcon, SpinnerComponent],
41
+ providers: [provideIcons(APP_ICONS)],
33
42
  templateUrl: './button.html',
34
- styleUrl: './button.scss',
35
43
  })
36
44
  export class ButtonComponent {
37
45
  readonly appearance = input<AppButtonAppearance>('filled');
38
46
  readonly size = input<AppButtonSize>('default');
39
47
  readonly type = input<'button' | 'submit' | 'reset'>('button');
40
- readonly disabled = input<boolean>(false);
48
+ readonly disabled = input(false, { transform: booleanAttribute });
49
+ // While loading the button is disabled and shows a spinner; loadingLabel
50
+ // replaces the content (empty label => spinner only).
51
+ readonly loading = input(false, { transform: booleanAttribute });
52
+ readonly loadingLabel = input<string>('');
41
53
  readonly ariaLabel = input<string>();
42
54
  readonly ariaExpanded = input<boolean>();
43
- /** Extra classes for the inner button — `class` on the host forwards here. */
44
55
  readonly classes = input<string>('', { alias: 'class' });
45
- /** Leading / trailing Material icon ligature names, e.g. `search`. */
46
- readonly icon = input<string>('');
47
- readonly iconEnd = input<string>('');
56
+ readonly icon = input<AppIconName | ''>('');
57
+ readonly iconEnd = input<AppIconName | ''>('');
48
58
  readonly clicked = output<MouseEvent>();
49
59
 
50
- /** `destructive` renders as a filled button carrying the destructive class. */
51
- protected readonly matAppearance = computed<MatButtonAppearance>(() =>
52
- this.appearance() === 'destructive' ? 'filled' : (this.appearance() as MatButtonAppearance),
60
+ protected readonly hlmVariant = computed(
61
+ () =>
62
+ APPEARANCE_TO_VARIANT[this.appearance()] as 'default' | 'outline' | 'ghost' | 'destructive',
53
63
  );
54
- protected readonly isDestructive = computed(() => this.appearance() === 'destructive');
55
- /** Size class merged with any caller-supplied classes, applied to the button. */
56
- protected readonly buttonClass = computed(() => `size-${this.size()} ${this.classes()}`.trim());
57
64
  }
65
+
66
+ export const ButtonImports = [ButtonComponent] as const;
@@ -5,106 +5,96 @@
5
5
  */
6
6
  import { ChangeDetectionStrategy, Component, input } from '@angular/core';
7
7
  import {
8
- MatCard,
9
- MatCardActions,
10
- MatCardContent,
11
- MatCardHeader,
12
- MatCardSubtitle,
13
- MatCardTitle,
14
- } from '@angular/material/card';
8
+ HlmCard,
9
+ HlmCardAction,
10
+ HlmCardAvatar,
11
+ HlmCardContent,
12
+ HlmCardDescription,
13
+ HlmCardFooter,
14
+ HlmCardHeader,
15
+ HlmCardTitle,
16
+ } from '@spartan-ng/styles/card';
15
17
 
16
- /** Card container density. */
17
18
  export type AppCardSize = 'default' | 'sm';
18
19
 
19
- /**
20
- * Thin wrapper over `mat-card`. Preserves the `app-card` / `app-card-*` slot API
21
- * while Material drives the visual. `size="sm"` maps to a compact-padding class.
22
- */
23
20
  @Component({
24
21
  selector: 'app-card',
25
22
  changeDetection: ChangeDetectionStrategy.OnPush,
26
- imports: [MatCard],
27
- template:
28
- '<mat-card appearance="outlined" [class]="classes()" [class.app-card-sm]="size() === \'sm\'"><ng-content /></mat-card>',
29
- styleUrl: './card.scss',
23
+ hostDirectives: [{ directive: HlmCard, inputs: ['size'] }],
24
+ host: { '[class]': 'classes()' },
25
+ template: '<ng-content />',
30
26
  })
31
27
  export class CardComponent {
32
28
  readonly size = input<AppCardSize>('default');
33
- /** Extra classes forwarded to the inner `mat-card` (host `class` lands here). */
34
29
  readonly classes = input<string>('', { alias: 'class' });
35
30
  }
36
31
 
37
- /**
38
- * Header slot — wraps `mat-card-header` and recreates its title/subtitle stack
39
- * so the slots project by element selector (Material's static
40
- * `[mat-card-title]` projection can't see the runtime attribute across this
41
- * boundary, and would otherwise render title + subtitle side by side).
42
- */
43
32
  @Component({
44
33
  selector: 'app-card-header',
45
34
  changeDetection: ChangeDetectionStrategy.OnPush,
46
- imports: [MatCardHeader],
47
- template: `<mat-card-header [class]="classes()">
48
- <ng-content select="[mat-card-avatar]" />
49
- <div class="app-card-header-text">
50
- <ng-content select="app-card-title" />
51
- <ng-content select="app-card-description" />
52
- </div>
53
- <ng-content />
54
- </mat-card-header>`,
55
- styles: '.app-card-header-text { display: flex; flex-direction: column; gap: 0.25rem; }',
35
+ hostDirectives: [HlmCardHeader],
36
+ host: { '[class]': 'classes()' },
37
+ template: '<ng-content />',
56
38
  })
57
39
  export class CardHeaderComponent {
58
- /** Extra classes forwarded to the inner `mat-card-header`. */
59
40
  readonly classes = input<string>('', { alias: 'class' });
60
41
  }
61
42
 
62
- /** Title slot — Material's `MatCardTitle` styling. */
63
43
  @Component({
64
44
  selector: 'app-card-title',
65
45
  changeDetection: ChangeDetectionStrategy.OnPush,
66
- hostDirectives: [MatCardTitle],
46
+ hostDirectives: [HlmCardTitle],
67
47
  template: '<ng-content />',
68
48
  })
69
49
  export class CardTitleComponent {}
70
50
 
71
- /** Description slot — Material's `mat-card-subtitle` styling. */
72
51
  @Component({
73
52
  selector: 'app-card-description',
74
53
  changeDetection: ChangeDetectionStrategy.OnPush,
75
- hostDirectives: [MatCardSubtitle],
54
+ hostDirectives: [HlmCardDescription],
76
55
  template: '<ng-content />',
77
56
  })
78
57
  export class CardDescriptionComponent {}
79
58
 
80
- /** Action slot — pinned to the trailing edge of `app-card-header`. */
59
+ @Component({
60
+ selector: 'app-card-avatar',
61
+ changeDetection: ChangeDetectionStrategy.OnPush,
62
+ hostDirectives: [HlmCardAvatar],
63
+ template: '<ng-content />',
64
+ })
65
+ export class CardAvatarComponent {}
66
+
81
67
  @Component({
82
68
  selector: 'app-card-action',
83
69
  changeDetection: ChangeDetectionStrategy.OnPush,
84
- host: { style: 'margin-inline-start: auto; align-self: flex-start;' },
70
+ hostDirectives: [HlmCardAction],
85
71
  template: '<ng-content />',
86
72
  })
87
73
  export class CardActionComponent {}
88
74
 
89
- /** Body slot — Material's `mat-card-content`. */
90
75
  @Component({
91
76
  selector: 'app-card-content',
92
77
  changeDetection: ChangeDetectionStrategy.OnPush,
93
- hostDirectives: [MatCardContent],
78
+ hostDirectives: [HlmCardContent],
94
79
  template: '<ng-content />',
95
80
  })
96
81
  export class CardContentComponent {}
97
-
98
- /**
99
- * Footer slot — Material's `mat-card-actions` (a flex-row action bar).
100
- * Material ships no inter-button spacing, so `:host` (the actions element)
101
- * sets a `gap`.
102
- */
103
82
  @Component({
104
83
  selector: 'app-card-footer',
105
84
  changeDetection: ChangeDetectionStrategy.OnPush,
106
- hostDirectives: [MatCardActions],
107
- styles: ':host { gap: 0.5rem; }',
85
+ hostDirectives: [HlmCardFooter],
86
+ host: { class: 'gap-2' },
108
87
  template: '<ng-content />',
109
88
  })
110
89
  export class CardFooterComponent {}
90
+
91
+ export const CardImports = [
92
+ CardComponent,
93
+ CardHeaderComponent,
94
+ CardTitleComponent,
95
+ CardDescriptionComponent,
96
+ CardAvatarComponent,
97
+ CardActionComponent,
98
+ CardContentComponent,
99
+ CardFooterComponent,
100
+ ] as const;
@@ -1,10 +1,38 @@
1
- <mat-expansion-panel [expanded]="open()" (expandedChange)="open.set($event)">
2
- <mat-expansion-panel-header>
3
- @if (title()) {
4
- <mat-panel-title>{{ title() }}</mat-panel-title>
5
- } @else {
6
- <ng-content select="[collapsibleHeader]" />
7
- }
8
- </mat-expansion-panel-header>
9
- <ng-content />
10
- </mat-expansion-panel>
1
+ <div
2
+ hlmCollapsible
3
+ [expanded]="open()"
4
+ [disabled]="disabled()"
5
+ (expandedChange)="open.set($event)"
6
+ class="rounded-[12px] bg-card shadow-md overflow-hidden"
7
+ >
8
+ <button
9
+ hlmCollapsibleTrigger
10
+ type="button"
11
+ class="flex w-full items-center justify-between px-6 min-h-12 font-medium transition-[min-height,background-color] duration-225 rounded-[inherit] disabled:pointer-events-none disabled:text-foreground/[0.38]"
12
+ [class.min-h-16]="open()"
13
+ [disabled]="disabled()"
14
+ >
15
+ <span class="flex flex-1 items-center overflow-hidden">
16
+ @if (title()) {
17
+ <span>{{ title() }}</span>
18
+ } @else {
19
+ <ng-content select="[collapsibleHeader]" />
20
+ }
21
+ </span>
22
+ <svg
23
+ class="size-6 shrink-0 transition-transform duration-225 fill-foreground/60"
24
+ [class.rotate-180]="open()"
25
+ xmlns="http://www.w3.org/2000/svg"
26
+ viewBox="0 -960 960 960"
27
+ aria-hidden="true"
28
+ focusable="false"
29
+ >
30
+ <path d="M480-345 240-585l56-56 184 184 184-184 56 56-240 240Z" />
31
+ </svg>
32
+ </button>
33
+ <div hlmCollapsibleContent>
34
+ <div class="px-6 pb-4">
35
+ <ng-content />
36
+ </div>
37
+ </div>
38
+ </div>
@@ -3,24 +3,19 @@
3
3
  * All rights reserved.
4
4
  * For full license text, see the LICENSE.txt file
5
5
  */
6
- import { ChangeDetectionStrategy, Component, input, model } from '@angular/core';
7
- import { MatExpansionModule } from '@angular/material/expansion';
6
+ import { booleanAttribute, ChangeDetectionStrategy, Component, input, model } from '@angular/core';
7
+ import { HlmCollapsibleImports } from '@spartan-ng/styles/collapsible';
8
8
 
9
- /**
10
- * Thin wrapper over Material's `mat-expansion-panel`. Two-way bindable `open`
11
- * and a `title`; body via `<ng-content>`. For custom header content, omit
12
- * `title` and project `[collapsibleHeader]`.
13
- */
14
9
  @Component({
15
10
  selector: 'app-collapsible',
16
11
  changeDetection: ChangeDetectionStrategy.OnPush,
17
- imports: [MatExpansionModule],
12
+ imports: [HlmCollapsibleImports],
18
13
  templateUrl: './collapsible.html',
19
14
  })
20
15
  export class CollapsibleComponent {
21
- /** Two-way bindable expanded state. Supports `[(open)]`. */
22
16
  readonly open = model<boolean>(false);
23
-
24
- /** Header title text. Omit and project `[collapsibleHeader]` for custom content. */
25
17
  readonly title = input<string>('');
18
+ readonly disabled = input(false, { transform: booleanAttribute });
26
19
  }
20
+
21
+ export const CollapsibleImports = [CollapsibleComponent] as const;