@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 @@
1
+ {"version":3,"file":"lifecorner-angular-ui-kit-password-input.mjs","names":[],"sources":["../../../../libs/angular-ui-kit/src/lib/password-input/password-input.component.ts","../../../../libs/angular-ui-kit/src/lib/password-input/password-input.component.html"],"sourcesContent":["import {\n Component,\n ChangeDetectionStrategy,\n computed,\n forwardRef,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { IconComponent } from '@lifecorner/angular-ui-kit/icon';\nimport { AlertComponent } from '@lifecorner/angular-ui-kit/alert';\nimport type { InputAutocapitalize, InputEnterKeyHint } from '@lifecorner/angular-ui-kit/input';\n\nlet nextUniqueId = 0;\n\n/**\n * Password strength information\n */\nexport interface PasswordStrength {\n score: number; // 0-5 (number of requirements met)\n level: 'Weak' | 'Fair' | 'Good' | 'Strong';\n percentage: number; // 0-100\n}\n\n/**\n * Individual password requirement\n */\nexport interface PasswordRequirement {\n label: string;\n met: boolean;\n icon: string;\n}\n\nconst SYMBOL_PATTERN = /[!@#$%^&*()_+\\-=[\\]{}|;:,.<>?]/;\n\n/** The length rule when no `minLength` is set (the 3.2 rule). */\nconst DEFAULT_MIN_LENGTH = 8;\n\n/**\n * How the strength meter scores a password:\n * - `composition` (default, 3.2): share of five rules met — length and four character classes.\n * - `length`: the length only, as NIST SP 800-63B asks (no composition rules):\n * below `minLength` Weak, from it Fair, from 1.5 × Good, from 2 × Strong.\n */\nexport type PasswordStrengthMode = 'composition' | 'length';\n\n/**\n * Password Input Component with Show/Hide Toggle and Strength Meter\n *\n * Features:\n * - Show/Hide password toggle (eye icon)\n * - Real-time password strength indicator (Weak/Fair/Good/Strong)\n * - Visual strength meter bar with color coding\n * - Validation feedback (length, uppercase, lowercase, digit, symbol)\n * - Accessible ARIA attributes\n * - Reactive Forms ControlValueAccessor implementation\n *\n * Strength levels (share of the 5 requirements met):\n * - Weak: < 40%\n * - Fair: 40–59%\n * - Good: 60–79%\n * - Strong: >= 80%\n *\n * Requirements:\n * - Minimum 8 characters\n * - At least one uppercase letter (A-Z)\n * - At least one lowercase letter (a-z)\n * - At least one digit (0-9)\n * - At least one symbol (!@#$%^&*()_+-=[]{}|;:,.<>?)\n *\n * NIST-style use (3.3): `strengthMode=\"length\"`, `minLength`, `helperText` for\n * the rule, or no meter and no checklist at all.\n *\n * Usage:\n * ```html\n * <lc-password-input\n * [formControl]=\"passwordControl\"\n * label=\"Password\"\n * placeholder=\"Enter your password\"\n * [showStrengthMeter]=\"true\"\n * ></lc-password-input>\n * ```\n */\n@Component({\n selector: 'lc-password-input',\n standalone: true,\n imports: [IconComponent, AlertComponent],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => PasswordInputComponent),\n multi: true,\n },\n ],\n templateUrl: './password-input.component.html',\n styleUrls: ['./password-input.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PasswordInputComponent implements ControlValueAccessor {\n /** Label text (displayed above the input) */\n readonly label = input<string>('Password');\n\n /** Placeholder text */\n readonly placeholder = input<string>('Enter password');\n\n /** Whether to show the strength meter bar + level text */\n readonly showStrengthMeter = input<boolean>(false);\n\n /** Whether to show the requirements checklist */\n readonly showRequirements = input<boolean>(false);\n\n /** Whether the input is disabled */\n readonly disabled = input<boolean>(false);\n\n /** Whether the input is required */\n readonly required = input<boolean>(false);\n\n /**\n * Show the `*` of a `required` field; `false` keeps `required` and\n * `aria-required` without the asterisk.\n * @default true\n */\n readonly requiredIndicator = input<boolean>(true);\n\n /** Error message to display (also sets aria-invalid) */\n readonly error = input<string | undefined>(undefined);\n\n /** Help below the field, e.g. the password rule; linked by `aria-describedby`. The error replaces it. */\n readonly helperText = input<string>();\n\n /**\n * Minimum length: the native `minlength` and the length rule of the\n * requirement list and the meter. Unset = no attribute, rule of 8 (3.2).\n */\n readonly minLength = input<number>();\n\n /** How the strength meter scores: `composition` (3.2) or `length` (NIST, no character-class rules). */\n readonly strengthMode = input<PasswordStrengthMode>('composition');\n\n /**\n * Native `autocomplete`: `current-password` (sign-in), `new-password`\n * (registration, change), so password managers fill and save the right\n * password. Unset = no attribute.\n */\n readonly autocomplete = input<string>();\n\n /** Native `name` of the inner input. Unset = no attribute. */\n readonly name = input<string>();\n\n /**\n * Native `autocapitalize`. Default `off`: a shown password must not be\n * capitalised by the on-screen keyboard.\n * @default 'off'\n */\n readonly autocapitalize = input<InputAutocapitalize>('off');\n\n /**\n * Native `spellcheck`. Default `false`: a shown password must never go to a\n * spell checker (some send text to a server).\n * @default false\n */\n readonly spellcheck = input<boolean>(false);\n\n /** Native `enterkeyhint`: the label of the on-screen keyboard's Enter key. Unset = no attribute. */\n readonly enterkeyhint = input<InputEnterKeyHint>();\n\n /** Accessible name of the visibility toggle while the password is hidden. */\n readonly showPasswordAriaLabel = input('Show password');\n\n /** Accessible name of the visibility toggle while the password is shown. */\n readonly hidePasswordAriaLabel = input('Hide password');\n\n /** Screen-reader prefix of the strength level (`showStrengthMeter`). */\n readonly strengthLabel = input('Password strength:');\n\n /** Shown for strength level `Weak`. */\n readonly weakLabel = input('Weak');\n\n /** Shown for strength level `Fair`. */\n readonly fairLabel = input('Fair');\n\n /** Shown for strength level `Good`. */\n readonly goodLabel = input('Good');\n\n /** Shown for strength level `Strong`. */\n readonly strongLabel = input('Strong');\n\n /** Accessible name of the requirement list (`showRequirements`). */\n readonly requirementsAriaLabel = input('Password requirements');\n\n /** Requirement: at least 8 characters. */\n readonly minLengthRequirementLabel = input('At least 8 characters');\n\n /** Requirement: one uppercase letter. */\n readonly uppercaseRequirementLabel = input('One uppercase letter (A-Z)');\n\n /** Requirement: one lowercase letter. */\n readonly lowercaseRequirementLabel = input('One lowercase letter (a-z)');\n\n /** Requirement: one digit. */\n readonly digitRequirementLabel = input('One digit (0-9)');\n\n /** Requirement: one symbol. */\n readonly symbolRequirementLabel = input('One symbol (!@#$%^&*)');\n\n /** Screen-reader suffix of a met requirement. */\n readonly requirementMetLabel = input('(met)');\n\n /** Screen-reader suffix of an unmet requirement. */\n readonly requirementNotMetLabel = input('(not met)');\n\n /** Emitted whenever the value (and thus the strength) is recalculated */\n readonly strengthChange = output<PasswordStrength>();\n\n /** Per-instance ids so label/error linkage survives several inputs on one page */\n readonly inputId = `lc-password-input-${nextUniqueId++}`;\n readonly errorId = `${this.inputId}-error`;\n readonly helperId = `${this.inputId}-helper`;\n readonly strengthId = `${this.inputId}-strength`;\n\n // Internal state\n readonly value = signal<string>('');\n readonly isPasswordVisible = signal<boolean>(false);\n\n // Internal disabled state (for ControlValueAccessor)\n private readonly formDisabled = signal<boolean>(false);\n\n /** Computed disabled state from both input and form control */\n readonly isDisabled = computed(() => this.disabled() || this.formDisabled());\n\n /** The length rule: `minLength`, else 8. */\n readonly requiredLength = computed(() => this.minLength() ?? DEFAULT_MIN_LENGTH);\n\n readonly requirements = computed<PasswordRequirement[]>(() => {\n const password = this.value();\n const checks: Array<[string, boolean]> = [[this.minLengthRequirementLabel(), password.length >= this.requiredLength()]];\n if (this.strengthMode() === 'composition') {\n checks.push(\n [this.uppercaseRequirementLabel(), /[A-Z]/.test(password)],\n [this.lowercaseRequirementLabel(), /[a-z]/.test(password)],\n [this.digitRequirementLabel(), /[0-9]/.test(password)],\n [this.symbolRequirementLabel(), SYMBOL_PATTERN.test(password)],\n );\n }\n return checks.map(([label, met]) => ({ label, met, icon: met ? '✓' : '✗' }));\n });\n\n readonly strength = computed<PasswordStrength>(() =>\n this.strengthMode() === 'length' ? this.lengthStrength() : this.compositionStrength(),\n );\n\n /** The strength level as shown to the user (the level itself stays English: it is API and class name). */\n readonly strengthText = computed(() => {\n switch (this.strength().level) {\n case 'Strong':\n return this.strongLabel();\n case 'Good':\n return this.goodLabel();\n case 'Fair':\n return this.fairLabel();\n default:\n return this.weakLabel();\n }\n });\n\n /** Lower-cased level for the modifier classes (lc-strength-weak …) */\n readonly strengthLevelClass = computed(() => `lc-strength-${this.strength().level.toLowerCase()}`);\n\n readonly describedBy = computed(() => {\n const ids: string[] = [];\n if (this.error()) ids.push(this.errorId);\n else if (this.helperText()) ids.push(this.helperId);\n if (this.showStrengthMeter()) ids.push(this.strengthId);\n return ids.length ? ids.join(' ') : null;\n });\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private onChange: (value: string) => void = () => {};\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private onTouched: () => void = () => {};\n\n /**\n * ControlValueAccessor: Write value from form control\n */\n writeValue(value: string | null | undefined): void {\n this.value.set(value || '');\n this.strengthChange.emit(this.strength());\n }\n\n /**\n * ControlValueAccessor: Register onChange callback\n */\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n /**\n * ControlValueAccessor: Register onTouched callback\n */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /**\n * ControlValueAccessor: Set disabled state\n */\n setDisabledState(isDisabled: boolean): void {\n this.formDisabled.set(isDisabled);\n }\n\n /**\n * Toggle password visibility\n */\n togglePasswordVisibility(): void {\n this.isPasswordVisible.update((visible) => !visible);\n }\n\n /**\n * Handle input changes\n */\n onInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.value.set(input.value);\n this.onChange(input.value);\n this.strengthChange.emit(this.strength());\n }\n\n /**\n * Handle blur event\n */\n onBlur(): void {\n this.onTouched();\n }\n\n /** 3.2 scoring: the share of the five rules met. */\n private compositionStrength(): PasswordStrength {\n const requirements = this.requirements();\n const score = requirements.filter((r) => r.met).length;\n const percentage = (score / requirements.length) * 100;\n\n let level: PasswordStrength['level'] = 'Weak';\n if (percentage >= 80) {\n level = 'Strong';\n } else if (percentage >= 60) {\n level = 'Good';\n } else if (percentage >= 40) {\n level = 'Fair';\n }\n\n return { score, level, percentage };\n }\n\n /** NIST scoring: the length against `minLength` (score 0–4 like the four levels). */\n private lengthStrength(): PasswordStrength {\n const length = this.value().length;\n const min = this.requiredLength();\n const percentage = Math.min(100, Math.round((length / (2 * min)) * 100));\n\n let level: PasswordStrength['level'] = 'Weak';\n let score = length > 0 ? 1 : 0;\n if (length >= 2 * min) {\n level = 'Strong';\n score = 4;\n } else if (length >= 1.5 * min) {\n level = 'Good';\n score = 3;\n } else if (length >= min) {\n level = 'Fair';\n score = 2;\n }\n\n return { score, level, percentage };\n }\n}\n","<div class=\"lc-password-input\">\n <label [for]=\"inputId\" class=\"lc-label\">\n {{ label() }}\n @if (required() && requiredIndicator()) {\n <span class=\"lc-required\" aria-hidden=\"true\">*</span>\n }\n </label>\n\n <div class=\"lc-input-wrapper\">\n <input\n [id]=\"inputId\"\n [type]=\"isPasswordVisible() ? 'text' : 'password'\"\n [value]=\"value()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [required]=\"required()\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.minlength]=\"minLength() ?? null\"\n [attr.autocomplete]=\"autocomplete() ?? null\"\n [attr.name]=\"name() ?? null\"\n [attr.autocapitalize]=\"autocapitalize()\"\n [attr.spellcheck]=\"spellcheck() === undefined ? null : spellcheck() ? 'true' : 'false'\"\n [attr.enterkeyhint]=\"enterkeyhint() ?? null\"\n autocorrect=\"off\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\"\n class=\"lc-input\"\n [class.lc-input-error]=\"error()\"\n />\n\n <button\n type=\"button\"\n (click)=\"togglePasswordVisibility()\"\n [attr.aria-label]=\"isPasswordVisible() ? hidePasswordAriaLabel() : showPasswordAriaLabel()\"\n [attr.aria-pressed]=\"isPasswordVisible()\"\n [attr.aria-controls]=\"inputId\"\n class=\"lc-toggle-btn\"\n [disabled]=\"isDisabled()\"\n >\n @if (isPasswordVisible()) {\n <lc-icon name=\"eye-slash\" size=\"md\" [decorative]=\"true\"></lc-icon>\n } @else {\n <lc-icon name=\"eye\" size=\"md\" [decorative]=\"true\"></lc-icon>\n }\n </button>\n </div>\n\n @if (error()) {\n <div [id]=\"errorId\" class=\"lc-error\" role=\"alert\">\n {{ error() }}\n </div>\n } @else if (helperText()) {\n <div [id]=\"helperId\" class=\"lc-helper\">\n {{ helperText() }}\n </div>\n }\n\n @if (showStrengthMeter()) {\n <div class=\"lc-strength-meter\">\n <!-- The bar is decorative; the live label below carries the meaning -->\n <div class=\"lc-strength-bar\" aria-hidden=\"true\">\n <div class=\"lc-strength-fill\" [class]=\"strengthLevelClass()\" [style.width.%]=\"strength().percentage\"></div>\n </div>\n <div [id]=\"strengthId\" class=\"lc-strength-label\" [class]=\"strengthLevelClass()\" role=\"status\" aria-live=\"polite\">\n <span class=\"lc-sr-only\">{{ strengthLabel() }} </span>{{ strengthText() }}\n </div>\n </div>\n }\n\n @if (showRequirements()) {\n <lc-alert variant=\"info\" [dismissible]=\"false\">\n <ul class=\"lc-requirements\" [attr.aria-label]=\"requirementsAriaLabel()\">\n @for (req of requirements(); track req.label) {\n <li\n class=\"lc-requirement\"\n [class.lc-requirement-met]=\"req.met\"\n [class.lc-requirement-unmet]=\"!req.met\"\n >\n <span class=\"lc-requirement-icon\" aria-hidden=\"true\">{{ req.icon }}</span>\n <span class=\"lc-requirement-label\">{{ req.label }}</span>\n <span class=\"lc-sr-only\">{{ req.met ? requirementMetLabel() : requirementNotMetLabel() }}</span>\n </li>\n }\n </ul>\n </lc-alert>\n }\n</div>\n"],"mappings":"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"}
@@ -0,0 +1,162 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, computed, input } from "@angular/core";
3
+ import { chartColor, toFinite } from "@lifecorner/angular-ui-kit/internal/chart";
4
+ var PieChartComponent = class PieChartComponent {
5
+ segments = input.required(...ngDevMode ? [{ debugName: "segments" }] : /* istanbul ignore next */ []);
6
+ size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
7
+ showLegend = input(false, ...ngDevMode ? [{ debugName: "showLegend" }] : /* istanbul ignore next */ []);
8
+ ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
9
+ SIZE_MAP = {
10
+ sm: 96,
11
+ md: 140,
12
+ lg: 200
13
+ };
14
+ svgSize = computed(() => this.SIZE_MAP[this.size()], ...ngDevMode ? [{ debugName: "svgSize" }] : /* istanbul ignore next */ []);
15
+ viewBox = computed(() => `0 0 ${this.svgSize()} ${this.svgSize()}`, ...ngDevMode ? [{ debugName: "viewBox" }] : /* istanbul ignore next */ []);
16
+ center = computed(() => this.svgSize() / 2, ...ngDevMode ? [{ debugName: "center" }] : /* istanbul ignore next */ []);
17
+ radius = computed(() => this.svgSize() / 2 - 2, ...ngDevMode ? [{ debugName: "radius" }] : /* istanbul ignore next */ []);
18
+ arcs = computed(() => {
19
+ const segs = this.segments();
20
+ if (!segs?.length) return [];
21
+ const values = segs.map((s) => Math.max(0, toFinite(s.value)));
22
+ const total = values.reduce((s, v) => s + v, 0);
23
+ if (!total) return [];
24
+ const cx = this.center();
25
+ const cy = this.center();
26
+ const r = this.radius();
27
+ let startAngle = -Math.PI / 2;
28
+ const gap = segs.length > 1 ? .02 : 0;
29
+ return segs.map((seg, i) => {
30
+ const frac = values[i] / total;
31
+ const sweep = frac * Math.PI * 2 - gap;
32
+ const endAngle = startAngle + sweep;
33
+ const large = sweep > Math.PI ? 1 : 0;
34
+ const x1 = cx + r * Math.cos(startAngle);
35
+ const y1 = cy + r * Math.sin(startAngle);
36
+ const x2 = cx + r * Math.cos(endAngle);
37
+ const y2 = cy + r * Math.sin(endAngle);
38
+ const d = sweep >= Math.PI * 2 - 1e-9 ? `M${cx},${cy - r} A${r},${r} 0 1 1 ${cx},${cy + r} A${r},${r} 0 1 1 ${cx},${cy - r} Z` : `M${cx},${cy} L${x1},${y1} A${r},${r} 0 ${large} 1 ${x2},${y2} Z`;
39
+ startAngle = endAngle + gap;
40
+ return {
41
+ d,
42
+ color: seg.color || chartColor(i),
43
+ label: seg.label || "",
44
+ percentage: Math.round(frac * 100)
45
+ };
46
+ });
47
+ }, ...ngDevMode ? [{ debugName: "arcs" }] : /* istanbul ignore next */ []);
48
+ legendItems = computed(() => this.arcs().map((a) => ({
49
+ color: a.color,
50
+ label: a.label,
51
+ percentage: a.percentage
52
+ })), ...ngDevMode ? [{ debugName: "legendItems" }] : /* istanbul ignore next */ []);
53
+ effectiveAriaLabel = computed(() => {
54
+ const explicit = this.ariaLabel();
55
+ if (explicit) return explicit;
56
+ const arcs = this.arcs();
57
+ if (!arcs.length) return "Pie chart: no data";
58
+ return `Pie chart: ${arcs.map((a, i) => `${a.label || `Segment ${i + 1}`} ${a.percentage}%`).join(", ")}`;
59
+ }, ...ngDevMode ? [{ debugName: "effectiveAriaLabel" }] : /* istanbul ignore next */ []);
60
+ static ɵfac = i0.ɵɵngDeclareFactory({
61
+ minVersion: "12.0.0",
62
+ version: "22.2.2",
63
+ ngImport: i0,
64
+ type: PieChartComponent,
65
+ deps: [],
66
+ target: i0.ɵɵFactoryTarget.Component
67
+ });
68
+ static ɵcmp = i0.ɵɵngDeclareComponent({
69
+ minVersion: "17.0.0",
70
+ version: "22.2.2",
71
+ type: PieChartComponent,
72
+ isStandalone: true,
73
+ selector: "lc-pie-chart",
74
+ inputs: {
75
+ segments: {
76
+ classPropertyName: "segments",
77
+ publicName: "segments",
78
+ isSignal: true,
79
+ isRequired: true,
80
+ transformFunction: null
81
+ },
82
+ size: {
83
+ classPropertyName: "size",
84
+ publicName: "size",
85
+ isSignal: true,
86
+ isRequired: false,
87
+ transformFunction: null
88
+ },
89
+ showLegend: {
90
+ classPropertyName: "showLegend",
91
+ publicName: "showLegend",
92
+ isSignal: true,
93
+ isRequired: false,
94
+ transformFunction: null
95
+ },
96
+ ariaLabel: {
97
+ classPropertyName: "ariaLabel",
98
+ publicName: "ariaLabel",
99
+ isSignal: true,
100
+ isRequired: false,
101
+ transformFunction: null
102
+ }
103
+ },
104
+ ngImport: i0,
105
+ template: "<div class=\"lc-pie-chart\">\n <svg [attr.width]=\"svgSize()\" [attr.height]=\"svgSize()\" [attr.viewBox]=\"viewBox()\" role=\"img\" [attr.aria-label]=\"effectiveAriaLabel()\" class=\"lc-pie-chart__svg\">\n <title>{{ effectiveAriaLabel() }}</title>\n\n @for (arc of arcs(); track $index) {\n <path [attr.d]=\"arc.d\" [attr.fill]=\"arc.color\" class=\"lc-pie-chart__segment\" />\n }\n </svg>\n\n @if (showLegend()) {\n <div class=\"lc-pie-chart__legend\">\n @for (item of legendItems(); track $index) {\n <div class=\"lc-pie-chart__legend-item\">\n <span class=\"lc-pie-chart__legend-dot\" [style.background-color]=\"item.color\"></span>\n <span class=\"lc-pie-chart__legend-label\">{{ item.label }}</span>\n <span class=\"lc-pie-chart__legend-pct\">{{ item.percentage }}%</span>\n </div>\n }\n </div>\n }\n</div>\n",
106
+ styles: [":host{display:block}.lc-pie-chart{display:flex;flex-direction:column;align-items:center;gap:.75rem}.lc-pie-chart__svg{overflow:visible}.lc-pie-chart__segment{transition:opacity .15s ease}.lc-pie-chart__segment:hover{opacity:.8}.lc-pie-chart__legend{display:flex;flex-wrap:wrap;gap:.5rem 1rem;justify-content:center}.lc-pie-chart__legend-item{display:flex;align-items:center;gap:.375rem;font-size:var(--typography-font-size-sm, .875rem)}.lc-pie-chart__legend-dot{width:.5rem;height:.5rem;border-radius:50%;flex-shrink:0}.lc-pie-chart__legend-label{color:var(--color-text-secondary)}.lc-pie-chart__legend-pct{color:var(--color-text-tertiary);font-weight:600}\n"],
107
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
108
+ });
109
+ };
110
+ i0.ɵɵngDeclareClassMetadata({
111
+ minVersion: "12.0.0",
112
+ version: "22.2.2",
113
+ ngImport: i0,
114
+ type: PieChartComponent,
115
+ decorators: [{
116
+ type: Component,
117
+ args: [{
118
+ selector: "lc-pie-chart",
119
+ standalone: true,
120
+ changeDetection: ChangeDetectionStrategy.OnPush,
121
+ template: "<div class=\"lc-pie-chart\">\n <svg [attr.width]=\"svgSize()\" [attr.height]=\"svgSize()\" [attr.viewBox]=\"viewBox()\" role=\"img\" [attr.aria-label]=\"effectiveAriaLabel()\" class=\"lc-pie-chart__svg\">\n <title>{{ effectiveAriaLabel() }}</title>\n\n @for (arc of arcs(); track $index) {\n <path [attr.d]=\"arc.d\" [attr.fill]=\"arc.color\" class=\"lc-pie-chart__segment\" />\n }\n </svg>\n\n @if (showLegend()) {\n <div class=\"lc-pie-chart__legend\">\n @for (item of legendItems(); track $index) {\n <div class=\"lc-pie-chart__legend-item\">\n <span class=\"lc-pie-chart__legend-dot\" [style.background-color]=\"item.color\"></span>\n <span class=\"lc-pie-chart__legend-label\">{{ item.label }}</span>\n <span class=\"lc-pie-chart__legend-pct\">{{ item.percentage }}%</span>\n </div>\n }\n </div>\n }\n</div>\n",
122
+ styles: [":host{display:block}.lc-pie-chart{display:flex;flex-direction:column;align-items:center;gap:.75rem}.lc-pie-chart__svg{overflow:visible}.lc-pie-chart__segment{transition:opacity .15s ease}.lc-pie-chart__segment:hover{opacity:.8}.lc-pie-chart__legend{display:flex;flex-wrap:wrap;gap:.5rem 1rem;justify-content:center}.lc-pie-chart__legend-item{display:flex;align-items:center;gap:.375rem;font-size:var(--typography-font-size-sm, .875rem)}.lc-pie-chart__legend-dot{width:.5rem;height:.5rem;border-radius:50%;flex-shrink:0}.lc-pie-chart__legend-label{color:var(--color-text-secondary)}.lc-pie-chart__legend-pct{color:var(--color-text-tertiary);font-weight:600}\n"]
123
+ }]
124
+ }],
125
+ propDecorators: {
126
+ segments: [{
127
+ type: i0.Input,
128
+ args: [{
129
+ isSignal: true,
130
+ alias: "segments",
131
+ required: true
132
+ }]
133
+ }],
134
+ size: [{
135
+ type: i0.Input,
136
+ args: [{
137
+ isSignal: true,
138
+ alias: "size",
139
+ required: false
140
+ }]
141
+ }],
142
+ showLegend: [{
143
+ type: i0.Input,
144
+ args: [{
145
+ isSignal: true,
146
+ alias: "showLegend",
147
+ required: false
148
+ }]
149
+ }],
150
+ ariaLabel: [{
151
+ type: i0.Input,
152
+ args: [{
153
+ isSignal: true,
154
+ alias: "ariaLabel",
155
+ required: false
156
+ }]
157
+ }]
158
+ }
159
+ });
160
+ export { PieChartComponent };
161
+
162
+ //# sourceMappingURL=lifecorner-angular-ui-kit-pie-chart.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecorner-angular-ui-kit-pie-chart.mjs","names":[],"sources":["../../../../libs/angular-ui-kit/src/lib/pie-chart/pie-chart.component.ts","../../../../libs/angular-ui-kit/src/lib/pie-chart/pie-chart.component.html"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n input,\n computed,\n} from '@angular/core';\nimport { chartColor } from '@lifecorner/angular-ui-kit/internal/chart';\nimport { toFinite } from '@lifecorner/angular-ui-kit/internal/chart';\n\nexport interface PieSegment {\n /** Share of the whole. Non-finite and negative values count as 0. */\n value: number;\n label?: string;\n color?: string;\n}\n\nexport type PieChartSize = 'sm' | 'md' | 'lg';\n\n@Component({\n selector: 'lc-pie-chart',\n standalone: true,\n templateUrl: './pie-chart.component.html',\n styleUrls: ['./pie-chart.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n/**\n * Pie chart component for displaying proportional data.\n *\n * Features:\n * - Color-coded segments with automatic arc calculation\n * - Size presets (sm, md, lg)\n * - Optional legend display\n * - Hover state support\n * - Responsive SVG rendering\n *\n * @example\n * ```html\n * <lc-pie-chart [segments]=\"data\" size=\"md\" [showLegend]=\"true\" />\n * ```\n */\nexport class PieChartComponent {\n segments = input.required<PieSegment[]>();\n size = input<PieChartSize>('md');\n showLegend = input<boolean>(false);\n /**\n * Accessible name of the chart. Defaults to a generated summary listing\n * every segment's label and share, e.g. \"Pie chart: A 40%, B 60%\".\n */\n ariaLabel = input<string>('');\n\n private readonly SIZE_MAP: Record<PieChartSize, number> = { sm: 96, md: 140, lg: 200 };\n\n protected readonly svgSize = computed(() => this.SIZE_MAP[this.size()]);\n protected readonly viewBox = computed(() => `0 0 ${this.svgSize()} ${this.svgSize()}`);\n protected readonly center = computed(() => this.svgSize() / 2);\n protected readonly radius = computed(() => this.svgSize() / 2 - 2);\n\n protected readonly arcs = computed(() => {\n const segs = this.segments();\n if (!segs?.length) return [];\n const values = segs.map((s) => Math.max(0, toFinite(s.value)));\n const total = values.reduce((s, v) => s + v, 0);\n if (!total) return [];\n\n const cx = this.center();\n const cy = this.center();\n const r = this.radius();\n let startAngle = -Math.PI / 2;\n const gap = segs.length > 1 ? 0.02 : 0;\n\n return segs.map((seg, i) => {\n const frac = values[i] / total;\n const sweep = frac * Math.PI * 2 - gap;\n const endAngle = startAngle + sweep;\n const large = sweep > Math.PI ? 1 : 0;\n\n const x1 = cx + r * Math.cos(startAngle);\n const y1 = cy + r * Math.sin(startAngle);\n const x2 = cx + r * Math.cos(endAngle);\n const y2 = cy + r * Math.sin(endAngle);\n\n // A full circle can't be one arc (start === end collapses it): two half-circles.\n const d = sweep >= Math.PI * 2 - 1e-9\n ? `M${cx},${cy - r} A${r},${r} 0 1 1 ${cx},${cy + r} A${r},${r} 0 1 1 ${cx},${cy - r} Z`\n : `M${cx},${cy} L${x1},${y1} A${r},${r} 0 ${large} 1 ${x2},${y2} Z`;\n\n startAngle = endAngle + gap;\n\n return {\n d,\n color: seg.color || chartColor(i),\n label: seg.label || '',\n percentage: Math.round(frac * 100),\n };\n });\n });\n\n protected readonly legendItems = computed(() =>\n this.arcs().map(a => ({ color: a.color, label: a.label, percentage: a.percentage }))\n );\n\n protected readonly effectiveAriaLabel = computed(() => {\n const explicit = this.ariaLabel();\n if (explicit) return explicit;\n const arcs = this.arcs();\n if (!arcs.length) return 'Pie chart: no data';\n return `Pie chart: ${arcs\n .map((a, i) => `${a.label || `Segment ${i + 1}`} ${a.percentage}%`)\n .join(', ')}`;\n });\n}\n","<div class=\"lc-pie-chart\">\n <svg [attr.width]=\"svgSize()\" [attr.height]=\"svgSize()\" [attr.viewBox]=\"viewBox()\" role=\"img\" [attr.aria-label]=\"effectiveAriaLabel()\" class=\"lc-pie-chart__svg\">\n <title>{{ effectiveAriaLabel() }}</title>\n\n @for (arc of arcs(); track $index) {\n <path [attr.d]=\"arc.d\" [attr.fill]=\"arc.color\" class=\"lc-pie-chart__segment\" />\n }\n </svg>\n\n @if (showLegend()) {\n <div class=\"lc-pie-chart__legend\">\n @for (item of legendItems(); track $index) {\n <div class=\"lc-pie-chart__legend-item\">\n <span class=\"lc-pie-chart__legend-dot\" [style.background-color]=\"item.color\"></span>\n <span class=\"lc-pie-chart__legend-label\">{{ item.label }}</span>\n <span class=\"lc-pie-chart__legend-pct\">{{ item.percentage }}%</span>\n </div>\n }\n </div>\n }\n</div>\n"],"mappings":"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"}
@@ -0,0 +1,159 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, computed, input, output } from "@angular/core";
3
+ import { NgTemplateOutlet } from "@angular/common";
4
+ import { IconComponent } from "@lifecorner/angular-ui-kit/icon";
5
+ const STATUS_ICON = {
6
+ complete: "check",
7
+ current: "point",
8
+ pending: "",
9
+ warning: "alert-triangle",
10
+ error: "x"
11
+ };
12
+ var PipelineComponent = class PipelineComponent {
13
+ steps = input.required(...ngDevMode ? [{ debugName: "steps" }] : /* istanbul ignore next */ []);
14
+ orientation = input("horizontal", ...ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []);
15
+ size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
16
+ clickable = input(false, ...ngDevMode ? [{ debugName: "clickable" }] : /* istanbul ignore next */ []);
17
+ stepClick = output();
18
+ hostClass = computed(() => `lc-pipeline lc-pipeline--${this.orientation()} lc-pipeline--size-${this.size()}`, ...ngDevMode ? [{ debugName: "hostClass" }] : /* istanbul ignore next */ []);
19
+ iconFor(step) {
20
+ return step.icon ?? STATUS_ICON[step.status];
21
+ }
22
+ stepClass(step) {
23
+ return `lc-pipeline__step lc-pipeline__step--${step.status}`;
24
+ }
25
+ onActivate(step) {
26
+ if (this.clickable()) this.stepClick.emit(step);
27
+ }
28
+ static ɵfac = i0.ɵɵngDeclareFactory({
29
+ minVersion: "12.0.0",
30
+ version: "22.2.2",
31
+ ngImport: i0,
32
+ type: PipelineComponent,
33
+ deps: [],
34
+ target: i0.ɵɵFactoryTarget.Component
35
+ });
36
+ static ɵcmp = i0.ɵɵngDeclareComponent({
37
+ minVersion: "17.0.0",
38
+ version: "22.2.2",
39
+ type: PipelineComponent,
40
+ isStandalone: true,
41
+ selector: "lc-pipeline",
42
+ inputs: {
43
+ steps: {
44
+ classPropertyName: "steps",
45
+ publicName: "steps",
46
+ isSignal: true,
47
+ isRequired: true,
48
+ transformFunction: null
49
+ },
50
+ orientation: {
51
+ classPropertyName: "orientation",
52
+ publicName: "orientation",
53
+ isSignal: true,
54
+ isRequired: false,
55
+ transformFunction: null
56
+ },
57
+ size: {
58
+ classPropertyName: "size",
59
+ publicName: "size",
60
+ isSignal: true,
61
+ isRequired: false,
62
+ transformFunction: null
63
+ },
64
+ clickable: {
65
+ classPropertyName: "clickable",
66
+ publicName: "clickable",
67
+ isSignal: true,
68
+ isRequired: false,
69
+ transformFunction: null
70
+ }
71
+ },
72
+ outputs: { stepClick: "stepClick" },
73
+ ngImport: i0,
74
+ template: "<ol [class]=\"hostClass()\">\n @for (step of steps(); track $index; let last = $last) {\n <li [class]=\"stepClass(step)\" [class.lc-pipeline__step--last]=\"last\">\n @if (clickable()) {\n <button type=\"button\" class=\"lc-pipeline__hit\" (click)=\"onActivate(step)\">\n <ng-container [ngTemplateOutlet]=\"body\" [ngTemplateOutletContext]=\"{ $implicit: step }\" />\n </button>\n } @else {\n <ng-container [ngTemplateOutlet]=\"body\" [ngTemplateOutletContext]=\"{ $implicit: step }\" />\n }\n </li>\n }\n</ol>\n\n<ng-template #body let-step>\n <span class=\"lc-pipeline__marker\">\n <span class=\"lc-pipeline__connector\" aria-hidden=\"true\"></span>\n <span class=\"lc-pipeline__node\">\n @if (iconFor(step)) {\n <lc-icon [name]=\"iconFor(step)\" size=\"xs\" [decorative]=\"true\" />\n }\n </span>\n </span>\n <span class=\"lc-pipeline__text\">\n <span class=\"lc-pipeline__label\">{{ step.label }}</span>\n @if (step.caption) {\n <span class=\"lc-pipeline__caption\">{{ step.caption }}</span>\n }\n </span>\n</ng-template>\n",
75
+ styles: [":host{display:block}.lc-pipeline{--lc-pipeline-node-size: 1.75rem;--lc-pipeline-line-weight: 2px;--lc-pipeline-gap: var(--spacing-2);--lc-pipeline-line: var(--color-border-strong);--lc-pipeline-line-done: var(--color-primary-500);--lc-pipeline-node-bg: var(--color-surface);--lc-pipeline-node-fg: var(--color-text-tertiary);--lc-pipeline-node-border: var(--lc-pipeline-line)}.lc-pipeline--size-sm{--lc-pipeline-node-size: 1.25rem;--lc-pipeline-line-weight: 1px;--lc-pipeline-gap: var(--spacing-1)}.lc-pipeline--size-sm .lc-pipeline__label{font-size:var(--font-size-xs)}.lc-pipeline--size-sm .lc-pipeline__caption{font-size:var(--font-size-2xs, .6875rem)}.lc-pipeline--size-sm .lc-pipeline__node lc-icon{transform:scale(.85)}.lc-pipeline{list-style:none;margin:0;padding:0;display:flex}.lc-pipeline__step{position:relative;display:flex;min-width:0}.lc-pipeline__hit{display:flex;background:none;border:0;padding:0;margin:0;font:inherit;color:inherit;text-align:inherit;cursor:pointer;width:100%}.lc-pipeline__hit:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:2px;border-radius:var(--border-radius-sm)}.lc-pipeline__marker{flex-shrink:0}.lc-pipeline__node{position:relative;z-index:1;display:inline-flex;align-items:center;justify-content:center;width:var(--lc-pipeline-node-size);height:var(--lc-pipeline-node-size);border-radius:var(--border-radius-full);background-color:var(--lc-pipeline-node-bg);border:var(--lc-pipeline-line-weight) solid var(--lc-pipeline-node-border);color:var(--lc-pipeline-node-fg);box-sizing:border-box}.lc-pipeline__label{display:block;font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold);color:var(--color-text-primary)}.lc-pipeline__caption{display:block;font-size:var(--font-size-xs);color:var(--color-text-tertiary);line-height:1.35}.lc-pipeline--horizontal{align-items:flex-start;gap:var(--lc-pipeline-gap)}.lc-pipeline--horizontal .lc-pipeline__step{flex:1 1 0;flex-direction:column;align-items:flex-start}.lc-pipeline--horizontal .lc-pipeline__hit{flex-direction:column;align-items:flex-start}.lc-pipeline--horizontal .lc-pipeline__connector{position:absolute;top:calc(var(--lc-pipeline-node-size) / 2);left:calc(var(--lc-pipeline-node-size) / 2);width:calc(100% + var(--lc-pipeline-gap));height:var(--lc-pipeline-line-weight);transform:translateY(-50%);background-color:var(--lc-pipeline-line)}.lc-pipeline--horizontal .lc-pipeline__step--last .lc-pipeline__connector{display:none}.lc-pipeline--horizontal .lc-pipeline__text{margin-top:var(--spacing-2);padding-right:var(--spacing-3)}.lc-pipeline--vertical{flex-direction:column;gap:0}.lc-pipeline--vertical .lc-pipeline__step{flex-direction:row;align-items:flex-start;gap:var(--spacing-3);padding-bottom:var(--spacing-4)}.lc-pipeline--vertical .lc-pipeline__hit{flex-direction:row;align-items:flex-start;gap:var(--spacing-3)}.lc-pipeline--vertical .lc-pipeline__connector{position:absolute;left:calc(var(--lc-pipeline-node-size) / 2);top:var(--lc-pipeline-node-size);width:var(--lc-pipeline-line-weight);height:calc(100% - var(--lc-pipeline-node-size));transform:translate(-50%);background-color:var(--lc-pipeline-line)}.lc-pipeline--vertical .lc-pipeline__step--last .lc-pipeline__connector{display:none}.lc-pipeline--vertical .lc-pipeline__text{padding-top:calc((var(--lc-pipeline-node-size) - 1.25rem) / 2)}.lc-pipeline__step--complete .lc-pipeline__node{background-color:var(--color-primary-500);border-color:var(--color-primary-500);color:var(--color-on-primary, #fff)}.lc-pipeline__step--complete .lc-pipeline__connector{background-color:var(--lc-pipeline-line-done)}.lc-pipeline__step--current .lc-pipeline__node{border-color:var(--color-primary-500);color:var(--color-primary-500);box-shadow:var(--shadow-brand-glow)}.lc-pipeline__step--current .lc-pipeline__connector{background-color:var(--lc-pipeline-line-done)}.lc-pipeline__step--warning .lc-pipeline__node{border-color:var(--color-warning);color:var(--color-warning)}.lc-pipeline__step--error .lc-pipeline__node{border-color:var(--color-error);color:var(--color-error)}.lc-pipeline__step--pending .lc-pipeline__node{border-style:dashed}.lc-pipeline__step--pending .lc-pipeline__label{color:var(--color-text-secondary)}\n"],
76
+ dependencies: [{
77
+ kind: "component",
78
+ type: IconComponent,
79
+ selector: "lc-icon",
80
+ inputs: [
81
+ "name",
82
+ "variant",
83
+ "size",
84
+ "color",
85
+ "ariaLabel",
86
+ "decorative",
87
+ "strict"
88
+ ]
89
+ }, {
90
+ kind: "directive",
91
+ type: NgTemplateOutlet,
92
+ selector: "[ngTemplateOutlet]",
93
+ inputs: [
94
+ "ngTemplateOutletContext",
95
+ "ngTemplateOutlet",
96
+ "ngTemplateOutletInjector"
97
+ ]
98
+ }],
99
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
100
+ });
101
+ };
102
+ i0.ɵɵngDeclareClassMetadata({
103
+ minVersion: "12.0.0",
104
+ version: "22.2.2",
105
+ ngImport: i0,
106
+ type: PipelineComponent,
107
+ decorators: [{
108
+ type: Component,
109
+ args: [{
110
+ selector: "lc-pipeline",
111
+ standalone: true,
112
+ imports: [IconComponent, NgTemplateOutlet],
113
+ changeDetection: ChangeDetectionStrategy.OnPush,
114
+ template: "<ol [class]=\"hostClass()\">\n @for (step of steps(); track $index; let last = $last) {\n <li [class]=\"stepClass(step)\" [class.lc-pipeline__step--last]=\"last\">\n @if (clickable()) {\n <button type=\"button\" class=\"lc-pipeline__hit\" (click)=\"onActivate(step)\">\n <ng-container [ngTemplateOutlet]=\"body\" [ngTemplateOutletContext]=\"{ $implicit: step }\" />\n </button>\n } @else {\n <ng-container [ngTemplateOutlet]=\"body\" [ngTemplateOutletContext]=\"{ $implicit: step }\" />\n }\n </li>\n }\n</ol>\n\n<ng-template #body let-step>\n <span class=\"lc-pipeline__marker\">\n <span class=\"lc-pipeline__connector\" aria-hidden=\"true\"></span>\n <span class=\"lc-pipeline__node\">\n @if (iconFor(step)) {\n <lc-icon [name]=\"iconFor(step)\" size=\"xs\" [decorative]=\"true\" />\n }\n </span>\n </span>\n <span class=\"lc-pipeline__text\">\n <span class=\"lc-pipeline__label\">{{ step.label }}</span>\n @if (step.caption) {\n <span class=\"lc-pipeline__caption\">{{ step.caption }}</span>\n }\n </span>\n</ng-template>\n",
115
+ styles: [":host{display:block}.lc-pipeline{--lc-pipeline-node-size: 1.75rem;--lc-pipeline-line-weight: 2px;--lc-pipeline-gap: var(--spacing-2);--lc-pipeline-line: var(--color-border-strong);--lc-pipeline-line-done: var(--color-primary-500);--lc-pipeline-node-bg: var(--color-surface);--lc-pipeline-node-fg: var(--color-text-tertiary);--lc-pipeline-node-border: var(--lc-pipeline-line)}.lc-pipeline--size-sm{--lc-pipeline-node-size: 1.25rem;--lc-pipeline-line-weight: 1px;--lc-pipeline-gap: var(--spacing-1)}.lc-pipeline--size-sm .lc-pipeline__label{font-size:var(--font-size-xs)}.lc-pipeline--size-sm .lc-pipeline__caption{font-size:var(--font-size-2xs, .6875rem)}.lc-pipeline--size-sm .lc-pipeline__node lc-icon{transform:scale(.85)}.lc-pipeline{list-style:none;margin:0;padding:0;display:flex}.lc-pipeline__step{position:relative;display:flex;min-width:0}.lc-pipeline__hit{display:flex;background:none;border:0;padding:0;margin:0;font:inherit;color:inherit;text-align:inherit;cursor:pointer;width:100%}.lc-pipeline__hit:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:2px;border-radius:var(--border-radius-sm)}.lc-pipeline__marker{flex-shrink:0}.lc-pipeline__node{position:relative;z-index:1;display:inline-flex;align-items:center;justify-content:center;width:var(--lc-pipeline-node-size);height:var(--lc-pipeline-node-size);border-radius:var(--border-radius-full);background-color:var(--lc-pipeline-node-bg);border:var(--lc-pipeline-line-weight) solid var(--lc-pipeline-node-border);color:var(--lc-pipeline-node-fg);box-sizing:border-box}.lc-pipeline__label{display:block;font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold);color:var(--color-text-primary)}.lc-pipeline__caption{display:block;font-size:var(--font-size-xs);color:var(--color-text-tertiary);line-height:1.35}.lc-pipeline--horizontal{align-items:flex-start;gap:var(--lc-pipeline-gap)}.lc-pipeline--horizontal .lc-pipeline__step{flex:1 1 0;flex-direction:column;align-items:flex-start}.lc-pipeline--horizontal .lc-pipeline__hit{flex-direction:column;align-items:flex-start}.lc-pipeline--horizontal .lc-pipeline__connector{position:absolute;top:calc(var(--lc-pipeline-node-size) / 2);left:calc(var(--lc-pipeline-node-size) / 2);width:calc(100% + var(--lc-pipeline-gap));height:var(--lc-pipeline-line-weight);transform:translateY(-50%);background-color:var(--lc-pipeline-line)}.lc-pipeline--horizontal .lc-pipeline__step--last .lc-pipeline__connector{display:none}.lc-pipeline--horizontal .lc-pipeline__text{margin-top:var(--spacing-2);padding-right:var(--spacing-3)}.lc-pipeline--vertical{flex-direction:column;gap:0}.lc-pipeline--vertical .lc-pipeline__step{flex-direction:row;align-items:flex-start;gap:var(--spacing-3);padding-bottom:var(--spacing-4)}.lc-pipeline--vertical .lc-pipeline__hit{flex-direction:row;align-items:flex-start;gap:var(--spacing-3)}.lc-pipeline--vertical .lc-pipeline__connector{position:absolute;left:calc(var(--lc-pipeline-node-size) / 2);top:var(--lc-pipeline-node-size);width:var(--lc-pipeline-line-weight);height:calc(100% - var(--lc-pipeline-node-size));transform:translate(-50%);background-color:var(--lc-pipeline-line)}.lc-pipeline--vertical .lc-pipeline__step--last .lc-pipeline__connector{display:none}.lc-pipeline--vertical .lc-pipeline__text{padding-top:calc((var(--lc-pipeline-node-size) - 1.25rem) / 2)}.lc-pipeline__step--complete .lc-pipeline__node{background-color:var(--color-primary-500);border-color:var(--color-primary-500);color:var(--color-on-primary, #fff)}.lc-pipeline__step--complete .lc-pipeline__connector{background-color:var(--lc-pipeline-line-done)}.lc-pipeline__step--current .lc-pipeline__node{border-color:var(--color-primary-500);color:var(--color-primary-500);box-shadow:var(--shadow-brand-glow)}.lc-pipeline__step--current .lc-pipeline__connector{background-color:var(--lc-pipeline-line-done)}.lc-pipeline__step--warning .lc-pipeline__node{border-color:var(--color-warning);color:var(--color-warning)}.lc-pipeline__step--error .lc-pipeline__node{border-color:var(--color-error);color:var(--color-error)}.lc-pipeline__step--pending .lc-pipeline__node{border-style:dashed}.lc-pipeline__step--pending .lc-pipeline__label{color:var(--color-text-secondary)}\n"]
116
+ }]
117
+ }],
118
+ propDecorators: {
119
+ steps: [{
120
+ type: i0.Input,
121
+ args: [{
122
+ isSignal: true,
123
+ alias: "steps",
124
+ required: true
125
+ }]
126
+ }],
127
+ orientation: [{
128
+ type: i0.Input,
129
+ args: [{
130
+ isSignal: true,
131
+ alias: "orientation",
132
+ required: false
133
+ }]
134
+ }],
135
+ size: [{
136
+ type: i0.Input,
137
+ args: [{
138
+ isSignal: true,
139
+ alias: "size",
140
+ required: false
141
+ }]
142
+ }],
143
+ clickable: [{
144
+ type: i0.Input,
145
+ args: [{
146
+ isSignal: true,
147
+ alias: "clickable",
148
+ required: false
149
+ }]
150
+ }],
151
+ stepClick: [{
152
+ type: i0.Output,
153
+ args: ["stepClick"]
154
+ }]
155
+ }
156
+ });
157
+ export { PipelineComponent };
158
+
159
+ //# sourceMappingURL=lifecorner-angular-ui-kit-pipeline.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecorner-angular-ui-kit-pipeline.mjs","names":[],"sources":["../../../../libs/angular-ui-kit/src/lib/pipeline/pipeline.component.ts","../../../../libs/angular-ui-kit/src/lib/pipeline/pipeline.component.html"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n computed,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { IconComponent } from '@lifecorner/angular-ui-kit/icon';\n\n/**\n * Status of a single pipeline node.\n * - complete: finished (teal check)\n * - current: in progress / active (teal, subtle pulse)\n * - pending: not started yet (muted, hollow)\n * - warning: needs attention (amber)\n * - error: failed (red)\n */\nexport type PipelineStatus =\n | 'complete'\n | 'current'\n | 'pending'\n | 'warning'\n | 'error';\n\nexport interface PipelineStep {\n /** Node label. */\n label: string;\n /** Optional secondary line under the label. */\n caption?: string;\n /** Status that drives the node color and default icon. */\n status: PipelineStatus;\n /** Optional icon (Tabler name) overriding the status default. */\n icon?: string;\n /** Optional opaque payload echoed back in `stepClick`. */\n id?: string;\n}\n\nexport type PipelineOrientation = 'horizontal' | 'vertical';\nexport type PipelineSize = 'sm' | 'md';\n\nconst STATUS_ICON: Record<PipelineStatus, string> = {\n complete: 'check',\n current: 'point',\n pending: '',\n warning: 'alert-triangle',\n error: 'x',\n};\n\n/**\n * Pipeline — a status timeline of connected process nodes.\n *\n * Unlike {@link StepperComponent} (a navigation stepper whose states derive\n * from the active index), each pipeline node carries its own explicit status,\n * so it can show completed, current, pending, warning and error nodes in the\n * same chain — with an optional caption under each label.\n *\n * @example\n * ```html\n * <lc-pipeline\n * [steps]=\"[\n * { label: 'Connect', caption: 'Token valid', status: 'complete' },\n * { label: 'Checkout', caption: '2 hours ago', status: 'complete' },\n * { label: 'Analyze', caption: 'Running…', status: 'current' },\n * { label: 'Graph', caption: 'Out of date', status: 'warning' }\n * ]\" />\n * ```\n */\n@Component({\n selector: 'lc-pipeline',\n standalone: true,\n imports: [IconComponent, NgTemplateOutlet],\n templateUrl: './pipeline.component.html',\n styleUrls: ['./pipeline.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PipelineComponent {\n /** Ordered pipeline nodes. */\n readonly steps = input.required<readonly PipelineStep[]>();\n\n /** Layout direction. @default 'horizontal' */\n readonly orientation = input<PipelineOrientation>('horizontal');\n\n /**\n * Node/connector scale.\n * - md: default nodes (1.75rem)\n * - sm: compact spine — smaller nodes, thinner connectors, tighter grid\n * @default 'md'\n */\n readonly size = input<PipelineSize>('md');\n\n /** Whether nodes are clickable (emits `stepClick`). @default false */\n readonly clickable = input<boolean>(false);\n\n /** Emitted when a node is activated (only when `clickable`). */\n readonly stepClick = output<PipelineStep>();\n\n protected readonly hostClass = computed(\n () =>\n `lc-pipeline lc-pipeline--${this.orientation()} lc-pipeline--size-${this.size()}`,\n );\n\n protected iconFor(step: PipelineStep): string {\n return step.icon ?? STATUS_ICON[step.status];\n }\n\n protected stepClass(step: PipelineStep): string {\n return `lc-pipeline__step lc-pipeline__step--${step.status}`;\n }\n\n protected onActivate(step: PipelineStep): void {\n if (this.clickable()) {\n this.stepClick.emit(step);\n }\n }\n}\n","<ol [class]=\"hostClass()\">\n @for (step of steps(); track $index; let last = $last) {\n <li [class]=\"stepClass(step)\" [class.lc-pipeline__step--last]=\"last\">\n @if (clickable()) {\n <button type=\"button\" class=\"lc-pipeline__hit\" (click)=\"onActivate(step)\">\n <ng-container [ngTemplateOutlet]=\"body\" [ngTemplateOutletContext]=\"{ $implicit: step }\" />\n </button>\n } @else {\n <ng-container [ngTemplateOutlet]=\"body\" [ngTemplateOutletContext]=\"{ $implicit: step }\" />\n }\n </li>\n }\n</ol>\n\n<ng-template #body let-step>\n <span class=\"lc-pipeline__marker\">\n <span class=\"lc-pipeline__connector\" aria-hidden=\"true\"></span>\n <span class=\"lc-pipeline__node\">\n @if (iconFor(step)) {\n <lc-icon [name]=\"iconFor(step)\" size=\"xs\" [decorative]=\"true\" />\n }\n </span>\n </span>\n <span class=\"lc-pipeline__text\">\n <span class=\"lc-pipeline__label\">{{ step.label }}</span>\n @if (step.caption) {\n <span class=\"lc-pipeline__caption\">{{ step.caption }}</span>\n }\n </span>\n</ng-template>\n"],"mappings":";;;;AAyCA,MAAM,cAA8C;CAClD,UAAU;CACV,SAAS;CACT,SAAS;CACT,SAAS;CACT,OAAO;AACR;AA6BD,IAAa,oBAAb,MAAa,kBAAiB;CAEnB,QAAQ,MAAM,SAAmC,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAGjD,cAAc,MAA2B,cAAa,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAQtD,OAAO,MAAoB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAGhC,YAAY,MAAe,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAGjC,YAAY,OAAM;CAER,YAAY,eAE3B,4BAA4B,KAAK,YAAW,EAAE,qBAAsB,KAAK,KAAI,KAChF,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAES,QAAQ,MAAkB;EAClC,OAAO,KAAK,QAAQ,YAAY,KAAK;CACvC;CAEU,UAAU,MAAkB;EACpC,OAAO,wCAAwC,KAAK;CACtD;CAEU,WAAW,MAAkB;EACrC,IAAI,KAAK,UAAS,GAChB,KAAK,UAAU,KAAK,IAAI;CAE5B;CAtCW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAiB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAjB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAiB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA,EAAA,WAAA,YAAA;EAAA,UAAA;EAAA,UC5E9B;EA8BA,QAAA,CAAA,unIAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MDyCY;GAAa,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,GAAA;GAAA,MAAA;GAAA,MAAE;GAAgB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;GAAA;EAAA,CAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAK9B,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAiB,YAAA,CAAA;EAR7B,MAAA;EACW,MAAA,CAAA;GAAA,UAAA;GAAa,YACX;GAAI,SACP,CAAC,eAAe,gBAAgB;GAAC,iBAGzB,wBAAwB;GAAM,UAAA;GAAA,QAAA,CAAA,unIAAA;EAAA,CAAA"}
@@ -0,0 +1,190 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, ElementRef, HostListener, Renderer2, afterRenderEffect, computed, effect, inject, input, output, signal, untracked } from "@angular/core";
3
+ import { OverlayStackService } from "@lifecorner/angular-ui-kit/internal/overlay";
4
+ const INTERACTIVE_SELECTOR = "button, a[href], input, select, textarea, [tabindex]";
5
+ var PopoverComponent = class PopoverComponent {
6
+ static nextId = 0;
7
+ overlayId = `lc-popover-${++PopoverComponent.nextId}`;
8
+ position = input("bottom", ...ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []);
9
+ trigger = input("click", ...ngDevMode ? [{ debugName: "trigger" }] : /* istanbul ignore next */ []);
10
+ showArrow = input(true, ...ngDevMode ? [{ debugName: "showArrow" }] : /* istanbul ignore next */ []);
11
+ openChange = output();
12
+ isOpen = signal(false, ...ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []);
13
+ panelId = `${this.overlayId}-panel`;
14
+ panelClasses = computed(() => {
15
+ return [
16
+ "popover__panel",
17
+ `popover__panel--${this.position()}`,
18
+ this.showArrow() ? "popover__panel--arrow" : ""
19
+ ].filter(Boolean).join(" ");
20
+ }, ...ngDevMode ? [{ debugName: "panelClasses" }] : /* istanbul ignore next */ []);
21
+ elementRef = inject(ElementRef);
22
+ renderer = inject(Renderer2);
23
+ overlayStack = inject(OverlayStackService);
24
+ constructor() {
25
+ effect(() => {
26
+ const open = this.isOpen();
27
+ untracked(() => {
28
+ if (open) this.overlayStack.push(this.overlayId);
29
+ else this.overlayStack.remove(this.overlayId);
30
+ });
31
+ });
32
+ afterRenderEffect(() => {
33
+ const open = this.isOpen();
34
+ const trigger = this.triggerElement();
35
+ if (!trigger) return;
36
+ this.renderer.setAttribute(trigger, "aria-haspopup", "dialog");
37
+ this.renderer.setAttribute(trigger, "aria-expanded", String(open));
38
+ if (open) this.renderer.setAttribute(trigger, "aria-controls", this.panelId);
39
+ else this.renderer.removeAttribute(trigger, "aria-controls");
40
+ });
41
+ }
42
+ onDocumentClick(event) {
43
+ if (!this.isOpen() || this.trigger() !== "click") return;
44
+ if (this.elementRef.nativeElement.contains(event.target)) return;
45
+ if (!this.overlayStack.claim(this.overlayId, event)) return;
46
+ this.close();
47
+ }
48
+ onEscape(event) {
49
+ if (!this.isOpen()) return;
50
+ if (!this.overlayStack.claim(this.overlayId, event)) return;
51
+ event.stopPropagation();
52
+ this.close();
53
+ }
54
+ ngOnDestroy() {
55
+ this.overlayStack.remove(this.overlayId);
56
+ }
57
+ toggle() {
58
+ if (this.isOpen()) this.close();
59
+ else this.open();
60
+ }
61
+ open() {
62
+ this.isOpen.set(true);
63
+ this.openChange.emit(true);
64
+ }
65
+ close() {
66
+ this.restoreFocus();
67
+ this.isOpen.set(false);
68
+ this.openChange.emit(false);
69
+ }
70
+ onMouseEnter() {
71
+ if (this.trigger() === "hover") this.open();
72
+ }
73
+ onMouseLeave() {
74
+ if (this.trigger() === "hover") this.close();
75
+ }
76
+ triggerElement() {
77
+ const slot = this.elementRef.nativeElement.querySelector("[popover-trigger]");
78
+ if (!slot) return null;
79
+ return slot.matches(INTERACTIVE_SELECTOR) ? slot : slot.querySelector(INTERACTIVE_SELECTOR) ?? slot;
80
+ }
81
+ restoreFocus() {
82
+ if (typeof document === "undefined") return;
83
+ if (this.elementRef.nativeElement.querySelector(".popover__panel")?.contains(document.activeElement)) this.triggerElement()?.focus();
84
+ }
85
+ static ɵfac = i0.ɵɵngDeclareFactory({
86
+ minVersion: "12.0.0",
87
+ version: "22.2.2",
88
+ ngImport: i0,
89
+ type: PopoverComponent,
90
+ deps: [],
91
+ target: i0.ɵɵFactoryTarget.Component
92
+ });
93
+ static ɵcmp = i0.ɵɵngDeclareComponent({
94
+ minVersion: "17.0.0",
95
+ version: "22.2.2",
96
+ type: PopoverComponent,
97
+ isStandalone: true,
98
+ selector: "lc-popover",
99
+ inputs: {
100
+ position: {
101
+ classPropertyName: "position",
102
+ publicName: "position",
103
+ isSignal: true,
104
+ isRequired: false,
105
+ transformFunction: null
106
+ },
107
+ trigger: {
108
+ classPropertyName: "trigger",
109
+ publicName: "trigger",
110
+ isSignal: true,
111
+ isRequired: false,
112
+ transformFunction: null
113
+ },
114
+ showArrow: {
115
+ classPropertyName: "showArrow",
116
+ publicName: "showArrow",
117
+ isSignal: true,
118
+ isRequired: false,
119
+ transformFunction: null
120
+ }
121
+ },
122
+ outputs: { openChange: "openChange" },
123
+ host: { listeners: {
124
+ "document:click": "onDocumentClick($event)",
125
+ "document:keydown.escape": "onEscape($event)"
126
+ } },
127
+ ngImport: i0,
128
+ template: "<div\n class=\"popover\"\n (mouseenter)=\"onMouseEnter()\"\n (mouseleave)=\"onMouseLeave()\"\n>\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -- the projected trigger is the focusable control; its click bubbles here -->\n <div class=\"popover__trigger\" (click)=\"trigger() === 'click' ? toggle() : null\">\n <ng-content select=\"[popover-trigger]\"></ng-content>\n </div>\n @if (isOpen()) {\n <div [id]=\"panelId\" [class]=\"panelClasses()\" role=\"dialog\" aria-modal=\"false\">\n <ng-content select=\"[popover-content]\"></ng-content>\n </div>\n }\n</div>\n",
129
+ styles: [":host{display:inline-block;position:relative}.popover{position:relative;display:inline-block}.popover__trigger{display:inline-block;cursor:pointer}.popover__panel{position:absolute;z-index:50;min-width:12rem;padding:.75rem;background-color:var(--color-surface);background-image:var(--gradient-surface);border:1px solid var(--color-border-strong);border-radius:var(--border-radius-lg);box-shadow:var(--elevation-4);animation:popover-enter .15s ease-out}.popover__panel--bottom{top:calc(100% + .5rem);left:50%;transform:translate(-50%)}.popover__panel--top{bottom:calc(100% + .5rem);left:50%;transform:translate(-50%)}.popover__panel--left{right:calc(100% + .5rem);top:50%;transform:translateY(-50%)}.popover__panel--right{left:calc(100% + .5rem);top:50%;transform:translateY(-50%)}.popover__panel--arrow:before{content:\"\";position:absolute;width:.5rem;height:.5rem;background-color:var(--color-surface);background-image:var(--gradient-surface);border:1px solid var(--color-border-strong);transform:rotate(45deg)}.popover__panel--arrow.popover__panel--bottom:before{top:-.3rem;left:50%;margin-left:-.25rem;border-right:none;border-bottom:none}.popover__panel--arrow.popover__panel--top:before{bottom:-.3rem;left:50%;margin-left:-.25rem;border-left:none;border-top:none}.popover__panel--arrow.popover__panel--left:before{right:-.3rem;top:50%;margin-top:-.25rem;border-left:none;border-bottom:none}.popover__panel--arrow.popover__panel--right:before{left:-.3rem;top:50%;margin-top:-.25rem;border-right:none;border-top:none}@keyframes popover-enter{0%{opacity:0;transform:translate(-50%) scale(.95)}to{opacity:1;transform:translate(-50%) scale(1)}}\n"],
130
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
131
+ });
132
+ };
133
+ i0.ɵɵngDeclareClassMetadata({
134
+ minVersion: "12.0.0",
135
+ version: "22.2.2",
136
+ ngImport: i0,
137
+ type: PopoverComponent,
138
+ decorators: [{
139
+ type: Component,
140
+ args: [{
141
+ selector: "lc-popover",
142
+ standalone: true,
143
+ changeDetection: ChangeDetectionStrategy.OnPush,
144
+ template: "<div\n class=\"popover\"\n (mouseenter)=\"onMouseEnter()\"\n (mouseleave)=\"onMouseLeave()\"\n>\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -- the projected trigger is the focusable control; its click bubbles here -->\n <div class=\"popover__trigger\" (click)=\"trigger() === 'click' ? toggle() : null\">\n <ng-content select=\"[popover-trigger]\"></ng-content>\n </div>\n @if (isOpen()) {\n <div [id]=\"panelId\" [class]=\"panelClasses()\" role=\"dialog\" aria-modal=\"false\">\n <ng-content select=\"[popover-content]\"></ng-content>\n </div>\n }\n</div>\n",
145
+ styles: [":host{display:inline-block;position:relative}.popover{position:relative;display:inline-block}.popover__trigger{display:inline-block;cursor:pointer}.popover__panel{position:absolute;z-index:50;min-width:12rem;padding:.75rem;background-color:var(--color-surface);background-image:var(--gradient-surface);border:1px solid var(--color-border-strong);border-radius:var(--border-radius-lg);box-shadow:var(--elevation-4);animation:popover-enter .15s ease-out}.popover__panel--bottom{top:calc(100% + .5rem);left:50%;transform:translate(-50%)}.popover__panel--top{bottom:calc(100% + .5rem);left:50%;transform:translate(-50%)}.popover__panel--left{right:calc(100% + .5rem);top:50%;transform:translateY(-50%)}.popover__panel--right{left:calc(100% + .5rem);top:50%;transform:translateY(-50%)}.popover__panel--arrow:before{content:\"\";position:absolute;width:.5rem;height:.5rem;background-color:var(--color-surface);background-image:var(--gradient-surface);border:1px solid var(--color-border-strong);transform:rotate(45deg)}.popover__panel--arrow.popover__panel--bottom:before{top:-.3rem;left:50%;margin-left:-.25rem;border-right:none;border-bottom:none}.popover__panel--arrow.popover__panel--top:before{bottom:-.3rem;left:50%;margin-left:-.25rem;border-left:none;border-top:none}.popover__panel--arrow.popover__panel--left:before{right:-.3rem;top:50%;margin-top:-.25rem;border-left:none;border-bottom:none}.popover__panel--arrow.popover__panel--right:before{left:-.3rem;top:50%;margin-top:-.25rem;border-right:none;border-top:none}@keyframes popover-enter{0%{opacity:0;transform:translate(-50%) scale(.95)}to{opacity:1;transform:translate(-50%) scale(1)}}\n"]
146
+ }]
147
+ }],
148
+ ctorParameters: () => [],
149
+ propDecorators: {
150
+ position: [{
151
+ type: i0.Input,
152
+ args: [{
153
+ isSignal: true,
154
+ alias: "position",
155
+ required: false
156
+ }]
157
+ }],
158
+ trigger: [{
159
+ type: i0.Input,
160
+ args: [{
161
+ isSignal: true,
162
+ alias: "trigger",
163
+ required: false
164
+ }]
165
+ }],
166
+ showArrow: [{
167
+ type: i0.Input,
168
+ args: [{
169
+ isSignal: true,
170
+ alias: "showArrow",
171
+ required: false
172
+ }]
173
+ }],
174
+ openChange: [{
175
+ type: i0.Output,
176
+ args: ["openChange"]
177
+ }],
178
+ onDocumentClick: [{
179
+ type: HostListener,
180
+ args: ["document:click", ["$event"]]
181
+ }],
182
+ onEscape: [{
183
+ type: HostListener,
184
+ args: ["document:keydown.escape", ["$event"]]
185
+ }]
186
+ }
187
+ });
188
+ export { PopoverComponent };
189
+
190
+ //# sourceMappingURL=lifecorner-angular-ui-kit-popover.mjs.map