@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,166 @@
1
+ /* ─────────────────────────────────────────────────────────────
2
+ .kj-list — component-layer tokens + structural CSS
3
+ The list root carries layout (flex direction, gap) and reads
4
+ `data-orientation` / `data-divided` / `data-hoverable` from the
5
+ composed `KjList` directive to flip variants. Per-row chrome is
6
+ driven by `data-active` / `data-disabled` on `<kj-list-item>`.
7
+ ──────────────────────────────────────────────────────────── */
8
+
9
+ @layer kj.component {
10
+ .kj-list {
11
+ --kj-list-bg: transparent;
12
+ --kj-list-fg: var(--kj-fg-default);
13
+ --kj-list-border-color: var(--kj-border-default);
14
+ --kj-list-radius: var(--kj-radius-box);
15
+ --kj-list-row-gap: 0;
16
+ --kj-list-row-padding-x: var(--kj-space-md);
17
+ --kj-list-row-padding-y: var(--kj-space-sm);
18
+ --kj-list-row-radius: var(--kj-radius-field);
19
+ --kj-list-row-min-h: 2.75rem; /* 44px — WCAG 2.5.5 */
20
+
21
+ display: flex;
22
+ flex-direction: column;
23
+ gap: var(--kj-list-row-gap);
24
+ background: var(--kj-list-bg);
25
+ color: var(--kj-list-fg);
26
+ border-radius: var(--kj-list-radius);
27
+ margin: 0;
28
+ padding: 0;
29
+ list-style: none;
30
+ }
31
+
32
+ /* Horizontal axis flips flex-direction. The `data-orientation` mirror is
33
+ emitted by `KjList` so themes do not need the JS-level orientation. */
34
+ .kj-list[data-orientation='horizontal'] {
35
+ flex-direction: row;
36
+ flex-wrap: wrap;
37
+ }
38
+
39
+ /* Sizes — drive row density via the row-padding / min-height tokens. */
40
+ .kj-list[data-size='xs'] {
41
+ --kj-list-row-padding-y: 0.125rem;
42
+ --kj-list-row-padding-x: var(--kj-space-sm);
43
+ --kj-list-row-min-h: 1.5rem;
44
+ }
45
+ .kj-list[data-size='sm'] {
46
+ --kj-list-row-padding-y: 0.25rem;
47
+ --kj-list-row-padding-x: var(--kj-space-sm);
48
+ --kj-list-row-min-h: 2rem;
49
+ }
50
+ .kj-list[data-size='lg'] {
51
+ --kj-list-row-padding-y: var(--kj-space-md);
52
+ --kj-list-row-padding-x: var(--kj-space-lg);
53
+ --kj-list-row-min-h: 3rem;
54
+ }
55
+
56
+ /* Variants — chrome on the container itself. */
57
+ .kj-list[data-variant='bordered'] {
58
+ border: var(--kj-border) solid var(--kj-list-border-color);
59
+ overflow: hidden;
60
+ }
61
+ .kj-list[data-variant='flat'] {
62
+ border: 0;
63
+ --kj-list-bg: transparent;
64
+ }
65
+
66
+ /* Per-row layout. Rows are flex containers so consumers can drop in
67
+ leading icons / trailing badges without juggling spans. */
68
+ .kj-list-item {
69
+ display: flex;
70
+ align-items: center;
71
+ gap: var(--kj-space-sm);
72
+ padding: var(--kj-list-row-padding-y) var(--kj-list-row-padding-x);
73
+ min-height: var(--kj-list-row-min-h);
74
+ border-radius: var(--kj-list-row-radius);
75
+ color: inherit;
76
+ /* Transition only state-tied properties so the active / hover flip is
77
+ buttery without animating layout. */
78
+ transition: background-color var(--kj-transition),
79
+ color var(--kj-transition),
80
+ opacity var(--kj-transition);
81
+ }
82
+
83
+ /* One projected link/button: move row padding onto it so the clickable box
84
+ matches the full row (padding on the host sat outside the hit target).
85
+ Use `nth-child(1 of …)` / `nth-last-child(1 of …)` so whitespace text
86
+ nodes between the host and the control do not break `:only-child`. */
87
+ .kj-list-item:has(
88
+ > :where(a, button):nth-child(1 of :where(a, button)):nth-last-child(1 of :where(a, button))
89
+ ) {
90
+ padding: 0;
91
+ align-items: stretch;
92
+ min-height: 0;
93
+ }
94
+
95
+ /* Divided rows — between-row border via `:not(:last-child)` so the final
96
+ row stays clean. The `data-divided` mirror lives on the root. */
97
+ .kj-list[data-divided] .kj-list-item {
98
+ border-radius: 0;
99
+ }
100
+ .kj-list[data-divided][data-orientation='vertical'] .kj-list-item:not(:last-child) {
101
+ border-bottom: var(--kj-border) solid var(--kj-list-border-color);
102
+ }
103
+ .kj-list[data-divided][data-orientation='horizontal'] .kj-list-item:not(:last-child) {
104
+ border-right: var(--kj-border) solid var(--kj-list-border-color);
105
+ }
106
+
107
+ /* Hoverable rows. Cascade order matters: the `:hover` rule comes BEFORE
108
+ the `[data-active]` rule so the active row wins when both are true. */
109
+ .kj-list[data-hoverable] .kj-list-item:hover {
110
+ background: color-mix(in oklab, var(--kj-fg-default) 6%, transparent);
111
+ cursor: pointer;
112
+ }
113
+
114
+ /* Active row — current location in a nav. Painted via background tint plus
115
+ a left bar (≥3:1 against background per WCAG 1.4.11). */
116
+ .kj-list-item[data-active] {
117
+ background: color-mix(in oklab, var(--kj-bg-primary) 12%, transparent);
118
+ color: var(--kj-fg-primary);
119
+ box-shadow: inset 3px 0 0 0 var(--kj-bg-primary);
120
+ }
121
+ .kj-list[data-orientation='horizontal'] .kj-list-item[data-active] {
122
+ box-shadow: inset 0 -3px 0 0 var(--kj-bg-primary);
123
+ }
124
+
125
+ /* Disabled row — dim the chrome and any projected interactive child.
126
+ Keyboard reachability is the projected child's responsibility. */
127
+ .kj-list-item[data-disabled] {
128
+ opacity: 0.45;
129
+ cursor: not-allowed;
130
+ }
131
+ .kj-list-item[data-disabled] :where(a, button) {
132
+ pointer-events: none;
133
+ }
134
+
135
+ /* Shared styles for interactive children */
136
+ .kj-list-item > :where(a, button) {
137
+ display: flex;
138
+ align-items: center;
139
+ gap: var(--kj-space-sm);
140
+ color: inherit;
141
+ text-decoration: none;
142
+ background: none;
143
+ border: 0;
144
+ padding: 0;
145
+ font: inherit;
146
+ cursor: pointer;
147
+ }
148
+
149
+ .kj-list-item:has(
150
+ > :where(a, button):nth-child(1 of :where(a, button)):nth-last-child(1 of :where(a, button))
151
+ )
152
+ > :where(a, button) {
153
+ flex: 1 1 auto;
154
+ align-self: stretch;
155
+ min-width: 0;
156
+ min-height: var(--kj-list-row-min-h);
157
+ padding: var(--kj-list-row-padding-y) var(--kj-list-row-padding-x);
158
+ box-sizing: border-box;
159
+ }
160
+
161
+ .kj-list-item > :where(a, button):focus-visible {
162
+ outline: 2px solid var(--kj-fg-primary);
163
+ outline-offset: 2px;
164
+ border-radius: var(--kj-list-row-radius);
165
+ }
166
+ }
@@ -0,0 +1,90 @@
1
+ import { ChangeDetectionStrategy, Component, computed, signal } from '@angular/core';
2
+ import { KjListComponent, KjListItemComponent } from './list';
3
+ import type { PlaygroundFile } from '@kouji-ui/components/playground-types';
4
+
5
+ /**
6
+ * Playground state — module-scope signals. Compound knobs: item count and
7
+ * an active-index selector accompany the structural divided / hoverable /
8
+ * arrow-navigation toggles.
9
+ */
10
+ const itemCount = signal<3 | 5 | 7>(5);
11
+ const divided = signal(true);
12
+ const hoverable = signal(true);
13
+ const arrowNavigation = signal(false);
14
+ const activeIndex = signal<0 | 1 | 2 | 3 | 4 | 5 | 6 | -1>(0);
15
+
16
+ const ITEMS = ['Profile', 'Notifications', 'Billing', 'Security', 'Connected apps', 'Plan', 'Danger zone'] as const;
17
+
18
+ @Component({
19
+ selector: 'kj-list-playground',
20
+ standalone: true,
21
+ imports: [KjListComponent, KjListItemComponent],
22
+ styles: [`:host { display: block; max-width: 360px; }`],
23
+ template: `
24
+ <kj-list
25
+ ariaLabel="Account settings"
26
+ [divided]="divided()"
27
+ [hoverable]="hoverable()"
28
+ [arrowNavigation]="arrowNavigation()"
29
+ >
30
+ @for (item of visibleItems(); track item; let i = $index) {
31
+ <kj-list-item [active]="i === activeIndex()">{{ item }}</kj-list-item>
32
+ }
33
+ </kj-list>
34
+ `,
35
+ changeDetection: ChangeDetectionStrategy.OnPush,
36
+ })
37
+ export class KjListPlaygroundDemo {
38
+ protected readonly itemCount = itemCount;
39
+ protected readonly divided = divided;
40
+ protected readonly hoverable = hoverable;
41
+ protected readonly arrowNavigation = arrowNavigation;
42
+ protected readonly activeIndex = activeIndex;
43
+
44
+ protected readonly visibleItems = computed(() =>
45
+ ITEMS.slice(0, itemCount()),
46
+ );
47
+ }
48
+
49
+ export const PLAYGROUND: PlaygroundFile = {
50
+ component: KjListPlaygroundDemo,
51
+ state: {
52
+ itemCount: itemCount as unknown as ReturnType<typeof signal>,
53
+ divided: divided as unknown as ReturnType<typeof signal>,
54
+ hoverable: hoverable as unknown as ReturnType<typeof signal>,
55
+ arrowNavigation: arrowNavigation as unknown as ReturnType<typeof signal>,
56
+ activeIndex: activeIndex as unknown as ReturnType<typeof signal>,
57
+ },
58
+ controls: [
59
+ { kind: 'chips', name: 'itemCount', label: 'items', options: [3, 5, 7] },
60
+ {
61
+ kind: 'chips',
62
+ name: 'activeIndex',
63
+ label: 'active row',
64
+ options: [-1, 0, 1, 2, 3, 4],
65
+ },
66
+ { kind: 'toggle', name: 'divided', label: 'divided' },
67
+ { kind: 'toggle', name: 'hoverable', label: 'hoverable' },
68
+ { kind: 'toggle', name: 'arrowNavigation', label: 'arrow navigation' },
69
+ ],
70
+ snippet: (values) => {
71
+ const s = values as {
72
+ itemCount: number;
73
+ divided: boolean;
74
+ hoverable: boolean;
75
+ arrowNavigation: boolean;
76
+ activeIndex: number;
77
+ };
78
+ const attrs: string[] = ['ariaLabel="Account settings"'];
79
+ if (s.divided) attrs.push('[divided]="true"');
80
+ if (s.hoverable) attrs.push('[hoverable]="true"');
81
+ if (s.arrowNavigation) attrs.push('[arrowNavigation]="true"');
82
+ const rows = Array.from(ITEMS.slice(0, s.itemCount))
83
+ .map((label, i) => {
84
+ const active = i === s.activeIndex ? ' [active]="true"' : '';
85
+ return ` <kj-list-item${active}>${label}</kj-list-item>`;
86
+ })
87
+ .join('\n');
88
+ return `<kj-list\n ${attrs.join('\n ')}\n>\n${rows}\n</kj-list>`;
89
+ },
90
+ };
@@ -0,0 +1,121 @@
1
+ import { Component } from '@angular/core';
2
+ import { render } from '@testing-library/angular';
3
+
4
+ import { KjListComponent, KjListItemComponent } from './list';
5
+
6
+ const imports = [KjListComponent, KjListItemComponent];
7
+
8
+ /**
9
+ * Allow Angular's signal-driven host bindings and `effect()`s to settle
10
+ * before the assertions read host attributes. Mirrors the helper used by the
11
+ * sibling `<kj-avatar-group>` spec.
12
+ */
13
+ async function flush(): Promise<void> {
14
+ await new Promise<void>((resolve) => setTimeout(resolve, 0));
15
+ await Promise.resolve();
16
+ await Promise.resolve();
17
+ }
18
+
19
+ describe('KjListComponent', () => {
20
+ it('renders projected <kj-list-item> children with the wrapper class', async () => {
21
+ @Component({
22
+ standalone: true,
23
+ imports,
24
+ template: `
25
+ <kj-list ariaLabel="Recent files">
26
+ <kj-list-item>One</kj-list-item>
27
+ <kj-list-item>Two</kj-list-item>
28
+ <kj-list-item>Three</kj-list-item>
29
+ </kj-list>`,
30
+ })
31
+ class Host {}
32
+
33
+ const { container } = await render(Host);
34
+ await flush();
35
+
36
+ const listEl = container.querySelector('kj-list') as HTMLElement;
37
+ expect(listEl).toBeTruthy();
38
+ expect(listEl.classList.contains('kj-list')).toBe(true);
39
+
40
+ const items = container.querySelectorAll('kj-list-item');
41
+ expect(items).toHaveLength(3);
42
+ items.forEach((item) => {
43
+ expect((item as HTMLElement).classList.contains('kj-list-item')).toBe(true);
44
+ });
45
+ });
46
+
47
+ it('forwards aliased inputs (orientation, divided, hoverable) to the underlying directive', async () => {
48
+ @Component({
49
+ standalone: true,
50
+ imports,
51
+ template: `
52
+ <kj-list ariaLabel="Story rail" orientation="horizontal" [divided]="true" [hoverable]="true">
53
+ <kj-list-item>A</kj-list-item>
54
+ <kj-list-item>B</kj-list-item>
55
+ </kj-list>`,
56
+ })
57
+ class Host {}
58
+
59
+ const { container } = await render(Host);
60
+ await flush();
61
+
62
+ const listEl = container.querySelector('kj-list') as HTMLElement;
63
+ // The directive emits the data-* mirrors that themes read for chrome.
64
+ expect(listEl.getAttribute('data-orientation')).toBe('horizontal');
65
+ expect(listEl.hasAttribute('data-divided')).toBe(true);
66
+ expect(listEl.hasAttribute('data-hoverable')).toBe(true);
67
+ // Default `as="ul"` → directive emits role="list" (defeats Safari's
68
+ // `list-style: none` voice-stripping heuristic).
69
+ expect(listEl.getAttribute('role')).toBe('list');
70
+ expect(listEl.getAttribute('aria-label')).toBe('Story rail');
71
+ });
72
+
73
+ it('forwards aliased item inputs (active, disabled) to the per-row directive', async () => {
74
+ @Component({
75
+ standalone: true,
76
+ imports,
77
+ template: `
78
+ <kj-list ariaLabel="L">
79
+ <kj-list-item [active]="true">A</kj-list-item>
80
+ <kj-list-item [disabled]="true">B</kj-list-item>
81
+ </kj-list>`,
82
+ })
83
+ class Host {}
84
+
85
+ const { container } = await render(Host);
86
+ await flush();
87
+
88
+ const items = container.querySelectorAll('kj-list-item');
89
+ expect(items[0].hasAttribute('data-active')).toBe(true);
90
+ expect(items[0].hasAttribute('data-disabled')).toBe(false);
91
+ expect(items[1].hasAttribute('data-active')).toBe(false);
92
+ expect(items[1].hasAttribute('data-disabled')).toBe(true);
93
+ // The list-item host is a `<kj-list-item>` (not `<li>`) — the directive
94
+ // must emit role="listitem" to pair with the container's role="list".
95
+ expect(items[0].getAttribute('role')).toBe('listitem');
96
+ expect(items[1].getAttribute('role')).toBe('listitem');
97
+ });
98
+
99
+ it('produces a navigation landmark when as="nav"', async () => {
100
+ @Component({
101
+ standalone: true,
102
+ imports,
103
+ template: `
104
+ <kj-list as="nav" ariaLabel="Primary">
105
+ <kj-list-item><a href="#a">A</a></kj-list-item>
106
+ <kj-list-item><a href="#b">B</a></kj-list-item>
107
+ </kj-list>`,
108
+ })
109
+ class Host {}
110
+
111
+ const { container } = await render(Host);
112
+ await flush();
113
+
114
+ const listEl = container.querySelector('kj-list') as HTMLElement;
115
+ // The wrapper layers `role="navigation"` on the host so the list doubles
116
+ // as a landmark; the underlying directive omits its `role="list"` in this
117
+ // mode (a landmark cannot also be a list).
118
+ expect(listEl.getAttribute('role')).toBe('navigation');
119
+ expect(listEl.getAttribute('aria-label')).toBe('Primary');
120
+ });
121
+ });
@@ -0,0 +1,227 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ ViewEncapsulation,
5
+ booleanAttribute,
6
+ computed,
7
+ input,
8
+ } from '@angular/core';
9
+ import { KjList, KjListRow, type KjListAs, type KjListOrientation } from '@kouji-ui/core';
10
+
11
+ /**
12
+ * Themed wrapper around the headless `KjList` directive. Re-maps the directive's
13
+ * `kj`-prefixed inputs to terse public names (`orientation`, `divided`,
14
+ * `hoverable`, `arrowNavigation`, `wrap`) and surfaces the `as` declaration so
15
+ * theme CSS can paint chrome (divider rules, hover highlight, orientation flex
16
+ * direction) off the standard `data-*` mirrors emitted by the directive.
17
+ *
18
+ * The wrapper host is the list root: composing `KjList` via `hostDirectives`
19
+ * means `<kj-list>` itself carries `role="list"` (or omits it when
20
+ * `as="nav"`, where the wrapper opts the host into the `navigation` landmark
21
+ * via `role="navigation"`).
22
+ *
23
+ * **Active vs. selected discipline.** The wrapper paints `data-active` on the
24
+ * row chrome but never infers ARIA. Consumers set `aria-current="page"` (or
25
+ * `step`, `date`, `true`) on the projected `<a>` / `<button>` because the
26
+ * right token depends on the consumer's domain — it is never a List concern.
27
+ *
28
+ * @example Settings list with leading icons
29
+ * ```html
30
+ * <kj-list ariaLabel="Account settings" divided hoverable>
31
+ * <kj-list-item>Profile</kj-list-item>
32
+ * <kj-list-item>Notifications</kj-list-item>
33
+ * <kj-list-item>Billing</kj-list-item>
34
+ * </kj-list>
35
+ * ```
36
+ *
37
+ * @example Sidebar nav with active row
38
+ * ```html
39
+ * <kj-list as="nav" arrowNavigation ariaLabel="Primary">
40
+ * <kj-list-item active="true">
41
+ * <a href="/home" aria-current="page">Home</a>
42
+ * </kj-list-item>
43
+ * <kj-list-item>
44
+ * <a href="/settings">Settings</a>
45
+ * </kj-list-item>
46
+ * </kj-list>
47
+ * ```
48
+ *
49
+ * @doc-example Default
50
+ * A settings list with five rows — anchors the chrome (no dividers, no hover).
51
+ * @doc-file list.example.ts
52
+ * @doc-example Usage
53
+ * Common list shapes — divided, hoverable, and a nav landmark — assembled
54
+ * as a copy-paste starting point.
55
+ * @doc-file list.usage.example.ts
56
+ * @doc-example Divided
57
+ * `[divided]="true"` paints between-row separators via theme CSS.
58
+ * @doc-file list.divided.example.ts
59
+ * @doc-example Nav landmark
60
+ * `as="nav"` opts the host into the `navigation` landmark with a label.
61
+ * @doc-file list.nav.example.ts
62
+ * @doc-example Interactive rows
63
+ * Rows project `<a>` / `<button>` children that own focus and activation.
64
+ * @doc-file list.interactive.example.ts
65
+ * @doc-example With icons and badges
66
+ * Icon prefix + trailing badge combo for status-rich rows.
67
+ * @doc-file list.with-icons.example.ts
68
+ *
69
+ * @doc-keyboard
70
+ * Tab — Moves focus to the next interactive child (the row itself is not focusable)
71
+ * Arrow up|down — Moves focus across rows when [arrowNavigation]="true" (roving tabindex)
72
+ * Home|End — Jump to the first / last row when [arrowNavigation]="true"
73
+ *
74
+ * @doc-aria
75
+ * role — "list" by default; "navigation" when as="nav"
76
+ * aria-label — Bound from [ariaLabel]; required when as="nav"
77
+ * aria-labelledby — Bound from [ariaLabelledby] when an external heading labels the list
78
+ * data-active — Mirrors a list-item's [active] for theme CSS; consumers wire aria-current separately
79
+ * data-disabled— Mirrors a list-item's [disabled] for theme CSS
80
+ *
81
+ * @doc-touch
82
+ * `--kj-list-row-min-h` defaults to 44 px so each row already meets WCAG
83
+ * 2.5.5 when the row hosts an interactive child.
84
+ *
85
+ * @doc-a11y
86
+ * The list never infers `aria-current` — consumers set the right token
87
+ * (`page` / `step` / `date` / `true`) on the projected `<a>` or
88
+ * `<button>` because the meaning is domain-specific. Disabled rows paint
89
+ * chrome via `data-disabled`; the projected child still owns its own
90
+ * `tabindex` / `aria-disabled` discipline.
91
+ *
92
+ * @doc-related divider,menubar,breadcrumb,card
93
+ *
94
+ * @doc-css-var
95
+ * --kj-list-bg — Background fill of the list container.
96
+ * --kj-list-fg — Foreground (text) color of the list.
97
+ * --kj-list-border-color — Border color for bordered + divided variants.
98
+ * --kj-list-radius — Outer corner radius of the list container.
99
+ * --kj-list-row-gap — Gap between rows. Zero by default (rows touch).
100
+ * --kj-list-row-padding-x — Horizontal padding inside each row. Sizes override.
101
+ * --kj-list-row-padding-y — Vertical padding inside each row. Sizes override.
102
+ * --kj-list-row-radius — Corner radius applied to each row's chrome.
103
+ * --kj-list-row-min-h — Minimum row height. Default 44px (WCAG 2.5.5).
104
+ *
105
+ * @doc-category Library/Data display
106
+ * @doc
107
+ * @doc-name list
108
+ * @doc-description Themed list surface for settings panels, sidebar navigation, and data feeds.
109
+ * @doc-is-main
110
+ */
111
+ @Component({
112
+ selector: 'kj-list',
113
+ standalone: true,
114
+ hostDirectives: [
115
+ {
116
+ directive: KjList,
117
+ inputs: [
118
+ 'kjAs: as',
119
+ 'kjOrientation: orientation',
120
+ 'kjDivided: divided',
121
+ 'kjHoverable: hoverable',
122
+ 'kjArrowNavigation: arrowNavigation',
123
+ 'kjListWrap: wrap',
124
+ ],
125
+ },
126
+ ],
127
+ template: `<ng-content />`,
128
+ styleUrl: './list.css',
129
+ encapsulation: ViewEncapsulation.None,
130
+ host: {
131
+ 'class': 'kj-list',
132
+ '[attr.role]': 'roleAttr()',
133
+ '[attr.aria-label]': 'ariaLabel() || null',
134
+ '[attr.aria-labelledby]': 'ariaLabelledby() || null',
135
+ },
136
+ changeDetection: ChangeDetectionStrategy.OnPush,
137
+ })
138
+ export class KjListComponent {
139
+ /**
140
+ * Declares which semantic element the consumer wants the list to behave as.
141
+ * The wrapper does not literally swap host tags (the host stays
142
+ * `<kj-list>`), but the directive uses `as` to decide whether to emit
143
+ * `role="list"`, and the wrapper layers a `role="navigation"` on top when
144
+ * `as="nav"` so the host doubles as a landmark.
145
+ */
146
+ readonly as = input<KjListAs>('ul');
147
+
148
+ /** List axis. Drives `data-orientation` on the host for theme CSS. */
149
+ readonly orientation = input<KjListOrientation>('vertical');
150
+
151
+ /** Whether the list draws between-row borders. CSS-only effect. */
152
+ readonly divided = input(false, { transform: booleanAttribute });
153
+
154
+ /** Whether rows highlight on hover. Off by default — purely informational lists should not hint at interactivity. */
155
+ readonly hoverable = input(false, { transform: booleanAttribute });
156
+
157
+ /** Opt-in roving-tabindex group for sidebar-nav-list use cases. Mirrors the accordion arrow-nav pattern. */
158
+ readonly arrowNavigation = input(false, { transform: booleanAttribute });
159
+
160
+ /** Whether arrow-key navigation wraps at the ends. Only meaningful when `arrowNavigation` is `true`. */
161
+ readonly wrap = input(true, { transform: booleanAttribute });
162
+
163
+ /** Accessible name for the list. Required for `as="nav"` (landmark naming rule). */
164
+ readonly ariaLabel = input<string | undefined>(undefined);
165
+
166
+ /** Accessible name reference for the list. Use when an existing heading labels the list. */
167
+ readonly ariaLabelledby = input<string | undefined>(undefined);
168
+
169
+ /**
170
+ * @internal Computed role for the wrapper host. When `as="nav"`, the host
171
+ * acts as the navigation landmark; otherwise it stays a plain `role="list"`.
172
+ * The wrapper owns this binding (rather than letting the composed `KjList`
173
+ * directive emit it) because Angular gives the component-level host binding
174
+ * priority over a host-directive's binding on the same attribute, so the
175
+ * directive's value would otherwise be silently shadowed.
176
+ */
177
+ protected readonly roleAttr = computed<string | null>(() =>
178
+ this.as() === 'nav' ? 'navigation' : 'list',
179
+ );
180
+ }
181
+
182
+ /**
183
+ * Per-row wrapper around the headless `KjListItem` directive. Re-maps
184
+ * `kjActive` / `kjDisabled` to terse public names and ensures the row chrome
185
+ * (active highlight, disabled dim) reads off the same `data-*` attributes the
186
+ * core directive emits.
187
+ *
188
+ * The list-item host is **not** a focus stop. Keyboard reachability lives on
189
+ * the projected interactive child (`<a>`, `<button>`). Disabling the row is a
190
+ * two-layer story: `disabled` on `<kj-list-item>` paints the chrome via
191
+ * `data-disabled`, and the projected child wires its own `aria-disabled` /
192
+ * `tabindex` discipline (e.g. via `KjDisabled` on a button).
193
+ *
194
+ * @doc-category Library/Data display
195
+ * @doc
196
+ * @doc-name list
197
+ */
198
+ @Component({
199
+ selector: 'kj-list-item',
200
+ standalone: true,
201
+ hostDirectives: [
202
+ {
203
+ directive: KjListRow,
204
+ inputs: ['kjActive: active', 'kjDisabled: disabled'],
205
+ },
206
+ ],
207
+ template: `<ng-content />`,
208
+ encapsulation: ViewEncapsulation.None,
209
+ host: { class: 'kj-list-item' },
210
+ changeDetection: ChangeDetectionStrategy.OnPush,
211
+ })
212
+ export class KjListItemComponent {
213
+ /**
214
+ * Whether the row is the current/active selection (e.g. the current page in
215
+ * a sidebar nav). Reflects to `data-active=""` on the host. Consumers must
216
+ * also set the appropriate `aria-current` token on the projected
217
+ * link/button.
218
+ */
219
+ readonly active = input(false, { transform: booleanAttribute });
220
+
221
+ /**
222
+ * Whether the row is disabled. Reflects to `data-disabled=""` on the host so
223
+ * theme CSS can dim the chrome. Does not block keyboard reachability — that
224
+ * belongs to the projected interactive child.
225
+ */
226
+ readonly disabled = input(false, { transform: booleanAttribute });
227
+ }
@@ -0,0 +1,45 @@
1
+ import { ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { KjListComponent, KjListItemComponent } from './list';
3
+
4
+ /**
5
+ * Common list shapes — a divided+hoverable settings list and a sidebar-nav
6
+ * landmark with an active row. Copy-paste starting point.
7
+ */
8
+ @Component({
9
+ selector: 'kj-list-usage-example',
10
+ standalone: true,
11
+ changeDetection: ChangeDetectionStrategy.OnPush,
12
+ imports: [KjListComponent, KjListItemComponent],
13
+ styles: [`
14
+ :host { display: grid; gap: var(--kj-space-lg); grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
15
+ h4 { margin: 0 0 var(--kj-space-sm); font: 600 var(--kj-text-sm)/1.4 var(--kj-font-sans); color: var(--kj-fg-muted); }
16
+ a { color: inherit; text-decoration: none; }
17
+ `],
18
+ template: `
19
+ <section>
20
+ <h4>Settings</h4>
21
+ <kj-list ariaLabel="Account settings" [divided]="true" [hoverable]="true">
22
+ <kj-list-item>Profile</kj-list-item>
23
+ <kj-list-item>Notifications</kj-list-item>
24
+ <kj-list-item>Billing</kj-list-item>
25
+ <kj-list-item>Security</kj-list-item>
26
+ </kj-list>
27
+ </section>
28
+
29
+ <section>
30
+ <h4>Sidebar nav</h4>
31
+ <kj-list as="nav" [arrowNavigation]="true" ariaLabel="Primary navigation">
32
+ <kj-list-item [active]="true">
33
+ <a href="/home" aria-current="page">Home</a>
34
+ </kj-list-item>
35
+ <kj-list-item>
36
+ <a href="/projects">Projects</a>
37
+ </kj-list-item>
38
+ <kj-list-item>
39
+ <a href="/settings">Settings</a>
40
+ </kj-list-item>
41
+ </kj-list>
42
+ </section>
43
+ `,
44
+ })
45
+ export class KjListUsageExample {}
@@ -0,0 +1,6 @@
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 { KjMenubarDisabledItemExample } from './menubar.disabled-item.example';
4
+ export { KjMenubarExample } from './menubar.example';
5
+ export { KjMenubarWithShortcutsExample } from './menubar.with-shortcuts.example';
6
+ export { KjMenubarWithSubmenuExample } from './menubar.with-submenu.example';
@@ -0,0 +1,23 @@
1
+ import { ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { KjMenubarComponent, KjMenubarItemComponent } from '../menubar';
3
+
4
+ /**
5
+ * Menubar with a disabled top-level item. `[kjDisabled]="true"` drops the
6
+ * item from the keyboard cycle, dims it, and prevents activation.
7
+ */
8
+ @Component({
9
+ selector: 'kj-menubar-disabled-item-example',
10
+ standalone: true,
11
+ imports: [KjMenubarComponent, KjMenubarItemComponent],
12
+ styles: [`:host { display: block; }`],
13
+ template: `
14
+ <kj-menubar kjAriaLabel="Application">
15
+ <kj-menubar-item>File</kj-menubar-item>
16
+ <kj-menubar-item>Edit</kj-menubar-item>
17
+ <kj-menubar-item [kjDisabled]="true">View</kj-menubar-item>
18
+ <kj-menubar-item>Help</kj-menubar-item>
19
+ </kj-menubar>
20
+ `,
21
+ changeDetection: ChangeDetectionStrategy.OnPush,
22
+ })
23
+ export class KjMenubarDisabledItemExample {}