@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,257 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ ViewEncapsulation,
5
+ booleanAttribute,
6
+ input,
7
+ } from '@angular/core';
8
+ import {
9
+ KjButton,
10
+ KjSpeedDial,
11
+ KjSpeedDialAction,
12
+ KjSpeedDialActions,
13
+ KjSpeedDialTrigger,
14
+ type KjSpeedDialDirection,
15
+ } from '@kouji-ui/core';
16
+
17
+ /** Where to anchor the Speed Dial within its scroll container. */
18
+ export type KjSpeedDialPosition =
19
+ | 'bottom-right'
20
+ | 'bottom-left'
21
+ | 'top-right'
22
+ | 'top-left'
23
+ | 'static';
24
+
25
+ /**
26
+ * Styled wrapper around the headless `KjSpeedDial` directive.
27
+ *
28
+ * Renders a viewport-anchored floating action button (FAB) that, when clicked,
29
+ * fans out a cluster of action buttons — composed from `<kj-speed-dial-trigger>`
30
+ * and one or more `<kj-speed-dial-action>` children inside a
31
+ * `<kj-speed-dial-actions>` container. Theme tokens drive the FAB's circular
32
+ * shape, elevation, and the cluster's fan-out animation.
33
+ *
34
+ * `kjPosition` controls the anchor: `'bottom-right'` (default) places the FAB
35
+ * fixed to the bottom-right of the viewport. Use `'static'` to embed inline.
36
+ *
37
+ * @example
38
+ * ```html
39
+ * <kj-speed-dial kjDirection="up" kjPosition="bottom-right">
40
+ * <kj-speed-dial-trigger kjAriaLabel="Open menu">+</kj-speed-dial-trigger>
41
+ * <kj-speed-dial-actions>
42
+ * <kj-speed-dial-action kjAriaLabel="Edit">E</kj-speed-dial-action>
43
+ * <kj-speed-dial-action kjAriaLabel="Share">S</kj-speed-dial-action>
44
+ * </kj-speed-dial-actions>
45
+ * </kj-speed-dial>
46
+ * ```
47
+ *
48
+ * @doc-example Default
49
+ * The default playground — bottom-right anchored FAB fanning up.
50
+ * @doc-file speed-dial.example.ts
51
+ * @doc-example Usage
52
+ * A walkthrough of the most common speed-dial usages — direction, position,
53
+ * disabled state, and per-action handlers. Copy-paste starting point.
54
+ * @doc-file speed-dial.usage.example.ts
55
+ * @doc-example Directions
56
+ * `kjDirection` controls the fan-out axis — `up`, `down`, `left`, `right`.
57
+ * @doc-file speed-dial.directions.example.ts
58
+ * @doc-example With tooltips
59
+ * Pair each action with a `<kj-tooltip-content>` for label-on-hover.
60
+ * @doc-file speed-dial.with-tooltips.example.ts
61
+ * @doc-example Disabled
62
+ * `[kjDisabled]="true"` on the root disables the trigger and all actions.
63
+ * @doc-file speed-dial.disabled.example.ts
64
+ *
65
+ * @doc-keyboard
66
+ * Enter|Space — Opens the dial when on the trigger; activates the focused action
67
+ * ArrowKeys — Move focus along the fan-out axis between trigger and actions
68
+ * Escape — Closes the dial and returns focus to the trigger
69
+ * Tab — Single tab stop on the trigger (roving tabindex inside)
70
+ *
71
+ * @doc-aria
72
+ * role="menu" — applied to `<kj-speed-dial-actions>` while open
73
+ * role="menuitem" — applied to each `<kj-speed-dial-action>`
74
+ * aria-haspopup — set on the trigger to "menu"
75
+ * aria-expanded — reflects the open/closed state on the trigger
76
+ * aria-label — required on icon-only trigger and actions (dev-mode warns)
77
+ * data-position — mirrors `kjPosition` on the host for CSS hooks
78
+ *
79
+ * @doc-touch
80
+ * Trigger defaults to `kjSize="lg"` (48px) — meets WCAG 2.5.5 (≥ 44×44).
81
+ * Actions default to `kjSize="md"` (40px) — bump to `lg` for touch-first layouts.
82
+ *
83
+ * @doc-a11y
84
+ * Implements the WAI-ARIA Menu Button APG pattern. Roving tabindex keeps the
85
+ * trigger as a single Tab stop; arrow keys move focus through the open
86
+ * action cluster. Focus returns to the trigger on close. Activating an
87
+ * action closes the dial by default (`kjCloseOnActivate`).
88
+ *
89
+ * @doc-related dropdown-menu,tooltip,button-group
90
+ *
91
+ * @doc-css-var
92
+ * --kj-speed-dial-gap — Gap between the trigger and the action cluster.
93
+ * --kj-speed-dial-edge — Distance from the viewport edge when fixed-positioned.
94
+ * --kj-speed-dial-trigger-size — Width/height of the circular FAB trigger.
95
+ * --kj-speed-dial-action-size — Width/height of each fan-out action button.
96
+ * --kj-speed-dial-shadow — Elevation shadow shared by the trigger and actions.
97
+ * --kj-speed-dial-stagger — Per-action delay applied to the fan-out animation.
98
+ * --kj-speed-dial-duration — Transition duration for the trigger and fan-out motion.
99
+ *
100
+ * @doc-category Library/Actions
101
+ * @doc
102
+ * @doc-name speed-dial
103
+ * @doc-description Themed floating action button that fans out a cluster of secondary actions on activation.
104
+ * @doc-is-main
105
+ */
106
+ @Component({
107
+ selector: 'kj-speed-dial',
108
+ standalone: true,
109
+ hostDirectives: [
110
+ {
111
+ directive: KjSpeedDial,
112
+ inputs: [
113
+ 'kjDirection',
114
+ 'kjOpen',
115
+ 'kjDisabled',
116
+ 'kjOpenOnHover',
117
+ ],
118
+ outputs: ['kjOpenChange'],
119
+ },
120
+ ],
121
+ template: `<ng-content />`,
122
+ styleUrl: './speed-dial.css',
123
+ encapsulation: ViewEncapsulation.None,
124
+ host: {
125
+ class: 'kj-speed-dial',
126
+ '[attr.data-position]': 'kjPosition()',
127
+ },
128
+ changeDetection: ChangeDetectionStrategy.OnPush,
129
+ })
130
+ export class KjSpeedDialComponent {
131
+ /** Anchor for the dial. Default `'bottom-right'`. */
132
+ readonly kjPosition = input<KjSpeedDialPosition>('bottom-right');
133
+ }
134
+
135
+ /**
136
+ * Styled wrapper around `KjSpeedDialTrigger`.
137
+ *
138
+ * Renders a real `<button kjButton kjSpeedDialTrigger>` so the trigger inherits
139
+ * the kouji button presets (variant, size, focus ring, capture-phase disabled
140
+ * suppression) plus the speed-dial menu-button ARIA wiring.
141
+ *
142
+ * @doc-category Library/Actions
143
+ * @doc
144
+ * @doc-name speed-dial
145
+ */
146
+ @Component({
147
+ selector: 'kj-speed-dial-trigger',
148
+ standalone: true,
149
+ imports: [KjButton, KjSpeedDialTrigger],
150
+ template: `
151
+ <button
152
+ type="button"
153
+ kjButton
154
+ kjSpeedDialTrigger
155
+ class="kj-speed-dial-trigger"
156
+ [kjVariant]="kjVariant()"
157
+ [kjSize]="kjSize()"
158
+ [kjDisabled]="kjDisabled()"
159
+ [attr.aria-label]="kjAriaLabel()"
160
+ >
161
+ <ng-content />
162
+ </button>
163
+ `,
164
+ styleUrl: './speed-dial.css',
165
+ encapsulation: ViewEncapsulation.None,
166
+ host: {
167
+ class: 'kj-speed-dial-trigger-host',
168
+ style: 'display: contents;',
169
+ },
170
+ changeDetection: ChangeDetectionStrategy.OnPush,
171
+ })
172
+ export class KjSpeedDialTriggerComponent {
173
+ /** Button variant preset. */
174
+ readonly kjVariant = input('default');
175
+ /** Button size preset. */
176
+ readonly kjSize = input('lg');
177
+ /** Disable the trigger. */
178
+ readonly kjDisabled = input(false, { transform: booleanAttribute });
179
+ /** Required when the trigger has icon-only contents (it usually does). */
180
+ readonly kjAriaLabel = input<string | undefined>(undefined);
181
+ }
182
+
183
+ /**
184
+ * Styled wrapper around `KjSpeedDialActions` — the cluster container.
185
+ *
186
+ * Place inside `<kj-speed-dial>` and put one or more
187
+ * `<kj-speed-dial-action>` children inside it. The container itself carries
188
+ * `role="menu"` and is hidden when collapsed.
189
+ *
190
+ * @doc-category Library/Actions
191
+ * @doc
192
+ * @doc-name speed-dial
193
+ */
194
+ @Component({
195
+ selector: 'kj-speed-dial-actions',
196
+ standalone: true,
197
+ hostDirectives: [KjSpeedDialActions],
198
+ template: `<ng-content />`,
199
+ styleUrl: './speed-dial.css',
200
+ encapsulation: ViewEncapsulation.None,
201
+ host: { class: 'kj-speed-dial-actions' },
202
+ changeDetection: ChangeDetectionStrategy.OnPush,
203
+ })
204
+ export class KjSpeedDialActionsComponent {}
205
+
206
+ /**
207
+ * Styled wrapper around `KjSpeedDialAction`.
208
+ *
209
+ * Renders a real `<button kjButton kjSpeedDialAction>` so the action inherits
210
+ * the kouji button presets and `role="menuitem"`. Activating an action closes
211
+ * the dial unless `[kjCloseOnActivate]="false"`.
212
+ *
213
+ * @doc-category Library/Actions
214
+ * @doc
215
+ * @doc-name speed-dial
216
+ */
217
+ @Component({
218
+ selector: 'kj-speed-dial-action',
219
+ standalone: true,
220
+ imports: [KjButton, KjSpeedDialAction],
221
+ template: `
222
+ <button
223
+ type="button"
224
+ kjButton
225
+ kjSpeedDialAction
226
+ class="kj-speed-dial-action"
227
+ [kjVariant]="kjVariant()"
228
+ [kjSize]="kjSize()"
229
+ [kjDisabled]="kjDisabled()"
230
+ [kjCloseOnActivate]="kjCloseOnActivate()"
231
+ [attr.aria-label]="kjAriaLabel()"
232
+ >
233
+ <ng-content />
234
+ </button>
235
+ `,
236
+ styleUrl: './speed-dial.css',
237
+ encapsulation: ViewEncapsulation.None,
238
+ host: {
239
+ class: 'kj-speed-dial-action-host',
240
+ style: 'display: contents;',
241
+ },
242
+ changeDetection: ChangeDetectionStrategy.OnPush,
243
+ })
244
+ export class KjSpeedDialActionComponent {
245
+ /** Button variant preset. Defaults to `outline`. */
246
+ readonly kjVariant = input('outline');
247
+ /** Button size preset. Defaults to `md` (one step smaller than the trigger). */
248
+ readonly kjSize = input('md');
249
+ /** Disable the action. */
250
+ readonly kjDisabled = input(false, { transform: booleanAttribute });
251
+ /** Whether activating closes the dial. Default `true`. */
252
+ readonly kjCloseOnActivate = input(true, { transform: booleanAttribute });
253
+ /** Required when the action has icon-only contents. */
254
+ readonly kjAriaLabel = input<string | undefined>(undefined);
255
+ }
256
+
257
+ export type { KjSpeedDialDirection };
@@ -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 { KjSpinnerAnimationsExample } from './spinner.animations.example';
4
+ export { KjSpinnerExample } from './spinner.example';
5
+ export { KjSpinnerInButtonExample } from './spinner.in-button.example';
6
+ export { KjSpinnerSizesExample } from './spinner.sizes.example';
7
+ export { KjSpinnerUsageExample } from './spinner.usage.example';
8
+ export { KjSpinnerVariantsExample } from './spinner.variants.example';
@@ -0,0 +1,54 @@
1
+ import { Component, ChangeDetectionStrategy } from '@angular/core';
2
+ import { KjSpinnerComponent } from '../spinner';
3
+
4
+ /**
5
+ * Animation shape presets — `spin` (rotating arc, default), `dots`
6
+ * (three pulsing dots), `pulse` (single fading circle), `bars`
7
+ * (vertical bars rising/falling) — side by side at the same size so
8
+ * the visual character of each shape is directly comparable.
9
+ */
10
+ @Component({
11
+ selector: 'kj-spinner-animations-example',
12
+ standalone: true,
13
+ imports: [KjSpinnerComponent],
14
+ styles: [
15
+ `
16
+ :host {
17
+ display: flex;
18
+ gap: var(--kj-space-xl);
19
+ align-items: center;
20
+ }
21
+ figure {
22
+ display: flex;
23
+ flex-direction: column;
24
+ align-items: center;
25
+ gap: var(--kj-space-sm);
26
+ margin: 0;
27
+ }
28
+ figcaption {
29
+ font-size: var(--kj-text-sm);
30
+ color: var(--kj-fg-default);
31
+ }
32
+ `,
33
+ ],
34
+ changeDetection: ChangeDetectionStrategy.Eager,
35
+ template: `
36
+ <figure>
37
+ <kj-spinner kjAnimation="spin" kjSize="lg" kjAriaLabel="Loading (spin)" />
38
+ <figcaption>spin</figcaption>
39
+ </figure>
40
+ <figure>
41
+ <kj-spinner kjAnimation="dots" kjSize="lg" kjAriaLabel="Loading (dots)" />
42
+ <figcaption>dots</figcaption>
43
+ </figure>
44
+ <figure>
45
+ <kj-spinner kjAnimation="pulse" kjSize="lg" kjAriaLabel="Loading (pulse)" />
46
+ <figcaption>pulse</figcaption>
47
+ </figure>
48
+ <figure>
49
+ <kj-spinner kjAnimation="bars" kjSize="lg" kjAriaLabel="Loading (bars)" />
50
+ <figcaption>bars</figcaption>
51
+ </figure>
52
+ `,
53
+ })
54
+ export class KjSpinnerAnimationsExample {}
@@ -0,0 +1,26 @@
1
+ import { Component, ChangeDetectionStrategy } from '@angular/core';
2
+ import { KjSpinnerComponent } from '../spinner';
3
+
4
+ /**
5
+ * Default usage example for KjSpinnerComponent. Renders a single
6
+ * `<kj-spinner>` with the shipped defaults — `spin` animation,
7
+ * `md` size, `neutral` variant (inherits `currentColor`), and the
8
+ * default `aria-label="Loading"`.
9
+ */
10
+ @Component({
11
+ selector: 'kj-spinner-example',
12
+ standalone: true,
13
+ imports: [KjSpinnerComponent],
14
+ styles: [
15
+ `
16
+ :host {
17
+ display: flex;
18
+ align-items: center;
19
+ justify-content: center;
20
+ }
21
+ `,
22
+ ],
23
+ changeDetection: ChangeDetectionStrategy.Eager,
24
+ template: `<kj-spinner />`,
25
+ })
26
+ export class KjSpinnerExample {}
@@ -0,0 +1,51 @@
1
+ import { Component, signal, ChangeDetectionStrategy } from '@angular/core';
2
+ import { KjButtonComponent } from '../../button/button';
3
+ import { KjSpinnerComponent } from '../spinner';
4
+
5
+ /**
6
+ * Spinner composed inside a `<kj-button>` for the loading-state pattern.
7
+ * The button toggles a busy signal on click; the spinner appears next to
8
+ * the label and inherits the button's text colour (the `neutral` variant
9
+ * resolves to `currentColor` in shipped themes, so the spinner is
10
+ * automatically the on-primary colour when the button itself is primary).
11
+ */
12
+ @Component({
13
+ selector: 'kj-spinner-in-button-example',
14
+ standalone: true,
15
+ imports: [KjButtonComponent, KjSpinnerComponent],
16
+ styles: [
17
+ `
18
+ :host {
19
+ display: flex;
20
+ gap: var(--kj-space-md);
21
+ align-items: center;
22
+ }
23
+ `,
24
+ ],
25
+ changeDetection: ChangeDetectionStrategy.Eager,
26
+ template: `
27
+ <kj-button (click)="run()" [kjDisabled]="busy()">
28
+ @if (busy()) {
29
+ <kj-spinner kjSize="sm" kjAriaLabel="Saving" />
30
+ }
31
+ {{ busy() ? 'Saving…' : 'Save' }}
32
+ </kj-button>
33
+
34
+ <kj-button kjVariant="ghost" (click)="run()" [kjDisabled]="busy()">
35
+ @if (busy()) {
36
+ <kj-spinner kjSize="sm" kjAnimation="dots" kjAriaLabel="Sending" />
37
+ }
38
+ {{ busy() ? 'Sending…' : 'Send' }}
39
+ </kj-button>
40
+ `,
41
+ })
42
+ export class KjSpinnerInButtonExample {
43
+ readonly busy = signal(false);
44
+
45
+ async run() {
46
+ if (this.busy()) return;
47
+ this.busy.set(true);
48
+ await new Promise((r) => setTimeout(r, 1500));
49
+ this.busy.set(false);
50
+ }
51
+ }
@@ -0,0 +1,31 @@
1
+ import { Component, ChangeDetectionStrategy } from '@angular/core';
2
+ import { KjSpinnerComponent } from '../spinner';
3
+
4
+ /**
5
+ * Size presets — `xs` / `sm` / `md` / `lg` — laid out in a row so the
6
+ * progression is immediately visible. There is intentionally no `xl`:
7
+ * a spinner that big almost always wants a determinate Progress Bar
8
+ * instead.
9
+ */
10
+ @Component({
11
+ selector: 'kj-spinner-sizes-example',
12
+ standalone: true,
13
+ imports: [KjSpinnerComponent],
14
+ styles: [
15
+ `
16
+ :host {
17
+ display: flex;
18
+ gap: var(--kj-space-lg);
19
+ align-items: center;
20
+ }
21
+ `,
22
+ ],
23
+ changeDetection: ChangeDetectionStrategy.Eager,
24
+ template: `
25
+ <kj-spinner kjSize="xs" kjAriaLabel="Loading (xs)" />
26
+ <kj-spinner kjSize="sm" kjAriaLabel="Loading (sm)" />
27
+ <kj-spinner kjSize="md" kjAriaLabel="Loading (md)" />
28
+ <kj-spinner kjSize="lg" kjAriaLabel="Loading (lg)" />
29
+ `,
30
+ })
31
+ export class KjSpinnerSizesExample {}
@@ -0,0 +1,45 @@
1
+ import { Component, ChangeDetectionStrategy } from '@angular/core';
2
+ import { KjSpinnerComponent } from '../spinner';
3
+
4
+ /**
5
+ * A walkthrough of the most common spinner usages — default, size + variant,
6
+ * a different animation glyph, and an inline placement next to copy.
7
+ */
8
+ @Component({
9
+ selector: 'kj-spinner-usage-example',
10
+ standalone: true,
11
+ imports: [KjSpinnerComponent],
12
+ styles: [
13
+ `
14
+ :host {
15
+ display: flex;
16
+ flex-direction: column;
17
+ gap: var(--kj-space-md);
18
+ }
19
+ .row {
20
+ display: flex;
21
+ gap: var(--kj-space-lg);
22
+ align-items: center;
23
+ }
24
+ .inline {
25
+ display: inline-flex;
26
+ gap: var(--kj-space-xs);
27
+ align-items: center;
28
+ }
29
+ `,
30
+ ],
31
+ changeDetection: ChangeDetectionStrategy.Eager,
32
+ template: `
33
+ <div class="row">
34
+ <kj-spinner kjAriaLabel="Loading" />
35
+ <kj-spinner kjSize="lg" kjVariant="primary" kjAriaLabel="Saving" />
36
+ <kj-spinner kjAnimation="dots" kjAriaLabel="Connecting" />
37
+ </div>
38
+
39
+ <p class="inline">
40
+ <kj-spinner kjSize="sm" kjAriaLabel="Loading inline" />
41
+ <span>Fetching latest data…</span>
42
+ </p>
43
+ `,
44
+ })
45
+ export class KjSpinnerUsageExample {}
@@ -0,0 +1,34 @@
1
+ import { Component, ChangeDetectionStrategy } from '@angular/core';
2
+ import { KjSpinnerComponent } from '../spinner';
3
+
4
+ /**
5
+ * Colour variants — `neutral` (the default, inherits `currentColor`),
6
+ * `primary`, `success`, `warning`, `error`, `info` — laid out in a row.
7
+ * The `neutral` instance picks up the host's text colour, demonstrating
8
+ * the "spinner inside a coloured surface inherits its parent" contract.
9
+ */
10
+ @Component({
11
+ selector: 'kj-spinner-variants-example',
12
+ standalone: true,
13
+ imports: [KjSpinnerComponent],
14
+ styles: [
15
+ `
16
+ :host {
17
+ display: flex;
18
+ gap: var(--kj-space-lg);
19
+ align-items: center;
20
+ flex-wrap: wrap;
21
+ }
22
+ `,
23
+ ],
24
+ changeDetection: ChangeDetectionStrategy.Eager,
25
+ template: `
26
+ <kj-spinner kjVariant="neutral" kjAriaLabel="Loading (neutral)" />
27
+ <kj-spinner kjVariant="primary" kjAriaLabel="Loading (primary)" />
28
+ <kj-spinner kjVariant="success" kjAriaLabel="Loading (success)" />
29
+ <kj-spinner kjVariant="warning" kjAriaLabel="Loading (warning)" />
30
+ <kj-spinner kjVariant="error" kjAriaLabel="Loading (error)" />
31
+ <kj-spinner kjVariant="info" kjAriaLabel="Loading (info)" />
32
+ `,
33
+ })
34
+ export class KjSpinnerVariantsExample {}
@@ -0,0 +1 @@
1
+ export * from './spinner';
@@ -0,0 +1,161 @@
1
+ /* ─────────────────────────────────────────────────────────────
2
+ .kj-spinner — component-layer tokens + structural CSS
3
+
4
+ The directive owns role/label/data-attribute reflection. The CSS
5
+ below renders the visual glyph via the inner `.kj-spinner__glyph`
6
+ element (kept `aria-hidden="true"` in the template so AT only sees
7
+ the host's `role="status"` + `aria-label`). Variant + size + animation
8
+ routing all happens through `data-*` attributes on the wrapper host.
9
+ ──────────────────────────────────────────────────────────── */
10
+
11
+ @layer kj.component {
12
+ .kj-spinner {
13
+ --kj-spinner-size: 1.25rem; /* md default */
14
+ --kj-spinner-color: currentColor; /* neutral resolves to currentColor */
15
+ --kj-spinner-track: color-mix(in srgb, currentColor 20%, transparent);
16
+ --kj-spinner-duration: 0.7s;
17
+
18
+ display: inline-flex;
19
+ align-items: center;
20
+ justify-content: center;
21
+ inline-size: var(--kj-spinner-size);
22
+ block-size: var(--kj-spinner-size);
23
+ color: var(--kj-spinner-color);
24
+ /* Keep the glyph centred without offering a hit-target — spinners are
25
+ not interactive. */
26
+ pointer-events: none;
27
+ }
28
+
29
+ /* Sizes — circular shapes use --kj-spinner-size for both axes. Linear
30
+ shapes (dots / bars) override inline-size on the host below. */
31
+ .kj-spinner[data-size="xs"] { --kj-spinner-size: 0.75rem; }
32
+ .kj-spinner[data-size="sm"] { --kj-spinner-size: 1rem; }
33
+ .kj-spinner[data-size="md"] { --kj-spinner-size: 1.25rem; }
34
+ .kj-spinner[data-size="lg"] { --kj-spinner-size: 1.75rem; }
35
+
36
+ /* Variant routing — neutral inherits currentColor (matches the
37
+ daisyUI / lucide convention so a spinner inside a primary button
38
+ picks up the button's text colour). */
39
+ .kj-spinner[data-variant="neutral"] { --kj-spinner-color: currentColor; }
40
+ .kj-spinner[data-variant="primary"] { --kj-spinner-color: var(--kj-fg-primary); }
41
+ .kj-spinner[data-variant="secondary"] { --kj-spinner-color: var(--kj-fg-default); }
42
+ .kj-spinner[data-variant="success"] { --kj-spinner-color: var(--kj-fg-success, #16a34a); }
43
+ .kj-spinner[data-variant="warning"] { --kj-spinner-color: var(--kj-fg-warning, #d97706); }
44
+ .kj-spinner[data-variant="error"] { --kj-spinner-color: var(--kj-fg-danger, #dc2626); }
45
+ .kj-spinner[data-variant="info"] { --kj-spinner-color: var(--kj-fg-info, #2563eb); }
46
+
47
+ /* Glyph host — themes can repaint the inner element per data-animation. */
48
+ .kj-spinner__glyph {
49
+ display: inline-block;
50
+ inline-size: 100%;
51
+ block-size: 100%;
52
+ }
53
+
54
+ /* ── Animation: spin (default) — rotating arc ─────────────────────── */
55
+ .kj-spinner[data-animation="spin"] .kj-spinner__glyph {
56
+ border: 2px solid var(--kj-spinner-track);
57
+ border-block-start-color: var(--kj-spinner-color);
58
+ border-radius: 50%;
59
+ animation: kj-spinner-spin var(--kj-spinner-duration) linear infinite;
60
+ }
61
+
62
+ /* ── Animation: pulse — single fading circle ──────────────────────── */
63
+ .kj-spinner[data-animation="pulse"] .kj-spinner__glyph {
64
+ background: var(--kj-spinner-color);
65
+ border-radius: 50%;
66
+ animation: kj-spinner-pulse calc(var(--kj-spinner-duration) * 2) ease-in-out infinite;
67
+ }
68
+
69
+ /* ── Animation: dots — three pulsing dots side by side ────────────── */
70
+ .kj-spinner[data-animation="dots"] {
71
+ /* Linear shape — width is auto, height is the size token. */
72
+ inline-size: auto;
73
+ }
74
+ .kj-spinner[data-animation="dots"] .kj-spinner__glyph {
75
+ display: inline-flex;
76
+ gap: calc(var(--kj-spinner-size) * 0.25);
77
+ inline-size: auto;
78
+ block-size: 100%;
79
+ }
80
+ .kj-spinner[data-animation="dots"] .kj-spinner__glyph::before,
81
+ .kj-spinner[data-animation="dots"] .kj-spinner__glyph::after,
82
+ .kj-spinner[data-animation="dots"] .kj-spinner__glyph {
83
+ /* Each dot via pseudo + the glyph itself acts as a flex container. */
84
+ }
85
+ .kj-spinner[data-animation="dots"] .kj-spinner__glyph::before,
86
+ .kj-spinner[data-animation="dots"] .kj-spinner__glyph::after {
87
+ content: "";
88
+ inline-size: calc(var(--kj-spinner-size) * 0.3);
89
+ block-size: calc(var(--kj-spinner-size) * 0.3);
90
+ background: var(--kj-spinner-color);
91
+ border-radius: 50%;
92
+ animation: kj-spinner-dots calc(var(--kj-spinner-duration) * 2) ease-in-out infinite;
93
+ }
94
+ .kj-spinner[data-animation="dots"] .kj-spinner__glyph {
95
+ background: transparent;
96
+ }
97
+ /* Middle dot rendered via box-shadow on ::before for a 3-dot row without
98
+ extra DOM. The two pseudos animate offset; the middle dot is the glyph
99
+ element's own background dot. */
100
+ .kj-spinner[data-animation="dots"] .kj-spinner__glyph::after {
101
+ animation-delay: calc(var(--kj-spinner-duration) * 0.4);
102
+ }
103
+
104
+ /* ── Animation: bars — vertical bars rising/falling ───────────────── */
105
+ .kj-spinner[data-animation="bars"] {
106
+ inline-size: auto;
107
+ }
108
+ .kj-spinner[data-animation="bars"] .kj-spinner__glyph {
109
+ display: inline-flex;
110
+ align-items: stretch;
111
+ gap: calc(var(--kj-spinner-size) * 0.15);
112
+ inline-size: auto;
113
+ block-size: 100%;
114
+ }
115
+ .kj-spinner[data-animation="bars"] .kj-spinner__glyph::before,
116
+ .kj-spinner[data-animation="bars"] .kj-spinner__glyph::after {
117
+ content: "";
118
+ inline-size: calc(var(--kj-spinner-size) * 0.2);
119
+ background: var(--kj-spinner-color);
120
+ border-radius: calc(var(--kj-spinner-size) * 0.05);
121
+ animation: kj-spinner-bars calc(var(--kj-spinner-duration) * 1.6) ease-in-out infinite;
122
+ transform-origin: center;
123
+ }
124
+ .kj-spinner[data-animation="bars"] .kj-spinner__glyph::after {
125
+ animation-delay: calc(var(--kj-spinner-duration) * 0.4);
126
+ }
127
+
128
+ /* ── Reduced motion — directive sets `data-reduced-motion="true"` ──── */
129
+ /* WCAG 2.3.3 (AAA): swap continuous rotation for a slow opacity pulse. */
130
+ .kj-spinner[data-reduced-motion="true"] .kj-spinner__glyph,
131
+ .kj-spinner[data-reduced-motion="true"] .kj-spinner__glyph::before,
132
+ .kj-spinner[data-reduced-motion="true"] .kj-spinner__glyph::after {
133
+ animation: kj-spinner-reduced-motion 1.6s ease-in-out infinite !important;
134
+ }
135
+ }
136
+
137
+ /* Keyframes live outside the cascade layer so consumers can't accidentally
138
+ defeat them with a higher-priority unlayered rule. */
139
+ @keyframes kj-spinner-spin {
140
+ to { transform: rotate(360deg); }
141
+ }
142
+
143
+ @keyframes kj-spinner-pulse {
144
+ 0%, 100% { opacity: 0.35; transform: scale(0.85); }
145
+ 50% { opacity: 1; transform: scale(1); }
146
+ }
147
+
148
+ @keyframes kj-spinner-dots {
149
+ 0%, 80%, 100% { transform: scale(0.4); opacity: 0.4; }
150
+ 40% { transform: scale(1); opacity: 1; }
151
+ }
152
+
153
+ @keyframes kj-spinner-bars {
154
+ 0%, 40%, 100% { transform: scaleY(0.4); }
155
+ 20% { transform: scaleY(1); }
156
+ }
157
+
158
+ @keyframes kj-spinner-reduced-motion {
159
+ 0%, 100% { opacity: 0.45; }
160
+ 50% { opacity: 1; }
161
+ }