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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/dist/CHANGELOG.md +24 -0
  2. package/dist/force-app/main/default/uiBundles/angularextapp/angular.json +2 -7
  3. package/dist/force-app/main/default/uiBundles/angularextapp/components.json +6 -0
  4. package/dist/force-app/main/default/uiBundles/angularextapp/eslint.config.js +9 -1
  5. package/dist/force-app/main/default/uiBundles/angularextapp/package.json +16 -11
  6. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/app.config.ts +4 -6
  7. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/app.routes.ts +2 -2
  8. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/alert/alert.html +9 -13
  9. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/alert/alert.ts +16 -28
  10. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/button/button.html +19 -10
  11. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/button/button.ts +34 -25
  12. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/card/card.ts +40 -50
  13. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/collapsible/collapsible.html +38 -10
  14. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/collapsible/collapsible.ts +6 -11
  15. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-picker/date-picker.html +17 -22
  16. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-picker/date-picker.ts +29 -21
  17. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-range-picker/date-range-picker.html +16 -30
  18. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-range-picker/date-range-picker.ts +39 -36
  19. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/dialog/dialog.html +13 -30
  20. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/dialog/dialog.ts +6 -21
  21. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/dropdown-menu/dropdown-menu.html +20 -0
  22. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/dropdown-menu/dropdown-menu.ts +100 -0
  23. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/field/field.html +5 -11
  24. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/field/field.ts +10 -18
  25. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/field-appearance.ts +8 -0
  26. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/icon/icon.ts +62 -0
  27. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/input/input.html +32 -17
  28. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/input/input.ts +57 -14
  29. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/label/label.ts +8 -4
  30. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/paginator/paginator.html +74 -10
  31. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/paginator/paginator.ts +74 -18
  32. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/paginator/types.ts +13 -0
  33. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/popover/popover.html +10 -38
  34. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/popover/popover.ts +12 -15
  35. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/select/select.html +34 -22
  36. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/select/select.ts +25 -34
  37. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/separator/separator.ts +11 -36
  38. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/skeleton/skeleton.ts +5 -9
  39. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/spinner/spinner.ts +14 -21
  40. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/auth-form/auth-form.html +2 -3
  41. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/menu/auth-menu/auth-menu.html +31 -21
  42. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/menu/auth-menu/auth-menu.ts +6 -18
  43. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/session/session.html +2 -2
  44. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/submit-button/submit-button.html +8 -4
  45. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/submit-button/submit-button.ts +4 -16
  46. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/breadcrumb/breadcrumb.html +4 -24
  47. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/breadcrumb/breadcrumb.ts +3 -16
  48. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/date-filter.ts +1 -1
  49. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/date-range-filter.html +2 -1
  50. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/date-range-filter.ts +6 -15
  51. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/filter-field-wrapper.html +2 -0
  52. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/filter-field-wrapper.ts +2 -17
  53. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/multi-select-filter.html +2 -1
  54. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/numeric-range-filter.ts +3 -21
  55. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/search-filter.html +3 -3
  56. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/search-filter.ts +9 -13
  57. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/select-filter.html +2 -5
  58. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/select-filter.ts +1 -15
  59. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/text-filter.html +2 -5
  60. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/text-filter.ts +3 -17
  61. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/pagination/pagination.ts +4 -20
  62. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/search-bar/search-bar.html +10 -59
  63. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/search-bar/search-bar.ts +13 -93
  64. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/sort-control/sort-control.html +3 -29
  65. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/sort-control/sort-control.ts +5 -12
  66. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/account-detail/account-detail-page.html +1 -23
  67. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/account-detail/account-detail-page.ts +3 -23
  68. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/account-search/account-search-page.html +1 -19
  69. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/account-search/account-search-page.ts +8 -36
  70. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/home/home.html +15 -4
  71. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/home/home.spec.ts +8 -6
  72. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/home/home.ts +56 -4
  73. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/alert/hlm-alert-action.ts +14 -0
  74. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/alert/hlm-alert-description.ts +17 -0
  75. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/alert/hlm-alert-title.ts +17 -0
  76. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/alert/hlm-alert.ts +35 -0
  77. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/alert/index.ts +16 -0
  78. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/button/hlm-button.token.ts +22 -0
  79. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/button/hlm-button.ts +72 -0
  80. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/button/index.ts +6 -0
  81. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/calendar/hlm-calendar-multi.ts +195 -0
  82. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/calendar/hlm-calendar-range.ts +194 -0
  83. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/calendar/hlm-calendar.ts +189 -0
  84. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/calendar/hlm-month-year-calendar.ts +119 -0
  85. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/calendar/index.ts +16 -0
  86. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/card/hlm-card-action.ts +12 -0
  87. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/card/hlm-card-avatar.ts +14 -0
  88. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/card/hlm-card-content.ts +12 -0
  89. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/card/hlm-card-description.ts +12 -0
  90. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/card/hlm-card-footer.ts +12 -0
  91. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/card/hlm-card-header.ts +15 -0
  92. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/card/hlm-card-title.ts +12 -0
  93. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/card/hlm-card.token.ts +19 -0
  94. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/card/hlm-card.ts +22 -0
  95. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/card/index.ts +28 -0
  96. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/collapsible/hlm-collapsible-content.ts +14 -0
  97. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/collapsible/hlm-collapsible-trigger.ts +9 -0
  98. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/collapsible/hlm-collapsible.ts +15 -0
  99. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/collapsible/index.ts +13 -0
  100. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-date-multi-input.ts +104 -0
  101. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-date-picker-anchor.ts +23 -0
  102. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-date-picker-input.ts +118 -0
  103. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-date-picker-multi.token.ts +109 -0
  104. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-date-picker-multi.ts +220 -0
  105. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-date-picker-trigger.ts +104 -0
  106. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-date-picker.token.ts +69 -0
  107. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-date-picker.ts +203 -0
  108. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-date-range-input.ts +120 -0
  109. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-date-range-picker.token.ts +86 -0
  110. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-date-range-picker.ts +252 -0
  111. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-month-year-input.ts +105 -0
  112. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-month-year-picker.token.ts +89 -0
  113. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/hlm-month-year-picker.ts +196 -0
  114. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/date-picker/index.ts +38 -0
  115. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/hlm-dialog-close.ts +9 -0
  116. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/hlm-dialog-content.ts +74 -0
  117. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/hlm-dialog-description.ts +17 -0
  118. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/hlm-dialog-footer.ts +15 -0
  119. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/hlm-dialog-header.ts +12 -0
  120. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/hlm-dialog-overlay.ts +27 -0
  121. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/hlm-dialog-portal.ts +8 -0
  122. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/hlm-dialog-title.ts +14 -0
  123. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/hlm-dialog-trigger.ts +14 -0
  124. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/hlm-dialog.service.ts +46 -0
  125. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/hlm-dialog.ts +24 -0
  126. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dialog/index.ts +35 -0
  127. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-checkbox-indicator.ts +21 -0
  128. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-checkbox.ts +54 -0
  129. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-focus-on-hover.ts +35 -0
  130. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-group.ts +14 -0
  131. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-item-sub-indicator.ts +19 -0
  132. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-item.ts +42 -0
  133. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-label.ts +20 -0
  134. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-radio-indicator.ts +21 -0
  135. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-radio.ts +49 -0
  136. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-separator.ts +12 -0
  137. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-shortcut.ts +15 -0
  138. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-sub-trigger.ts +52 -0
  139. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-sub.ts +53 -0
  140. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-token.ts +26 -0
  141. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-trigger.ts +46 -0
  142. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/hlm-dropdown-menu.ts +57 -0
  143. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/dropdown-menu/index.ts +49 -0
  144. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/field/hlm-field-content.ts +12 -0
  145. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/field/hlm-field-description.ts +53 -0
  146. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/field/hlm-field-error.ts +100 -0
  147. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/field/hlm-field-group.ts +15 -0
  148. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/field/hlm-field-label.ts +17 -0
  149. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/field/hlm-field-legend.ts +19 -0
  150. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/field/hlm-field-separator.ts +24 -0
  151. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/field/hlm-field-set.ts +15 -0
  152. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/field/hlm-field-title.ts +15 -0
  153. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/field/hlm-field.ts +47 -0
  154. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/field/index.ts +34 -0
  155. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/input/hlm-input.ts +21 -0
  156. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/input/index.ts +5 -0
  157. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/input-group/hlm-input-group-addon.ts +40 -0
  158. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/input-group/hlm-input-group-button.ts +47 -0
  159. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/input-group/hlm-input-group-input.ts +17 -0
  160. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/input-group/hlm-input-group-text.ts +14 -0
  161. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/input-group/hlm-input-group.ts +18 -0
  162. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/input-group/index.ts +19 -0
  163. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/label/hlm-label.ts +17 -0
  164. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/label/index.ts +5 -0
  165. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/label/label.html +11 -0
  166. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/pagination/hlm-numbered-pagination-query-params.ts +191 -0
  167. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/pagination/hlm-numbered-pagination.ts +290 -0
  168. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/pagination/hlm-pagination-content.ts +12 -0
  169. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/pagination/hlm-pagination-ellipsis.ts +27 -0
  170. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/pagination/hlm-pagination-item.ts +7 -0
  171. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/pagination/hlm-pagination-link.ts +51 -0
  172. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/pagination/hlm-pagination-next.ts +65 -0
  173. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/pagination/hlm-pagination-previous.ts +65 -0
  174. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/pagination/hlm-pagination.ts +19 -0
  175. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/pagination/index.ts +31 -0
  176. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/popover/hlm-popover-content.ts +25 -0
  177. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/popover/hlm-popover-description.ts +12 -0
  178. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/popover/hlm-popover-header.ts +12 -0
  179. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/popover/hlm-popover-portal.ts +8 -0
  180. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/popover/hlm-popover-title.ts +12 -0
  181. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/popover/hlm-popover-trigger.ts +14 -0
  182. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/popover/hlm-popover.ts +23 -0
  183. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/popover/index.ts +25 -0
  184. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-content.ts +44 -0
  185. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-group.ts +14 -0
  186. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-item.ts +36 -0
  187. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-label.ts +14 -0
  188. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-multiple.ts +37 -0
  189. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-placeholder.ts +17 -0
  190. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-portal.ts +8 -0
  191. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-scroll-down.ts +22 -0
  192. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-scroll-up.ts +22 -0
  193. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-separator.ts +14 -0
  194. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-trigger.ts +59 -0
  195. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-value-template.ts +5 -0
  196. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-value.ts +18 -0
  197. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-values-content.ts +9 -0
  198. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select-values.ts +5 -0
  199. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/hlm-select.ts +37 -0
  200. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/select/index.ts +52 -0
  201. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/separator/hlm-separator.ts +19 -0
  202. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/separator/index.ts +5 -0
  203. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/skeleton/hlm-skeleton.ts +14 -0
  204. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/skeleton/index.ts +5 -0
  205. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spinner/hlm-spinner.ts +26 -0
  206. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spinner/index.ts +5 -0
  207. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/utils/hlm.ts +313 -0
  208. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/utils/index.ts +2 -0
  209. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/utils/provide-spartan-hlm.ts +34 -0
  210. package/dist/force-app/main/default/uiBundles/angularextapp/src/index.html +0 -1
  211. package/dist/force-app/main/default/uiBundles/angularextapp/src/{styles.scss → styles.css} +7 -38
  212. package/dist/force-app/main/default/uiBundles/angularextapp/tsconfig.json +4 -1
  213. package/dist/package-lock.json +2 -2
  214. package/dist/package.json +1 -1
  215. package/package.json +1 -1
  216. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/_field-size.scss +0 -42
  217. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/button/button.scss +0 -112
  218. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/card/card.scss +0 -34
  219. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-picker/date-picker.scss +0 -36
  220. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-range-picker/date-range-picker.scss +0 -33
  221. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/input/input.scss +0 -35
  222. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/label/label.html +0 -3
  223. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/select/select.scss +0 -35
  224. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/separator/separator.html +0 -1
  225. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/separator/separator.scss +0 -23
  226. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/skeleton/skeleton.html +0 -1
  227. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/skeleton/skeleton.scss +0 -28
  228. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/submit-button/submit-button.scss +0 -17
  229. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/account-detail/account-detail-page.scss +0 -7
  230. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/home/home-page.html +0 -18
  231. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/home/home-page.ts +0 -47
  232. package/dist/force-app/main/default/uiBundles/angularextapp/src/theme.scss +0 -39
@@ -3,54 +3,29 @@
3
3
  * All rights reserved.
4
4
  * For full license text, see the LICENSE.txt file
5
5
  */
6
- import {
7
- booleanAttribute,
8
- ChangeDetectionStrategy,
9
- Component,
10
- computed,
11
- input,
12
- } from '@angular/core';
13
- import { MatDivider } from '@angular/material/divider';
6
+ import { booleanAttribute, ChangeDetectionStrategy, Component, input } from '@angular/core';
7
+ import { BrnSeparator } from '@spartan-ng/brain/separator';
8
+ import { hlmSeparatorClass } from '@spartan-ng/styles/separator';
9
+ import { classes } from '@spartan-ng/styles/utils';
14
10
 
15
- /** Layout axis of the separator line. */
16
11
  export type AppSeparatorOrientation = 'horizontal' | 'vertical';
17
12
 
18
- const BASE_CLASSES = 'shrink-0';
19
- const ORIENTATION_CLASSES: Record<AppSeparatorOrientation, string> = {
20
- horizontal: 'block w-full',
21
- vertical: 'self-stretch',
22
- };
23
-
24
- /**
25
- * Divider built on Material's `mat-divider`. `decorative` (default) hides the
26
- * host from assistive tech (`role="none"`); when false it exposes
27
- * `role="separator"` + `aria-orientation`. The inner `mat-divider` is marked
28
- * `role="presentation"` so it never announces a duplicate separator.
29
- */
30
13
  @Component({
31
14
  selector: 'app-separator',
32
15
  changeDetection: ChangeDetectionStrategy.OnPush,
33
- imports: [MatDivider],
34
- templateUrl: './separator.html',
35
- styleUrl: './separator.scss',
16
+ hostDirectives: [{ directive: BrnSeparator, inputs: ['orientation', 'decorative'] }],
36
17
  host: {
37
18
  'data-slot': 'separator',
38
- '[attr.data-orientation]': 'orientation()',
39
- '[attr.role]': "decorative() ? 'none' : 'separator'",
40
- '[attr.aria-orientation]':
41
- "decorative() ? null : (orientation() === 'vertical' ? 'vertical' : 'horizontal')",
42
- '[class]': 'hostClass()',
43
19
  },
20
+ template: '',
44
21
  })
45
22
  export class SeparatorComponent {
46
23
  readonly orientation = input<AppSeparatorOrientation>('horizontal');
47
24
  readonly decorative = input(true, { transform: booleanAttribute });
48
- /** Adds Material's horizontal inset margin so the line doesn't run edge-to-edge. */
49
- readonly inset = input(false, { transform: booleanAttribute });
50
25
 
51
- protected readonly isVertical = computed(() => this.orientation() === 'vertical');
52
-
53
- protected readonly hostClass = computed(
54
- () => `${BASE_CLASSES} ${ORIENTATION_CLASSES[this.orientation()]}`,
55
- );
26
+ constructor() {
27
+ classes(() => hlmSeparatorClass);
28
+ }
56
29
  }
30
+
31
+ export const SeparatorImports = [SeparatorComponent] as const;
@@ -4,21 +4,17 @@
4
4
  * For full license text, see the LICENSE.txt file
5
5
  */
6
6
  import { ChangeDetectionStrategy, Component } from '@angular/core';
7
+ import { HlmSkeleton } from '@spartan-ng/styles/skeleton';
7
8
 
8
- /**
9
- * Loading skeleton — a pulsing block sized by host `class` utilities (e.g.
10
- * `class="h-4 w-32"`); it has no intrinsic size, so always set width/height.
11
- * `aria-hidden`, so announce loading via the container's `aria-busy`.
12
- */
13
9
  @Component({
14
10
  selector: 'app-skeleton',
15
11
  changeDetection: ChangeDetectionStrategy.OnPush,
16
- templateUrl: './skeleton.html',
17
- styleUrl: './skeleton.scss',
12
+ hostDirectives: [HlmSkeleton],
18
13
  host: {
19
- 'data-slot': 'skeleton',
20
14
  'aria-hidden': 'true',
21
- class: 'bg-accent rounded-md',
22
15
  },
16
+ template: '<ng-content />',
23
17
  })
24
18
  export class SkeletonComponent {}
19
+
20
+ export const SkeletonImports = [SkeletonComponent] as const;
@@ -4,32 +4,25 @@
4
4
  * For full license text, see the LICENSE.txt file
5
5
  */
6
6
  import { ChangeDetectionStrategy, Component, input } from '@angular/core';
7
- import { MatProgressSpinnerModule, ProgressSpinnerMode } from '@angular/material/progress-spinner';
7
+ import { HlmSpinnerImports } from '@spartan-ng/styles/spinner';
8
+ import { classes } from '@spartan-ng/styles/utils';
8
9
 
9
- /**
10
- * Thin wrapper over Material's `mat-progress-spinner`. Defaults to an
11
- * indeterminate 24px spinner. `ariaLabel` names the `role="progressbar"`.
12
- */
13
10
  @Component({
14
11
  selector: 'app-spinner',
12
+ imports: [HlmSpinnerImports],
15
13
  changeDetection: ChangeDetectionStrategy.OnPush,
16
- imports: [MatProgressSpinnerModule],
17
- template: `
18
- <mat-progress-spinner
19
- [mode]="mode()"
20
- [diameter]="diameter()"
21
- [value]="value()"
22
- [attr.aria-label]="ariaLabel()"
23
- />
24
- `,
14
+ host: {
15
+ role: 'status',
16
+ '[attr.aria-label]': 'ariaLabel()',
17
+ },
18
+ template: `<hlm-spinner />`,
25
19
  })
26
20
  export class SpinnerComponent {
27
- readonly diameter = input<number>(24);
28
- readonly mode = input<ProgressSpinnerMode>('indeterminate');
21
+ public readonly ariaLabel = input<string>('Loading', { alias: 'aria-label' });
29
22
 
30
- /** Progress value (0–100) used only when `mode` is `determinate`. */
31
- readonly value = input<number>(0);
32
-
33
- /** Accessible name announced by assistive tech. */
34
- readonly ariaLabel = input<string>('Loading', { alias: 'aria-label' });
23
+ constructor() {
24
+ classes(() => 'text-[length:--spacing(4)]');
25
+ }
35
26
  }
27
+
28
+ export const SpinnerImports = [SpinnerComponent] as const;
@@ -14,8 +14,7 @@
14
14
  </app-status-alert>
15
15
  } } @if (success()) {
16
16
  <app-status-alert variant="success" [message]="success()!" />
17
- }
18
-
17
+ } @if (!showAuthAlert()) {
19
18
  <form (ngSubmit)="onSubmit()">
20
19
  <ng-content />
21
20
  <app-submit-button
@@ -29,6 +28,6 @@
29
28
 
30
29
  @if (footer(); as f) {
31
30
  <app-footer-link [text]="f.text ?? ''" [to]="f.link" [linkText]="f.linkText" />
32
- }
31
+ } }
33
32
  </div>
34
33
  </app-card-layout>
@@ -1,26 +1,36 @@
1
1
  @if (loading()) {
2
2
  <app-skeleton class="size-8 rounded-full" />
3
3
  } @else {
4
- <button matIconButton [matMenuTriggerFor]="menu" aria-label="User menu">
5
- <mat-icon>person</mat-icon>
6
- </button>
4
+ <app-dropdown-menu
5
+ align="end"
6
+ aria-label="User menu"
7
+ triggerClass="inline-flex size-8 items-center justify-center rounded-full hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none"
8
+ >
9
+ <app-icon trigger name="person" size="24" />
7
10
 
8
- <mat-menu #menu="matMenu" xPosition="before">
9
- @if (isAuthenticated()) {
10
- <div class="px-3 py-2 font-medium truncate">{{ user()?.name }}</div>
11
- <hr />
12
- <a mat-menu-item [routerLink]="routes.PROFILE.PATH">Edit Profile</a>
13
- <ng-content select="[menuItems]" />
14
- <button mat-menu-item type="button" (click)="onLogout()">Sign Out</button>
15
- } @else {
16
- <a mat-menu-item [routerLink]="routes.LOGIN.PATH">
17
- <mat-icon>login</mat-icon>
18
- <span>Log In</span>
19
- </a>
20
- <a mat-menu-item [routerLink]="routes.REGISTER.PATH">
21
- <mat-icon>person_add</mat-icon>
22
- <span>Register</span>
23
- </a>
24
- }
25
- </mat-menu>
11
+ <ng-template appDropdownMenuContent>
12
+ @if (isAuthenticated()) {
13
+ <app-dropdown-menu-label class="truncate">{{ user()?.name }}</app-dropdown-menu-label>
14
+ <app-dropdown-menu-separator />
15
+ <a appDropdownMenuItem [routerLink]="routes.PROFILE.PATH">
16
+ <app-icon name="editProfile" />
17
+ <span>Edit Profile</span>
18
+ </a>
19
+ <ng-content select="[menuItems]" />
20
+ <button appDropdownMenuItem type="button" (triggered)="onLogout()">
21
+ <app-icon name="logout" />
22
+ <span>Sign Out</span>
23
+ </button>
24
+ } @else {
25
+ <a appDropdownMenuItem [routerLink]="routes.LOGIN.PATH">
26
+ <app-icon name="login" />
27
+ <span>Log In</span>
28
+ </a>
29
+ <a appDropdownMenuItem [routerLink]="routes.REGISTER.PATH">
30
+ <app-icon name="personAdd" />
31
+ <span>Register</span>
32
+ </a>
33
+ }
34
+ </ng-template>
35
+ </app-dropdown-menu>
26
36
  }
@@ -5,31 +5,19 @@
5
5
  */
6
6
  import { ChangeDetectionStrategy, Component, inject } from "@angular/core";
7
7
  import { RouterLink } from "@angular/router";
8
- import { MatButtonModule } from "@angular/material/button";
9
- import { MatIconModule } from "@angular/material/icon";
10
- import { MatMenuModule } from "@angular/material/menu";
8
+ import { DropdownMenuImports } from "../../../../components/ui/dropdown-menu/dropdown-menu";
9
+ import { IconComponent } from "../../../../components/ui/icon/icon";
11
10
  import { SkeletonComponent } from "../../../../components/ui/skeleton/skeleton";
12
11
  import { AuthService } from "../../auth/auth.service";
13
12
  import { ROUTES } from "../../config/authentication.config";
14
13
 
15
- /**
16
- * Auth menu — the Angular port of the React `AuthMenu`. A header dropdown that
17
- * shows the authenticated user's name + Edit Profile / Sign Out, or Log In /
18
- * Register for guests. While auth state is loading it shows a skeleton avatar.
19
- *
20
- * Owns its own trigger and `mat-menu` (the canonical Material menu shape): an
21
- * icon-only person button carries `matMenuTriggerFor`, so the trigger — with its
22
- * `aria-haspopup` / `aria-expanded` / keyboard handling — sits on a real focusable
23
- * `<button>`. Extra items can be inserted before Sign Out via `[menuItems]`
24
- * projection.
25
- *
26
- * Reads `AuthService` directly (the `providedIn: 'root'` replacement for
27
- * `useAuth`), so no inputs are needed for auth state.
28
- */
14
+ // Header dropdown: shows the user's name + Edit Profile / Sign Out, or Log In
15
+ // / Register for guests. Shows a skeleton avatar while auth state is loading.
16
+ // Extra items can be inserted before Sign Out via [menuItems] projection.
29
17
  @Component({
30
18
  selector: "app-auth-menu",
31
19
  changeDetection: ChangeDetectionStrategy.OnPush,
32
- imports: [RouterLink, MatButtonModule, MatIconModule, MatMenuModule, SkeletonComponent],
20
+ imports: [RouterLink, IconComponent, SkeletonComponent, ...DropdownMenuImports],
33
21
  templateUrl: "./auth-menu.html",
34
22
  })
35
23
  export class AuthMenuComponent {
@@ -27,10 +27,10 @@
27
27
  </div>
28
28
 
29
29
  <div class="flex gap-4 justify-end">
30
- <app-button variant="outlined" (clicked)="onLogoutClick()">
30
+ <app-button appearance="outlined" (clicked)="onLogoutClick()">
31
31
  {{ labels.logoutButton }}
32
32
  </app-button>
33
- <app-button variant="filled" (clicked)="onContinue()">
33
+ <app-button appearance="filled" (clicked)="onContinue()">
34
34
  {{ labels.continueButton }}
35
35
  </app-button>
36
36
  </div>
@@ -1,5 +1,9 @@
1
- <app-button type="submit" [disabled]="submitting() || disabled()" class="w-full">
2
- @if (submitting()) {
3
- <app-spinner [diameter]="16" aria-hidden="true" />
4
- {{ loadingLabel() }} } @else { {{ label() }} }
1
+ <app-button
2
+ type="submit"
3
+ class="w-full"
4
+ [loading]="submitting()"
5
+ [loadingLabel]="loadingLabel()"
6
+ [disabled]="disabled()"
7
+ >
8
+ {{ label() }}
5
9
  </app-button>
@@ -5,31 +5,19 @@
5
5
  */
6
6
  import { ChangeDetectionStrategy, Component, input } from "@angular/core";
7
7
  import { ButtonComponent } from "../../../components/ui/button/button";
8
- import { SpinnerComponent } from "../../../components/ui/spinner/spinner";
9
8
 
10
- /**
11
- * Submit button that reflects form submission state — the Angular port of the
12
- * React `SubmitButton`, which subscribed to `form.isSubmitting`.
13
- *
14
- * Reactive Forms have no equivalent subscription; instead the parent passes the
15
- * form's `pending`/submitting flag via `[submitting]` and the caller-provided
16
- * `[disabled]`. While submitting the button is disabled and shows a spinner with
17
- * the loading label — the same UX (prevents double-submit + gives feedback).
18
- */
9
+ // Submit button reflecting form submission state: the parent passes its
10
+ // submitting flag via [submitting]. While submitting the base button is
11
+ // disabled and shows a spinner with the loading label (prevents double-submit).
19
12
  @Component({
20
13
  selector: "app-submit-button",
21
14
  changeDetection: ChangeDetectionStrategy.OnPush,
22
- imports: [ButtonComponent, SpinnerComponent],
15
+ imports: [ButtonComponent],
23
16
  templateUrl: "./submit-button.html",
24
- styleUrl: "./submit-button.scss",
25
17
  })
26
18
  export class SubmitButtonComponent {
27
- /** Button text when not submitting. */
28
19
  readonly label = input.required<string>();
29
- /** Button text while submitting. */
30
20
  readonly loadingLabel = input<string>("Submitting…");
31
- /** True while the form submission is in flight. */
32
21
  readonly submitting = input<boolean>(false);
33
- /** Additional disabled condition from the caller (e.g. already authenticated). */
34
22
  readonly disabled = input<boolean>(false);
35
23
  }
@@ -6,18 +6,8 @@
6
6
  <li class="inline-flex items-center gap-1.5">
7
7
  <a [routerLink]="'/'" class="hover:text-foreground transition-colors">{{ homeLabel() }}</a>
8
8
  </li>
9
- <li aria-hidden="true" class="[&>svg]:size-3.5">
10
- <svg
11
- xmlns="http://www.w3.org/2000/svg"
12
- viewBox="0 0 24 24"
13
- fill="none"
14
- stroke="currentColor"
15
- stroke-width="2"
16
- stroke-linecap="round"
17
- stroke-linejoin="round"
18
- >
19
- <polyline points="9 18 15 12 9 6" />
20
- </svg>
9
+ <li aria-hidden="true">
10
+ <app-icon name="chevronRight" size="14px" class="flex" />
21
11
  </li>
22
12
  } @if (isDetailView()) {
23
13
  <li class="inline-flex items-center gap-1.5">
@@ -25,18 +15,8 @@
25
15
  >{{ listLabel() }}</a
26
16
  >
27
17
  </li>
28
- <li aria-hidden="true" class="[&>svg]:size-3.5">
29
- <svg
30
- xmlns="http://www.w3.org/2000/svg"
31
- viewBox="0 0 24 24"
32
- fill="none"
33
- stroke="currentColor"
34
- stroke-width="2"
35
- stroke-linecap="round"
36
- stroke-linejoin="round"
37
- >
38
- <polyline points="9 18 15 12 9 6" />
39
- </svg>
18
+ <li aria-hidden="true">
19
+ <app-icon name="chevronRight" size="14px" class="flex" />
40
20
  </li>
41
21
  <li class="inline-flex items-center gap-1.5">
42
22
  @if (loading() && !recordName()) {
@@ -5,36 +5,23 @@
5
5
  */
6
6
  import { ChangeDetectionStrategy, Component, computed, input } from "@angular/core";
7
7
  import { RouterLink } from "@angular/router";
8
+ import { IconComponent } from "../../../components/ui/icon/icon";
8
9
  import { SkeletonComponent } from "../../../components/ui/skeleton/skeleton";
9
10
 
10
- /**
11
- * Object-search breadcrumb — Home > Records list > (optional) Record name.
12
- *
13
- * Mirrors the React `ObjectBreadcrumb`. Renders the list-only crumb by default
14
- * and switches to the detail-view crumb (with record name + skeleton fallback)
15
- * as soon as `loading` or `recordName` is set. Uses Angular `routerLink` where
16
- * the React version uses `react-router`'s `Link`.
17
- */
11
+ /** Object-search breadcrumb — Home > Records list > (optional) Record name. */
18
12
  @Component({
19
13
  selector: "app-object-breadcrumb",
20
14
  changeDetection: ChangeDetectionStrategy.OnPush,
21
- imports: [RouterLink, SkeletonComponent],
15
+ imports: [RouterLink, IconComponent, SkeletonComponent],
22
16
  templateUrl: "./breadcrumb.html",
23
17
  })
24
18
  export class ObjectBreadcrumbComponent {
25
- /** Router path for the object list view (e.g. `/accounts`). */
26
19
  readonly listPath = input.required<string>();
27
- /** Label for the list crumb (e.g. `Accounts`). */
28
20
  readonly listLabel = input.required<string>();
29
- /** Record name for the detail-view leaf crumb; omit for list-only view. */
30
21
  readonly recordName = input<string | undefined>(undefined);
31
- /** Show a skeleton in the leaf crumb while the record is loading. */
32
22
  readonly loading = input<boolean>(false);
33
- /** Prepend a Home crumb (default `true`). */
34
23
  readonly includeHome = input<boolean>(true);
35
- /** Label for the Home crumb (default `Home`). */
36
24
  readonly homeLabel = input<string>("Home");
37
25
 
38
- /** `true` when the crumb should render list + record leaves. */
39
26
  protected readonly isDetailView = computed(() => this.loading() || !!this.recordName());
40
27
  }
@@ -85,7 +85,7 @@ export class DateFilterComponent {
85
85
  if (date) this.emit(op, date);
86
86
  }
87
87
 
88
- protected onDateChange(date: Date | null): void {
88
+ protected onDateChange(date: Date | null | undefined): void {
89
89
  const cfg = this.config();
90
90
  if (!date) {
91
91
  this.state.removeFilter(cfg.field);
@@ -1,6 +1,7 @@
1
- <app-filter-field-wrapper [label]="config().label" [helpText]="config().helpText">
1
+ <app-filter-field-wrapper [helpText]="config().helpText">
2
2
  <app-date-range-picker
3
3
  class="w-full"
4
+ [label]="config().label"
4
5
  startPlaceholder="Start"
5
6
  endPlaceholder="End"
6
7
  [readonly]="true"
@@ -4,8 +4,6 @@
4
4
  * For full license text, see the LICENSE.txt file
5
5
  */
6
6
  import { ChangeDetectionStrategy, Component, computed, inject, input } from "@angular/core";
7
- // Base-app UI wrapper, inherited (not recreated) by this feature. Post-compose
8
- // it lands at uiBundles/<target>/src/app/components/ui/date-range-picker/..., three levels up.
9
7
  import {
10
8
  DateRange,
11
9
  DateRangePickerComponent,
@@ -16,13 +14,8 @@ import { toDate, toDateString } from "./date-filter";
16
14
  import { FilterFieldWrapperComponent } from "./filter-field-wrapper";
17
15
 
18
16
  /**
19
- * Date range filter — a single two-ended range picker. Emits a `daterange`
20
- * (or `datetimerange`) filter with `min` / `max` as `YYYY-MM-DD` strings; the
21
- * filter builder wires each end into a `gte` / `lte` clause.
22
- *
23
- * Thin bridge over the base `app-date-range-picker` (Material's
24
- * `mat-date-range-picker`): it maps the picker's `DateRange<Date>` value to and
25
- * from the `min` / `max` string split the filter state stores.
17
+ * Date range filter — a two-ended range picker. Emits a `daterange` (or
18
+ * `datetimerange`) filter with `min` / `max` as `YYYY-MM-DD` strings.
26
19
  */
27
20
  @Component({
28
21
  selector: "app-date-range-filter",
@@ -33,17 +26,15 @@ import { FilterFieldWrapperComponent } from "./filter-field-wrapper";
33
26
  export class DateRangeFilterComponent {
34
27
  private readonly state = inject(ObjectSearchStateService);
35
28
 
36
- /** Field config: `field`, `label`, `helpText`, ... */
37
29
  readonly config = input.required<FilterFieldConfig>();
38
- /** Underlying filter type — `'daterange'` (default) or `'datetimerange'`. */
39
30
  readonly filterType = input<FilterFieldType>("daterange");
40
31
 
41
32
  private readonly active = computed(() => this.state.filterFor(this.config().field));
42
33
 
43
- /** The active filter's `min` / `max` strings surfaced as a picker range. */
44
- protected readonly range = computed<DateRange<Date>>(
45
- () => new DateRange(toDate(this.active()?.min), toDate(this.active()?.max)),
46
- );
34
+ protected readonly range = computed<DateRange<Date>>(() => ({
35
+ start: toDate(this.active()?.min),
36
+ end: toDate(this.active()?.max),
37
+ }));
47
38
 
48
39
  /** Cap the picker at today when the field can't hold a future date. */
49
40
  protected readonly maxDate = computed<Date | null>(() =>
@@ -1,5 +1,7 @@
1
1
  <div class="space-y-1">
2
+ @if (label()) {
2
3
  <app-label [for]="htmlFor()">{{ label() }}</app-label>
4
+ }
3
5
  <ng-content />
4
6
  <div class="min-h-4">
5
7
  @if (error(); as err) {
@@ -4,20 +4,9 @@
4
4
  * For full license text, see the LICENSE.txt file
5
5
  */
6
6
  import { ChangeDetectionStrategy, Component, input } from "@angular/core";
7
- // Base-app UI wrapper, inherited (not recreated) by this feature. Post-compose
8
- // it lands at uiBundles/<target>/src/app/components/ui/label/..., three levels up from this
9
- // filter folder (app/object-search/filters/ -> app/components/ui/).
7
+ // Post-compose, this lands 3 levels up at app/components/ui/label/__inherit__label.
10
8
  import { LabelComponent } from "../../../components/ui/label/label";
11
9
 
12
- /**
13
- * Standard label + control + help/error scaffold shared by every filter
14
- * component (the Angular analogue of the React `FilterFieldWrapper`).
15
- *
16
- * The control itself is content-projected so each filter can supply the
17
- * primitive that fits its data type (input, select, popover, date picker, ...)
18
- * while the wrapper keeps the layout, label, and error/help affordances
19
- * consistent across the search page.
20
- */
21
10
  @Component({
22
11
  selector: "app-filter-field-wrapper",
23
12
  changeDetection: ChangeDetectionStrategy.OnPush,
@@ -25,12 +14,8 @@ import { LabelComponent } from "../../../components/ui/label/label";
25
14
  templateUrl: "./filter-field-wrapper.html",
26
15
  })
27
16
  export class FilterFieldWrapperComponent {
28
- /** Visible field label rendered above the control. */
29
- readonly label = input.required<string>();
30
- /** Optional `for` attribute forwarded to the underlying `<label>`. */
17
+ readonly label = input<string>("");
31
18
  readonly htmlFor = input<string | null>(null);
32
- /** Advisory copy rendered below the control when there is no error. */
33
19
  readonly helpText = input<string | undefined>(undefined);
34
- /** Validation message; when set, replaces the help text. */
35
20
  readonly error = input<string | undefined>(undefined);
36
21
  }
@@ -1,6 +1,7 @@
1
- <app-filter-field-wrapper [label]="config().label" [helpText]="config().helpText">
1
+ <app-filter-field-wrapper [helpText]="config().helpText">
2
2
  <app-select
3
3
  multiple
4
+ [label]="config().label"
4
5
  [size]="size()"
5
6
  [options]="config().options ?? []"
6
7
  [placeholder]="placeholder()"
@@ -16,11 +16,6 @@ import {
16
16
  import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
17
17
  import { Subject } from "rxjs";
18
18
  import { debounceTime } from "rxjs/operators";
19
- import { MatInputModule } from "@angular/material/input";
20
- import { MatFormFieldModule } from "@angular/material/form-field";
21
- import { FormsModule } from "@angular/forms";
22
- // Base-app UI wrapper, inherited (not recreated) by this feature. Post-compose
23
- // it lands at uiBundles/<target>/src/app/components/ui/input/..., three levels up.
24
19
  import { InputComponent } from "../../../components/ui/input/input";
25
20
  import { ObjectSearchStateService } from "../object-search-state.service";
26
21
  import { FILTER_DEBOUNCE_MS } from "../utils/debounce";
@@ -30,34 +25,21 @@ import { FilterFieldWrapperComponent } from "./filter-field-wrapper";
30
25
  /**
31
26
  * Numeric range filter — paired `min` / `max` inputs whose committed values are
32
27
  * written as strings on a `type: 'numeric'` filter (numeric coercion happens
33
- * in `buildSingleFilter`).
34
- *
35
- * Local signals drive the inputs immediately; a trailing debounce commits the
36
- * pair, but only when the range is self-consistent (`min <= max`) and within
37
- * `boundMin` / `boundMax` if provided — an inverted or out-of-bounds pair
38
- * shows the same inline error the React reference renders and skips the write.
28
+ * in `buildSingleFilter`). A trailing debounce commits the pair, skipping
29
+ * writes when the range is inverted or out of `boundMin` / `boundMax`.
39
30
  */
40
31
  @Component({
41
32
  selector: "app-numeric-range-filter",
42
33
  changeDetection: ChangeDetectionStrategy.OnPush,
43
- imports: [
44
- InputComponent,
45
- FilterFieldWrapperComponent,
46
- FormsModule,
47
- MatFormFieldModule,
48
- MatInputModule,
49
- ],
34
+ imports: [InputComponent, FilterFieldWrapperComponent],
50
35
  templateUrl: "./numeric-range-filter.html",
51
36
  })
52
37
  export class NumericRangeFilterComponent {
53
38
  private readonly state = inject(ObjectSearchStateService);
54
39
  private readonly destroyRef = inject(DestroyRef);
55
40
 
56
- /** Field config: `field`, `label`, `helpText`, ... */
57
41
  readonly config = input.required<FilterFieldConfig>();
58
- /** Optional lower bound accepted by the field (used for validation only). */
59
42
  readonly boundMin = input<number | undefined>(undefined);
60
- /** Optional upper bound accepted by the field (used for validation only). */
61
43
  readonly boundMax = input<number | undefined>(undefined);
62
44
 
63
45
  protected readonly localMin = signal<string>("");
@@ -1,6 +1,6 @@
1
- <app-filter-field-wrapper [label]="config().label" [htmlFor]="inputId()">
2
- <app-input
3
- type="search"
1
+ <app-filter-field-wrapper [label]="config().label" [htmlFor]="fieldId()">
2
+ <app-search-bar
3
+ [inputId]="fieldId()"
4
4
  [placeholder]="config().placeholder ?? 'Search...'"
5
5
  [value]="localValue()"
6
6
  (valueChange)="onValueChange($event)"