@salesforce/ui-bundle-template-base-angular-app 11.59.2 → 11.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +17 -12
  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/spartan/alert/src/index.ts +16 -0
  41. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/alert/src/lib/hlm-alert-action.ts +14 -0
  42. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/alert/src/lib/hlm-alert-description.ts +17 -0
  43. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/alert/src/lib/hlm-alert-title.ts +17 -0
  44. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/alert/src/lib/hlm-alert.ts +35 -0
  45. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/button/src/index.ts +6 -0
  46. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/button/src/lib/hlm-button.token.ts +22 -0
  47. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/button/src/lib/hlm-button.ts +72 -0
  48. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/calendar/src/index.ts +16 -0
  49. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/calendar/src/lib/hlm-calendar-multi.ts +195 -0
  50. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/calendar/src/lib/hlm-calendar-range.ts +194 -0
  51. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/calendar/src/lib/hlm-calendar.ts +189 -0
  52. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/calendar/src/lib/hlm-month-year-calendar.ts +119 -0
  53. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/card/src/index.ts +28 -0
  54. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/card/src/lib/hlm-card-action.ts +12 -0
  55. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/card/src/lib/hlm-card-avatar.ts +14 -0
  56. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/card/src/lib/hlm-card-content.ts +12 -0
  57. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/card/src/lib/hlm-card-description.ts +12 -0
  58. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/card/src/lib/hlm-card-footer.ts +12 -0
  59. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/card/src/lib/hlm-card-header.ts +15 -0
  60. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/card/src/lib/hlm-card-title.ts +12 -0
  61. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/card/src/lib/hlm-card.token.ts +19 -0
  62. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/card/src/lib/hlm-card.ts +22 -0
  63. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/collapsible/src/index.ts +13 -0
  64. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/collapsible/src/lib/hlm-collapsible-content.ts +14 -0
  65. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/collapsible/src/lib/hlm-collapsible-trigger.ts +9 -0
  66. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/collapsible/src/lib/hlm-collapsible.ts +15 -0
  67. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/date-picker/src/index.ts +38 -0
  68. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/date-picker/src/lib/hlm-date-multi-input.ts +104 -0
  69. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker-anchor.ts +23 -0
  70. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker-input.ts +118 -0
  71. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker-multi.token.ts +109 -0
  72. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker-multi.ts +220 -0
  73. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker-trigger.ts +104 -0
  74. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker.token.ts +69 -0
  75. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker.ts +203 -0
  76. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/date-picker/src/lib/hlm-date-range-input.ts +120 -0
  77. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/date-picker/src/lib/hlm-date-range-picker.token.ts +86 -0
  78. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/date-picker/src/lib/hlm-date-range-picker.ts +252 -0
  79. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/date-picker/src/lib/hlm-month-year-input.ts +105 -0
  80. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/date-picker/src/lib/hlm-month-year-picker.token.ts +89 -0
  81. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/date-picker/src/lib/hlm-month-year-picker.ts +196 -0
  82. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dialog/src/index.ts +35 -0
  83. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dialog/src/lib/hlm-dialog-close.ts +9 -0
  84. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dialog/src/lib/hlm-dialog-content.ts +74 -0
  85. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dialog/src/lib/hlm-dialog-description.ts +17 -0
  86. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dialog/src/lib/hlm-dialog-footer.ts +15 -0
  87. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dialog/src/lib/hlm-dialog-header.ts +12 -0
  88. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dialog/src/lib/hlm-dialog-overlay.ts +27 -0
  89. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dialog/src/lib/hlm-dialog-portal.ts +8 -0
  90. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dialog/src/lib/hlm-dialog-title.ts +14 -0
  91. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dialog/src/lib/hlm-dialog-trigger.ts +14 -0
  92. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dialog/src/lib/hlm-dialog.service.ts +46 -0
  93. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dialog/src/lib/hlm-dialog.ts +24 -0
  94. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dropdown-menu/src/index.ts +49 -0
  95. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-checkbox-indicator.ts +21 -0
  96. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-checkbox.ts +54 -0
  97. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-focus-on-hover.ts +35 -0
  98. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-group.ts +14 -0
  99. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-item-sub-indicator.ts +19 -0
  100. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-item.ts +42 -0
  101. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-label.ts +20 -0
  102. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-radio-indicator.ts +21 -0
  103. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-radio.ts +49 -0
  104. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-separator.ts +12 -0
  105. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-shortcut.ts +15 -0
  106. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-sub-trigger.ts +52 -0
  107. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-sub.ts +53 -0
  108. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-token.ts +26 -0
  109. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-trigger.ts +46 -0
  110. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu.ts +57 -0
  111. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/field/src/index.ts +34 -0
  112. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/field/src/lib/hlm-field-content.ts +12 -0
  113. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/field/src/lib/hlm-field-description.ts +53 -0
  114. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/field/src/lib/hlm-field-error.ts +100 -0
  115. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/field/src/lib/hlm-field-group.ts +15 -0
  116. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/field/src/lib/hlm-field-label.ts +17 -0
  117. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/field/src/lib/hlm-field-legend.ts +19 -0
  118. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/field/src/lib/hlm-field-separator.ts +24 -0
  119. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/field/src/lib/hlm-field-set.ts +15 -0
  120. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/field/src/lib/hlm-field-title.ts +15 -0
  121. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/field/src/lib/hlm-field.ts +47 -0
  122. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/input/src/index.ts +5 -0
  123. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/input/src/lib/hlm-input.ts +21 -0
  124. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/input-group/src/index.ts +19 -0
  125. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/input-group/src/lib/hlm-input-group-addon.ts +40 -0
  126. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/input-group/src/lib/hlm-input-group-button.ts +47 -0
  127. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/input-group/src/lib/hlm-input-group-input.ts +17 -0
  128. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/input-group/src/lib/hlm-input-group-text.ts +14 -0
  129. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/input-group/src/lib/hlm-input-group.ts +18 -0
  130. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/label/label.html +11 -0
  131. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/label/src/index.ts +5 -0
  132. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/label/src/lib/hlm-label.ts +17 -0
  133. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/pagination/src/index.ts +31 -0
  134. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/pagination/src/lib/hlm-numbered-pagination-query-params.ts +191 -0
  135. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/pagination/src/lib/hlm-numbered-pagination.ts +290 -0
  136. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/pagination/src/lib/hlm-pagination-content.ts +12 -0
  137. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/pagination/src/lib/hlm-pagination-ellipsis.ts +27 -0
  138. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/pagination/src/lib/hlm-pagination-item.ts +7 -0
  139. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/pagination/src/lib/hlm-pagination-link.ts +51 -0
  140. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/pagination/src/lib/hlm-pagination-next.ts +65 -0
  141. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/pagination/src/lib/hlm-pagination-previous.ts +65 -0
  142. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/pagination/src/lib/hlm-pagination.ts +19 -0
  143. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/popover/src/index.ts +25 -0
  144. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/popover/src/lib/hlm-popover-content.ts +25 -0
  145. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/popover/src/lib/hlm-popover-description.ts +12 -0
  146. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/popover/src/lib/hlm-popover-header.ts +12 -0
  147. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/popover/src/lib/hlm-popover-portal.ts +8 -0
  148. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/popover/src/lib/hlm-popover-title.ts +12 -0
  149. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/popover/src/lib/hlm-popover-trigger.ts +14 -0
  150. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/popover/src/lib/hlm-popover.ts +23 -0
  151. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/select/src/index.ts +52 -0
  152. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/select/src/lib/hlm-select-content.ts +44 -0
  153. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/select/src/lib/hlm-select-group.ts +14 -0
  154. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/select/src/lib/hlm-select-item.ts +36 -0
  155. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/select/src/lib/hlm-select-label.ts +14 -0
  156. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/select/src/lib/hlm-select-multiple.ts +37 -0
  157. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/select/src/lib/hlm-select-placeholder.ts +17 -0
  158. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/select/src/lib/hlm-select-portal.ts +8 -0
  159. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/select/src/lib/hlm-select-scroll-down.ts +22 -0
  160. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/select/src/lib/hlm-select-scroll-up.ts +22 -0
  161. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/select/src/lib/hlm-select-separator.ts +14 -0
  162. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/select/src/lib/hlm-select-trigger.ts +59 -0
  163. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/select/src/lib/hlm-select-value-template.ts +5 -0
  164. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/select/src/lib/hlm-select-value.ts +18 -0
  165. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/select/src/lib/hlm-select-values-content.ts +9 -0
  166. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/select/src/lib/hlm-select-values.ts +5 -0
  167. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/select/src/lib/hlm-select.ts +37 -0
  168. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/separator/src/index.ts +5 -0
  169. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/separator/src/lib/hlm-separator.ts +19 -0
  170. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/skeleton/src/index.ts +5 -0
  171. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/skeleton/src/lib/hlm-skeleton.ts +14 -0
  172. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/spinner/src/index.ts +5 -0
  173. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/spinner/src/lib/hlm-spinner.ts +26 -0
  174. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/utils/src/index.ts +2 -0
  175. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/utils/src/lib/hlm.ts +313 -0
  176. package/src/force-app/main/default/uiBundles/base-angular-app/src/app/shared/spartan/utils/src/lib/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
package/CHANGELOG.md CHANGED
@@ -3,6 +3,22 @@
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.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v11.61.0...v11.62.0) (2026-08-17)
7
+
8
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-angular-app
9
+
10
+ ## [11.61.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v11.60.0...v11.61.0) (2026-08-17)
11
+
12
+ ### Features
13
+
14
+ - @W-23807677: Migrating from Angular Material to Spartan NG ([#882](https://github.com/salesforce-experience-platform-emu/webapps/issues/882)) ([b83d66f](https://github.com/salesforce-experience-platform-emu/webapps/commit/b83d66f522ec85be2390211d35c2a6af3c487246))
15
+
16
+ ## [11.60.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v11.59.2...v11.60.0) (2026-08-17)
17
+
18
+ ### Features
19
+
20
+ - angular design-mode via native source-locations - @W-23486249@ ([#839](https://github.com/salesforce-experience-platform-emu/webapps/issues/839)) ([51b9f6b](https://github.com/salesforce-experience-platform-emu/webapps/commit/51b9f6bbb382f76ef6fa0101e5ce66f0998f725e))
21
+
6
22
  ## [11.59.2](https://github.com/salesforce-experience-platform-emu/webapps/compare/v11.59.1...v11.59.2) (2026-08-15)
7
23
 
8
24
  **Note:** Version bump only for package @salesforce/ui-bundle-template-base-angular-app
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/ui-bundle-template-base-angular-app",
3
- "version": "11.59.2",
3
+ "version": "11.62.0",
4
4
  "license": "SEE LICENSE IN LICENSE.txt",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -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/spartan",
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/spartan/**',
23
+ ],
16
24
  },
17
25
  // TypeScript files
18
26
  {
@@ -8,29 +8,33 @@
8
8
  },
9
9
  "scripts": {
10
10
  "dev": "sf-angular-serve",
11
- "dev:design": "sf-angular-serve",
12
- "build": "ng build",
11
+ "dev:design": "sf-angular-serve --design",
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.59.2",
32
- "@salesforce/platform-sdk": "^11.59.2",
29
+ "@ng-icons/core": "^32.2.0",
30
+ "@ng-icons/lucide": "^32.2.0",
31
+ "@salesforce/angular-plugin-ui-bundle": "^11.62.0",
32
+ "@salesforce/platform-sdk": "^11.62.0",
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.59.2",
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.0"
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,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;