@lifecorner/angular-ui-kit 3.4.0 → 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,200 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, computed, input } from "@angular/core";
3
+ import { IconComponent } from "@lifecorner/angular-ui-kit/icon";
4
+ var FooterComponent = class FooterComponent {
5
+ sections = input([], ...ngDevMode ? [{ debugName: "sections" }] : /* istanbul ignore next */ []);
6
+ copyright = input(...ngDevMode ? [void 0, { debugName: "copyright" }] : /* istanbul ignore next */ []);
7
+ showBorder = input(true, ...ngDevMode ? [{ debugName: "showBorder" }] : /* istanbul ignore next */ []);
8
+ compact = input(false, ...ngDevMode ? [{ debugName: "compact" }] : /* istanbul ignore next */ []);
9
+ variant = input("default", ...ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []);
10
+ headingLevel = input(4, ...ngDevMode ? [{ debugName: "headingLevel" }] : /* istanbul ignore next */ []);
11
+ navAriaLabel = input("Footer", ...ngDevMode ? [{ debugName: "navAriaLabel" }] : /* istanbul ignore next */ []);
12
+ externalLinkHint = input("(opens in a new tab)", ...ngDevMode ? [{ debugName: "externalLinkHint" }] : /* istanbul ignore next */ []);
13
+ footerClasses = computed(() => {
14
+ const classes = ["footer", `footer--${this.variant()}`];
15
+ if (this.showBorder()) classes.push("footer--bordered");
16
+ if (this.compact()) classes.push("footer--compact");
17
+ return classes.join(" ");
18
+ }, ...ngDevMode ? [{ debugName: "footerClasses" }] : /* istanbul ignore next */ []);
19
+ linkRel(link) {
20
+ return link.rel ?? (link.external ? "noopener noreferrer" : null);
21
+ }
22
+ currentYear = (/* @__PURE__ */ new Date()).getFullYear();
23
+ static ɵfac = i0.ɵɵngDeclareFactory({
24
+ minVersion: "12.0.0",
25
+ version: "22.2.2",
26
+ ngImport: i0,
27
+ type: FooterComponent,
28
+ deps: [],
29
+ target: i0.ɵɵFactoryTarget.Component
30
+ });
31
+ static ɵcmp = i0.ɵɵngDeclareComponent({
32
+ minVersion: "17.0.0",
33
+ version: "22.2.2",
34
+ type: FooterComponent,
35
+ isStandalone: true,
36
+ selector: "lc-footer",
37
+ inputs: {
38
+ sections: {
39
+ classPropertyName: "sections",
40
+ publicName: "sections",
41
+ isSignal: true,
42
+ isRequired: false,
43
+ transformFunction: null
44
+ },
45
+ copyright: {
46
+ classPropertyName: "copyright",
47
+ publicName: "copyright",
48
+ isSignal: true,
49
+ isRequired: false,
50
+ transformFunction: null
51
+ },
52
+ showBorder: {
53
+ classPropertyName: "showBorder",
54
+ publicName: "showBorder",
55
+ isSignal: true,
56
+ isRequired: false,
57
+ transformFunction: null
58
+ },
59
+ compact: {
60
+ classPropertyName: "compact",
61
+ publicName: "compact",
62
+ isSignal: true,
63
+ isRequired: false,
64
+ transformFunction: null
65
+ },
66
+ variant: {
67
+ classPropertyName: "variant",
68
+ publicName: "variant",
69
+ isSignal: true,
70
+ isRequired: false,
71
+ transformFunction: null
72
+ },
73
+ headingLevel: {
74
+ classPropertyName: "headingLevel",
75
+ publicName: "headingLevel",
76
+ isSignal: true,
77
+ isRequired: false,
78
+ transformFunction: null
79
+ },
80
+ navAriaLabel: {
81
+ classPropertyName: "navAriaLabel",
82
+ publicName: "navAriaLabel",
83
+ isSignal: true,
84
+ isRequired: false,
85
+ transformFunction: null
86
+ },
87
+ externalLinkHint: {
88
+ classPropertyName: "externalLinkHint",
89
+ publicName: "externalLinkHint",
90
+ isSignal: true,
91
+ isRequired: false,
92
+ transformFunction: null
93
+ }
94
+ },
95
+ ngImport: i0,
96
+ template: "<footer [class]=\"footerClasses()\" role=\"contentinfo\">\n @if (sections().length > 0 && !compact()) {\n <nav class=\"footer__sections\" [attr.aria-label]=\"navAriaLabel()\">\n @for (section of sections(); track section.title) {\n <div class=\"footer__section\">\n @switch (headingLevel()) {\n @case (2) {\n <h2 class=\"footer__section-title\">{{ section.title }}</h2>\n }\n @case (3) {\n <h3 class=\"footer__section-title\">{{ section.title }}</h3>\n }\n @case (5) {\n <h5 class=\"footer__section-title\">{{ section.title }}</h5>\n }\n @case (6) {\n <h6 class=\"footer__section-title\">{{ section.title }}</h6>\n }\n @default {\n <h4 class=\"footer__section-title\">{{ section.title }}</h4>\n }\n }\n <ul class=\"footer__links\">\n @for (link of section.links; track link.href) {\n <li>\n <a\n class=\"footer__link\"\n [class.footer__link--current]=\"link.current\"\n [href]=\"link.href\"\n [target]=\"link.external ? '_blank' : '_self'\"\n [attr.rel]=\"linkRel(link)\"\n [attr.aria-current]=\"link.current ? 'page' : null\"\n >\n {{ link.label }}\n @if (link.external) {\n <span class=\"footer__sr-only\">{{ externalLinkHint() }}</span>\n <lc-icon\n name=\"external-link\"\n size=\"xs\"\n class=\"footer__external-icon\"\n aria-hidden=\"true\"\n [decorative]=\"true\"\n />\n }\n </a>\n </li>\n }\n </ul>\n </div>\n }\n </nav>\n }\n <div class=\"footer__bottom\">\n <ng-content />\n @if (copyright()) {\n <span class=\"footer__copyright\">{{ copyright() }}</span>\n }\n </div>\n</footer>\n",
97
+ styles: [".footer{padding:var(--lc-density-padding-xl, 2rem) var(--lc-density-padding-lg, 1.5rem) var(--lc-density-padding-lg, 1.5rem);color:var(--color-text-secondary);font-size:var(--typography-font-size-sm, .875rem)}.footer--bordered{border-top:1px solid var(--color-border)}.footer__sections{display:grid;grid-template-columns:repeat(auto-fit,minmax(10rem,1fr));gap:var(--lc-density-gap-xl, 2rem);margin-bottom:var(--lc-density-padding-xl, 2rem)}.footer__section-title{font-size:var(--typography-font-size-sm, .875rem);font-weight:var(--typography-font-weight-semibold, 600);line-height:var(--line-height-normal, 1.5);color:var(--color-text-primary);margin:0 0 .25rem;text-transform:uppercase;letter-spacing:.05em}.footer__links{list-style:none;margin:0;padding:0;display:flex;flex-direction:column}.footer__link{display:inline-flex;align-items:center;gap:.25rem;min-height:var(--size-min-touch-height, 2.75rem);color:var(--color-text-secondary);text-decoration:none;text-underline-offset:.2em;transition:color .15s ease}.footer__link:hover{color:var(--color-text-primary);text-decoration:underline}.footer__link:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:2px;border-radius:var(--border-radius-sm)}.footer__link--current{color:var(--color-text-primary);font-weight:var(--typography-font-weight-semibold, 600);text-decoration:underline;text-decoration-thickness:2px}.footer__external-icon{opacity:.6}.footer__sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.footer__bottom{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:.5rem}.footer__copyright{color:var(--color-text-secondary);font-size:var(--typography-font-size-xs, .75rem)}.footer--compact{padding:1rem 1.5rem}.footer--compact .footer__bottom{justify-content:center}.footer--primary{background-color:#071a1f;color:#c1e3e9}.footer--primary .footer__section-title{color:#fff}.footer--primary .footer__link{color:#a3d5df}.footer--primary .footer__link:hover,.footer--primary .footer__link--current{color:#fff}.footer--primary .footer__copyright{color:#84c7d4}.footer--primary.footer--bordered{border-top-color:#144f5b}.footer--dark{background-color:#0c1722;color:#93a4ad}.footer--dark .footer__section-title{color:#f1f6f8}.footer--dark .footer__link{color:#93a4ad}.footer--dark .footer__link:hover,.footer--dark .footer__link--current{color:#f1f6f8}.footer--dark .footer__copyright{color:#93a4ad}.footer--dark.footer--bordered{border-top-color:#ffffff14}.footer--neutral{background-color:var(--color-surface-hover)}\n"],
98
+ dependencies: [{
99
+ kind: "component",
100
+ type: IconComponent,
101
+ selector: "lc-icon",
102
+ inputs: [
103
+ "name",
104
+ "variant",
105
+ "size",
106
+ "color",
107
+ "ariaLabel",
108
+ "decorative",
109
+ "strict"
110
+ ]
111
+ }],
112
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
113
+ });
114
+ };
115
+ i0.ɵɵngDeclareClassMetadata({
116
+ minVersion: "12.0.0",
117
+ version: "22.2.2",
118
+ ngImport: i0,
119
+ type: FooterComponent,
120
+ decorators: [{
121
+ type: Component,
122
+ args: [{
123
+ selector: "lc-footer",
124
+ standalone: true,
125
+ imports: [IconComponent],
126
+ changeDetection: ChangeDetectionStrategy.OnPush,
127
+ template: "<footer [class]=\"footerClasses()\" role=\"contentinfo\">\n @if (sections().length > 0 && !compact()) {\n <nav class=\"footer__sections\" [attr.aria-label]=\"navAriaLabel()\">\n @for (section of sections(); track section.title) {\n <div class=\"footer__section\">\n @switch (headingLevel()) {\n @case (2) {\n <h2 class=\"footer__section-title\">{{ section.title }}</h2>\n }\n @case (3) {\n <h3 class=\"footer__section-title\">{{ section.title }}</h3>\n }\n @case (5) {\n <h5 class=\"footer__section-title\">{{ section.title }}</h5>\n }\n @case (6) {\n <h6 class=\"footer__section-title\">{{ section.title }}</h6>\n }\n @default {\n <h4 class=\"footer__section-title\">{{ section.title }}</h4>\n }\n }\n <ul class=\"footer__links\">\n @for (link of section.links; track link.href) {\n <li>\n <a\n class=\"footer__link\"\n [class.footer__link--current]=\"link.current\"\n [href]=\"link.href\"\n [target]=\"link.external ? '_blank' : '_self'\"\n [attr.rel]=\"linkRel(link)\"\n [attr.aria-current]=\"link.current ? 'page' : null\"\n >\n {{ link.label }}\n @if (link.external) {\n <span class=\"footer__sr-only\">{{ externalLinkHint() }}</span>\n <lc-icon\n name=\"external-link\"\n size=\"xs\"\n class=\"footer__external-icon\"\n aria-hidden=\"true\"\n [decorative]=\"true\"\n />\n }\n </a>\n </li>\n }\n </ul>\n </div>\n }\n </nav>\n }\n <div class=\"footer__bottom\">\n <ng-content />\n @if (copyright()) {\n <span class=\"footer__copyright\">{{ copyright() }}</span>\n }\n </div>\n</footer>\n",
128
+ styles: [".footer{padding:var(--lc-density-padding-xl, 2rem) var(--lc-density-padding-lg, 1.5rem) var(--lc-density-padding-lg, 1.5rem);color:var(--color-text-secondary);font-size:var(--typography-font-size-sm, .875rem)}.footer--bordered{border-top:1px solid var(--color-border)}.footer__sections{display:grid;grid-template-columns:repeat(auto-fit,minmax(10rem,1fr));gap:var(--lc-density-gap-xl, 2rem);margin-bottom:var(--lc-density-padding-xl, 2rem)}.footer__section-title{font-size:var(--typography-font-size-sm, .875rem);font-weight:var(--typography-font-weight-semibold, 600);line-height:var(--line-height-normal, 1.5);color:var(--color-text-primary);margin:0 0 .25rem;text-transform:uppercase;letter-spacing:.05em}.footer__links{list-style:none;margin:0;padding:0;display:flex;flex-direction:column}.footer__link{display:inline-flex;align-items:center;gap:.25rem;min-height:var(--size-min-touch-height, 2.75rem);color:var(--color-text-secondary);text-decoration:none;text-underline-offset:.2em;transition:color .15s ease}.footer__link:hover{color:var(--color-text-primary);text-decoration:underline}.footer__link:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:2px;border-radius:var(--border-radius-sm)}.footer__link--current{color:var(--color-text-primary);font-weight:var(--typography-font-weight-semibold, 600);text-decoration:underline;text-decoration-thickness:2px}.footer__external-icon{opacity:.6}.footer__sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.footer__bottom{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:.5rem}.footer__copyright{color:var(--color-text-secondary);font-size:var(--typography-font-size-xs, .75rem)}.footer--compact{padding:1rem 1.5rem}.footer--compact .footer__bottom{justify-content:center}.footer--primary{background-color:#071a1f;color:#c1e3e9}.footer--primary .footer__section-title{color:#fff}.footer--primary .footer__link{color:#a3d5df}.footer--primary .footer__link:hover,.footer--primary .footer__link--current{color:#fff}.footer--primary .footer__copyright{color:#84c7d4}.footer--primary.footer--bordered{border-top-color:#144f5b}.footer--dark{background-color:#0c1722;color:#93a4ad}.footer--dark .footer__section-title{color:#f1f6f8}.footer--dark .footer__link{color:#93a4ad}.footer--dark .footer__link:hover,.footer--dark .footer__link--current{color:#f1f6f8}.footer--dark .footer__copyright{color:#93a4ad}.footer--dark.footer--bordered{border-top-color:#ffffff14}.footer--neutral{background-color:var(--color-surface-hover)}\n"]
129
+ }]
130
+ }],
131
+ propDecorators: {
132
+ sections: [{
133
+ type: i0.Input,
134
+ args: [{
135
+ isSignal: true,
136
+ alias: "sections",
137
+ required: false
138
+ }]
139
+ }],
140
+ copyright: [{
141
+ type: i0.Input,
142
+ args: [{
143
+ isSignal: true,
144
+ alias: "copyright",
145
+ required: false
146
+ }]
147
+ }],
148
+ showBorder: [{
149
+ type: i0.Input,
150
+ args: [{
151
+ isSignal: true,
152
+ alias: "showBorder",
153
+ required: false
154
+ }]
155
+ }],
156
+ compact: [{
157
+ type: i0.Input,
158
+ args: [{
159
+ isSignal: true,
160
+ alias: "compact",
161
+ required: false
162
+ }]
163
+ }],
164
+ variant: [{
165
+ type: i0.Input,
166
+ args: [{
167
+ isSignal: true,
168
+ alias: "variant",
169
+ required: false
170
+ }]
171
+ }],
172
+ headingLevel: [{
173
+ type: i0.Input,
174
+ args: [{
175
+ isSignal: true,
176
+ alias: "headingLevel",
177
+ required: false
178
+ }]
179
+ }],
180
+ navAriaLabel: [{
181
+ type: i0.Input,
182
+ args: [{
183
+ isSignal: true,
184
+ alias: "navAriaLabel",
185
+ required: false
186
+ }]
187
+ }],
188
+ externalLinkHint: [{
189
+ type: i0.Input,
190
+ args: [{
191
+ isSignal: true,
192
+ alias: "externalLinkHint",
193
+ required: false
194
+ }]
195
+ }]
196
+ }
197
+ });
198
+ export { FooterComponent };
199
+
200
+ //# sourceMappingURL=lifecorner-angular-ui-kit-footer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecorner-angular-ui-kit-footer.mjs","names":[],"sources":["../../../../libs/angular-ui-kit/src/lib/footer/footer.component.ts","../../../../libs/angular-ui-kit/src/lib/footer/footer.component.html"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n input,\n computed,\n} from '@angular/core';\nimport { IconComponent } from '@lifecorner/angular-ui-kit/icon';\n\nexport interface FooterLink {\n /** Display label */\n label: string;\n /** URL or route */\n href: string;\n /**\n * Opens in a new tab (`target=\"_blank\"`). Screen readers hear the\n * `externalLinkHint` after the label; `rel` defaults to\n * `noopener noreferrer`.\n */\n external?: boolean;\n /** Marks the page the visitor is on (`aria-current=\"page\"`). */\n current?: boolean;\n /**\n * `rel` attribute, e.g. `me` for your own social profiles. Replaces the\n * `noopener noreferrer` default of external links.\n */\n rel?: string;\n}\n\nexport interface FooterSection {\n /** Section heading */\n title: string;\n /** Links in this section */\n links: FooterLink[];\n}\n\nexport type FooterVariant = 'default' | 'primary' | 'dark' | 'neutral';\n\n/** Heading level of the section titles (`headingLevel`). */\nexport type FooterHeadingLevel = 2 | 3 | 4 | 5 | 6;\n\n@Component({\n selector: 'lc-footer',\n standalone: true,\n imports: [IconComponent],\n templateUrl: './footer.component.html',\n styleUrls: ['./footer.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n/**\n * Footer component for application-wide bottom navigation.\n *\n * Features:\n * - Multi-section navigation with link groups, inside a labelled `<nav>`\n * (`navAriaLabel`)\n * - Section titles at a configurable heading level (`headingLevel`, default 4)\n * - Links: `current` page (`aria-current`), `rel`, `external` (new tab, with a\n * text hint for screen readers — `externalLinkHint`); 44 px touch targets\n * - Copyright text display\n * - Compact single-row layout option\n * - Color variants (default, primary, dark, neutral)\n * - Optional top border\n *\n * @example\n * ```html\n * <lc-footer [sections]=\"navSections\" copyright=\"© 2026 Company\" />\n * ```\n */\nexport class FooterComponent {\n /** Footer navigation sections */\n sections = input<FooterSection[]>([]);\n\n /** Copyright text */\n copyright = input<string>();\n\n /** Whether to show a top border */\n showBorder = input<boolean>(true);\n\n /** Compact layout (single row) */\n compact = input<boolean>(false);\n\n /** Color variant */\n variant = input<FooterVariant>('default');\n\n /**\n * Heading level of the section titles. Pick the level that continues the\n * page's outline (a page with `h1` + `h2` sections usually wants `2`).\n */\n headingLevel = input<FooterHeadingLevel>(4);\n\n /** Accessible name of the `<nav>` around the sections. */\n navAriaLabel = input<string>('Footer');\n\n /** Visually hidden text read after the label of an `external` link. */\n externalLinkHint = input<string>('(opens in a new tab)');\n\n protected footerClasses = computed(() => {\n const classes = ['footer', `footer--${this.variant()}`];\n if (this.showBorder()) classes.push('footer--bordered');\n if (this.compact()) classes.push('footer--compact');\n return classes.join(' ');\n });\n\n /** `rel` of a link: its own value, else `noopener noreferrer` for external links. */\n protected linkRel(link: FooterLink): string | null {\n return link.rel ?? (link.external ? 'noopener noreferrer' : null);\n }\n\n protected currentYear = new Date().getFullYear();\n}\n","<footer [class]=\"footerClasses()\" role=\"contentinfo\">\n @if (sections().length > 0 && !compact()) {\n <nav class=\"footer__sections\" [attr.aria-label]=\"navAriaLabel()\">\n @for (section of sections(); track section.title) {\n <div class=\"footer__section\">\n @switch (headingLevel()) {\n @case (2) {\n <h2 class=\"footer__section-title\">{{ section.title }}</h2>\n }\n @case (3) {\n <h3 class=\"footer__section-title\">{{ section.title }}</h3>\n }\n @case (5) {\n <h5 class=\"footer__section-title\">{{ section.title }}</h5>\n }\n @case (6) {\n <h6 class=\"footer__section-title\">{{ section.title }}</h6>\n }\n @default {\n <h4 class=\"footer__section-title\">{{ section.title }}</h4>\n }\n }\n <ul class=\"footer__links\">\n @for (link of section.links; track link.href) {\n <li>\n <a\n class=\"footer__link\"\n [class.footer__link--current]=\"link.current\"\n [href]=\"link.href\"\n [target]=\"link.external ? '_blank' : '_self'\"\n [attr.rel]=\"linkRel(link)\"\n [attr.aria-current]=\"link.current ? 'page' : null\"\n >\n {{ link.label }}\n @if (link.external) {\n <span class=\"footer__sr-only\">{{ externalLinkHint() }}</span>\n <lc-icon\n name=\"external-link\"\n size=\"xs\"\n class=\"footer__external-icon\"\n aria-hidden=\"true\"\n [decorative]=\"true\"\n />\n }\n </a>\n </li>\n }\n </ul>\n </div>\n }\n </nav>\n }\n <div class=\"footer__bottom\">\n <ng-content />\n @if (copyright()) {\n <span class=\"footer__copyright\">{{ copyright() }}</span>\n }\n </div>\n</footer>\n"],"mappings":"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"}
@@ -0,0 +1,292 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, DestroyRef, ElementRef, afterNextRender, computed, inject, input, signal } from "@angular/core";
3
+ import { formatChartValue, readableInk, toFinite } from "@lifecorner/angular-ui-kit/internal/chart";
4
+ const DEFAULT_COLORS = [
5
+ "var(--color-primary-500)",
6
+ "var(--color-primary-600)",
7
+ "var(--color-primary-700)",
8
+ "var(--color-secondary-500)",
9
+ "var(--color-secondary-600)",
10
+ "var(--color-secondary-700)",
11
+ "var(--color-success-default)",
12
+ "var(--color-warning-default)"
13
+ ];
14
+ const DEFAULT_WIDTH = 400;
15
+ var FunnelChartComponent = class FunnelChartComponent {
16
+ _el = inject(ElementRef);
17
+ _destroyRef = inject(DestroyRef);
18
+ _containerWidth = signal(0, ...ngDevMode ? [{ debugName: "_containerWidth" }] : /* istanbul ignore next */ []);
19
+ constructor() {
20
+ afterNextRender(() => {
21
+ const obs = new ResizeObserver(([entry]) => {
22
+ this._containerWidth.set(entry.contentRect.width);
23
+ });
24
+ obs.observe(this._el.nativeElement);
25
+ this._destroyRef.onDestroy(() => obs.disconnect());
26
+ });
27
+ }
28
+ steps = input.required(...ngDevMode ? [{ debugName: "steps" }] : /* istanbul ignore next */ []);
29
+ width = input(void 0, ...ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []);
30
+ height = input(300, ...ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []);
31
+ showLabels = input(true, ...ngDevMode ? [{ debugName: "showLabels" }] : /* istanbul ignore next */ []);
32
+ showValues = input(true, ...ngDevMode ? [{ debugName: "showValues" }] : /* istanbul ignore next */ []);
33
+ showPercentage = input(true, ...ngDevMode ? [{ debugName: "showPercentage" }] : /* istanbul ignore next */ []);
34
+ orientation = input("vertical", ...ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []);
35
+ formatValue = input(formatChartValue, ...ngDevMode ? [{ debugName: "formatValue" }] : /* istanbul ignore next */ []);
36
+ ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
37
+ effectiveWidth = computed(() => this._containerWidth() || this.width() || DEFAULT_WIDTH, ...ngDevMode ? [{ debugName: "effectiveWidth" }] : /* istanbul ignore next */ []);
38
+ viewBox = computed(() => `0 0 ${this.effectiveWidth()} ${this.height()}`, ...ngDevMode ? [{ debugName: "viewBox" }] : /* istanbul ignore next */ []);
39
+ renderedSteps = computed(() => {
40
+ const steps = this.steps();
41
+ if (!steps?.length) return [];
42
+ const values = steps.map((s) => Math.max(0, toFinite(s.value)));
43
+ const maxVal = Math.max(...values);
44
+ const w = this.effectiveWidth();
45
+ const h = this.height();
46
+ const isV = this.orientation() === "vertical";
47
+ const count = steps.length;
48
+ const fmt = this.formatValue();
49
+ return steps.map((step, i) => {
50
+ const ratio = maxVal > 0 ? values[i] / maxVal : 0;
51
+ const nextRatio = i < count - 1 && maxVal > 0 ? values[i + 1] / maxVal : ratio * .6;
52
+ const pct = i === 0 ? 100 : maxVal > 0 ? Math.round(values[i] / maxVal * 100) : 0;
53
+ const color = step.color || DEFAULT_COLORS[i % DEFAULT_COLORS.length];
54
+ const ink = readableInk(color);
55
+ let path;
56
+ let labelX;
57
+ let labelY;
58
+ if (isV) {
59
+ const stepH = h / count;
60
+ const maxWidth = w - 40;
61
+ const topW = ratio * maxWidth;
62
+ const bottomW = nextRatio * maxWidth;
63
+ const y = i * stepH;
64
+ const cx = w / 2;
65
+ path = [
66
+ `M ${cx - topW / 2} ${y}`,
67
+ `L ${cx + topW / 2} ${y}`,
68
+ `L ${cx + bottomW / 2} ${y + stepH}`,
69
+ `L ${cx - bottomW / 2} ${y + stepH}`,
70
+ "Z"
71
+ ].join(" ");
72
+ labelX = cx;
73
+ labelY = y + stepH / 2;
74
+ } else {
75
+ const stepW = w / count;
76
+ const maxHeight = h - 40;
77
+ const leftH = ratio * maxHeight;
78
+ const rightH = nextRatio * maxHeight;
79
+ const x = i * stepW;
80
+ const cy = h / 2;
81
+ path = [
82
+ `M ${x} ${cy - leftH / 2}`,
83
+ `L ${x + stepW} ${cy - rightH / 2}`,
84
+ `L ${x + stepW} ${cy + rightH / 2}`,
85
+ `L ${x} ${cy + leftH / 2}`,
86
+ "Z"
87
+ ].join(" ");
88
+ labelX = x + stepW / 2;
89
+ labelY = cy;
90
+ }
91
+ return {
92
+ path,
93
+ color,
94
+ ink: ink ?? "var(--color-text-primary)",
95
+ halo: ink === null,
96
+ label: step.label,
97
+ value: values[i],
98
+ valueText: fmt(values[i]),
99
+ pct,
100
+ labelX,
101
+ labelY
102
+ };
103
+ });
104
+ }, ...ngDevMode ? [{ debugName: "renderedSteps" }] : /* istanbul ignore next */ []);
105
+ effectiveAriaLabel = computed(() => {
106
+ const explicit = this.ariaLabel();
107
+ if (explicit) return explicit;
108
+ const steps = this.renderedSteps();
109
+ if (!steps.length) return "Funnel chart: no data";
110
+ return `Funnel chart: ${steps.map((s, i) => `${s.label || `Step ${i + 1}`} ${s.valueText} (${s.pct}%)`).join(", ")}`;
111
+ }, ...ngDevMode ? [{ debugName: "effectiveAriaLabel" }] : /* istanbul ignore next */ []);
112
+ static ɵfac = i0.ɵɵngDeclareFactory({
113
+ minVersion: "12.0.0",
114
+ version: "22.2.2",
115
+ ngImport: i0,
116
+ type: FunnelChartComponent,
117
+ deps: [],
118
+ target: i0.ɵɵFactoryTarget.Component
119
+ });
120
+ static ɵcmp = i0.ɵɵngDeclareComponent({
121
+ minVersion: "17.0.0",
122
+ version: "22.2.2",
123
+ type: FunnelChartComponent,
124
+ isStandalone: true,
125
+ selector: "lc-funnel-chart",
126
+ inputs: {
127
+ steps: {
128
+ classPropertyName: "steps",
129
+ publicName: "steps",
130
+ isSignal: true,
131
+ isRequired: true,
132
+ transformFunction: null
133
+ },
134
+ width: {
135
+ classPropertyName: "width",
136
+ publicName: "width",
137
+ isSignal: true,
138
+ isRequired: false,
139
+ transformFunction: null
140
+ },
141
+ height: {
142
+ classPropertyName: "height",
143
+ publicName: "height",
144
+ isSignal: true,
145
+ isRequired: false,
146
+ transformFunction: null
147
+ },
148
+ showLabels: {
149
+ classPropertyName: "showLabels",
150
+ publicName: "showLabels",
151
+ isSignal: true,
152
+ isRequired: false,
153
+ transformFunction: null
154
+ },
155
+ showValues: {
156
+ classPropertyName: "showValues",
157
+ publicName: "showValues",
158
+ isSignal: true,
159
+ isRequired: false,
160
+ transformFunction: null
161
+ },
162
+ showPercentage: {
163
+ classPropertyName: "showPercentage",
164
+ publicName: "showPercentage",
165
+ isSignal: true,
166
+ isRequired: false,
167
+ transformFunction: null
168
+ },
169
+ orientation: {
170
+ classPropertyName: "orientation",
171
+ publicName: "orientation",
172
+ isSignal: true,
173
+ isRequired: false,
174
+ transformFunction: null
175
+ },
176
+ formatValue: {
177
+ classPropertyName: "formatValue",
178
+ publicName: "formatValue",
179
+ isSignal: true,
180
+ isRequired: false,
181
+ transformFunction: null
182
+ },
183
+ ariaLabel: {
184
+ classPropertyName: "ariaLabel",
185
+ publicName: "ariaLabel",
186
+ isSignal: true,
187
+ isRequired: false,
188
+ transformFunction: null
189
+ }
190
+ },
191
+ host: { properties: { "style.max-width.px": "width()" } },
192
+ ngImport: i0,
193
+ template: "<div class=\"lc-funnel-chart\">\n <svg\n width=\"100%\"\n [attr.height]=\"height()\"\n [attr.viewBox]=\"viewBox()\"\n role=\"img\"\n [attr.aria-label]=\"effectiveAriaLabel()\"\n class=\"lc-funnel-chart__svg\"\n >\n <title>{{ effectiveAriaLabel() }}</title>\n\n @for (step of renderedSteps(); track $index) {\n <path\n [attr.d]=\"step.path\"\n [attr.fill]=\"step.color\"\n class=\"lc-funnel-chart__step\"\n />\n\n @if (showLabels()) {\n <text\n [attr.x]=\"step.labelX\"\n [attr.y]=\"step.labelY - 2\"\n [attr.fill]=\"step.ink\"\n text-anchor=\"middle\"\n dominant-baseline=\"auto\"\n class=\"lc-funnel-chart__label\"\n [class.lc-funnel-chart__text--halo]=\"step.halo\"\n >{{ step.label }}</text>\n }\n\n @if (showValues() || showPercentage()) {\n <text\n [attr.x]=\"step.labelX\"\n [attr.y]=\"step.labelY + 12\"\n [attr.fill]=\"step.ink\"\n text-anchor=\"middle\"\n dominant-baseline=\"auto\"\n class=\"lc-funnel-chart__value\"\n [class.lc-funnel-chart__text--halo]=\"step.halo\"\n >\n @if (showValues()) { {{ step.valueText }} }\n @if (showValues() && showPercentage()) { · }\n @if (showPercentage()) { {{ step.pct }}% }\n </text>\n }\n }\n </svg>\n</div>\n",
194
+ styles: [":host{display:block}.lc-funnel-chart{display:flex;flex-direction:column;align-items:center;width:100%}.lc-funnel-chart__svg{overflow:visible}.lc-funnel-chart__step{opacity:.85;transition:opacity .15s}.lc-funnel-chart__step:hover{opacity:1}.lc-funnel-chart__label{font-size:.75rem;font-weight:600;pointer-events:none}.lc-funnel-chart__value{font-size:.625rem;pointer-events:none}.lc-funnel-chart__text--halo{paint-order:stroke;stroke:var(--color-surface);stroke-width:3px;stroke-linejoin:round}\n"],
195
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
196
+ });
197
+ };
198
+ i0.ɵɵngDeclareClassMetadata({
199
+ minVersion: "12.0.0",
200
+ version: "22.2.2",
201
+ ngImport: i0,
202
+ type: FunnelChartComponent,
203
+ decorators: [{
204
+ type: Component,
205
+ args: [{
206
+ selector: "lc-funnel-chart",
207
+ standalone: true,
208
+ changeDetection: ChangeDetectionStrategy.OnPush,
209
+ host: { "[style.max-width.px]": "width()" },
210
+ template: "<div class=\"lc-funnel-chart\">\n <svg\n width=\"100%\"\n [attr.height]=\"height()\"\n [attr.viewBox]=\"viewBox()\"\n role=\"img\"\n [attr.aria-label]=\"effectiveAriaLabel()\"\n class=\"lc-funnel-chart__svg\"\n >\n <title>{{ effectiveAriaLabel() }}</title>\n\n @for (step of renderedSteps(); track $index) {\n <path\n [attr.d]=\"step.path\"\n [attr.fill]=\"step.color\"\n class=\"lc-funnel-chart__step\"\n />\n\n @if (showLabels()) {\n <text\n [attr.x]=\"step.labelX\"\n [attr.y]=\"step.labelY - 2\"\n [attr.fill]=\"step.ink\"\n text-anchor=\"middle\"\n dominant-baseline=\"auto\"\n class=\"lc-funnel-chart__label\"\n [class.lc-funnel-chart__text--halo]=\"step.halo\"\n >{{ step.label }}</text>\n }\n\n @if (showValues() || showPercentage()) {\n <text\n [attr.x]=\"step.labelX\"\n [attr.y]=\"step.labelY + 12\"\n [attr.fill]=\"step.ink\"\n text-anchor=\"middle\"\n dominant-baseline=\"auto\"\n class=\"lc-funnel-chart__value\"\n [class.lc-funnel-chart__text--halo]=\"step.halo\"\n >\n @if (showValues()) { {{ step.valueText }} }\n @if (showValues() && showPercentage()) { · }\n @if (showPercentage()) { {{ step.pct }}% }\n </text>\n }\n }\n </svg>\n</div>\n",
211
+ styles: [":host{display:block}.lc-funnel-chart{display:flex;flex-direction:column;align-items:center;width:100%}.lc-funnel-chart__svg{overflow:visible}.lc-funnel-chart__step{opacity:.85;transition:opacity .15s}.lc-funnel-chart__step:hover{opacity:1}.lc-funnel-chart__label{font-size:.75rem;font-weight:600;pointer-events:none}.lc-funnel-chart__value{font-size:.625rem;pointer-events:none}.lc-funnel-chart__text--halo{paint-order:stroke;stroke:var(--color-surface);stroke-width:3px;stroke-linejoin:round}\n"]
212
+ }]
213
+ }],
214
+ ctorParameters: () => [],
215
+ propDecorators: {
216
+ steps: [{
217
+ type: i0.Input,
218
+ args: [{
219
+ isSignal: true,
220
+ alias: "steps",
221
+ required: true
222
+ }]
223
+ }],
224
+ width: [{
225
+ type: i0.Input,
226
+ args: [{
227
+ isSignal: true,
228
+ alias: "width",
229
+ required: false
230
+ }]
231
+ }],
232
+ height: [{
233
+ type: i0.Input,
234
+ args: [{
235
+ isSignal: true,
236
+ alias: "height",
237
+ required: false
238
+ }]
239
+ }],
240
+ showLabels: [{
241
+ type: i0.Input,
242
+ args: [{
243
+ isSignal: true,
244
+ alias: "showLabels",
245
+ required: false
246
+ }]
247
+ }],
248
+ showValues: [{
249
+ type: i0.Input,
250
+ args: [{
251
+ isSignal: true,
252
+ alias: "showValues",
253
+ required: false
254
+ }]
255
+ }],
256
+ showPercentage: [{
257
+ type: i0.Input,
258
+ args: [{
259
+ isSignal: true,
260
+ alias: "showPercentage",
261
+ required: false
262
+ }]
263
+ }],
264
+ orientation: [{
265
+ type: i0.Input,
266
+ args: [{
267
+ isSignal: true,
268
+ alias: "orientation",
269
+ required: false
270
+ }]
271
+ }],
272
+ formatValue: [{
273
+ type: i0.Input,
274
+ args: [{
275
+ isSignal: true,
276
+ alias: "formatValue",
277
+ required: false
278
+ }]
279
+ }],
280
+ ariaLabel: [{
281
+ type: i0.Input,
282
+ args: [{
283
+ isSignal: true,
284
+ alias: "ariaLabel",
285
+ required: false
286
+ }]
287
+ }]
288
+ }
289
+ });
290
+ export { FunnelChartComponent };
291
+
292
+ //# sourceMappingURL=lifecorner-angular-ui-kit-funnel-chart.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecorner-angular-ui-kit-funnel-chart.mjs","names":[],"sources":["../../../../libs/angular-ui-kit/src/lib/funnel-chart/funnel-chart.component.ts","../../../../libs/angular-ui-kit/src/lib/funnel-chart/funnel-chart.component.html"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n afterNextRender,\n inject,\n input,\n computed,\n signal,\n} from '@angular/core';\nimport { readableInk } from '@lifecorner/angular-ui-kit/internal/chart';\nimport {\n ChartValueFormatter,\n formatChartValue,\n toFinite,\n} from '@lifecorner/angular-ui-kit/internal/chart';\n\nexport interface FunnelStep {\n label: string;\n value: number;\n color?: string;\n}\n\n/**\n * Sequential default fills: 500 → 700 of each brand scale. Only 500+ shades are\n * used because the 300/400 shades resolve to dark, low-contrast teals on the\n * dark theme (the scales invert there).\n */\nconst DEFAULT_COLORS = [\n 'var(--color-primary-500)',\n 'var(--color-primary-600)',\n 'var(--color-primary-700)',\n 'var(--color-secondary-500)',\n 'var(--color-secondary-600)',\n 'var(--color-secondary-700)',\n 'var(--color-success-default)',\n 'var(--color-warning-default)',\n];\n\n/** viewBox width used until the container has been measured. */\nconst DEFAULT_WIDTH = 400;\n\n@Component({\n selector: 'lc-funnel-chart',\n standalone: true,\n templateUrl: './funnel-chart.component.html',\n styleUrls: ['./funnel-chart.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[style.max-width.px]': 'width()',\n },\n})\n/**\n * Funnel chart for visualizing conversion pipelines and progressive filtering.\n *\n * Features:\n * - Vertical and horizontal orientations\n * - Automatic percentage calculation relative to the first step\n * - Toggleable value and percentage labels, readable on any step fill\n * - Per-step custom colors\n * - Responsive SVG rendering\n *\n * @example\n * ```html\n * <lc-funnel-chart [steps]=\"steps\" [showPercentage]=\"true\" />\n * ```\n */\nexport class FunnelChartComponent {\n private readonly _el = inject(ElementRef);\n private readonly _destroyRef = inject(DestroyRef);\n private readonly _containerWidth = signal<number>(0);\n\n constructor() {\n afterNextRender(() => {\n const obs = new ResizeObserver(([entry]) => {\n this._containerWidth.set(entry.contentRect.width);\n });\n obs.observe(this._el.nativeElement);\n this._destroyRef.onDestroy(() => obs.disconnect());\n });\n }\n\n readonly steps = input.required<FunnelStep[]>();\n /**\n * Intrinsic chart width in pixels. The chart fills its container (the SVG is\n * `width=\"100%\"` and its viewBox follows the measured container width);\n * `width` is the viewBox width until the container has been measured and,\n * when set, the host's `max-width`, so the chart never grows past it. Leave\n * unset for a fully fluid chart.\n */\n readonly width = input<number | undefined>(undefined);\n readonly height = input(300);\n readonly showLabels = input(true);\n readonly showValues = input(true);\n readonly showPercentage = input(true);\n readonly orientation = input<'vertical' | 'horizontal'>('vertical');\n /** Formats step values. Defaults to a float-safe `String(value)`. */\n readonly formatValue = input<ChartValueFormatter>(formatChartValue);\n /**\n * Accessible name of the chart. Defaults to a generated summary listing\n * every step's label, value and share of the first step.\n */\n readonly ariaLabel = input<string>('');\n\n protected readonly effectiveWidth = computed(\n () => this._containerWidth() || this.width() || DEFAULT_WIDTH\n );\n\n protected readonly viewBox = computed(() => `0 0 ${this.effectiveWidth()} ${this.height()}`);\n\n protected readonly renderedSteps = computed(() => {\n const steps = this.steps();\n if (!steps?.length) return [];\n\n const values = steps.map((s) => Math.max(0, toFinite(s.value)));\n const maxVal = Math.max(...values);\n const w = this.effectiveWidth();\n const h = this.height();\n const isV = this.orientation() === 'vertical';\n const count = steps.length;\n const fmt = this.formatValue();\n const padding = 20;\n\n return steps.map((step, i) => {\n const ratio = maxVal > 0 ? values[i] / maxVal : 0;\n // The last step tapers to 60% of its own width; every other step tapers to the next step.\n const nextRatio = i < count - 1 && maxVal > 0 ? values[i + 1] / maxVal : ratio * 0.6;\n const pct = i === 0 ? 100 : maxVal > 0 ? Math.round((values[i] / maxVal) * 100) : 0;\n const color = step.color || DEFAULT_COLORS[i % DEFAULT_COLORS.length];\n // A literal fill gets ink picked from its luminance; a token fill can't be\n // resolved here, so the label falls back to primary text with a surface halo.\n const ink = readableInk(color);\n\n let path: string;\n let labelX: number;\n let labelY: number;\n if (isV) {\n const stepH = h / count;\n const maxWidth = w - padding * 2;\n const topW = ratio * maxWidth;\n const bottomW = nextRatio * maxWidth;\n const y = i * stepH;\n const cx = w / 2;\n path = [\n `M ${cx - topW / 2} ${y}`,\n `L ${cx + topW / 2} ${y}`,\n `L ${cx + bottomW / 2} ${y + stepH}`,\n `L ${cx - bottomW / 2} ${y + stepH}`,\n 'Z',\n ].join(' ');\n labelX = cx;\n labelY = y + stepH / 2;\n } else {\n const stepW = w / count;\n const maxHeight = h - padding * 2;\n const leftH = ratio * maxHeight;\n const rightH = nextRatio * maxHeight;\n const x = i * stepW;\n const cy = h / 2;\n path = [\n `M ${x} ${cy - leftH / 2}`,\n `L ${x + stepW} ${cy - rightH / 2}`,\n `L ${x + stepW} ${cy + rightH / 2}`,\n `L ${x} ${cy + leftH / 2}`,\n 'Z',\n ].join(' ');\n labelX = x + stepW / 2;\n labelY = cy;\n }\n\n return {\n path,\n color,\n ink: ink ?? 'var(--color-text-primary)',\n halo: ink === null,\n label: step.label,\n value: values[i],\n valueText: fmt(values[i]),\n pct,\n labelX,\n labelY,\n };\n });\n });\n\n protected readonly effectiveAriaLabel = computed(() => {\n const explicit = this.ariaLabel();\n if (explicit) return explicit;\n const steps = this.renderedSteps();\n if (!steps.length) return 'Funnel chart: no data';\n return `Funnel chart: ${steps\n .map((s, i) => `${s.label || `Step ${i + 1}`} ${s.valueText} (${s.pct}%)`)\n .join(', ')}`;\n });\n}\n","<div class=\"lc-funnel-chart\">\n <svg\n width=\"100%\"\n [attr.height]=\"height()\"\n [attr.viewBox]=\"viewBox()\"\n role=\"img\"\n [attr.aria-label]=\"effectiveAriaLabel()\"\n class=\"lc-funnel-chart__svg\"\n >\n <title>{{ effectiveAriaLabel() }}</title>\n\n @for (step of renderedSteps(); track $index) {\n <path\n [attr.d]=\"step.path\"\n [attr.fill]=\"step.color\"\n class=\"lc-funnel-chart__step\"\n />\n\n @if (showLabels()) {\n <text\n [attr.x]=\"step.labelX\"\n [attr.y]=\"step.labelY - 2\"\n [attr.fill]=\"step.ink\"\n text-anchor=\"middle\"\n dominant-baseline=\"auto\"\n class=\"lc-funnel-chart__label\"\n [class.lc-funnel-chart__text--halo]=\"step.halo\"\n >{{ step.label }}</text>\n }\n\n @if (showValues() || showPercentage()) {\n <text\n [attr.x]=\"step.labelX\"\n [attr.y]=\"step.labelY + 12\"\n [attr.fill]=\"step.ink\"\n text-anchor=\"middle\"\n dominant-baseline=\"auto\"\n class=\"lc-funnel-chart__value\"\n [class.lc-funnel-chart__text--halo]=\"step.halo\"\n >\n @if (showValues()) { {{ step.valueText }} }\n @if (showValues() && showPercentage()) { · }\n @if (showPercentage()) { {{ step.pct }}% }\n </text>\n }\n }\n </svg>\n</div>\n"],"mappings":"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"}