@lifecorner/angular-ui-kit 3.4.1 → 3.5.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 (340) hide show
  1. package/README.md +12 -2
  2. package/fesm2022/lifecorner-angular-ui-kit-accordion.mjs +454 -0
  3. package/fesm2022/lifecorner-angular-ui-kit-accordion.mjs.map +1 -0
  4. package/fesm2022/lifecorner-angular-ui-kit-alert.mjs +297 -0
  5. package/fesm2022/lifecorner-angular-ui-kit-alert.mjs.map +1 -0
  6. package/fesm2022/lifecorner-angular-ui-kit-app-shell.mjs +190 -0
  7. package/fesm2022/lifecorner-angular-ui-kit-app-shell.mjs.map +1 -0
  8. package/fesm2022/lifecorner-angular-ui-kit-area-chart.mjs +446 -0
  9. package/fesm2022/lifecorner-angular-ui-kit-area-chart.mjs.map +1 -0
  10. package/fesm2022/lifecorner-angular-ui-kit-avatar-group.mjs +158 -0
  11. package/fesm2022/lifecorner-angular-ui-kit-avatar-group.mjs.map +1 -0
  12. package/fesm2022/lifecorner-angular-ui-kit-avatar.mjs +216 -0
  13. package/fesm2022/lifecorner-angular-ui-kit-avatar.mjs.map +1 -0
  14. package/fesm2022/lifecorner-angular-ui-kit-badge.mjs +121 -0
  15. package/fesm2022/lifecorner-angular-ui-kit-badge.mjs.map +1 -0
  16. package/fesm2022/lifecorner-angular-ui-kit-bar-chart.mjs +360 -0
  17. package/fesm2022/lifecorner-angular-ui-kit-bar-chart.mjs.map +1 -0
  18. package/fesm2022/lifecorner-angular-ui-kit-bottom-nav.mjs +344 -0
  19. package/fesm2022/lifecorner-angular-ui-kit-bottom-nav.mjs.map +1 -0
  20. package/fesm2022/lifecorner-angular-ui-kit-breadcrumbs.mjs +191 -0
  21. package/fesm2022/lifecorner-angular-ui-kit-breadcrumbs.mjs.map +1 -0
  22. package/fesm2022/lifecorner-angular-ui-kit-button.mjs +423 -0
  23. package/fesm2022/lifecorner-angular-ui-kit-button.mjs.map +1 -0
  24. package/fesm2022/lifecorner-angular-ui-kit-calendar.mjs +368 -0
  25. package/fesm2022/lifecorner-angular-ui-kit-calendar.mjs.map +1 -0
  26. package/fesm2022/lifecorner-angular-ui-kit-callout.mjs +203 -0
  27. package/fesm2022/lifecorner-angular-ui-kit-callout.mjs.map +1 -0
  28. package/fesm2022/lifecorner-angular-ui-kit-card.mjs +323 -0
  29. package/fesm2022/lifecorner-angular-ui-kit-card.mjs.map +1 -0
  30. package/fesm2022/lifecorner-angular-ui-kit-chat.mjs +790 -0
  31. package/fesm2022/lifecorner-angular-ui-kit-chat.mjs.map +1 -0
  32. package/fesm2022/lifecorner-angular-ui-kit-checkbox.mjs +325 -0
  33. package/fesm2022/lifecorner-angular-ui-kit-checkbox.mjs.map +1 -0
  34. package/fesm2022/lifecorner-angular-ui-kit-chip.mjs +214 -0
  35. package/fesm2022/lifecorner-angular-ui-kit-chip.mjs.map +1 -0
  36. package/fesm2022/lifecorner-angular-ui-kit-choice-prompt.mjs +375 -0
  37. package/fesm2022/lifecorner-angular-ui-kit-choice-prompt.mjs.map +1 -0
  38. package/fesm2022/lifecorner-angular-ui-kit-code-block.mjs +518 -0
  39. package/fesm2022/lifecorner-angular-ui-kit-code-block.mjs.map +1 -0
  40. package/fesm2022/lifecorner-angular-ui-kit-color-picker.mjs +278 -0
  41. package/fesm2022/lifecorner-angular-ui-kit-color-picker.mjs.map +1 -0
  42. package/fesm2022/lifecorner-angular-ui-kit-combobox.mjs +688 -0
  43. package/fesm2022/lifecorner-angular-ui-kit-combobox.mjs.map +1 -0
  44. package/fesm2022/lifecorner-angular-ui-kit-confirm-dialog.mjs +494 -0
  45. package/fesm2022/lifecorner-angular-ui-kit-confirm-dialog.mjs.map +1 -0
  46. package/fesm2022/lifecorner-angular-ui-kit-container.mjs +103 -0
  47. package/fesm2022/lifecorner-angular-ui-kit-container.mjs.map +1 -0
  48. package/fesm2022/lifecorner-angular-ui-kit-copy-field.mjs +308 -0
  49. package/fesm2022/lifecorner-angular-ui-kit-copy-field.mjs.map +1 -0
  50. package/fesm2022/lifecorner-angular-ui-kit-date-range-picker.mjs +466 -0
  51. package/fesm2022/lifecorner-angular-ui-kit-date-range-picker.mjs.map +1 -0
  52. package/fesm2022/lifecorner-angular-ui-kit-datepicker.mjs +810 -0
  53. package/fesm2022/lifecorner-angular-ui-kit-datepicker.mjs.map +1 -0
  54. package/fesm2022/lifecorner-angular-ui-kit-dependency-viewer.mjs +1761 -0
  55. package/fesm2022/lifecorner-angular-ui-kit-dependency-viewer.mjs.map +1 -0
  56. package/fesm2022/lifecorner-angular-ui-kit-description-list.mjs +165 -0
  57. package/fesm2022/lifecorner-angular-ui-kit-description-list.mjs.map +1 -0
  58. package/fesm2022/lifecorner-angular-ui-kit-diff-viewer.mjs +356 -0
  59. package/fesm2022/lifecorner-angular-ui-kit-diff-viewer.mjs.map +1 -0
  60. package/fesm2022/lifecorner-angular-ui-kit-divider.mjs +119 -0
  61. package/fesm2022/lifecorner-angular-ui-kit-divider.mjs.map +1 -0
  62. package/fesm2022/lifecorner-angular-ui-kit-document-viewer.mjs +762 -0
  63. package/fesm2022/lifecorner-angular-ui-kit-document-viewer.mjs.map +1 -0
  64. package/fesm2022/lifecorner-angular-ui-kit-donut-chart.mjs +255 -0
  65. package/fesm2022/lifecorner-angular-ui-kit-donut-chart.mjs.map +1 -0
  66. package/fesm2022/lifecorner-angular-ui-kit-drawer.mjs +308 -0
  67. package/fesm2022/lifecorner-angular-ui-kit-drawer.mjs.map +1 -0
  68. package/fesm2022/lifecorner-angular-ui-kit-email-input.mjs +519 -0
  69. package/fesm2022/lifecorner-angular-ui-kit-email-input.mjs.map +1 -0
  70. package/fesm2022/lifecorner-angular-ui-kit-empty-state.mjs +143 -0
  71. package/fesm2022/lifecorner-angular-ui-kit-empty-state.mjs.map +1 -0
  72. package/fesm2022/lifecorner-angular-ui-kit-error-display.mjs +306 -0
  73. package/fesm2022/lifecorner-angular-ui-kit-error-display.mjs.map +1 -0
  74. package/fesm2022/lifecorner-angular-ui-kit-field-group.mjs +154 -0
  75. package/fesm2022/lifecorner-angular-ui-kit-field-group.mjs.map +1 -0
  76. package/fesm2022/lifecorner-angular-ui-kit-file-upload.mjs +281 -0
  77. package/fesm2022/lifecorner-angular-ui-kit-file-upload.mjs.map +1 -0
  78. package/fesm2022/lifecorner-angular-ui-kit-filter-bar.mjs +258 -0
  79. package/fesm2022/lifecorner-angular-ui-kit-filter-bar.mjs.map +1 -0
  80. package/fesm2022/lifecorner-angular-ui-kit-footer.mjs +200 -0
  81. package/fesm2022/lifecorner-angular-ui-kit-footer.mjs.map +1 -0
  82. package/fesm2022/lifecorner-angular-ui-kit-funnel-chart.mjs +292 -0
  83. package/fesm2022/lifecorner-angular-ui-kit-funnel-chart.mjs.map +1 -0
  84. package/fesm2022/lifecorner-angular-ui-kit-gallery.mjs +563 -0
  85. package/fesm2022/lifecorner-angular-ui-kit-gallery.mjs.map +1 -0
  86. package/fesm2022/lifecorner-angular-ui-kit-gantt-chart.mjs +314 -0
  87. package/fesm2022/lifecorner-angular-ui-kit-gantt-chart.mjs.map +1 -0
  88. package/fesm2022/lifecorner-angular-ui-kit-gauge.mjs +265 -0
  89. package/fesm2022/lifecorner-angular-ui-kit-gauge.mjs.map +1 -0
  90. package/fesm2022/lifecorner-angular-ui-kit-header.mjs +955 -0
  91. package/fesm2022/lifecorner-angular-ui-kit-header.mjs.map +1 -0
  92. package/fesm2022/lifecorner-angular-ui-kit-heatmap.mjs +305 -0
  93. package/fesm2022/lifecorner-angular-ui-kit-heatmap.mjs.map +1 -0
  94. package/fesm2022/lifecorner-angular-ui-kit-hero.mjs +168 -0
  95. package/fesm2022/lifecorner-angular-ui-kit-hero.mjs.map +1 -0
  96. package/fesm2022/lifecorner-angular-ui-kit-icon-names.mjs +9 -0
  97. package/fesm2022/lifecorner-angular-ui-kit-icon-names.mjs.map +1 -0
  98. package/fesm2022/lifecorner-angular-ui-kit-icon.mjs +1026 -0
  99. package/fesm2022/lifecorner-angular-ui-kit-icon.mjs.map +1 -0
  100. package/fesm2022/lifecorner-angular-ui-kit-input.mjs +595 -0
  101. package/fesm2022/lifecorner-angular-ui-kit-input.mjs.map +1 -0
  102. package/fesm2022/lifecorner-angular-ui-kit-internal-chart.mjs +105 -0
  103. package/fesm2022/lifecorner-angular-ui-kit-internal-chart.mjs.map +1 -0
  104. package/fesm2022/lifecorner-angular-ui-kit-internal-overlay.mjs +50 -0
  105. package/fesm2022/lifecorner-angular-ui-kit-internal-overlay.mjs.map +1 -0
  106. package/fesm2022/lifecorner-angular-ui-kit-internal-url.mjs +22 -0
  107. package/fesm2022/lifecorner-angular-ui-kit-internal-url.mjs.map +1 -0
  108. package/fesm2022/lifecorner-angular-ui-kit-kanban-board.mjs +319 -0
  109. package/fesm2022/lifecorner-angular-ui-kit-kanban-board.mjs.map +1 -0
  110. package/fesm2022/lifecorner-angular-ui-kit-line-chart.mjs +413 -0
  111. package/fesm2022/lifecorner-angular-ui-kit-line-chart.mjs.map +1 -0
  112. package/fesm2022/lifecorner-angular-ui-kit-list.mjs +338 -0
  113. package/fesm2022/lifecorner-angular-ui-kit-list.mjs.map +1 -0
  114. package/fesm2022/lifecorner-angular-ui-kit-log-viewer.mjs +813 -0
  115. package/fesm2022/lifecorner-angular-ui-kit-log-viewer.mjs.map +1 -0
  116. package/fesm2022/lifecorner-angular-ui-kit-logo.mjs +226 -0
  117. package/fesm2022/lifecorner-angular-ui-kit-logo.mjs.map +1 -0
  118. package/fesm2022/lifecorner-angular-ui-kit-markdown.mjs +756 -0
  119. package/fesm2022/lifecorner-angular-ui-kit-markdown.mjs.map +1 -0
  120. package/fesm2022/lifecorner-angular-ui-kit-menu.mjs +321 -0
  121. package/fesm2022/lifecorner-angular-ui-kit-menu.mjs.map +1 -0
  122. package/fesm2022/lifecorner-angular-ui-kit-modal.mjs +329 -0
  123. package/fesm2022/lifecorner-angular-ui-kit-modal.mjs.map +1 -0
  124. package/fesm2022/lifecorner-angular-ui-kit-models.mjs +0 -0
  125. package/fesm2022/lifecorner-angular-ui-kit-next-step-card.mjs +419 -0
  126. package/fesm2022/lifecorner-angular-ui-kit-next-step-card.mjs.map +1 -0
  127. package/fesm2022/lifecorner-angular-ui-kit-notification-center.mjs +644 -0
  128. package/fesm2022/lifecorner-angular-ui-kit-notification-center.mjs.map +1 -0
  129. package/fesm2022/lifecorner-angular-ui-kit-number-input.mjs +401 -0
  130. package/fesm2022/lifecorner-angular-ui-kit-number-input.mjs.map +1 -0
  131. package/fesm2022/lifecorner-angular-ui-kit-page-header.mjs +266 -0
  132. package/fesm2022/lifecorner-angular-ui-kit-page-header.mjs.map +1 -0
  133. package/fesm2022/lifecorner-angular-ui-kit-page-layout.mjs +127 -0
  134. package/fesm2022/lifecorner-angular-ui-kit-page-layout.mjs.map +1 -0
  135. package/fesm2022/lifecorner-angular-ui-kit-pagination.mjs +343 -0
  136. package/fesm2022/lifecorner-angular-ui-kit-pagination.mjs.map +1 -0
  137. package/fesm2022/lifecorner-angular-ui-kit-password-input.mjs +696 -0
  138. package/fesm2022/lifecorner-angular-ui-kit-password-input.mjs.map +1 -0
  139. package/fesm2022/lifecorner-angular-ui-kit-pie-chart.mjs +162 -0
  140. package/fesm2022/lifecorner-angular-ui-kit-pie-chart.mjs.map +1 -0
  141. package/fesm2022/lifecorner-angular-ui-kit-pipeline.mjs +159 -0
  142. package/fesm2022/lifecorner-angular-ui-kit-pipeline.mjs.map +1 -0
  143. package/fesm2022/lifecorner-angular-ui-kit-popover.mjs +190 -0
  144. package/fesm2022/lifecorner-angular-ui-kit-popover.mjs.map +1 -0
  145. package/fesm2022/lifecorner-angular-ui-kit-progress-bar.mjs +190 -0
  146. package/fesm2022/lifecorner-angular-ui-kit-progress-bar.mjs.map +1 -0
  147. package/fesm2022/lifecorner-angular-ui-kit-progress-ring.mjs +175 -0
  148. package/fesm2022/lifecorner-angular-ui-kit-progress-ring.mjs.map +1 -0
  149. package/fesm2022/lifecorner-angular-ui-kit-provider-button.mjs +255 -0
  150. package/fesm2022/lifecorner-angular-ui-kit-provider-button.mjs.map +1 -0
  151. package/fesm2022/lifecorner-angular-ui-kit-radar-chart.mjs +309 -0
  152. package/fesm2022/lifecorner-angular-ui-kit-radar-chart.mjs.map +1 -0
  153. package/fesm2022/lifecorner-angular-ui-kit-radio.mjs +708 -0
  154. package/fesm2022/lifecorner-angular-ui-kit-radio.mjs.map +1 -0
  155. package/fesm2022/lifecorner-angular-ui-kit-rating.mjs +327 -0
  156. package/fesm2022/lifecorner-angular-ui-kit-rating.mjs.map +1 -0
  157. package/fesm2022/lifecorner-angular-ui-kit-rich-text-editor.mjs +718 -0
  158. package/fesm2022/lifecorner-angular-ui-kit-rich-text-editor.mjs.map +1 -0
  159. package/fesm2022/lifecorner-angular-ui-kit-scatter-plot.mjs +415 -0
  160. package/fesm2022/lifecorner-angular-ui-kit-scatter-plot.mjs.map +1 -0
  161. package/fesm2022/lifecorner-angular-ui-kit-search-input.mjs +290 -0
  162. package/fesm2022/lifecorner-angular-ui-kit-search-input.mjs.map +1 -0
  163. package/fesm2022/lifecorner-angular-ui-kit-section.mjs +127 -0
  164. package/fesm2022/lifecorner-angular-ui-kit-section.mjs.map +1 -0
  165. package/fesm2022/lifecorner-angular-ui-kit-select.mjs +650 -0
  166. package/fesm2022/lifecorner-angular-ui-kit-select.mjs.map +1 -0
  167. package/fesm2022/lifecorner-angular-ui-kit-sidenav.mjs +691 -0
  168. package/fesm2022/lifecorner-angular-ui-kit-sidenav.mjs.map +1 -0
  169. package/fesm2022/lifecorner-angular-ui-kit-skeleton.mjs +144 -0
  170. package/fesm2022/lifecorner-angular-ui-kit-skeleton.mjs.map +1 -0
  171. package/fesm2022/lifecorner-angular-ui-kit-slider.mjs +204 -0
  172. package/fesm2022/lifecorner-angular-ui-kit-slider.mjs.map +1 -0
  173. package/fesm2022/lifecorner-angular-ui-kit-spacer.mjs +73 -0
  174. package/fesm2022/lifecorner-angular-ui-kit-spacer.mjs.map +1 -0
  175. package/fesm2022/lifecorner-angular-ui-kit-sparkline.mjs +318 -0
  176. package/fesm2022/lifecorner-angular-ui-kit-sparkline.mjs.map +1 -0
  177. package/fesm2022/lifecorner-angular-ui-kit-spinner.mjs +95 -0
  178. package/fesm2022/lifecorner-angular-ui-kit-spinner.mjs.map +1 -0
  179. package/fesm2022/lifecorner-angular-ui-kit-split-pane.mjs +298 -0
  180. package/fesm2022/lifecorner-angular-ui-kit-split-pane.mjs.map +1 -0
  181. package/fesm2022/lifecorner-angular-ui-kit-stack.mjs +162 -0
  182. package/fesm2022/lifecorner-angular-ui-kit-stack.mjs.map +1 -0
  183. package/fesm2022/lifecorner-angular-ui-kit-stacked-bar-chart.mjs +412 -0
  184. package/fesm2022/lifecorner-angular-ui-kit-stacked-bar-chart.mjs.map +1 -0
  185. package/fesm2022/lifecorner-angular-ui-kit-stage-list.mjs +186 -0
  186. package/fesm2022/lifecorner-angular-ui-kit-stage-list.mjs.map +1 -0
  187. package/fesm2022/lifecorner-angular-ui-kit-stat-trend.mjs +224 -0
  188. package/fesm2022/lifecorner-angular-ui-kit-stat-trend.mjs.map +1 -0
  189. package/fesm2022/lifecorner-angular-ui-kit-status-dot.mjs +122 -0
  190. package/fesm2022/lifecorner-angular-ui-kit-status-dot.mjs.map +1 -0
  191. package/fesm2022/lifecorner-angular-ui-kit-stepper.mjs +209 -0
  192. package/fesm2022/lifecorner-angular-ui-kit-stepper.mjs.map +1 -0
  193. package/fesm2022/lifecorner-angular-ui-kit-switch.mjs +249 -0
  194. package/fesm2022/lifecorner-angular-ui-kit-switch.mjs.map +1 -0
  195. package/fesm2022/lifecorner-angular-ui-kit-table.mjs +1434 -0
  196. package/fesm2022/lifecorner-angular-ui-kit-table.mjs.map +1 -0
  197. package/fesm2022/lifecorner-angular-ui-kit-tabs.mjs +407 -0
  198. package/fesm2022/lifecorner-angular-ui-kit-tabs.mjs.map +1 -0
  199. package/fesm2022/lifecorner-angular-ui-kit-tag-input.mjs +380 -0
  200. package/fesm2022/lifecorner-angular-ui-kit-tag-input.mjs.map +1 -0
  201. package/fesm2022/lifecorner-angular-ui-kit-textarea.mjs +440 -0
  202. package/fesm2022/lifecorner-angular-ui-kit-textarea.mjs.map +1 -0
  203. package/fesm2022/lifecorner-angular-ui-kit-theme.mjs +145 -0
  204. package/fesm2022/lifecorner-angular-ui-kit-theme.mjs.map +1 -0
  205. package/fesm2022/lifecorner-angular-ui-kit-timeline.mjs +262 -0
  206. package/fesm2022/lifecorner-angular-ui-kit-timeline.mjs.map +1 -0
  207. package/fesm2022/lifecorner-angular-ui-kit-toast.mjs +352 -0
  208. package/fesm2022/lifecorner-angular-ui-kit-toast.mjs.map +1 -0
  209. package/fesm2022/lifecorner-angular-ui-kit-toggle-group.mjs +215 -0
  210. package/fesm2022/lifecorner-angular-ui-kit-toggle-group.mjs.map +1 -0
  211. package/fesm2022/lifecorner-angular-ui-kit-tokens.mjs +134 -0
  212. package/fesm2022/lifecorner-angular-ui-kit-tokens.mjs.map +1 -0
  213. package/fesm2022/lifecorner-angular-ui-kit-toolbar.mjs +225 -0
  214. package/fesm2022/lifecorner-angular-ui-kit-toolbar.mjs.map +1 -0
  215. package/fesm2022/lifecorner-angular-ui-kit-tooltip.mjs +386 -0
  216. package/fesm2022/lifecorner-angular-ui-kit-tooltip.mjs.map +1 -0
  217. package/fesm2022/lifecorner-angular-ui-kit-tree-view.mjs +509 -0
  218. package/fesm2022/lifecorner-angular-ui-kit-tree-view.mjs.map +1 -0
  219. package/fesm2022/lifecorner-angular-ui-kit-typography.mjs +209 -0
  220. package/fesm2022/lifecorner-angular-ui-kit-typography.mjs.map +1 -0
  221. package/fesm2022/lifecorner-angular-ui-kit-verification-code-input.mjs +365 -0
  222. package/fesm2022/lifecorner-angular-ui-kit-verification-code-input.mjs.map +1 -0
  223. package/fesm2022/lifecorner-angular-ui-kit-waterfall-chart.mjs +371 -0
  224. package/fesm2022/lifecorner-angular-ui-kit-waterfall-chart.mjs.map +1 -0
  225. package/fesm2022/lifecorner-angular-ui-kit.mjs +109 -38925
  226. package/package.json +449 -1
  227. package/types/lifecorner-angular-ui-kit-accordion.d.ts +239 -0
  228. package/types/lifecorner-angular-ui-kit-alert.d.ts +189 -0
  229. package/types/lifecorner-angular-ui-kit-app-shell.d.ts +148 -0
  230. package/types/lifecorner-angular-ui-kit-area-chart.d.ts +180 -0
  231. package/types/lifecorner-angular-ui-kit-avatar-group.d.ts +62 -0
  232. package/types/lifecorner-angular-ui-kit-avatar.d.ts +131 -0
  233. package/types/lifecorner-angular-ui-kit-badge.d.ts +59 -0
  234. package/types/lifecorner-angular-ui-kit-bar-chart.d.ts +157 -0
  235. package/types/lifecorner-angular-ui-kit-bottom-nav.d.ts +184 -0
  236. package/types/lifecorner-angular-ui-kit-breadcrumbs.d.ts +55 -0
  237. package/types/lifecorner-angular-ui-kit-button.d.ts +181 -0
  238. package/types/lifecorner-angular-ui-kit-calendar.d.ts +136 -0
  239. package/types/lifecorner-angular-ui-kit-callout.d.ts +77 -0
  240. package/types/lifecorner-angular-ui-kit-card.d.ts +213 -0
  241. package/types/lifecorner-angular-ui-kit-chat.d.ts +379 -0
  242. package/types/lifecorner-angular-ui-kit-checkbox.d.ts +116 -0
  243. package/types/lifecorner-angular-ui-kit-chip.d.ts +104 -0
  244. package/types/lifecorner-angular-ui-kit-choice-prompt.d.ts +186 -0
  245. package/types/lifecorner-angular-ui-kit-code-block.d.ts +85 -0
  246. package/types/lifecorner-angular-ui-kit-color-picker.d.ts +88 -0
  247. package/types/lifecorner-angular-ui-kit-combobox.d.ts +222 -0
  248. package/types/lifecorner-angular-ui-kit-confirm-dialog.d.ts +211 -0
  249. package/types/lifecorner-angular-ui-kit-container.d.ts +47 -0
  250. package/types/lifecorner-angular-ui-kit-copy-field.d.ts +89 -0
  251. package/types/lifecorner-angular-ui-kit-date-range-picker.d.ts +126 -0
  252. package/types/lifecorner-angular-ui-kit-datepicker.d.ts +363 -0
  253. package/types/lifecorner-angular-ui-kit-dependency-viewer.d.ts +568 -0
  254. package/types/lifecorner-angular-ui-kit-description-list.d.ts +137 -0
  255. package/types/lifecorner-angular-ui-kit-diff-viewer.d.ts +93 -0
  256. package/types/lifecorner-angular-ui-kit-divider.d.ts +66 -0
  257. package/types/lifecorner-angular-ui-kit-document-viewer.d.ts +256 -0
  258. package/types/lifecorner-angular-ui-kit-donut-chart.d.ts +92 -0
  259. package/types/lifecorner-angular-ui-kit-drawer.d.ts +124 -0
  260. package/types/lifecorner-angular-ui-kit-email-input.d.ts +292 -0
  261. package/types/lifecorner-angular-ui-kit-empty-state.d.ts +81 -0
  262. package/types/lifecorner-angular-ui-kit-error-display.d.ts +157 -0
  263. package/types/lifecorner-angular-ui-kit-field-group.d.ts +69 -0
  264. package/types/lifecorner-angular-ui-kit-file-upload.d.ts +122 -0
  265. package/types/lifecorner-angular-ui-kit-filter-bar.d.ts +116 -0
  266. package/types/lifecorner-angular-ui-kit-footer.d.ts +97 -0
  267. package/types/lifecorner-angular-ui-kit-funnel-chart.d.ts +97 -0
  268. package/types/lifecorner-angular-ui-kit-gallery.d.ts +240 -0
  269. package/types/lifecorner-angular-ui-kit-gantt-chart.d.ts +133 -0
  270. package/types/lifecorner-angular-ui-kit-gauge.d.ts +94 -0
  271. package/types/lifecorner-angular-ui-kit-header.d.ts +496 -0
  272. package/types/lifecorner-angular-ui-kit-heatmap.d.ts +126 -0
  273. package/types/lifecorner-angular-ui-kit-hero.d.ts +121 -0
  274. package/types/lifecorner-angular-ui-kit-icon-names.d.ts +21 -0
  275. package/types/lifecorner-angular-ui-kit-icon.d.ts +260 -0
  276. package/types/lifecorner-angular-ui-kit-input.d.ts +346 -0
  277. package/types/lifecorner-angular-ui-kit-internal-chart.d.ts +86 -0
  278. package/types/lifecorner-angular-ui-kit-internal-overlay.d.ts +31 -0
  279. package/types/lifecorner-angular-ui-kit-internal-url.d.ts +22 -0
  280. package/types/lifecorner-angular-ui-kit-kanban-board.d.ts +111 -0
  281. package/types/lifecorner-angular-ui-kit-line-chart.d.ts +186 -0
  282. package/types/lifecorner-angular-ui-kit-list.d.ts +215 -0
  283. package/types/lifecorner-angular-ui-kit-log-viewer.d.ts +355 -0
  284. package/types/lifecorner-angular-ui-kit-logo.d.ts +182 -0
  285. package/types/lifecorner-angular-ui-kit-markdown.d.ts +278 -0
  286. package/types/lifecorner-angular-ui-kit-menu.d.ts +152 -0
  287. package/types/lifecorner-angular-ui-kit-modal.d.ts +207 -0
  288. package/types/lifecorner-angular-ui-kit-models.d.ts +62 -0
  289. package/types/lifecorner-angular-ui-kit-next-step-card.d.ts +262 -0
  290. package/types/lifecorner-angular-ui-kit-notification-center.d.ts +237 -0
  291. package/types/lifecorner-angular-ui-kit-number-input.d.ts +126 -0
  292. package/types/lifecorner-angular-ui-kit-page-header.d.ts +178 -0
  293. package/types/lifecorner-angular-ui-kit-page-layout.d.ts +61 -0
  294. package/types/lifecorner-angular-ui-kit-pagination.d.ts +141 -0
  295. package/types/lifecorner-angular-ui-kit-password-input.d.ts +361 -0
  296. package/types/lifecorner-angular-ui-kit-pie-chart.d.ts +58 -0
  297. package/types/lifecorner-angular-ui-kit-pipeline.d.ts +89 -0
  298. package/types/lifecorner-angular-ui-kit-popover.d.ts +104 -0
  299. package/types/lifecorner-angular-ui-kit-progress-bar.d.ts +116 -0
  300. package/types/lifecorner-angular-ui-kit-progress-ring.d.ts +67 -0
  301. package/types/lifecorner-angular-ui-kit-provider-button.d.ts +137 -0
  302. package/types/lifecorner-angular-ui-kit-radar-chart.d.ts +113 -0
  303. package/types/lifecorner-angular-ui-kit-radio.d.ts +297 -0
  304. package/types/lifecorner-angular-ui-kit-rating.d.ts +115 -0
  305. package/types/lifecorner-angular-ui-kit-rich-text-editor.d.ts +226 -0
  306. package/types/lifecorner-angular-ui-kit-scatter-plot.d.ts +190 -0
  307. package/types/lifecorner-angular-ui-kit-search-input.d.ts +137 -0
  308. package/types/lifecorner-angular-ui-kit-section.d.ts +34 -0
  309. package/types/lifecorner-angular-ui-kit-select.d.ts +274 -0
  310. package/types/lifecorner-angular-ui-kit-sidenav.d.ts +368 -0
  311. package/types/lifecorner-angular-ui-kit-skeleton.d.ts +61 -0
  312. package/types/lifecorner-angular-ui-kit-slider.d.ts +79 -0
  313. package/types/lifecorner-angular-ui-kit-spacer.d.ts +27 -0
  314. package/types/lifecorner-angular-ui-kit-sparkline.d.ts +113 -0
  315. package/types/lifecorner-angular-ui-kit-spinner.d.ts +50 -0
  316. package/types/lifecorner-angular-ui-kit-split-pane.d.ts +131 -0
  317. package/types/lifecorner-angular-ui-kit-stack.d.ts +49 -0
  318. package/types/lifecorner-angular-ui-kit-stacked-bar-chart.d.ts +171 -0
  319. package/types/lifecorner-angular-ui-kit-stage-list.d.ts +69 -0
  320. package/types/lifecorner-angular-ui-kit-stat-trend.d.ts +62 -0
  321. package/types/lifecorner-angular-ui-kit-status-dot.d.ts +62 -0
  322. package/types/lifecorner-angular-ui-kit-stepper.d.ts +113 -0
  323. package/types/lifecorner-angular-ui-kit-switch.d.ts +141 -0
  324. package/types/lifecorner-angular-ui-kit-table.d.ts +632 -0
  325. package/types/lifecorner-angular-ui-kit-tabs.d.ts +196 -0
  326. package/types/lifecorner-angular-ui-kit-tag-input.d.ts +123 -0
  327. package/types/lifecorner-angular-ui-kit-textarea.d.ts +225 -0
  328. package/types/lifecorner-angular-ui-kit-theme.d.ts +91 -0
  329. package/types/lifecorner-angular-ui-kit-timeline.d.ts +162 -0
  330. package/types/lifecorner-angular-ui-kit-toast.d.ts +204 -0
  331. package/types/lifecorner-angular-ui-kit-toggle-group.d.ts +100 -0
  332. package/types/lifecorner-angular-ui-kit-tokens.d.ts +134 -0
  333. package/types/lifecorner-angular-ui-kit-toolbar.d.ts +120 -0
  334. package/types/lifecorner-angular-ui-kit-tooltip.d.ts +120 -0
  335. package/types/lifecorner-angular-ui-kit-tree-view.d.ts +231 -0
  336. package/types/lifecorner-angular-ui-kit-typography.d.ts +126 -0
  337. package/types/lifecorner-angular-ui-kit-verification-code-input.d.ts +187 -0
  338. package/types/lifecorner-angular-ui-kit-waterfall-chart.d.ts +163 -0
  339. package/types/lifecorner-angular-ui-kit.d.ts +109 -17401
  340. package/fesm2022/lifecorner-angular-ui-kit.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecorner-angular-ui-kit-radio.mjs","names":[],"sources":["../../../../libs/angular-ui-kit/src/lib/radio/radio-group.token.ts","../../../../libs/angular-ui-kit/src/lib/radio/radio.component.ts","../../../../libs/angular-ui-kit/src/lib/radio/radio.component.html","../../../../libs/angular-ui-kit/src/lib/radio/radio-group.component.ts","../../../../libs/angular-ui-kit/src/lib/radio/radio-group.component.html"],"sourcesContent":["import { InjectionToken, Signal } from '@angular/core';\n\n/**\n * What an `lc-radio` inside an `lc-radio-group` reads from its group: the\n * shared name, the selected value and the group's states. Provided by\n * `RadioGroupComponent`; a radio without a group works on its own as before.\n */\nexport interface RadioGroupContext {\n /** The `name` every radio of the group renders. */\n readonly groupName: Signal<string>;\n /** The selected value; `''` = none. */\n readonly selectedValue: Signal<string>;\n readonly groupDisabled: Signal<boolean>;\n readonly groupRequired: Signal<boolean>;\n readonly groupInvalid: Signal<boolean>;\n /** Called by a radio the person selects. */\n select(value: string): void;\n /** Called when a radio loses focus (marks a bound form control touched). */\n touch(): void;\n}\n\nexport const RADIO_GROUP = new InjectionToken<RadioGroupContext>('RADIO_GROUP');\n","import {\n Component,\n input,\n model,\n output,\n signal,\n computed,\n effect,\n untracked,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n DestroyRef,\n ElementRef,\n Injectable,\n inject,\n viewChild,\n OnInit,\n OnDestroy,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { RADIO_GROUP } from './radio-group.token';\n\nexport type RadioSize = 'xs' | 'sm' | 'md' | 'lg';\n\nlet nextUniqueId = 0;\n\n/**\n * Tracks every live `lc-radio` so that checking one radio can uncheck the\n * others of its group. The browser does this natively (same `name`, same form\n * owner) without firing an event on the radios that lose the check, so their\n * component state would otherwise go stale.\n */\n@Injectable({ providedIn: 'root' })\nexport class RadioGroupRegistry {\n private readonly radios = new Set<RadioComponent>();\n\n add(radio: RadioComponent): void {\n this.radios.add(radio);\n }\n\n remove(radio: RadioComponent): void {\n this.radios.delete(radio);\n }\n\n /** Marks `source` as the checked radio of its group; siblings are unchecked. */\n select(source: RadioComponent): void {\n const name = source.effectiveName();\n if (!name) return;\n const form = source.formOwner();\n for (const radio of this.radios) {\n if (radio !== source && radio.effectiveName() === name && radio.formOwner() === form) {\n radio.checked.set(false);\n }\n }\n }\n}\n\n@Component({\n selector: 'lc-radio',\n standalone: true,\n imports: [],\n templateUrl: './radio.component.html',\n styleUrl: './radio.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n/**\n * Radio button component for single-option selection within a group.\n *\n * Features:\n * - Single selection within a named radio group\n * - Multiple size variants (sm, md, lg)\n * - Validation error display with error message\n * - Help text support\n * - Full accessibility with ARIA attributes\n * - ControlValueAccessor integration for reactive forms\n * - Inside an `lc-radio-group`: name, selection, required, disabled and the\n * invalid state come from the group (3.3)\n * - Size `lg` rows are 44 px high (touch target)\n *\n * @example\n * ```html\n * <lc-radio label=\"Option A\" value=\"a\" name=\"group1\" />\n * <lc-radio label=\"Option B\" value=\"b\" name=\"group1\" />\n * ```\n */\nexport class RadioComponent implements ControlValueAccessor, OnInit, OnDestroy {\n // Inputs\n readonly id = input<string>(`lc-radio-${nextUniqueId++}`);\n readonly label = input<string>('');\n readonly value = input<string>('');\n readonly name = input<string>('');\n readonly error = input<boolean>(false);\n readonly errorMessage = input<string>('');\n readonly helpText = input<string>('');\n readonly size = input<RadioSize>('md');\n readonly required = input<boolean>(false);\n readonly disabled = input<boolean>(false);\n readonly ariaLabel = input<string>('');\n readonly ariaLabelledBy = input<string>('');\n readonly ariaDescribedBy = input<string>('');\n\n /**\n * Checked state (two-way bindable). Emits `checkedChange` whenever it\n * changes: on user selection, when a sibling of the same group is selected,\n * and when a bound form control writes a value.\n */\n readonly checked = model<boolean>(false);\n\n // Outputs\n readonly valueChange = output<string>();\n\n /** Disabled state pushed by a form control (`setDisabledState`). */\n private readonly formDisabled = signal(false);\n\n /** The `lc-radio-group` around this radio, if any. */\n private readonly group = inject(RADIO_GROUP, { optional: true });\n\n /** Effective disabled state: `disabled` input OR form control OR group disabled. */\n readonly isDisabled = computed(() => this.disabled() || this.formDisabled() || !!this.group?.groupDisabled());\n\n /** The rendered `name`: the group's inside an `lc-radio-group`, else `name`. */\n readonly effectiveName = computed(() => this.group?.groupName() || this.name());\n\n /** `required` here or on the group. */\n readonly isRequired = computed(() => this.required() || !!this.group?.groupRequired());\n\n /** Error state here or on the group. */\n readonly isInvalid = computed(() => this.error() || !!this.group?.groupInvalid());\n\n readonly labelClasses = computed(() => {\n const classes = ['radio-label', `radio-${this.size()}`];\n\n if (this.checked()) {\n classes.push('radio-checked');\n }\n\n if (this.isDisabled()) {\n classes.push('radio-disabled');\n }\n\n if (this.isInvalid()) {\n classes.push('radio-error');\n }\n\n // Inside a group the asterisk belongs to the legend, not to every option.\n if (this.required() && !this.group) {\n classes.push('radio-required');\n }\n\n return classes.join(' ');\n });\n\n /** id of the rendered help text (only while it is shown). */\n readonly helpTextId = computed(() =>\n this.helpText() && !this.error() ? `${this.id()}-help` : null,\n );\n\n /** id of the rendered error message (only while it is shown). */\n readonly errorMessageId = computed(() =>\n this.error() && this.errorMessage() ? `${this.id()}-error` : null,\n );\n\n /** aria-describedby: consumer-supplied ids plus the rendered help/error text. */\n readonly describedBy = computed(() => {\n const ids = [this.ariaDescribedBy(), this.helpTextId(), this.errorMessageId()].filter(Boolean);\n return ids.length ? ids.join(' ') : null;\n });\n\n // Private fields\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly ngControl = inject(NgControl, { optional: true, self: true });\n private readonly registry = inject(RadioGroupRegistry);\n private readonly inputEl = viewChild<ElementRef<HTMLInputElement>>('radioInput');\n /**\n * Last value written by a bound form control; `null` until a form has\n * written once, so `[checked]` bindings on unbound radios are left alone.\n */\n private readonly formValue = signal<string | null>(null);\n private valueChangeSub?: Subscription;\n\n // Control Value Accessor callbacks\n private onChange: (value: string) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n\n constructor() {\n // Prevent circular dependency by not providing NG_VALUE_ACCESSOR here\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n\n this.registry.add(this);\n inject(DestroyRef).onDestroy(() => this.registry.remove(this));\n\n // Inside a group: checked exactly when the group's value equals this radio's value.\n const group = this.group;\n if (group) {\n effect(() => {\n const selected = group.selectedValue();\n const v = this.value();\n untracked(() => this.checked.set(selected !== '' && v !== '' && selected === v));\n });\n }\n\n // A form-bound radio is checked exactly when the form value equals its own value.\n effect(() => {\n const fv = this.formValue();\n const v = this.value();\n if (fv === null) return;\n untracked(() => this.checked.set(fv !== '' && v !== '' && fv === v));\n });\n }\n\n ngOnInit(): void {\n // Subscribe to form control value changes\n if (this.ngControl?.control) {\n this.valueChangeSub = this.ngControl.control.valueChanges.subscribe((value: string) => {\n this.formValue.set(value || '');\n this.cdr.markForCheck();\n });\n // Set initial value\n const initialValue = this.ngControl.control.value as string;\n if (initialValue) {\n this.formValue.set(initialValue);\n }\n }\n }\n\n ngOnDestroy(): void {\n this.valueChangeSub?.unsubscribe();\n }\n\n /** Native form owner of the radio input; scopes the radio group like the browser does. */\n formOwner(): HTMLFormElement | null {\n return this.inputEl()?.nativeElement.form ?? null;\n }\n\n // ControlValueAccessor implementation\n writeValue(value: string | null): void {\n // The `checked` model follows formValue via the effect above\n this.formValue.set(value || '');\n this.cdr.markForCheck();\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.formDisabled.set(isDisabled);\n }\n\n // Event handlers\n public handleChange(event: Event): void {\n if (this.isDisabled()) {\n event.preventDefault();\n return;\n }\n\n // model.set() emits `checkedChange` once; siblings that the browser just\n // unchecked natively are updated through the registry.\n this.checked.set(true);\n this.registry.select(this);\n this.group?.select(this.value());\n\n // Notify the form control - it will call writeValue on all radios\n this.onChange(this.value());\n this.valueChange.emit(this.value());\n }\n\n public handleBlur(): void {\n this.onTouched();\n this.group?.touch();\n }\n}\n","<label [attr.for]=\"id()\" [class]=\"labelClasses()\">\n <input\n #radioInput\n type=\"radio\"\n [id]=\"id()\"\n [name]=\"effectiveName()\"\n [value]=\"value()\"\n [checked]=\"checked()\"\n [disabled]=\"isDisabled()\"\n [required]=\"isRequired()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabelledBy() || null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-required]=\"isRequired() ? 'true' : null\"\n [attr.aria-invalid]=\"isInvalid() ? 'true' : null\"\n [attr.aria-disabled]=\"isDisabled() ? 'true' : null\"\n [attr.tabindex]=\"isDisabled() ? -1 : 0\"\n role=\"radio\"\n class=\"radio-input\"\n (change)=\"handleChange($event)\"\n (blur)=\"handleBlur()\"\n />\n <span class=\"radio-circle\">\n <span class=\"radio-dot\"></span>\n </span>\n @if (label()) {\n <span class=\"radio-label-text\">{{ label() }}</span>\n }\n</label>\n\n@if (helpTextId(); as helpId) {\n <div [id]=\"helpId\" class=\"radio-help-text\">{{ helpText() }}</div>\n}\n\n@if (errorMessageId(); as errorId) {\n <div [id]=\"errorId\" class=\"radio-error-message\">{{ errorMessage() }}</div>\n}\n","import { ChangeDetectionStrategy, Component, computed, forwardRef, input, model, signal } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { RADIO_GROUP, RadioGroupContext } from './radio-group.token';\n\nlet nextUniqueId = 0;\n\nexport type RadioGroupOrientation = 'vertical' | 'horizontal';\n\n/**\n * A group of `lc-radio`s: a native `<fieldset>` named by its `<legend>`, with\n * group help text and one group error, both linked by `aria-describedby`. The\n * group gives every radio inside the same `name`, `required`, `disabled` and\n * invalid state, and holds the selected value (`[(value)]` or a form control on\n * the group).\n *\n * @example\n * ```html\n * <lc-radio-group legend=\"Sprache\" [legendHidden]=\"true\" [(value)]=\"locale\">\n * <lc-radio value=\"device\" label=\"Wie dieses Gerät\" size=\"lg\" />\n * <lc-radio value=\"en\" label=\"English\" size=\"lg\" lang=\"en\" />\n * <lc-radio value=\"de\" label=\"Deutsch\" size=\"lg\" lang=\"de\" />\n * </lc-radio-group>\n * ```\n */\n@Component({\n selector: 'lc-radio-group',\n templateUrl: './radio-group.component.html',\n styleUrl: './radio-group.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: RADIO_GROUP, useExisting: forwardRef(() => RadioGroupComponent) },\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RadioGroupComponent), multi: true },\n ],\n})\nexport class RadioGroupComponent implements RadioGroupContext, ControlValueAccessor {\n /** The group's question, rendered as the `<legend>` (its accessible name). */\n readonly legend = input<string>('');\n\n /** Hide the legend visually; screen readers still read it. */\n readonly legendHidden = input<boolean>(false);\n\n /** The `name` of every radio in the group. Unset = a generated one. */\n readonly name = input<string>('');\n\n /** Help for the whole group, below the legend. */\n readonly helpText = input<string>('');\n\n /** One error for the whole group, below the help text; marks every radio invalid. */\n readonly error = input<string>('');\n\n /** Every radio is `required`. */\n readonly required = input<boolean>(false);\n\n /** Show `*` after the legend of a required group. */\n readonly requiredIndicator = input<boolean>(true);\n\n /** Accessible name of the `*` marker. */\n readonly requiredAriaLabel = input('required');\n\n /** Disables every radio. */\n readonly disabled = input<boolean>(false);\n\n /** `vertical` (default) or `horizontal` (wraps). */\n readonly orientation = input<RadioGroupOrientation>('vertical');\n\n /** The selected value (two-way bindable); `''` = none. */\n readonly value = model<string>('');\n\n readonly groupId = `lc-radio-group-${nextUniqueId++}`;\n readonly helpId = `${this.groupId}-help`;\n readonly errorId = `${this.groupId}-error`;\n\n private readonly formDisabled = signal(false);\n private onChange: (value: string) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n\n readonly groupName = computed(() => this.name() || this.groupId);\n readonly selectedValue = computed(() => this.value());\n readonly groupDisabled = computed(() => this.disabled() || this.formDisabled());\n readonly groupRequired = computed(() => this.required());\n readonly groupInvalid = computed(() => !!this.error());\n\n protected readonly describedBy = computed(() => {\n const ids: string[] = [];\n if (this.helpText()) ids.push(this.helpId);\n if (this.error()) ids.push(this.errorId);\n return ids.length ? ids.join(' ') : null;\n });\n\n select(value: string): void {\n if (this.groupDisabled()) return;\n this.value.set(value);\n this.onChange(value);\n }\n\n touch(): void {\n this.onTouched();\n }\n\n writeValue(value: string | null | undefined): void {\n this.value.set(value ?? '');\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.formDisabled.set(isDisabled);\n }\n}\n","<fieldset class=\"lc-radio-group\" [attr.aria-describedby]=\"describedBy()\" [disabled]=\"groupDisabled()\">\n <legend class=\"lc-radio-group__legend\" [class.lc-radio-group__legend--hidden]=\"legendHidden()\">\n {{ legend() }}\n @if (required() && requiredIndicator()) {\n <span class=\"lc-radio-group__required\" [attr.aria-label]=\"requiredAriaLabel()\">*</span>\n }\n </legend>\n\n @if (helpText()) {\n <p [id]=\"helpId\" class=\"lc-radio-group__help\">{{ helpText() }}</p>\n }\n\n @if (error()) {\n <p [id]=\"errorId\" class=\"lc-radio-group__error\" role=\"alert\">{{ error() }}</p>\n }\n\n <div\n class=\"lc-radio-group__options\"\n [class.lc-radio-group__options--vertical]=\"orientation() === 'vertical'\"\n [class.lc-radio-group__options--horizontal]=\"orientation() === 'horizontal'\"\n >\n <ng-content />\n </div>\n</fieldset>\n"],"mappings":"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"}
@@ -0,0 +1,327 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, computed, forwardRef, input, output, signal, viewChildren } from "@angular/core";
3
+ import { NG_VALUE_ACCESSOR } from "@angular/forms";
4
+ import { IconComponent } from "@lifecorner/angular-ui-kit/icon";
5
+ var RatingComponent = class RatingComponent {
6
+ static nextId = 0;
7
+ max = input(5, ...ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []);
8
+ size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
9
+ readonly = input(false, ...ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []);
10
+ disabled = input(false, ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
11
+ allowHalf = input(false, ...ngDevMode ? [{ debugName: "allowHalf" }] : /* istanbul ignore next */ []);
12
+ label = input(...ngDevMode ? [void 0, { debugName: "label" }] : /* istanbul ignore next */ []);
13
+ showValue = input(false, ...ngDevMode ? [{ debugName: "showValue" }] : /* istanbul ignore next */ []);
14
+ ariaLabel = input("Rating", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
15
+ ratingChange = output();
16
+ labelId = `lc-rating-${++RatingComponent.nextId}-label`;
17
+ value = signal(0, ...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
18
+ hoveredValue = signal(0, ...ngDevMode ? [{ debugName: "hoveredValue" }] : /* istanbul ignore next */ []);
19
+ formDisabled = signal(false, ...ngDevMode ? [{ debugName: "formDisabled" }] : /* istanbul ignore next */ []);
20
+ isDisabled = computed(() => this.disabled() || this.formDisabled(), ...ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []);
21
+ interactive = computed(() => !this.readonly() && !this.isDisabled(), ...ngDevMode ? [{ debugName: "interactive" }] : /* istanbul ignore next */ []);
22
+ starButtons = viewChildren("starBtn", ...ngDevMode ? [{ debugName: "starButtons" }] : /* istanbul ignore next */ []);
23
+ stars = computed(() => {
24
+ return Array.from({ length: this.max() }, (_, i) => i + 1);
25
+ }, ...ngDevMode ? [{ debugName: "stars" }] : /* istanbul ignore next */ []);
26
+ stepSize = computed(() => this.allowHalf() ? .5 : 1, ...ngDevMode ? [{ debugName: "stepSize" }] : /* istanbul ignore next */ []);
27
+ focusableStar = computed(() => Math.max(1, Math.ceil(this.value())), ...ngDevMode ? [{ debugName: "focusableStar" }] : /* istanbul ignore next */ []);
28
+ ratingClasses = computed(() => {
29
+ const classes = ["rating", `rating--${this.size()}`];
30
+ if (this.readonly()) classes.push("rating--readonly");
31
+ if (this.isDisabled()) classes.push("rating--disabled");
32
+ return classes.join(" ");
33
+ }, ...ngDevMode ? [{ debugName: "ratingClasses" }] : /* istanbul ignore next */ []);
34
+ getStarState(star) {
35
+ const active = this.hoveredValue() || this.value();
36
+ if (star <= Math.floor(active)) return "full";
37
+ if (this.allowHalf() && star - .5 <= active) return "half";
38
+ return "empty";
39
+ }
40
+ isStarFilled(star) {
41
+ return this.getStarState(star) === "full";
42
+ }
43
+ isStarHalf(star) {
44
+ return this.getStarState(star) === "half";
45
+ }
46
+ isStarChecked(star) {
47
+ const val = this.value();
48
+ return val > 0 && Math.ceil(val) === star;
49
+ }
50
+ starLabel(star) {
51
+ const val = this.value();
52
+ return `${this.isStarChecked(star) && val !== star ? val : star} of ${this.max()} stars`;
53
+ }
54
+ valueAt(star, event) {
55
+ if (!this.allowHalf() || event.detail === 0) return star;
56
+ const el = event.currentTarget;
57
+ const rect = el.getBoundingClientRect();
58
+ if (!rect.width) return star;
59
+ const fromStart = event.clientX - rect.left;
60
+ return (getComputedStyle(el).direction === "rtl" ? fromStart > rect.width / 2 : fromStart < rect.width / 2) ? star - .5 : star;
61
+ }
62
+ onStarClick(star, event) {
63
+ if (!this.interactive()) return;
64
+ this.select(this.valueAt(star, event));
65
+ this.onTouched();
66
+ }
67
+ onStarHover(star, event) {
68
+ if (!this.interactive()) return;
69
+ this.hoveredValue.set(this.valueAt(star, event));
70
+ }
71
+ onMouseLeave() {
72
+ this.hoveredValue.set(0);
73
+ }
74
+ onKeydown(event) {
75
+ if (!this.interactive()) return;
76
+ const step = this.stepSize();
77
+ const cur = this.value();
78
+ let next;
79
+ switch (event.key) {
80
+ case "ArrowRight":
81
+ case "ArrowUp":
82
+ next = Math.min(this.max(), cur + step);
83
+ break;
84
+ case "ArrowLeft":
85
+ case "ArrowDown":
86
+ next = Math.max(step, cur - step);
87
+ break;
88
+ case "Home":
89
+ next = step;
90
+ break;
91
+ case "End":
92
+ next = this.max();
93
+ break;
94
+ default: return;
95
+ }
96
+ event.preventDefault();
97
+ this.select(next);
98
+ this.starButtons()[this.focusableStar() - 1]?.nativeElement.focus();
99
+ }
100
+ onFocusOut(event) {
101
+ const group = event.currentTarget;
102
+ if (event.relatedTarget instanceof Node && group.contains(event.relatedTarget)) return;
103
+ this.onTouched();
104
+ }
105
+ select(val) {
106
+ if (val === this.value()) return;
107
+ this.value.set(val);
108
+ this.ratingChange.emit(val);
109
+ this.onChange(val);
110
+ }
111
+ onChange = () => {};
112
+ onTouched = () => {};
113
+ writeValue(val) {
114
+ this.value.set(val ?? 0);
115
+ }
116
+ registerOnChange(fn) {
117
+ this.onChange = fn;
118
+ }
119
+ registerOnTouched(fn) {
120
+ this.onTouched = fn;
121
+ }
122
+ setDisabledState(isDisabled) {
123
+ this.formDisabled.set(isDisabled);
124
+ }
125
+ static ɵfac = i0.ɵɵngDeclareFactory({
126
+ minVersion: "12.0.0",
127
+ version: "22.2.2",
128
+ ngImport: i0,
129
+ type: RatingComponent,
130
+ deps: [],
131
+ target: i0.ɵɵFactoryTarget.Component
132
+ });
133
+ static ɵcmp = i0.ɵɵngDeclareComponent({
134
+ minVersion: "17.0.0",
135
+ version: "22.2.2",
136
+ type: RatingComponent,
137
+ isStandalone: true,
138
+ selector: "lc-rating",
139
+ inputs: {
140
+ max: {
141
+ classPropertyName: "max",
142
+ publicName: "max",
143
+ isSignal: true,
144
+ isRequired: false,
145
+ transformFunction: null
146
+ },
147
+ size: {
148
+ classPropertyName: "size",
149
+ publicName: "size",
150
+ isSignal: true,
151
+ isRequired: false,
152
+ transformFunction: null
153
+ },
154
+ readonly: {
155
+ classPropertyName: "readonly",
156
+ publicName: "readonly",
157
+ isSignal: true,
158
+ isRequired: false,
159
+ transformFunction: null
160
+ },
161
+ disabled: {
162
+ classPropertyName: "disabled",
163
+ publicName: "disabled",
164
+ isSignal: true,
165
+ isRequired: false,
166
+ transformFunction: null
167
+ },
168
+ allowHalf: {
169
+ classPropertyName: "allowHalf",
170
+ publicName: "allowHalf",
171
+ isSignal: true,
172
+ isRequired: false,
173
+ transformFunction: null
174
+ },
175
+ label: {
176
+ classPropertyName: "label",
177
+ publicName: "label",
178
+ isSignal: true,
179
+ isRequired: false,
180
+ transformFunction: null
181
+ },
182
+ showValue: {
183
+ classPropertyName: "showValue",
184
+ publicName: "showValue",
185
+ isSignal: true,
186
+ isRequired: false,
187
+ transformFunction: null
188
+ },
189
+ ariaLabel: {
190
+ classPropertyName: "ariaLabel",
191
+ publicName: "ariaLabel",
192
+ isSignal: true,
193
+ isRequired: false,
194
+ transformFunction: null
195
+ }
196
+ },
197
+ outputs: { ratingChange: "ratingChange" },
198
+ providers: [{
199
+ provide: NG_VALUE_ACCESSOR,
200
+ useExisting: forwardRef(() => RatingComponent),
201
+ multi: true
202
+ }],
203
+ viewQueries: [{
204
+ propertyName: "starButtons",
205
+ predicate: ["starBtn"],
206
+ descendants: true,
207
+ isSignal: true
208
+ }],
209
+ ngImport: i0,
210
+ template: "<div [class]=\"ratingClasses()\" (mouseleave)=\"onMouseLeave()\">\n @if (label()) {\n <span class=\"rating__label\" [id]=\"labelId\">{{ label() }}</span>\n }\n <!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus -- keydown bubbles from the focused star radio (roving tabindex) -->\n <div\n class=\"rating__stars\"\n role=\"radiogroup\"\n [attr.aria-labelledby]=\"label() ? labelId : null\"\n [attr.aria-label]=\"label() ? null : ariaLabel()\"\n [attr.aria-readonly]=\"readonly() ? true : null\"\n [attr.aria-disabled]=\"isDisabled() ? true : null\"\n (keydown)=\"onKeydown($event)\"\n (focusout)=\"onFocusOut($event)\"\n >\n @for (star of stars(); track star) {\n <button\n #starBtn\n type=\"button\"\n class=\"rating__star\"\n role=\"radio\"\n [class.rating__star--filled]=\"isStarFilled(star)\"\n [class.rating__star--half]=\"isStarHalf(star)\"\n [disabled]=\"isDisabled()\"\n [tabindex]=\"star === focusableStar() ? 0 : -1\"\n [attr.aria-checked]=\"isStarChecked(star)\"\n [attr.aria-label]=\"starLabel(star)\"\n (click)=\"onStarClick(star, $event)\"\n (mousemove)=\"onStarHover(star, $event)\"\n >\n @if (isStarFilled(star)) {\n <lc-icon name=\"star\" variant=\"solid\" [size]=\"size()\" class=\"rating__icon rating__icon--filled\" [decorative]=\"true\" />\n } @else if (isStarHalf(star)) {\n <span class=\"rating__icon rating__icon--half\">\n <lc-icon name=\"star\" [size]=\"size()\" [decorative]=\"true\" />\n <lc-icon name=\"star\" variant=\"solid\" [size]=\"size()\" class=\"rating__icon-fill\" [decorative]=\"true\" />\n </span>\n } @else {\n <lc-icon name=\"star\" [size]=\"size()\" class=\"rating__icon rating__icon--empty\" [decorative]=\"true\" />\n }\n </button>\n }\n </div>\n @if (showValue()) {\n <span class=\"rating__value\">{{ value() }}/{{ max() }}</span>\n }\n</div>\n",
211
+ styles: [".rating{display:inline-flex;align-items:center;gap:.5rem}.rating__label{font-size:var(--typography-font-size-sm, .875rem);font-weight:var(--typography-font-weight-medium, 500);color:var(--color-text-secondary)}.rating__stars{display:inline-flex;align-items:center;gap:.125rem}.rating__star{display:inline-flex;align-items:center;justify-content:center;border:none;background:transparent;padding:.125rem;cursor:pointer;border-radius:.25rem;transition:transform .15s ease}.rating__star:hover:not(:disabled){transform:scale(1.15)}.rating__star:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:2px}.rating__star:disabled{cursor:default}.rating__icon{transition:color .15s ease}.rating__icon--filled{color:var(--color-warning)}.rating__icon--half{position:relative;display:inline-flex;color:var(--color-border-strong)}.rating__icon--empty{color:var(--color-border-strong)}.rating__icon-fill{position:absolute;inset:0;color:var(--color-warning);clip-path:inset(0 50% 0 0)}:host-context([dir=rtl]) .rating__icon-fill{clip-path:inset(0 0 0 50%)}.rating__value{font-size:var(--typography-font-size-sm, .875rem);font-variant-numeric:tabular-nums;color:var(--color-text-tertiary)}.rating--sm .rating__star{padding:.0625rem}.rating--lg .rating__star{padding:.1875rem}.rating--lg .rating__value{font-size:var(--typography-font-size-base, 1rem)}.rating--readonly .rating__star{cursor:default}.rating--readonly .rating__star:hover{transform:none}.rating--disabled{opacity:.5;pointer-events:none}\n"],
212
+ dependencies: [{
213
+ kind: "component",
214
+ type: IconComponent,
215
+ selector: "lc-icon",
216
+ inputs: [
217
+ "name",
218
+ "variant",
219
+ "size",
220
+ "color",
221
+ "ariaLabel",
222
+ "decorative",
223
+ "strict"
224
+ ]
225
+ }],
226
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
227
+ });
228
+ };
229
+ i0.ɵɵngDeclareClassMetadata({
230
+ minVersion: "12.0.0",
231
+ version: "22.2.2",
232
+ ngImport: i0,
233
+ type: RatingComponent,
234
+ decorators: [{
235
+ type: Component,
236
+ args: [{
237
+ selector: "lc-rating",
238
+ standalone: true,
239
+ imports: [IconComponent],
240
+ changeDetection: ChangeDetectionStrategy.OnPush,
241
+ providers: [{
242
+ provide: NG_VALUE_ACCESSOR,
243
+ useExisting: forwardRef(() => RatingComponent),
244
+ multi: true
245
+ }],
246
+ template: "<div [class]=\"ratingClasses()\" (mouseleave)=\"onMouseLeave()\">\n @if (label()) {\n <span class=\"rating__label\" [id]=\"labelId\">{{ label() }}</span>\n }\n <!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus -- keydown bubbles from the focused star radio (roving tabindex) -->\n <div\n class=\"rating__stars\"\n role=\"radiogroup\"\n [attr.aria-labelledby]=\"label() ? labelId : null\"\n [attr.aria-label]=\"label() ? null : ariaLabel()\"\n [attr.aria-readonly]=\"readonly() ? true : null\"\n [attr.aria-disabled]=\"isDisabled() ? true : null\"\n (keydown)=\"onKeydown($event)\"\n (focusout)=\"onFocusOut($event)\"\n >\n @for (star of stars(); track star) {\n <button\n #starBtn\n type=\"button\"\n class=\"rating__star\"\n role=\"radio\"\n [class.rating__star--filled]=\"isStarFilled(star)\"\n [class.rating__star--half]=\"isStarHalf(star)\"\n [disabled]=\"isDisabled()\"\n [tabindex]=\"star === focusableStar() ? 0 : -1\"\n [attr.aria-checked]=\"isStarChecked(star)\"\n [attr.aria-label]=\"starLabel(star)\"\n (click)=\"onStarClick(star, $event)\"\n (mousemove)=\"onStarHover(star, $event)\"\n >\n @if (isStarFilled(star)) {\n <lc-icon name=\"star\" variant=\"solid\" [size]=\"size()\" class=\"rating__icon rating__icon--filled\" [decorative]=\"true\" />\n } @else if (isStarHalf(star)) {\n <span class=\"rating__icon rating__icon--half\">\n <lc-icon name=\"star\" [size]=\"size()\" [decorative]=\"true\" />\n <lc-icon name=\"star\" variant=\"solid\" [size]=\"size()\" class=\"rating__icon-fill\" [decorative]=\"true\" />\n </span>\n } @else {\n <lc-icon name=\"star\" [size]=\"size()\" class=\"rating__icon rating__icon--empty\" [decorative]=\"true\" />\n }\n </button>\n }\n </div>\n @if (showValue()) {\n <span class=\"rating__value\">{{ value() }}/{{ max() }}</span>\n }\n</div>\n",
247
+ styles: [".rating{display:inline-flex;align-items:center;gap:.5rem}.rating__label{font-size:var(--typography-font-size-sm, .875rem);font-weight:var(--typography-font-weight-medium, 500);color:var(--color-text-secondary)}.rating__stars{display:inline-flex;align-items:center;gap:.125rem}.rating__star{display:inline-flex;align-items:center;justify-content:center;border:none;background:transparent;padding:.125rem;cursor:pointer;border-radius:.25rem;transition:transform .15s ease}.rating__star:hover:not(:disabled){transform:scale(1.15)}.rating__star:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:2px}.rating__star:disabled{cursor:default}.rating__icon{transition:color .15s ease}.rating__icon--filled{color:var(--color-warning)}.rating__icon--half{position:relative;display:inline-flex;color:var(--color-border-strong)}.rating__icon--empty{color:var(--color-border-strong)}.rating__icon-fill{position:absolute;inset:0;color:var(--color-warning);clip-path:inset(0 50% 0 0)}:host-context([dir=rtl]) .rating__icon-fill{clip-path:inset(0 0 0 50%)}.rating__value{font-size:var(--typography-font-size-sm, .875rem);font-variant-numeric:tabular-nums;color:var(--color-text-tertiary)}.rating--sm .rating__star{padding:.0625rem}.rating--lg .rating__star{padding:.1875rem}.rating--lg .rating__value{font-size:var(--typography-font-size-base, 1rem)}.rating--readonly .rating__star{cursor:default}.rating--readonly .rating__star:hover{transform:none}.rating--disabled{opacity:.5;pointer-events:none}\n"]
248
+ }]
249
+ }],
250
+ propDecorators: {
251
+ max: [{
252
+ type: i0.Input,
253
+ args: [{
254
+ isSignal: true,
255
+ alias: "max",
256
+ required: false
257
+ }]
258
+ }],
259
+ size: [{
260
+ type: i0.Input,
261
+ args: [{
262
+ isSignal: true,
263
+ alias: "size",
264
+ required: false
265
+ }]
266
+ }],
267
+ readonly: [{
268
+ type: i0.Input,
269
+ args: [{
270
+ isSignal: true,
271
+ alias: "readonly",
272
+ required: false
273
+ }]
274
+ }],
275
+ disabled: [{
276
+ type: i0.Input,
277
+ args: [{
278
+ isSignal: true,
279
+ alias: "disabled",
280
+ required: false
281
+ }]
282
+ }],
283
+ allowHalf: [{
284
+ type: i0.Input,
285
+ args: [{
286
+ isSignal: true,
287
+ alias: "allowHalf",
288
+ required: false
289
+ }]
290
+ }],
291
+ label: [{
292
+ type: i0.Input,
293
+ args: [{
294
+ isSignal: true,
295
+ alias: "label",
296
+ required: false
297
+ }]
298
+ }],
299
+ showValue: [{
300
+ type: i0.Input,
301
+ args: [{
302
+ isSignal: true,
303
+ alias: "showValue",
304
+ required: false
305
+ }]
306
+ }],
307
+ ariaLabel: [{
308
+ type: i0.Input,
309
+ args: [{
310
+ isSignal: true,
311
+ alias: "ariaLabel",
312
+ required: false
313
+ }]
314
+ }],
315
+ ratingChange: [{
316
+ type: i0.Output,
317
+ args: ["ratingChange"]
318
+ }],
319
+ starButtons: [{
320
+ type: i0.ViewChildren,
321
+ args: ["starBtn", { isSignal: true }]
322
+ }]
323
+ }
324
+ });
325
+ export { RatingComponent };
326
+
327
+ //# sourceMappingURL=lifecorner-angular-ui-kit-rating.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecorner-angular-ui-kit-rating.mjs","names":[],"sources":["../../../../libs/angular-ui-kit/src/lib/rating/rating.component.ts","../../../../libs/angular-ui-kit/src/lib/rating/rating.component.html"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n input,\n output,\n computed,\n signal,\n forwardRef,\n viewChildren,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { IconComponent } from '@lifecorner/angular-ui-kit/icon';\n\nexport type RatingSize = 'sm' | 'md' | 'lg';\n\n@Component({\n selector: 'lc-rating',\n standalone: true,\n imports: [IconComponent],\n templateUrl: './rating.component.html',\n styleUrls: ['./rating.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => RatingComponent),\n multi: true,\n },\n ],\n})\n/**\n * Rating component for star-based value selection.\n *\n * Features:\n * - Configurable maximum star count\n * - Half-star rating support (click the left half of a star, or step with the arrow keys)\n * - Multiple size variants (sm, md, lg)\n * - Read-only and disabled states\n * - Hover preview with visual feedback\n * - Keyboard: Arrow keys step the value, Home/End jump to the ends\n * - ControlValueAccessor integration for reactive forms\n *\n * @example\n * ```html\n * <lc-rating [max]=\"5\" [allowHalf]=\"true\" label=\"Rate this\" />\n * ```\n */\nexport class RatingComponent implements ControlValueAccessor {\n private static nextId = 0;\n\n /** Maximum number of stars */\n max = input<number>(5);\n\n /** Size variant */\n size = input<RatingSize>('md');\n\n /** Whether the rating is read-only */\n readonly = input<boolean>(false);\n\n /** Whether the rating is disabled */\n disabled = input<boolean>(false);\n\n /** Whether to allow half-star ratings */\n allowHalf = input<boolean>(false);\n\n /** Label text */\n label = input<string>();\n\n /** Whether to show the numeric value */\n showValue = input<boolean>(false);\n\n /** Accessible name of the star group when no visible `label` is set. */\n ariaLabel = input('Rating');\n\n /** Emits the selected rating */\n ratingChange = output<number>();\n\n /** Per-instance id naming the radiogroup by the visible label. */\n protected readonly labelId = `lc-rating-${++RatingComponent.nextId}-label`;\n\n protected value = signal(0);\n protected hoveredValue = signal(0);\n\n /** Disabled through the form control (`setDisabledState`), as opposed to the input. */\n private readonly formDisabled = signal(false);\n\n /** Disabled by either route — the one flag the template consults. */\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled());\n\n /** Whether clicks and keys change the value. Read-only stays focusable, it just does not react. */\n protected readonly interactive = computed(() => !this.readonly() && !this.isDisabled());\n\n private readonly starButtons = viewChildren<ElementRef<HTMLButtonElement>>('starBtn');\n\n protected stars = computed(() => {\n return Array.from({ length: this.max() }, (_, i) => i + 1);\n });\n\n /** Smallest change the value can make. */\n private readonly stepSize = computed(() => (this.allowHalf() ? 0.5 : 1));\n\n /**\n * The star that carries the group's single tab stop (roving tabindex): the\n * one holding the current value, or the first when nothing is selected.\n */\n protected readonly focusableStar = computed(() => Math.max(1, Math.ceil(this.value())));\n\n protected ratingClasses = computed(() => {\n const classes = ['rating', `rating--${this.size()}`];\n if (this.readonly()) classes.push('rating--readonly');\n if (this.isDisabled()) classes.push('rating--disabled');\n return classes.join(' ');\n });\n\n protected getStarState(star: number): 'full' | 'half' | 'empty' {\n const active = this.hoveredValue() || this.value();\n if (star <= Math.floor(active)) return 'full';\n if (this.allowHalf() && star - 0.5 <= active) return 'half';\n return 'empty';\n }\n\n protected isStarFilled(star: number): boolean {\n return this.getStarState(star) === 'full';\n }\n\n protected isStarHalf(star: number): boolean {\n return this.getStarState(star) === 'half';\n }\n\n /** `aria-checked` for the radio that represents the current value (2.5 lives on star 3). */\n protected isStarChecked(star: number): boolean {\n const val = this.value();\n return val > 0 && Math.ceil(val) === star;\n }\n\n /** Radio label — names the half value on the star that holds it. */\n protected starLabel(star: number): string {\n const val = this.value();\n const shown = this.isStarChecked(star) && val !== star ? val : star;\n return `${shown} of ${this.max()} stars`;\n }\n\n /**\n * The value a pointer at `clientX` over `star` stands for: the left half of\n * a star (right half in RTL) is the half step when halves are allowed.\n * Keyboard-triggered clicks carry no coordinates and mean the whole star.\n */\n private valueAt(star: number, event: MouseEvent): number {\n if (!this.allowHalf() || event.detail === 0) return star;\n const el = event.currentTarget as HTMLElement;\n const rect = el.getBoundingClientRect();\n if (!rect.width) return star;\n const fromStart = event.clientX - rect.left;\n const rtl = getComputedStyle(el).direction === 'rtl';\n const inFirstHalf = rtl ? fromStart > rect.width / 2 : fromStart < rect.width / 2;\n return inFirstHalf ? star - 0.5 : star;\n }\n\n protected onStarClick(star: number, event: MouseEvent): void {\n if (!this.interactive()) return;\n this.select(this.valueAt(star, event));\n this.onTouched();\n }\n\n protected onStarHover(star: number, event: MouseEvent): void {\n if (!this.interactive()) return;\n this.hoveredValue.set(this.valueAt(star, event));\n }\n\n protected onMouseLeave(): void {\n this.hoveredValue.set(0);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (!this.interactive()) return;\n const step = this.stepSize();\n const cur = this.value();\n let next: number;\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n next = Math.min(this.max(), cur + step);\n break;\n case 'ArrowLeft':\n case 'ArrowDown':\n next = Math.max(step, cur - step);\n break;\n case 'Home':\n next = step;\n break;\n case 'End':\n next = this.max();\n break;\n default:\n return;\n }\n event.preventDefault();\n this.select(next);\n // Roving tabindex: focus follows the checked star.\n this.starButtons()[this.focusableStar() - 1]?.nativeElement.focus();\n }\n\n /** Marks the control touched once focus leaves the group (not when it moves between stars). */\n protected onFocusOut(event: FocusEvent): void {\n const group = event.currentTarget as HTMLElement;\n if (event.relatedTarget instanceof Node && group.contains(event.relatedTarget)) return;\n this.onTouched();\n }\n\n private select(val: number): void {\n if (val === this.value()) return;\n this.value.set(val);\n this.ratingChange.emit(val);\n this.onChange(val);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private onChange: (val: number) => void = () => {};\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private onTouched: () => void = () => {};\n\n writeValue(val: number): void {\n this.value.set(val ?? 0);\n }\n\n registerOnChange(fn: (val: number) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.formDisabled.set(isDisabled);\n }\n}\n","<div [class]=\"ratingClasses()\" (mouseleave)=\"onMouseLeave()\">\n @if (label()) {\n <span class=\"rating__label\" [id]=\"labelId\">{{ label() }}</span>\n }\n <!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus -- keydown bubbles from the focused star radio (roving tabindex) -->\n <div\n class=\"rating__stars\"\n role=\"radiogroup\"\n [attr.aria-labelledby]=\"label() ? labelId : null\"\n [attr.aria-label]=\"label() ? null : ariaLabel()\"\n [attr.aria-readonly]=\"readonly() ? true : null\"\n [attr.aria-disabled]=\"isDisabled() ? true : null\"\n (keydown)=\"onKeydown($event)\"\n (focusout)=\"onFocusOut($event)\"\n >\n @for (star of stars(); track star) {\n <button\n #starBtn\n type=\"button\"\n class=\"rating__star\"\n role=\"radio\"\n [class.rating__star--filled]=\"isStarFilled(star)\"\n [class.rating__star--half]=\"isStarHalf(star)\"\n [disabled]=\"isDisabled()\"\n [tabindex]=\"star === focusableStar() ? 0 : -1\"\n [attr.aria-checked]=\"isStarChecked(star)\"\n [attr.aria-label]=\"starLabel(star)\"\n (click)=\"onStarClick(star, $event)\"\n (mousemove)=\"onStarHover(star, $event)\"\n >\n @if (isStarFilled(star)) {\n <lc-icon name=\"star\" variant=\"solid\" [size]=\"size()\" class=\"rating__icon rating__icon--filled\" [decorative]=\"true\" />\n } @else if (isStarHalf(star)) {\n <span class=\"rating__icon rating__icon--half\">\n <lc-icon name=\"star\" [size]=\"size()\" [decorative]=\"true\" />\n <lc-icon name=\"star\" variant=\"solid\" [size]=\"size()\" class=\"rating__icon-fill\" [decorative]=\"true\" />\n </span>\n } @else {\n <lc-icon name=\"star\" [size]=\"size()\" class=\"rating__icon rating__icon--empty\" [decorative]=\"true\" />\n }\n </button>\n }\n </div>\n @if (showValue()) {\n <span class=\"rating__value\">{{ value() }}/{{ max() }}</span>\n }\n</div>\n"],"mappings":"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"}