@kouji-ui/components 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (730) hide show
  1. package/.turbo/turbo-build.log +29 -0
  2. package/CHANGELOG.md +192 -0
  3. package/ng-package.json +7 -0
  4. package/package.json +43 -0
  5. package/src/accordion/_examples/accordion.default.example.ts +31 -0
  6. package/src/accordion/_examples/accordion.disabled.example.ts +38 -0
  7. package/src/accordion/_examples/accordion.multiple.example.ts +31 -0
  8. package/src/accordion/_examples/accordion.rich-content.example.ts +49 -0
  9. package/src/accordion/_examples/index.ts +6 -0
  10. package/src/accordion/accordion.arrow-nav.example.ts +39 -0
  11. package/src/accordion/accordion.css +68 -0
  12. package/src/accordion/accordion.playground.ts +119 -0
  13. package/src/accordion/accordion.spec.ts +117 -0
  14. package/src/accordion/accordion.ts +153 -0
  15. package/src/accordion/accordion.usage.example.ts +38 -0
  16. package/src/accordion/accordion.value.example.ts +60 -0
  17. package/src/accordion/index.ts +1 -0
  18. package/src/alert/_examples/alert.banner.example.ts +56 -0
  19. package/src/alert/_examples/alert.dismissible.example.ts +53 -0
  20. package/src/alert/_examples/alert.example.ts +40 -0
  21. package/src/alert/_examples/alert.variants.example.ts +66 -0
  22. package/src/alert/_examples/alert.with-actions.example.ts +57 -0
  23. package/src/alert/_examples/index.ts +7 -0
  24. package/src/alert/alert.css +133 -0
  25. package/src/alert/alert.playground.ts +111 -0
  26. package/src/alert/alert.spec.ts +167 -0
  27. package/src/alert/alert.ts +250 -0
  28. package/src/alert/alert.usage.example.ts +58 -0
  29. package/src/alert/index.ts +8 -0
  30. package/src/avatar/_examples/avatar-group.example.ts +31 -0
  31. package/src/avatar/_examples/avatar-group.list.example.ts +45 -0
  32. package/src/avatar/_examples/avatar-group.overflow.example.ts +33 -0
  33. package/src/avatar/_examples/avatar-group.shapes.example.ts +39 -0
  34. package/src/avatar/_examples/avatar-group.sizes.example.ts +44 -0
  35. package/src/avatar/_examples/avatar.default.example.ts +18 -0
  36. package/src/avatar/_examples/avatar.initials.example.ts +20 -0
  37. package/src/avatar/_examples/avatar.shapes.example.ts +22 -0
  38. package/src/avatar/_examples/avatar.sizes.example.ts +26 -0
  39. package/src/avatar/_examples/avatar.with-image.example.ts +20 -0
  40. package/src/avatar/_examples/index.ts +12 -0
  41. package/src/avatar/avatar-group.spec.ts +138 -0
  42. package/src/avatar/avatar-group.ts +127 -0
  43. package/src/avatar/avatar-group.usage.example.ts +30 -0
  44. package/src/avatar/avatar.css +58 -0
  45. package/src/avatar/avatar.playground.ts +95 -0
  46. package/src/avatar/avatar.ts +123 -0
  47. package/src/avatar/index.ts +2 -0
  48. package/src/badge/_examples/badge.default.example.ts +18 -0
  49. package/src/badge/_examples/badge.sizes.example.ts +25 -0
  50. package/src/badge/_examples/badge.variants.example.ts +24 -0
  51. package/src/badge/_examples/badge.with-dot.example.ts +31 -0
  52. package/src/badge/_examples/badge.with-icon.example.ts +23 -0
  53. package/src/badge/_examples/index.ts +7 -0
  54. package/src/badge/badge.css +59 -0
  55. package/src/badge/badge.playground.ts +49 -0
  56. package/src/badge/badge.ts +86 -0
  57. package/src/badge/badge.usage.example.ts +22 -0
  58. package/src/badge/index.ts +1 -0
  59. package/src/breadcrumb/_examples/breadcrumb.custom-separator.example.ts +53 -0
  60. package/src/breadcrumb/_examples/breadcrumb.example.ts +48 -0
  61. package/src/breadcrumb/_examples/breadcrumb.long-path.example.ts +58 -0
  62. package/src/breadcrumb/_examples/breadcrumb.truncated.example.ts +59 -0
  63. package/src/breadcrumb/_examples/breadcrumb.with-icons.example.ts +66 -0
  64. package/src/breadcrumb/_examples/index.ts +7 -0
  65. package/src/breadcrumb/breadcrumb.css +121 -0
  66. package/src/breadcrumb/breadcrumb.playground.ts +93 -0
  67. package/src/breadcrumb/breadcrumb.spec.ts +230 -0
  68. package/src/breadcrumb/breadcrumb.ts +272 -0
  69. package/src/breadcrumb/breadcrumb.usage.example.ts +45 -0
  70. package/src/breadcrumb/index.ts +1 -0
  71. package/src/button/_examples/button.anchor.example.ts +18 -0
  72. package/src/button/_examples/button.configured.example.ts +43 -0
  73. package/src/button/_examples/button.disabled.example.ts +25 -0
  74. package/src/button/_examples/button.example.ts +22 -0
  75. package/src/button/_examples/button.icon.example.ts +27 -0
  76. package/src/button/_examples/button.loading.example.ts +31 -0
  77. package/src/button/_examples/button.pressed.example.ts +24 -0
  78. package/src/button/_examples/button.sizes.example.ts +26 -0
  79. package/src/button/_examples/button.usage.example.ts +66 -0
  80. package/src/button/_examples/button.variants.example.ts +26 -0
  81. package/src/button/_examples/index.ts +12 -0
  82. package/src/button/button.css +263 -0
  83. package/src/button/button.playground.ts +79 -0
  84. package/src/button/button.spec.ts +100 -0
  85. package/src/button/button.ts +150 -0
  86. package/src/button/index.ts +1 -0
  87. package/src/button-group/_examples/button-group.example.ts +30 -0
  88. package/src/button-group/_examples/button-group.icon-only.example.ts +30 -0
  89. package/src/button-group/_examples/button-group.toggle.example.ts +36 -0
  90. package/src/button-group/_examples/button-group.variants.example.ts +40 -0
  91. package/src/button-group/_examples/button-group.vertical.example.ts +29 -0
  92. package/src/button-group/_examples/index.ts +7 -0
  93. package/src/button-group/button-group.css +80 -0
  94. package/src/button-group/button-group.playground.ts +94 -0
  95. package/src/button-group/button-group.spec.ts +119 -0
  96. package/src/button-group/button-group.ts +130 -0
  97. package/src/button-group/button-group.usage.example.ts +35 -0
  98. package/src/button-group/index.ts +1 -0
  99. package/src/calendar/_examples/calendar.example.ts +33 -0
  100. package/src/calendar/_examples/index.ts +3 -0
  101. package/src/calendar/calendar.css +129 -0
  102. package/src/calendar/calendar.playground.ts +84 -0
  103. package/src/calendar/calendar.spec.ts +50 -0
  104. package/src/calendar/calendar.ts +171 -0
  105. package/src/calendar/calendar.usage.example.ts +33 -0
  106. package/src/calendar/index.ts +1 -0
  107. package/src/card/_examples/card.cover.example.ts +53 -0
  108. package/src/card/_examples/card.example.ts +27 -0
  109. package/src/card/_examples/card.full.example.ts +51 -0
  110. package/src/card/_examples/index.ts +5 -0
  111. package/src/card/card.css +120 -0
  112. package/src/card/card.playground.ts +116 -0
  113. package/src/card/card.spec.ts +50 -0
  114. package/src/card/card.ts +194 -0
  115. package/src/card/card.usage.example.ts +46 -0
  116. package/src/card/index.ts +1 -0
  117. package/src/carousel/_examples/carousel.autoplay.example.ts +69 -0
  118. package/src/carousel/_examples/carousel.example.ts +60 -0
  119. package/src/carousel/_examples/carousel.indicators.example.ts +64 -0
  120. package/src/carousel/_examples/carousel.lazy-load.example.ts +85 -0
  121. package/src/carousel/_examples/carousel.tabs-pattern.example.ts +61 -0
  122. package/src/carousel/_examples/index.ts +7 -0
  123. package/src/carousel/carousel.css +181 -0
  124. package/src/carousel/carousel.playground.ts +135 -0
  125. package/src/carousel/carousel.spec.ts +211 -0
  126. package/src/carousel/carousel.ts +399 -0
  127. package/src/carousel/carousel.usage.example.ts +46 -0
  128. package/src/carousel/index.ts +1 -0
  129. package/src/cascade-select/_examples/cascade-select.data-driven.example.ts +119 -0
  130. package/src/cascade-select/_examples/cascade-select.disabled.example.ts +74 -0
  131. package/src/cascade-select/_examples/cascade-select.example.ts +80 -0
  132. package/src/cascade-select/_examples/cascade-select.field.example.ts +73 -0
  133. package/src/cascade-select/_examples/cascade-select.path.example.ts +85 -0
  134. package/src/cascade-select/_examples/index.ts +7 -0
  135. package/src/cascade-select/cascade-select.css +120 -0
  136. package/src/cascade-select/cascade-select.playground.ts +133 -0
  137. package/src/cascade-select/cascade-select.ts +201 -0
  138. package/src/cascade-select/cascade-select.usage.example.ts +44 -0
  139. package/src/cascade-select/index.ts +5 -0
  140. package/src/chat/_examples/chat-bubble.example.ts +71 -0
  141. package/src/chat/_examples/chat-bubble.grouped.example.ts +69 -0
  142. package/src/chat/_examples/chat-bubble.sides.example.ts +41 -0
  143. package/src/chat/_examples/chat-bubble.variants.example.ts +58 -0
  144. package/src/chat/_examples/chat-bubble.with-state.example.ts +57 -0
  145. package/src/chat/_examples/index.ts +7 -0
  146. package/src/chat/chat.css +231 -0
  147. package/src/chat/chat.playground.ts +171 -0
  148. package/src/chat/chat.spec.ts +343 -0
  149. package/src/chat/chat.ts +269 -0
  150. package/src/chat/chat.usage.example.ts +49 -0
  151. package/src/chat/index.ts +13 -0
  152. package/src/checkbox/_examples/checkbox.checked.example.ts +20 -0
  153. package/src/checkbox/_examples/checkbox.default.example.ts +20 -0
  154. package/src/checkbox/_examples/checkbox.disabled.example.ts +26 -0
  155. package/src/checkbox/_examples/checkbox.indeterminate.example.ts +20 -0
  156. package/src/checkbox/_examples/checkbox.usage.example.ts +62 -0
  157. package/src/checkbox/_examples/index.ts +7 -0
  158. package/src/checkbox/checkbox.css +74 -0
  159. package/src/checkbox/checkbox.playground.ts +68 -0
  160. package/src/checkbox/checkbox.ts +122 -0
  161. package/src/checkbox/index.ts +1 -0
  162. package/src/color-picker/_examples/color-picker.alpha.example.ts +36 -0
  163. package/src/color-picker/_examples/color-picker.example.ts +34 -0
  164. package/src/color-picker/_examples/color-picker.hex-input.example.ts +53 -0
  165. package/src/color-picker/_examples/color-picker.in-form.example.ts +60 -0
  166. package/src/color-picker/_examples/color-picker.usage.example.ts +58 -0
  167. package/src/color-picker/_examples/color-picker.with-presets.example.ts +45 -0
  168. package/src/color-picker/_examples/index.ts +8 -0
  169. package/src/color-picker/color-picker.css +183 -0
  170. package/src/color-picker/color-picker.playground.ts +83 -0
  171. package/src/color-picker/color-picker.spec.ts +94 -0
  172. package/src/color-picker/color-picker.ts +234 -0
  173. package/src/color-picker/index.ts +1 -0
  174. package/src/combobox/_examples/combobox.async.example.ts +85 -0
  175. package/src/combobox/_examples/combobox.empty-state.example.ts +36 -0
  176. package/src/combobox/_examples/combobox.example.ts +36 -0
  177. package/src/combobox/_examples/combobox.free-text.example.ts +42 -0
  178. package/src/combobox/_examples/combobox.usage.example.ts +51 -0
  179. package/src/combobox/_examples/combobox.with-icons.example.ts +49 -0
  180. package/src/combobox/_examples/index.ts +8 -0
  181. package/src/combobox/combobox.css +101 -0
  182. package/src/combobox/combobox.playground.ts +90 -0
  183. package/src/combobox/combobox.spec.ts +111 -0
  184. package/src/combobox/combobox.ts +219 -0
  185. package/src/combobox/index.ts +6 -0
  186. package/src/command-palette/_examples/command-palette.async.example.ts +99 -0
  187. package/src/command-palette/_examples/command-palette.dialog.example.ts +90 -0
  188. package/src/command-palette/_examples/command-palette.example.ts +40 -0
  189. package/src/command-palette/_examples/command-palette.fuzzy.example.ts +54 -0
  190. package/src/command-palette/_examples/command-palette.groups.example.ts +55 -0
  191. package/src/command-palette/_examples/command-palette.usage.example.ts +49 -0
  192. package/src/command-palette/_examples/index.ts +8 -0
  193. package/src/command-palette/command-palette.css +234 -0
  194. package/src/command-palette/command-palette.playground.ts +119 -0
  195. package/src/command-palette/command-palette.ts +448 -0
  196. package/src/command-palette/index.ts +10 -0
  197. package/src/confirm-popup/_examples/confirm-popup.destructive.example.ts +72 -0
  198. package/src/confirm-popup/_examples/confirm-popup.example.ts +82 -0
  199. package/src/confirm-popup/_examples/confirm-popup.placement.example.ts +97 -0
  200. package/src/confirm-popup/_examples/confirm-popup.usage.example.ts +94 -0
  201. package/src/confirm-popup/_examples/confirm-popup.with-message.example.ts +76 -0
  202. package/src/confirm-popup/_examples/index.ts +7 -0
  203. package/src/confirm-popup/confirm-popup.css +47 -0
  204. package/src/confirm-popup/confirm-popup.playground.ts +109 -0
  205. package/src/confirm-popup/confirm-popup.spec.ts +209 -0
  206. package/src/confirm-popup/confirm-popup.ts +279 -0
  207. package/src/confirm-popup/index.ts +1 -0
  208. package/src/date-picker/_examples/date-picker.disabled-dates.example.ts +44 -0
  209. package/src/date-picker/_examples/date-picker.example.ts +38 -0
  210. package/src/date-picker/_examples/date-picker.locale.example.ts +50 -0
  211. package/src/date-picker/_examples/date-picker.readonly.example.ts +32 -0
  212. package/src/date-picker/_examples/date-picker.usage.example.ts +60 -0
  213. package/src/date-picker/_examples/date-picker.with-min-max.example.ts +47 -0
  214. package/src/date-picker/_examples/index.ts +8 -0
  215. package/src/date-picker/date-picker.css +61 -0
  216. package/src/date-picker/date-picker.playground.ts +79 -0
  217. package/src/date-picker/date-picker.spec.ts +71 -0
  218. package/src/date-picker/date-picker.ts +185 -0
  219. package/src/date-picker/index.ts +1 -0
  220. package/src/dialog/_examples/dialog.confirmation.example.ts +30 -0
  221. package/src/dialog/_examples/dialog.default.example.ts +30 -0
  222. package/src/dialog/_examples/dialog.nested.example.ts +86 -0
  223. package/src/dialog/_examples/dialog.scrollable.example.ts +30 -0
  224. package/src/dialog/_examples/dialog.usage.example.ts +57 -0
  225. package/src/dialog/_examples/dialog.with-form.example.ts +48 -0
  226. package/src/dialog/_examples/index.ts +8 -0
  227. package/src/dialog/dialog.css +56 -0
  228. package/src/dialog/dialog.playground.ts +136 -0
  229. package/src/dialog/dialog.ts +82 -0
  230. package/src/dialog/index.ts +1 -0
  231. package/src/divider/_examples/divider.example.ts +27 -0
  232. package/src/divider/_examples/divider.sizes.example.ts +33 -0
  233. package/src/divider/_examples/divider.structural.example.ts +55 -0
  234. package/src/divider/_examples/divider.usage.example.ts +48 -0
  235. package/src/divider/_examples/divider.variants.example.ts +33 -0
  236. package/src/divider/_examples/divider.vertical.example.ts +38 -0
  237. package/src/divider/_examples/divider.with-content.example.ts +38 -0
  238. package/src/divider/_examples/index.ts +9 -0
  239. package/src/divider/divider.css +93 -0
  240. package/src/divider/divider.playground.ts +97 -0
  241. package/src/divider/divider.spec.ts +207 -0
  242. package/src/divider/divider.ts +220 -0
  243. package/src/divider/index.ts +1 -0
  244. package/src/drawer/_examples/drawer.example.ts +30 -0
  245. package/src/drawer/_examples/drawer.modal-vs-non-modal.example.ts +27 -0
  246. package/src/drawer/_examples/drawer.scrollable.example.ts +30 -0
  247. package/src/drawer/_examples/drawer.sides.example.ts +32 -0
  248. package/src/drawer/_examples/drawer.usage.example.ts +56 -0
  249. package/src/drawer/_examples/drawer.with-form.example.ts +48 -0
  250. package/src/drawer/_examples/index.ts +8 -0
  251. package/src/drawer/drawer.css +130 -0
  252. package/src/drawer/drawer.playground.ts +107 -0
  253. package/src/drawer/drawer.spec.ts +216 -0
  254. package/src/drawer/drawer.ts +85 -0
  255. package/src/drawer/index.ts +1 -0
  256. package/src/dropdown-menu/_examples/dropdown-menu.disabled.example.ts +19 -0
  257. package/src/dropdown-menu/_examples/dropdown-menu.example.ts +20 -0
  258. package/src/dropdown-menu/_examples/dropdown-menu.shortcuts.example.ts +31 -0
  259. package/src/dropdown-menu/_examples/dropdown-menu.sides.example.ts +18 -0
  260. package/src/dropdown-menu/_examples/dropdown-menu.usage.example.ts +56 -0
  261. package/src/dropdown-menu/_examples/dropdown-menu.with-icons.example.ts +31 -0
  262. package/src/dropdown-menu/_examples/dropdown-menu.with-separator.example.ts +41 -0
  263. package/src/dropdown-menu/_examples/index.ts +9 -0
  264. package/src/dropdown-menu/dropdown-menu.css +108 -0
  265. package/src/dropdown-menu/dropdown-menu.playground.ts +109 -0
  266. package/src/dropdown-menu/dropdown-menu.spec.ts +5 -0
  267. package/src/dropdown-menu/dropdown-menu.ts +128 -0
  268. package/src/dropdown-menu/index.ts +1 -0
  269. package/src/empty-state/_examples/empty-state.error.example.ts +63 -0
  270. package/src/empty-state/_examples/empty-state.example.ts +59 -0
  271. package/src/empty-state/_examples/empty-state.search.example.ts +82 -0
  272. package/src/empty-state/_examples/empty-state.sizes.example.ts +76 -0
  273. package/src/empty-state/_examples/empty-state.usage.example.ts +66 -0
  274. package/src/empty-state/_examples/empty-state.with-actions.example.ts +68 -0
  275. package/src/empty-state/_examples/index.ts +8 -0
  276. package/src/empty-state/empty-state.css +114 -0
  277. package/src/empty-state/empty-state.playground.ts +87 -0
  278. package/src/empty-state/empty-state.spec.ts +211 -0
  279. package/src/empty-state/empty-state.ts +276 -0
  280. package/src/empty-state/index.ts +1 -0
  281. package/src/example-components.ts +396 -0
  282. package/src/field/_examples/field.disabled.example.ts +49 -0
  283. package/src/field/_examples/field.example.ts +51 -0
  284. package/src/field/_examples/field.required.example.ts +46 -0
  285. package/src/field/_examples/field.with-error.example.ts +73 -0
  286. package/src/field/_examples/field.with-prefix-suffix.example.ts +63 -0
  287. package/src/field/_examples/index.ts +7 -0
  288. package/src/field/field.css +138 -0
  289. package/src/field/field.playground.ts +108 -0
  290. package/src/field/field.spec.ts +132 -0
  291. package/src/field/field.ts +232 -0
  292. package/src/field/field.usage.example.ts +63 -0
  293. package/src/field/index.ts +7 -0
  294. package/src/file-upload/_examples/file-upload.dropzone.example.ts +32 -0
  295. package/src/file-upload/_examples/file-upload.example.ts +29 -0
  296. package/src/file-upload/_examples/file-upload.image-preview.example.ts +31 -0
  297. package/src/file-upload/_examples/file-upload.multiple.example.ts +23 -0
  298. package/src/file-upload/_examples/file-upload.with-progress.example.ts +59 -0
  299. package/src/file-upload/_examples/index.ts +7 -0
  300. package/src/file-upload/file-upload.css +207 -0
  301. package/src/file-upload/file-upload.playground.ts +84 -0
  302. package/src/file-upload/file-upload.spec.ts +94 -0
  303. package/src/file-upload/file-upload.ts +301 -0
  304. package/src/file-upload/file-upload.usage.example.ts +45 -0
  305. package/src/file-upload/index.ts +1 -0
  306. package/src/form/_examples/form.async-submit.example.ts +72 -0
  307. package/src/form/_examples/form.compound.example.ts +93 -0
  308. package/src/form/_examples/form.example.ts +70 -0
  309. package/src/form/_examples/form.validation.example.ts +67 -0
  310. package/src/form/_examples/index.ts +6 -0
  311. package/src/form/form.css +63 -0
  312. package/src/form/form.playground.ts +145 -0
  313. package/src/form/form.spec.ts +96 -0
  314. package/src/form/form.ts +216 -0
  315. package/src/form/form.usage.example.ts +63 -0
  316. package/src/form/index.ts +5 -0
  317. package/src/icon/_examples/icon.gallery.example.ts +199 -0
  318. package/src/icon/_examples/icon.usage.example.ts +46 -0
  319. package/src/icon/_examples/index.ts +4 -0
  320. package/src/icon/icon.playground.ts +63 -0
  321. package/src/icon/index.ts +5 -0
  322. package/src/icon/lucide/icon-names.generated.ts +1708 -0
  323. package/src/icon/lucide/icon-names.ts +18 -0
  324. package/src/icon/lucide/index.ts +2 -0
  325. package/src/icon/lucide/provide-lucide-icons.ts +96 -0
  326. package/src/input/_examples/index.ts +4 -0
  327. package/src/input/_examples/input.color.example.ts +33 -0
  328. package/src/input/_examples/input.example.ts +22 -0
  329. package/src/input/index.ts +1 -0
  330. package/src/input/input.css +70 -0
  331. package/src/input/input.playground.ts +79 -0
  332. package/src/input/input.spec.ts +98 -0
  333. package/src/input/input.ts +158 -0
  334. package/src/input/input.usage.example.ts +40 -0
  335. package/src/input-group/_examples/index.ts +7 -0
  336. package/src/input-group/_examples/input-group.button.example.ts +43 -0
  337. package/src/input-group/_examples/input-group.example.ts +39 -0
  338. package/src/input-group/_examples/input-group.icon.example.ts +49 -0
  339. package/src/input-group/_examples/input-group.url.example.ts +36 -0
  340. package/src/input-group/_examples/input-group.variants.example.ts +39 -0
  341. package/src/input-group/index.ts +1 -0
  342. package/src/input-group/input-group.css +125 -0
  343. package/src/input-group/input-group.playground.ts +90 -0
  344. package/src/input-group/input-group.ts +142 -0
  345. package/src/input-group/input-group.usage.example.ts +47 -0
  346. package/src/input-mask/_examples/index.ts +8 -0
  347. package/src/input-mask/_examples/input-mask.credit-card.example.ts +90 -0
  348. package/src/input-mask/_examples/input-mask.custom-tokens.example.ts +87 -0
  349. package/src/input-mask/_examples/input-mask.date.example.ts +61 -0
  350. package/src/input-mask/_examples/input-mask.example.ts +61 -0
  351. package/src/input-mask/_examples/input-mask.usage.example.ts +44 -0
  352. package/src/input-mask/_examples/input-mask.validation.example.ts +80 -0
  353. package/src/input-mask/index.ts +9 -0
  354. package/src/input-mask/input-mask.css +39 -0
  355. package/src/input-mask/input-mask.playground.ts +79 -0
  356. package/src/input-mask/input-mask.ts +130 -0
  357. package/src/input-otp/_examples/index.ts +8 -0
  358. package/src/input-otp/_examples/input-otp.autosubmit.example.ts +71 -0
  359. package/src/input-otp/_examples/input-otp.example.ts +47 -0
  360. package/src/input-otp/_examples/input-otp.lengths.example.ts +67 -0
  361. package/src/input-otp/_examples/input-otp.masked.example.ts +46 -0
  362. package/src/input-otp/_examples/input-otp.reactive.example.ts +58 -0
  363. package/src/input-otp/_examples/input-otp.separator.example.ts +49 -0
  364. package/src/input-otp/index.ts +1 -0
  365. package/src/input-otp/input-otp.css +87 -0
  366. package/src/input-otp/input-otp.playground.ts +107 -0
  367. package/src/input-otp/input-otp.ts +244 -0
  368. package/src/input-otp/input-otp.usage.example.ts +45 -0
  369. package/src/kbd/_examples/index.ts +6 -0
  370. package/src/kbd/_examples/kbd.combo.example.ts +24 -0
  371. package/src/kbd/_examples/kbd.example.ts +22 -0
  372. package/src/kbd/_examples/kbd.in-tooltip.example.ts +43 -0
  373. package/src/kbd/_examples/kbd.sizes.example.ts +31 -0
  374. package/src/kbd/index.ts +1 -0
  375. package/src/kbd/kbd.css +67 -0
  376. package/src/kbd/kbd.playground.ts +51 -0
  377. package/src/kbd/kbd.spec.ts +123 -0
  378. package/src/kbd/kbd.ts +123 -0
  379. package/src/kbd/kbd.usage.example.ts +38 -0
  380. package/src/link/_examples/index.ts +8 -0
  381. package/src/link/_examples/link.disabled.example.ts +23 -0
  382. package/src/link/_examples/link.example.ts +26 -0
  383. package/src/link/_examples/link.external.example.ts +33 -0
  384. package/src/link/_examples/link.in-prose.example.ts +36 -0
  385. package/src/link/_examples/link.sizes.example.ts +28 -0
  386. package/src/link/_examples/link.variants.example.ts +25 -0
  387. package/src/link/index.ts +1 -0
  388. package/src/link/link.css +104 -0
  389. package/src/link/link.playground.ts +98 -0
  390. package/src/link/link.spec.ts +146 -0
  391. package/src/link/link.ts +133 -0
  392. package/src/link/link.usage.example.ts +37 -0
  393. package/src/list/_examples/index.ts +7 -0
  394. package/src/list/_examples/list.divided.example.ts +32 -0
  395. package/src/list/_examples/list.example.ts +31 -0
  396. package/src/list/_examples/list.interactive.example.ts +51 -0
  397. package/src/list/_examples/list.nav.example.ts +44 -0
  398. package/src/list/_examples/list.with-icons.example.ts +97 -0
  399. package/src/list/index.ts +1 -0
  400. package/src/list/list.css +166 -0
  401. package/src/list/list.playground.ts +90 -0
  402. package/src/list/list.spec.ts +121 -0
  403. package/src/list/list.ts +227 -0
  404. package/src/list/list.usage.example.ts +45 -0
  405. package/src/menubar/_examples/index.ts +6 -0
  406. package/src/menubar/_examples/menubar.disabled-item.example.ts +23 -0
  407. package/src/menubar/_examples/menubar.example.ts +22 -0
  408. package/src/menubar/_examples/menubar.with-shortcuts.example.ts +33 -0
  409. package/src/menubar/_examples/menubar.with-submenu.example.ts +76 -0
  410. package/src/menubar/index.ts +1 -0
  411. package/src/menubar/menubar.css +62 -0
  412. package/src/menubar/menubar.playground.ts +96 -0
  413. package/src/menubar/menubar.ts +160 -0
  414. package/src/menubar/menubar.usage.example.ts +33 -0
  415. package/src/number-input/_examples/index.ts +7 -0
  416. package/src/number-input/_examples/number-input.currency.example.ts +35 -0
  417. package/src/number-input/_examples/number-input.decimal.example.ts +34 -0
  418. package/src/number-input/_examples/number-input.example.ts +24 -0
  419. package/src/number-input/_examples/number-input.min-max.example.ts +33 -0
  420. package/src/number-input/_examples/number-input.with-stepper.example.ts +45 -0
  421. package/src/number-input/index.ts +1 -0
  422. package/src/number-input/number-input.css +115 -0
  423. package/src/number-input/number-input.playground.ts +92 -0
  424. package/src/number-input/number-input.spec.ts +102 -0
  425. package/src/number-input/number-input.ts +212 -0
  426. package/src/number-input/number-input.usage.example.ts +73 -0
  427. package/src/overlay/overlay.css +32 -0
  428. package/src/overlay-badge/_examples/index.ts +7 -0
  429. package/src/overlay-badge/_examples/overlay-badge.described.example.ts +36 -0
  430. package/src/overlay-badge/_examples/overlay-badge.dot.example.ts +28 -0
  431. package/src/overlay-badge/_examples/overlay-badge.example.ts +34 -0
  432. package/src/overlay-badge/_examples/overlay-badge.on-avatar.example.ts +38 -0
  433. package/src/overlay-badge/_examples/overlay-badge.positions.example.ts +39 -0
  434. package/src/overlay-badge/index.ts +1 -0
  435. package/src/overlay-badge/overlay-badge.css +118 -0
  436. package/src/overlay-badge/overlay-badge.playground.ts +92 -0
  437. package/src/overlay-badge/overlay-badge.spec.ts +174 -0
  438. package/src/overlay-badge/overlay-badge.ts +232 -0
  439. package/src/overlay-badge/overlay-badge.usage.example.ts +44 -0
  440. package/src/pagination/_examples/index.ts +7 -0
  441. package/src/pagination/_examples/pagination.boundaries.example.ts +56 -0
  442. package/src/pagination/_examples/pagination.compact.example.ts +42 -0
  443. package/src/pagination/_examples/pagination.example.ts +55 -0
  444. package/src/pagination/_examples/pagination.large.example.ts +54 -0
  445. package/src/pagination/_examples/pagination.with-info.example.ts +49 -0
  446. package/src/pagination/index.ts +1 -0
  447. package/src/pagination/pagination.css +146 -0
  448. package/src/pagination/pagination.playground.ts +107 -0
  449. package/src/pagination/pagination.spec.ts +202 -0
  450. package/src/pagination/pagination.ts +432 -0
  451. package/src/pagination/pagination.usage.example.ts +50 -0
  452. package/src/password-input/_examples/index.ts +6 -0
  453. package/src/password-input/_examples/password-input.example.ts +24 -0
  454. package/src/password-input/_examples/password-input.strength.example.ts +45 -0
  455. package/src/password-input/_examples/password-input.toggle.example.ts +43 -0
  456. package/src/password-input/_examples/password-input.with-rules.example.ts +78 -0
  457. package/src/password-input/index.ts +1 -0
  458. package/src/password-input/password-input.css +155 -0
  459. package/src/password-input/password-input.playground.ts +81 -0
  460. package/src/password-input/password-input.spec.ts +129 -0
  461. package/src/password-input/password-input.ts +254 -0
  462. package/src/password-input/password-input.usage.example.ts +55 -0
  463. package/src/playground-types.ts +47 -0
  464. package/src/popover/_examples/index.ts +7 -0
  465. package/src/popover/_examples/popover.cancellable.example.ts +20 -0
  466. package/src/popover/_examples/popover.example.ts +20 -0
  467. package/src/popover/_examples/popover.modal.example.ts +22 -0
  468. package/src/popover/_examples/popover.sides.example.ts +37 -0
  469. package/src/popover/_examples/popover.with-form.example.ts +38 -0
  470. package/src/popover/index.ts +1 -0
  471. package/src/popover/popover.css +71 -0
  472. package/src/popover/popover.playground.ts +86 -0
  473. package/src/popover/popover.spec.ts +5 -0
  474. package/src/popover/popover.ts +94 -0
  475. package/src/popover/popover.usage.example.ts +48 -0
  476. package/src/progress-bar/_examples/index.ts +7 -0
  477. package/src/progress-bar/_examples/progress-bar.example.ts +22 -0
  478. package/src/progress-bar/_examples/progress-bar.indeterminate.example.ts +23 -0
  479. package/src/progress-bar/_examples/progress-bar.sizes.example.ts +29 -0
  480. package/src/progress-bar/_examples/progress-bar.variants.example.ts +30 -0
  481. package/src/progress-bar/_examples/progress-bar.with-label.example.ts +30 -0
  482. package/src/progress-bar/index.ts +1 -0
  483. package/src/progress-bar/progress-bar.css +113 -0
  484. package/src/progress-bar/progress-bar.playground.ts +87 -0
  485. package/src/progress-bar/progress-bar.spec.ts +233 -0
  486. package/src/progress-bar/progress-bar.ts +155 -0
  487. package/src/progress-bar/progress-bar.usage.example.ts +52 -0
  488. package/src/public-api.ts +61 -0
  489. package/src/radio/_examples/index.ts +6 -0
  490. package/src/radio/_examples/radio.default.example.ts +26 -0
  491. package/src/radio/_examples/radio.disabled.example.ts +26 -0
  492. package/src/radio/_examples/radio.group.example.ts +27 -0
  493. package/src/radio/_examples/radio.inline.example.ts +26 -0
  494. package/src/radio/index.ts +1 -0
  495. package/src/radio/radio.css +58 -0
  496. package/src/radio/radio.playground.ts +90 -0
  497. package/src/radio/radio.ts +143 -0
  498. package/src/radio/radio.usage.example.ts +54 -0
  499. package/src/select/_examples/index.ts +6 -0
  500. package/src/select/_examples/select.default.example.ts +26 -0
  501. package/src/select/_examples/select.disabled.example.ts +24 -0
  502. package/src/select/_examples/select.grouped.example.ts +37 -0
  503. package/src/select/_examples/select.placeholder.example.ts +26 -0
  504. package/src/select/index.ts +1 -0
  505. package/src/select/select.css +65 -0
  506. package/src/select/select.playground.ts +81 -0
  507. package/src/select/select.ts +176 -0
  508. package/src/select/select.usage.example.ts +64 -0
  509. package/src/skeleton/_examples/index.ts +6 -0
  510. package/src/skeleton/_examples/skeleton.animations.example.ts +52 -0
  511. package/src/skeleton/_examples/skeleton.card.example.ts +68 -0
  512. package/src/skeleton/_examples/skeleton.example.ts +24 -0
  513. package/src/skeleton/_examples/skeleton.shapes.example.ts +55 -0
  514. package/src/skeleton/index.ts +1 -0
  515. package/src/skeleton/skeleton.css +111 -0
  516. package/src/skeleton/skeleton.playground.ts +80 -0
  517. package/src/skeleton/skeleton.spec.ts +126 -0
  518. package/src/skeleton/skeleton.ts +155 -0
  519. package/src/skeleton/skeleton.usage.example.ts +49 -0
  520. package/src/slider/_examples/index.ts +7 -0
  521. package/src/slider/_examples/slider.example.ts +41 -0
  522. package/src/slider/_examples/slider.formatted.example.ts +53 -0
  523. package/src/slider/_examples/slider.range.example.ts +48 -0
  524. package/src/slider/_examples/slider.vertical.example.ts +48 -0
  525. package/src/slider/_examples/slider.with-marks.example.ts +46 -0
  526. package/src/slider/index.ts +1 -0
  527. package/src/slider/slider.css +172 -0
  528. package/src/slider/slider.playground.ts +88 -0
  529. package/src/slider/slider.spec.ts +139 -0
  530. package/src/slider/slider.ts +246 -0
  531. package/src/slider/slider.usage.example.ts +68 -0
  532. package/src/speed-dial/_examples/index.ts +7 -0
  533. package/src/speed-dial/_examples/speed-dial.directions.example.ts +85 -0
  534. package/src/speed-dial/_examples/speed-dial.disabled.example.ts +71 -0
  535. package/src/speed-dial/_examples/speed-dial.example.ts +48 -0
  536. package/src/speed-dial/_examples/speed-dial.usage.example.ts +59 -0
  537. package/src/speed-dial/_examples/speed-dial.with-tooltips.example.ts +65 -0
  538. package/src/speed-dial/index.ts +1 -0
  539. package/src/speed-dial/speed-dial.css +137 -0
  540. package/src/speed-dial/speed-dial.playground.ts +137 -0
  541. package/src/speed-dial/speed-dial.spec.ts +191 -0
  542. package/src/speed-dial/speed-dial.ts +257 -0
  543. package/src/spinner/_examples/index.ts +8 -0
  544. package/src/spinner/_examples/spinner.animations.example.ts +54 -0
  545. package/src/spinner/_examples/spinner.example.ts +26 -0
  546. package/src/spinner/_examples/spinner.in-button.example.ts +51 -0
  547. package/src/spinner/_examples/spinner.sizes.example.ts +31 -0
  548. package/src/spinner/_examples/spinner.usage.example.ts +45 -0
  549. package/src/spinner/_examples/spinner.variants.example.ts +34 -0
  550. package/src/spinner/index.ts +1 -0
  551. package/src/spinner/spinner.css +161 -0
  552. package/src/spinner/spinner.playground.ts +68 -0
  553. package/src/spinner/spinner.spec.ts +184 -0
  554. package/src/spinner/spinner.ts +185 -0
  555. package/src/stepper/_examples/index.ts +8 -0
  556. package/src/stepper/_examples/stepper.example.ts +62 -0
  557. package/src/stepper/_examples/stepper.non-linear.example.ts +63 -0
  558. package/src/stepper/_examples/stepper.optional-step.example.ts +62 -0
  559. package/src/stepper/_examples/stepper.usage.example.ts +73 -0
  560. package/src/stepper/_examples/stepper.vertical.example.ts +66 -0
  561. package/src/stepper/_examples/stepper.with-error.example.ts +63 -0
  562. package/src/stepper/index.ts +1 -0
  563. package/src/stepper/stepper.css +147 -0
  564. package/src/stepper/stepper.playground.ts +88 -0
  565. package/src/stepper/stepper.spec.ts +200 -0
  566. package/src/stepper/stepper.ts +242 -0
  567. package/src/table/_examples/index.ts +23 -0
  568. package/src/table/_examples/table.column-pinning.example.ts +55 -0
  569. package/src/table/_examples/table.column-resize.example.ts +49 -0
  570. package/src/table/_examples/table.column-visibility.example.ts +52 -0
  571. package/src/table/_examples/table.density.example.ts +71 -0
  572. package/src/table/_examples/table.editable.example.ts +85 -0
  573. package/src/table/_examples/table.empty-and-error.example.ts +112 -0
  574. package/src/table/_examples/table.example.ts +45 -0
  575. package/src/table/_examples/table.export.example.ts +82 -0
  576. package/src/table/_examples/table.filterable.example.ts +67 -0
  577. package/src/table/_examples/table.grouping.example.ts +63 -0
  578. package/src/table/_examples/table.keyboard.example.ts +115 -0
  579. package/src/table/_examples/table.master-detail.example.ts +102 -0
  580. package/src/table/_examples/table.persistence.example.ts +85 -0
  581. package/src/table/_examples/table.playground.ts +154 -0
  582. package/src/table/_examples/table.row-pinning.example.ts +71 -0
  583. package/src/table/_examples/table.selection.example.ts +67 -0
  584. package/src/table/_examples/table.server-mode.example.ts +120 -0
  585. package/src/table/_examples/table.sortable.example.ts +49 -0
  586. package/src/table/_examples/table.theming.example.ts +64 -0
  587. package/src/table/_examples/table.usage.example.ts +90 -0
  588. package/src/table/_examples/table.virtualized.example.ts +122 -0
  589. package/src/table/index.ts +11 -0
  590. package/src/table/table-cell-editor-outlet.ts +111 -0
  591. package/src/table/table-editors/boolean-editor.ts +71 -0
  592. package/src/table/table-editors/date-editor.ts +117 -0
  593. package/src/table/table-editors/editors.spec.ts +147 -0
  594. package/src/table/table-editors/index.ts +41 -0
  595. package/src/table/table-editors/number-editor.ts +89 -0
  596. package/src/table/table-editors/select-editor.ts +107 -0
  597. package/src/table/table-editors/text-editor.ts +82 -0
  598. package/src/table/table-export.spec.ts +33 -0
  599. package/src/table/table-export.ts +53 -0
  600. package/src/table/table-filter-outlet.ts +137 -0
  601. package/src/table/table-filters/date-filter.ts +122 -0
  602. package/src/table/table-filters/filters.css +53 -0
  603. package/src/table/table-filters/filters.spec.ts +277 -0
  604. package/src/table/table-filters/index.ts +11 -0
  605. package/src/table/table-filters/number-filter.ts +232 -0
  606. package/src/table/table-filters/select-filter.ts +129 -0
  607. package/src/table/table-filters/text-filter.ts +110 -0
  608. package/src/table/table-pagination.spec.ts +118 -0
  609. package/src/table/table-pagination.ts +191 -0
  610. package/src/table/table-side-panel.spec.ts +170 -0
  611. package/src/table/table-side-panel.ts +263 -0
  612. package/src/table/table-status-bar.spec.ts +78 -0
  613. package/src/table/table-status-bar.ts +70 -0
  614. package/src/table/table-toolbar.spec.ts +180 -0
  615. package/src/table/table-toolbar.ts +244 -0
  616. package/src/table/table-virtual.spec.ts +103 -0
  617. package/src/table/table-virtual.ts +180 -0
  618. package/src/table/table.css +468 -0
  619. package/src/table/table.spec.ts +175 -0
  620. package/src/table/table.ts +1009 -0
  621. package/src/tabs/_examples/index.ts +8 -0
  622. package/src/tabs/_examples/tabs.controlled.example.ts +59 -0
  623. package/src/tabs/_examples/tabs.disabled.example.ts +34 -0
  624. package/src/tabs/_examples/tabs.example.ts +34 -0
  625. package/src/tabs/_examples/tabs.manual-activation.example.ts +34 -0
  626. package/src/tabs/_examples/tabs.usage.example.ts +43 -0
  627. package/src/tabs/_examples/tabs.vertical.example.ts +33 -0
  628. package/src/tabs/index.ts +1 -0
  629. package/src/tabs/tabs.css +80 -0
  630. package/src/tabs/tabs.playground.ts +88 -0
  631. package/src/tabs/tabs.spec.ts +135 -0
  632. package/src/tabs/tabs.ts +204 -0
  633. package/src/tag/_examples/index.ts +9 -0
  634. package/src/tag/_examples/tag.example.ts +22 -0
  635. package/src/tag/_examples/tag.list.example.ts +38 -0
  636. package/src/tag/_examples/tag.removable.example.ts +39 -0
  637. package/src/tag/_examples/tag.selectable.example.ts +33 -0
  638. package/src/tag/_examples/tag.sizes.example.ts +25 -0
  639. package/src/tag/_examples/tag.usage.example.ts +62 -0
  640. package/src/tag/_examples/tag.variants.example.ts +29 -0
  641. package/src/tag/index.ts +1 -0
  642. package/src/tag/tag.css +167 -0
  643. package/src/tag/tag.playground.ts +63 -0
  644. package/src/tag/tag.spec.ts +153 -0
  645. package/src/tag/tag.ts +186 -0
  646. package/src/test-setup.ts +5 -0
  647. package/src/textarea/_examples/index.ts +8 -0
  648. package/src/textarea/_examples/textarea.autoresize.example.ts +37 -0
  649. package/src/textarea/_examples/textarea.character-count.example.ts +34 -0
  650. package/src/textarea/_examples/textarea.example.ts +22 -0
  651. package/src/textarea/_examples/textarea.no-resize.example.ts +28 -0
  652. package/src/textarea/_examples/textarea.usage.example.ts +50 -0
  653. package/src/textarea/_examples/textarea.with-field.example.ts +66 -0
  654. package/src/textarea/index.ts +1 -0
  655. package/src/textarea/textarea.css +117 -0
  656. package/src/textarea/textarea.playground.ts +70 -0
  657. package/src/textarea/textarea.spec.ts +161 -0
  658. package/src/textarea/textarea.ts +339 -0
  659. package/src/time-picker/_examples/index.ts +8 -0
  660. package/src/time-picker/_examples/time-picker.12-hour.example.ts +24 -0
  661. package/src/time-picker/_examples/time-picker.example.ts +24 -0
  662. package/src/time-picker/_examples/time-picker.formatted.example.ts +32 -0
  663. package/src/time-picker/_examples/time-picker.range.example.ts +54 -0
  664. package/src/time-picker/_examples/time-picker.usage.example.ts +53 -0
  665. package/src/time-picker/_examples/time-picker.with-seconds.example.ts +24 -0
  666. package/src/time-picker/index.ts +1 -0
  667. package/src/time-picker/time-picker.css +126 -0
  668. package/src/time-picker/time-picker.playground.ts +72 -0
  669. package/src/time-picker/time-picker.spec.ts +77 -0
  670. package/src/time-picker/time-picker.ts +207 -0
  671. package/src/toast/_examples/index.ts +7 -0
  672. package/src/toast/_examples/toast.default.example.ts +37 -0
  673. package/src/toast/_examples/toast.dismissible.example.ts +38 -0
  674. package/src/toast/_examples/toast.usage.example.ts +57 -0
  675. package/src/toast/_examples/toast.variants.example.ts +43 -0
  676. package/src/toast/_examples/toast.with-action.example.ts +46 -0
  677. package/src/toast/index.ts +1 -0
  678. package/src/toast/toast.css +115 -0
  679. package/src/toast/toast.playground.ts +61 -0
  680. package/src/toast/toast.ts +168 -0
  681. package/src/toggle/_examples/index.ts +7 -0
  682. package/src/toggle/_examples/toggle.checked.example.ts +20 -0
  683. package/src/toggle/_examples/toggle.default.example.ts +20 -0
  684. package/src/toggle/_examples/toggle.disabled.example.ts +26 -0
  685. package/src/toggle/_examples/toggle.usage.example.ts +51 -0
  686. package/src/toggle/_examples/toggle.with-label.example.ts +30 -0
  687. package/src/toggle/index.ts +1 -0
  688. package/src/toggle/toggle.css +123 -0
  689. package/src/toggle/toggle.playground.ts +65 -0
  690. package/src/toggle/toggle.ts +113 -0
  691. package/src/tooltip/_examples/index.ts +9 -0
  692. package/src/tooltip/_examples/tooltip.delays.example.ts +16 -0
  693. package/src/tooltip/_examples/tooltip.disabled.example.ts +16 -0
  694. package/src/tooltip/_examples/tooltip.example.ts +16 -0
  695. package/src/tooltip/_examples/tooltip.group.example.ts +20 -0
  696. package/src/tooltip/_examples/tooltip.rich.example.ts +19 -0
  697. package/src/tooltip/_examples/tooltip.sides.example.ts +18 -0
  698. package/src/tooltip/_examples/tooltip.usage.example.ts +50 -0
  699. package/src/tooltip/index.ts +1 -0
  700. package/src/tooltip/tooltip.css +61 -0
  701. package/src/tooltip/tooltip.playground.ts +79 -0
  702. package/src/tooltip/tooltip.spec.ts +5 -0
  703. package/src/tooltip/tooltip.ts +102 -0
  704. package/src/tree-select/_examples/index.ts +8 -0
  705. package/src/tree-select/_examples/tree-select.disabled.example.ts +106 -0
  706. package/src/tree-select/_examples/tree-select.example.ts +65 -0
  707. package/src/tree-select/_examples/tree-select.expanded.example.ts +72 -0
  708. package/src/tree-select/_examples/tree-select.field.example.ts +77 -0
  709. package/src/tree-select/_examples/tree-select.multi.example.ts +73 -0
  710. package/src/tree-select/_examples/tree-select.usage.example.ts +85 -0
  711. package/src/tree-select/index.ts +1 -0
  712. package/src/tree-select/tree-select.css +220 -0
  713. package/src/tree-select/tree-select.playground.ts +83 -0
  714. package/src/tree-select/tree-select.ts +348 -0
  715. package/src/typography/_examples/index.ts +9 -0
  716. package/src/typography/_examples/typography.blockquote.example.ts +34 -0
  717. package/src/typography/_examples/typography.code.example.ts +32 -0
  718. package/src/typography/_examples/typography.example.ts +42 -0
  719. package/src/typography/_examples/typography.lead.example.ts +37 -0
  720. package/src/typography/_examples/typography.muted.example.ts +27 -0
  721. package/src/typography/_examples/typography.truncate.example.ts +41 -0
  722. package/src/typography/_examples/typography.usage.example.ts +44 -0
  723. package/src/typography/index.ts +8 -0
  724. package/src/typography/typography.playground.ts +101 -0
  725. package/src/typography/typography.spec.ts +70 -0
  726. package/src/typography/typography.ts +105 -0
  727. package/tsconfig.lib.json +25 -0
  728. package/tsconfig.lib.prod.json +17 -0
  729. package/tsconfig.spec.json +16 -0
  730. package/vite.config.ts +33 -0
@@ -0,0 +1,138 @@
1
+ import { Component } from '@angular/core';
2
+ import { render } from '@testing-library/angular';
3
+
4
+ import { KjAvatarComponent } from './avatar';
5
+ import { KjAvatarGroupComponent } from './avatar-group';
6
+
7
+ const imports = [KjAvatarComponent, KjAvatarGroupComponent];
8
+
9
+ /**
10
+ * Allow Angular's signal-driven `effect()`s and `contentChildren` queries to
11
+ * settle before the assertions read host attributes. Mirrors the helper used
12
+ * by the core `KjAvatarGroup` spec.
13
+ */
14
+ async function flush(): Promise<void> {
15
+ await new Promise<void>((resolve) => setTimeout(resolve, 0));
16
+ await Promise.resolve();
17
+ await Promise.resolve();
18
+ }
19
+
20
+ describe('KjAvatarGroupComponent', () => {
21
+ it('renders projected <kj-avatar> children', async () => {
22
+ @Component({
23
+ standalone: true,
24
+ imports,
25
+ template: `
26
+ <kj-avatar-group>
27
+ <kj-avatar content="A" />
28
+ <kj-avatar content="B" />
29
+ <kj-avatar content="C" />
30
+ </kj-avatar-group>`,
31
+ })
32
+ class Host {}
33
+
34
+ const { container } = await render(Host);
35
+ await flush();
36
+
37
+ const groupEl = container.querySelector('kj-avatar-group') as HTMLElement;
38
+ expect(groupEl).toBeTruthy();
39
+ // The class binding mirrors the wrapper's host class.
40
+ expect(groupEl.classList.contains('kj-avatar-group')).toBe(true);
41
+
42
+ // Three projected avatars + (potentially) the chip. With default kjMax=4
43
+ // and three children, the chip should NOT render.
44
+ expect(groupEl.querySelectorAll('kj-avatar')).toHaveLength(3);
45
+ expect(groupEl.querySelector('.kj-avatar-group-overflow')).toBeNull();
46
+ });
47
+
48
+ it('renders the overflow chip with "+N" when children exceed kjMax', async () => {
49
+ @Component({
50
+ standalone: true,
51
+ imports,
52
+ template: `
53
+ <kj-avatar-group [kjMax]="2">
54
+ <kj-avatar content="A" />
55
+ <kj-avatar content="B" />
56
+ <kj-avatar content="C" />
57
+ <kj-avatar content="D" />
58
+ <kj-avatar content="E" />
59
+ </kj-avatar-group>`,
60
+ })
61
+ class Host {}
62
+
63
+ const { container } = await render(Host);
64
+ await flush();
65
+
66
+ const chip = container.querySelector('.kj-avatar-group-overflow') as HTMLElement;
67
+ expect(chip).toBeTruthy();
68
+ // 5 projected children, kjMax=2 → overflow = 3.
69
+ expect(chip.textContent?.trim()).toBe('+3');
70
+ });
71
+
72
+ it('overflow chip is aria-hidden so it does not duplicate the count-aware label', async () => {
73
+ @Component({
74
+ standalone: true,
75
+ imports,
76
+ template: `
77
+ <kj-avatar-group [kjMax]="1">
78
+ <kj-avatar content="A" />
79
+ <kj-avatar content="B" />
80
+ <kj-avatar content="C" />
81
+ </kj-avatar-group>`,
82
+ })
83
+ class Host {}
84
+
85
+ const { container } = await render(Host);
86
+ await flush();
87
+
88
+ const chip = container.querySelector('.kj-avatar-group-overflow') as HTMLElement;
89
+ expect(chip).toBeTruthy();
90
+ expect(chip.getAttribute('aria-hidden')).toBe('true');
91
+ });
92
+
93
+ it('forwards aliased inputs (kjMax, kjAriaLabel, kjTotal) to the underlying directive', async () => {
94
+ @Component({
95
+ standalone: true,
96
+ imports,
97
+ template: `
98
+ <kj-avatar-group [kjMax]="3" kjAriaLabel="collaborators" [kjTotal]="42">
99
+ <kj-avatar content="A" />
100
+ <kj-avatar content="B" />
101
+ <kj-avatar content="C" />
102
+ </kj-avatar-group>`,
103
+ })
104
+ class Host {}
105
+
106
+ const { container } = await render(Host);
107
+ await flush();
108
+
109
+ const groupEl = container.querySelector('kj-avatar-group') as HTMLElement;
110
+ // Count-aware label proves kjAriaLabel + kjTotal reached the directive.
111
+ expect(groupEl.getAttribute('aria-label')).toBe('3 of 42 collaborators');
112
+ expect(groupEl.getAttribute('role')).toBe('group');
113
+
114
+ // Chip with kjMax=3 and 3 projected (and kjTotal=42) → overflow = 39.
115
+ const chip = container.querySelector('.kj-avatar-group-overflow') as HTMLElement;
116
+ expect(chip).toBeTruthy();
117
+ expect(chip.textContent?.trim()).toBe('+39');
118
+ });
119
+
120
+ it('renders nothing problematic when the group is empty', async () => {
121
+ @Component({
122
+ standalone: true,
123
+ imports,
124
+ template: `<kj-avatar-group [kjMax]="3"></kj-avatar-group>`,
125
+ })
126
+ class Host {}
127
+
128
+ const { container } = await render(Host);
129
+ await flush();
130
+
131
+ const groupEl = container.querySelector('kj-avatar-group') as HTMLElement;
132
+ expect(groupEl).toBeTruthy();
133
+ // No chip when there is nothing to overflow.
134
+ expect(container.querySelector('.kj-avatar-group-overflow')).toBeNull();
135
+ // Empty group omits aria-label entirely (count-aware label suppressed at total === 0).
136
+ expect(groupEl.hasAttribute('aria-label')).toBe(false);
137
+ });
138
+ });
@@ -0,0 +1,127 @@
1
+ import { ChangeDetectionStrategy, Component, ViewEncapsulation, computed, inject } from '@angular/core';
2
+ import { KjAvatarGroup, KJ_AVATAR_GROUP, type KjAvatarGroupAriaLabelFormat, type KjAvatarShape } from '@kouji-ui/core';
3
+ import { KjAvatarComponent } from './avatar';
4
+
5
+ /**
6
+ * Avatar group wrapper. Stacks projected `<kj-avatar>` children with a
7
+ * count-aware `aria-label`, an overflow chip when `kjMax` is exceeded, and
8
+ * RTL-aware z-index ordering — all handled by the composed `KjAvatarGroup`
9
+ * core directive. The wrapper supplies the chip element and the host
10
+ * `<ng-content/>` slot.
11
+ *
12
+ * The overflow chip is a regular `<kj-avatar>` rendering `'+N'` text; it is
13
+ * `aria-hidden` because the group's count-aware label already conveys
14
+ * totality (e.g. `"3 of 8 collaborators"`), so exposing the chip again would
15
+ * duplicate the announcement.
16
+ *
17
+ * @doc-example Default
18
+ * The default playground — five stacked avatars with the group's defaults.
19
+ * @doc-file avatar-group.example.ts
20
+ * @doc-example Usage
21
+ * The common shape: a small face-pile with an overflow chip, accessible label,
22
+ * and a list-mode variant for documents-shared screens.
23
+ * @doc-file avatar-group.usage.example.ts
24
+ * @doc-example Overflow
25
+ * `kjMax` caps visible avatars; the remainder collapses into a "+N" chip.
26
+ * @doc-file avatar-group.overflow.example.ts
27
+ * @doc-example Sizes
28
+ * Group `kjSize` cascades onto every projected `<kj-avatar>` for a uniform pile.
29
+ * @doc-file avatar-group.sizes.example.ts
30
+ * @doc-example Shapes
31
+ * Group `kjShape` cascades to children; the +N chip mirrors it for a consistent silhouette.
32
+ * @doc-file avatar-group.shapes.example.ts
33
+ * @doc-example List
34
+ * `kjRole="list"` switches to a list landmark — use for "shared by" rows in docs UIs.
35
+ * @doc-file avatar-group.list.example.ts
36
+ *
37
+ * @doc-aria
38
+ * aria-label — Count-aware label like "3 of 8 collaborators"; override via `kjAriaLabelOverride`
39
+ * role — Defaults to `img` (face-pile); set `kjRole="list"` for a true list landmark
40
+ * aria-hidden — Forced on the +N chip so the count isn't re-announced
41
+ *
42
+ * @doc-touch
43
+ * Stacked avatars are decorative — they aren't tab stops. Pair the group
44
+ * with an interactive trigger (button/link) sized ≥ 44×44 when clicking is
45
+ * meaningful (e.g. opens a collaborator dialog).
46
+ *
47
+ * @doc-a11y
48
+ * The face-pile is an `img` landmark with a count-aware accessible name so
49
+ * AT users hear "3 of 8 collaborators" rather than every initial. Switch to
50
+ * `role="list"` whenever the order/identity of each face matters
51
+ * semantically. The overflow chip is always `aria-hidden` because the
52
+ * group's name already conveys totality.
53
+ *
54
+ * @doc-related avatar,badge,tag
55
+ *
56
+ * @doc-css-var
57
+ * --kj-avatar-size — Avatar diameter. Sizes (xs/sm/md/lg/xl) override.
58
+ * --kj-avatar-bg — Avatar background. Defaults to --kj-bg-field; the +N chip inherits this too.
59
+ * --kj-avatar-fg — Avatar foreground (initials, fallback glyph). Defaults to --kj-fg-default.
60
+ * --kj-avatar-radius — Corner radius. `circle` shape pins it to 9999px; `rounded` swaps to --kj-radius-box.
61
+ *
62
+ * @doc-category Library/Data display
63
+ * @doc
64
+ * @doc-name avatar
65
+ * @doc-description Themed avatar facepile that stacks avatars with an overflow chip and an accessible count label.
66
+ * @doc-is-main
67
+ */
68
+ @Component({
69
+ selector: 'kj-avatar-group',
70
+ standalone: true,
71
+ hostDirectives: [
72
+ {
73
+ directive: KjAvatarGroup,
74
+ inputs: [
75
+ 'kjMax',
76
+ 'kjTotal',
77
+ 'kjSize',
78
+ 'kjShape',
79
+ 'kjAriaLabel',
80
+ 'kjAriaLabelFormat',
81
+ 'kjRole',
82
+ 'kjAriaLabelOverride',
83
+ ],
84
+ },
85
+ ],
86
+ imports: [KjAvatarComponent],
87
+ template: `
88
+ <ng-content />
89
+ @if (overflowCount() > 0) {
90
+ <kj-avatar
91
+ class="kj-avatar-group-overflow"
92
+ aria-hidden="true"
93
+ [content]="overflowLabel()"
94
+ [shape]="chipShape()"
95
+ />
96
+ }
97
+ `,
98
+ encapsulation: ViewEncapsulation.None,
99
+ host: {
100
+ 'class': 'kj-avatar-group',
101
+ },
102
+ changeDetection: ChangeDetectionStrategy.OnPush,
103
+ })
104
+ export class KjAvatarGroupComponent {
105
+ /**
106
+ * Read-only handle to the composed `KjAvatarGroup` directive. The directive
107
+ * `provide`s itself under `KJ_AVATAR_GROUP`, so injecting the token returns
108
+ * the same instance and gives us access to `overflowCount`, `shape`, etc.
109
+ */
110
+ private readonly group = inject(KJ_AVATAR_GROUP);
111
+
112
+ protected readonly overflowCount = this.group.overflowCount;
113
+
114
+ protected readonly overflowLabel = computed(() => `+${this.overflowCount()}`);
115
+
116
+ /**
117
+ * Chip shape mirrors the group's default shape so the chip visually
118
+ * matches the avatars. `<kj-avatar>`'s own `shape` default is `'circle'`,
119
+ * which is also the group's default — so a missing group shape cleanly
120
+ * collapses to `'circle'`.
121
+ */
122
+ protected readonly chipShape = computed<'circle' | 'rounded'>(
123
+ () => (this.group.shape() as KjAvatarShape | undefined) ?? 'circle',
124
+ );
125
+ }
126
+
127
+ export type { KjAvatarGroupAriaLabelFormat };
@@ -0,0 +1,30 @@
1
+ import { ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { KjAvatarComponent } from './avatar';
3
+ import { KjAvatarGroupComponent } from './avatar-group';
4
+
5
+ /**
6
+ * Common avatar-group shapes — a capped face-pile with +N chip and a list-mode
7
+ * variant for "shared by" rows. Use this as the copy-paste starting point.
8
+ */
9
+ @Component({
10
+ selector: 'kj-avatar-group-usage-example',
11
+ standalone: true,
12
+ changeDetection: ChangeDetectionStrategy.OnPush,
13
+ imports: [KjAvatarGroupComponent, KjAvatarComponent],
14
+ styles: [`:host { display: flex; flex-direction: column; gap: var(--kj-space-md); }`],
15
+ template: `
16
+ <kj-avatar-group kjMax="3" kjTotal="7">
17
+ <kj-avatar content="AL" alt="Alice" />
18
+ <kj-avatar content="BO" alt="Bo" />
19
+ <kj-avatar content="CJ" alt="CJ" />
20
+ <kj-avatar content="DI" alt="Di" />
21
+ </kj-avatar-group>
22
+
23
+ <kj-avatar-group kjRole="list" kjSize="sm">
24
+ <kj-avatar content="EV" alt="Evan" />
25
+ <kj-avatar content="FA" alt="Fay" />
26
+ <kj-avatar content="GU" alt="Guo" />
27
+ </kj-avatar-group>
28
+ `,
29
+ })
30
+ export class KjAvatarGroupUsageExample {}
@@ -0,0 +1,58 @@
1
+ @layer kj.component {
2
+ .kj-avatar {
3
+ --kj-avatar-size: 2.5rem;
4
+ --kj-avatar-bg: var(--kj-bg-field);
5
+ --kj-avatar-fg: var(--kj-fg-default);
6
+ --kj-avatar-radius: 9999px;
7
+
8
+ position: relative;
9
+ display: inline-flex;
10
+ align-items: center;
11
+ justify-content: center;
12
+ width: var(--kj-avatar-size);
13
+ height: var(--kj-avatar-size);
14
+ background: var(--kj-avatar-bg);
15
+ color: var(--kj-avatar-fg);
16
+ border-radius: var(--kj-avatar-radius);
17
+ overflow: hidden;
18
+ font: 0.875rem / 1 var(--kj-font-sans);
19
+ font-weight: 600;
20
+ }
21
+
22
+ /* `rounded` reads `--kj-radius-box-lg` (1rem default, declared in
23
+ `kj.base`) rather than `--kj-radius-box` because some themes (kouji,
24
+ bauhaus) set `--kj-radius-box` to 0 as a brutalist signature — falling
25
+ back to that would make `rounded` and `circle` look identical on those
26
+ themes. `--kj-radius-box-lg` stays unset by theme overrides, so the
27
+ toggle always produces a visible shape change. */
28
+ .kj-avatar[data-shape="rounded"] { --kj-avatar-radius: var(--kj-radius-box-lg); }
29
+
30
+ /* The host's `[hidden]` attribute (written by the avatar-group when a
31
+ child overflows `kjMax`) needs an explicit `display: none` because the
32
+ `inline-flex` declaration above wins against the UA `[hidden] { display:
33
+ none }` rule via selector specificity. Without this, "hidden" overflow
34
+ avatars still render and `kjMax` looks broken. */
35
+ .kj-avatar[hidden] { display: none; }
36
+
37
+ .kj-avatar[data-size="xs"] { --kj-avatar-size: 1.5rem; font-size: 0.6875rem; }
38
+ .kj-avatar[data-size="sm"] { --kj-avatar-size: 2rem; font-size: 0.75rem; }
39
+ .kj-avatar[data-size="lg"] { --kj-avatar-size: 3rem; font-size: 1rem; }
40
+ .kj-avatar[data-size="xl"] { --kj-avatar-size: 4rem; font-size: 1.25rem; }
41
+
42
+ .kj-avatar-image {
43
+ width: 100%;
44
+ height: 100%;
45
+ object-fit: cover;
46
+ display: block;
47
+ }
48
+ .kj-avatar-image:not([data-loaded]) { opacity: 0; }
49
+
50
+ .kj-avatar-fallback {
51
+ position: absolute;
52
+ inset: 0;
53
+ display: flex;
54
+ align-items: center;
55
+ justify-content: center;
56
+ }
57
+ .kj-avatar-fallback:not([data-visible]) { opacity: 0; pointer-events: none; }
58
+ }
@@ -0,0 +1,95 @@
1
+ import { ChangeDetectionStrategy, Component, signal } from '@angular/core';
2
+ import { KjAvatarComponent } from './avatar';
3
+ import { KjAvatarGroupComponent } from './avatar-group';
4
+ import type { PlaygroundFile } from '@kouji-ui/components/playground-types';
5
+
6
+ /**
7
+ * Playground state — module-scope signals. Targets the group facepile (main
8
+ * symbol) and exposes size / shape / max-visible / total / item count so the
9
+ * overflow chip and stacking can be probed.
10
+ */
11
+ const size = signal<'xs' | 'sm' | 'md' | 'lg' | 'xl'>('md');
12
+ const shape = signal<'circle' | 'rounded'>('circle');
13
+ const max = signal<2 | 3 | 4 | 5>(3);
14
+ const total = signal<4 | 6 | 8>(6);
15
+ const itemCount = signal<3 | 4 | 5>(4);
16
+
17
+ const PEOPLE: ReadonlyArray<{ content: string; alt: string }> = [
18
+ { content: 'AL', alt: 'Alice' },
19
+ { content: 'BR', alt: 'Bruno' },
20
+ { content: 'CY', alt: 'Cyrille' },
21
+ { content: 'DA', alt: 'Dara' },
22
+ { content: 'ED', alt: 'Eduardo' },
23
+ ];
24
+
25
+ @Component({
26
+ selector: 'kj-avatar-playground',
27
+ standalone: true,
28
+ imports: [KjAvatarComponent, KjAvatarGroupComponent],
29
+ template: `
30
+ <kj-avatar-group
31
+ [kjMax]="max()"
32
+ [kjTotal]="total()"
33
+ [kjSize]="size()"
34
+ [kjShape]="shape()"
35
+ >
36
+ @for (p of visiblePeople(); track p.alt) {
37
+ <kj-avatar [content]="p.content" [alt]="p.alt" />
38
+ }
39
+ </kj-avatar-group>
40
+ `,
41
+ changeDetection: ChangeDetectionStrategy.OnPush,
42
+ })
43
+ export class KjAvatarPlaygroundDemo {
44
+ protected readonly size = size;
45
+ protected readonly shape = shape;
46
+ protected readonly max = max;
47
+ protected readonly total = total;
48
+ protected readonly itemCount = itemCount;
49
+
50
+ protected visiblePeople(): typeof PEOPLE {
51
+ return PEOPLE.slice(0, itemCount());
52
+ }
53
+ }
54
+
55
+ export const PLAYGROUND: PlaygroundFile = {
56
+ component: KjAvatarPlaygroundDemo,
57
+ state: {
58
+ size: size as unknown as ReturnType<typeof signal>,
59
+ shape: shape as unknown as ReturnType<typeof signal>,
60
+ max: max as unknown as ReturnType<typeof signal>,
61
+ total: total as unknown as ReturnType<typeof signal>,
62
+ itemCount: itemCount as unknown as ReturnType<typeof signal>,
63
+ },
64
+ controls: [
65
+ {
66
+ kind: 'chips',
67
+ name: 'size',
68
+ label: 'size',
69
+ options: ['xs', 'sm', 'md', 'lg', 'xl'],
70
+ },
71
+ { kind: 'chips', name: 'shape', label: 'shape', options: ['circle', 'rounded'] },
72
+ { kind: 'chips', name: 'max', label: 'max visible', options: [2, 3, 4, 5] },
73
+ { kind: 'chips', name: 'total', label: 'total', options: [4, 6, 8] },
74
+ { kind: 'chips', name: 'itemCount', label: 'items', options: [3, 4, 5] },
75
+ ],
76
+ snippet: (values) => {
77
+ const s = values as {
78
+ size: string;
79
+ shape: string;
80
+ max: number;
81
+ total: number;
82
+ itemCount: number;
83
+ };
84
+ const attrs: string[] = [
85
+ `[kjMax]="${s.max}"`,
86
+ `[kjTotal]="${s.total}"`,
87
+ `kjSize="${s.size}"`,
88
+ `kjShape="${s.shape}"`,
89
+ ];
90
+ const children = PEOPLE.slice(0, s.itemCount)
91
+ .map((p) => ` <kj-avatar content="${p.content}" alt="${p.alt}" />`)
92
+ .join('\n');
93
+ return `<kj-avatar-group\n ${attrs.join('\n ')}\n>\n${children}\n</kj-avatar-group>`;
94
+ },
95
+ };
@@ -0,0 +1,123 @@
1
+ import { Component, ChangeDetectionStrategy, ViewEncapsulation, computed, inject, input, TemplateRef } from '@angular/core';
2
+ import { NgTemplateOutlet } from '@angular/common';
3
+ import { KjAvatar, KjAvatarImage, KjAvatarFallback, KJ_AVATAR_GROUP, type KjAvatarShape } from '@kouji-ui/core';
4
+
5
+ type KjAvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
6
+
7
+ /**
8
+ * Avatar component. Renders an image when `src` is provided; otherwise (or when
9
+ * the image fails to load) shows the `content` input. `content` accepts a plain
10
+ * string or a `TemplateRef` for richer markup (icon, sub-badge, etc.).
11
+ *
12
+ * @doc-example Default
13
+ * The default playground — initials avatar at the default size.
14
+ * @doc-file avatar.default.example.ts
15
+ * @doc-example Usage
16
+ * The common shapes — image, initials fallback, sized, and a rounded square.
17
+ * Use this as the copy-paste starting point.
18
+ * @doc-file avatar.usage.example.ts
19
+ * @doc-example Sizes
20
+ * xs / sm / md / lg / xl — `md` is the default.
21
+ * @doc-file avatar.sizes.example.ts
22
+ * @doc-example With image
23
+ * Bind `src` and `alt` — the alt also surfaces as a native hover tooltip.
24
+ * @doc-file avatar.with-image.example.ts
25
+ * @doc-example Initials fallback
26
+ * Project text into `content` for a graceful fallback when `src` is missing.
27
+ * @doc-file avatar.initials.example.ts
28
+ * @doc-example Shapes
29
+ * `circle` (default) or `rounded` — pick the silhouette that matches the surface.
30
+ * @doc-file avatar.shapes.example.ts
31
+ *
32
+ * @doc-aria
33
+ * alt — Forwarded to the inner `<img>`; falls back to empty string when omitted
34
+ * title — Mirrors `alt` so hovering surfaces a native tooltip
35
+ * data-size — Mirrors the resolved size for theme/scope hooks
36
+ * data-shape — Mirrors the resolved shape for theme/scope hooks
37
+ *
38
+ * @doc-a11y
39
+ * When `src` is set the inner `<img>` carries the user-supplied `alt`; an
40
+ * empty alt (the default) marks it decorative so AT skips it — pair with a
41
+ * visible name elsewhere. The fallback element is a `<span>` so it reads as
42
+ * plain text rather than an image.
43
+ *
44
+ * @doc-related avatar-group,badge,icon
45
+ *
46
+ * @doc-category Library/Data display
47
+ * @doc
48
+ * @doc-name avatar
49
+ */
50
+ @Component({
51
+ selector: 'kj-avatar',
52
+ standalone: true,
53
+ hostDirectives: [KjAvatar],
54
+ imports: [KjAvatarImage, KjAvatarFallback, NgTemplateOutlet],
55
+ template: `
56
+ @if (src(); as srcVal) {
57
+ <img kjAvatarImage class="kj-avatar-image" [src]="srcVal" [alt]="alt() ?? ''" />
58
+ }
59
+ <span kjAvatarFallback class="kj-avatar-fallback">
60
+ @if (isTemplate(content())) {
61
+ <ng-container *ngTemplateOutlet="$any(content())"></ng-container>
62
+ } @else {
63
+ {{ content() }}
64
+ }
65
+ </span>
66
+ `,
67
+ styleUrl: './avatar.css',
68
+ encapsulation: ViewEncapsulation.None,
69
+ host: {
70
+ 'class': 'kj-avatar',
71
+ '[attr.data-size]': 'resolvedSize()',
72
+ '[attr.data-shape]': 'resolvedShape()',
73
+ // Mirror `alt` to `title` so hovering the avatar shows a native tooltip.
74
+ // `alt` alone only surfaces to screen readers / fallback rendering.
75
+ '[attr.title]': 'alt()',
76
+ },
77
+ changeDetection: ChangeDetectionStrategy.OnPush,
78
+ })
79
+ export class KjAvatarComponent {
80
+ /**
81
+ * Optional `KjAvatarGroup` context. Avatars rendered inside a
82
+ * `<kj-avatar-group>` inherit `kjSize` / `kjShape` from the group when
83
+ * their own inputs are unset — matching the `@doc-example Sizes` claim
84
+ * that group size "cascades onto every projected `<kj-avatar>`".
85
+ */
86
+ private readonly group = inject(KJ_AVATAR_GROUP, { optional: true });
87
+
88
+ readonly src = input<string | undefined>(undefined);
89
+ readonly alt = input<string | undefined>(undefined);
90
+ /** Content shown when there is no `src`, or as a fallback if the image fails. */
91
+ readonly content = input<string | TemplateRef<unknown>>('');
92
+ /**
93
+ * Explicit avatar size. Leave unset to inherit from a parent
94
+ * `<kj-avatar-group kjSize="...">`; falls back to `'md'` when neither
95
+ * is set.
96
+ */
97
+ readonly size = input<KjAvatarSize | undefined>(undefined);
98
+ /**
99
+ * Explicit avatar shape. Leave unset to inherit from a parent
100
+ * `<kj-avatar-group kjShape="...">`; falls back to `'circle'` when neither
101
+ * is set.
102
+ */
103
+ readonly shape = input<KjAvatarShape | undefined>(undefined);
104
+
105
+ /** Effective size — explicit input wins, then group context, then `'md'`. */
106
+ protected readonly resolvedSize = computed<KjAvatarSize>(() => {
107
+ const own = this.size();
108
+ if (own) return own;
109
+ const fromGroup = this.group?.size() as KjAvatarSize | undefined;
110
+ return fromGroup ?? 'md';
111
+ });
112
+
113
+ /** Effective shape — explicit input wins, then group context, then `'circle'`. */
114
+ protected readonly resolvedShape = computed<KjAvatarShape>(() => {
115
+ const own = this.shape();
116
+ if (own) return own;
117
+ return this.group?.shape() ?? 'circle';
118
+ });
119
+
120
+ protected isTemplate(v: unknown): v is TemplateRef<unknown> {
121
+ return v instanceof TemplateRef;
122
+ }
123
+ }
@@ -0,0 +1,2 @@
1
+ export * from './avatar';
2
+ export * from './avatar-group';
@@ -0,0 +1,18 @@
1
+ import { Component, ChangeDetectionStrategy } from '@angular/core';
2
+ import { KjBadgeComponent } from '../badge';
3
+
4
+ @Component({
5
+ selector: 'kj-badge-default-example',
6
+ standalone: true,
7
+ imports: [KjBadgeComponent],
8
+ styles: [
9
+ `
10
+ :host {
11
+ display: block;
12
+ }
13
+ `,
14
+ ],
15
+ changeDetection: ChangeDetectionStrategy.Eager,
16
+ template: `<kj-badge>New</kj-badge>`,
17
+ })
18
+ export class KjBadgeDefaultExample {}
@@ -0,0 +1,25 @@
1
+ import { Component, ChangeDetectionStrategy } from '@angular/core';
2
+ import { KjBadgeComponent } from '../badge';
3
+
4
+ @Component({
5
+ selector: 'kj-badge-sizes-example',
6
+ standalone: true,
7
+ imports: [KjBadgeComponent],
8
+ styles: [
9
+ `
10
+ :host {
11
+ display: flex;
12
+ gap: 0.5rem;
13
+ align-items: center;
14
+ }
15
+ `,
16
+ ],
17
+ changeDetection: ChangeDetectionStrategy.Eager,
18
+ template: `
19
+ <kj-badge size="xs">Extra small</kj-badge>
20
+ <kj-badge size="sm">Small</kj-badge>
21
+ <kj-badge size="md">Medium</kj-badge>
22
+ <kj-badge size="lg">Large</kj-badge>
23
+ `,
24
+ })
25
+ export class KjBadgeSizesExample {}
@@ -0,0 +1,24 @@
1
+ import { Component, ChangeDetectionStrategy } from '@angular/core';
2
+ import { KjBadgeComponent } from '../badge';
3
+
4
+ @Component({
5
+ selector: 'kj-badge-variants-example',
6
+ standalone: true,
7
+ imports: [KjBadgeComponent],
8
+ styles: [
9
+ `
10
+ :host {
11
+ display: flex;
12
+ gap: 0.5rem;
13
+ }
14
+ `,
15
+ ],
16
+ changeDetection: ChangeDetectionStrategy.Eager,
17
+ template: `
18
+ <kj-badge variant="default">Default</kj-badge>
19
+ <kj-badge variant="secondary">Secondary</kj-badge>
20
+ <kj-badge variant="destructive">Destructive</kj-badge>
21
+ <kj-badge variant="outline">Outline</kj-badge>
22
+ `,
23
+ })
24
+ export class KjBadgeVariantsExample {}
@@ -0,0 +1,31 @@
1
+ import { Component, ChangeDetectionStrategy } from '@angular/core';
2
+ import { KjBadgeComponent } from '../badge';
3
+
4
+ @Component({
5
+ selector: 'kj-badge-with-dot-example',
6
+ standalone: true,
7
+ imports: [KjBadgeComponent],
8
+ styles: [
9
+ `
10
+ :host {
11
+ display: flex;
12
+ gap: var(--kj-space-sm);
13
+ flex-wrap: wrap;
14
+ align-items: center;
15
+ }
16
+ .success {
17
+ --kj-badge-dot-color: var(--kj-bg-success);
18
+ }
19
+ .warning {
20
+ --kj-badge-dot-color: var(--kj-bg-warning);
21
+ }
22
+ `,
23
+ ],
24
+ changeDetection: ChangeDetectionStrategy.Eager,
25
+ template: `
26
+ <kj-badge dot variant="secondary" class="success">Active</kj-badge>
27
+ <kj-badge dot variant="secondary" class="warning">Pending</kj-badge>
28
+ <kj-badge dot variant="outline">Archived</kj-badge>
29
+ `,
30
+ })
31
+ export class KjBadgeWithDotExample {}