@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,122 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ ElementRef,
5
+ inject,
6
+ signal,
7
+ } from '@angular/core';
8
+ import { kjColumn } from '@kouji-ui/core';
9
+ import { KjTableComponent } from '../table';
10
+ import { KjButtonComponent } from '../../button/button';
11
+
12
+ interface Row {
13
+ readonly id: string;
14
+ readonly name: string;
15
+ readonly score: number;
16
+ readonly city: string;
17
+ }
18
+
19
+ const CITIES = ['Paris', 'Tokyo', 'Lagos', 'Lima', 'Oslo', 'Cairo'];
20
+
21
+ function makeRows(n: number): Row[] {
22
+ const out = new Array<Row>(n);
23
+ for (let i = 0; i < n; i++) {
24
+ out[i] = {
25
+ id: String(i),
26
+ name: `User ${i}`,
27
+ score: (i * 37) % 1000,
28
+ city: CITIES[i % CITIES.length]!,
29
+ };
30
+ }
31
+ return out;
32
+ }
33
+
34
+ /**
35
+ * 10,000 rows force-virtualized via `[kjVirtual]="true"` with a 32px row
36
+ * estimate. Only the visible window is rendered; scroll position drives the
37
+ * virtualizer. The "scroll to row 5000" button demonstrates programmatic jump
38
+ * by computing offset = rowIndex × estimatedSize.
39
+ */
40
+ @Component({
41
+ selector: 'kj-table-virtualized-example',
42
+ standalone: true,
43
+ changeDetection: ChangeDetectionStrategy.OnPush,
44
+ imports: [KjTableComponent, KjButtonComponent],
45
+ styles: [`
46
+ :host {
47
+ /* Container-driven sizing: we own the box that the kj-table fills.
48
+ Width is explicit so the table doesn't collapse to its 0-width
49
+ content (the virtualizer hides rows until it has a viewport rect,
50
+ and an unwidthed flex column has 0-width children — chicken/egg). */
51
+ display: block;
52
+ width: 100%;
53
+ font-family: var(--kj-font-sans);
54
+ color: var(--kj-fg-default);
55
+ }
56
+ .toolbar {
57
+ display: flex;
58
+ gap: var(--kj-space-md);
59
+ align-items: center;
60
+ margin-bottom: var(--kj-space-md);
61
+ font-size: var(--kj-text-sm);
62
+ color: var(--kj-fg-muted);
63
+ }
64
+ /* Sized box the table fills. The body scrolls inside this 400px height
65
+ and the virtualizer's ResizeObserver gets a non-zero viewport from
66
+ the start. */
67
+ .kj-virt-frame {
68
+ display: flex;
69
+ flex-direction: column;
70
+ height: 400px;
71
+ min-width: 0;
72
+ border: 1px solid var(--kj-border-default);
73
+ border-radius: var(--kj-radius-field);
74
+ background: var(--kj-bg-surface);
75
+ overflow: hidden;
76
+ }
77
+ .kj-virt-frame kj-table {
78
+ flex: 1 1 auto;
79
+ min-height: 0;
80
+ }
81
+ `],
82
+ template: `
83
+ <div class="toolbar">
84
+ <kj-button kjVariant="outline" kjSize="sm" (click)="scrollToRow(5000)">
85
+ Scroll to row 5000
86
+ </kj-button>
87
+ <span>Total: {{ data().length }} rows</span>
88
+ </div>
89
+ <div class="kj-virt-frame">
90
+ <kj-table
91
+ [kjData]="data()"
92
+ [kjColumns]="cols"
93
+ [kjVirtual]="true"
94
+ [kjEstimatedRowSize]="rowSize"
95
+ />
96
+ </div>
97
+ `,
98
+ })
99
+ export class KjTableVirtualizedExample {
100
+ private readonly host: ElementRef<HTMLElement> = inject(ElementRef);
101
+
102
+ protected readonly rowSize = 32;
103
+ protected readonly data = signal<Row[]>(makeRows(10_000));
104
+
105
+ protected readonly cols = [
106
+ kjColumn<Row>({ accessorKey: 'id', header: 'ID' }),
107
+ kjColumn<Row>({ accessorKey: 'name', header: 'Name' }),
108
+ kjColumn<Row>({ accessorKey: 'score', header: 'Score' }),
109
+ kjColumn<Row>({ accessorKey: 'city', header: 'City' }),
110
+ ];
111
+
112
+ protected scrollToRow(index: number): void {
113
+ // The scroll viewport is the table's own body — that's what the
114
+ // virtualizer attaches to (it walks up from `<tbody>` to find the
115
+ // wrapper's `.kj-table-body`).
116
+ const scroller = this.host.nativeElement.querySelector<HTMLElement>(
117
+ 'kj-table .kj-table-body',
118
+ );
119
+ if (!scroller) return;
120
+ scroller.scrollTop = index * this.rowSize;
121
+ }
122
+ }
@@ -0,0 +1,11 @@
1
+ export * from './table';
2
+ export * from './table-toolbar';
3
+ export * from './table-pagination';
4
+ export * from './table-side-panel';
5
+ export * from './table-status-bar';
6
+ export * from './table-export';
7
+ export * from './table-virtual';
8
+ export * from './table-editors';
9
+ export * from './table-filters';
10
+ export * from './table-cell-editor-outlet';
11
+ export * from './table-filter-outlet';
@@ -0,0 +1,111 @@
1
+ import {
2
+ DestroyRef,
3
+ Directive,
4
+ EnvironmentInjector,
5
+ Injector,
6
+ Type,
7
+ ViewContainerRef,
8
+ effect,
9
+ inject,
10
+ input,
11
+ output,
12
+ untracked,
13
+ type ComponentRef,
14
+ } from '@angular/core';
15
+ import { KJ_EDITOR_CONTRACT, type KjEditorContract } from './table-editors';
16
+
17
+ /**
18
+ * Structural outlet that mounts a cell editor component into its own
19
+ * `ViewContainerRef`. Replaces the old anchor-`<span>` + `querySelectorAll`
20
+ * sync loop: Angular's view lifecycle now owns mount and tear-down, so when
21
+ * the host `@if` removes the directive the editor is destroyed automatically.
22
+ *
23
+ * Place inside the cell's edit branch:
24
+ *
25
+ * ```html
26
+ * @if (isEditing(c)) {
27
+ * <ng-container
28
+ * kjCellEditorOutlet
29
+ * [kjEditor]="editorTypeFor(c)"
30
+ * [kjValue]="c.getValue()"
31
+ * (commit)="onEditCommit(c, $event)"
32
+ * (cancel)="onEditCancel()"
33
+ * />
34
+ * }
35
+ * ```
36
+ *
37
+ * The directive wires `KJ_EDITOR_CONTRACT` so each editor sees the same
38
+ * `{ value, commit, cancel }` shape it does today — no editor changes needed.
39
+ */
40
+ @Directive({
41
+ selector: '[kjCellEditorOutlet]',
42
+ standalone: true,
43
+ })
44
+ export class KjCellEditorOutlet {
45
+ /** Editor component class to mount. `null` mounts nothing. */
46
+ readonly kjEditor = input<Type<unknown> | null>(null);
47
+
48
+ /** Initial value seeded into the editor's `KJ_EDITOR_CONTRACT`. */
49
+ readonly kjValue = input<unknown>(undefined);
50
+
51
+ /** Extra column meta forwarded to the editor through the contract —
52
+ * used to hand off things like select options without binding inputs
53
+ * on a dynamically-created component. */
54
+ readonly kjMeta = input<Record<string, unknown> | undefined>(undefined);
55
+
56
+ /** Fired when the editor calls `contract.commit(next)`. */
57
+ readonly commit = output<unknown>();
58
+
59
+ /** Fired when the editor calls `contract.cancel()`. */
60
+ readonly editCancel = output<void>();
61
+
62
+ private readonly vcr = inject(ViewContainerRef);
63
+ private readonly envInjector = inject(EnvironmentInjector);
64
+ private readonly parentInjector = inject(Injector);
65
+ private readonly destroyRef = inject(DestroyRef);
66
+
67
+ private ref: ComponentRef<unknown> | null = null;
68
+
69
+ constructor() {
70
+ // Re-mount whenever the editor type changes. The initial value is
71
+ // captured non-reactively — we don't want every keystroke in the editor
72
+ // to re-seed it. Commit/cancel callbacks read the latest outputs at
73
+ // emit time, so they always wire through to the live component instance.
74
+ effect(() => {
75
+ const editor = this.kjEditor();
76
+ this.tearDown();
77
+ if (!editor) return;
78
+
79
+ const initialValue = untracked(() => this.kjValue());
80
+ const meta = untracked(() => this.kjMeta());
81
+ const contract: KjEditorContract<unknown> = {
82
+ value: initialValue,
83
+ commit: (next: unknown) => this.commit.emit(next),
84
+ cancel: () => this.editCancel.emit(),
85
+ meta,
86
+ };
87
+ const childInjector = Injector.create({
88
+ providers: [{ provide: KJ_EDITOR_CONTRACT, useValue: contract }],
89
+ parent: this.parentInjector,
90
+ });
91
+ this.ref = this.vcr.createComponent(editor, {
92
+ environmentInjector: this.envInjector,
93
+ injector: childInjector,
94
+ });
95
+ // Force the editor's view to materialize NOW so its child
96
+ // components (and their constructors — KjSelectTrigger registers
97
+ // itself with KjSelect at construction time) run synchronously.
98
+ // Without this, an effect-based focus call could fire before the
99
+ // trigger directive existed.
100
+ this.ref.changeDetectorRef.detectChanges();
101
+ });
102
+
103
+ this.destroyRef.onDestroy(() => this.tearDown());
104
+ }
105
+
106
+ private tearDown(): void {
107
+ this.ref?.destroy();
108
+ this.ref = null;
109
+ this.vcr.clear();
110
+ }
111
+ }
@@ -0,0 +1,71 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ ElementRef,
5
+ ViewEncapsulation,
6
+ afterNextRender,
7
+ inject,
8
+ signal,
9
+ } from '@angular/core';
10
+ import { KjToggleComponent } from '../../toggle/toggle';
11
+ import { KJ_EDITOR_CONTRACT, type KjEditorContract } from './index';
12
+
13
+ /**
14
+ * Inline boolean cell editor for `<kj-table>`. Renders the styled
15
+ * `<kj-toggle>` component (a real `<button role="switch">` with theme
16
+ * tokens) so cell editors stay consistent with the rest of the design
17
+ * system.
18
+ *
19
+ * Each toggle commits the new draft immediately. Escape cancels.
20
+ */
21
+ @Component({
22
+ selector: 'kj-boolean-editor',
23
+ standalone: true,
24
+ imports: [KjToggleComponent],
25
+ template: `
26
+ <kj-toggle
27
+ class="kj-editor kj-editor--boolean"
28
+ appearance="switch"
29
+ [(pressed)]="draft"
30
+ (click)="ctx.commit(draft())"
31
+ (keydown.enter)="toggleAndCommit(); $event.preventDefault()"
32
+ (keydown.space)="toggleAndCommit(); $event.preventDefault()"
33
+ (keydown.escape)="cancel(); $event.stopPropagation()"
34
+ >
35
+ {{ draft() ? 'On' : 'Off' }}
36
+ </kj-toggle>
37
+ `,
38
+ encapsulation: ViewEncapsulation.None,
39
+ host: { style: 'display: contents;' },
40
+ changeDetection: ChangeDetectionStrategy.OnPush,
41
+ })
42
+ export class KjBooleanEditor {
43
+ protected readonly ctx = inject(KJ_EDITOR_CONTRACT) as KjEditorContract<boolean>;
44
+ private readonly hostEl: ElementRef<HTMLElement> = inject(ElementRef);
45
+
46
+ protected readonly draft = signal<boolean>(false);
47
+
48
+ constructor() {
49
+ this.draft.set(!!this.ctx.value);
50
+ afterNextRender(() => {
51
+ const btn = this.hostEl.nativeElement.querySelector<HTMLButtonElement>('button');
52
+ btn?.focus();
53
+ });
54
+ }
55
+
56
+ protected cancel(): void {
57
+ this.ctx.cancel();
58
+ }
59
+
60
+ /**
61
+ * Flip the draft and commit. The `[(pressed)]` two-way binding into the
62
+ * kj-toggle handles updating its visual state — and the toggle's own
63
+ * `pressedChange` will also fire commit, but `ctx.commit` is idempotent
64
+ * from the host's perspective so a single user action -> single commit.
65
+ */
66
+ protected toggleAndCommit(): void {
67
+ const next = !this.draft();
68
+ this.draft.set(next);
69
+ this.ctx.commit(next);
70
+ }
71
+ }
@@ -0,0 +1,117 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ ElementRef,
5
+ ViewEncapsulation,
6
+ afterNextRender,
7
+ inject,
8
+ signal,
9
+ } from '@angular/core';
10
+ import { KjDatePickerComponent } from '../../date-picker/date-picker';
11
+ import { KJ_EDITOR_CONTRACT, type KjEditorContract } from './index';
12
+
13
+ /**
14
+ * Inline date cell editor for `<kj-table>`. Renders the styled
15
+ * `<kj-date-picker>` component (a typed input plus a popover calendar)
16
+ * so cell editors stay consistent with the rest of the design system.
17
+ *
18
+ * The contract uses real `Date | null`. We bind to a draft signal that
19
+ * mirrors the picker's `kjValue` model. Commits on Enter; cancels on
20
+ * Escape. Blur is intentionally NOT wired here — the styled picker's
21
+ * trigger directive emits `focusout` events during mount (the calendar
22
+ * popover and the calendar input swap focus internally) so a blur
23
+ * listener would fire prematurely. The host (table cell) can use
24
+ * the contract's external lifecycle to handle commit-on-cell-blur.
25
+ */
26
+ @Component({
27
+ selector: 'kj-date-editor',
28
+ standalone: true,
29
+ imports: [KjDatePickerComponent],
30
+ template: `
31
+ <kj-date-picker
32
+ class="kj-editor kj-editor--date"
33
+ kjLocale="sv-SE"
34
+ [(kjValue)]="draft"
35
+ (keydown)="onKeydown($event)"
36
+ />
37
+ `,
38
+ encapsulation: ViewEncapsulation.None,
39
+ host: { style: 'display: contents;' },
40
+ changeDetection: ChangeDetectionStrategy.OnPush,
41
+ })
42
+ export class KjDateEditor {
43
+ private readonly ctx = inject(KJ_EDITOR_CONTRACT) as KjEditorContract<Date | null>;
44
+ private readonly hostEl: ElementRef<HTMLElement> = inject(ElementRef);
45
+ private settled = false;
46
+
47
+ protected readonly draft = signal<Date | null>(null);
48
+
49
+ constructor() {
50
+ const v = this.ctx.value;
51
+ this.draft.set(v instanceof Date && !Number.isNaN(v.getTime()) ? v : null);
52
+ afterNextRender(() => {
53
+ const input = this.hostEl.nativeElement.querySelector<HTMLInputElement>('input');
54
+ input?.focus();
55
+ });
56
+ }
57
+
58
+ protected commit(): void {
59
+ if (this.settled) return;
60
+ // Parse the input's typed text directly — at the moment Enter fires the
61
+ // styled date-picker has already pushed the parsed Date into its kjValue
62
+ // model via the trigger directive, but signal-propagation timing across
63
+ // the two-way binding chain (root context -> wrapper -> draft) is not
64
+ // guaranteed to be flushed before our handler runs. Reading the input
65
+ // element gives us a deterministic source of truth.
66
+ const input = this.hostEl.nativeElement.querySelector<HTMLInputElement>('input');
67
+ const raw = (input?.value ?? '').trim();
68
+ if (raw === '') {
69
+ this.settled = true;
70
+ this.ctx.commit(null);
71
+ return;
72
+ }
73
+ const parsed = parseIsoLike(raw) ?? this.draft();
74
+ if (!parsed || Number.isNaN(parsed.getTime())) {
75
+ this.settled = true;
76
+ this.ctx.cancel();
77
+ return;
78
+ }
79
+ this.settled = true;
80
+ this.ctx.commit(parsed);
81
+ }
82
+
83
+ protected cancel(): void {
84
+ if (this.settled) return;
85
+ this.settled = true;
86
+ this.ctx.cancel();
87
+ }
88
+
89
+ protected onKeydown(event: KeyboardEvent): void {
90
+ if (event.key === 'Enter') {
91
+ this.commit();
92
+ } else if (event.key === 'Escape') {
93
+ event.stopPropagation();
94
+ this.cancel();
95
+ }
96
+ }
97
+ }
98
+
99
+ /**
100
+ * Parse the most common date shapes (ISO `YYYY-MM-DD`, also Swedish/locale
101
+ * forms that share that order). Falls back to `new Date(raw)` for ISO-with-
102
+ * time variants. Returns `null` for anything unparseable.
103
+ */
104
+ function parseIsoLike(raw: string): Date | null {
105
+ const iso = /^(\d{4})-(\d{2})-(\d{2})$/.exec(raw);
106
+ if (iso) {
107
+ const y = Number(iso[1]);
108
+ const m = Number(iso[2]) - 1;
109
+ const d = Number(iso[3]);
110
+ const out = new Date(y, m, d);
111
+ if (out.getFullYear() === y && out.getMonth() === m && out.getDate() === d) return out;
112
+ return null;
113
+ }
114
+ const fallback = new Date(raw);
115
+ return Number.isNaN(fallback.getTime()) ? null : fallback;
116
+ }
117
+
@@ -0,0 +1,147 @@
1
+ import { Component, Type } from '@angular/core';
2
+ import { fireEvent, render } from '@testing-library/angular';
3
+ import { describe, expect, it, vi } from 'vitest';
4
+ import {
5
+ KJ_EDITOR_CONTRACT,
6
+ KjBooleanEditor,
7
+ KjDateEditor,
8
+ KjNumberEditor,
9
+ KjSelectEditor,
10
+ KjTextEditor,
11
+ type KjEditorContract,
12
+ } from './index';
13
+
14
+ function makeCtx<T>(initial: T): KjEditorContract<T> & { commit: ReturnType<typeof vi.fn>; cancel: ReturnType<typeof vi.fn> } {
15
+ return {
16
+ value: initial,
17
+ commit: vi.fn(),
18
+ cancel: vi.fn(),
19
+ };
20
+ }
21
+
22
+ async function mount<T>(cmp: Type<T>, ctx: KjEditorContract<unknown>, host?: Type<unknown>) {
23
+ return render(host ?? cmp, {
24
+ imports: [cmp],
25
+ providers: [{ provide: KJ_EDITOR_CONTRACT, useValue: ctx }],
26
+ });
27
+ }
28
+
29
+ describe('KjTextEditor', () => {
30
+ it('reads initial value and commits on Enter', async () => {
31
+ const ctx = makeCtx<string>('hello');
32
+ const { container } = await mount(KjTextEditor, ctx);
33
+ const input = container.querySelector('input') as HTMLInputElement;
34
+ expect(input.value).toBe('hello');
35
+ fireEvent.input(input, { target: { value: 'world' } });
36
+ fireEvent.keyDown(input, { key: 'Enter' });
37
+ expect(ctx.commit).toHaveBeenCalledWith('world');
38
+ });
39
+
40
+ it('calls cancel on Escape', async () => {
41
+ const ctx = makeCtx<string>('abc');
42
+ const { container } = await mount(KjTextEditor, ctx);
43
+ const input = container.querySelector('input') as HTMLInputElement;
44
+ fireEvent.keyDown(input, { key: 'Escape' });
45
+ expect(ctx.cancel).toHaveBeenCalled();
46
+ });
47
+ });
48
+
49
+ describe('KjNumberEditor', () => {
50
+ it('reads initial number and commits parsed number on Enter', async () => {
51
+ const ctx = makeCtx<number>(42);
52
+ const { container } = await mount(KjNumberEditor, ctx);
53
+ const input = container.querySelector('input') as HTMLInputElement;
54
+ expect(input.value).toBe('42');
55
+ fireEvent.input(input, { target: { value: '99' } });
56
+ fireEvent.keyDown(input, { key: 'Enter' });
57
+ expect(ctx.commit).toHaveBeenCalledWith(99);
58
+ });
59
+
60
+ it('calls cancel on Escape', async () => {
61
+ const ctx = makeCtx<number>(1);
62
+ const { container } = await mount(KjNumberEditor, ctx);
63
+ const input = container.querySelector('input') as HTMLInputElement;
64
+ fireEvent.keyDown(input, { key: 'Escape' });
65
+ expect(ctx.cancel).toHaveBeenCalled();
66
+ });
67
+ });
68
+
69
+ describe('KjDateEditor', () => {
70
+ it('reads initial date as ISO string and commits Date on Enter', async () => {
71
+ const seed = new Date(2026, 0, 15);
72
+ const ctx = makeCtx<Date | null>(seed);
73
+ const { container } = await mount(KjDateEditor, ctx);
74
+ const input = container.querySelector('input') as HTMLInputElement;
75
+ expect(input.value).toBe('2026-01-15');
76
+ fireEvent.input(input, { target: { value: '2026-05-17' } });
77
+ fireEvent.keyDown(input, { key: 'Enter' });
78
+ expect(ctx.commit).toHaveBeenCalledTimes(1);
79
+ const committed = (ctx.commit as ReturnType<typeof vi.fn>).mock.calls[0]?.[0] as Date;
80
+ expect(committed).toBeInstanceOf(Date);
81
+ expect(committed.getFullYear()).toBe(2026);
82
+ expect(committed.getMonth()).toBe(4);
83
+ expect(committed.getDate()).toBe(17);
84
+ });
85
+
86
+ it('calls cancel on Escape', async () => {
87
+ const ctx = makeCtx<Date | null>(null);
88
+ const { container } = await mount(KjDateEditor, ctx);
89
+ const input = container.querySelector('input') as HTMLInputElement;
90
+ fireEvent.keyDown(input, { key: 'Escape' });
91
+ expect(ctx.cancel).toHaveBeenCalled();
92
+ });
93
+ });
94
+
95
+ describe('KjSelectEditor', () => {
96
+ @Component({
97
+ standalone: true,
98
+ imports: [KjSelectEditor],
99
+ template: `<kj-select-editor [kjOptions]="opts" />`,
100
+ })
101
+ class SelectHost {
102
+ readonly opts: ReadonlyArray<string> = ['a', 'b', 'c'];
103
+ }
104
+
105
+ it('reads initial value and commits selected option on activation', async () => {
106
+ const ctx = makeCtx<unknown>('b');
107
+ const { container } = await mount(KjSelectEditor, ctx, SelectHost);
108
+ // The styled kj-select renders a trigger button + portalled listbox.
109
+ // Activate the trigger, then click the third option.
110
+ const trigger = container.querySelector('button') as HTMLButtonElement;
111
+ expect(trigger).toBeTruthy();
112
+ fireEvent.click(trigger);
113
+ // Options are portalled to document.body via the overlay primitive.
114
+ const options = document.querySelectorAll('[kjOption], [role="option"]');
115
+ expect(options.length).toBe(3);
116
+ fireEvent.click(options[2] as HTMLElement);
117
+ expect(ctx.commit).toHaveBeenCalledWith('c');
118
+ });
119
+
120
+ it('calls cancel on Escape', async () => {
121
+ const ctx = makeCtx<unknown>('a');
122
+ const { container } = await mount(KjSelectEditor, ctx, SelectHost);
123
+ const trigger = container.querySelector('button') as HTMLButtonElement;
124
+ fireEvent.keyDown(trigger, { key: 'Escape' });
125
+ expect(ctx.cancel).toHaveBeenCalled();
126
+ });
127
+ });
128
+
129
+ describe('KjBooleanEditor', () => {
130
+ it('reads initial value and commits toggled value on Enter', async () => {
131
+ const ctx = makeCtx<boolean>(false);
132
+ const { container } = await mount(KjBooleanEditor, ctx);
133
+ const btn = container.querySelector('button') as HTMLButtonElement;
134
+ // The styled kj-toggle uses role="switch" + aria-pressed (per APG button-with-state pattern).
135
+ expect(btn.getAttribute('aria-pressed')).toBe('false');
136
+ fireEvent.keyDown(btn, { key: 'Enter' });
137
+ expect(ctx.commit).toHaveBeenCalledWith(true);
138
+ });
139
+
140
+ it('calls cancel on Escape', async () => {
141
+ const ctx = makeCtx<boolean>(true);
142
+ const { container } = await mount(KjBooleanEditor, ctx);
143
+ const btn = container.querySelector('button') as HTMLButtonElement;
144
+ fireEvent.keyDown(btn, { key: 'Escape' });
145
+ expect(ctx.cancel).toHaveBeenCalled();
146
+ });
147
+ });
@@ -0,0 +1,41 @@
1
+ import { InjectionToken } from '@angular/core';
2
+
3
+ /**
4
+ * Contract handed to a cell editor when the user enters edit mode.
5
+ *
6
+ * The host (a table cell) wires up:
7
+ * - `value` — the current cell value to seed the editor with;
8
+ * - `commit(next)` — called when the editor wants to persist the new value
9
+ * (Enter, blur for text-like editors, or change for select/boolean);
10
+ * - `cancel()` — called when the user aborts editing (Escape).
11
+ *
12
+ * Editors should not assume anything about how the host applies the commit —
13
+ * they just call `commit(next)` with the resolved value.
14
+ */
15
+ export interface KjEditorContract<TValue> {
16
+ /** Initial value shown when the editor mounts. */
17
+ value: TValue;
18
+ /** Persist the new value. */
19
+ commit: (next: TValue) => void;
20
+ /** Discard the in-progress edit. */
21
+ cancel: () => void;
22
+ /** Column meta forwarded to the editor — e.g. select options, min/max
23
+ * for number editors, custom params. Editors read what they need and
24
+ * ignore the rest. */
25
+ meta?: Record<string, unknown>;
26
+ }
27
+
28
+ /**
29
+ * DI token for the {@link KjEditorContract}. The table cell that mounts an
30
+ * editor provides this token; each editor injects it and reacts to its
31
+ * `value` / `commit` / `cancel` hooks.
32
+ */
33
+ export const KJ_EDITOR_CONTRACT = new InjectionToken<KjEditorContract<unknown>>(
34
+ 'kj.editor.contract',
35
+ );
36
+
37
+ export * from './text-editor';
38
+ export * from './number-editor';
39
+ export * from './date-editor';
40
+ export * from './select-editor';
41
+ export * from './boolean-editor';