@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,105 @@
1
+ function parseRgb(color) {
2
+ const hex = color.trim().match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i);
3
+ if (hex) {
4
+ const h = hex[1];
5
+ const full = h.length === 3 ? h.split("").map((c) => c + c).join("") : h;
6
+ return [
7
+ 0,
8
+ 2,
9
+ 4
10
+ ].map((i) => parseInt(full.slice(i, i + 2), 16));
11
+ }
12
+ const rgb = color.match(/^rgba?\(([^)]+)\)/i);
13
+ if (rgb) {
14
+ const p = rgb[1].split(",").map((s) => parseFloat(s));
15
+ if (p.length >= 3 && p.every((n) => !Number.isNaN(n))) return [
16
+ p[0],
17
+ p[1],
18
+ p[2]
19
+ ];
20
+ }
21
+ return null;
22
+ }
23
+ function readableInk(fill) {
24
+ const rgb = parseRgb(fill);
25
+ if (!rgb) return null;
26
+ const [r, g, b] = rgb.map((c) => {
27
+ const s = c / 255;
28
+ return s <= .03928 ? s / 12.92 : Math.pow((s + .055) / 1.055, 2.4);
29
+ });
30
+ return .2126 * r + .7152 * g + .0722 * b > .4 ? "#111827" : "#f9fafb";
31
+ }
32
+ const CHART_PALETTE = [
33
+ "var(--color-primary-500)",
34
+ "var(--color-secondary-500)",
35
+ "var(--color-success-default)",
36
+ "var(--color-warning-default)",
37
+ "var(--color-error-default)",
38
+ "var(--color-info-default)",
39
+ "var(--color-primary-700)",
40
+ "var(--color-secondary-700)"
41
+ ];
42
+ function chartColor(index) {
43
+ return CHART_PALETTE[index % CHART_PALETTE.length];
44
+ }
45
+ function linearPath(points) {
46
+ if (points.length < 2) return "";
47
+ return points.map((p, i) => `${i === 0 ? "M" : "L"}${p.x},${p.y}`).join(" ");
48
+ }
49
+ function smoothPath(points) {
50
+ if (points.length < 2) return "";
51
+ let d = `M${points[0].x},${points[0].y}`;
52
+ for (let i = 0; i < points.length - 1; i++) {
53
+ const p0 = points[Math.max(i - 1, 0)];
54
+ const p1 = points[i];
55
+ const p2 = points[i + 1];
56
+ const p3 = points[Math.min(i + 2, points.length - 1)];
57
+ const cp1x = p1.x + (p2.x - p0.x) / 6;
58
+ const cp1y = p1.y + (p2.y - p0.y) / 6;
59
+ const cp2x = p2.x - (p3.x - p1.x) / 6;
60
+ const cp2y = p2.y - (p3.y - p1.y) / 6;
61
+ d += ` C${cp1x},${cp1y} ${cp2x},${cp2y} ${p2.x},${p2.y}`;
62
+ }
63
+ return d;
64
+ }
65
+ function toFinite(value, fallback = 0) {
66
+ return typeof value === "number" && Number.isFinite(value) ? value : fallback;
67
+ }
68
+ function cleanNumber(value) {
69
+ if (!Number.isFinite(value)) return 0;
70
+ const v = Number(value.toPrecision(12));
71
+ return v === 0 ? 0 : v;
72
+ }
73
+ function formatChartValue(value) {
74
+ return String(cleanNumber(value));
75
+ }
76
+ function niceStep(raw) {
77
+ if (!Number.isFinite(raw) || raw <= 0) return 1;
78
+ const magnitude = Math.pow(10, Math.floor(Math.log10(raw)));
79
+ const fraction = raw / magnitude;
80
+ return cleanNumber((fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 2.5 ? 2.5 : fraction <= 5 ? 5 : 10) * magnitude);
81
+ }
82
+ function niceScale(min, max, intervals = 4) {
83
+ let lo = Math.min(toFinite(min), toFinite(max));
84
+ let hi = Math.max(toFinite(min), toFinite(max));
85
+ if (lo === hi) {
86
+ if (lo > 0) lo = 0;
87
+ else if (lo < 0) hi = 0;
88
+ else hi = 1;
89
+ }
90
+ const step = niceStep((hi - lo) / Math.max(1, intervals));
91
+ const niceMin = cleanNumber(Math.floor(cleanNumber(lo / step)) * step);
92
+ const niceMax = cleanNumber(Math.ceil(cleanNumber(hi / step)) * step);
93
+ const count = Math.round((niceMax - niceMin) / step);
94
+ const ticks = [];
95
+ for (let i = 0; i <= count; i++) ticks.push(cleanNumber(niceMin + i * step));
96
+ return {
97
+ min: niceMin,
98
+ max: niceMax,
99
+ step,
100
+ ticks
101
+ };
102
+ }
103
+ export { CHART_PALETTE, chartColor, cleanNumber, formatChartValue, linearPath, niceScale, niceStep, parseRgb, readableInk, smoothPath, toFinite };
104
+
105
+ //# sourceMappingURL=lifecorner-angular-ui-kit-internal-chart.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecorner-angular-ui-kit-internal-chart.mjs","names":[],"sources":["../../../../libs/angular-ui-kit/src/lib/internal/chart/chart-color.ts","../../../../libs/angular-ui-kit/src/lib/internal/chart/chart-palette.ts","../../../../libs/angular-ui-kit/src/lib/internal/chart/chart-path.ts","../../../../libs/angular-ui-kit/src/lib/internal/chart/chart-scale.ts"],"sourcesContent":["/**\n * Colour helpers for text drawn on top of chart fills.\n */\n\n/** Parses `#rgb`, `#rrggbb`, `rgb()` and `rgba()`. Anything else → null. */\nexport function parseRgb(color: string): [number, number, number] | null {\n const hex = color.trim().match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i);\n if (hex) {\n const h = hex[1];\n const full = h.length === 3 ? h.split('').map(c => c + c).join('') : h;\n return [0, 2, 4].map(i => parseInt(full.slice(i, i + 2), 16)) as [number, number, number];\n }\n const rgb = color.match(/^rgba?\\(([^)]+)\\)/i);\n if (rgb) {\n const p = rgb[1].split(',').map(s => parseFloat(s));\n if (p.length >= 3 && p.every(n => !Number.isNaN(n))) return [p[0], p[1], p[2]];\n }\n return null;\n}\n\n/**\n * Ink that stays readable on `fill`, or `null` when that cannot be decided.\n *\n * A literal colour (`#…`, `rgb()`) is measured by its relative luminance and\n * gets a dark or light ink. A `var(--…)` token can't be resolved without the\n * DOM — and its resolution flips with the theme — so `null` is returned and\n * the caller should draw the label in `--color-text-primary` with a\n * `--color-surface` halo (`paint-order: stroke`), which reads on any fill in\n * both themes.\n */\nexport function readableInk(fill: string): string | null {\n const rgb = parseRgb(fill);\n if (!rgb) return null;\n const [r, g, b] = rgb.map(c => {\n const s = c / 255;\n return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\n });\n const luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b;\n return luminance > 0.4 ? '#111827' : '#f9fafb';\n}\n","/**\n * Default categorical palette for the chart family.\n *\n * Every entry is a theme token whose light *and* dark resolutions sit clearly\n * against `--color-surface`: the 500 brand shades and the status defaults flip\n * to their pastel tints in the dark theme, the 700 shades to their light tints,\n * so consecutive hues stay distinguishable on both themes. (The 300 shades and\n * `-light` status tints some charts used before resolve to dark, low-contrast\n * colours on the dark theme, which is why they are not in this list.)\n *\n * Charts fall back to this list when a series/segment brings no `color` of its\n * own; per-item colours always win.\n */\nexport const CHART_PALETTE: readonly string[] = [\n 'var(--color-primary-500)',\n 'var(--color-secondary-500)',\n 'var(--color-success-default)',\n 'var(--color-warning-default)',\n 'var(--color-error-default)',\n 'var(--color-info-default)',\n 'var(--color-primary-700)',\n 'var(--color-secondary-700)',\n];\n\n/** Palette colour for the series/segment at `index`, wrapping around. */\nexport function chartColor(index: number): string {\n return CHART_PALETTE[index % CHART_PALETTE.length];\n}\n","/**\n * SVG path builders shared by the line-shaped charts (line, area, sparkline).\n */\n\nexport interface ChartPoint {\n x: number;\n y: number;\n}\n\n/** `M x,y L x,y …` polyline through the points; '' for fewer than two points. */\nexport function linearPath(points: readonly ChartPoint[]): string {\n if (points.length < 2) return '';\n return points.map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x},${p.y}`).join(' ');\n}\n\n/**\n * Smooth cubic path through the points (Catmull-Rom → Bézier approximation);\n * '' for fewer than two points.\n */\nexport function smoothPath(points: readonly ChartPoint[]): string {\n if (points.length < 2) return '';\n let d = `M${points[0].x},${points[0].y}`;\n for (let i = 0; i < points.length - 1; i++) {\n const p0 = points[Math.max(i - 1, 0)];\n const p1 = points[i];\n const p2 = points[i + 1];\n const p3 = points[Math.min(i + 2, points.length - 1)];\n const cp1x = p1.x + (p2.x - p0.x) / 6;\n const cp1y = p1.y + (p2.y - p0.y) / 6;\n const cp2x = p2.x - (p3.x - p1.x) / 6;\n const cp2y = p2.y - (p3.y - p1.y) / 6;\n d += ` C${cp1x},${cp1y} ${cp2x},${cp2y} ${p2.x},${p2.y}`;\n }\n return d;\n}\n","/**\n * Numeric helpers shared by the chart family: a \"nice\" linear scale for axes\n * and grids, float-safe value formatting, and a NaN guard for caller data.\n *\n * Every chart used to place its grid on its own ad-hoc rounding\n * (`Math.ceil(max / 4)`, `Math.round(v * 10) / 10`, `toFixed`), which let the\n * top tick disagree with the value at the plot edge and leaked binary float\n * noise (`0.30000000000000004`) into tick labels. This module is the one\n * routine they all go through instead.\n */\n\n/** Signature of a chart's `formatValue` input. */\nexport type ChartValueFormatter = (value: number) => string;\n\n/** `value` if it is a finite number, otherwise `fallback` (NaN, ±Infinity, undefined, null…). */\nexport function toFinite(value: unknown, fallback = 0): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n}\n\n/** Strips binary float noise (0.1 + 0.2 → 0.3) and normalises -0 to 0. */\nexport function cleanNumber(value: number): number {\n if (!Number.isFinite(value)) return 0;\n const v = Number(value.toPrecision(12));\n return v === 0 ? 0 : v;\n}\n\n/** Default tick/value formatter: float-clean `String(value)`, no locale, no unit. */\nexport function formatChartValue(value: number): string {\n return String(cleanNumber(value));\n}\n\nexport interface NiceScale {\n /** Lower bound — a multiple of `step`, ≤ the requested min. */\n min: number;\n /** Upper bound — a multiple of `step`, ≥ the requested max. */\n max: number;\n /** Tick interval: 1, 2, 2.5 or 5 × 10ⁿ. */\n step: number;\n /** All tick values from `min` to `max` inclusive. */\n ticks: number[];\n}\n\n/** Rounds a raw interval up to the nearest 1, 2, 2.5 or 5 × 10ⁿ. */\nexport function niceStep(raw: number): number {\n if (!Number.isFinite(raw) || raw <= 0) return 1;\n const magnitude = Math.pow(10, Math.floor(Math.log10(raw)));\n const fraction = raw / magnitude;\n const nice = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 2.5 ? 2.5 : fraction <= 5 ? 5 : 10;\n return cleanNumber(nice * magnitude);\n}\n\n/**\n * Linear scale whose bounds are multiples of a nice step, so every tick label\n * is a round number and the outermost ticks equal the values at the plot\n * edges. Bounds are only ever extended outward, never shrunk. A degenerate\n * range (`min === max`) is widened towards zero, or to [0, 1] when both are 0.\n *\n * `intervals` is the *target* number of steps; the result may have one more\n * or fewer because the bounds snap to the step.\n */\nexport function niceScale(min: number, max: number, intervals = 4): NiceScale {\n let lo = Math.min(toFinite(min), toFinite(max));\n let hi = Math.max(toFinite(min), toFinite(max));\n if (lo === hi) {\n if (lo > 0) lo = 0;\n else if (lo < 0) hi = 0;\n else hi = 1;\n }\n const step = niceStep((hi - lo) / Math.max(1, intervals));\n // cleanNumber before floor/ceil: 0.3 / 0.1 is 2.9999999999999996, which would\n // otherwise floor to 2 and pull the bound one step too far out.\n const niceMin = cleanNumber(Math.floor(cleanNumber(lo / step)) * step);\n const niceMax = cleanNumber(Math.ceil(cleanNumber(hi / step)) * step);\n const count = Math.round((niceMax - niceMin) / step);\n const ticks: number[] = [];\n for (let i = 0; i <= count; i++) ticks.push(cleanNumber(niceMin + i * step));\n return { min: niceMin, max: niceMax, step, ticks };\n}\n"],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import * as i0 from "@angular/core";
2
+ import { Injectable } from "@angular/core";
3
+ var OverlayStackService = class OverlayStackService {
4
+ stack = [];
5
+ claimed = /* @__PURE__ */ new WeakSet();
6
+ push(id) {
7
+ this.remove(id);
8
+ this.stack.push(id);
9
+ }
10
+ remove(id) {
11
+ const index = this.stack.indexOf(id);
12
+ if (index !== -1) this.stack.splice(index, 1);
13
+ }
14
+ isTop(id) {
15
+ return this.stack.length > 0 && this.stack[this.stack.length - 1] === id;
16
+ }
17
+ claim(id, event) {
18
+ if (this.claimed.has(event) || !this.isTop(id)) return false;
19
+ this.claimed.add(event);
20
+ return true;
21
+ }
22
+ static ɵfac = i0.ɵɵngDeclareFactory({
23
+ minVersion: "12.0.0",
24
+ version: "22.2.2",
25
+ ngImport: i0,
26
+ type: OverlayStackService,
27
+ deps: [],
28
+ target: i0.ɵɵFactoryTarget.Injectable
29
+ });
30
+ static ɵprov = i0.ɵɵngDeclareInjectable({
31
+ minVersion: "12.0.0",
32
+ version: "22.2.2",
33
+ ngImport: i0,
34
+ type: OverlayStackService,
35
+ providedIn: "root"
36
+ });
37
+ };
38
+ i0.ɵɵngDeclareClassMetadata({
39
+ minVersion: "12.0.0",
40
+ version: "22.2.2",
41
+ ngImport: i0,
42
+ type: OverlayStackService,
43
+ decorators: [{
44
+ type: Injectable,
45
+ args: [{ providedIn: "root" }]
46
+ }]
47
+ });
48
+ export { OverlayStackService };
49
+
50
+ //# sourceMappingURL=lifecorner-angular-ui-kit-internal-overlay.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecorner-angular-ui-kit-internal-overlay.mjs","names":[],"sources":["../../../../libs/angular-ui-kit/src/lib/internal/overlay/overlay-stack.service.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n/**\n * Keeps the open overlays (modal, drawer, popover, menu, tooltip, …) in\n * opening order so that a dismiss gesture — Escape, click outside — reaches\n * only the top-most one instead of closing every open layer at once.\n *\n * Every overlay pushes its id when it opens and removes it when it closes or\n * is destroyed. Internal to the library; not part of the public API.\n */\n@Injectable({ providedIn: 'root' })\nexport class OverlayStackService {\n private readonly stack: string[] = [];\n\n /**\n * Events already consumed by an overlay. All overlays listen on `document`,\n * where listeners fire in registration order — not z-order — so by the time a\n * lower overlay's listener runs, the top one may already have closed and left\n * the stack, making the lower one \"top\" for the very same event.\n */\n private readonly claimed = new WeakSet<Event>();\n\n /** Register `id` as the new top-most overlay (re-pushing moves it to the top). */\n push(id: string): void {\n this.remove(id);\n this.stack.push(id);\n }\n\n remove(id: string): void {\n const index = this.stack.indexOf(id);\n if (index !== -1) this.stack.splice(index, 1);\n }\n\n isTop(id: string): boolean {\n return this.stack.length > 0 && this.stack[this.stack.length - 1] === id;\n }\n\n /**\n * Whether overlay `id` may act on this dismiss event. True only for the\n * top-most overlay and only once per event; the caller then closes and, for\n * keyboard events, stops propagation so nothing outside the stack sees it.\n */\n claim(id: string, event: Event): boolean {\n if (this.claimed.has(event) || !this.isTop(id)) return false;\n this.claimed.add(event);\n return true;\n }\n}\n"],"mappings":";;AAWA,IAAa,sBAAb,MAAa,oBAAmB;CACb,QAAkB,CAAA;CAQlB,0BAAU,IAAI,QAAO;CAGtC,KAAK,IAAU;EACb,KAAK,OAAO,EAAE;EACd,KAAK,MAAM,KAAK,EAAE;CACpB;CAEA,OAAO,IAAU;EACf,MAAM,QAAQ,KAAK,MAAM,QAAQ,EAAE;EACnC,IAAI,UAAU,IAAI,KAAK,MAAM,OAAO,OAAO,CAAC;CAC9C;CAEA,MAAM,IAAU;EACd,OAAO,KAAK,MAAM,SAAS,KAAK,KAAK,MAAM,KAAK,MAAM,SAAS,OAAO;CACxE;CAOA,MAAM,IAAY,OAAY;EAC5B,IAAI,KAAK,QAAQ,IAAI,KAAK,KAAK,CAAC,KAAK,MAAM,EAAE,GAAG,OAAO;EACvD,KAAK,QAAQ,IAAI,KAAK;EACtB,OAAO;CACT;CAnCW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAmB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAnB,OAAA,QAAA,GAAA,sBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAmB,YADN;CAAM,CAAA;;AACnB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EAD/B,MAAA;EAAW,MAAA,CAAA,EAAE,YAAY,OAAM,CAAE"}
@@ -0,0 +1,22 @@
1
+ const SCHEME = /^([a-z][a-z0-9+.-]*):/i;
2
+ function urlScheme(url) {
3
+ return SCHEME.exec(url.trim())?.[1]?.toLowerCase() ?? null;
4
+ }
5
+ function isSafeLinkUrl(url) {
6
+ const scheme = urlScheme(url);
7
+ return scheme === null || scheme === "http" || scheme === "https" || scheme === "mailto" || scheme === "tel";
8
+ }
9
+ function isSafeImageUrl(url) {
10
+ if (isSafeLinkUrl(url)) return true;
11
+ const scheme = urlScheme(url);
12
+ if (scheme === "blob") return true;
13
+ return scheme === "data" && /^data:image\/(png|jpe?g|gif|webp|svg\+xml|avif|bmp);/i.test(url.trim());
14
+ }
15
+ function isSafeResourceUrl(url) {
16
+ const scheme = urlScheme(url);
17
+ if (scheme === null || scheme === "http" || scheme === "https" || scheme === "blob") return true;
18
+ return scheme === "data" && /^data:application\/pdf[;,]/i.test(url.trim());
19
+ }
20
+ export { isSafeImageUrl, isSafeLinkUrl, isSafeResourceUrl, urlScheme };
21
+
22
+ //# sourceMappingURL=lifecorner-angular-ui-kit-internal-url.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecorner-angular-ui-kit-internal-url.mjs","names":[],"sources":["../../../../libs/angular-ui-kit/src/lib/internal/url/safe-url.ts"],"sourcesContent":["/**\n * URL scheme checks shared by the components that put caller- or user-supplied\n * URLs into `href`, `src`, iframe or download attributes.\n *\n * Angular's own sanitizer already refuses `javascript:` in a bound `[href]` or\n * `[src]`, but a URL that reaches the DOM through `bypassSecurityTrust*`, a\n * hand-built HTML string or a programmatic `a.click()` never meets it. These\n * helpers are the check those paths apply instead — allow-lists, not\n * deny-lists, so an unknown scheme is refused rather than let through.\n */\n\nconst SCHEME = /^([a-z][a-z0-9+.-]*):/i;\n\n/** The URL's scheme, lower-cased, or null for a relative URL / fragment / query. */\nexport function urlScheme(url: string): string | null {\n return SCHEME.exec(url.trim())?.[1]?.toLowerCase() ?? null;\n}\n\n/** For `<a href>`: http(s), mailto, tel, or relative. */\nexport function isSafeLinkUrl(url: string): boolean {\n const scheme = urlScheme(url);\n return scheme === null || scheme === 'http' || scheme === 'https' || scheme === 'mailto' || scheme === 'tel';\n}\n\n/** For `<img src>`: everything a link may be, plus blob: and data: images. */\nexport function isSafeImageUrl(url: string): boolean {\n if (isSafeLinkUrl(url)) return true;\n const scheme = urlScheme(url);\n if (scheme === 'blob') return true;\n return scheme === 'data' && /^data:image\\/(png|jpe?g|gif|webp|svg\\+xml|avif|bmp);/i.test(url.trim());\n}\n\n/**\n * For iframes and programmatic downloads: http(s), blob:, data: PDFs, or\n * relative. Stricter than a link — an iframe navigates a whole browsing\n * context, and a download link is clicked without the user seeing it.\n */\nexport function isSafeResourceUrl(url: string): boolean {\n const scheme = urlScheme(url);\n if (scheme === null || scheme === 'http' || scheme === 'https' || scheme === 'blob') return true;\n return scheme === 'data' && /^data:application\\/pdf[;,]/i.test(url.trim());\n}\n"],"mappings":"AAWA,MAAM,SAAS;AAGf,SAAgB,UAAU,KAAW;CACnC,OAAO,OAAO,KAAK,IAAI,KAAI,CAAE,CAAC,GAAG,EAAE,EAAE,YAAW,KAAM;AACxD;AAGA,SAAgB,cAAc,KAAW;CACvC,MAAM,SAAS,UAAU,GAAG;CAC5B,OAAO,WAAW,QAAQ,WAAW,UAAU,WAAW,WAAW,WAAW,YAAY,WAAW;AACzG;AAGA,SAAgB,eAAe,KAAW;CACxC,IAAI,cAAc,GAAG,GAAG,OAAO;CAC/B,MAAM,SAAS,UAAU,GAAG;CAC5B,IAAI,WAAW,QAAQ,OAAO;CAC9B,OAAO,WAAW,UAAU,wDAAwD,KAAK,IAAI,KAAI,CAAE;AACrG;AAOA,SAAgB,kBAAkB,KAAW;CAC3C,MAAM,SAAS,UAAU,GAAG;CAC5B,IAAI,WAAW,QAAQ,WAAW,UAAU,WAAW,WAAW,WAAW,QAAQ,OAAO;CAC5F,OAAO,WAAW,UAAU,8BAA8B,KAAK,IAAI,KAAI,CAAE;AAC3E"}
@@ -0,0 +1,319 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, ElementRef, Injector, afterNextRender, inject, input, linkedSignal, output, signal } from "@angular/core";
3
+ import { IconComponent } from "@lifecorner/angular-ui-kit/icon";
4
+ var KanbanBoardComponent = class KanbanBoardComponent {
5
+ columns = input.required(...ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []);
6
+ showCardCount = input(true, ...ngDevMode ? [{ debugName: "showCardCount" }] : /* istanbul ignore next */ []);
7
+ showWipLimit = input(true, ...ngDevMode ? [{ debugName: "showWipLimit" }] : /* istanbul ignore next */ []);
8
+ readonly = input(false, ...ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []);
9
+ emptyColumnLabel = input("Drop here", ...ngDevMode ? [{ debugName: "emptyColumnLabel" }] : /* istanbul ignore next */ []);
10
+ priorityAriaLabel = input("Priority:", ...ngDevMode ? [{ debugName: "priorityAriaLabel" }] : /* istanbul ignore next */ []);
11
+ cardMoved = output();
12
+ cardClick = output();
13
+ host = inject(ElementRef);
14
+ injector = inject(Injector);
15
+ internalColumns = linkedSignal(() => this.columns(), ...ngDevMode ? [{ debugName: "internalColumns" }] : /* istanbul ignore next */ []);
16
+ draggedCard = signal(null, ...ngDevMode ? [{ debugName: "draggedCard" }] : /* istanbul ignore next */ []);
17
+ dropTargetColumn = signal(null, ...ngDevMode ? [{ debugName: "dropTargetColumn" }] : /* istanbul ignore next */ []);
18
+ dropTargetIndex = signal(-1, ...ngDevMode ? [{ debugName: "dropTargetIndex" }] : /* istanbul ignore next */ []);
19
+ displayColumns = this.internalColumns.asReadonly();
20
+ isOverLimit(col) {
21
+ return !!col.limit && col.cards.length > col.limit;
22
+ }
23
+ getPriorityIcon(priority) {
24
+ switch (priority) {
25
+ case "critical": return "exclamation-circle";
26
+ case "high": return "arrow-up";
27
+ case "medium": return "minus";
28
+ case "low": return "arrow-down";
29
+ default: return "";
30
+ }
31
+ }
32
+ getPriorityColor(priority) {
33
+ switch (priority) {
34
+ case "critical": return "var(--color-error-default)";
35
+ case "high": return "var(--color-warning-default)";
36
+ case "medium": return "var(--color-info-default)";
37
+ case "low": return "var(--color-success-default)";
38
+ default: return "";
39
+ }
40
+ }
41
+ onDragStart(event, card, columnId) {
42
+ if (this.readonly()) {
43
+ event.preventDefault();
44
+ return;
45
+ }
46
+ this.draggedCard.set({
47
+ card,
48
+ columnId
49
+ });
50
+ if (event.dataTransfer) {
51
+ event.dataTransfer.effectAllowed = "move";
52
+ event.dataTransfer.setData("text/plain", card.id);
53
+ }
54
+ }
55
+ onDragOver(event, columnId, index) {
56
+ event.preventDefault();
57
+ if (event.dataTransfer) event.dataTransfer.dropEffect = "move";
58
+ this.dropTargetColumn.set(columnId);
59
+ this.dropTargetIndex.set(index);
60
+ }
61
+ onDragOverColumn(event, columnId) {
62
+ event.preventDefault();
63
+ if (event.dataTransfer) event.dataTransfer.dropEffect = "move";
64
+ this.dropTargetColumn.set(columnId);
65
+ }
66
+ onDragLeave() {
67
+ this.dropTargetColumn.set(null);
68
+ this.dropTargetIndex.set(-1);
69
+ }
70
+ onDrop(event, toColumnId, toIndex) {
71
+ event.preventDefault();
72
+ const dragged = this.draggedCard();
73
+ if (!dragged) return;
74
+ this.moveCard(dragged.card.id, dragged.columnId, toColumnId, toIndex);
75
+ this.draggedCard.set(null);
76
+ this.dropTargetColumn.set(null);
77
+ this.dropTargetIndex.set(-1);
78
+ }
79
+ onCardKeydown(event, card, columnId) {
80
+ if (event.key === "Enter" || event.key === " ") {
81
+ event.preventDefault();
82
+ this.onCardClick(card, columnId);
83
+ return;
84
+ }
85
+ if (!event.altKey || this.readonly()) return;
86
+ const cols = this.displayColumns();
87
+ const colIdx = cols.findIndex((c) => c.id === columnId);
88
+ if (colIdx < 0) return;
89
+ const cardIdx = cols[colIdx].cards.findIndex((c) => c.id === card.id);
90
+ if (cardIdx < 0) return;
91
+ let toColumnId;
92
+ let toIndex;
93
+ switch (event.key) {
94
+ case "ArrowLeft":
95
+ if (colIdx > 0) {
96
+ toColumnId = cols[colIdx - 1].id;
97
+ toIndex = cols[colIdx - 1].cards.length;
98
+ }
99
+ break;
100
+ case "ArrowRight":
101
+ if (colIdx < cols.length - 1) {
102
+ toColumnId = cols[colIdx + 1].id;
103
+ toIndex = cols[colIdx + 1].cards.length;
104
+ }
105
+ break;
106
+ case "ArrowUp":
107
+ if (cardIdx > 0) {
108
+ toColumnId = columnId;
109
+ toIndex = cardIdx - 1;
110
+ }
111
+ break;
112
+ case "ArrowDown":
113
+ if (cardIdx < cols[colIdx].cards.length - 1) {
114
+ toColumnId = columnId;
115
+ toIndex = cardIdx + 1;
116
+ }
117
+ break;
118
+ default: return;
119
+ }
120
+ event.preventDefault();
121
+ if (toColumnId === void 0) return;
122
+ this.moveCard(card.id, columnId, toColumnId, toIndex);
123
+ afterNextRender(() => {
124
+ const cards = this.host.nativeElement.querySelectorAll(".lc-kanban__card");
125
+ Array.from(cards).find((el) => el.dataset["cardId"] === card.id)?.focus();
126
+ }, { injector: this.injector });
127
+ }
128
+ moveCard(cardId, fromColumnId, toColumnId, toIndex) {
129
+ const cols = this.displayColumns().map((c) => ({
130
+ ...c,
131
+ cards: [...c.cards]
132
+ }));
133
+ const fromCol = cols.find((c) => c.id === fromColumnId);
134
+ const toCol = cols.find((c) => c.id === toColumnId);
135
+ if (!fromCol || !toCol) return;
136
+ const cardIdx = fromCol.cards.findIndex((c) => c.id === cardId);
137
+ if (cardIdx < 0) return;
138
+ const [card] = fromCol.cards.splice(cardIdx, 1);
139
+ const insertIdx = toIndex ?? toCol.cards.length;
140
+ toCol.cards.splice(insertIdx, 0, card);
141
+ this.internalColumns.set(cols);
142
+ this.cardMoved.emit({
143
+ cardId: card.id,
144
+ fromColumnId,
145
+ toColumnId,
146
+ toIndex: insertIdx
147
+ });
148
+ }
149
+ onDragEnd() {
150
+ this.draggedCard.set(null);
151
+ this.dropTargetColumn.set(null);
152
+ this.dropTargetIndex.set(-1);
153
+ }
154
+ onCardClick(card, columnId) {
155
+ this.cardClick.emit({
156
+ card,
157
+ columnId
158
+ });
159
+ }
160
+ static ɵfac = i0.ɵɵngDeclareFactory({
161
+ minVersion: "12.0.0",
162
+ version: "22.2.2",
163
+ ngImport: i0,
164
+ type: KanbanBoardComponent,
165
+ deps: [],
166
+ target: i0.ɵɵFactoryTarget.Component
167
+ });
168
+ static ɵcmp = i0.ɵɵngDeclareComponent({
169
+ minVersion: "17.0.0",
170
+ version: "22.2.2",
171
+ type: KanbanBoardComponent,
172
+ isStandalone: true,
173
+ selector: "lc-kanban-board",
174
+ inputs: {
175
+ columns: {
176
+ classPropertyName: "columns",
177
+ publicName: "columns",
178
+ isSignal: true,
179
+ isRequired: true,
180
+ transformFunction: null
181
+ },
182
+ showCardCount: {
183
+ classPropertyName: "showCardCount",
184
+ publicName: "showCardCount",
185
+ isSignal: true,
186
+ isRequired: false,
187
+ transformFunction: null
188
+ },
189
+ showWipLimit: {
190
+ classPropertyName: "showWipLimit",
191
+ publicName: "showWipLimit",
192
+ isSignal: true,
193
+ isRequired: false,
194
+ transformFunction: null
195
+ },
196
+ readonly: {
197
+ classPropertyName: "readonly",
198
+ publicName: "readonly",
199
+ isSignal: true,
200
+ isRequired: false,
201
+ transformFunction: null
202
+ },
203
+ emptyColumnLabel: {
204
+ classPropertyName: "emptyColumnLabel",
205
+ publicName: "emptyColumnLabel",
206
+ isSignal: true,
207
+ isRequired: false,
208
+ transformFunction: null
209
+ },
210
+ priorityAriaLabel: {
211
+ classPropertyName: "priorityAriaLabel",
212
+ publicName: "priorityAriaLabel",
213
+ isSignal: true,
214
+ isRequired: false,
215
+ transformFunction: null
216
+ }
217
+ },
218
+ outputs: {
219
+ cardMoved: "cardMoved",
220
+ cardClick: "cardClick"
221
+ },
222
+ ngImport: i0,
223
+ template: "<div class=\"lc-kanban\">\n @for (col of displayColumns(); track col.id) {\n <div\n class=\"lc-kanban__column\"\n [class.lc-kanban__column--drop-target]=\"dropTargetColumn() === col.id\"\n [class.lc-kanban__column--over-limit]=\"showWipLimit() && isOverLimit(col)\"\n (dragover)=\"onDragOverColumn($event, col.id)\"\n (dragleave)=\"onDragLeave()\"\n (drop)=\"onDrop($event, col.id)\"\n >\n <div class=\"lc-kanban__column-header\">\n @if (col.color) {\n <span class=\"lc-kanban__column-dot\" [style.background]=\"col.color\"></span>\n }\n <span class=\"lc-kanban__column-title\">{{ col.title }}</span>\n @if (showCardCount()) {\n <span class=\"lc-kanban__column-count\">{{ col.cards.length }}</span>\n }\n @if (showWipLimit() && col.limit) {\n <span class=\"lc-kanban__column-limit\" [class.lc-kanban__column-limit--over]=\"isOverLimit(col)\">\n / {{ col.limit }}\n </span>\n }\n </div>\n\n <div class=\"lc-kanban__cards\">\n @for (card of col.cards; track card.id) {\n <div\n class=\"lc-kanban__card\"\n role=\"button\"\n tabindex=\"0\"\n [attr.data-card-id]=\"card.id\"\n [attr.aria-keyshortcuts]=\"readonly() ? null : 'Alt+ArrowLeft Alt+ArrowRight Alt+ArrowUp Alt+ArrowDown'\"\n [class.lc-kanban__card--dragging]=\"draggedCard()?.card?.id === card.id\"\n [class.lc-kanban__card--readonly]=\"readonly()\"\n [attr.draggable]=\"!readonly()\"\n (dragstart)=\"onDragStart($event, card, col.id)\"\n (dragover)=\"onDragOver($event, col.id, $index)\"\n (drop)=\"onDrop($event, col.id, $index)\"\n (dragend)=\"onDragEnd()\"\n (click)=\"onCardClick(card, col.id)\"\n (keydown)=\"onCardKeydown($event, card, col.id)\"\n >\n @if (card.priority) {\n <lc-icon [name]=\"getPriorityIcon(card.priority)\" size=\"xs\" [color]=\"getPriorityColor(card.priority)\" class=\"lc-kanban__card-priority\" [ariaLabel]=\"priorityAriaLabel() + ' ' + card.priority\"></lc-icon>\n }\n <span class=\"lc-kanban__card-title\">{{ card.title }}</span>\n\n @if (card.description) {\n <p class=\"lc-kanban__card-desc\">{{ card.description }}</p>\n }\n\n @if (card.labels?.length || card.assignee) {\n <div class=\"lc-kanban__card-footer\">\n @if (card.labels?.length) {\n <div class=\"lc-kanban__card-labels\">\n @for (label of card.labels; track label.text) {\n <span class=\"lc-kanban__card-label\" [style.--label-color]=\"label.color || 'var(--color-primary-500)'\">{{ label.text }}</span>\n }\n </div>\n }\n @if (card.assignee) {\n <span class=\"lc-kanban__card-assignee\">{{ card.assignee }}</span>\n }\n </div>\n }\n </div>\n }\n\n <!-- Empty state drop zone -->\n @if (col.cards.length === 0) {\n <div\n class=\"lc-kanban__empty\"\n (dragover)=\"onDragOver($event, col.id, 0)\"\n (drop)=\"onDrop($event, col.id, 0)\"\n >\n {{ emptyColumnLabel() }}\n </div>\n }\n </div>\n </div>\n }\n</div>\n",
224
+ styles: [":host{display:block;overflow-x:auto}.lc-kanban{display:flex;gap:16px;padding:8px;min-height:200px}.lc-kanban__column{flex:0 0 280px;display:flex;flex-direction:column;background:var(--color-surface-2);border-radius:8px;padding:8px;transition:background .15s,box-shadow .15s}.lc-kanban__column--drop-target{background:var(--color-primary-50);box-shadow:inset 0 0 0 2px var(--color-primary-300)}.lc-kanban__column--over-limit{background:var(--color-error-50, #fef2f2)}.lc-kanban__column-header{display:flex;align-items:center;gap:6px;padding:4px 4px 8px;font-size:var(--typography-font-size-sm, .875rem);font-weight:600;color:var(--color-text-secondary)}.lc-kanban__column-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.lc-kanban__column-title{flex:1}.lc-kanban__column-count{font-size:.6875rem;background:var(--color-surface-hover);color:var(--color-text-secondary);padding:1px 6px;border-radius:10px;font-weight:500}.lc-kanban__column-limit{font-size:.6875rem;color:var(--color-text-tertiary)}.lc-kanban__column-limit--over{color:var(--color-error-default);font-weight:700}.lc-kanban__cards{flex:1;display:flex;flex-direction:column;gap:8px;min-height:40px}.lc-kanban__card{background:var(--color-surface);border:1px solid var(--color-border);border-radius:6px;padding:10px;cursor:grab;transition:box-shadow .15s,opacity .15s}.lc-kanban__card:hover{box-shadow:var(--elevation-1)}.lc-kanban__card:focus-visible{outline:none;box-shadow:0 0 0 3px color-mix(in srgb,var(--color-primary-500) 20%,transparent);border-color:var(--color-primary-500)}.lc-kanban__card--dragging{opacity:.4}.lc-kanban__card:active{cursor:grabbing}.lc-kanban__card--readonly,.lc-kanban__card--readonly:active{cursor:pointer}.lc-kanban__card-priority{flex-shrink:0;margin-right:4px}.lc-kanban__card-title{font-size:var(--typography-font-size-sm, .875rem);font-weight:500;color:var(--color-text-primary)}.lc-kanban__card-desc{margin:4px 0 0;font-size:.75rem;color:var(--color-text-tertiary);line-height:1.4;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.lc-kanban__card-footer{display:flex;align-items:center;justify-content:space-between;gap:4px;margin-top:8px}.lc-kanban__card-labels{display:flex;flex-wrap:wrap;gap:4px}.lc-kanban__card-label{display:inline-block;padding:1px 8px;border-radius:var(--border-radius-full);font-size:.625rem;font-weight:600;--label-color: var(--color-primary-500);background:color-mix(in srgb,var(--label-color) 20%,transparent);border:1px solid color-mix(in srgb,var(--label-color) 45%,transparent);color:var(--color-text-primary)}.lc-kanban__card-assignee{font-size:.6875rem;color:var(--color-text-tertiary);font-weight:500}.lc-kanban__empty{display:flex;align-items:center;justify-content:center;min-height:60px;border:2px dashed var(--color-border);border-radius:6px;font-size:.75rem;color:var(--color-text-tertiary)}\n"],
225
+ dependencies: [{
226
+ kind: "component",
227
+ type: IconComponent,
228
+ selector: "lc-icon",
229
+ inputs: [
230
+ "name",
231
+ "variant",
232
+ "size",
233
+ "color",
234
+ "ariaLabel",
235
+ "decorative",
236
+ "strict"
237
+ ]
238
+ }],
239
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
240
+ });
241
+ };
242
+ i0.ɵɵngDeclareClassMetadata({
243
+ minVersion: "12.0.0",
244
+ version: "22.2.2",
245
+ ngImport: i0,
246
+ type: KanbanBoardComponent,
247
+ decorators: [{
248
+ type: Component,
249
+ args: [{
250
+ selector: "lc-kanban-board",
251
+ standalone: true,
252
+ imports: [IconComponent],
253
+ changeDetection: ChangeDetectionStrategy.OnPush,
254
+ template: "<div class=\"lc-kanban\">\n @for (col of displayColumns(); track col.id) {\n <div\n class=\"lc-kanban__column\"\n [class.lc-kanban__column--drop-target]=\"dropTargetColumn() === col.id\"\n [class.lc-kanban__column--over-limit]=\"showWipLimit() && isOverLimit(col)\"\n (dragover)=\"onDragOverColumn($event, col.id)\"\n (dragleave)=\"onDragLeave()\"\n (drop)=\"onDrop($event, col.id)\"\n >\n <div class=\"lc-kanban__column-header\">\n @if (col.color) {\n <span class=\"lc-kanban__column-dot\" [style.background]=\"col.color\"></span>\n }\n <span class=\"lc-kanban__column-title\">{{ col.title }}</span>\n @if (showCardCount()) {\n <span class=\"lc-kanban__column-count\">{{ col.cards.length }}</span>\n }\n @if (showWipLimit() && col.limit) {\n <span class=\"lc-kanban__column-limit\" [class.lc-kanban__column-limit--over]=\"isOverLimit(col)\">\n / {{ col.limit }}\n </span>\n }\n </div>\n\n <div class=\"lc-kanban__cards\">\n @for (card of col.cards; track card.id) {\n <div\n class=\"lc-kanban__card\"\n role=\"button\"\n tabindex=\"0\"\n [attr.data-card-id]=\"card.id\"\n [attr.aria-keyshortcuts]=\"readonly() ? null : 'Alt+ArrowLeft Alt+ArrowRight Alt+ArrowUp Alt+ArrowDown'\"\n [class.lc-kanban__card--dragging]=\"draggedCard()?.card?.id === card.id\"\n [class.lc-kanban__card--readonly]=\"readonly()\"\n [attr.draggable]=\"!readonly()\"\n (dragstart)=\"onDragStart($event, card, col.id)\"\n (dragover)=\"onDragOver($event, col.id, $index)\"\n (drop)=\"onDrop($event, col.id, $index)\"\n (dragend)=\"onDragEnd()\"\n (click)=\"onCardClick(card, col.id)\"\n (keydown)=\"onCardKeydown($event, card, col.id)\"\n >\n @if (card.priority) {\n <lc-icon [name]=\"getPriorityIcon(card.priority)\" size=\"xs\" [color]=\"getPriorityColor(card.priority)\" class=\"lc-kanban__card-priority\" [ariaLabel]=\"priorityAriaLabel() + ' ' + card.priority\"></lc-icon>\n }\n <span class=\"lc-kanban__card-title\">{{ card.title }}</span>\n\n @if (card.description) {\n <p class=\"lc-kanban__card-desc\">{{ card.description }}</p>\n }\n\n @if (card.labels?.length || card.assignee) {\n <div class=\"lc-kanban__card-footer\">\n @if (card.labels?.length) {\n <div class=\"lc-kanban__card-labels\">\n @for (label of card.labels; track label.text) {\n <span class=\"lc-kanban__card-label\" [style.--label-color]=\"label.color || 'var(--color-primary-500)'\">{{ label.text }}</span>\n }\n </div>\n }\n @if (card.assignee) {\n <span class=\"lc-kanban__card-assignee\">{{ card.assignee }}</span>\n }\n </div>\n }\n </div>\n }\n\n <!-- Empty state drop zone -->\n @if (col.cards.length === 0) {\n <div\n class=\"lc-kanban__empty\"\n (dragover)=\"onDragOver($event, col.id, 0)\"\n (drop)=\"onDrop($event, col.id, 0)\"\n >\n {{ emptyColumnLabel() }}\n </div>\n }\n </div>\n </div>\n }\n</div>\n",
255
+ styles: [":host{display:block;overflow-x:auto}.lc-kanban{display:flex;gap:16px;padding:8px;min-height:200px}.lc-kanban__column{flex:0 0 280px;display:flex;flex-direction:column;background:var(--color-surface-2);border-radius:8px;padding:8px;transition:background .15s,box-shadow .15s}.lc-kanban__column--drop-target{background:var(--color-primary-50);box-shadow:inset 0 0 0 2px var(--color-primary-300)}.lc-kanban__column--over-limit{background:var(--color-error-50, #fef2f2)}.lc-kanban__column-header{display:flex;align-items:center;gap:6px;padding:4px 4px 8px;font-size:var(--typography-font-size-sm, .875rem);font-weight:600;color:var(--color-text-secondary)}.lc-kanban__column-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.lc-kanban__column-title{flex:1}.lc-kanban__column-count{font-size:.6875rem;background:var(--color-surface-hover);color:var(--color-text-secondary);padding:1px 6px;border-radius:10px;font-weight:500}.lc-kanban__column-limit{font-size:.6875rem;color:var(--color-text-tertiary)}.lc-kanban__column-limit--over{color:var(--color-error-default);font-weight:700}.lc-kanban__cards{flex:1;display:flex;flex-direction:column;gap:8px;min-height:40px}.lc-kanban__card{background:var(--color-surface);border:1px solid var(--color-border);border-radius:6px;padding:10px;cursor:grab;transition:box-shadow .15s,opacity .15s}.lc-kanban__card:hover{box-shadow:var(--elevation-1)}.lc-kanban__card:focus-visible{outline:none;box-shadow:0 0 0 3px color-mix(in srgb,var(--color-primary-500) 20%,transparent);border-color:var(--color-primary-500)}.lc-kanban__card--dragging{opacity:.4}.lc-kanban__card:active{cursor:grabbing}.lc-kanban__card--readonly,.lc-kanban__card--readonly:active{cursor:pointer}.lc-kanban__card-priority{flex-shrink:0;margin-right:4px}.lc-kanban__card-title{font-size:var(--typography-font-size-sm, .875rem);font-weight:500;color:var(--color-text-primary)}.lc-kanban__card-desc{margin:4px 0 0;font-size:.75rem;color:var(--color-text-tertiary);line-height:1.4;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.lc-kanban__card-footer{display:flex;align-items:center;justify-content:space-between;gap:4px;margin-top:8px}.lc-kanban__card-labels{display:flex;flex-wrap:wrap;gap:4px}.lc-kanban__card-label{display:inline-block;padding:1px 8px;border-radius:var(--border-radius-full);font-size:.625rem;font-weight:600;--label-color: var(--color-primary-500);background:color-mix(in srgb,var(--label-color) 20%,transparent);border:1px solid color-mix(in srgb,var(--label-color) 45%,transparent);color:var(--color-text-primary)}.lc-kanban__card-assignee{font-size:.6875rem;color:var(--color-text-tertiary);font-weight:500}.lc-kanban__empty{display:flex;align-items:center;justify-content:center;min-height:60px;border:2px dashed var(--color-border);border-radius:6px;font-size:.75rem;color:var(--color-text-tertiary)}\n"]
256
+ }]
257
+ }],
258
+ propDecorators: {
259
+ columns: [{
260
+ type: i0.Input,
261
+ args: [{
262
+ isSignal: true,
263
+ alias: "columns",
264
+ required: true
265
+ }]
266
+ }],
267
+ showCardCount: [{
268
+ type: i0.Input,
269
+ args: [{
270
+ isSignal: true,
271
+ alias: "showCardCount",
272
+ required: false
273
+ }]
274
+ }],
275
+ showWipLimit: [{
276
+ type: i0.Input,
277
+ args: [{
278
+ isSignal: true,
279
+ alias: "showWipLimit",
280
+ required: false
281
+ }]
282
+ }],
283
+ readonly: [{
284
+ type: i0.Input,
285
+ args: [{
286
+ isSignal: true,
287
+ alias: "readonly",
288
+ required: false
289
+ }]
290
+ }],
291
+ emptyColumnLabel: [{
292
+ type: i0.Input,
293
+ args: [{
294
+ isSignal: true,
295
+ alias: "emptyColumnLabel",
296
+ required: false
297
+ }]
298
+ }],
299
+ priorityAriaLabel: [{
300
+ type: i0.Input,
301
+ args: [{
302
+ isSignal: true,
303
+ alias: "priorityAriaLabel",
304
+ required: false
305
+ }]
306
+ }],
307
+ cardMoved: [{
308
+ type: i0.Output,
309
+ args: ["cardMoved"]
310
+ }],
311
+ cardClick: [{
312
+ type: i0.Output,
313
+ args: ["cardClick"]
314
+ }]
315
+ }
316
+ });
317
+ export { KanbanBoardComponent };
318
+
319
+ //# sourceMappingURL=lifecorner-angular-ui-kit-kanban-board.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecorner-angular-ui-kit-kanban-board.mjs","names":[],"sources":["../../../../libs/angular-ui-kit/src/lib/kanban-board/kanban-board.component.ts","../../../../libs/angular-ui-kit/src/lib/kanban-board/kanban-board.component.html"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Injector,\n afterNextRender,\n inject,\n input,\n linkedSignal,\n signal,\n output,\n} from '@angular/core';\nimport { IconComponent } from '@lifecorner/angular-ui-kit/icon';\n\nexport interface KanbanCard {\n id: string;\n title: string;\n description?: string;\n labels?: KanbanLabel[];\n assignee?: string;\n priority?: 'low' | 'medium' | 'high' | 'critical';\n}\n\nexport interface KanbanLabel {\n text: string;\n color?: string;\n}\n\nexport interface KanbanColumn {\n id: string;\n title: string;\n cards: KanbanCard[];\n color?: string;\n limit?: number;\n}\n\nexport interface KanbanMoveEvent {\n cardId: string;\n fromColumnId: string;\n toColumnId: string;\n toIndex: number;\n}\n\n@Component({\n selector: 'lc-kanban-board',\n standalone: true,\n imports: [IconComponent],\n templateUrl: './kanban-board.component.html',\n styleUrls: ['./kanban-board.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class KanbanBoardComponent {\n readonly columns = input.required<KanbanColumn[]>();\n readonly showCardCount = input(true);\n readonly showWipLimit = input(true);\n readonly readonly = input(false);\n\n /** Placeholder text of an empty column. */\n readonly emptyColumnLabel = input('Drop here');\n\n /** Accessible name prefix of a card's priority marker, followed by the priority. */\n readonly priorityAriaLabel = input('Priority:');\n\n readonly cardMoved = output<KanbanMoveEvent>();\n readonly cardClick = output<{ card: KanbanCard; columnId: string }>();\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n\n /**\n * Local working copy of the columns. Re-seeded from the `columns` input\n * whenever the parent provides a new value, while drops / keyboard moves\n * update it locally without waiting for the parent to echo the change back.\n */\n protected internalColumns = linkedSignal<KanbanColumn[]>(() => this.columns());\n protected draggedCard = signal<{ card: KanbanCard; columnId: string } | null>(null);\n protected dropTargetColumn = signal<string | null>(null);\n protected dropTargetIndex = signal<number>(-1);\n\n protected readonly displayColumns = this.internalColumns.asReadonly();\n\n protected isOverLimit(col: KanbanColumn): boolean {\n return !!col.limit && col.cards.length > col.limit;\n }\n\n protected getPriorityIcon(priority?: string): string {\n switch (priority) {\n case 'critical': return 'exclamation-circle';\n case 'high': return 'arrow-up';\n case 'medium': return 'minus';\n case 'low': return 'arrow-down';\n default: return '';\n }\n }\n\n protected getPriorityColor(priority?: string): string {\n switch (priority) {\n case 'critical': return 'var(--color-error-default)';\n case 'high': return 'var(--color-warning-default)';\n case 'medium': return 'var(--color-info-default)';\n case 'low': return 'var(--color-success-default)';\n default: return '';\n }\n }\n\n protected onDragStart(event: DragEvent, card: KanbanCard, columnId: string): void {\n if (this.readonly()) { event.preventDefault(); return; }\n this.draggedCard.set({ card, columnId });\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', card.id);\n }\n }\n\n protected onDragOver(event: DragEvent, columnId: string, index: number): void {\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move';\n this.dropTargetColumn.set(columnId);\n this.dropTargetIndex.set(index);\n }\n\n protected onDragOverColumn(event: DragEvent, columnId: string): void {\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move';\n this.dropTargetColumn.set(columnId);\n }\n\n protected onDragLeave(): void {\n this.dropTargetColumn.set(null);\n this.dropTargetIndex.set(-1);\n }\n\n protected onDrop(event: DragEvent, toColumnId: string, toIndex?: number): void {\n event.preventDefault();\n const dragged = this.draggedCard();\n if (!dragged) return;\n\n this.moveCard(dragged.card.id, dragged.columnId, toColumnId, toIndex);\n this.draggedCard.set(null);\n this.dropTargetColumn.set(null);\n this.dropTargetIndex.set(-1);\n }\n\n /**\n * Keyboard alternative to drag & drop: Enter / Space activate the card,\n * Alt+ArrowLeft / Alt+ArrowRight move it to the neighbouring column,\n * Alt+ArrowUp / Alt+ArrowDown reorder it within its column. Moves are\n * suppressed in readonly mode, exactly like drag & drop.\n */\n protected onCardKeydown(event: KeyboardEvent, card: KanbanCard, columnId: string): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.onCardClick(card, columnId);\n return;\n }\n if (!event.altKey || this.readonly()) return;\n\n const cols = this.displayColumns();\n const colIdx = cols.findIndex(c => c.id === columnId);\n if (colIdx < 0) return;\n const cardIdx = cols[colIdx].cards.findIndex(c => c.id === card.id);\n if (cardIdx < 0) return;\n\n let toColumnId: string | undefined;\n let toIndex: number | undefined;\n switch (event.key) {\n case 'ArrowLeft':\n if (colIdx > 0) { toColumnId = cols[colIdx - 1].id; toIndex = cols[colIdx - 1].cards.length; }\n break;\n case 'ArrowRight':\n if (colIdx < cols.length - 1) { toColumnId = cols[colIdx + 1].id; toIndex = cols[colIdx + 1].cards.length; }\n break;\n case 'ArrowUp':\n if (cardIdx > 0) { toColumnId = columnId; toIndex = cardIdx - 1; }\n break;\n case 'ArrowDown':\n if (cardIdx < cols[colIdx].cards.length - 1) { toColumnId = columnId; toIndex = cardIdx + 1; }\n break;\n default:\n return;\n }\n event.preventDefault();\n if (toColumnId === undefined) return;\n\n this.moveCard(card.id, columnId, toColumnId, toIndex);\n // The card element is re-created inside the target column's @for block,\n // so keyboard focus has to be restored explicitly after the next render.\n afterNextRender(\n () => {\n const cards = this.host.nativeElement.querySelectorAll<HTMLElement>('.lc-kanban__card');\n Array.from(cards).find(el => el.dataset['cardId'] === card.id)?.focus();\n },\n { injector: this.injector },\n );\n }\n\n /** Moves a card between / within columns and emits `cardMoved`. */\n private moveCard(cardId: string, fromColumnId: string, toColumnId: string, toIndex?: number): void {\n const cols = this.displayColumns().map(c => ({ ...c, cards: [...c.cards] }));\n const fromCol = cols.find(c => c.id === fromColumnId);\n const toCol = cols.find(c => c.id === toColumnId);\n if (!fromCol || !toCol) return;\n\n const cardIdx = fromCol.cards.findIndex(c => c.id === cardId);\n if (cardIdx < 0) return;\n\n const [card] = fromCol.cards.splice(cardIdx, 1);\n const insertIdx = toIndex ?? toCol.cards.length;\n toCol.cards.splice(insertIdx, 0, card);\n\n this.internalColumns.set(cols);\n\n this.cardMoved.emit({\n cardId: card.id,\n fromColumnId,\n toColumnId,\n toIndex: insertIdx,\n });\n }\n\n protected onDragEnd(): void {\n this.draggedCard.set(null);\n this.dropTargetColumn.set(null);\n this.dropTargetIndex.set(-1);\n }\n\n protected onCardClick(card: KanbanCard, columnId: string): void {\n this.cardClick.emit({ card, columnId });\n }\n\n}\n","<div class=\"lc-kanban\">\n @for (col of displayColumns(); track col.id) {\n <div\n class=\"lc-kanban__column\"\n [class.lc-kanban__column--drop-target]=\"dropTargetColumn() === col.id\"\n [class.lc-kanban__column--over-limit]=\"showWipLimit() && isOverLimit(col)\"\n (dragover)=\"onDragOverColumn($event, col.id)\"\n (dragleave)=\"onDragLeave()\"\n (drop)=\"onDrop($event, col.id)\"\n >\n <div class=\"lc-kanban__column-header\">\n @if (col.color) {\n <span class=\"lc-kanban__column-dot\" [style.background]=\"col.color\"></span>\n }\n <span class=\"lc-kanban__column-title\">{{ col.title }}</span>\n @if (showCardCount()) {\n <span class=\"lc-kanban__column-count\">{{ col.cards.length }}</span>\n }\n @if (showWipLimit() && col.limit) {\n <span class=\"lc-kanban__column-limit\" [class.lc-kanban__column-limit--over]=\"isOverLimit(col)\">\n / {{ col.limit }}\n </span>\n }\n </div>\n\n <div class=\"lc-kanban__cards\">\n @for (card of col.cards; track card.id) {\n <div\n class=\"lc-kanban__card\"\n role=\"button\"\n tabindex=\"0\"\n [attr.data-card-id]=\"card.id\"\n [attr.aria-keyshortcuts]=\"readonly() ? null : 'Alt+ArrowLeft Alt+ArrowRight Alt+ArrowUp Alt+ArrowDown'\"\n [class.lc-kanban__card--dragging]=\"draggedCard()?.card?.id === card.id\"\n [class.lc-kanban__card--readonly]=\"readonly()\"\n [attr.draggable]=\"!readonly()\"\n (dragstart)=\"onDragStart($event, card, col.id)\"\n (dragover)=\"onDragOver($event, col.id, $index)\"\n (drop)=\"onDrop($event, col.id, $index)\"\n (dragend)=\"onDragEnd()\"\n (click)=\"onCardClick(card, col.id)\"\n (keydown)=\"onCardKeydown($event, card, col.id)\"\n >\n @if (card.priority) {\n <lc-icon [name]=\"getPriorityIcon(card.priority)\" size=\"xs\" [color]=\"getPriorityColor(card.priority)\" class=\"lc-kanban__card-priority\" [ariaLabel]=\"priorityAriaLabel() + ' ' + card.priority\"></lc-icon>\n }\n <span class=\"lc-kanban__card-title\">{{ card.title }}</span>\n\n @if (card.description) {\n <p class=\"lc-kanban__card-desc\">{{ card.description }}</p>\n }\n\n @if (card.labels?.length || card.assignee) {\n <div class=\"lc-kanban__card-footer\">\n @if (card.labels?.length) {\n <div class=\"lc-kanban__card-labels\">\n @for (label of card.labels; track label.text) {\n <span class=\"lc-kanban__card-label\" [style.--label-color]=\"label.color || 'var(--color-primary-500)'\">{{ label.text }}</span>\n }\n </div>\n }\n @if (card.assignee) {\n <span class=\"lc-kanban__card-assignee\">{{ card.assignee }}</span>\n }\n </div>\n }\n </div>\n }\n\n <!-- Empty state drop zone -->\n @if (col.cards.length === 0) {\n <div\n class=\"lc-kanban__empty\"\n (dragover)=\"onDragOver($event, col.id, 0)\"\n (drop)=\"onDrop($event, col.id, 0)\"\n >\n {{ emptyColumnLabel() }}\n </div>\n }\n </div>\n </div>\n }\n</div>\n"],"mappings":"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"}