@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,113 @@
1
+ /* ─────────────────────────────────────────────────────────────
2
+ .kj-progress-bar — component-layer tokens + structural CSS
3
+ The directive owns the value math + ARIA contract. The theme
4
+ only renders track + fill. Variant tokens flip the fill colour;
5
+ size tokens flip the bar height. The indeterminate stripe is a
6
+ pure CSS animation, neutralised under prefers-reduced-motion.
7
+ ──────────────────────────────────────────────────────────── */
8
+
9
+ @layer kj.component {
10
+ .kj-progress-bar {
11
+ /* component knobs — themes/users can override any of these */
12
+ --kj-progress-bar-track: var(--kj-bg-field);
13
+ --kj-progress-bar-fill: var(--kj-bg-primary);
14
+ --kj-progress-bar-radius: 9999px;
15
+ --kj-progress-bar-height: 0.5rem; /* md default — 8px */
16
+ --kj-progress-bar-transition: 200ms ease-out;
17
+ --kj-progress-bar-indeterminate-duration: 1.6s;
18
+
19
+ display: block;
20
+ position: relative;
21
+ width: 100%;
22
+ height: var(--kj-progress-bar-height);
23
+ background: var(--kj-progress-bar-track);
24
+ border-radius: var(--kj-progress-bar-radius);
25
+ overflow: hidden;
26
+ }
27
+
28
+ /* ── Sizes ── (data-size mirrored by KjSize host directive) */
29
+ .kj-progress-bar[data-size="xs"] { --kj-progress-bar-height: 0.125rem; } /* 2px */
30
+ .kj-progress-bar[data-size="sm"] { --kj-progress-bar-height: 0.25rem; } /* 4px */
31
+ .kj-progress-bar[data-size="md"] { --kj-progress-bar-height: 0.5rem; } /* 8px */
32
+ .kj-progress-bar[data-size="lg"] { --kj-progress-bar-height: 0.75rem; } /* 12px */
33
+
34
+ /* ── Variants ── (data-variant mirrored by KjVariant host directive) */
35
+ .kj-progress-bar[data-variant="primary"] { --kj-progress-bar-fill: var(--kj-bg-primary); }
36
+ .kj-progress-bar[data-variant="success"] { --kj-progress-bar-fill: var(--kj-bg-success); }
37
+ .kj-progress-bar[data-variant="warning"] { --kj-progress-bar-fill: var(--kj-bg-warning); }
38
+ .kj-progress-bar[data-variant="error"] { --kj-progress-bar-fill: var(--kj-bg-danger); }
39
+
40
+ /* ── Fill (determinate) ──
41
+ The directive sets --kj-progress-fraction (0..1) on the host AND on the
42
+ fill. Reading from the fill is one selector hop shorter and lets us scope
43
+ the transition cleanly. */
44
+ .kj-progress-bar__fill {
45
+ display: block;
46
+ width: 100%;
47
+ height: 100%;
48
+ background: var(--kj-progress-bar-fill);
49
+ border-radius: inherit;
50
+ transform-origin: left center;
51
+ transform: scaleX(var(--kj-progress-fraction, 0));
52
+ /* Transition the fill width on value changes — but never the colour, so
53
+ a variant flip mid-flight is instantaneous. */
54
+ transition: transform var(--kj-progress-bar-transition);
55
+ }
56
+
57
+ /* RTL: the fill grows from the right edge. */
58
+ [dir="rtl"] .kj-progress-bar__fill {
59
+ transform-origin: right center;
60
+ }
61
+
62
+ /* ── Fill (indeterminate) ──
63
+ When data-indeterminate="true", abandon the scaleX(fraction) transform
64
+ and run a stripe that travels left → right. The stripe is a 50%-wide
65
+ coloured band on a transparent track, which gives a clean "working"
66
+ read on every theme without needing the track itself to animate. */
67
+ .kj-progress-bar__fill[data-indeterminate="true"] {
68
+ transform: none;
69
+ background: linear-gradient(
70
+ 90deg,
71
+ transparent 0%,
72
+ var(--kj-progress-bar-fill) 50%,
73
+ transparent 100%
74
+ );
75
+ background-size: 50% 100%;
76
+ background-repeat: no-repeat;
77
+ animation: kj-progress-bar-indeterminate
78
+ var(--kj-progress-bar-indeterminate-duration) linear infinite;
79
+ }
80
+
81
+ @keyframes kj-progress-bar-indeterminate {
82
+ from { background-position: -50% 0; }
83
+ to { background-position: 150% 0; }
84
+ }
85
+
86
+ /* ── Reduced motion ──
87
+ APG / WCAG 2.3.3: animations from interactions must respect
88
+ prefers-reduced-motion. The directive reflects data-reduced-motion;
89
+ we also honour the media query directly so the rule kicks in even if
90
+ the directive's media-query subscription hasn't run yet (SSR, very
91
+ early paint). The indeterminate stripe collapses to a static, dimmed
92
+ fill — still visible as "something is happening", just not moving. */
93
+ .kj-progress-bar[data-reduced-motion="reduce"] .kj-progress-bar__fill,
94
+ .kj-progress-bar[data-reduced-motion="reduce"] .kj-progress-bar__fill[data-indeterminate="true"] {
95
+ animation: none;
96
+ transition: none;
97
+ }
98
+ .kj-progress-bar[data-reduced-motion="reduce"] .kj-progress-bar__fill[data-indeterminate="true"] {
99
+ background: var(--kj-progress-bar-fill);
100
+ opacity: 0.6;
101
+ }
102
+
103
+ @media (prefers-reduced-motion: reduce) {
104
+ .kj-progress-bar__fill {
105
+ transition: none;
106
+ }
107
+ .kj-progress-bar__fill[data-indeterminate="true"] {
108
+ animation: none;
109
+ background: var(--kj-progress-bar-fill);
110
+ opacity: 0.6;
111
+ }
112
+ }
113
+ }
@@ -0,0 +1,87 @@
1
+ import { ChangeDetectionStrategy, Component, signal } from '@angular/core';
2
+ import { KjProgressBarComponent } from './progress-bar';
3
+ import type { PlaygroundFile } from '@kouji-ui/components/playground-types';
4
+
5
+ const value = signal<number>(60);
6
+ const min = signal<number>(0);
7
+ const max = signal<number>(100);
8
+ const variant = signal<'primary' | 'success' | 'warning' | 'error'>('primary');
9
+ const size = signal<'xs' | 'sm' | 'md' | 'lg'>('md');
10
+ const ariaValuetext = signal<string>('');
11
+
12
+ @Component({
13
+ selector: 'kj-progress-bar-playground',
14
+ standalone: true,
15
+ imports: [KjProgressBarComponent],
16
+ styles: [`
17
+ /* The progress bar itself uses width: 100%, but the flex-centered
18
+ playground stage shrinks it to content size — give the host a
19
+ comfortable width so the bar has something to fill. */
20
+ :host { display: block; width: min(420px, 100%); }
21
+ `],
22
+ template: `
23
+ <kj-progress-bar
24
+ [kjValue]="value()"
25
+ [kjMin]="min()"
26
+ [kjMax]="max()"
27
+ [kjVariant]="variant()"
28
+ [kjSize]="size()"
29
+ [kjAriaValuetext]="ariaValuetext()"
30
+ kjAriaLabel="Loading progress"
31
+ />
32
+ `,
33
+ changeDetection: ChangeDetectionStrategy.OnPush,
34
+ })
35
+ export class KjProgressBarPlaygroundDemo {
36
+ protected readonly value = value;
37
+ protected readonly min = min;
38
+ protected readonly max = max;
39
+ protected readonly variant = variant;
40
+ protected readonly size = size;
41
+ protected readonly ariaValuetext = ariaValuetext;
42
+ }
43
+
44
+ export const PLAYGROUND: PlaygroundFile = {
45
+ component: KjProgressBarPlaygroundDemo,
46
+ state: {
47
+ value: value as unknown as ReturnType<typeof signal>,
48
+ min: min as unknown as ReturnType<typeof signal>,
49
+ max: max as unknown as ReturnType<typeof signal>,
50
+ variant: variant as unknown as ReturnType<typeof signal>,
51
+ size: size as unknown as ReturnType<typeof signal>,
52
+ ariaValuetext: ariaValuetext as unknown as ReturnType<typeof signal>,
53
+ },
54
+ controls: [
55
+ { kind: 'number', name: 'value', label: 'value' },
56
+ { kind: 'number', name: 'min', label: 'min' },
57
+ { kind: 'number', name: 'max', label: 'max' },
58
+ {
59
+ kind: 'chips',
60
+ name: 'variant',
61
+ label: 'variant',
62
+ options: ['primary', 'success', 'warning', 'error'],
63
+ },
64
+ { kind: 'chips', name: 'size', label: 'size', options: ['xs', 'sm', 'md', 'lg'] },
65
+ { kind: 'text', name: 'ariaValuetext', label: 'aria-valuetext' },
66
+ ],
67
+ snippet: (values) => {
68
+ const s = values as {
69
+ value: number;
70
+ min: number;
71
+ max: number;
72
+ variant: string;
73
+ size: string;
74
+ ariaValuetext: string;
75
+ };
76
+ const attrs: string[] = [
77
+ `[kjValue]="${s.value}"`,
78
+ `[kjMin]="${s.min}"`,
79
+ `[kjMax]="${s.max}"`,
80
+ `kjVariant="${s.variant}"`,
81
+ `kjSize="${s.size}"`,
82
+ ];
83
+ if (s.ariaValuetext) attrs.push(`kjAriaValuetext="${s.ariaValuetext}"`);
84
+ attrs.push('kjAriaLabel="Loading progress"');
85
+ return `<kj-progress-bar\n ${attrs.join('\n ')}\n/>`;
86
+ },
87
+ };
@@ -0,0 +1,233 @@
1
+ import { Component, signal } from '@angular/core';
2
+ import { render } from '@testing-library/angular';
3
+ import { describe, expect, it } from 'vitest';
4
+
5
+ import { KjProgressBarComponent } from './progress-bar';
6
+
7
+ const imports = [KjProgressBarComponent];
8
+
9
+ /**
10
+ * Flush microtasks + the rAF backing `afterNextRender` so the directive has
11
+ * a chance to subscribe to the reduced-motion signal and write its host
12
+ * attributes before assertions read them.
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
+ /** The wrapper's `<kj-progress-bar>` host renders `display: contents` and
21
+ * delegates ARIA + value math to an inner `<div kjProgressBar>`. The inner
22
+ * div is what carries `role`, the value attributes, and the data-*
23
+ * reflections — that's the assertion target. */
24
+ function getBar(container: ParentNode): HTMLElement {
25
+ const bar = container.querySelector('div.kj-progress-bar') as HTMLElement;
26
+ if (!bar) throw new Error('kj-progress-bar inner element not found');
27
+ return bar;
28
+ }
29
+
30
+ describe('KjProgressBarComponent', () => {
31
+ it('renders the wrapper with an inner [kjProgressBar] and a [kjProgressBarFill]', async () => {
32
+ @Component({
33
+ standalone: true,
34
+ imports,
35
+ template: `<kj-progress-bar [kjValue]="50" kjAriaLabel="x" />`,
36
+ })
37
+ class Host {}
38
+
39
+ const { container } = await render(Host);
40
+ await flush();
41
+
42
+ const wrapper = container.querySelector('kj-progress-bar') as HTMLElement;
43
+ expect(wrapper).toBeTruthy();
44
+
45
+ const bar = getBar(container);
46
+ expect(bar.getAttribute('role')).toBe('progressbar');
47
+
48
+ // Wrapper is responsible for rendering the inner fill so consumers
49
+ // don't have to remember the two-element shape.
50
+ const fill = bar.querySelector('.kj-progress-bar__fill') as HTMLElement;
51
+ expect(fill).toBeTruthy();
52
+ // Fill is the [kjProgressBarFill] directive host — it reflects the
53
+ // parent fraction as --kj-progress-fraction (proves wiring is intact).
54
+ expect(fill.style.getPropertyValue('--kj-progress-fraction')).toBe('0.5');
55
+ });
56
+
57
+ it('forwards kjValue: aliased input drives aria-valuenow when determinate', async () => {
58
+ @Component({
59
+ standalone: true,
60
+ imports,
61
+ template: `<kj-progress-bar [kjValue]="42" kjAriaLabel="Upload" />`,
62
+ })
63
+ class Host {}
64
+
65
+ const { container } = await render(Host);
66
+ await flush();
67
+
68
+ const bar = getBar(container);
69
+ expect(bar.getAttribute('role')).toBe('progressbar');
70
+ expect(bar.getAttribute('aria-valuenow')).toBe('42');
71
+ expect(bar.getAttribute('aria-valuemin')).toBe('0');
72
+ expect(bar.getAttribute('aria-valuemax')).toBe('100');
73
+ });
74
+
75
+ it('omits aria-valuenow when kjValue is null (indeterminate)', async () => {
76
+ @Component({
77
+ standalone: true,
78
+ imports,
79
+ template: `<kj-progress-bar [kjValue]="null" kjAriaLabel="Loading" />`,
80
+ })
81
+ class Host {}
82
+
83
+ const { container } = await render(Host);
84
+ await flush();
85
+
86
+ const bar = getBar(container);
87
+ // APG-correct: indeterminate must NOT carry aria-valuenow at all.
88
+ expect(bar.hasAttribute('aria-valuenow')).toBe(false);
89
+ expect(bar.getAttribute('data-indeterminate')).toBe('true');
90
+
91
+ // Bounds attributes are still present in indeterminate mode.
92
+ expect(bar.getAttribute('aria-valuemin')).toBe('0');
93
+ expect(bar.getAttribute('aria-valuemax')).toBe('100');
94
+ });
95
+
96
+ it('forwards kjMin / kjMax for absolute units', async () => {
97
+ @Component({
98
+ standalone: true,
99
+ imports,
100
+ template: `
101
+ <kj-progress-bar
102
+ [kjMin]="0"
103
+ [kjMax]="2500000"
104
+ [kjValue]="1200000"
105
+ kjAriaLabel="bytes"
106
+ />
107
+ `,
108
+ })
109
+ class Host {}
110
+
111
+ const { container } = await render(Host);
112
+ await flush();
113
+
114
+ const bar = getBar(container);
115
+ expect(bar.getAttribute('aria-valuemin')).toBe('0');
116
+ expect(bar.getAttribute('aria-valuemax')).toBe('2500000');
117
+ expect(bar.getAttribute('aria-valuenow')).toBe('1200000');
118
+ });
119
+
120
+ it('forwards kjAriaValuetext to the host', async () => {
121
+ @Component({
122
+ standalone: true,
123
+ imports,
124
+ template: `<kj-progress-bar [kjValue]="60" kjAriaValuetext="Step 3 of 5" kjAriaLabel="Onboarding" />`,
125
+ })
126
+ class Host {}
127
+
128
+ const { container } = await render(Host);
129
+ await flush();
130
+
131
+ const bar = getBar(container);
132
+ expect(bar.getAttribute('aria-valuetext')).toBe('Step 3 of 5');
133
+ // Visual fraction is still 60% even though SR reads the phrasing.
134
+ expect(bar.getAttribute('aria-valuenow')).toBe('60');
135
+ });
136
+
137
+ it('forwards kjVariant and kjSize through the composed directives', async () => {
138
+ @Component({
139
+ standalone: true,
140
+ imports,
141
+ template: `<kj-progress-bar [kjValue]="50" kjVariant="success" kjSize="lg" kjAriaLabel="x" />`,
142
+ })
143
+ class Host {}
144
+
145
+ const { container } = await render(Host);
146
+ await flush();
147
+
148
+ const bar = getBar(container);
149
+ expect(bar.getAttribute('data-variant')).toBe('success');
150
+ expect(bar.getAttribute('data-size')).toBe('lg');
151
+ });
152
+
153
+ it('reflects defaults when no variant/size provided (primary, md)', async () => {
154
+ @Component({
155
+ standalone: true,
156
+ imports,
157
+ template: `<kj-progress-bar [kjValue]="50" kjAriaLabel="x" />`,
158
+ })
159
+ class Host {}
160
+
161
+ const { container } = await render(Host);
162
+ await flush();
163
+
164
+ const bar = getBar(container);
165
+ expect(bar.getAttribute('data-variant')).toBe('primary');
166
+ expect(bar.getAttribute('data-size')).toBe('md');
167
+ });
168
+
169
+ it('binds kjAriaLabel to the bar', async () => {
170
+ @Component({
171
+ standalone: true,
172
+ imports,
173
+ template: `<kj-progress-bar [kjValue]="50" kjAriaLabel="Upload progress" />`,
174
+ })
175
+ class Host {}
176
+
177
+ const { container } = await render(Host);
178
+ await flush();
179
+
180
+ const bar = getBar(container);
181
+ expect(bar.getAttribute('aria-label')).toBe('Upload progress');
182
+ });
183
+
184
+ it('binds kjAriaLabelledby to the bar', async () => {
185
+ @Component({
186
+ standalone: true,
187
+ imports,
188
+ template: `
189
+ <span id="upload-heading">Upload</span>
190
+ <kj-progress-bar [kjValue]="50" kjAriaLabelledby="upload-heading" />
191
+ `,
192
+ })
193
+ class Host {}
194
+
195
+ const { container } = await render(Host);
196
+ await flush();
197
+
198
+ const bar = getBar(container);
199
+ expect(bar.getAttribute('aria-labelledby')).toBe('upload-heading');
200
+ });
201
+
202
+ it('switches between determinate and indeterminate reactively', async () => {
203
+ @Component({
204
+ standalone: true,
205
+ imports,
206
+ template: `<kj-progress-bar [kjValue]="value()" kjAriaLabel="x" />`,
207
+ })
208
+ class Host {
209
+ readonly value = signal<number | null>(30);
210
+ }
211
+
212
+ const { fixture } = await render(Host);
213
+ await flush();
214
+
215
+ const bar = getBar(fixture.nativeElement);
216
+ expect(bar.getAttribute('aria-valuenow')).toBe('30');
217
+ expect(bar.hasAttribute('data-indeterminate')).toBe(false);
218
+
219
+ fixture.componentInstance.value.set(null);
220
+ fixture.detectChanges();
221
+ await flush();
222
+
223
+ expect(bar.hasAttribute('aria-valuenow')).toBe(false);
224
+ expect(bar.getAttribute('data-indeterminate')).toBe('true');
225
+
226
+ fixture.componentInstance.value.set(80);
227
+ fixture.detectChanges();
228
+ await flush();
229
+
230
+ expect(bar.getAttribute('aria-valuenow')).toBe('80');
231
+ expect(bar.hasAttribute('data-indeterminate')).toBe(false);
232
+ });
233
+ });
@@ -0,0 +1,155 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ ViewEncapsulation,
5
+ input,
6
+ } from '@angular/core';
7
+ import { KjProgressBar, KjProgressBarFill } from '@kouji-ui/core';
8
+
9
+ /**
10
+ * Styled wrapper around the headless `KjProgressBar` directive. Composes the
11
+ * core directive on an inner element and renders the inner
12
+ * `[kjProgressBarFill]` automatically so consumers don't have to remember
13
+ * the two-element shape — the component handles both halves.
14
+ *
15
+ * `kjValue: number | null` is the single mode switch — pass a number for
16
+ * determinate mode (the fill scales to the fraction with a CSS transition),
17
+ * or `null` for indeterminate mode (the fill animates as a CSS-only stripe).
18
+ * The directive omits `aria-valuenow` in indeterminate mode per APG. The
19
+ * indeterminate stripe collapses to a static state under
20
+ * `prefers-reduced-motion: reduce`.
21
+ *
22
+ * Variants and sizes are configurable at the directive level via
23
+ * `provideKjProgressBar(…)`. Defaults: `kjVariant="primary"`, `kjSize="md"`.
24
+ *
25
+ * @example
26
+ * ```html
27
+ * <kj-progress-bar [kjValue]="progress()" kjAriaLabel="Upload progress" />
28
+ * ```
29
+ *
30
+ * @doc-example Default
31
+ * A determinate bar at 50% with an accessible label — the bare-minimum recipe.
32
+ * @doc-file progress-bar.example.ts
33
+ * @doc-example Usage
34
+ * A walkthrough of the most common usages — determinate upload,
35
+ * indeterminate spinner replacement, and success completion. Use this as
36
+ * the copy-paste starting point.
37
+ * @doc-file progress-bar.usage.example.ts
38
+ * @doc-example Indeterminate
39
+ * `[kjValue]="null"` runs the CSS-only stripe animation.
40
+ * @doc-file progress-bar.indeterminate.example.ts
41
+ * @doc-example Variants
42
+ * `primary` / `success` / `warning` / `error` — pick the semantic color.
43
+ * @doc-file progress-bar.variants.example.ts
44
+ * @doc-example Sizes
45
+ * `xs` / `sm` / `md` / `lg` — drives the bar thickness via CSS tokens.
46
+ * @doc-file progress-bar.sizes.example.ts
47
+ * @doc-example With value text
48
+ * Pair `kjAriaValuetext` with a visible label for richer SR phrasing.
49
+ * @doc-file progress-bar.with-label.example.ts
50
+ *
51
+ * @doc-aria
52
+ * role="progressbar" — On the bar host (provided by the directive)
53
+ * aria-valuenow — Reflects the clamped numeric value; omitted in indeterminate mode
54
+ * aria-valuemin — Reflects `kjMin`
55
+ * aria-valuemax — Reflects `kjMax`
56
+ * aria-valuetext — Reflects `kjAriaValuetext` when set
57
+ * aria-label — Wired from `kjAriaLabel` (or use `kjAriaLabelledby`)
58
+ * data-variant — Mirrors the variant for theme hooks
59
+ * data-size — Mirrors the size for theme hooks
60
+ * data-indeterminate — Set when `kjValue` is null
61
+ *
62
+ * @doc-touch
63
+ * The bar is non-interactive — no touch target rules apply. Pair with a
64
+ * labelled cancel button (44×44) when the operation is cancellable.
65
+ *
66
+ * @doc-a11y
67
+ * Always set `kjAriaLabel` or `kjAriaLabelledby` — a bare percentage
68
+ * ("50 percent") with no context is useless to AT users. In indeterminate
69
+ * mode the directive omits `aria-valuenow` per APG. The stripe animation
70
+ * collapses under `prefers-reduced-motion: reduce`.
71
+ *
72
+ * @doc-related skeleton,spinner,toast
73
+ *
74
+ * @doc-css-var
75
+ * --kj-progress-bar-track — Track (unfilled portion) background. Inherits --kj-bg-field.
76
+ * --kj-progress-bar-fill — Fill color. Variants flip this per data-variant.
77
+ * --kj-progress-bar-radius — Track and fill corner radius.
78
+ * --kj-progress-bar-height — Bar thickness. Sizes (xs/sm/md/lg) override.
79
+ * --kj-progress-bar-transition — Transition timing for determinate fill changes.
80
+ * --kj-progress-bar-indeterminate-duration — One-cycle duration of the indeterminate stripe.
81
+ *
82
+ * @doc-category Library/Feedback
83
+ * @doc
84
+ * @doc-name progress-bar
85
+ * @doc-description Themed determinate or indeterminate progress bar with variant and size tokens.
86
+ * @doc-is-main
87
+ */
88
+ @Component({
89
+ selector: 'kj-progress-bar',
90
+ standalone: true,
91
+ imports: [KjProgressBar, KjProgressBarFill],
92
+ template: `
93
+ <div
94
+ kjProgressBar
95
+ class="kj-progress-bar"
96
+ [kjValue]="kjValue()"
97
+ [kjMin]="kjMin()"
98
+ [kjMax]="kjMax()"
99
+ [kjAriaValuetext]="kjAriaValuetext()"
100
+ [kjVariant]="kjVariant()"
101
+ [kjSize]="kjSize()"
102
+ [attr.aria-label]="kjAriaLabel() ?? null"
103
+ [attr.aria-labelledby]="kjAriaLabelledby() ?? null"
104
+ >
105
+ <div kjProgressBarFill class="kj-progress-bar__fill"></div>
106
+ </div>
107
+ `,
108
+ styleUrl: './progress-bar.css',
109
+ encapsulation: ViewEncapsulation.None,
110
+ host: { 'style': 'display: contents;' },
111
+ changeDetection: ChangeDetectionStrategy.OnPush,
112
+ })
113
+ export class KjProgressBarComponent {
114
+ /**
115
+ * Current progress value. `null` = indeterminate (the directive omits
116
+ * `aria-valuenow` and runs the indeterminate stripe). Out-of-range values
117
+ * clamp to `[kjMin, kjMax]` with a dev-mode warning.
118
+ * @default null
119
+ */
120
+ readonly kjValue = input<number>(0);
121
+
122
+ /** Lower bound, bound to `aria-valuemin`. @default 0 */
123
+ readonly kjMin = input<number>(0);
124
+
125
+ /** Upper bound, bound to `aria-valuemax`. Must be `> kjMin`. @default 100 */
126
+ readonly kjMax = input<number>(100);
127
+
128
+ /**
129
+ * Human-readable phrasing reflected to `aria-valuetext`. Use when the raw
130
+ * percentage is less meaningful — `"Step 3 of 5"`, `"1.2 MB of 2.5 MB"`.
131
+ */
132
+ readonly kjAriaValuetext = input<string>('');
133
+
134
+ /**
135
+ * Variant — one of the configured presets (`primary` | `success` |
136
+ * `warning` | `error` by default). @default 'primary'
137
+ */
138
+ readonly kjVariant = input<string>('primary');
139
+
140
+ /**
141
+ * Size — one of the configured presets (`xs` | `sm` | `md` | `lg` by
142
+ * default). Drives the bar height. @default 'md'
143
+ */
144
+ readonly kjSize = input<string>('md');
145
+
146
+ /**
147
+ * Accessible label for the bar. At least one of `kjAriaLabel` or
148
+ * `kjAriaLabelledby` must be set — a progress bar without a name announces
149
+ * as just *"50 percent"*, which is useless to screen-reader users.
150
+ */
151
+ readonly kjAriaLabel = input<string>('');
152
+
153
+ /** ID reference for the bar's accessible name. See `kjAriaLabel`. */
154
+ readonly kjAriaLabelledby = input<string>('');
155
+ }
@@ -0,0 +1,52 @@
1
+ import { Component, signal, ChangeDetectionStrategy } from '@angular/core';
2
+ import { KjProgressBarComponent } from './progress-bar';
3
+
4
+ /**
5
+ * A walkthrough of the most common progress-bar usages — a determinate
6
+ * upload bar with `aria-valuetext`, an indeterminate spinner replacement,
7
+ * and a success-variant complete state. Use this as the copy-paste starting
8
+ * point for feedback rows.
9
+ */
10
+ @Component({
11
+ selector: 'kj-progress-bar-usage-example',
12
+ standalone: true,
13
+ imports: [KjProgressBarComponent],
14
+ styles: [
15
+ `
16
+ :host {
17
+ display: flex;
18
+ flex-direction: column;
19
+ gap: var(--kj-space-lg);
20
+ }
21
+ .label {
22
+ font-size: 0.75rem;
23
+ color: var(--kj-fg-default);
24
+ opacity: 0.7;
25
+ text-transform: uppercase;
26
+ letter-spacing: 0.04em;
27
+ }
28
+ `,
29
+ ],
30
+ changeDetection: ChangeDetectionStrategy.Eager,
31
+ template: `
32
+ <div>
33
+ <span class="label">Uploading (determinate)</span>
34
+ <kj-progress-bar
35
+ [kjValue]="progress()"
36
+ kjAriaLabel="Upload progress"
37
+ [kjAriaValuetext]="progress() + ' percent uploaded'"
38
+ />
39
+ </div>
40
+ <div>
41
+ <span class="label">Working (indeterminate)</span>
42
+ <kj-progress-bar [kjValue]="null!" kjAriaLabel="Working" />
43
+ </div>
44
+ <div>
45
+ <span class="label">Complete (success)</span>
46
+ <kj-progress-bar [kjValue]="100" kjVariant="success" kjSize="lg" kjAriaLabel="Done" />
47
+ </div>
48
+ `,
49
+ })
50
+ export class KjProgressBarUsageExample {
51
+ readonly progress = signal<number>(62);
52
+ }