@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,68 @@
1
+ import { ChangeDetectionStrategy, Component, signal } from '@angular/core';
2
+ import { KjSpinnerComponent } from './spinner';
3
+ import type { PlaygroundFile } from '@kouji-ui/components/playground-types';
4
+
5
+ /**
6
+ * Playground state — module-scope signals.
7
+ */
8
+ const variant = signal<'neutral' | 'primary' | 'success' | 'warning' | 'error' | 'info'>('neutral');
9
+ const size = signal<'xs' | 'sm' | 'md' | 'lg'>('md');
10
+ const animation = signal<'spin' | 'dots' | 'bars'>('spin');
11
+ const ariaLabel = signal('Loading');
12
+
13
+ @Component({
14
+ selector: 'kj-spinner-playground',
15
+ standalone: true,
16
+ imports: [KjSpinnerComponent],
17
+ template: `
18
+ <kj-spinner
19
+ [kjVariant]="variant()"
20
+ [kjSize]="size()"
21
+ [kjAnimation]="animation()"
22
+ [kjAriaLabel]="ariaLabel()"
23
+ />
24
+ `,
25
+ changeDetection: ChangeDetectionStrategy.OnPush,
26
+ })
27
+ export class KjSpinnerPlaygroundDemo {
28
+ protected readonly variant = variant;
29
+ protected readonly size = size;
30
+ protected readonly animation = animation;
31
+ protected readonly ariaLabel = ariaLabel;
32
+ }
33
+
34
+ export const PLAYGROUND: PlaygroundFile = {
35
+ component: KjSpinnerPlaygroundDemo,
36
+ state: {
37
+ variant: variant as unknown as ReturnType<typeof signal>,
38
+ size: size as unknown as ReturnType<typeof signal>,
39
+ animation: animation as unknown as ReturnType<typeof signal>,
40
+ ariaLabel: ariaLabel as unknown as ReturnType<typeof signal>,
41
+ },
42
+ controls: [
43
+ {
44
+ kind: 'chips',
45
+ name: 'variant',
46
+ label: 'variant',
47
+ options: ['neutral', 'primary', 'success', 'warning', 'error', 'info'],
48
+ },
49
+ { kind: 'chips', name: 'size', label: 'size', options: ['xs', 'sm', 'md', 'lg'] },
50
+ { kind: 'chips', name: 'animation', label: 'animation', options: ['spin', 'dots', 'bars'] },
51
+ { kind: 'text', name: 'ariaLabel', label: 'aria label' },
52
+ ],
53
+ snippet: (values) => {
54
+ const s = values as {
55
+ variant: string;
56
+ size: string;
57
+ animation: string;
58
+ ariaLabel: string;
59
+ };
60
+ const attrs: string[] = [
61
+ `kjVariant="${s.variant}"`,
62
+ `kjSize="${s.size}"`,
63
+ `kjAnimation="${s.animation}"`,
64
+ `kjAriaLabel="${s.ariaLabel}"`,
65
+ ];
66
+ return `<kj-spinner\n ${attrs.join('\n ')}\n/>`;
67
+ },
68
+ };
@@ -0,0 +1,184 @@
1
+ import { Component, ChangeDetectionStrategy } from '@angular/core';
2
+ import { TestBed } from '@angular/core/testing';
3
+ import { describe, expect, test, beforeEach } from 'vitest';
4
+ import { KjSpinnerComponent } from './spinner';
5
+
6
+ /**
7
+ * Flush microtasks + the rAF that backs `afterNextRender` so the composed
8
+ * `KjSpinner` directive has a chance to read host attributes and the
9
+ * `prefers-reduced-motion` media query before assertions run.
10
+ */
11
+ async function flushAfterNextRender(): Promise<void> {
12
+ await new Promise<void>((resolve) => setTimeout(resolve, 0));
13
+ await Promise.resolve();
14
+ await Promise.resolve();
15
+ }
16
+
17
+ @Component({
18
+ standalone: true,
19
+ imports: [KjSpinnerComponent],
20
+ changeDetection: ChangeDetectionStrategy.Eager,
21
+ template: `<kj-spinner />`,
22
+ })
23
+ class DefaultHost {}
24
+
25
+ @Component({
26
+ standalone: true,
27
+ imports: [KjSpinnerComponent],
28
+ changeDetection: ChangeDetectionStrategy.Eager,
29
+ template: `<kj-spinner
30
+ [kjAnimation]="animation"
31
+ [kjVariant]="variant"
32
+ [kjSize]="size"
33
+ [kjAriaLabel]="label"
34
+ />`,
35
+ })
36
+ class ConfigurableHost {
37
+ animation: 'spin' | 'dots' | 'pulse' | 'bars' = 'spin';
38
+ variant = 'neutral';
39
+ size = 'md';
40
+ label = 'Loading';
41
+ }
42
+
43
+ @Component({
44
+ standalone: true,
45
+ imports: [KjSpinnerComponent],
46
+ changeDetection: ChangeDetectionStrategy.Eager,
47
+ template: `
48
+ <span id="busy-lbl">Loading users</span>
49
+ <kj-spinner aria-labelledby="busy-lbl" />
50
+ `,
51
+ })
52
+ class LabelledByHost {}
53
+
54
+ describe('KjSpinnerComponent', () => {
55
+ beforeEach(() => {
56
+ TestBed.configureTestingModule({});
57
+ });
58
+
59
+ describe('directive composition', () => {
60
+ test('hosts the KjSpinner directive on the kj-spinner element', async () => {
61
+ const fixture = TestBed.createComponent(DefaultHost);
62
+ fixture.detectChanges();
63
+ await flushAfterNextRender();
64
+ fixture.detectChanges();
65
+
66
+ const host = fixture.nativeElement.querySelector('kj-spinner') as HTMLElement;
67
+ // hostDirectives composition lands the directive's host bindings on the
68
+ // wrapper's host element — role / aria-live / aria-atomic are the
69
+ // canonical fingerprint of KjSpinner being applied.
70
+ expect(host).not.toBeNull();
71
+ expect(host.getAttribute('role')).toBe('status');
72
+ expect(host.getAttribute('aria-live')).toBe('polite');
73
+ expect(host.getAttribute('aria-atomic')).toBe('true');
74
+ expect(host.classList.contains('kj-spinner')).toBe(true);
75
+ });
76
+
77
+ test('renders the inner aria-hidden glyph element', async () => {
78
+ const fixture = TestBed.createComponent(DefaultHost);
79
+ fixture.detectChanges();
80
+ await flushAfterNextRender();
81
+ fixture.detectChanges();
82
+
83
+ const glyph = fixture.nativeElement.querySelector(
84
+ 'kj-spinner .kj-spinner__glyph',
85
+ ) as HTMLElement;
86
+ expect(glyph).not.toBeNull();
87
+ expect(glyph.getAttribute('aria-hidden')).toBe('true');
88
+ });
89
+ });
90
+
91
+ describe('default aria-label', () => {
92
+ test('applies "Loading" as the default aria-label on the host', async () => {
93
+ const fixture = TestBed.createComponent(DefaultHost);
94
+ fixture.detectChanges();
95
+ await flushAfterNextRender();
96
+ fixture.detectChanges();
97
+
98
+ const host = fixture.nativeElement.querySelector('kj-spinner') as HTMLElement;
99
+ expect(host.getAttribute('aria-label')).toBe('Loading');
100
+ });
101
+
102
+ test('forwards a custom kjAriaLabel input to the host aria-label', async () => {
103
+ const fixture = TestBed.createComponent(ConfigurableHost);
104
+ fixture.componentInstance.label = 'Saving draft';
105
+ fixture.detectChanges();
106
+ await flushAfterNextRender();
107
+ fixture.detectChanges();
108
+
109
+ const host = fixture.nativeElement.querySelector('kj-spinner') as HTMLElement;
110
+ expect(host.getAttribute('aria-label')).toBe('Saving draft');
111
+ });
112
+
113
+ test('renders the visually-hidden label copy when no aria-labelledby is authored', async () => {
114
+ const fixture = TestBed.createComponent(ConfigurableHost);
115
+ fixture.componentInstance.label = 'Sending message';
116
+ fixture.detectChanges();
117
+ await flushAfterNextRender();
118
+ fixture.detectChanges();
119
+
120
+ const hidden = fixture.nativeElement.querySelector(
121
+ 'kj-spinner span[kjVisuallyHidden]',
122
+ ) as HTMLElement;
123
+ expect(hidden).not.toBeNull();
124
+ expect(hidden.textContent?.trim()).toBe('Sending message');
125
+ });
126
+
127
+ test('skips the visually-hidden label when consumer authors aria-labelledby', async () => {
128
+ const fixture = TestBed.createComponent(LabelledByHost);
129
+ fixture.detectChanges();
130
+ await flushAfterNextRender();
131
+ fixture.detectChanges();
132
+
133
+ const hidden = fixture.nativeElement.querySelector('kj-spinner span[kjVisuallyHidden]');
134
+ expect(hidden).toBeNull();
135
+ const host = fixture.nativeElement.querySelector('kj-spinner') as HTMLElement;
136
+ expect(host.getAttribute('aria-labelledby')).toBe('busy-lbl');
137
+ });
138
+ });
139
+
140
+ describe('data-animation reflection', () => {
141
+ test('defaults to data-animation="spin"', async () => {
142
+ const fixture = TestBed.createComponent(DefaultHost);
143
+ fixture.detectChanges();
144
+ await flushAfterNextRender();
145
+ fixture.detectChanges();
146
+
147
+ const host = fixture.nativeElement.querySelector('kj-spinner') as HTMLElement;
148
+ expect(host.getAttribute('data-animation')).toBe('spin');
149
+ });
150
+
151
+ test('reflects kjAnimation="dots"', async () => {
152
+ const fixture = TestBed.createComponent(ConfigurableHost);
153
+ fixture.componentInstance.animation = 'dots';
154
+ fixture.detectChanges();
155
+ await flushAfterNextRender();
156
+ fixture.detectChanges();
157
+
158
+ const host = fixture.nativeElement.querySelector('kj-spinner') as HTMLElement;
159
+ expect(host.getAttribute('data-animation')).toBe('dots');
160
+ });
161
+
162
+ test('reflects kjAnimation="pulse"', async () => {
163
+ const fixture = TestBed.createComponent(ConfigurableHost);
164
+ fixture.componentInstance.animation = 'pulse';
165
+ fixture.detectChanges();
166
+ await flushAfterNextRender();
167
+ fixture.detectChanges();
168
+
169
+ const host = fixture.nativeElement.querySelector('kj-spinner') as HTMLElement;
170
+ expect(host.getAttribute('data-animation')).toBe('pulse');
171
+ });
172
+
173
+ test('reflects kjAnimation="bars"', async () => {
174
+ const fixture = TestBed.createComponent(ConfigurableHost);
175
+ fixture.componentInstance.animation = 'bars';
176
+ fixture.detectChanges();
177
+ await flushAfterNextRender();
178
+ fixture.detectChanges();
179
+
180
+ const host = fixture.nativeElement.querySelector('kj-spinner') as HTMLElement;
181
+ expect(host.getAttribute('data-animation')).toBe('bars');
182
+ });
183
+ });
184
+ });
@@ -0,0 +1,185 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ ElementRef,
5
+ ViewEncapsulation,
6
+ computed,
7
+ inject,
8
+ input,
9
+ } from '@angular/core';
10
+ import { KjSpinner, type KjSpinnerAnimation, KjVisuallyHidden } from '@kouji-ui/core';
11
+
12
+ /**
13
+ * Styled wrapper around the headless `KjSpinner` directive.
14
+ *
15
+ * Composes `KjSpinner` via `hostDirectives` so the wrapper's host element is
16
+ * *the* spinner — `role="status"`, `aria-live="polite"`, `aria-atomic="true"`,
17
+ * the `aria-label` default ("Loading"), `data-animation`, and
18
+ * `data-reduced-motion` all land on `<kj-spinner>` itself. `kjVariant` and
19
+ * `kjSize` are wrapper-level inputs that the host mirrors to `data-variant` /
20
+ * `data-size` (the directive's own nested `KjVariant` / `KjSize` host
21
+ * directives are not transitively exposed through outer composition, so the
22
+ * wrapper takes over the data-attribute reflection at this layer).
23
+ *
24
+ * The template renders an `aria-hidden` glyph element (the visual shape that
25
+ * theme CSS keyframes drive per `data-animation`) and, when no
26
+ * `aria-labelledby` was authored on the host, a `kjVisuallyHidden` label so
27
+ * AT always finds an accessible name.
28
+ *
29
+ * **Indeterminate-only.** The spinner answers "something is happening" — it
30
+ * has no value model. For "x of y" use Progress Bar; for missing-content
31
+ * placeholders use Skeleton.
32
+ *
33
+ * @example
34
+ * ```html
35
+ * <kj-spinner />
36
+ * <kj-spinner kjVariant="primary" kjSize="lg" kjAnimation="dots" kjAriaLabel="Sending" />
37
+ * ```
38
+ * @doc-example Default
39
+ * The default playground — `spin` animation, `md` size, neutral variant,
40
+ * default `aria-label="Loading"`.
41
+ * @doc-file spinner.example.ts
42
+ * @doc-example Usage
43
+ * A walkthrough of the most common spinner usages — size, variant,
44
+ * animation glyph, and inline placement next to copy.
45
+ * @doc-file spinner.usage.example.ts
46
+ * @doc-example Sizes
47
+ * `xs` / `sm` / `md` / `lg` presets. There is intentionally no `xl` — that
48
+ * size almost always wants a determinate Progress Bar instead.
49
+ * @doc-file spinner.sizes.example.ts
50
+ * @doc-example Variants
51
+ * `neutral` (inherits `currentColor`), `primary`, `success`, `warning`,
52
+ * `error`, `info`.
53
+ * @doc-file spinner.variants.example.ts
54
+ * @doc-example Animations
55
+ * Animation shape preset — `spin`, `dots`, `bars`, etc. Themes own the
56
+ * keyframes per value.
57
+ * @doc-file spinner.animations.example.ts
58
+ * @doc-example Inside a button
59
+ * Embed the spinner inline next to a label to communicate in-flight work.
60
+ * @doc-file spinner.in-button.example.ts
61
+ *
62
+ * @doc-keyboard
63
+ * — — Non-interactive. The spinner is purely a status indicator.
64
+ *
65
+ * @doc-aria
66
+ * role="status" — set on the host so AT announces it as a live status region
67
+ * aria-live — "polite" so the label is read without interrupting the user
68
+ * aria-atomic — "true" so the full label is announced on change
69
+ * aria-label — Defaults to "Loading"; override per context (e.g. "Sending")
70
+ * data-animation — Mirrors the resolved animation for theme hooks
71
+ * data-variant — Mirrors the resolved variant for theme hooks
72
+ * data-size — Mirrors the resolved size for theme hooks
73
+ *
74
+ * @doc-touch
75
+ * — — Non-interactive; no touch target required.
76
+ *
77
+ * @doc-a11y
78
+ * Indeterminate-only — answers "something is happening", with no value model.
79
+ * Honours `prefers-reduced-motion` via `data-reduced-motion` on the host, so
80
+ * themes can swap a calmer animation. When the consumer authors
81
+ * `aria-labelledby` on the host the wrapper skips the visually-hidden label
82
+ * to avoid double-naming.
83
+ *
84
+ * @doc-related progress-bar,skeleton,toast
85
+ *
86
+ * @doc-css-var
87
+ * --kj-spinner-size — Glyph diameter. Sizes (xs/sm/md/lg) override.
88
+ * --kj-spinner-color — Foreground color of the glyph. Variants set this; neutral inherits currentColor.
89
+ * --kj-spinner-track — Track/background color for the spin arc.
90
+ * --kj-spinner-duration — Base animation duration. Other animations scale off this.
91
+ *
92
+ * @doc-category Library/Feedback
93
+ * @doc
94
+ * @doc-name spinner
95
+ * @doc-description Themed indeterminate loading spinner with variant, size, and animation glyph options.
96
+ * @doc-is-main
97
+ */
98
+ @Component({
99
+ selector: 'kj-spinner',
100
+ standalone: true,
101
+ imports: [KjVisuallyHidden],
102
+ hostDirectives: [
103
+ {
104
+ directive: KjSpinner,
105
+ // KjSpinner's own surface — kjVariant + kjSize live on its nested
106
+ // KjVariant / KjSize and are not surfaced through this outer
107
+ // composition; they are re-exposed as wrapper inputs below and wired
108
+ // straight to the host's data-variant / data-size attributes.
109
+ inputs: ['kjAnimation', 'kjAriaLabel'],
110
+ },
111
+ ],
112
+ template: `
113
+ <span class="kj-spinner__glyph" aria-hidden="true"></span>
114
+ @if (shouldRenderHiddenLabel()) {
115
+ <span kjVisuallyHidden>{{ kjAriaLabel() }}</span>
116
+ }
117
+ `,
118
+ styleUrl: './spinner.css',
119
+ encapsulation: ViewEncapsulation.None,
120
+ host: {
121
+ 'class': 'kj-spinner',
122
+ '[attr.data-variant]': 'kjVariant()',
123
+ '[attr.data-size]': 'kjSize()',
124
+ },
125
+ changeDetection: ChangeDetectionStrategy.OnPush,
126
+ })
127
+ export class KjSpinnerComponent {
128
+ /**
129
+ * Color preset reflected to `data-variant` on the host. Defaults to
130
+ * `'neutral'`, which resolves to `currentColor` in shipped themes — so a
131
+ * spinner inside a coloured surface inherits its parent's text colour.
132
+ */
133
+ readonly kjVariant = input<string>('neutral');
134
+
135
+ /**
136
+ * Size preset reflected to `data-size` on the host. Defaults to `'md'`.
137
+ * Sizes ship as `xs | sm | md | lg`; an `xl` is intentionally absent — a
138
+ * spinner that big almost always wants a determinate Progress Bar instead.
139
+ */
140
+ readonly kjSize = input<string>('md');
141
+
142
+ /**
143
+ * Animation shape preset forwarded to `KjSpinner.kjAnimation` via the
144
+ * composed host directive. Reflects on the host as `data-animation`.
145
+ * Themes own the keyframes per value.
146
+ */
147
+ readonly kjAnimation = input<KjSpinnerAnimation>('spin');
148
+
149
+ /**
150
+ * Accessible name forwarded to `KjSpinner.kjAriaLabel` via the composed
151
+ * host directive. Default `'Loading'`. Used both as the host's
152
+ * `aria-label` and as the visually-hidden text rendered inside the
153
+ * wrapper when no consumer-authored `aria-labelledby` is on the element.
154
+ */
155
+ readonly kjAriaLabel = input<string>('Loading');
156
+
157
+ private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);
158
+
159
+ /**
160
+ * Snapshotted at construction: did the consumer author `aria-labelledby`
161
+ * directly on `<kj-spinner>`? If so the accessible name is the referenced
162
+ * element and we must not project a hidden duplicate. Read in the
163
+ * constructor — by the time the template renders the directive may have
164
+ * stamped its own attributes on the host.
165
+ */
166
+ private readonly hasAuthoredLabelledBy: boolean;
167
+
168
+ /**
169
+ * `true` when the consumer did **not** author `aria-labelledby` on the
170
+ * wrapper — i.e. the spinner's accessible name is its `aria-label`. The
171
+ * wrapper renders a `kjVisuallyHidden` copy of the label as inner text so
172
+ * AT that prefers content over `aria-label` (or that announces a
173
+ * `role="status"` region's body on insertion) still has a name to read.
174
+ * A consumer-authored `aria-labelledby` opts out of that hidden copy to
175
+ * avoid double-naming the host.
176
+ */
177
+ protected readonly shouldRenderHiddenLabel = computed(
178
+ () => !this.hasAuthoredLabelledBy,
179
+ );
180
+
181
+ constructor() {
182
+ this.hasAuthoredLabelledBy =
183
+ this.el.nativeElement.hasAttribute('aria-labelledby');
184
+ }
185
+ }
@@ -0,0 +1,8 @@
1
+ // AUTO-GENERATED by scripts/migrate-examples.mjs
2
+ // One barrel per component folder — used by the docs app as a lazy chunk.
3
+ export { KjStepperExample } from './stepper.example';
4
+ export { KjStepperNonLinearExample } from './stepper.non-linear.example';
5
+ export { KjStepperOptionalStepExample } from './stepper.optional-step.example';
6
+ export { KjStepperUsageExample } from './stepper.usage.example';
7
+ export { KjStepperVerticalExample } from './stepper.vertical.example';
8
+ export { KjStepperWithErrorExample } from './stepper.with-error.example';
@@ -0,0 +1,62 @@
1
+ import { Component, signal, ChangeDetectionStrategy } from '@angular/core';
2
+ import {
3
+ KjStepperComponent,
4
+ KjStepComponent,
5
+ KjStepLabelComponent,
6
+ KjStepContentComponent,
7
+ KjStepperNextComponent,
8
+ KjStepperPreviousComponent,
9
+ } from '../stepper';
10
+
11
+ /**
12
+ * Default 3-step linear stepper. Demonstrates the canonical Account → Profile →
13
+ * Confirm flow with `kjLinear` advancement gated by per-step completion.
14
+ */
15
+ @Component({
16
+ selector: 'kj-stepper-example',
17
+ standalone: true,
18
+ imports: [
19
+ KjStepperComponent,
20
+ KjStepComponent,
21
+ KjStepLabelComponent,
22
+ KjStepContentComponent,
23
+ KjStepperNextComponent,
24
+ KjStepperPreviousComponent,
25
+ ],
26
+ styles: [
27
+ `
28
+ :host {
29
+ display: block;
30
+ }
31
+ .actions {
32
+ display: flex;
33
+ gap: var(--kj-space-sm);
34
+ margin-top: var(--kj-space-lg);
35
+ }
36
+ `,
37
+ ],
38
+ changeDetection: ChangeDetectionStrategy.Eager,
39
+ template: `
40
+ <kj-stepper [(kjActiveStep)]="active" [kjLinear]="true">
41
+ <kj-step [kjStepCompleted]="active() > 0">
42
+ <kj-step-label>Account</kj-step-label>
43
+ <kj-step-content>Create your account.</kj-step-content>
44
+ </kj-step>
45
+ <kj-step [kjStepCompleted]="active() > 1">
46
+ <kj-step-label>Profile</kj-step-label>
47
+ <kj-step-content>Tell us about yourself.</kj-step-content>
48
+ </kj-step>
49
+ <kj-step>
50
+ <kj-step-label>Confirm</kj-step-label>
51
+ <kj-step-content>Review and submit.</kj-step-content>
52
+ </kj-step>
53
+ <div class="actions">
54
+ <kj-stepper-previous>Back</kj-stepper-previous>
55
+ <kj-stepper-next>Continue</kj-stepper-next>
56
+ </div>
57
+ </kj-stepper>
58
+ `,
59
+ })
60
+ export class KjStepperExample {
61
+ readonly active = signal(0);
62
+ }
@@ -0,0 +1,63 @@
1
+ import { Component, signal, ChangeDetectionStrategy } from '@angular/core';
2
+ import {
3
+ KjStepperComponent,
4
+ KjStepComponent,
5
+ KjStepLabelComponent,
6
+ KjStepContentComponent,
7
+ KjStepperNextComponent,
8
+ KjStepperPreviousComponent,
9
+ } from '../stepper';
10
+
11
+ /**
12
+ * Non-linear stepper. Every header is reachable at any time — useful for
13
+ * settings panels and long-form editors where the steps don't depend on
14
+ * each other.
15
+ */
16
+ @Component({
17
+ selector: 'kj-stepper-non-linear-example',
18
+ standalone: true,
19
+ imports: [
20
+ KjStepperComponent,
21
+ KjStepComponent,
22
+ KjStepLabelComponent,
23
+ KjStepContentComponent,
24
+ KjStepperNextComponent,
25
+ KjStepperPreviousComponent,
26
+ ],
27
+ styles: [
28
+ `
29
+ :host {
30
+ display: block;
31
+ }
32
+ .actions {
33
+ display: flex;
34
+ gap: var(--kj-space-sm);
35
+ margin-top: var(--kj-space-lg);
36
+ }
37
+ `,
38
+ ],
39
+ changeDetection: ChangeDetectionStrategy.Eager,
40
+ template: `
41
+ <kj-stepper [(kjActiveStep)]="active">
42
+ <kj-step>
43
+ <kj-step-label>Profile</kj-step-label>
44
+ <kj-step-content>Edit your profile.</kj-step-content>
45
+ </kj-step>
46
+ <kj-step>
47
+ <kj-step-label>Notifications</kj-step-label>
48
+ <kj-step-content>Tune your alerts.</kj-step-content>
49
+ </kj-step>
50
+ <kj-step>
51
+ <kj-step-label>Billing</kj-step-label>
52
+ <kj-step-content>Update payment.</kj-step-content>
53
+ </kj-step>
54
+ <div class="actions">
55
+ <kj-stepper-previous>Back</kj-stepper-previous>
56
+ <kj-stepper-next>Next</kj-stepper-next>
57
+ </div>
58
+ </kj-stepper>
59
+ `,
60
+ })
61
+ export class KjStepperNonLinearExample {
62
+ readonly active = signal(0);
63
+ }
@@ -0,0 +1,62 @@
1
+ import { Component, signal, ChangeDetectionStrategy } from '@angular/core';
2
+ import {
3
+ KjStepperComponent,
4
+ KjStepComponent,
5
+ KjStepLabelComponent,
6
+ KjStepContentComponent,
7
+ KjStepperNextComponent,
8
+ KjStepperPreviousComponent,
9
+ } from '../stepper';
10
+
11
+ /**
12
+ * Linear stepper with an optional middle step. `kjStepOptional` lifts the
13
+ * `linear`-mode advancement gate so the user may skip without satisfying it.
14
+ */
15
+ @Component({
16
+ selector: 'kj-stepper-optional-step-example',
17
+ standalone: true,
18
+ imports: [
19
+ KjStepperComponent,
20
+ KjStepComponent,
21
+ KjStepLabelComponent,
22
+ KjStepContentComponent,
23
+ KjStepperNextComponent,
24
+ KjStepperPreviousComponent,
25
+ ],
26
+ styles: [
27
+ `
28
+ :host {
29
+ display: block;
30
+ }
31
+ .actions {
32
+ display: flex;
33
+ gap: var(--kj-space-sm);
34
+ margin-top: var(--kj-space-lg);
35
+ }
36
+ `,
37
+ ],
38
+ changeDetection: ChangeDetectionStrategy.Eager,
39
+ template: `
40
+ <kj-stepper [(kjActiveStep)]="active" [kjLinear]="true">
41
+ <kj-step [kjStepCompleted]="active() > 0">
42
+ <kj-step-label>Account</kj-step-label>
43
+ <kj-step-content>Required.</kj-step-content>
44
+ </kj-step>
45
+ <kj-step [kjStepOptional]="true">
46
+ <kj-step-label>Avatar (optional)</kj-step-label>
47
+ <kj-step-content>Skip if you'd rather upload later.</kj-step-content>
48
+ </kj-step>
49
+ <kj-step>
50
+ <kj-step-label>Confirm</kj-step-label>
51
+ <kj-step-content>Review and submit.</kj-step-content>
52
+ </kj-step>
53
+ <div class="actions">
54
+ <kj-stepper-previous>Back</kj-stepper-previous>
55
+ <kj-stepper-next>Continue</kj-stepper-next>
56
+ </div>
57
+ </kj-stepper>
58
+ `,
59
+ })
60
+ export class KjStepperOptionalStepExample {
61
+ readonly active = signal(0);
62
+ }