@salesforce/ui-bundle-template-app-angular-template-b2x 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 (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 +17 -12
  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/spartan/alert/src/index.ts +16 -0
  74. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/alert/src/lib/hlm-alert-action.ts +14 -0
  75. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/alert/src/lib/hlm-alert-description.ts +17 -0
  76. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/alert/src/lib/hlm-alert-title.ts +17 -0
  77. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/alert/src/lib/hlm-alert.ts +35 -0
  78. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/button/src/index.ts +6 -0
  79. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/button/src/lib/hlm-button.token.ts +22 -0
  80. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/button/src/lib/hlm-button.ts +72 -0
  81. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/calendar/src/index.ts +16 -0
  82. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/calendar/src/lib/hlm-calendar-multi.ts +195 -0
  83. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/calendar/src/lib/hlm-calendar-range.ts +194 -0
  84. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/calendar/src/lib/hlm-calendar.ts +189 -0
  85. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/calendar/src/lib/hlm-month-year-calendar.ts +119 -0
  86. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/index.ts +28 -0
  87. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card-action.ts +12 -0
  88. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card-avatar.ts +14 -0
  89. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card-content.ts +12 -0
  90. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card-description.ts +12 -0
  91. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card-footer.ts +12 -0
  92. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card-header.ts +15 -0
  93. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card-title.ts +12 -0
  94. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card.token.ts +19 -0
  95. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card.ts +22 -0
  96. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/collapsible/src/index.ts +13 -0
  97. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/collapsible/src/lib/hlm-collapsible-content.ts +14 -0
  98. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/collapsible/src/lib/hlm-collapsible-trigger.ts +9 -0
  99. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/collapsible/src/lib/hlm-collapsible.ts +15 -0
  100. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/index.ts +38 -0
  101. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-multi-input.ts +104 -0
  102. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker-anchor.ts +23 -0
  103. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker-input.ts +118 -0
  104. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker-multi.token.ts +109 -0
  105. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker-multi.ts +220 -0
  106. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker-trigger.ts +104 -0
  107. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker.token.ts +69 -0
  108. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker.ts +203 -0
  109. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-range-input.ts +120 -0
  110. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-range-picker.token.ts +86 -0
  111. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-range-picker.ts +252 -0
  112. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-month-year-input.ts +105 -0
  113. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-month-year-picker.token.ts +89 -0
  114. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-month-year-picker.ts +196 -0
  115. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/index.ts +35 -0
  116. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-close.ts +9 -0
  117. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-content.ts +74 -0
  118. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-description.ts +17 -0
  119. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-footer.ts +15 -0
  120. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-header.ts +12 -0
  121. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-overlay.ts +27 -0
  122. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-portal.ts +8 -0
  123. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-title.ts +14 -0
  124. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-trigger.ts +14 -0
  125. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog.service.ts +46 -0
  126. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog.ts +24 -0
  127. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/index.ts +49 -0
  128. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-checkbox-indicator.ts +21 -0
  129. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-checkbox.ts +54 -0
  130. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-focus-on-hover.ts +35 -0
  131. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-group.ts +14 -0
  132. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-item-sub-indicator.ts +19 -0
  133. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-item.ts +42 -0
  134. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-label.ts +20 -0
  135. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-radio-indicator.ts +21 -0
  136. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-radio.ts +49 -0
  137. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-separator.ts +12 -0
  138. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-shortcut.ts +15 -0
  139. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-sub-trigger.ts +52 -0
  140. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-sub.ts +53 -0
  141. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-token.ts +26 -0
  142. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-trigger.ts +46 -0
  143. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu.ts +57 -0
  144. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/index.ts +34 -0
  145. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-content.ts +12 -0
  146. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-description.ts +53 -0
  147. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-error.ts +100 -0
  148. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-group.ts +15 -0
  149. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-label.ts +17 -0
  150. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-legend.ts +19 -0
  151. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-separator.ts +24 -0
  152. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-set.ts +15 -0
  153. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-title.ts +15 -0
  154. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field.ts +47 -0
  155. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input/src/index.ts +5 -0
  156. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input/src/lib/hlm-input.ts +21 -0
  157. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input-group/src/index.ts +19 -0
  158. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input-group/src/lib/hlm-input-group-addon.ts +40 -0
  159. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input-group/src/lib/hlm-input-group-button.ts +47 -0
  160. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input-group/src/lib/hlm-input-group-input.ts +17 -0
  161. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input-group/src/lib/hlm-input-group-text.ts +14 -0
  162. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input-group/src/lib/hlm-input-group.ts +18 -0
  163. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/label/label.html +11 -0
  164. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/label/src/index.ts +5 -0
  165. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/label/src/lib/hlm-label.ts +17 -0
  166. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/index.ts +31 -0
  167. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-numbered-pagination-query-params.ts +191 -0
  168. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-numbered-pagination.ts +290 -0
  169. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-pagination-content.ts +12 -0
  170. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-pagination-ellipsis.ts +27 -0
  171. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-pagination-item.ts +7 -0
  172. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-pagination-link.ts +51 -0
  173. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-pagination-next.ts +65 -0
  174. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-pagination-previous.ts +65 -0
  175. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-pagination.ts +19 -0
  176. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/index.ts +25 -0
  177. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/lib/hlm-popover-content.ts +25 -0
  178. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/lib/hlm-popover-description.ts +12 -0
  179. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/lib/hlm-popover-header.ts +12 -0
  180. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/lib/hlm-popover-portal.ts +8 -0
  181. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/lib/hlm-popover-title.ts +12 -0
  182. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/lib/hlm-popover-trigger.ts +14 -0
  183. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/lib/hlm-popover.ts +23 -0
  184. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/index.ts +52 -0
  185. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-content.ts +44 -0
  186. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-group.ts +14 -0
  187. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-item.ts +36 -0
  188. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-label.ts +14 -0
  189. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-multiple.ts +37 -0
  190. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-placeholder.ts +17 -0
  191. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-portal.ts +8 -0
  192. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-scroll-down.ts +22 -0
  193. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-scroll-up.ts +22 -0
  194. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-separator.ts +14 -0
  195. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-trigger.ts +59 -0
  196. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-value-template.ts +5 -0
  197. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-value.ts +18 -0
  198. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-values-content.ts +9 -0
  199. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-values.ts +5 -0
  200. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select.ts +37 -0
  201. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/separator/src/index.ts +5 -0
  202. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/separator/src/lib/hlm-separator.ts +19 -0
  203. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/skeleton/src/index.ts +5 -0
  204. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/skeleton/src/lib/hlm-skeleton.ts +14 -0
  205. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/spinner/src/index.ts +5 -0
  206. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/spinner/src/lib/hlm-spinner.ts +26 -0
  207. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/utils/src/index.ts +2 -0
  208. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/utils/src/lib/hlm.ts +313 -0
  209. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/utils/src/lib/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
@@ -1,19 +1,34 @@
1
- <mat-form-field
2
- class="w-full"
3
- [class]="'size-' + size()"
4
- [appearance]="appearance()"
5
- subscriptSizing="dynamic"
6
- >
1
+ <div class="w-full space-y-1.5">
7
2
  @if (label()) {
8
- <mat-label>{{ label() }}</mat-label>
3
+ <label hlmLabel [for]="resolvedId()">{{ label() }}</label>
9
4
  }
10
- <input
11
- matInput
12
- [type]="type()"
13
- [placeholder]="placeholder()"
14
- [disabled]="disabled()"
15
- [attr.id]="id() || null"
16
- [attr.aria-describedby]="ariaDescribedby() || null"
17
- [(ngModel)]="value"
18
- />
19
- </mat-form-field>
5
+ <hlm-input-group [class]="groupClasses()">
6
+ @if (icon(); as leadingIcon) {
7
+ <hlm-input-group-addon>
8
+ <app-icon [name]="leadingIcon" class="flex items-end" aria-hidden="true" />
9
+ </hlm-input-group-addon>
10
+ }
11
+ <input
12
+ hlmInputGroupInput
13
+ [type]="type()"
14
+ [placeholder]="placeholder()"
15
+ [disabled]="disabled()"
16
+ [id]="resolvedId()"
17
+ [attr.aria-label]="ariaLabel() || null"
18
+ [attr.aria-describedby]="describedBy()"
19
+ [attr.aria-invalid]="error() || null"
20
+ [attr.data-matches-spartan-invalid]="error() || null"
21
+ [(ngModel)]="value"
22
+ />
23
+ @if (iconEnd(); as trailingIcon) {
24
+ <hlm-input-group-addon align="inline-end">
25
+ <app-icon [name]="trailingIcon" class="flex items-end" aria-hidden="true" />
26
+ </hlm-input-group-addon>
27
+ }
28
+ </hlm-input-group>
29
+ @if (error() && errorMessage()) {
30
+ <p [id]="errorId()" class="text-sm text-destructive" role="alert" aria-live="polite">
31
+ {{ errorMessage() }}
32
+ </p>
33
+ }
34
+ </div>
@@ -3,34 +3,77 @@
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';
6
+ import {
7
+ ChangeDetectionStrategy,
8
+ Component,
9
+ booleanAttribute,
10
+ computed,
11
+ input,
12
+ model,
13
+ } from '@angular/core';
7
14
  import { FormsModule } from '@angular/forms';
8
- import { MatFormFieldModule, type MatFormFieldAppearance } from '@angular/material/form-field';
9
- import { MatInputModule } from '@angular/material/input';
15
+ import { HlmInputGroupImports } from '@spartan-ng/styles/input-group';
16
+ import { HlmLabelImports } from '@spartan-ng/styles/label';
10
17
  import type { AppFieldSize } from '../field-size';
18
+ import type { AppFieldAppearance } from '../field-appearance';
19
+ import { IconComponent, type AppIconName } from '../icon/icon';
20
+
21
+ const SIZE_CLASSES: Record<AppFieldSize, string> = {
22
+ sm: 'h-6 text-xs',
23
+ default: 'h-8',
24
+ lg: 'h-10',
25
+ };
26
+
27
+ const APPEARANCE_CLASSES: Record<AppFieldAppearance, string> = {
28
+ outline: '',
29
+ fill: 'border-transparent bg-muted',
30
+ };
11
31
 
12
- /** Thin wrapper over Material's `mat-form-field` + `matInput`. */
13
32
  @Component({
14
33
  selector: 'app-input',
15
34
  changeDetection: ChangeDetectionStrategy.OnPush,
16
- imports: [FormsModule, MatFormFieldModule, MatInputModule],
35
+ imports: [FormsModule, HlmInputGroupImports, HlmLabelImports, IconComponent],
36
+ host: { class: 'block min-w-0' },
17
37
  templateUrl: './input.html',
18
- styleUrl: './input.scss',
19
38
  })
20
39
  export class InputComponent {
21
- /** Two-way bindable value. Supports `[(value)]`. */
22
40
  readonly value = model<string>('');
23
-
24
41
  readonly placeholder = input<string>('');
25
42
  readonly label = input<string>('');
26
43
  readonly type = input<string>('text');
27
- readonly disabled = input<boolean>(false);
28
- readonly appearance = input<MatFormFieldAppearance>('outline');
29
- /** Field height: `sm` = 24px, `default` = 32px, `lg` = 40px. */
44
+ readonly disabled = input(false, { transform: booleanAttribute });
45
+ readonly appearance = input<AppFieldAppearance>('outline');
46
+ readonly error = input(false, { transform: booleanAttribute });
47
+ readonly errorMessage = input<string>('');
30
48
  readonly size = input<AppFieldSize>('default');
31
-
32
- /** `id` on the inner control, so an outer `app-field` label's `for` resolves. */
33
49
  readonly id = input<string>('');
34
-
35
50
  readonly ariaDescribedby = input<string>('');
51
+ // Accessible name for inputs with no visible <label> (e.g. an icon-only
52
+ // search box); harmless when a label is present.
53
+ readonly ariaLabel = input<string>('');
54
+ // Optional leading/trailing icons. When set the input renders inside an
55
+ // input-group so the icon sits inside the shared border.
56
+ readonly icon = input<AppIconName | ''>('');
57
+ readonly iconEnd = input<AppIconName | ''>('');
58
+
59
+ private static _uid = 0;
60
+ private readonly _autoId = `app-input-${InputComponent._uid++}`;
61
+ protected readonly resolvedId = computed(() => this.id() || this._autoId);
62
+ protected readonly errorId = computed(() => `${this.resolvedId()}-error`);
63
+
64
+ // Link the error message to the input via aria-describedby (merged with any
65
+ // caller-supplied ids) so screen readers announce it; null when absent.
66
+ protected readonly describedBy = computed(() => {
67
+ const ids = [this.ariaDescribedby(), this.error() && this.errorMessage() ? this.errorId() : '']
68
+ .filter(Boolean)
69
+ .join(' ');
70
+ return ids || null;
71
+ });
72
+
73
+ // Size + appearance apply to the input-group wrapper, which owns the border.
74
+ protected readonly groupClasses = computed(() =>
75
+ [SIZE_CLASSES[this.size()], APPEARANCE_CLASSES[this.appearance()]].filter(Boolean).join(' '),
76
+ );
36
77
  }
78
+
79
+ export const InputImports = [InputComponent] as const;
@@ -4,14 +4,18 @@
4
4
  * For full license text, see the LICENSE.txt file
5
5
  */
6
6
  import { ChangeDetectionStrategy, Component, input } from '@angular/core';
7
+ import { HlmLabelImports } from '@spartan-ng/styles/label';
7
8
 
8
- /** Thin wrapper over the native `<label>` element. */
9
9
  @Component({
10
10
  selector: 'app-label',
11
11
  changeDetection: ChangeDetectionStrategy.OnPush,
12
- templateUrl: './label.html',
12
+ imports: [HlmLabelImports],
13
+ template: `
14
+ <label hlmLabel [for]="for() ?? undefined" class="mb-1.5 block"><ng-content /></label>
15
+ `,
13
16
  })
14
17
  export class LabelComponent {
15
- /** Optional `for` attribute forwarded to the underlying `<label>`. */
16
- readonly for = input<string | null>(null);
18
+ readonly for = input<string | null | undefined>(undefined);
17
19
  }
20
+
21
+ export const LabelImports = [LabelComponent] as const;
@@ -1,10 +1,74 @@
1
- <mat-paginator
2
- [length]="length()"
3
- [pageIndex]="pageIndex()"
4
- [pageSize]="pageSize()"
5
- [pageSizeOptions]="pageSizeOptions()"
6
- [hidePageSize]="hidePageSize()"
7
- [showFirstLastButtons]="showFirstLastButtons()"
8
- [disabled]="disabled()"
9
- (page)="page.emit($event)"
10
- />
1
+ @if (!hidePageSize()) {
2
+ <div class="flex items-center gap-2">
3
+ <span [id]="pageSizeLabelId" class="text-muted-foreground text-nowrap">Items per page:</span>
4
+ @if (pageSizeOptions().length > 0) {
5
+ <select
6
+ class="h-8 rounded-md border border-input bg-background px-2 text-sm"
7
+ [attr.aria-labelledby]="pageSizeLabelId"
8
+ [disabled]="disabled()"
9
+ (change)="onPageSizeChange($event)"
10
+ >
11
+ @for (opt of pageSizeOptions(); track opt) {
12
+ <option [value]="opt" [selected]="opt === pageSize()">{{ opt }}</option>
13
+ }
14
+ </select>
15
+ } @else {
16
+ <span class="text-muted-foreground">{{ pageSize() }}</span>
17
+ }
18
+ </div>
19
+ }
20
+ <div class="text-muted-foreground text-nowrap">
21
+ {{ rangeLabel() }}
22
+ </div>
23
+ <nav hlmPagination class="w-auto mx-0">
24
+ <ul hlmPaginationContent>
25
+ @if (showFirstLastButtons()) {
26
+ <li hlmPaginationItem>
27
+ <button
28
+ type="button"
29
+ class="inline-flex items-center justify-center size-8 rounded-md border border-input bg-background hover:bg-accent hover:text-accent-foreground disabled:opacity-50 disabled:pointer-events-none"
30
+ [disabled]="disabled() || clampedPageIndex() === 0"
31
+ (click)="goToPage(0)"
32
+ aria-label="First page"
33
+ >
34
+ <ng-icon name="lucideChevronFirst" size="16" />
35
+ </button>
36
+ </li>
37
+ }
38
+ <li hlmPaginationItem>
39
+ <button
40
+ type="button"
41
+ class="inline-flex items-center justify-center size-8 rounded-md border border-input bg-background hover:bg-accent hover:text-accent-foreground disabled:opacity-50 disabled:pointer-events-none"
42
+ [disabled]="disabled() || clampedPageIndex() === 0"
43
+ (click)="goToPage(clampedPageIndex() - 1)"
44
+ aria-label="Previous page"
45
+ >
46
+ <ng-icon name="lucideChevronLeft" size="16" />
47
+ </button>
48
+ </li>
49
+ <li hlmPaginationItem>
50
+ <button
51
+ type="button"
52
+ class="inline-flex items-center justify-center size-8 rounded-md border border-input bg-background hover:bg-accent hover:text-accent-foreground disabled:opacity-50 disabled:pointer-events-none"
53
+ [disabled]="disabled() || clampedPageIndex() >= lastPage()"
54
+ (click)="goToPage(clampedPageIndex() + 1)"
55
+ aria-label="Next page"
56
+ >
57
+ <ng-icon name="lucideChevronRight" size="16" />
58
+ </button>
59
+ </li>
60
+ @if (showFirstLastButtons()) {
61
+ <li hlmPaginationItem>
62
+ <button
63
+ type="button"
64
+ class="inline-flex items-center justify-center size-8 rounded-md border border-input bg-background hover:bg-accent hover:text-accent-foreground disabled:opacity-50 disabled:pointer-events-none"
65
+ [disabled]="disabled() || clampedPageIndex() >= lastPage()"
66
+ (click)="goToPage(lastPage())"
67
+ aria-label="Last page"
68
+ >
69
+ <ng-icon name="lucideChevronLast" size="16" />
70
+ </button>
71
+ </li>
72
+ }
73
+ </ul>
74
+ </nav>
@@ -3,35 +3,91 @@
3
3
  * All rights reserved.
4
4
  * For full license text, see the LICENSE.txt file
5
5
  */
6
- import { booleanAttribute, ChangeDetectionStrategy, Component, input, output } from '@angular/core';
7
- import { MatPaginator, type PageEvent } from '@angular/material/paginator';
6
+ import {
7
+ ChangeDetectionStrategy,
8
+ Component,
9
+ booleanAttribute,
10
+ computed,
11
+ input,
12
+ model,
13
+ output,
14
+ } from '@angular/core';
15
+ import { NgIcon, provideIcons } from '@ng-icons/core';
16
+ import {
17
+ lucideChevronFirst,
18
+ lucideChevronLast,
19
+ lucideChevronLeft,
20
+ lucideChevronRight,
21
+ } from '@ng-icons/lucide';
22
+ import { HlmPaginationImports } from '@spartan-ng/styles/pagination';
23
+ import type { PageEvent } from './types';
24
+
25
+ export type { PageEvent } from './types';
8
26
 
9
- /**
10
- * Thin wrapper over Material's `mat-paginator`. Presentation only — the host
11
- * decides what each page change means by listening to `(page)`.
12
- */
13
27
  @Component({
14
28
  selector: 'app-paginator',
15
29
  changeDetection: ChangeDetectionStrategy.OnPush,
16
- imports: [MatPaginator],
30
+ imports: [HlmPaginationImports, NgIcon],
31
+ providers: [
32
+ provideIcons({ lucideChevronFirst, lucideChevronLast, lucideChevronLeft, lucideChevronRight }),
33
+ ],
34
+ host: { class: 'flex items-center justify-end gap-4 text-sm' },
17
35
  templateUrl: './paginator.html',
18
36
  })
19
37
  export class PaginatorComponent {
20
- /** Total item count; Material derives the page count as `ceil(length / pageSize)`. */
21
38
  readonly length = input<number>(0);
22
- /** Zero-based index of the current page. */
23
- readonly pageIndex = input<number>(0);
24
- /** Items shown per page. */
25
- readonly pageSize = input<number>(10);
26
- /** Selectable page sizes; omit/empty to hide the size selector. */
39
+ readonly pageIndex = model<number>(0);
40
+ readonly pageSize = model<number>(10);
27
41
  readonly pageSizeOptions = input<readonly number[]>([]);
28
- /** Disable navigation buttons and the size select (e.g. while loading). */
29
42
  readonly disabled = input(false, { transform: booleanAttribute });
30
- /** Hide the "Items per page" selector. */
31
43
  readonly hidePageSize = input(false, { transform: booleanAttribute });
32
- /** Show the first / last page jump buttons. */
33
44
  readonly showFirstLastButtons = input(false, { transform: booleanAttribute });
34
-
35
- /** Emitted when the user changes page or page size. */
36
45
  readonly page = output<PageEvent>();
46
+
47
+ private static _uid = 0;
48
+ // Unique so the label→select association survives multiple paginators on a page.
49
+ protected readonly pageSizeLabelId = `app-paginator-page-size-${PaginatorComponent._uid++}`;
50
+
51
+ protected readonly lastPage = computed(() =>
52
+ Math.max(0, Math.ceil(this.length() / this.pageSize()) - 1),
53
+ );
54
+
55
+ protected readonly clampedPageIndex = computed(() =>
56
+ Math.max(0, Math.min(this.pageIndex(), this.lastPage())),
57
+ );
58
+
59
+ protected readonly rangeLabel = computed(() => {
60
+ const len = this.length();
61
+ if (len === 0) return '0 of 0';
62
+ const idx = this.clampedPageIndex();
63
+ const start = idx * this.pageSize() + 1;
64
+ const end = Math.min((idx + 1) * this.pageSize(), len);
65
+ return `${start} – ${end} of ${len}`;
66
+ });
67
+
68
+ protected goToPage(index: number): void {
69
+ const previousPageIndex = this.pageIndex();
70
+ this.pageIndex.set(index);
71
+ this.page.emit({
72
+ pageIndex: index,
73
+ previousPageIndex,
74
+ pageSize: this.pageSize(),
75
+ length: this.length(),
76
+ });
77
+ }
78
+
79
+ protected onPageSizeChange(event: Event): void {
80
+ const newSize = Number((event.target as HTMLSelectElement).value);
81
+ const previousPageIndex = this.pageIndex();
82
+ this.pageSize.set(newSize);
83
+ this.pageIndex.set(0);
84
+ this.page.emit({
85
+ pageIndex: 0,
86
+ previousPageIndex,
87
+ pageSize: newSize,
88
+ length: this.length(),
89
+ });
90
+ }
37
91
  }
92
+
93
+ export const PaginatorImports = [PaginatorComponent] as const;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Copyright (c) 2026, Salesforce, Inc.,
3
+ * All rights reserved.
4
+ * For full license text, see the LICENSE.txt file
5
+ */
6
+
7
+ /** Payload emitted by PaginatorComponent's `(page)` output. */
8
+ export interface PageEvent {
9
+ pageIndex: number;
10
+ previousPageIndex: number;
11
+ pageSize: number;
12
+ length: number;
13
+ }
@@ -1,41 +1,13 @@
1
- <span
2
- cdkOverlayOrigin
3
- #origin="cdkOverlayOrigin"
4
- role="button"
5
- tabindex="0"
6
- [attr.aria-expanded]="open()"
7
- (click)="toggle()"
8
- (keydown.enter)="toggle()"
9
- (keydown.space)="$event.preventDefault(); toggle()"
1
+ <hlm-popover
2
+ [align]="align()"
3
+ [sideOffset]="sideOffset()"
4
+ [state]="open() ? 'open' : 'closed'"
5
+ (stateChanged)="onStateChanged($event)"
10
6
  >
11
- <ng-content select="[trigger]" />
12
- </span>
13
-
14
- <ng-template
15
- cdkConnectedOverlay
16
- [cdkConnectedOverlayOrigin]="origin"
17
- [cdkConnectedOverlayOpen]="open()"
18
- [cdkConnectedOverlayHasBackdrop]="true"
19
- cdkConnectedOverlayBackdropClass="cdk-overlay-transparent-backdrop"
20
- [cdkConnectedOverlayOffsetY]="sideOffset()"
21
- [cdkConnectedOverlayPositions]="[
22
- {
23
- originX: align(),
24
- originY: 'bottom',
25
- overlayX: align(),
26
- overlayY: 'top',
27
- },
28
- {
29
- originX: align(),
30
- originY: 'top',
31
- overlayX: align(),
32
- overlayY: 'bottom',
33
- },
34
- ]"
35
- (backdropClick)="close()"
36
- (detach)="close()"
37
- >
38
- <div class="bg-white text-sm rounded-lg shadow-md ring-1 ring-black/10 outline-none">
7
+ <button hlmPopoverTrigger type="button" [class]="triggerClass()" [attr.aria-label]="ariaLabel()">
8
+ <ng-content select="[trigger]" />
9
+ </button>
10
+ <div hlmPopoverContent *hlmPopoverPortal>
39
11
  <ng-content />
40
12
  </div>
41
- </ng-template>
13
+ </hlm-popover>
@@ -3,32 +3,23 @@
3
3
  * All rights reserved.
4
4
  * For full license text, see the LICENSE.txt file
5
5
  */
6
- import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
7
6
  import { ChangeDetectionStrategy, Component, input, model } from '@angular/core';
7
+ import { HlmPopoverImports } from '@spartan-ng/styles/popover';
8
8
 
9
- /**
10
- * Popover backed by CDK Overlay. Slots: `[trigger]` (anchor, toggles the
11
- * popover) and default (body). `open` is a two-way model; a backdrop click
12
- * closes it.
13
- */
14
9
  @Component({
15
10
  selector: 'app-popover',
16
11
  changeDetection: ChangeDetectionStrategy.OnPush,
17
- imports: [CdkConnectedOverlay, CdkOverlayOrigin],
12
+ imports: [HlmPopoverImports],
18
13
  templateUrl: './popover.html',
19
14
  })
20
15
  export class PopoverComponent {
21
- /**
22
- * Two-way bindable open state. Supports `[(open)]`, a plain `[open]`
23
- * input, or listening to the auto-generated `(openChange)` event.
24
- */
25
16
  readonly open = model<boolean>(false);
26
-
27
- /** Panel alignment relative to the trigger. Defaults to below-start. */
28
17
  readonly align = input<'start' | 'center' | 'end'>('start');
29
-
30
- /** Vertical gap between the trigger and the panel, in px. */
31
18
  readonly sideOffset = input<number>(4);
19
+ // The wrapper owns the single real trigger `<button>` (so callers project
20
+ // plain content, never a nested button); these style/label it.
21
+ readonly triggerClass = input<string>('');
22
+ readonly ariaLabel = input<string | null>(null, { alias: 'aria-label' });
32
23
 
33
24
  toggle(): void {
34
25
  this.open.set(!this.open());
@@ -37,4 +28,10 @@ export class PopoverComponent {
37
28
  close(): void {
38
29
  this.open.set(false);
39
30
  }
31
+
32
+ protected onStateChanged(state: 'open' | 'closed'): void {
33
+ this.open.set(state === 'open');
34
+ }
40
35
  }
36
+
37
+ export const PopoverImports = [PopoverComponent] as const;
@@ -1,24 +1,36 @@
1
- <mat-form-field
2
- class="w-full"
3
- [class]="'size-' + size()"
4
- [appearance]="appearance()"
5
- subscriptSizing="dynamic"
6
- >
7
- @if (label()) {
8
- <mat-label>{{ label() }}</mat-label>
9
- }
10
- <mat-select
11
- [multiple]="multiple()"
12
- [placeholder]="placeholder()"
1
+ @if (label()) {
2
+ <label hlmLabel [for]="labelId" class="mb-1.5 block">{{ label() }}</label>
3
+ }
4
+ @if (!multiple()) {
5
+ <hlm-select
6
+ [value]="value()"
7
+ (valueChange)="onSingleChange($event)"
13
8
  [disabled]="disabled()"
14
- [ngModel]="selection()"
15
- (ngModelChange)="onSelectionChange($event)"
9
+ [itemToString]="itemToString"
16
10
  >
17
- @if (multiple()) {
18
- <mat-select-trigger>{{ multiTriggerLabel() }}</mat-select-trigger>
19
- }
20
- @for (option of options(); track option.value) {
21
- <mat-option [value]="option.value">{{ option.label }}</mat-option>
22
- }
23
- </mat-select>
24
- </mat-form-field>
11
+ <hlm-select-trigger [buttonId]="labelId" [size]="size()" [class]="triggerClasses()">
12
+ <hlm-select-value [placeholder]="placeholder()" />
13
+ </hlm-select-trigger>
14
+ <hlm-select-content *hlmSelectPortal>
15
+ @for (option of options(); track option.value) {
16
+ <hlm-select-item [value]="option.value">{{ option.label }}</hlm-select-item>
17
+ }
18
+ </hlm-select-content>
19
+ </hlm-select>
20
+ } @else {
21
+ <hlm-select-multiple
22
+ [value]="$any(values())"
23
+ (valueChange)="onMultiChange($event)"
24
+ [disabled]="disabled()"
25
+ [itemToString]="itemToString"
26
+ >
27
+ <hlm-select-trigger [buttonId]="labelId" [size]="size()" [class]="triggerClasses()">
28
+ <hlm-select-value [placeholder]="placeholder()" />
29
+ </hlm-select-trigger>
30
+ <hlm-select-content *hlmSelectPortal>
31
+ @for (option of options(); track option.value) {
32
+ <hlm-select-item [value]="option.value">{{ option.label }}</hlm-select-item>
33
+ }
34
+ </hlm-select-content>
35
+ </hlm-select-multiple>
36
+ }
@@ -4,69 +4,60 @@
4
4
  * For full license text, see the LICENSE.txt file
5
5
  */
6
6
  import {
7
- booleanAttribute,
8
7
  ChangeDetectionStrategy,
9
8
  Component,
9
+ booleanAttribute,
10
10
  computed,
11
11
  input,
12
12
  model,
13
13
  } from '@angular/core';
14
- import { FormsModule } from '@angular/forms';
15
- import { MatFormFieldModule, type MatFormFieldAppearance } from '@angular/material/form-field';
16
- import { MatSelectModule } from '@angular/material/select';
14
+ import { HlmSelectImports } from '@spartan-ng/styles/select';
15
+ import { HlmLabelImports } from '@spartan-ng/styles/label';
17
16
  import type { AppFieldSize } from '../field-size';
17
+ import type { AppFieldAppearance } from '../field-appearance';
18
18
 
19
- /** Shape of an option rendered in the dropdown. */
20
19
  export interface AppSelectOption {
21
20
  value: string;
22
21
  label: string;
23
22
  }
24
23
 
25
- /** Thin wrapper over Material's `mat-form-field` + `mat-select`. */
26
24
  @Component({
27
25
  selector: 'app-select',
28
26
  changeDetection: ChangeDetectionStrategy.OnPush,
29
- imports: [FormsModule, MatFormFieldModule, MatSelectModule],
27
+ imports: [HlmSelectImports, HlmLabelImports],
28
+ host: { class: 'block min-w-0' },
30
29
  templateUrl: './select.html',
31
- styleUrl: './select.scss',
32
30
  })
33
31
  export class SelectComponent {
34
- /** Two-way bindable single-select value. Ignored when `multiple` is set. */
35
32
  readonly value = model<string>('');
36
-
37
- /** Two-way bindable multi-select values. Used only when `multiple` is `true`. */
38
33
  readonly values = model<readonly string[]>([]);
39
-
40
- /** Render checkbox options and allow more than one selection. */
41
34
  readonly multiple = input(false, { transform: booleanAttribute });
42
-
43
35
  readonly options = input<readonly AppSelectOption[]>([]);
44
36
  readonly placeholder = input<string>('');
45
37
  readonly label = input<string>('');
46
- readonly disabled = input<boolean>(false);
47
- readonly appearance = input<MatFormFieldAppearance>('outline');
48
- /** Field height: `sm` = 24px, `default` = 32px, `lg` = 40px. */
38
+ readonly disabled = input(false, { transform: booleanAttribute });
39
+ readonly appearance = input<AppFieldAppearance>('outline');
49
40
  readonly size = input<AppFieldSize>('default');
50
41
 
51
- /** Value handed to `mat-select`: the `values` array when `multiple`, else `value`. */
52
- protected readonly selection = computed(() => (this.multiple() ? this.values() : this.value()));
42
+ private static _uid = 0;
43
+ protected readonly labelId = `app-select-${SelectComponent._uid++}`;
53
44
 
54
- /** Multi-select trigger summary: the sole option's label, else "N selected". */
55
- protected readonly multiTriggerLabel = computed(() => {
56
- const selected = this.values();
57
- if (selected.length === 1) {
58
- const only = selected[0];
59
- return this.options().find((o) => o.value === only)?.label ?? only;
60
- }
61
- return `${selected.length} selected`;
45
+ protected readonly itemToString = (value: string): string => {
46
+ return this.options().find((o) => o.value === value)?.label ?? value;
47
+ };
48
+
49
+ protected readonly triggerClasses = computed(() => {
50
+ if (this.appearance() === 'fill') return 'border-transparent bg-muted';
51
+ return '';
62
52
  });
63
53
 
64
- /** Single change handler — routes to the right model based on `multiple`. */
65
- protected onSelectionChange(next: string | string[]): void {
66
- if (this.multiple()) {
67
- this.values.set((next as string[]) ?? []);
68
- } else {
69
- this.value.set((next as string) ?? '');
70
- }
54
+ protected onSingleChange(event: string | null | undefined): void {
55
+ this.value.set(event ?? '');
56
+ }
57
+
58
+ protected onMultiChange(event: string[] | readonly string[] | null | undefined): void {
59
+ this.values.set(event ?? []);
71
60
  }
72
61
  }
62
+
63
+ export const SelectImports = [SelectComponent] as const;