@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,89 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ ElementRef,
5
+ ViewEncapsulation,
6
+ afterNextRender,
7
+ inject,
8
+ signal,
9
+ viewChild,
10
+ } from '@angular/core';
11
+ import { KjNumberInputComponent } from '../../number-input/number-input';
12
+ import { KJ_EDITOR_CONTRACT, type KjEditorContract } from './index';
13
+
14
+ /**
15
+ * Inline numeric cell editor for `<kj-table>`. Renders the styled
16
+ * `<kj-number-input>` component (which wraps the headless number-input
17
+ * directive family) so cell editors stay consistent with the rest of the
18
+ * design system.
19
+ *
20
+ * Commits on Enter or blur. Cancels on Escape. Non-finite drafts (e.g. an
21
+ * empty field) round-trip through `cancel()` rather than committing `NaN`.
22
+ */
23
+ @Component({
24
+ selector: 'kj-number-editor',
25
+ standalone: true,
26
+ imports: [KjNumberInputComponent],
27
+ template: `
28
+ <kj-number-input
29
+ class="kj-editor kj-editor--number"
30
+ [(kjValue)]="draft"
31
+ (keydown.enter)="commit()"
32
+ (keydown.escape)="cancel(); $event.stopPropagation()"
33
+ (focusout)="onFocusOut($event)"
34
+ />
35
+ `,
36
+ encapsulation: ViewEncapsulation.None,
37
+ host: { style: 'display: contents;' },
38
+ changeDetection: ChangeDetectionStrategy.OnPush,
39
+ })
40
+ export class KjNumberEditor {
41
+ private readonly ctx = inject(KJ_EDITOR_CONTRACT) as KjEditorContract<number>;
42
+ private readonly hostEl: ElementRef<HTMLElement> = inject(ElementRef);
43
+ private settled = false;
44
+ private mounted = false;
45
+
46
+ /** Template-bound `<kj-number-input>` — exposes a public `focus()`. */
47
+ private readonly numberInput = viewChild(KjNumberInputComponent);
48
+
49
+ protected readonly draft = signal<number>(0);
50
+
51
+ constructor() {
52
+ const v = this.ctx.value;
53
+ this.draft.set(typeof v === 'number' && Number.isFinite(v) ? v : 0);
54
+ afterNextRender(() => {
55
+ this.numberInput()?.focus();
56
+ this.mounted = true;
57
+ });
58
+ }
59
+
60
+ protected commit(): void {
61
+ if (this.settled) return;
62
+ const value = this.draft();
63
+ this.settled = true;
64
+ if (Number.isFinite(value)) {
65
+ this.ctx.commit(value);
66
+ } else {
67
+ this.ctx.cancel();
68
+ }
69
+ }
70
+
71
+ protected cancel(): void {
72
+ if (this.settled) return;
73
+ this.settled = true;
74
+ this.ctx.cancel();
75
+ }
76
+
77
+ /**
78
+ * Commit on blur — but only when focus leaves the entire editor host
79
+ * (i.e. not when focus moves between the inner input and a stepper
80
+ * button). Without this guard, clicking a +/- stepper would fire blur
81
+ * and prematurely commit before the value updates.
82
+ */
83
+ protected onFocusOut(event: FocusEvent): void {
84
+ if (!this.mounted || this.settled) return;
85
+ const next = event.relatedTarget as Node | null;
86
+ if (next && this.hostEl.nativeElement.contains(next)) return;
87
+ this.commit();
88
+ }
89
+ }
@@ -0,0 +1,107 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ ElementRef,
5
+ ViewEncapsulation,
6
+ computed,
7
+ effect,
8
+ inject,
9
+ input,
10
+ signal,
11
+ viewChild,
12
+ } from '@angular/core';
13
+ import { KjOptionComponent, KjSelectComponent } from '../../select/select';
14
+ import { KJ_EDITOR_CONTRACT, type KjEditorContract } from './index';
15
+
16
+ /** Option entry accepted by `<kj-select-editor>`. */
17
+ export type KjSelectEditorOption = string | { value: unknown; label: string };
18
+
19
+ interface ResolvedOption {
20
+ readonly value: unknown;
21
+ readonly label: string;
22
+ }
23
+
24
+ /**
25
+ * Inline select cell editor for `<kj-table>`. Renders the styled
26
+ * `<kj-select>` component (trigger button + portalled listbox panel) so
27
+ * cell editors stay consistent with the rest of the design system.
28
+ *
29
+ * Accepts options as `string[]` or `{ value, label }[]` — strings are
30
+ * mapped to `{ value: s, label: s }`. The styled select closes its
31
+ * panel on activation; the editor commits the selected value at that
32
+ * point. Escape cancels.
33
+ */
34
+ @Component({
35
+ selector: 'kj-select-editor',
36
+ standalone: true,
37
+ imports: [KjSelectComponent, KjOptionComponent],
38
+ template: `
39
+ <kj-select
40
+ class="kj-editor kj-editor--select"
41
+ [value]="draftValue()"
42
+ (valueChange)="onValueChange($event)"
43
+ (keydown.escape)="cancel(); $event.stopPropagation()"
44
+ >
45
+ @for (opt of resolved(); track opt.label) {
46
+ <kj-option [value]="opt.value">{{ opt.label }}</kj-option>
47
+ }
48
+ </kj-select>
49
+ `,
50
+ encapsulation: ViewEncapsulation.None,
51
+ host: { style: 'display: contents;' },
52
+ changeDetection: ChangeDetectionStrategy.OnPush,
53
+ })
54
+ export class KjSelectEditor {
55
+ private readonly ctx = inject(KJ_EDITOR_CONTRACT) as KjEditorContract<unknown>;
56
+
57
+ /**
58
+ * Template-bound reference to the inner `<kj-select>`. Exposes the
59
+ * trigger via its public `focus()` API — no DOM querying needed.
60
+ */
61
+ private readonly select = viewChild(KjSelectComponent);
62
+
63
+ /** Direct option list. Optional — when omitted, options are pulled
64
+ * from `contract.meta?.options` so the cell-editor-outlet can forward
65
+ * the column's `kjSelectOptions` without binding inputs imperatively. */
66
+ readonly kjOptions = input<ReadonlyArray<KjSelectEditorOption>>([]);
67
+
68
+ protected readonly resolved = computed<ResolvedOption[]>(() => {
69
+ const direct = this.kjOptions();
70
+ const fromMeta = this.ctx.meta?.['options'] as ReadonlyArray<KjSelectEditorOption> | undefined;
71
+ const source = direct.length > 0 ? direct : (fromMeta ?? []);
72
+ return source.map(opt =>
73
+ typeof opt === 'string'
74
+ ? { value: opt, label: opt }
75
+ : { value: opt.value, label: opt.label },
76
+ );
77
+ });
78
+
79
+ protected readonly draftValue = signal<unknown>(undefined);
80
+
81
+ private focused = false;
82
+
83
+ constructor() {
84
+ this.draftValue.set(this.ctx.value);
85
+ // Two reactive hops: first the editor's viewChild resolves to the
86
+ // `<kj-select>` instance, then that instance's own `triggerEl`
87
+ // signal resolves to the trigger button's ElementRef. `effect` tracks
88
+ // both. We focus once — `focused` prevents stealing focus back if
89
+ // the user later clicks away and the signal re-emits.
90
+ effect(() => {
91
+ const sel = this.select();
92
+ const trigger = sel?.triggerEl();
93
+ if (!trigger || this.focused) return;
94
+ this.focused = true;
95
+ (trigger as ElementRef<HTMLElement>).nativeElement.focus();
96
+ });
97
+ }
98
+
99
+ protected onValueChange(next: unknown): void {
100
+ this.draftValue.set(next);
101
+ this.ctx.commit(next);
102
+ }
103
+
104
+ protected cancel(): void {
105
+ this.ctx.cancel();
106
+ }
107
+ }
@@ -0,0 +1,82 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ ElementRef,
5
+ ViewEncapsulation,
6
+ afterNextRender,
7
+ inject,
8
+ signal,
9
+ viewChild,
10
+ } from '@angular/core';
11
+ import { KjInputComponent } from '../../input/input';
12
+ import { KJ_EDITOR_CONTRACT, type KjEditorContract } from './index';
13
+
14
+ /**
15
+ * Inline text cell editor for `<kj-table>`. Renders the styled
16
+ * `<kj-input>` component (which wraps the headless `kjInput` directive and
17
+ * applies theme tokens) so cell editors stay consistent with the rest of
18
+ * the design system.
19
+ *
20
+ * Commits on Enter or blur. Cancels on Escape.
21
+ */
22
+ @Component({
23
+ selector: 'kj-text-editor',
24
+ standalone: true,
25
+ imports: [KjInputComponent],
26
+ template: `
27
+ <kj-input
28
+ class="kj-editor kj-editor--text"
29
+ [value]="draft()"
30
+ (input)="onInput($event)"
31
+ (keydown.enter)="commit()"
32
+ (keydown.escape)="cancel(); $event.stopPropagation()"
33
+ (focusout)="onFocusOut($event)"
34
+ />
35
+ `,
36
+ encapsulation: ViewEncapsulation.None,
37
+ host: { style: 'display: contents;' },
38
+ changeDetection: ChangeDetectionStrategy.OnPush,
39
+ })
40
+ export class KjTextEditor {
41
+ private readonly ctx = inject(KJ_EDITOR_CONTRACT) as KjEditorContract<string>;
42
+ private readonly hostEl: ElementRef<HTMLElement> = inject(ElementRef);
43
+ private settled = false;
44
+ private mounted = false;
45
+
46
+ /** Template-bound `<kj-input>` instance — exposes a public `focus()`. */
47
+ private readonly inputCmp = viewChild(KjInputComponent);
48
+
49
+ protected readonly draft = signal<string>('');
50
+
51
+ constructor() {
52
+ this.draft.set(this.ctx.value ?? '');
53
+ afterNextRender(() => {
54
+ this.inputCmp()?.focus();
55
+ this.mounted = true;
56
+ });
57
+ }
58
+
59
+ protected onInput(event: Event): void {
60
+ const target = event.target as HTMLInputElement | null;
61
+ if (target) this.draft.set(target.value);
62
+ }
63
+
64
+ protected commit(): void {
65
+ if (this.settled) return;
66
+ this.settled = true;
67
+ this.ctx.commit(this.draft());
68
+ }
69
+
70
+ protected cancel(): void {
71
+ if (this.settled) return;
72
+ this.settled = true;
73
+ this.ctx.cancel();
74
+ }
75
+
76
+ protected onFocusOut(event: FocusEvent): void {
77
+ if (!this.mounted || this.settled) return;
78
+ const next = event.relatedTarget as Node | null;
79
+ if (next && this.hostEl.nativeElement.contains(next)) return;
80
+ this.commit();
81
+ }
82
+ }
@@ -0,0 +1,33 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { exportCsv, exportJson, toTsv } from './table-export';
3
+
4
+ describe('exportCsv', () => {
5
+ it('escapes commas + quotes + newlines', () => {
6
+ const csv = exportCsv({
7
+ rows: [{ a: 'hi, bob', b: 'with "quotes"', c: 'line\nbreak' }],
8
+ columns: ['a', 'b', 'c'],
9
+ });
10
+ expect(csv).toBe('a,b,c\n"hi, bob","with ""quotes""","line\nbreak"');
11
+ });
12
+ it('uses column accessors via the getValue fn', () => {
13
+ const csv = exportCsv({
14
+ rows: [{ name: 'Alice' }],
15
+ columns: ['name'],
16
+ getValue: (row, col) => col === 'name' ? (row as { name: string }).name.toUpperCase() : '',
17
+ });
18
+ expect(csv).toBe('name\nALICE');
19
+ });
20
+ });
21
+
22
+ describe('exportJson', () => {
23
+ it('pretty-prints by default', () => {
24
+ const json = exportJson({ rows: [{ a: 1 }] });
25
+ expect(json).toBe('[\n {\n "a": 1\n }\n]');
26
+ });
27
+ });
28
+
29
+ describe('toTsv', () => {
30
+ it('returns tab-separated values', () => {
31
+ expect(toTsv({ rows: [{ a: 1, b: 2 }], columns: ['a', 'b'] })).toBe('a\tb\n1\t2');
32
+ });
33
+ });
@@ -0,0 +1,53 @@
1
+ export interface ExportOptions<TRow = unknown> {
2
+ rows: readonly TRow[];
3
+ columns: readonly string[];
4
+ getValue?: (row: TRow, column: string) => unknown;
5
+ }
6
+
7
+ function defaultGet<T>(row: T, column: string): unknown {
8
+ return (row as Record<string, unknown>)[column];
9
+ }
10
+
11
+ function csvEscape(v: unknown): string {
12
+ if (v == null) return '';
13
+ const s = String(v);
14
+ const needsQuotes = s.includes(',') || s.includes('"') || s.includes('\n');
15
+ return needsQuotes ? `"${s.replace(/"/g, '""')}"` : s;
16
+ }
17
+
18
+ export function exportCsv<T>(opts: ExportOptions<T>): string {
19
+ const get = opts.getValue ?? defaultGet;
20
+ const header = opts.columns.join(',');
21
+ const body = opts.rows.map(r =>
22
+ opts.columns.map(c => csvEscape(get(r, c))).join(',')
23
+ ).join('\n');
24
+ return `${header}\n${body}`;
25
+ }
26
+
27
+ export function exportJson<T>(opts: { rows: readonly T[]; pretty?: boolean }): string {
28
+ return JSON.stringify(opts.rows, null, opts.pretty === false ? 0 : 2);
29
+ }
30
+
31
+ export function toTsv<T>(opts: ExportOptions<T>): string {
32
+ const get = opts.getValue ?? defaultGet;
33
+ const header = opts.columns.join('\t');
34
+ const body = opts.rows.map(r =>
35
+ opts.columns.map(c => String(get(r, c) ?? '')).join('\t')
36
+ ).join('\n');
37
+ return `${header}\n${body}`;
38
+ }
39
+
40
+ export function downloadString(filename: string, content: string, type = 'text/plain'): void {
41
+ const blob = new Blob([content], { type });
42
+ const url = URL.createObjectURL(blob);
43
+ const a = document.createElement('a');
44
+ a.href = url; a.download = filename;
45
+ document.body.appendChild(a);
46
+ a.click();
47
+ document.body.removeChild(a);
48
+ URL.revokeObjectURL(url);
49
+ }
50
+
51
+ export async function copyToClipboard(text: string): Promise<void> {
52
+ await navigator.clipboard.writeText(text);
53
+ }
@@ -0,0 +1,137 @@
1
+ import {
2
+ DestroyRef,
3
+ Directive,
4
+ EnvironmentInjector,
5
+ Injector,
6
+ Type,
7
+ ViewContainerRef,
8
+ computed,
9
+ effect,
10
+ inject,
11
+ input,
12
+ type ComponentRef,
13
+ } from '@angular/core';
14
+ import type { Column, Table } from '@tanstack/angular-table';
15
+ import {
16
+ KJ_TABLE,
17
+ KjTable,
18
+ provideKjFilterParams,
19
+ type KjFilterParams,
20
+ } from '@kouji-ui/core';
21
+ import { KJ_FILTER_CONTEXT, type KjFilterContext } from './table-filters/text-filter';
22
+
23
+ /**
24
+ * Cell-row outlet that mounts a built-in or user-supplied filter UI for one
25
+ * column. Uses its own `ViewContainerRef` for mount + destroy, so when the
26
+ * host `@if` removes the directive Angular destroys the filter automatically
27
+ * — no DOM querying, no manual lifecycle bookkeeping.
28
+ *
29
+ * The mounted component receives:
30
+ * - **`KJ_FILTER_CONTEXT`** (legacy) — for the four built-in filters.
31
+ * - **`KJ_FILTER_PARAMS`** (modern) — used via {@link injectKjFilterParams}
32
+ * from any user-supplied filter. Custom filters should prefer this token
33
+ * over an `@Input() params` field — `setInput` / `inputBinding` cannot be
34
+ * forwarded blindly here because we don't know whether the input is
35
+ * declared, and Angular's `inputBinding` errors when the target component
36
+ * has no matching input.
37
+ *
38
+ * Column-level options (e.g. `selectOptions`) are sourced directly from
39
+ * `params.column.columnDef.meta.kj` by the filter itself, not piped through
40
+ * this outlet — keeping the outlet free of filter-type branching.
41
+ *
42
+ * ```html
43
+ * <ng-container
44
+ * kjFilterCell
45
+ * [kjColumn]="h.column"
46
+ * [kjFilter]="filterRendererFor(h.column)"
47
+ * />
48
+ * ```
49
+ */
50
+ @Directive({
51
+ selector: '[kjFilterCell]',
52
+ standalone: true,
53
+ })
54
+ export class KjFilterCellOutlet<TData = unknown> {
55
+ /** Column this filter operates on. */
56
+ readonly kjColumn = input.required<Column<TData, unknown>>();
57
+
58
+ /** Component class to mount. `null` mounts nothing. */
59
+ readonly kjFilter = input<Type<unknown> | null>(null);
60
+
61
+ private readonly vcr = inject(ViewContainerRef);
62
+ private readonly envInjector = inject(EnvironmentInjector);
63
+ private readonly parentInjector = inject(Injector);
64
+ private readonly destroyRef = inject(DestroyRef);
65
+ private readonly tableDir = inject<KjTable<TData>>(KJ_TABLE as never);
66
+
67
+ private ref: ComponentRef<unknown> | null = null;
68
+
69
+ // Cache the params used to mount the current ref. The effect compares
70
+ // these on each run and skips re-mounting when nothing meaningful changed
71
+ // — without this guard, even an identity-stable input that happens to be
72
+ // re-emitted (e.g. TanStack rebuilding header groups on every CD) would
73
+ // tear the filter down and recreate it, which broke the kj-select overlay
74
+ // because the kj-select got destroyed mid-open.
75
+ private mountedFor: { filter: Type<unknown> | null; column: Column<TData, unknown> | null } = { filter: null, column: null };
76
+
77
+ constructor() {
78
+ effect(() => {
79
+ const filter = this.kjFilter();
80
+ const column = this.kjColumn();
81
+ // Skip the re-mount when nothing meaningful changed. Without this
82
+ // guard, the parent template re-evaluates inputs every CD pass (the
83
+ // TanStack `Column` reference can be re-created during table init),
84
+ // so the effect would tear the filter down and rebuild it 8–12 times
85
+ // — destroying the kj-select mid-open and making the dropdown look
86
+ // broken.
87
+ if (this.ref && this.mountedFor.filter === filter && this.mountedFor.column === column) {
88
+ return;
89
+ }
90
+ this.tearDown();
91
+ if (!filter) return;
92
+
93
+ const tbl: Table<TData> = this.tableDir.table();
94
+ const ctx: KjFilterContext<TData> = { column, table: tbl };
95
+ const modelSig = computed(() => {
96
+ // Subscribe to the table's filter state slice so the param signal
97
+ // updates whenever any column filter changes.
98
+ this.tableDir.state.columnFilters();
99
+ return (column.getFilterValue() ?? null) as unknown;
100
+ });
101
+ const params: KjFilterParams<TData, unknown> = {
102
+ column,
103
+ api: this.tableDir.gridApi,
104
+ columnApi: this.tableDir.columnApi,
105
+ model: modelSig,
106
+ setModel: (v) =>
107
+ column.setFilterValue(
108
+ v === '' || v === null || v === undefined ? undefined : v,
109
+ ),
110
+ isActive: () => column.getIsFiltered(),
111
+ clear: () => column.setFilterValue(undefined),
112
+ };
113
+
114
+ const childInjector = Injector.create({
115
+ providers: [
116
+ { provide: KJ_FILTER_CONTEXT, useValue: ctx },
117
+ provideKjFilterParams(params),
118
+ ],
119
+ parent: this.parentInjector,
120
+ });
121
+ this.ref = this.vcr.createComponent(filter, {
122
+ environmentInjector: this.envInjector,
123
+ injector: childInjector,
124
+ });
125
+ this.mountedFor = { filter, column };
126
+ });
127
+
128
+ this.destroyRef.onDestroy(() => this.tearDown());
129
+ }
130
+
131
+ private tearDown(): void {
132
+ this.ref?.destroy();
133
+ this.ref = null;
134
+ this.vcr.clear();
135
+ this.mountedFor = { filter: null, column: null };
136
+ }
137
+ }
@@ -0,0 +1,122 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ ViewEncapsulation,
5
+ computed,
6
+ inject,
7
+ } from '@angular/core';
8
+ import type { Column } from '@tanstack/angular-table';
9
+ import { KjVisuallyHidden, type KjDateFilterModel } from '@kouji-ui/core';
10
+ import { KjDatePickerComponent } from '../../date-picker/date-picker';
11
+ import { KJ_FILTER_CONTEXT, type KjFilterContext } from './text-filter';
12
+
13
+ /** Filter value shape — ISO date strings (`YYYY-MM-DD`) or `undefined` per bound. */
14
+ export type KjDateRange = [from: string | undefined, to: string | undefined];
15
+
16
+ /**
17
+ * Date-range filter UI. Renders two styled `<kj-date-picker>` controls
18
+ * (from / to) and writes a `[from, to]` tuple of ISO date strings to
19
+ * `column.setFilterValue`. Either bound may be blank to leave it open.
20
+ *
21
+ * The wire format stays string-based (`YYYY-MM-DD`) so it serialises
22
+ * cleanly into URL state and round-trips without timezone surprises —
23
+ * conversion to / from `Date` is local to the picker boundary.
24
+ *
25
+ * Each picker is wrapped in a `<label>` carrying visually-hidden text so
26
+ * screen readers announce which bound the picker controls.
27
+ */
28
+ @Component({
29
+ selector: 'kj-date-filter',
30
+ standalone: true,
31
+ imports: [KjDatePickerComponent, KjVisuallyHidden],
32
+ styleUrl: './filters.css',
33
+ changeDetection: ChangeDetectionStrategy.OnPush,
34
+ encapsulation: ViewEncapsulation.None,
35
+ host: {
36
+ class: 'kj-date-filter',
37
+ },
38
+ template: `
39
+ <div class="kj-date-filter__label kj-date-filter__label--from">
40
+ <span kjVisuallyHidden class="kj-date-filter__caption">{{ fromAriaLabel() }}</span>
41
+ <kj-date-picker
42
+ class="kj-date-filter__input kj-date-filter__input--from"
43
+ kjSize="xs"
44
+ [kjValue]="fromDate()"
45
+ (kjValueChange)="onFromChange($event)"
46
+ />
47
+ </div>
48
+ <div class="kj-date-filter__label kj-date-filter__label--to">
49
+ <span kjVisuallyHidden class="kj-date-filter__caption">{{ toAriaLabel() }}</span>
50
+ <kj-date-picker
51
+ class="kj-date-filter__input kj-date-filter__input--to"
52
+ kjSize="xs"
53
+ [kjValue]="toDate()"
54
+ (kjValueChange)="onToChange($event)"
55
+ />
56
+ </div>
57
+ `,
58
+ })
59
+ export class KjDateFilter<TData = unknown> {
60
+ private readonly ctx = inject<KjFilterContext<TData>>(KJ_FILTER_CONTEXT);
61
+
62
+ private current: KjDateRange = (() => {
63
+ const v = this.ctx.column.getFilterValue();
64
+ if (Array.isArray(v)) return v as KjDateRange;
65
+ if (v && typeof v === 'object' && (v as { filterType?: string }).filterType === 'date') {
66
+ const m = v as KjDateFilterModel;
67
+ return [m.dateFrom, m.dateTo];
68
+ }
69
+ return [undefined, undefined];
70
+ })();
71
+
72
+ protected readonly fromDate = computed(() => isoToDate(this.current[0]));
73
+ protected readonly toDate = computed(() => isoToDate(this.current[1]));
74
+
75
+ protected readonly fromAriaLabel = computed(
76
+ () => `Filter by ${headerLabel(this.ctx.column)} from date`,
77
+ );
78
+ protected readonly toAriaLabel = computed(
79
+ () => `Filter by ${headerLabel(this.ctx.column)} to date`,
80
+ );
81
+
82
+ protected onFromChange(date: Date | null): void {
83
+ this.current = [dateToIso(date), this.current[1]];
84
+ this.commit();
85
+ }
86
+
87
+ protected onToChange(date: Date | null): void {
88
+ this.current = [this.current[0], dateToIso(date)];
89
+ this.commit();
90
+ }
91
+
92
+ private commit(): void {
93
+ const [from, to] = this.current;
94
+ if (from === undefined && to === undefined) {
95
+ this.ctx.column.setFilterValue(undefined);
96
+ return;
97
+ }
98
+ const model: KjDateFilterModel = { filterType: 'date', type: 'inRange', dateFrom: from, dateTo: to };
99
+ this.ctx.column.setFilterValue(model);
100
+ }
101
+ }
102
+
103
+ function isoToDate(iso: string | undefined): Date | null {
104
+ if (!iso) return null;
105
+ // Parse as local-time midnight so the date round-trips without TZ drift.
106
+ const [y, m, d] = iso.split('-').map(Number);
107
+ if (!y || !m || !d) return null;
108
+ return new Date(y, m - 1, d);
109
+ }
110
+
111
+ function dateToIso(date: Date | null | undefined): string | undefined {
112
+ if (!date) return undefined;
113
+ const y = date.getFullYear();
114
+ const m = String(date.getMonth() + 1).padStart(2, '0');
115
+ const d = String(date.getDate()).padStart(2, '0');
116
+ return `${y}-${m}-${d}`;
117
+ }
118
+
119
+ function headerLabel<TData>(column: Column<TData, unknown>): string {
120
+ const header = column.columnDef.header;
121
+ return typeof header === 'string' ? header : column.id;
122
+ }
@@ -0,0 +1,53 @@
1
+ /*
2
+ * Filter-row layout. All sizing flows from `kjSize="xs"` applied to the inner
3
+ * primitives (kj-input, kj-number-input, kj-select, kj-date-picker) — no more
4
+ * CSS-var override fakery here. This file owns the *layout* of the filter
5
+ * shells (flex direction, gap, child width), nothing else.
6
+ */
7
+
8
+ .kj-text-filter,
9
+ .kj-number-filter,
10
+ .kj-date-filter,
11
+ .kj-select-filter {
12
+ display: flex;
13
+ align-items: center;
14
+ gap: var(--kj-base-space-xs, 0.25rem);
15
+ width: 100%;
16
+ }
17
+
18
+ /* The text filter wraps its <kj-input> in a <label>; let the label own the
19
+ row so the visually-hidden caption stays in flow without inflating width. */
20
+ .kj-text-filter__label,
21
+ .kj-select-filter__label {
22
+ display: flex;
23
+ width: 100%;
24
+ align-items: center;
25
+ }
26
+
27
+ /* Number filter: operator picker keeps natural width, each number input
28
+ takes equal share of the rest. */
29
+ .kj-number-filter__operator {
30
+ flex: 0 0 auto;
31
+ min-width: 4.25rem;
32
+ }
33
+ .kj-number-filter__input {
34
+ flex: 1 1 0;
35
+ min-width: 0;
36
+ }
37
+
38
+ /* Date filter: both pickers split the row evenly. */
39
+ .kj-date-filter__label {
40
+ display: flex;
41
+ flex: 1 1 0;
42
+ min-width: 0;
43
+ align-items: center;
44
+ }
45
+ .kj-date-filter .kj-date-picker {
46
+ flex: 1 1 0;
47
+ min-width: 0;
48
+ }
49
+
50
+ /* Select filter: trigger fills the cell. */
51
+ .kj-select-filter .kj-select {
52
+ width: 100%;
53
+ }