@lifecorner/angular-ui-kit 3.4.1 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +367 -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-table.mjs","names":[],"sources":["../../../../libs/angular-ui-kit/src/lib/table/table-cell.directive.ts","../../../../libs/angular-ui-kit/src/lib/table/table.component.ts","../../../../libs/angular-ui-kit/src/lib/table/table.component.html"],"sourcesContent":["import { Directive, input, TemplateRef, inject } from '@angular/core';\n\n/**\n * Directive for defining custom cell templates in the Table component.\n *\n * @example\n * ```html\n * <lc-table [columns]=\"columns\" [data]=\"data\">\n * <ng-template lcTableCell=\"status\" let-row>\n * <lc-badge [variant]=\"row.status\">{{ row.status }}</lc-badge>\n * </ng-template>\n * </lc-table>\n * ```\n */\n@Directive({\n selector: '[lcTableCell]',\n standalone: true,\n})\nexport class TableCellDirective {\n /** The column key this template applies to */\n readonly columnKey = input('', { alias: 'lcTableCell' });\n\n public template = inject(TemplateRef<{ $implicit: Record<string, unknown> }>);\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ElementRef,\n input,\n output,\n computed,\n signal,\n linkedSignal,\n viewChild,\n viewChildren,\n afterRenderEffect,\n ContentChildren,\n QueryList,\n} from '@angular/core';\nimport { NgStyle, NgTemplateOutlet } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { TableCellDirective } from './table-cell.directive';\nimport { InputComponent } from '@lifecorner/angular-ui-kit/input';\nimport { SelectComponent } from '@lifecorner/angular-ui-kit/select';\nimport { ButtonComponent, ButtonVariant } from '@lifecorner/angular-ui-kit/button';\nimport { IconComponent } from '@lifecorner/angular-ui-kit/icon';\n\ntype TableCellClass = string | ((\n value: unknown,\n row: Record<string, unknown>,\n column: TableColumn,\n rowIndex: number\n) => string);\n\ntype TableCellStyle = Record<string, string> | ((\n value: unknown,\n row: Record<string, unknown>,\n column: TableColumn,\n rowIndex: number\n) => Record<string, string>);\n\nexport interface TableColumn {\n key: string;\n label: string;\n sortable?: boolean;\n filterable?: boolean;\n editable?: boolean;\n width?: string;\n /** Optional CSS class(es) applied to both th and td cells */\n cssClass?: string;\n /** Optional CSS class(es) for td cells only (string or resolver callback) */\n cellClass?: TableCellClass;\n /** Optional inline styles for td cells only (object or resolver callback) */\n cellStyle?: TableCellStyle;\n /** Optional tooltip shown on hover over the column header */\n tooltip?: string;\n /** Optional formatter for cell output when no custom template is used */\n formatter?: (\n value: unknown,\n row: Record<string, unknown>,\n column: TableColumn,\n rowIndex: number\n ) => unknown;\n /** Input type for inline editing (default: text) */\n editType?: 'text' | 'number' | 'select';\n /** Options for select edit type */\n editOptions?: string[];\n}\n\n/**\n * A row-level action rendered in the table's actions column (e.g. Freigeben, Ablehnen).\n * Action button clicks never trigger the row's `rowClick` output.\n */\nexport interface TableAction {\n /** Unique identifier emitted with the {@link ActionClickEvent} */\n key: string;\n /** Visible button label (omit for icon-only buttons when an `icon` is set) */\n label?: string;\n /** Optional icon name rendered before the label */\n icon?: string;\n /** Button variant (default: 'ghost') */\n variant?: ButtonVariant;\n /** Optional tooltip / aria-label, useful for icon-only actions */\n tooltip?: string;\n /** Hide this action for specific rows */\n hidden?: (row: Record<string, unknown>, rowIndex: number) => boolean;\n /** Disable this action for specific rows */\n disabled?: (row: Record<string, unknown>, rowIndex: number) => boolean;\n}\n\nexport type TableActionsAlign = 'start' | 'center' | 'end';\n\nexport interface ActionClickEvent {\n action: string;\n row: Record<string, unknown>;\n rowIndex: number;\n}\n\nexport interface SortEvent {\n column: string;\n direction: 'asc' | 'desc';\n}\n\nexport interface CellEditEvent {\n row: Record<string, unknown>;\n column: string;\n oldValue: unknown;\n newValue: unknown;\n /** Index of `row` in the `data` input (not its position on screen). */\n rowIndex: number;\n}\n\nexport interface SelectionChangeEvent {\n selected: Record<string, unknown>[];\n allSelected: boolean;\n}\n\n/** Emitted when a parent (group) row is expanded or collapsed in tree mode. */\nexport interface RowToggleEvent {\n id: string;\n expanded: boolean;\n row: Record<string, unknown>;\n}\n\n/**\n * Configuration that enables hierarchical (tree / grouped) rows. Mirrors the\n * discrete `idKey` / `parentKey` / `treeColumn` inputs and is exported for\n * consumers that prefer to pass a single config object around.\n */\nexport interface TableTreeConfig {\n idKey: string;\n parentKey: string;\n treeColumn?: string;\n}\n\nexport type TableVariant = 'default' | 'striped' | 'bordered';\nexport type TableSize = 'sm' | 'md' | 'lg';\n\n/**\n * Internal, render-ready view-model for a single visible table row. In flat\n * mode every row is depth 0 with no tree adornments; in tree mode it carries\n * the disclosure / indentation / aria metadata for the row.\n */\ninterface DisplayRow {\n /** The underlying data object. */\n row: Record<string, unknown>;\n /**\n * The row's index into `data()` — in both modes. It is what action, class,\n * style and formatter callbacks receive as `rowIndex`, and what identifies\n * the row in `CellEditEvent`. (It used to be the *positional* index in flat\n * mode — page offset plus row position — which, once a sort or filter was\n * active, pointed at a different row of `data()` than the one on screen.)\n */\n absIndex: number;\n /**\n * What selection and inline editing are keyed by: the row's `idKey` value\n * when the table has one, otherwise the row object itself. Either survives a\n * re-sort, a filter and a page change; an id also survives the parent\n * replacing its data array with fresh objects.\n */\n key: unknown;\n /** Row id (tree mode only; `null` in flat mode). */\n id: string | null;\n /** Tree depth — 0 for roots and for every row in flat mode. */\n depth: number;\n /** 1-based depth, surfaced as `aria-level` in tree mode. */\n level: number;\n /** Whether this row has visible children (renders a chevron). */\n hasChildren: boolean;\n /** Whether this parent row is currently expanded. */\n expanded: boolean;\n /** 1-based position within its sibling group (`aria-posinset`). */\n posInSet: number;\n /** Size of its sibling group (`aria-setsize`). */\n setSize: number;\n}\n\n/**\n * Table component for displaying structured data in rows and columns.\n *\n * Features:\n * - Column-based sorting with sort direction indicators\n * - Variant styles (default, striped, bordered)\n * - Size presets (sm, md, lg)\n * - Hoverable row highlighting\n * - Per-column formatter callbacks for display values\n * - Per-cell class/style callbacks for conditional styling\n * - Custom cell templates via content projection\n * - Composed cells (e.g. avatar + badge + actions)\n * - Hierarchical \"tree\" rows (grouped / expandable) via `idKey` + `parentKey`\n * - Responsive horizontal scrolling\n * - Empty state text for no data\n * - Accessible with proper table semantics\n *\n * @example\n * ```html\n * <lc-table [columns]=\"columns\" [data]=\"data\" variant=\"striped\" [hoverable]=\"true\"\n * (sort)=\"onSort($event)\" (rowClick)=\"onRowClick($event)\" />\n * ```\n *\n * @example\n * ```ts\n * columns: TableColumn[] = [\n * {\n * key: 'amount',\n * label: 'Amount',\n * formatter: (value) => new Intl.NumberFormat('de-DE', {\n * style: 'currency',\n * currency: 'EUR',\n * }).format(Number(value ?? 0)),\n * },\n * ];\n * ```\n */\n@Component({\n selector: 'lc-table',\n standalone: true,\n imports: [NgTemplateOutlet, NgStyle, FormsModule, SelectComponent, InputComponent, ButtonComponent, IconComponent],\n templateUrl: './table.component.html',\n styleUrl: './table.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableComponent {\n /** Custom cell templates */\n @ContentChildren(TableCellDirective) cellTemplates!: QueryList<TableCellDirective>;\n\n /** Array of column definitions */\n columns = input<TableColumn[]>([]);\n\n /** Array of data objects to display */\n data = input<Record<string, unknown>[]>([]);\n\n /** Visual variant of the table */\n variant = input<TableVariant>('default');\n\n /** Size of the table */\n size = input<TableSize>('md');\n\n /** Whether rows should highlight on hover */\n hoverable = input<boolean>(false);\n\n /** Whether table should be responsive (horizontal scroll on mobile) */\n responsive = input<boolean>(true);\n\n /** Text shown when data is empty */\n emptyText = input<string>('No data available');\n\n /** Placeholder prefix of the column filters, followed by the column label (`filterable`). */\n filterPlaceholderLabel = input('Filter');\n\n /** Accessible name of the select-all checkbox (`selectable`). */\n selectAllAriaLabel = input('Select all rows');\n\n /** Accessible name of a row checkbox, followed by the row number. */\n selectRowAriaLabel = input('Select row');\n\n /** Screen-reader state of a column sorted ascending. */\n sortedAscendingLabel = input('sorted ascending');\n\n /** Screen-reader state of a column sorted descending. */\n sortedDescendingLabel = input('sorted descending');\n\n /** Tree mode: accessible name prefix of the expand toggle, followed by the row label. */\n expandRowAriaLabel = input('Aufklappen:');\n\n /** Tree mode: accessible name prefix of the collapse toggle, followed by the row label. */\n collapseRowAriaLabel = input('Einklappen:');\n\n /** Pagination: word between the shown range and the total (`1–10 of 42`). */\n rangeOfLabel = input('of');\n\n /** Accessible name of the page-size select. */\n rowsPerPageAriaLabel = input('Rows per page');\n\n /** Accessible name of the previous-page button. */\n previousPageAriaLabel = input('Previous page');\n\n /** Accessible name of the next-page button. */\n nextPageAriaLabel = input('Next page');\n\n // -- Pagination --\n /** Enable pagination */\n paginate = input<boolean>(false);\n\n /** Rows per page */\n pageSize = input<number>(10);\n\n /** Available page size options */\n pageSizeOptions = input<number[]>([5, 10, 25, 50]);\n\n // -- Selection --\n /** Enable row selection checkboxes */\n selectable = input<boolean>(false);\n\n // -- Column Filters --\n /** Enable per-column text filters */\n filterable = input<boolean>(false);\n\n // -- Inline Editing --\n /** Enable inline cell editing on double-click */\n editable = input<boolean>(false);\n\n // -- Row Actions --\n /**\n * Row-level actions rendered in a trailing actions column (e.g. Freigeben / Ablehnen).\n * Clicking an action button does NOT trigger the row's `rowClick` output.\n */\n actions = input<TableAction[]>([]);\n\n /** Header label for the actions column */\n actionsLabel = input<string>('');\n\n /** Width of the actions column (e.g. '120px') */\n actionsWidth = input<string | undefined>(undefined);\n\n /** Horizontal alignment of the action buttons (and header label) within the cell */\n actionsAlign = input<TableActionsAlign>('start');\n\n // -- Tree / grouped rows --\n /**\n * Row field holding the unique id. Required (together with {@link parentKey})\n * to enable hierarchical \"tree mode\". Absent ⇒ today's flat table.\n */\n idKey = input<string | undefined>(undefined);\n\n /**\n * Row field referencing the parent row's id. Presence of both `idKey` and\n * `parentKey` enables tree mode. Rows with an absent/empty or unknown parent\n * id are treated as roots.\n */\n parentKey = input<string | undefined>(undefined);\n\n /** Column key the chevron + indentation attach to. Default: first column. */\n treeColumn = input<string | undefined>(undefined);\n\n /** Initial expand state for all parent rows when uncontrolled. Default: true. */\n defaultExpanded = input<boolean>(true);\n\n /**\n * Controlled set of expanded parent ids. When provided, the table renders\n * exactly these as expanded; combine with {@link expandedIdsChange} for\n * `[(expandedIds)]`. When omitted, expansion is uncontrolled and seeded by\n * {@link defaultExpanded}.\n */\n expandedIds = input<string[] | undefined>(undefined);\n\n /** Indentation per depth level, in px. Default: 20. */\n indentSize = input<number>(20);\n\n /** Accessible name prefix of a column filter, followed by the column label. */\n filterAriaLabel = input('Filter by');\n\n /** Emitted when a sortable column header is clicked */\n readonly sort = output<SortEvent>();\n\n /** Emitted when a row is clicked */\n readonly rowClick = output<Record<string, unknown>>();\n\n /** Emitted when a cell is edited */\n readonly cellEdit = output<CellEditEvent>();\n\n /** Emitted when row selection changes */\n readonly selectionChange = output<SelectionChangeEvent>();\n\n /** Emitted when a row action button is clicked */\n readonly actionClick = output<ActionClickEvent>();\n\n /** Emitted when a parent row is expanded/collapsed (tree mode). */\n readonly rowToggle = output<RowToggleEvent>();\n\n /** Emitted with the full list of expanded parent ids; enables `[(expandedIds)]`. */\n readonly expandedIdsChange = output<string[]>();\n\n // -- Internal state --\n protected currentSort = signal<{ column: string; direction: 'asc' | 'desc' } | null>(null);\n /**\n * Effective page size. Seeded from the `pageSize` input (resetting if it\n * changes) and overridable by the user via the page-size dropdown.\n */\n protected internalPageSize = linkedSignal(() => this.pageSize());\n /**\n * Current page, kept within range: when the data shrinks or the page size\n * grows so that the page no longer exists, it moves back to the last one\n * (rather than showing an empty page captioned \"31–30 of 30\").\n */\n protected currentPage = linkedSignal<number, number>({\n source: () => this.totalPages(),\n computation: (total, previous) => Math.min(previous?.value ?? 0, total - 1),\n });\n /**\n * Selected row keys (see `DisplayRow.key`). Pruned when `data` changes, so\n * a key whose row is gone doesn't linger and count towards \"all selected\".\n */\n protected selectedRows = linkedSignal<Set<unknown>, Set<unknown>>({\n source: () => this.rowKeys(),\n computation: (keys, previous) => {\n if (!previous) return new Set<unknown>();\n const kept = new Set([...previous.value].filter((k) => keys.has(k)));\n return kept.size === previous.value.size ? previous.value : kept;\n },\n });\n protected columnFilters = signal<Record<string, string>>({});\n protected editingCell = signal<{ key: unknown; column: string } | null>(null);\n protected editValue = signal<string>('');\n\n /** The inline-edit input while a cell is being edited. */\n private readonly editInput = viewChild<ElementRef<HTMLInputElement>>('editInput');\n private focusedEditInput: HTMLInputElement | null = null;\n\n constructor() {\n // The edit input is inserted on double-click. `autofocus` is only honoured\n // for elements present when the page loads, so the input never received\n // focus (and Enter/Escape/blur never reached it); focus it once it renders.\n afterRenderEffect(() => {\n const el = this.editInput()?.nativeElement ?? null;\n if (el && el !== this.focusedEditInput) {\n el.focus();\n }\n this.focusedEditInput = el;\n });\n }\n\n /** The key of every row currently in `data()`. */\n private readonly rowKeys = computed(() => new Set(this.data().map((row) => this.rowKey(row))));\n\n /** See `DisplayRow.key`. */\n private rowKey(row: Record<string, unknown>): unknown {\n const idKey = this.idKey();\n return idKey ? String(row[idKey] ?? '') : row;\n }\n /** User expand/collapse overrides keyed by row id (uncontrolled mode). */\n private readonly expandOverrides = signal<Map<string, boolean>>(new Map());\n\n /**\n * Filtered data (applies column filters)\n */\n protected readonly filteredData = computed(() => {\n let items = this.data();\n const filters = this.columnFilters();\n\n if (this.filterable()) {\n for (const [key, value] of Object.entries(filters)) {\n if (value.trim()) {\n items = items.filter(row =>\n String(row[key] ?? '').toLowerCase().includes(value.toLowerCase())\n );\n }\n }\n }\n\n return items;\n });\n\n /** Comparator for the active sort, shared by flat sorting and tree sibling sorting. */\n private rowComparator(sortState: { column: string; direction: 'asc' | 'desc' }) {\n return (a: Record<string, unknown>, b: Record<string, unknown>): number => {\n const aVal = a[sortState.column];\n const bVal = b[sortState.column];\n let cmp = 0;\n if (aVal == null && bVal == null) cmp = 0;\n else if (aVal == null) cmp = -1;\n else if (bVal == null) cmp = 1;\n else if (typeof aVal === 'number' && typeof bVal === 'number') cmp = aVal - bVal;\n else cmp = String(aVal).localeCompare(String(bVal));\n return sortState.direction === 'asc' ? cmp : -cmp;\n };\n }\n\n /**\n * Sorted data\n */\n protected readonly sortedData = computed(() => {\n const items = [...this.filteredData()];\n const sortState = this.currentSort();\n if (!sortState) return items;\n return items.sort(this.rowComparator(sortState));\n });\n\n /**\n * Paginated data (or all if pagination disabled). Flat mode only.\n */\n protected readonly displayData = computed(() => {\n const items = this.sortedData();\n if (!this.paginate()) return items;\n const ps = this.internalPageSize();\n const start = this.currentPage() * ps;\n return items.slice(start, start + ps);\n });\n\n // -- Tree / grouped rows -----------------------------------------------------\n\n /** Whether hierarchical tree mode is active. */\n protected readonly treeMode = computed(() => !!this.idKey() && !!this.parentKey());\n\n /** Column the chevron + indentation attach to (defaults to the first column). */\n protected readonly effectiveTreeColumn = computed(\n () => this.treeColumn() || this.columns()[0]?.key\n );\n\n /** Stable map of row object → its index in `data()` (row identity for tree mode). */\n private readonly dataIndexMap = computed(() => {\n const map = new Map<Record<string, unknown>, number>();\n this.data().forEach((row, i) => map.set(row, i));\n return map;\n });\n\n /** Parent → ordered children index built from `idKey`/`parentKey`. */\n private readonly treeBuild = computed(() => {\n const idKey = this.idKey();\n const parentKey = this.parentKey();\n const byId = new Map<string, Record<string, unknown>>();\n const childrenOf = new Map<string, Record<string, unknown>[]>();\n const roots: Record<string, unknown>[] = [];\n if (!idKey || !parentKey) return { byId, childrenOf, roots };\n\n const rows = this.data();\n for (const row of rows) {\n const id = String(row[idKey] ?? '');\n if (id) byId.set(id, row);\n }\n for (const row of rows) {\n const parentRaw = row[parentKey];\n const parentId = parentRaw == null ? '' : String(parentRaw);\n if (parentId && byId.has(parentId)) {\n const siblings = childrenOf.get(parentId) ?? [];\n siblings.push(row);\n childrenOf.set(parentId, siblings);\n } else {\n // No parent, empty parent, or orphaned (unknown parent) ⇒ root.\n roots.push(row);\n }\n }\n return { byId, childrenOf, roots };\n });\n\n /**\n * Tree restricted to rows that match the active filters together with their\n * ancestor chain (so the path to a match stays visible).\n */\n private readonly treeFiltered = computed(() => {\n const { byId, childrenOf, roots } = this.treeBuild();\n const parentKey = this.parentKey();\n const filters = this.columnFilters();\n const active =\n this.filterable() && parentKey && Object.values(filters).some((v) => v.trim());\n if (!active) return { childrenOf, roots };\n\n const matches = (row: Record<string, unknown>): boolean =>\n Object.entries(filters).every(\n ([key, value]) =>\n !value.trim() ||\n String(row[key] ?? '').toLowerCase().includes(value.toLowerCase())\n );\n\n // Visible = every matching row plus all of its ancestors.\n const visible = new Set<Record<string, unknown>>();\n for (const row of this.data()) {\n if (!matches(row)) continue;\n let current: Record<string, unknown> | undefined = row;\n while (current && !visible.has(current)) {\n visible.add(current);\n const parentRaw: unknown = current[parentKey];\n const parentId = parentRaw == null ? '' : String(parentRaw);\n current = parentId ? byId.get(parentId) : undefined;\n }\n }\n\n const visibleChildrenOf = new Map<string, Record<string, unknown>[]>();\n const visibleRoots: Record<string, unknown>[] = [];\n for (const row of this.data()) {\n if (!visible.has(row)) continue;\n const parentRaw = row[parentKey];\n const parentId = parentRaw == null ? '' : String(parentRaw);\n const parent = parentId ? byId.get(parentId) : undefined;\n if (parent && visible.has(parent)) {\n const siblings = visibleChildrenOf.get(parentId) ?? [];\n siblings.push(row);\n visibleChildrenOf.set(parentId, siblings);\n } else {\n visibleRoots.push(row);\n }\n }\n return { childrenOf: visibleChildrenOf, roots: visibleRoots };\n });\n\n /** Tree with each sibling group sorted by the active sort (structure kept intact). */\n private readonly treeSorted = computed(() => {\n const { childrenOf, roots } = this.treeFiltered();\n const sortState = this.currentSort();\n if (!sortState) return { childrenOf, roots };\n const cmp = this.rowComparator(sortState);\n const sortedChildrenOf = new Map<string, Record<string, unknown>[]>();\n for (const [parentId, siblings] of childrenOf) {\n sortedChildrenOf.set(parentId, [...siblings].sort(cmp));\n }\n return { childrenOf: sortedChildrenOf, roots: [...roots].sort(cmp) };\n });\n\n /** Root rows after filter/sort — the unit of pagination in tree mode. */\n private readonly treeRoots = computed(() => this.treeSorted().roots);\n\n /**\n * Render-ready rows. In flat mode this wraps the existing paginated data; in\n * tree mode it paginates roots and flattens each visible (expanded) subtree.\n */\n protected readonly displayRows = computed<DisplayRow[]>(() => {\n const dataIndex = this.dataIndexMap();\n if (!this.treeMode()) {\n return this.displayData().map((row) => ({\n row,\n absIndex: dataIndex.get(row) ?? -1,\n key: this.rowKey(row),\n id: null,\n depth: 0,\n level: 0,\n hasChildren: false,\n expanded: false,\n posInSet: 0,\n setSize: 0,\n }));\n }\n\n const idKey = this.idKey() as string;\n const { childrenOf } = this.treeSorted();\n let roots = this.treeRoots();\n if (this.paginate()) {\n const ps = this.internalPageSize();\n const start = this.currentPage() * ps;\n roots = roots.slice(start, start + ps);\n }\n\n const out: DisplayRow[] = [];\n const walk = (group: Record<string, unknown>[], depth: number): void => {\n group.forEach((row, idx) => {\n const id = String(row[idKey] ?? '');\n const children = childrenOf.get(id) ?? [];\n const hasChildren = children.length > 0;\n const expanded = hasChildren && this.isExpanded(id);\n out.push({\n row,\n absIndex: dataIndex.get(row) ?? -1,\n key: this.rowKey(row),\n id,\n depth,\n level: depth + 1,\n hasChildren,\n expanded,\n posInSet: idx + 1,\n setSize: group.length,\n });\n if (expanded) walk(children, depth + 1);\n });\n };\n walk(roots, 0);\n return out;\n });\n\n /** Total pages */\n protected readonly totalPages = computed(() => {\n if (!this.paginate()) return 1;\n const total = this.treeMode() ? this.treeRoots().length : this.filteredData().length;\n return Math.max(1, Math.ceil(total / this.internalPageSize()));\n });\n\n /**\n * Pagination row count. Tree mode counts root rows (the paginated unit); flat\n * mode counts filtered rows.\n */\n protected readonly totalRows = computed(() =>\n this.treeMode() ? this.treeRoots().length : this.filteredData().length\n );\n\n /** Whether all visible rows are selected */\n protected readonly allSelected = computed(() => {\n const rows = this.displayRows();\n if (rows.length === 0) return false;\n const selected = this.selectedRows();\n return rows.every((r) => selected.has(r.key));\n });\n\n /** Whether some, but not all, visible rows are selected — the header box's mixed state. */\n protected readonly someSelected = computed(() => {\n const selected = this.selectedRows();\n return !this.allSelected() && this.displayRows().some((r) => selected.has(r.key));\n });\n\n protected readonly pageSizeSelectOptions = computed(() =>\n this.pageSizeOptions().map((opt) => ({\n value: opt,\n label: `${opt} / page`,\n }))\n );\n\n /**\n * Computed CSS classes for the table element\n */\n tableClasses = computed(() => {\n const classes = ['lc-table'];\n classes.push(`lc-table--${this.variant()}`);\n classes.push(`lc-table--${this.size()}`);\n if (this.hoverable()) classes.push('lc-table--hoverable');\n return classes.join(' ');\n });\n\n /**\n * Computed CSS classes for the wrapper element\n */\n wrapperClasses = computed(() => {\n const classes = ['lc-table-wrapper'];\n if (this.responsive()) classes.push('lc-table-wrapper--responsive');\n return classes.join(' ');\n });\n\n // -- Sort --\n handleSort(columnKey: string): void {\n const column = this.columns().find((col) => col.key === columnKey);\n if (!column || !column.sortable) return;\n\n const current = this.currentSort();\n let direction: 'asc' | 'desc' = 'asc';\n if (current && current.column === columnKey) {\n direction = current.direction === 'asc' ? 'desc' : 'asc';\n }\n\n this.currentSort.set({ column: columnKey, direction });\n this.sort.emit({ column: columnKey, direction });\n }\n\n getSortState(columnKey: string): 'asc' | 'desc' | null {\n const current = this.currentSort();\n if (current && current.column === columnKey) return current.direction;\n return null;\n }\n\n getAriaSort(columnKey: string): string | null {\n const sortState = this.getSortState(columnKey);\n if (sortState === 'asc') return 'ascending';\n if (sortState === 'desc') return 'descending';\n return null;\n }\n\n getHeaderClasses(column: TableColumn): string {\n const classes: string[] = [];\n if (column.sortable) classes.push('sortable');\n const sortState = this.getSortState(column.key);\n if (sortState) classes.push(`sorted-${sortState}`);\n return classes.join(' ');\n }\n\n getCellValue(row: Record<string, unknown>, columnKey: string): unknown {\n return row[columnKey];\n }\n\n getFormattedCellValue(\n row: Record<string, unknown>,\n column: TableColumn,\n rowIndex: number\n ): unknown {\n const value = this.getCellValue(row, column.key);\n if (!column.formatter) return value;\n\n return column.formatter(value, row, column, rowIndex);\n }\n\n getCellClasses(\n row: Record<string, unknown>,\n column: TableColumn,\n rowIndex: number\n ): string {\n const classes: string[] = [];\n if (column.cssClass) classes.push(column.cssClass);\n\n if (typeof column.cellClass === 'string') {\n classes.push(column.cellClass);\n } else if (typeof column.cellClass === 'function') {\n const resolved = column.cellClass(\n this.getCellValue(row, column.key),\n row,\n column,\n rowIndex\n );\n if (resolved) classes.push(resolved);\n }\n\n return classes.join(' ').trim();\n }\n\n getCellStyles(\n row: Record<string, unknown>,\n column: TableColumn,\n rowIndex: number\n ): Record<string, string> | null {\n if (!column.cellStyle) return null;\n\n if (typeof column.cellStyle === 'function') {\n return column.cellStyle(\n this.getCellValue(row, column.key),\n row,\n column,\n rowIndex\n );\n }\n\n return column.cellStyle;\n }\n\n /** Whether the given column is the disclosure/indent column in tree mode. */\n protected isTreeColumn(columnKey: string): boolean {\n return this.treeMode() && columnKey === this.effectiveTreeColumn();\n }\n\n /** Indent levels to render before a row's chevron (one guide per ancestor depth). */\n protected indentLevels(depth: number): number[] {\n return Array.from({ length: depth }, (_, i) => i);\n }\n\n /** Accessible name for a row's disclosure button (the tree column's value). */\n protected treeCellLabel(row: Record<string, unknown>): string {\n const col = this.effectiveTreeColumn();\n return col ? String(row[col] ?? '') : '';\n }\n\n getCellTemplate(columnKey: string): TableCellDirective | undefined {\n return this.cellTemplates?.find((template) => template.columnKey() === columnKey);\n }\n\n hasCustomTemplate(columnKey: string): boolean {\n return !!this.getCellTemplate(columnKey);\n }\n\n onRowClick(row: Record<string, unknown>): void {\n this.rowClick.emit(row);\n }\n\n // -- Row Actions --\n /** Whether the trailing actions column should be rendered */\n protected readonly hasActions = computed(() => this.actions().length > 0);\n\n protected isActionHidden(\n action: TableAction,\n row: Record<string, unknown>,\n rowIndex: number\n ): boolean {\n return action.hidden ? action.hidden(row, rowIndex) : false;\n }\n\n protected isActionDisabled(\n action: TableAction,\n row: Record<string, unknown>,\n rowIndex: number\n ): boolean {\n return action.disabled ? action.disabled(row, rowIndex) : false;\n }\n\n /**\n * Handles an action button click. The DOM click is stopped from propagating\n * (see template `$event.stopPropagation()`), so the row's `rowClick` never fires.\n */\n protected onActionClick(\n action: TableAction,\n row: Record<string, unknown>,\n rowIndex: number\n ): void {\n this.actionClick.emit({\n action: action.key,\n row,\n rowIndex,\n });\n }\n\n // -- Tree keyboard model -----------------------------------------------------\n // `role=\"treegrid\"` promises a composite widget: one tab stop, arrows to move\n // between rows, Right/Left to open/close a group or step into/out of it. The\n // rows carry a roving tabindex; the focused row is remembered by key so it\n // survives re-renders, and falls back to the first row when it is gone.\n\n private readonly rowEls = viewChildren<ElementRef<HTMLTableRowElement>>('dataRow');\n private readonly focusedRowKey = signal<unknown>(null);\n\n /** Key of the row that holds the tab stop. */\n private readonly effectiveFocusedKey = computed(() => {\n const rows = this.displayRows();\n const key = this.focusedRowKey();\n return rows.some((r) => r.key === key) ? key : rows[0]?.key;\n });\n\n protected rowTabindex(dr: DisplayRow): number | null {\n if (!this.treeMode()) return null;\n return dr.key === this.effectiveFocusedKey() ? 0 : -1;\n }\n\n protected onRowFocus(dr: DisplayRow): void {\n if (this.treeMode()) this.focusedRowKey.set(dr.key);\n }\n\n protected onRowKeydown(event: KeyboardEvent, dr: DisplayRow): void {\n if (!this.treeMode()) return;\n // Keys typed into an inline editor or the row's own controls are theirs.\n if ((event.target as HTMLElement).tagName === 'INPUT') return;\n const rows = this.displayRows();\n const index = rows.findIndex((r) => r.key === dr.key);\n if (index < 0) return;\n\n switch (event.key) {\n case 'ArrowDown':\n this.focusRow(index + 1);\n break;\n case 'ArrowUp':\n this.focusRow(index - 1);\n break;\n case 'Home':\n this.focusRow(0);\n break;\n case 'End':\n this.focusRow(rows.length - 1);\n break;\n case 'ArrowRight':\n if (!dr.hasChildren) return;\n if (dr.expanded) this.focusRow(index + 1); // first child\n else if (dr.id) this.toggleRow(dr.id, dr.row);\n break;\n case 'ArrowLeft':\n if (dr.hasChildren && dr.expanded && dr.id) {\n this.toggleRow(dr.id, dr.row);\n } else if (dr.depth > 0) {\n // Step out to the parent: the nearest row above with a smaller depth.\n for (let i = index - 1; i >= 0; i--) {\n if (rows[i].depth < dr.depth) {\n this.focusRow(i);\n break;\n }\n }\n } else {\n return;\n }\n break;\n case 'Enter':\n this.rowClick.emit(dr.row);\n break;\n case ' ':\n if (!this.selectable()) return;\n this.toggleRowSelect(dr.row);\n break;\n default:\n return;\n }\n event.preventDefault();\n }\n\n private focusRow(index: number): void {\n const rows = this.displayRows();\n if (index < 0 || index >= rows.length) return;\n this.focusedRowKey.set(rows[index].key);\n this.rowEls()[index]?.nativeElement.focus();\n }\n\n // -- Tree expand / collapse --------------------------------------------------\n\n /** Whether the parent row with the given id is currently expanded. */\n protected isExpanded(id: string): boolean {\n const controlled = this.expandedIds();\n if (controlled !== undefined) return controlled.includes(id);\n const override = this.expandOverrides().get(id);\n if (override !== undefined) return override;\n return this.defaultExpanded();\n }\n\n /** Chevron click: toggle expand state without triggering the row click. */\n protected onChevronClick(displayRow: DisplayRow, event: Event): void {\n event.stopPropagation();\n if (displayRow.id) this.toggleRow(displayRow.id, displayRow.row);\n }\n\n private toggleRow(id: string, row: Record<string, unknown>): void {\n const expanded = !this.isExpanded(id);\n this.expandOverrides.update((map) => {\n const next = new Map(map);\n next.set(id, expanded);\n return next;\n });\n this.rowToggle.emit({ id, expanded, row });\n this.expandedIdsChange.emit(this.nextExpandedIds(id, expanded));\n }\n\n /** The full list of expanded parent ids after applying a single toggle. */\n private nextExpandedIds(changedId: string, changedExpanded: boolean): string[] {\n const controlled = this.expandedIds();\n const overrides = this.expandOverrides();\n const parentIds = Array.from(this.treeBuild().childrenOf.keys());\n return parentIds.filter((pid) => {\n if (pid === changedId) return changedExpanded;\n if (controlled !== undefined) return controlled.includes(pid);\n const override = overrides.get(pid);\n return override !== undefined ? override : this.defaultExpanded();\n });\n }\n\n // -- Pagination --\n protected goToPage(page: number): void {\n if (page >= 0 && page < this.totalPages()) {\n this.currentPage.set(page);\n }\n }\n\n protected onPageSizeChange(event: Event): void {\n const newSize = Number((event.target as HTMLSelectElement).value);\n this.internalPageSize.set(newSize);\n this.currentPage.set(0);\n }\n\n protected onPageSizeModelChange(value: string | number | null): void {\n if (value == null) {\n return;\n }\n const parsed = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(parsed)) {\n return;\n }\n this.internalPageSize.set(parsed);\n this.currentPage.set(0);\n }\n\n protected get paginationStart(): number {\n if (this.totalRows() === 0) return 0;\n return this.currentPage() * this.internalPageSize() + 1;\n }\n\n protected get paginationEnd(): number {\n return Math.min((this.currentPage() + 1) * this.internalPageSize(), this.totalRows());\n }\n\n // -- Selection --\n // Keyed by row identity (see `DisplayRow.key`), never by position: a sort or\n // filter changes where a row is shown, not which row it is.\n protected toggleSelectAll(): void {\n const selected = new Set(this.selectedRows());\n const rows = this.displayRows();\n const allSelected = this.allSelected();\n\n rows.forEach((r) => {\n if (allSelected) selected.delete(r.key);\n else selected.add(r.key);\n });\n\n this.selectedRows.set(selected);\n this.emitSelectionChange();\n }\n\n protected toggleRowSelect(row: Record<string, unknown>): void {\n const key = this.rowKey(row);\n const selected = new Set(this.selectedRows());\n if (selected.has(key)) selected.delete(key);\n else selected.add(key);\n this.selectedRows.set(selected);\n this.emitSelectionChange();\n }\n\n protected isRowSelected(row: Record<string, unknown>): boolean {\n return this.selectedRows().has(this.rowKey(row));\n }\n\n private emitSelectionChange(): void {\n const keys = this.selectedRows();\n // In data order, so the consumer gets a stable list whatever the sort.\n const selected = this.data().filter((row) => keys.has(this.rowKey(row)));\n this.selectionChange.emit({ selected, allSelected: this.allSelected() });\n }\n\n // -- Column Filters --\n protected onFilterChange(columnKey: string, value: string): void {\n const filters = { ...this.columnFilters(), [columnKey]: value };\n this.columnFilters.set(filters);\n this.currentPage.set(0);\n }\n\n protected getFilterValue(columnKey: string): string {\n return this.columnFilters()[columnKey] || '';\n }\n\n // -- Inline Editing --\n // Keyed by row identity too — the edited cell is the one the user clicked,\n // whichever position sorting put it in.\n protected startEdit(row: Record<string, unknown>, column: string, currentValue: unknown): void {\n if (!this.editable()) return;\n const col = this.columns().find(c => c.key === column);\n if (col && col.editable === false) return;\n this.editingCell.set({ key: this.rowKey(row), column });\n this.editValue.set(String(currentValue ?? ''));\n }\n\n protected isEditing(row: Record<string, unknown>, column: string): boolean {\n const cell = this.editingCell();\n return cell !== null && cell.key === this.rowKey(row) && cell.column === column;\n }\n\n protected commitEdit(row: Record<string, unknown>, column: string): void {\n // Only the cell being edited commits: the input's blur arrives after Enter\n // or Escape already ended the edit, and must not commit (or re-commit).\n if (!this.isEditing(row, column)) return;\n const oldValue = row[column];\n const newValue = this.editValue();\n this.editingCell.set(null);\n this.editValue.set('');\n if (String(oldValue ?? '') !== newValue) {\n const rowIndex = this.dataIndexMap().get(row) ?? -1;\n this.cellEdit.emit({ row, column, oldValue, newValue, rowIndex });\n }\n }\n\n protected cancelEdit(): void {\n this.editingCell.set(null);\n this.editValue.set('');\n }\n\n protected onEditKeydown(event: KeyboardEvent, row: Record<string, unknown>, column: string): void {\n if (event.key === 'Enter') {\n this.commitEdit(row, column);\n } else if (event.key === 'Escape') {\n this.cancelEdit();\n }\n }\n\n /** Enter/Space on a focused sortable header sorts, like a click does. */\n protected onHeaderKeydown(event: KeyboardEvent, columnKey: string): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.handleSort(columnKey);\n }\n }\n\n protected getInputValue(event: Event): string {\n return (event.target as HTMLInputElement).value;\n }\n}\n","<div [class]=\"wrapperClasses()\">\n <table [class]=\"tableClasses()\" [attr.role]=\"treeMode() ? 'treegrid' : 'table'\">\n <thead>\n <!-- Filter row -->\n @if (filterable()) {\n <tr class=\"lc-table__filter-row\">\n @if (selectable()) {\n <th class=\"lc-table__select-cell\"></th>\n }\n @for (column of columns(); track column.key) {\n <th>\n @if (column.filterable !== false) {\n <lc-input\n class=\"lc-table__filter-input\"\n size=\"xs\"\n [placeholder]=\"filterPlaceholderLabel() + ' ' + column.label\"\n [ariaLabel]=\"filterAriaLabel() + ' ' + column.label\"\n [ngModel]=\"getFilterValue(column.key)\"\n (ngModelChange)=\"onFilterChange(column.key, $event)\"\n />\n }\n </th>\n }\n @if (hasActions()) {\n <th class=\"lc-table__actions-cell\"></th>\n }\n </tr>\n }\n <!-- Header row -->\n <tr>\n @if (selectable()) {\n <th class=\"lc-table__select-cell\" scope=\"col\">\n <input\n type=\"checkbox\"\n class=\"lc-table__checkbox\"\n [checked]=\"allSelected()\"\n [indeterminate]=\"someSelected()\"\n (change)=\"toggleSelectAll()\"\n [attr.aria-label]=\"selectAllAriaLabel()\"\n />\n </th>\n }\n @for (column of columns(); track column.key) {\n <!-- A sortable header is a keyboard stop too: Enter/Space sort like a click. -->\n <th\n scope=\"col\"\n [class]=\"getHeaderClasses(column) + (column.cssClass ? ' ' + column.cssClass : '')\"\n [attr.aria-sort]=\"getAriaSort(column.key)\"\n [attr.tabindex]=\"column.sortable ? 0 : null\"\n [style.width]=\"column.width\"\n [title]=\"column.tooltip || ''\"\n (click)=\"handleSort(column.key)\"\n (keydown)=\"column.sortable ? onHeaderKeydown($event, column.key) : null\">\n {{ column.label }}\n @if (column.sortable && getSortState(column.key)) {\n <span class=\"sort-indicator\" [attr.aria-label]=\"getSortState(column.key) === 'asc' ? sortedAscendingLabel() : sortedDescendingLabel()\">\n @if (getSortState(column.key) === 'asc') {\n ↑\n } @else {\n ↓\n }\n </span>\n }\n </th>\n }\n @if (hasActions()) {\n <th\n scope=\"col\"\n class=\"lc-table__actions-cell\"\n [class]=\"'lc-table__actions-cell--' + actionsAlign()\"\n [style.width]=\"actionsWidth()\"\n >\n {{ actionsLabel() }}\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (displayRows().length === 0) {\n <tr>\n <td [attr.colspan]=\"columns().length + (selectable() ? 1 : 0) + (hasActions() ? 1 : 0)\" class=\"lc-table__empty\">\n {{ emptyText() }}\n </td>\n </tr>\n } @else {\n @for (dr of displayRows(); track dr.key) {\n <!-- In tree mode the rows form the treegrid's keyboard model: a roving\n tab stop plus Arrow/Home/End/Enter/Space handling (see the\n component). Flat mode keeps plain table rows. -->\n <tr\n #dataRow\n [class.lc-table__row--selected]=\"selectable() && isRowSelected(dr.row)\"\n [class.lc-table__row--group]=\"dr.hasChildren\"\n [attr.role]=\"treeMode() ? 'row' : null\"\n [attr.tabindex]=\"rowTabindex(dr)\"\n [attr.aria-level]=\"treeMode() ? dr.level : null\"\n [attr.aria-expanded]=\"treeMode() && dr.hasChildren ? dr.expanded : null\"\n [attr.aria-posinset]=\"treeMode() ? dr.posInSet : null\"\n [attr.aria-setsize]=\"treeMode() ? dr.setSize : null\"\n [attr.aria-selected]=\"treeMode() && selectable() ? isRowSelected(dr.row) : null\"\n (click)=\"onRowClick(dr.row)\"\n (focus)=\"onRowFocus(dr)\"\n (keydown)=\"onRowKeydown($event, dr)\"\n >\n @if (selectable()) {\n <td class=\"lc-table__select-cell\" [attr.role]=\"treeMode() ? 'gridcell' : null\">\n <input\n type=\"checkbox\"\n class=\"lc-table__checkbox\"\n [checked]=\"isRowSelected(dr.row)\"\n (change)=\"toggleRowSelect(dr.row)\"\n (click)=\"$event.stopPropagation()\"\n [attr.aria-label]=\"selectRowAriaLabel() + ' ' + (dr.absIndex + 1)\"\n />\n </td>\n }\n @for (column of columns(); track column.key) {\n <td\n [class]=\"getCellClasses(dr.row, column, dr.absIndex)\"\n [ngStyle]=\"getCellStyles(dr.row, column, dr.absIndex)\"\n [attr.role]=\"treeMode() ? 'gridcell' : null\"\n (dblclick)=\"editable() ? startEdit(dr.row, column.key, getCellValue(dr.row, column.key)) : null\"\n >\n @if (isTreeColumn(column.key)) {\n <span class=\"lc-table__tree-cell\">\n @for (lvl of indentLevels(dr.depth); track lvl) {\n <span class=\"lc-table__tree-indent\" [style.width.px]=\"indentSize()\"></span>\n }\n <span class=\"lc-table__tree-chevron\" [style.width.px]=\"indentSize()\">\n @if (dr.hasChildren) {\n <button\n type=\"button\"\n class=\"lc-table__chevron-btn\"\n [class.lc-table__chevron-btn--expanded]=\"dr.expanded\"\n [attr.aria-label]=\"(dr.expanded ? collapseRowAriaLabel() : expandRowAriaLabel()) + ' ' + treeCellLabel(dr.row)\"\n [attr.aria-expanded]=\"dr.expanded\"\n (click)=\"onChevronClick(dr, $event)\"\n >\n <lc-icon name=\"chevron-right\" size=\"xs\" [decorative]=\"true\" />\n </button>\n }\n </span>\n <span class=\"lc-table__tree-content\">\n <ng-container\n *ngTemplateOutlet=\"cellContent; context: { row: dr.row, column: column, absIndex: dr.absIndex }\"\n ></ng-container>\n </span>\n </span>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"cellContent; context: { row: dr.row, column: column, absIndex: dr.absIndex }\"\n ></ng-container>\n }\n </td>\n }\n @if (hasActions()) {\n <td\n class=\"lc-table__actions-cell\"\n [class]=\"'lc-table__actions-cell--' + actionsAlign()\"\n [attr.role]=\"treeMode() ? 'gridcell' : null\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"lc-table__actions\">\n @for (action of actions(); track action.key) {\n @if (!isActionHidden(action, dr.row, dr.absIndex)) {\n <lc-button\n [variant]=\"action.variant ?? 'ghost'\"\n size=\"xs\"\n [iconOnly]=\"!action.label\"\n [disabled]=\"isActionDisabled(action, dr.row, dr.absIndex)\"\n [ariaLabel]=\"action.tooltip ?? action.label ?? action.key\"\n (clicked)=\"onActionClick(action, dr.row, dr.absIndex)\"\n >\n @if (action.icon) {\n <lc-icon [name]=\"action.icon\" size=\"sm\" [decorative]=\"true\" />\n }\n @if (action.label) {\n {{ action.label }}\n }\n </lc-button>\n }\n }\n </div>\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n</div>\n\n<!-- Shared cell content (edit input / custom template / formatted value) -->\n<ng-template #cellContent let-row=\"row\" let-column=\"column\" let-absIndex=\"absIndex\">\n @if (isEditing(row, column.key)) {\n <input\n #editInput\n type=\"text\"\n class=\"lc-table__edit-input\"\n [value]=\"editValue()\"\n (input)=\"editValue.set(getInputValue($event))\"\n (blur)=\"commitEdit(row, column.key)\"\n (keydown)=\"onEditKeydown($event, row, column.key)\"\n />\n } @else if (hasCustomTemplate(column.key)) {\n <ng-container *ngTemplateOutlet=\"getCellTemplate(column.key)!.template; context: { $implicit: row }\"></ng-container>\n } @else {\n {{ getFormattedCellValue(row, column, absIndex) }}\n }\n</ng-template>\n\n<!-- Pagination -->\n@if (paginate()) {\n <div class=\"lc-table-pagination\">\n <div class=\"lc-table-pagination__info\">\n {{ paginationStart }}–{{ paginationEnd }} {{ rangeOfLabel() }} {{ totalRows() }}\n </div>\n <div class=\"lc-table-pagination__controls\">\n <lc-select\n class=\"lc-table-pagination__size\"\n [size]=\"size() === 'sm' ? 'sm' : size() === 'lg' ? 'lg' : 'md'\"\n [options]=\"pageSizeSelectOptions()\"\n [ngModel]=\"internalPageSize()\"\n [ariaLabel]=\"rowsPerPageAriaLabel()\"\n (ngModelChange)=\"onPageSizeModelChange($event)\"\n />\n <button\n type=\"button\"\n class=\"lc-table-pagination__btn\"\n [disabled]=\"currentPage() === 0\"\n (click)=\"goToPage(currentPage() - 1)\"\n [attr.aria-label]=\"previousPageAriaLabel()\"\n >‹</button>\n <span class=\"lc-table-pagination__page\">\n {{ currentPage() + 1 }} / {{ totalPages() }}\n </span>\n <button\n type=\"button\"\n class=\"lc-table-pagination__btn\"\n [disabled]=\"currentPage() >= totalPages() - 1\"\n (click)=\"goToPage(currentPage() + 1)\"\n [attr.aria-label]=\"nextPageAriaLabel()\"\n >›</button>\n </div>\n </div>\n}\n"],"mappings":"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"}
@@ -0,0 +1,407 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, TemplateRef, ViewEncapsulation, computed, contentChildren, effect, input, model, untracked, viewChild, viewChildren } from "@angular/core";
3
+ import { NgClass, NgTemplateOutlet } from "@angular/common";
4
+ import { BadgeComponent } from "@lifecorner/angular-ui-kit/badge";
5
+ let nextUniqueId = 0;
6
+ var TabComponent = class TabComponent {
7
+ label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
8
+ disabled = input(false, ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
9
+ icon = input(...ngDevMode ? [void 0, { debugName: "icon" }] : /* istanbul ignore next */ []);
10
+ badge = input(...ngDevMode ? [void 0, { debugName: "badge" }] : /* istanbul ignore next */ []);
11
+ badgeVariant = input("default", ...ngDevMode ? [{ debugName: "badgeVariant" }] : /* istanbul ignore next */ []);
12
+ hasBadge = computed(() => {
13
+ const badge = this.badge();
14
+ return badge !== void 0 && badge !== null && badge !== "";
15
+ }, ...ngDevMode ? [{ debugName: "hasBadge" }] : /* istanbul ignore next */ []);
16
+ id = `lc-tab-${nextUniqueId++}`;
17
+ panelId = `lc-tabpanel-${this.id}`;
18
+ template = viewChild.required(TemplateRef, ...ngDevMode ? [{ debugName: "template" }] : /* istanbul ignore next */ []);
19
+ static ɵfac = i0.ɵɵngDeclareFactory({
20
+ minVersion: "12.0.0",
21
+ version: "22.2.2",
22
+ ngImport: i0,
23
+ type: TabComponent,
24
+ deps: [],
25
+ target: i0.ɵɵFactoryTarget.Component
26
+ });
27
+ static ɵcmp = i0.ɵɵngDeclareComponent({
28
+ minVersion: "17.2.0",
29
+ version: "22.2.2",
30
+ type: TabComponent,
31
+ isStandalone: true,
32
+ selector: "lc-tab",
33
+ inputs: {
34
+ label: {
35
+ classPropertyName: "label",
36
+ publicName: "label",
37
+ isSignal: true,
38
+ isRequired: false,
39
+ transformFunction: null
40
+ },
41
+ disabled: {
42
+ classPropertyName: "disabled",
43
+ publicName: "disabled",
44
+ isSignal: true,
45
+ isRequired: false,
46
+ transformFunction: null
47
+ },
48
+ icon: {
49
+ classPropertyName: "icon",
50
+ publicName: "icon",
51
+ isSignal: true,
52
+ isRequired: false,
53
+ transformFunction: null
54
+ },
55
+ badge: {
56
+ classPropertyName: "badge",
57
+ publicName: "badge",
58
+ isSignal: true,
59
+ isRequired: false,
60
+ transformFunction: null
61
+ },
62
+ badgeVariant: {
63
+ classPropertyName: "badgeVariant",
64
+ publicName: "badgeVariant",
65
+ isSignal: true,
66
+ isRequired: false,
67
+ transformFunction: null
68
+ }
69
+ },
70
+ viewQueries: [{
71
+ propertyName: "template",
72
+ first: true,
73
+ predicate: TemplateRef,
74
+ descendants: true,
75
+ isSignal: true
76
+ }],
77
+ ngImport: i0,
78
+ template: `
79
+ <ng-template>
80
+ <ng-content></ng-content>
81
+ </ng-template>
82
+ `,
83
+ isInline: true,
84
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
85
+ });
86
+ };
87
+ i0.ɵɵngDeclareClassMetadata({
88
+ minVersion: "12.0.0",
89
+ version: "22.2.2",
90
+ ngImport: i0,
91
+ type: TabComponent,
92
+ decorators: [{
93
+ type: Component,
94
+ args: [{
95
+ selector: "lc-tab",
96
+ standalone: true,
97
+ imports: [],
98
+ template: `
99
+ <ng-template>
100
+ <ng-content></ng-content>
101
+ </ng-template>
102
+ `,
103
+ changeDetection: ChangeDetectionStrategy.OnPush
104
+ }]
105
+ }],
106
+ propDecorators: {
107
+ label: [{
108
+ type: i0.Input,
109
+ args: [{
110
+ isSignal: true,
111
+ alias: "label",
112
+ required: false
113
+ }]
114
+ }],
115
+ disabled: [{
116
+ type: i0.Input,
117
+ args: [{
118
+ isSignal: true,
119
+ alias: "disabled",
120
+ required: false
121
+ }]
122
+ }],
123
+ icon: [{
124
+ type: i0.Input,
125
+ args: [{
126
+ isSignal: true,
127
+ alias: "icon",
128
+ required: false
129
+ }]
130
+ }],
131
+ badge: [{
132
+ type: i0.Input,
133
+ args: [{
134
+ isSignal: true,
135
+ alias: "badge",
136
+ required: false
137
+ }]
138
+ }],
139
+ badgeVariant: [{
140
+ type: i0.Input,
141
+ args: [{
142
+ isSignal: true,
143
+ alias: "badgeVariant",
144
+ required: false
145
+ }]
146
+ }],
147
+ template: [{
148
+ type: i0.ViewChild,
149
+ args: [i0.forwardRef(() => TemplateRef), { isSignal: true }]
150
+ }]
151
+ }
152
+ });
153
+ var TabsComponent = class TabsComponent {
154
+ orientation = input("horizontal", ...ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []);
155
+ selectedIndex = model(0, ...ngDevMode ? [{ debugName: "selectedIndex" }] : /* istanbul ignore next */ []);
156
+ selectedIndexInput = input(void 0, ...ngDevMode ? [{ debugName: "selectedIndexInput" }] : /* istanbul ignore next */ []);
157
+ tabs = contentChildren(TabComponent, ...ngDevMode ? [{ debugName: "tabs" }] : /* istanbul ignore next */ []);
158
+ tabList = computed(() => this.tabs(), ...ngDevMode ? [{ debugName: "tabList" }] : /* istanbul ignore next */ []);
159
+ tabButtons = viewChildren("tabButton", ...ngDevMode ? [{ debugName: "tabButtons" }] : /* istanbul ignore next */ []);
160
+ tabListClasses = computed(() => ({
161
+ "lc-tabs__list": true,
162
+ "lc-tabs--horizontal": this.orientation() === "horizontal",
163
+ "lc-tabs--vertical": this.orientation() === "vertical"
164
+ }), ...ngDevMode ? [{ debugName: "tabListClasses" }] : /* istanbul ignore next */ []);
165
+ constructor() {
166
+ effect(() => {
167
+ const legacy = this.selectedIndexInput();
168
+ if (legacy !== void 0) untracked(() => this.selectedIndex.set(legacy));
169
+ });
170
+ effect(() => {
171
+ const count = this.tabs().length;
172
+ const index = untracked(() => this.selectedIndex());
173
+ if (count > 0 && index >= count) untracked(() => this.selectTab(this.getLastEnabledTab()));
174
+ });
175
+ }
176
+ selectTab(index) {
177
+ const tabs = this.tabList();
178
+ const tab = tabs[index];
179
+ if (index >= 0 && index < tabs.length && tab && !tab.disabled()) this.selectedIndex.set(index);
180
+ }
181
+ isSelected(index) {
182
+ return this.selectedIndex() === index;
183
+ }
184
+ handleKeyDown(event) {
185
+ const currentIndex = this.selectedIndex();
186
+ let nextIndex = currentIndex;
187
+ const isHorizontal = this.orientation() === "horizontal";
188
+ const nextKey = isHorizontal ? "ArrowRight" : "ArrowDown";
189
+ const prevKey = isHorizontal ? "ArrowLeft" : "ArrowUp";
190
+ switch (event.key) {
191
+ case nextKey:
192
+ event.preventDefault();
193
+ nextIndex = this.getNextEnabledTab(currentIndex);
194
+ break;
195
+ case prevKey:
196
+ event.preventDefault();
197
+ nextIndex = this.getPreviousEnabledTab(currentIndex);
198
+ break;
199
+ case "Home":
200
+ event.preventDefault();
201
+ nextIndex = this.getFirstEnabledTab();
202
+ break;
203
+ case "End":
204
+ event.preventDefault();
205
+ nextIndex = this.getLastEnabledTab();
206
+ break;
207
+ default: return;
208
+ }
209
+ if (nextIndex !== currentIndex) {
210
+ this.selectTab(nextIndex);
211
+ this.focusTab(nextIndex);
212
+ }
213
+ }
214
+ getTabIndex(index) {
215
+ return this.isSelected(index) ? 0 : -1;
216
+ }
217
+ focusTab(index) {
218
+ this.tabButtons()[index]?.nativeElement.focus();
219
+ }
220
+ getNextEnabledTab(currentIndex) {
221
+ const tabs = this.tabList();
222
+ let nextIndex = (currentIndex + 1) % tabs.length;
223
+ const startIndex = nextIndex;
224
+ while (tabs[nextIndex]?.disabled()) {
225
+ nextIndex = (nextIndex + 1) % tabs.length;
226
+ if (nextIndex === startIndex) return currentIndex;
227
+ }
228
+ return nextIndex;
229
+ }
230
+ getPreviousEnabledTab(currentIndex) {
231
+ const tabs = this.tabList();
232
+ let prevIndex = currentIndex - 1;
233
+ if (prevIndex < 0) prevIndex = tabs.length - 1;
234
+ const startIndex = prevIndex;
235
+ while (tabs[prevIndex]?.disabled()) {
236
+ prevIndex = prevIndex - 1;
237
+ if (prevIndex < 0) prevIndex = tabs.length - 1;
238
+ if (prevIndex === startIndex) return currentIndex;
239
+ }
240
+ return prevIndex;
241
+ }
242
+ getFirstEnabledTab() {
243
+ const tabs = this.tabList();
244
+ for (let i = 0; i < tabs.length; i++) {
245
+ const tab = tabs[i];
246
+ if (tab && !tab.disabled()) return i;
247
+ }
248
+ return 0;
249
+ }
250
+ getLastEnabledTab() {
251
+ const tabs = this.tabList();
252
+ for (let i = tabs.length - 1; i >= 0; i--) {
253
+ const tab = tabs[i];
254
+ if (tab && !tab.disabled()) return i;
255
+ }
256
+ return tabs.length - 1;
257
+ }
258
+ static ɵfac = i0.ɵɵngDeclareFactory({
259
+ minVersion: "12.0.0",
260
+ version: "22.2.2",
261
+ ngImport: i0,
262
+ type: TabsComponent,
263
+ deps: [],
264
+ target: i0.ɵɵFactoryTarget.Component
265
+ });
266
+ static ɵcmp = i0.ɵɵngDeclareComponent({
267
+ minVersion: "17.0.0",
268
+ version: "22.2.2",
269
+ type: TabsComponent,
270
+ isStandalone: true,
271
+ selector: "lc-tabs",
272
+ inputs: {
273
+ orientation: {
274
+ classPropertyName: "orientation",
275
+ publicName: "orientation",
276
+ isSignal: true,
277
+ isRequired: false,
278
+ transformFunction: null
279
+ },
280
+ selectedIndex: {
281
+ classPropertyName: "selectedIndex",
282
+ publicName: "selectedIndex",
283
+ isSignal: true,
284
+ isRequired: false,
285
+ transformFunction: null
286
+ },
287
+ selectedIndexInput: {
288
+ classPropertyName: "selectedIndexInput",
289
+ publicName: "selectedIndexInput",
290
+ isSignal: true,
291
+ isRequired: false,
292
+ transformFunction: null
293
+ }
294
+ },
295
+ outputs: { selectedIndex: "selectedIndexChange" },
296
+ host: { classAttribute: "lc-tabs" },
297
+ queries: [{
298
+ propertyName: "tabs",
299
+ predicate: TabComponent,
300
+ isSignal: true
301
+ }],
302
+ viewQueries: [{
303
+ propertyName: "tabButtons",
304
+ predicate: ["tabButton"],
305
+ descendants: true,
306
+ isSignal: true
307
+ }],
308
+ ngImport: i0,
309
+ template: "<div\n class=\"lc-tabs__container\"\n [class.lc-tabs__container--horizontal]=\"orientation() === 'horizontal'\"\n [class.lc-tabs__container--vertical]=\"orientation() === 'vertical'\"\n>\n <!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus -- keydown bubbles from the focused tab (roving tabindex) -->\n <div\n [ngClass]=\"tabListClasses()\"\n role=\"tablist\"\n [attr.aria-orientation]=\"orientation()\"\n (keydown)=\"handleKeyDown($event)\"\n >\n @for (tab of tabList(); track tab.id; let i = $index) {\n <button\n #tabButton\n type=\"button\"\n class=\"lc-tabs__tab\"\n [class.lc-tabs__tab--selected]=\"isSelected(i)\"\n [class.lc-tabs__tab--disabled]=\"tab.disabled()\"\n role=\"tab\"\n [attr.id]=\"tab.id\"\n [attr.aria-selected]=\"isSelected(i)\"\n [attr.aria-controls]=\"tab.panelId\"\n [attr.aria-disabled]=\"tab.disabled() || null\"\n [tabindex]=\"getTabIndex(i)\"\n [disabled]=\"tab.disabled()\"\n (click)=\"selectTab(i)\"\n >\n {{ tab.label() }}\n @if (tab.hasBadge()) {\n <lc-badge\n class=\"lc-tabs__badge\"\n [variant]=\"tab.badgeVariant()\"\n size=\"xs\"\n [rounded]=\"true\"\n >{{ tab.badge() }}</lc-badge\n >\n }\n </button>\n }\n </div>\n\n <div class=\"lc-tabs__panels\">\n @for (tab of tabList(); track tab.id; let i = $index) {\n <div\n class=\"lc-tabs__panel\"\n [class.lc-tabs__panel--active]=\"isSelected(i)\"\n role=\"tabpanel\"\n [attr.id]=\"tab.panelId\"\n [attr.aria-labelledby]=\"tab.id\"\n [attr.hidden]=\"!isSelected(i) || null\"\n [tabindex]=\"0\"\n >\n <ng-container [ngTemplateOutlet]=\"tab.template()\"></ng-container>\n </div>\n }\n </div>\n</div>\n",
310
+ styles: [".lc-tabs{display:block;width:100%}.lc-tabs__container{display:flex;gap:var(--lc-density-gap-md, var(--spacing-4))}.lc-tabs__container--horizontal{flex-direction:column}.lc-tabs__container--vertical{flex-direction:row}.lc-tabs__list{display:flex;gap:var(--lc-density-gap-sm, var(--spacing-2));border-bottom:1px solid var(--color-divider)}.lc-tabs__list.lc-tabs--horizontal{flex-direction:row;border-bottom:1px solid var(--color-divider)}.lc-tabs__list.lc-tabs--vertical{flex-direction:column;border-bottom:none;border-right:1px solid var(--color-divider);min-width:200px}.lc-tabs__tab{appearance:none;background:none;border:none;margin:0;font:inherit;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:var(--lc-density-gap-sm, var(--spacing-2));padding:var(--lc-density-padding-xs, var(--spacing-2)) var(--lc-density-padding-md, var(--spacing-4));font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:var(--color-text-secondary);border-bottom:2px solid transparent;transition:color var(--animation-duration-base) var(--animation-timing-ease),background-color var(--animation-duration-base) var(--animation-timing-ease),border-color var(--animation-duration-base) var(--animation-timing-ease);white-space:nowrap}.lc-tabs__tab:hover:not(.lc-tabs__tab--disabled){color:var(--color-text-primary);background-color:var(--color-surface-hover)}.lc-tabs__tab:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:2px;border-radius:var(--border-radius-sm)}.lc-tabs__tab--selected{color:var(--color-on-primary-subtle);border-bottom-color:var(--color-primary-500);font-weight:var(--font-weight-semibold)}.lc-tabs--vertical .lc-tabs__tab--selected{border-bottom-color:transparent;border-right:2px solid var(--color-primary-500)}.lc-tabs__tab--disabled{color:var(--color-text-disabled);cursor:not-allowed;opacity:.5}.lc-tabs--vertical .lc-tabs__tab{border-bottom:none;border-right:2px solid transparent;justify-content:flex-start;text-align:left;width:100%}.lc-tabs--vertical .lc-tabs__tab .lc-tabs__badge{margin-left:auto}.lc-tabs__badge{flex-shrink:0;font-weight:var(--font-weight-medium)}.lc-tabs__panels{flex:1;min-width:0}.lc-tabs__panel{display:none;padding:var(--lc-density-padding-md, var(--spacing-4));animation:fadeIn var(--animation-duration-base) var(--animation-timing-ease)}.lc-tabs__panel--active{display:block}.lc-tabs__panel:focus{outline:none}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}\n"],
311
+ dependencies: [
312
+ {
313
+ kind: "directive",
314
+ type: NgClass,
315
+ selector: "[ngClass]",
316
+ inputs: ["class", "ngClass"]
317
+ },
318
+ {
319
+ kind: "directive",
320
+ type: NgTemplateOutlet,
321
+ selector: "[ngTemplateOutlet]",
322
+ inputs: [
323
+ "ngTemplateOutletContext",
324
+ "ngTemplateOutlet",
325
+ "ngTemplateOutletInjector"
326
+ ]
327
+ },
328
+ {
329
+ kind: "component",
330
+ type: BadgeComponent,
331
+ selector: "lc-badge",
332
+ inputs: [
333
+ "variant",
334
+ "size",
335
+ "rounded",
336
+ "dot"
337
+ ]
338
+ }
339
+ ],
340
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
341
+ encapsulation: i0.ViewEncapsulation.None
342
+ });
343
+ };
344
+ i0.ɵɵngDeclareClassMetadata({
345
+ minVersion: "12.0.0",
346
+ version: "22.2.2",
347
+ ngImport: i0,
348
+ type: TabsComponent,
349
+ decorators: [{
350
+ type: Component,
351
+ args: [{
352
+ selector: "lc-tabs",
353
+ standalone: true,
354
+ imports: [
355
+ NgClass,
356
+ NgTemplateOutlet,
357
+ BadgeComponent
358
+ ],
359
+ encapsulation: ViewEncapsulation.None,
360
+ changeDetection: ChangeDetectionStrategy.OnPush,
361
+ host: { class: "lc-tabs" },
362
+ template: "<div\n class=\"lc-tabs__container\"\n [class.lc-tabs__container--horizontal]=\"orientation() === 'horizontal'\"\n [class.lc-tabs__container--vertical]=\"orientation() === 'vertical'\"\n>\n <!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus -- keydown bubbles from the focused tab (roving tabindex) -->\n <div\n [ngClass]=\"tabListClasses()\"\n role=\"tablist\"\n [attr.aria-orientation]=\"orientation()\"\n (keydown)=\"handleKeyDown($event)\"\n >\n @for (tab of tabList(); track tab.id; let i = $index) {\n <button\n #tabButton\n type=\"button\"\n class=\"lc-tabs__tab\"\n [class.lc-tabs__tab--selected]=\"isSelected(i)\"\n [class.lc-tabs__tab--disabled]=\"tab.disabled()\"\n role=\"tab\"\n [attr.id]=\"tab.id\"\n [attr.aria-selected]=\"isSelected(i)\"\n [attr.aria-controls]=\"tab.panelId\"\n [attr.aria-disabled]=\"tab.disabled() || null\"\n [tabindex]=\"getTabIndex(i)\"\n [disabled]=\"tab.disabled()\"\n (click)=\"selectTab(i)\"\n >\n {{ tab.label() }}\n @if (tab.hasBadge()) {\n <lc-badge\n class=\"lc-tabs__badge\"\n [variant]=\"tab.badgeVariant()\"\n size=\"xs\"\n [rounded]=\"true\"\n >{{ tab.badge() }}</lc-badge\n >\n }\n </button>\n }\n </div>\n\n <div class=\"lc-tabs__panels\">\n @for (tab of tabList(); track tab.id; let i = $index) {\n <div\n class=\"lc-tabs__panel\"\n [class.lc-tabs__panel--active]=\"isSelected(i)\"\n role=\"tabpanel\"\n [attr.id]=\"tab.panelId\"\n [attr.aria-labelledby]=\"tab.id\"\n [attr.hidden]=\"!isSelected(i) || null\"\n [tabindex]=\"0\"\n >\n <ng-container [ngTemplateOutlet]=\"tab.template()\"></ng-container>\n </div>\n }\n </div>\n</div>\n",
363
+ styles: [".lc-tabs{display:block;width:100%}.lc-tabs__container{display:flex;gap:var(--lc-density-gap-md, var(--spacing-4))}.lc-tabs__container--horizontal{flex-direction:column}.lc-tabs__container--vertical{flex-direction:row}.lc-tabs__list{display:flex;gap:var(--lc-density-gap-sm, var(--spacing-2));border-bottom:1px solid var(--color-divider)}.lc-tabs__list.lc-tabs--horizontal{flex-direction:row;border-bottom:1px solid var(--color-divider)}.lc-tabs__list.lc-tabs--vertical{flex-direction:column;border-bottom:none;border-right:1px solid var(--color-divider);min-width:200px}.lc-tabs__tab{appearance:none;background:none;border:none;margin:0;font:inherit;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:var(--lc-density-gap-sm, var(--spacing-2));padding:var(--lc-density-padding-xs, var(--spacing-2)) var(--lc-density-padding-md, var(--spacing-4));font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:var(--color-text-secondary);border-bottom:2px solid transparent;transition:color var(--animation-duration-base) var(--animation-timing-ease),background-color var(--animation-duration-base) var(--animation-timing-ease),border-color var(--animation-duration-base) var(--animation-timing-ease);white-space:nowrap}.lc-tabs__tab:hover:not(.lc-tabs__tab--disabled){color:var(--color-text-primary);background-color:var(--color-surface-hover)}.lc-tabs__tab:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:2px;border-radius:var(--border-radius-sm)}.lc-tabs__tab--selected{color:var(--color-on-primary-subtle);border-bottom-color:var(--color-primary-500);font-weight:var(--font-weight-semibold)}.lc-tabs--vertical .lc-tabs__tab--selected{border-bottom-color:transparent;border-right:2px solid var(--color-primary-500)}.lc-tabs__tab--disabled{color:var(--color-text-disabled);cursor:not-allowed;opacity:.5}.lc-tabs--vertical .lc-tabs__tab{border-bottom:none;border-right:2px solid transparent;justify-content:flex-start;text-align:left;width:100%}.lc-tabs--vertical .lc-tabs__tab .lc-tabs__badge{margin-left:auto}.lc-tabs__badge{flex-shrink:0;font-weight:var(--font-weight-medium)}.lc-tabs__panels{flex:1;min-width:0}.lc-tabs__panel{display:none;padding:var(--lc-density-padding-md, var(--spacing-4));animation:fadeIn var(--animation-duration-base) var(--animation-timing-ease)}.lc-tabs__panel--active{display:block}.lc-tabs__panel:focus{outline:none}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}\n"]
364
+ }]
365
+ }],
366
+ ctorParameters: () => [],
367
+ propDecorators: {
368
+ orientation: [{
369
+ type: i0.Input,
370
+ args: [{
371
+ isSignal: true,
372
+ alias: "orientation",
373
+ required: false
374
+ }]
375
+ }],
376
+ selectedIndex: [{
377
+ type: i0.Input,
378
+ args: [{
379
+ isSignal: true,
380
+ alias: "selectedIndex",
381
+ required: false
382
+ }]
383
+ }, {
384
+ type: i0.Output,
385
+ args: ["selectedIndexChange"]
386
+ }],
387
+ selectedIndexInput: [{
388
+ type: i0.Input,
389
+ args: [{
390
+ isSignal: true,
391
+ alias: "selectedIndexInput",
392
+ required: false
393
+ }]
394
+ }],
395
+ tabs: [{
396
+ type: i0.ContentChildren,
397
+ args: [i0.forwardRef(() => TabComponent), { isSignal: true }]
398
+ }],
399
+ tabButtons: [{
400
+ type: i0.ViewChildren,
401
+ args: ["tabButton", { isSignal: true }]
402
+ }]
403
+ }
404
+ });
405
+ export { TabComponent, TabsComponent };
406
+
407
+ //# sourceMappingURL=lifecorner-angular-ui-kit-tabs.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecorner-angular-ui-kit-tabs.mjs","names":[],"sources":["../../../../libs/angular-ui-kit/src/lib/tabs/tabs.component.ts","../../../../libs/angular-ui-kit/src/lib/tabs/tabs.component.html"],"sourcesContent":["import {\n Component,\n input,\n model,\n contentChildren,\n viewChild,\n viewChildren,\n computed,\n effect,\n untracked,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n TemplateRef,\n ElementRef,\n} from '@angular/core';\nimport { NgClass, NgTemplateOutlet } from '@angular/common';\nimport { BadgeComponent, BadgeVariant } from '@lifecorner/angular-ui-kit/badge';\n\nlet nextUniqueId = 0;\n\nexport type TabOrientation = 'horizontal' | 'vertical';\n\n/**\n * Individual tab component\n */\n@Component({\n selector: 'lc-tab',\n standalone: true,\n imports: [],\n template: `\n <ng-template>\n <ng-content></ng-content>\n </ng-template>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TabComponent {\n /**\n * Tab label displayed in tab button\n */\n readonly label = input('');\n\n /**\n * Whether the tab is disabled\n * @default false\n */\n readonly disabled = input(false);\n\n /**\n * Optional icon name (Tabler Icons)\n */\n readonly icon = input<string | undefined>();\n\n /**\n * Optional badge content shown after the label (e.g. a count or \"New\").\n * `0` is rendered; `undefined`, `null`, and `''` hide the badge.\n */\n readonly badge = input<string | number | undefined | null>();\n\n /**\n * Badge color variant\n * @default 'default'\n */\n readonly badgeVariant = input<BadgeVariant>('default');\n\n /**\n * Whether the badge should be rendered\n */\n readonly hasBadge = computed(() => {\n const badge = this.badge();\n return badge !== undefined && badge !== null && badge !== '';\n });\n\n /**\n * Unique ID for accessibility\n */\n readonly id = `lc-tab-${nextUniqueId++}`;\n\n /**\n * Unique ID for the panel\n */\n readonly panelId = `lc-tabpanel-${this.id}`;\n\n /**\n * Template reference for tab content\n */\n readonly template = viewChild.required(TemplateRef);\n}\n\n/**\n * Tabs component for organizing content into switchable views.\n *\n * Features:\n * - Dynamic tab registration via content projection (tabs added or removed\n * after init are picked up automatically)\n * - Active tab tracking with two-way binding (`[(selectedIndex)]`)\n * - Accessible with ARIA tablist/tab/tabpanel roles\n * - Keyboard navigation between tabs (arrow keys, Home, End) moves both the\n * selection and DOM focus\n * - Lazy content rendering per tab\n * - Optional badge per tab (counts or status labels)\n *\n * @example\n * ```html\n * <lc-tabs [(selectedIndex)]=\"active\">\n * <lc-tab label=\"Account\">Account settings</lc-tab>\n * <lc-tab label=\"Inbox\" [badge]=\"12\" badgeVariant=\"primary\">Messages</lc-tab>\n * <lc-tab label=\"Security\">Security settings</lc-tab>\n * </lc-tabs>\n * ```\n */\n@Component({\n selector: 'lc-tabs',\n standalone: true,\n imports: [NgClass, NgTemplateOutlet, BadgeComponent],\n templateUrl: './tabs.component.html',\n styleUrl: './tabs.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'lc-tabs',\n },\n})\nexport class TabsComponent {\n /**\n * Orientation of tabs\n * @default 'horizontal'\n */\n readonly orientation = input<TabOrientation>('horizontal');\n\n /**\n * Currently selected tab index. Two-way bindable via `[(selectedIndex)]`;\n * `selectedIndexChange` emits only when the selection actually changes\n * (never during initialisation).\n * @default 0\n */\n readonly selectedIndex = model(0);\n\n /**\n * Legacy one-way input for the selected index.\n * @deprecated Bind `[selectedIndex]` / `[(selectedIndex)]` instead.\n */\n readonly selectedIndexInput = input<number | undefined>(undefined);\n\n /**\n * Projected tab components (signal query — updates when tabs are added or\n * removed after init).\n */\n readonly tabs = contentChildren(TabComponent);\n\n /**\n * Tab list for template access\n */\n readonly tabList = computed(() => this.tabs());\n\n /**\n * Rendered tab buttons — used to move DOM focus on keyboard navigation.\n */\n private readonly tabButtons = viewChildren<ElementRef<HTMLButtonElement>>('tabButton');\n\n /**\n * CSS classes for tab list\n */\n readonly tabListClasses = computed(() => ({\n 'lc-tabs__list': true,\n 'lc-tabs--horizontal': this.orientation() === 'horizontal',\n 'lc-tabs--vertical': this.orientation() === 'vertical',\n }));\n\n constructor() {\n // Mirror the deprecated one-way input into the model. `model.set` is a\n // no-op (no emit) when the value is unchanged, so binding the same index\n // does not fire `selectedIndexChange`.\n effect(() => {\n const legacy = this.selectedIndexInput();\n if (legacy !== undefined) {\n untracked(() => this.selectedIndex.set(legacy));\n }\n });\n\n // Keep the selection valid when tabs are removed at runtime: falling off\n // the end would leave no panel visible and no tab reachable via Tab.\n effect(() => {\n const count = this.tabs().length;\n const index = untracked(() => this.selectedIndex());\n if (count > 0 && index >= count) {\n untracked(() => this.selectTab(this.getLastEnabledTab()));\n }\n });\n }\n\n /**\n * Select a tab by index\n */\n selectTab(index: number): void {\n const tabs = this.tabList();\n const tab = tabs[index];\n if (index >= 0 && index < tabs.length && tab && !tab.disabled()) {\n this.selectedIndex.set(index);\n }\n }\n\n /**\n * Check if tab is selected\n */\n isSelected(index: number): boolean {\n return this.selectedIndex() === index;\n }\n\n /**\n * Handle keyboard navigation (automatic activation: focus and selection\n * move together).\n */\n handleKeyDown(event: KeyboardEvent): void {\n const currentIndex = this.selectedIndex();\n let nextIndex = currentIndex;\n\n const isHorizontal = this.orientation() === 'horizontal';\n const nextKey = isHorizontal ? 'ArrowRight' : 'ArrowDown';\n const prevKey = isHorizontal ? 'ArrowLeft' : 'ArrowUp';\n\n switch (event.key) {\n case nextKey:\n event.preventDefault();\n nextIndex = this.getNextEnabledTab(currentIndex);\n break;\n\n case prevKey:\n event.preventDefault();\n nextIndex = this.getPreviousEnabledTab(currentIndex);\n break;\n\n case 'Home':\n event.preventDefault();\n nextIndex = this.getFirstEnabledTab();\n break;\n\n case 'End':\n event.preventDefault();\n nextIndex = this.getLastEnabledTab();\n break;\n\n default:\n return;\n }\n\n if (nextIndex !== currentIndex) {\n this.selectTab(nextIndex);\n this.focusTab(nextIndex);\n }\n }\n\n /**\n * Get tabindex for tab button\n */\n getTabIndex(index: number): number {\n return this.isSelected(index) ? 0 : -1;\n }\n\n /**\n * Move DOM focus to the tab button at `index` (roving tabindex).\n */\n private focusTab(index: number): void {\n this.tabButtons()[index]?.nativeElement.focus();\n }\n\n /**\n * Get next enabled tab index (with wrapping)\n */\n private getNextEnabledTab(currentIndex: number): number {\n const tabs = this.tabList();\n let nextIndex = (currentIndex + 1) % tabs.length;\n const startIndex = nextIndex;\n\n while (tabs[nextIndex]?.disabled()) {\n nextIndex = (nextIndex + 1) % tabs.length;\n if (nextIndex === startIndex) {\n return currentIndex; // No enabled tabs found\n }\n }\n\n return nextIndex;\n }\n\n /**\n * Get previous enabled tab index (with wrapping)\n */\n private getPreviousEnabledTab(currentIndex: number): number {\n const tabs = this.tabList();\n let prevIndex = currentIndex - 1;\n if (prevIndex < 0) {\n prevIndex = tabs.length - 1;\n }\n const startIndex = prevIndex;\n\n while (tabs[prevIndex]?.disabled()) {\n prevIndex = prevIndex - 1;\n if (prevIndex < 0) {\n prevIndex = tabs.length - 1;\n }\n if (prevIndex === startIndex) {\n return currentIndex; // No enabled tabs found\n }\n }\n\n return prevIndex;\n }\n\n /**\n * Get first enabled tab index\n */\n private getFirstEnabledTab(): number {\n const tabs = this.tabList();\n for (let i = 0; i < tabs.length; i++) {\n const tab = tabs[i];\n if (tab && !tab.disabled()) {\n return i;\n }\n }\n return 0;\n }\n\n /**\n * Get last enabled tab index\n */\n private getLastEnabledTab(): number {\n const tabs = this.tabList();\n for (let i = tabs.length - 1; i >= 0; i--) {\n const tab = tabs[i];\n if (tab && !tab.disabled()) {\n return i;\n }\n }\n return tabs.length - 1;\n }\n}\n","<div\n class=\"lc-tabs__container\"\n [class.lc-tabs__container--horizontal]=\"orientation() === 'horizontal'\"\n [class.lc-tabs__container--vertical]=\"orientation() === 'vertical'\"\n>\n <!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus -- keydown bubbles from the focused tab (roving tabindex) -->\n <div\n [ngClass]=\"tabListClasses()\"\n role=\"tablist\"\n [attr.aria-orientation]=\"orientation()\"\n (keydown)=\"handleKeyDown($event)\"\n >\n @for (tab of tabList(); track tab.id; let i = $index) {\n <button\n #tabButton\n type=\"button\"\n class=\"lc-tabs__tab\"\n [class.lc-tabs__tab--selected]=\"isSelected(i)\"\n [class.lc-tabs__tab--disabled]=\"tab.disabled()\"\n role=\"tab\"\n [attr.id]=\"tab.id\"\n [attr.aria-selected]=\"isSelected(i)\"\n [attr.aria-controls]=\"tab.panelId\"\n [attr.aria-disabled]=\"tab.disabled() || null\"\n [tabindex]=\"getTabIndex(i)\"\n [disabled]=\"tab.disabled()\"\n (click)=\"selectTab(i)\"\n >\n {{ tab.label() }}\n @if (tab.hasBadge()) {\n <lc-badge\n class=\"lc-tabs__badge\"\n [variant]=\"tab.badgeVariant()\"\n size=\"xs\"\n [rounded]=\"true\"\n >{{ tab.badge() }}</lc-badge\n >\n }\n </button>\n }\n </div>\n\n <div class=\"lc-tabs__panels\">\n @for (tab of tabList(); track tab.id; let i = $index) {\n <div\n class=\"lc-tabs__panel\"\n [class.lc-tabs__panel--active]=\"isSelected(i)\"\n role=\"tabpanel\"\n [attr.id]=\"tab.panelId\"\n [attr.aria-labelledby]=\"tab.id\"\n [attr.hidden]=\"!isSelected(i) || null\"\n [tabindex]=\"0\"\n >\n <ng-container [ngTemplateOutlet]=\"tab.template()\"></ng-container>\n </div>\n }\n </div>\n</div>\n"],"mappings":"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"}