@forthtilliath/forth-ui 0.2.5 → 0.4.0

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 (372) hide show
  1. package/README.md +91 -34
  2. package/dist/components/accordion/accordion-items.d.ts +1 -1
  3. package/dist/components/accordion/accordion-items.d.ts.map +1 -1
  4. package/dist/components/accordion/accordion-items.js +3 -2
  5. package/dist/components/accordion/accordion-multiple.d.ts +1 -1
  6. package/dist/components/accordion/accordion-multiple.d.ts.map +1 -1
  7. package/dist/components/accordion/accordion-multiple.js +2 -2
  8. package/dist/components/accordion/accordion-single.d.ts +1 -1
  9. package/dist/components/accordion/accordion-single.d.ts.map +1 -1
  10. package/dist/components/accordion/accordion-single.js +2 -2
  11. package/dist/components/accordion/accordion-trigger.d.ts +15 -0
  12. package/dist/components/accordion/accordion-trigger.d.ts.map +1 -0
  13. package/dist/components/accordion/accordion-trigger.js +25 -0
  14. package/dist/components/accordion/accordion.d.ts +1 -1
  15. package/dist/components/accordion/accordion.d.ts.map +1 -1
  16. package/dist/components/accordion/accordion.js +2 -2
  17. package/dist/components/accordion/index.d.ts +1 -1
  18. package/dist/components/accordion/index.d.ts.map +1 -1
  19. package/dist/components/accordion/index.js +1 -1
  20. package/dist/components/accordion/types.d.ts +1 -1
  21. package/dist/components/accordion/types.d.ts.map +1 -1
  22. package/dist/components/alert/alert.d.ts +8 -2
  23. package/dist/components/alert/alert.d.ts.map +1 -1
  24. package/dist/components/alert/alert.js +5 -3
  25. package/dist/components/alert/index.d.ts +3 -3
  26. package/dist/components/alert/index.d.ts.map +1 -1
  27. package/dist/components/alert/index.js +1 -1
  28. package/dist/components/alert/variants.d.ts.map +1 -1
  29. package/dist/components/alert/variants.js +11 -4
  30. package/dist/components/avatar/avatar-group.d.ts +1 -1
  31. package/dist/components/avatar/avatar-group.d.ts.map +1 -1
  32. package/dist/components/avatar/avatar-group.js +1 -1
  33. package/dist/components/avatar/avatar.d.ts +9 -3
  34. package/dist/components/avatar/avatar.d.ts.map +1 -1
  35. package/dist/components/avatar/avatar.js +7 -4
  36. package/dist/components/avatar/index.d.ts +4 -4
  37. package/dist/components/avatar/index.d.ts.map +1 -1
  38. package/dist/components/avatar/index.js +2 -2
  39. package/dist/components/avatar/variants.d.ts.map +1 -1
  40. package/dist/components/avatar/variants.js +39 -39
  41. package/dist/components/badge/badge.d.ts +8 -2
  42. package/dist/components/badge/badge.d.ts.map +1 -1
  43. package/dist/components/badge/badge.js +5 -3
  44. package/dist/components/badge/index.d.ts +3 -3
  45. package/dist/components/badge/index.d.ts.map +1 -1
  46. package/dist/components/badge/index.js +1 -1
  47. package/dist/components/badge/variants.d.ts.map +1 -1
  48. package/dist/components/badge/variants.js +8 -4
  49. package/dist/components/banner/banner.d.ts +8 -2
  50. package/dist/components/banner/banner.d.ts.map +1 -1
  51. package/dist/components/banner/banner.js +5 -3
  52. package/dist/components/banner/index.d.ts +3 -3
  53. package/dist/components/banner/index.d.ts.map +1 -1
  54. package/dist/components/banner/index.js +1 -1
  55. package/dist/components/bento-grid/index.d.ts +2 -2
  56. package/dist/components/bento-grid/index.d.ts.map +1 -1
  57. package/dist/components/bento-grid/index.js +1 -1
  58. package/dist/components/breadcrumb/breadcrumb.d.ts +8 -2
  59. package/dist/components/breadcrumb/breadcrumb.d.ts.map +1 -1
  60. package/dist/components/breadcrumb/breadcrumb.js +8 -3
  61. package/dist/components/breadcrumb/index.d.ts +2 -2
  62. package/dist/components/breadcrumb/index.d.ts.map +1 -1
  63. package/dist/components/breadcrumb/index.js +1 -1
  64. package/dist/components/button/button.d.ts +1 -1
  65. package/dist/components/button/button.d.ts.map +1 -1
  66. package/dist/components/button/button.js +1 -1
  67. package/dist/components/button/index.d.ts +5 -5
  68. package/dist/components/button/index.d.ts.map +1 -1
  69. package/dist/components/button/index.js +2 -2
  70. package/dist/components/checkbox/index.d.ts +2 -2
  71. package/dist/components/checkbox/index.d.ts.map +1 -1
  72. package/dist/components/checkbox/index.js +1 -1
  73. package/dist/components/chip/chip.d.ts +2 -2
  74. package/dist/components/chip/chip.d.ts.map +1 -1
  75. package/dist/components/chip/chip.js +2 -2
  76. package/dist/components/chip/index.d.ts +2 -2
  77. package/dist/components/chip/index.d.ts.map +1 -1
  78. package/dist/components/chip/index.js +1 -1
  79. package/dist/components/code-block/code-block.d.ts +7 -1
  80. package/dist/components/code-block/code-block.d.ts.map +1 -1
  81. package/dist/components/code-block/code-block.js +4 -2
  82. package/dist/components/code-block/index.d.ts +2 -2
  83. package/dist/components/code-block/index.d.ts.map +1 -1
  84. package/dist/components/code-block/index.js +1 -1
  85. package/dist/components/collapsible/index.d.ts +6 -6
  86. package/dist/components/collapsible/index.d.ts.map +1 -1
  87. package/dist/components/collapsible/index.js +3 -3
  88. package/dist/components/color-picker/color-picker.d.ts +7 -1
  89. package/dist/components/color-picker/color-picker.d.ts.map +1 -1
  90. package/dist/components/color-picker/color-picker.js +5 -3
  91. package/dist/components/color-picker/index.d.ts +2 -2
  92. package/dist/components/color-picker/index.d.ts.map +1 -1
  93. package/dist/components/color-picker/index.js +1 -1
  94. package/dist/components/column-menu/column-menu.d.ts +39 -0
  95. package/dist/components/column-menu/column-menu.d.ts.map +1 -0
  96. package/dist/components/column-menu/column-menu.js +74 -0
  97. package/dist/components/column-menu/index.d.ts +6 -0
  98. package/dist/components/column-menu/index.d.ts.map +1 -0
  99. package/dist/components/column-menu/index.js +3 -0
  100. package/dist/components/column-menu/sortable-column-row.d.ts +13 -0
  101. package/dist/components/column-menu/sortable-column-row.d.ts.map +1 -0
  102. package/dist/components/column-menu/sortable-column-row.js +22 -0
  103. package/dist/components/column-menu/types.d.ts +21 -0
  104. package/dist/components/column-menu/types.d.ts.map +1 -0
  105. package/dist/components/column-menu/types.js +7 -0
  106. package/dist/components/column-menu/use-dnd-sensors.d.ts +6 -0
  107. package/dist/components/column-menu/use-dnd-sensors.d.ts.map +1 -0
  108. package/dist/components/column-menu/use-dnd-sensors.js +14 -0
  109. package/dist/components/combobox/combobox.d.ts +16 -1
  110. package/dist/components/combobox/combobox.d.ts.map +1 -1
  111. package/dist/components/combobox/combobox.js +7 -3
  112. package/dist/components/combobox/index.d.ts +4 -4
  113. package/dist/components/combobox/index.d.ts.map +1 -1
  114. package/dist/components/combobox/index.js +2 -2
  115. package/dist/components/combobox/multi-select.d.ts +17 -2
  116. package/dist/components/combobox/multi-select.d.ts.map +1 -1
  117. package/dist/components/combobox/multi-select.js +8 -4
  118. package/dist/components/command-palette/command-palette.d.ts +7 -1
  119. package/dist/components/command-palette/command-palette.d.ts.map +1 -1
  120. package/dist/components/command-palette/command-palette.js +6 -2
  121. package/dist/components/command-palette/index.d.ts +2 -2
  122. package/dist/components/command-palette/index.d.ts.map +1 -1
  123. package/dist/components/command-palette/index.js +1 -1
  124. package/dist/components/confirm-dialog/confirm-dialog.d.ts +7 -1
  125. package/dist/components/confirm-dialog/confirm-dialog.d.ts.map +1 -1
  126. package/dist/components/confirm-dialog/confirm-dialog.js +12 -6
  127. package/dist/components/confirm-dialog/index.d.ts +3 -3
  128. package/dist/components/confirm-dialog/index.d.ts.map +1 -1
  129. package/dist/components/confirm-dialog/index.js +2 -2
  130. package/dist/components/confirm-dialog/use-confirm.d.ts +1 -1
  131. package/dist/components/confirm-dialog/use-confirm.d.ts.map +1 -1
  132. package/dist/components/confirm-dialog/use-confirm.js +1 -1
  133. package/dist/components/copy-menu-item/copy-menu-item.d.ts +18 -0
  134. package/dist/components/copy-menu-item/copy-menu-item.d.ts.map +1 -0
  135. package/dist/components/copy-menu-item/copy-menu-item.js +23 -0
  136. package/dist/components/copy-menu-item/index.d.ts +3 -0
  137. package/dist/components/copy-menu-item/index.d.ts.map +1 -0
  138. package/dist/components/copy-menu-item/index.js +1 -0
  139. package/dist/components/count-animation/index.d.ts +2 -2
  140. package/dist/components/count-animation/index.d.ts.map +1 -1
  141. package/dist/components/count-animation/index.js +1 -1
  142. package/dist/components/date-picker/date-picker.d.ts +7 -1
  143. package/dist/components/date-picker/date-picker.d.ts.map +1 -1
  144. package/dist/components/date-picker/date-picker.js +6 -3
  145. package/dist/components/date-picker/index.d.ts +2 -2
  146. package/dist/components/date-picker/index.d.ts.map +1 -1
  147. package/dist/components/date-picker/index.js +1 -1
  148. package/dist/components/description-list/index.d.ts +1 -1
  149. package/dist/components/description-list/index.d.ts.map +1 -1
  150. package/dist/components/description-list/index.js +1 -1
  151. package/dist/components/dropdrawer/index.d.ts +2 -2
  152. package/dist/components/dropdrawer/index.d.ts.map +1 -1
  153. package/dist/components/dropdrawer/index.js +1 -1
  154. package/dist/components/dropzone/dropzone.d.ts +7 -1
  155. package/dist/components/dropzone/dropzone.d.ts.map +1 -1
  156. package/dist/components/dropzone/dropzone.js +5 -3
  157. package/dist/components/dropzone/index.d.ts +2 -2
  158. package/dist/components/dropzone/index.d.ts.map +1 -1
  159. package/dist/components/dropzone/index.js +1 -1
  160. package/dist/components/field/index.d.ts +2 -2
  161. package/dist/components/field/index.d.ts.map +1 -1
  162. package/dist/components/field/index.js +1 -1
  163. package/dist/components/file-list/file-list.d.ts +4 -1
  164. package/dist/components/file-list/file-list.d.ts.map +1 -1
  165. package/dist/components/file-list/file-list.js +4 -1
  166. package/dist/components/file-list/index.d.ts +2 -2
  167. package/dist/components/file-list/index.d.ts.map +1 -1
  168. package/dist/components/file-list/index.js +1 -1
  169. package/dist/components/gradient-frame/gradient-frame.d.ts +27 -0
  170. package/dist/components/gradient-frame/gradient-frame.d.ts.map +1 -0
  171. package/dist/components/gradient-frame/gradient-frame.js +16 -0
  172. package/dist/components/gradient-frame/index.d.ts +3 -0
  173. package/dist/components/gradient-frame/index.d.ts.map +1 -0
  174. package/dist/components/gradient-frame/index.js +1 -0
  175. package/dist/components/grid/context.d.ts.map +1 -1
  176. package/dist/components/grid/context.js +1 -0
  177. package/dist/components/grid/grid-item.d.ts +1 -1
  178. package/dist/components/grid/grid-item.d.ts.map +1 -1
  179. package/dist/components/grid/grid-item.js +3 -2
  180. package/dist/components/grid/grid.d.ts +3 -3
  181. package/dist/components/grid/grid.d.ts.map +1 -1
  182. package/dist/components/grid/grid.js +4 -3
  183. package/dist/components/grid/index.d.ts +2 -2
  184. package/dist/components/grid/index.d.ts.map +1 -1
  185. package/dist/components/grid/index.js +2 -2
  186. package/dist/components/grid/variants.d.ts +2 -2
  187. package/dist/components/icon-bubble/icon-bubble.d.ts +21 -0
  188. package/dist/components/icon-bubble/icon-bubble.d.ts.map +1 -0
  189. package/dist/components/icon-bubble/icon-bubble.js +16 -0
  190. package/dist/components/icon-bubble/index.d.ts +4 -0
  191. package/dist/components/icon-bubble/index.d.ts.map +1 -0
  192. package/dist/components/icon-bubble/index.js +1 -0
  193. package/dist/components/icon-bubble/variants.d.ts +12 -0
  194. package/dist/components/icon-bubble/variants.d.ts.map +1 -0
  195. package/dist/components/icon-bubble/variants.js +19 -0
  196. package/dist/components/image-input/image-input.d.ts +7 -1
  197. package/dist/components/image-input/image-input.d.ts.map +1 -1
  198. package/dist/components/image-input/image-input.js +4 -2
  199. package/dist/components/image-input/index.d.ts +2 -2
  200. package/dist/components/image-input/index.d.ts.map +1 -1
  201. package/dist/components/image-input/index.js +1 -1
  202. package/dist/components/infinite-scroll/index.d.ts +2 -2
  203. package/dist/components/infinite-scroll/index.d.ts.map +1 -1
  204. package/dist/components/infinite-scroll/index.js +1 -1
  205. package/dist/components/kbd/index.d.ts +1 -1
  206. package/dist/components/kbd/index.d.ts.map +1 -1
  207. package/dist/components/kbd/index.js +1 -1
  208. package/dist/components/link/index.d.ts +6 -6
  209. package/dist/components/link/index.d.ts.map +1 -1
  210. package/dist/components/link/index.js +3 -3
  211. package/dist/components/link/link.d.ts +1 -1
  212. package/dist/components/link/link.d.ts.map +1 -1
  213. package/dist/components/link/link.js +1 -1
  214. package/dist/components/marquee/index.d.ts +2 -2
  215. package/dist/components/marquee/index.d.ts.map +1 -1
  216. package/dist/components/marquee/index.js +1 -1
  217. package/dist/components/mode-toggle/index.d.ts +4 -0
  218. package/dist/components/mode-toggle/index.d.ts.map +1 -0
  219. package/dist/components/mode-toggle/index.js +2 -0
  220. package/dist/components/mode-toggle/mode-toggle.d.ts +22 -0
  221. package/dist/components/mode-toggle/mode-toggle.d.ts.map +1 -0
  222. package/dist/components/mode-toggle/mode-toggle.js +26 -0
  223. package/dist/components/mode-toggle/theme-provider.d.ts +13 -0
  224. package/dist/components/mode-toggle/theme-provider.d.ts.map +1 -0
  225. package/dist/components/mode-toggle/theme-provider.js +15 -0
  226. package/dist/components/multi-step-loader/index.d.ts +2 -2
  227. package/dist/components/multi-step-loader/index.d.ts.map +1 -1
  228. package/dist/components/multi-step-loader/index.js +1 -1
  229. package/dist/components/multi-step-loader/multi-step-loader.js +2 -2
  230. package/dist/components/navbar/index.d.ts +4 -4
  231. package/dist/components/navbar/index.d.ts.map +1 -1
  232. package/dist/components/navbar/index.js +2 -2
  233. package/dist/components/navbar/navbar-mobile-menu.d.ts +7 -1
  234. package/dist/components/navbar/navbar-mobile-menu.d.ts.map +1 -1
  235. package/dist/components/navbar/navbar-mobile-menu.js +5 -3
  236. package/dist/components/notification-center/index.d.ts +2 -2
  237. package/dist/components/notification-center/index.d.ts.map +1 -1
  238. package/dist/components/notification-center/index.js +1 -1
  239. package/dist/components/notification-center/notification-center.d.ts +7 -1
  240. package/dist/components/notification-center/notification-center.d.ts.map +1 -1
  241. package/dist/components/notification-center/notification-center.js +7 -4
  242. package/dist/components/number-input/index.d.ts +2 -2
  243. package/dist/components/number-input/index.d.ts.map +1 -1
  244. package/dist/components/number-input/index.js +1 -1
  245. package/dist/components/number-input/number-input.d.ts +7 -1
  246. package/dist/components/number-input/number-input.d.ts.map +1 -1
  247. package/dist/components/number-input/number-input.js +6 -4
  248. package/dist/components/pagination/index.d.ts +4 -4
  249. package/dist/components/pagination/index.d.ts.map +1 -1
  250. package/dist/components/pagination/index.js +2 -2
  251. package/dist/components/pagination/pagination.d.ts +8 -2
  252. package/dist/components/pagination/pagination.d.ts.map +1 -1
  253. package/dist/components/pagination/pagination.js +12 -9
  254. package/dist/components/password-input/index.d.ts +4 -4
  255. package/dist/components/password-input/index.d.ts.map +1 -1
  256. package/dist/components/password-input/index.js +2 -2
  257. package/dist/components/password-input/password-input.d.ts +9 -2
  258. package/dist/components/password-input/password-input.d.ts.map +1 -1
  259. package/dist/components/password-input/password-input.js +4 -2
  260. package/dist/components/progress/index.d.ts +3 -3
  261. package/dist/components/progress/index.d.ts.map +1 -1
  262. package/dist/components/progress/index.js +1 -1
  263. package/dist/components/progress/progress.d.ts +5 -2
  264. package/dist/components/progress/progress.d.ts.map +1 -1
  265. package/dist/components/progress/progress.js +5 -3
  266. package/dist/components/qr-code/index.d.ts +2 -2
  267. package/dist/components/qr-code/index.d.ts.map +1 -1
  268. package/dist/components/qr-code/index.js +1 -1
  269. package/dist/components/qr-code/qr-code.d.ts +7 -1
  270. package/dist/components/qr-code/qr-code.d.ts.map +1 -1
  271. package/dist/components/qr-code/qr-code.js +5 -2
  272. package/dist/components/radio/index.d.ts +2 -2
  273. package/dist/components/radio/index.d.ts.map +1 -1
  274. package/dist/components/radio/index.js +1 -1
  275. package/dist/components/rating/index.d.ts +2 -2
  276. package/dist/components/rating/index.d.ts.map +1 -1
  277. package/dist/components/rating/index.js +1 -1
  278. package/dist/components/rating/rating.d.ts +7 -1
  279. package/dist/components/rating/rating.d.ts.map +1 -1
  280. package/dist/components/rating/rating.js +23 -2
  281. package/dist/components/relative-time/index.d.ts +2 -2
  282. package/dist/components/relative-time/index.d.ts.map +1 -1
  283. package/dist/components/relative-time/index.js +1 -1
  284. package/dist/components/reparent/index.d.ts +2 -2
  285. package/dist/components/reparent/index.d.ts.map +1 -1
  286. package/dist/components/reparent/index.js +1 -1
  287. package/dist/components/repeat/index.d.ts +1 -1
  288. package/dist/components/repeat/index.d.ts.map +1 -1
  289. package/dist/components/repeat/index.js +1 -1
  290. package/dist/components/scroll-progress/index.d.ts +2 -2
  291. package/dist/components/scroll-progress/index.d.ts.map +1 -1
  292. package/dist/components/scroll-progress/index.js +1 -1
  293. package/dist/components/scroll-shadow/index.d.ts +2 -2
  294. package/dist/components/scroll-shadow/index.d.ts.map +1 -1
  295. package/dist/components/scroll-shadow/index.js +1 -1
  296. package/dist/components/scroll-shadow/scroll-shadow.d.ts.map +1 -1
  297. package/dist/components/scroll-shadow/scroll-shadow.js +3 -1
  298. package/dist/components/scrollspy/index.d.ts +2 -2
  299. package/dist/components/scrollspy/index.d.ts.map +1 -1
  300. package/dist/components/scrollspy/index.js +1 -1
  301. package/dist/components/separator/index.d.ts +2 -2
  302. package/dist/components/separator/index.d.ts.map +1 -1
  303. package/dist/components/separator/index.js +1 -1
  304. package/dist/components/snippet/index.d.ts +2 -2
  305. package/dist/components/snippet/index.d.ts.map +1 -1
  306. package/dist/components/snippet/index.js +1 -1
  307. package/dist/components/snippet/snippet.d.ts +7 -1
  308. package/dist/components/snippet/snippet.d.ts.map +1 -1
  309. package/dist/components/snippet/snippet.js +6 -2
  310. package/dist/components/sortable/index.d.ts +2 -2
  311. package/dist/components/sortable/index.d.ts.map +1 -1
  312. package/dist/components/sortable/index.js +1 -1
  313. package/dist/components/spacer/index.d.ts +2 -2
  314. package/dist/components/spacer/index.d.ts.map +1 -1
  315. package/dist/components/spacer/index.js +1 -1
  316. package/dist/components/spinner/index.d.ts +3 -3
  317. package/dist/components/spinner/index.d.ts.map +1 -1
  318. package/dist/components/spinner/index.js +1 -1
  319. package/dist/components/spinner/spinner.d.ts +8 -2
  320. package/dist/components/spinner/spinner.d.ts.map +1 -1
  321. package/dist/components/spinner/spinner.js +6 -3
  322. package/dist/components/stepper/index.d.ts +2 -2
  323. package/dist/components/stepper/index.d.ts.map +1 -1
  324. package/dist/components/stepper/index.js +1 -1
  325. package/dist/components/submit-button/index.d.ts +2 -2
  326. package/dist/components/submit-button/index.d.ts.map +1 -1
  327. package/dist/components/submit-button/index.js +1 -1
  328. package/dist/components/submit-button/submit-button.d.ts +1 -1
  329. package/dist/components/submit-button/submit-button.d.ts.map +1 -1
  330. package/dist/components/submit-button/submit-button.js +1 -1
  331. package/dist/components/tags-input/index.d.ts +2 -2
  332. package/dist/components/tags-input/index.d.ts.map +1 -1
  333. package/dist/components/tags-input/index.js +1 -1
  334. package/dist/components/tags-input/tags-input.d.ts +14 -1
  335. package/dist/components/tags-input/tags-input.d.ts.map +1 -1
  336. package/dist/components/tags-input/tags-input.js +7 -4
  337. package/dist/components/theme-image/index.d.ts +3 -0
  338. package/dist/components/theme-image/index.d.ts.map +1 -0
  339. package/dist/components/theme-image/index.js +1 -0
  340. package/dist/components/theme-image/theme-image.d.ts +25 -0
  341. package/dist/components/theme-image/theme-image.d.ts.map +1 -0
  342. package/dist/components/theme-image/theme-image.js +19 -0
  343. package/dist/components/timeline/index.d.ts +2 -2
  344. package/dist/components/timeline/index.d.ts.map +1 -1
  345. package/dist/components/timeline/index.js +1 -1
  346. package/dist/components/toggle-switch/index.d.ts +4 -0
  347. package/dist/components/toggle-switch/index.d.ts.map +1 -0
  348. package/dist/components/toggle-switch/index.js +1 -0
  349. package/dist/components/toggle-switch/toggle-switch.d.ts +37 -0
  350. package/dist/components/toggle-switch/toggle-switch.d.ts.map +1 -0
  351. package/dist/components/toggle-switch/toggle-switch.js +25 -0
  352. package/dist/components/toggle-switch/variants.d.ts +9 -0
  353. package/dist/components/toggle-switch/variants.d.ts.map +1 -0
  354. package/dist/components/toggle-switch/variants.js +30 -0
  355. package/dist/components/tree/index.d.ts +2 -2
  356. package/dist/components/tree/index.d.ts.map +1 -1
  357. package/dist/components/tree/index.js +1 -1
  358. package/dist/components/tree/tree.js +1 -1
  359. package/dist/globals.css +1509 -121
  360. package/dist/locale/UiLocaleProvider.d.ts +19 -0
  361. package/dist/locale/UiLocaleProvider.d.ts.map +1 -0
  362. package/dist/locale/UiLocaleProvider.js +17 -0
  363. package/dist/locale/index.d.ts +4 -0
  364. package/dist/locale/index.d.ts.map +1 -0
  365. package/dist/locale/index.js +3 -0
  366. package/dist/locale/locale.d.ts +15 -0
  367. package/dist/locale/locale.d.ts.map +1 -0
  368. package/dist/locale/locale.js +19 -0
  369. package/dist/locale/messages.d.ts +98 -0
  370. package/dist/locale/messages.d.ts.map +1 -0
  371. package/dist/locale/messages.js +99 -0
  372. package/package.json +34 -15
@@ -1,5 +1,6 @@
1
1
  import * as React from "react";
2
2
  import type { BundledLanguage, BundledTheme, SpecialLanguage } from "shiki";
3
+ import { type UiLocale } from "../../locale/locale.js";
3
4
  export interface CodeBlockProps {
4
5
  code: string;
5
6
  language?: BundledLanguage | SpecialLanguage;
@@ -14,6 +15,11 @@ export interface CodeBlockProps {
14
15
  };
15
16
  showLineNumbers?: boolean;
16
17
  className?: string;
18
+ /**
19
+ * Language of the built-in labels — French by default, or the nearest
20
+ * `UiLocaleProvider`'s. Explicit text props still win.
21
+ */
22
+ locale?: UiLocale;
17
23
  }
18
24
  /**
19
25
  * A syntax-highlighted code block with a copy-to-clipboard button, an
@@ -27,5 +33,5 @@ export interface CodeBlockProps {
27
33
  * @author Forth
28
34
  * @copyright 2026 Forth
29
35
  */
30
- export declare function CodeBlock({ code, language, filename, theme, showLineNumbers, className, }: CodeBlockProps): React.JSX.Element;
36
+ export declare function CodeBlock({ code, language, filename, theme, showLineNumbers, className, locale, }: CodeBlockProps): React.JSX.Element;
31
37
  //# sourceMappingURL=code-block.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"code-block.d.ts","sourceRoot":"","sources":["../../../src/components/code-block/code-block.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAO5E,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,eAAe,GAAG,eAAe,CAAC;IAC7C,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,YAAY,CAAC;QAAC,IAAI,EAAE,YAAY,CAAA;KAAE,CAAC;IACpD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,QAAiB,EACjB,QAAQ,EACR,KAAqB,EACrB,eAAuB,EACvB,SAAS,GACV,EAAE,cAAc,qBAkFhB"}
1
+ {"version":3,"file":"code-block.d.ts","sourceRoot":"","sources":["../../../src/components/code-block/code-block.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAO5E,OAAO,EAAE,KAAK,QAAQ,EAAiB,MAAM,wBAAwB,CAAC;AAEtE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,eAAe,GAAG,eAAe,CAAC;IAC7C,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,YAAY,CAAC;QAAC,IAAI,EAAE,YAAY,CAAA;KAAE,CAAC;IACpD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB;AAKD;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,QAAiB,EACjB,QAAQ,EACR,KAAqB,EACrB,eAAuB,EACvB,SAAS,EACT,MAAM,GACP,EAAE,cAAc,qBAqFhB"}
@@ -6,6 +6,7 @@ import { codeToHtml } from "shiki";
6
6
  import { Badge } from "@forthtilliath/shadcn-ui/components/badge";
7
7
  import { Button } from "@forthtilliath/shadcn-ui/components/button";
8
8
  import { cn } from "@forthtilliath/shadcn-ui/lib/utils";
9
+ import { useUiMessages } from "../../locale/locale.js";
9
10
  const DEFAULT_THEME = { light: "github-light", dark: "github-dark" };
10
11
  const COPY_FEEDBACK_MS = 2000;
11
12
  /**
@@ -20,7 +21,8 @@ const COPY_FEEDBACK_MS = 2000;
20
21
  * @author Forth
21
22
  * @copyright 2026 Forth
22
23
  */
23
- export function CodeBlock({ code, language = "text", filename, theme = DEFAULT_THEME, showLineNumbers = false, className, }) {
24
+ export function CodeBlock({ code, language = "text", filename, theme = DEFAULT_THEME, showLineNumbers = false, className, locale, }) {
25
+ const messages = useUiMessages(locale);
24
26
  const [html, setHtml] = React.useState(null);
25
27
  const [copied, setCopied] = React.useState(false);
26
28
  React.useEffect(() => {
@@ -46,7 +48,7 @@ export function CodeBlock({ code, language = "text", filename, theme = DEFAULT_T
46
48
  }, COPY_FEEDBACK_MS);
47
49
  });
48
50
  }
49
- return (_jsxs("div", { className: cn("border-border bg-card overflow-hidden rounded-lg border text-sm", className), children: [(filename ?? language !== "text") && (_jsx("div", { className: "border-border bg-muted/40 flex items-center justify-between border-b px-3 py-1.5", children: _jsxs("div", { className: "flex items-center gap-2", children: [filename && (_jsx("span", { className: "text-muted-foreground font-mono text-xs", children: filename })), _jsx(Badge, { variant: "outline", className: "font-mono text-[10px]", children: language })] }) })), _jsxs("div", { className: "group relative", children: [_jsx(Button, { variant: "ghost", size: "icon", onClick: handleCopy, "aria-label": copied ? "Copied" : "Copy code", className: "absolute top-2 right-2 size-7 opacity-0 transition-opacity group-hover:opacity-100", children: copied ? _jsx(CheckIcon, {}) : _jsx(CopyIcon, {}) }), html ? (_jsx("div", { className: cn("[&_pre]:overflow-x-auto [&_pre]:p-4", showLineNumbers &&
51
+ return (_jsxs("div", { className: cn("border-border bg-card overflow-hidden rounded-lg border text-sm", className), children: [(filename ?? language !== "text") && (_jsx("div", { className: "border-border bg-muted/40 flex items-center justify-between border-b px-3 py-1.5", children: _jsxs("div", { className: "flex items-center gap-2", children: [filename && (_jsx("span", { className: "text-muted-foreground font-mono text-xs", children: filename })), _jsx(Badge, { variant: "outline", className: "font-mono text-[10px]", children: language })] }) })), _jsxs("div", { className: "group relative", children: [_jsx(Button, { variant: "ghost", size: "icon", onClick: handleCopy, "aria-label": copied ? messages.codeBlock.copied : messages.codeBlock.copy, className: "absolute top-2 right-2 size-7 opacity-0 transition-opacity group-hover:opacity-100", children: copied ? _jsx(CheckIcon, {}) : _jsx(CopyIcon, {}) }), html ? (_jsx("div", { className: cn("[&_pre]:overflow-x-auto [&_pre]:p-4", showLineNumbers &&
50
52
  "[&_code]:[counter-reset:line] [&_.line]:[counter-increment:line] [&_.line]:before:text-muted-foreground [&_.line]:before:mr-4 [&_.line]:before:inline-block [&_.line]:before:w-4 [&_.line]:before:text-right [&_.line]:before:content-[counter(line)]"),
51
53
  // Shiki generates static markup from the given `code` string
52
54
  // server-side-safe (no user input reaches this beyond the
@@ -1,3 +1,3 @@
1
- export type { CodeBlockProps } from "./code-block";
2
- export { CodeBlock } from "./code-block";
1
+ export type { CodeBlockProps } from "./code-block.js";
2
+ export { CodeBlock } from "./code-block.js";
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/code-block/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/code-block/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1 +1 @@
1
- export { CodeBlock } from "./code-block";
1
+ export { CodeBlock } from "./code-block.js";
@@ -1,7 +1,7 @@
1
- export type { CollapsibleProps } from "./collapsible";
2
- export type { CollapsibleContentProps } from "./collapsible";
3
- export type { CollapsibleTriggerProps } from "./collapsible";
4
- export { Collapsible } from "./collapsible";
5
- export { CollapsibleContent } from "./collapsible";
6
- export { CollapsibleTrigger } from "./collapsible";
1
+ export type { CollapsibleProps } from "./collapsible.js";
2
+ export type { CollapsibleContentProps } from "./collapsible.js";
3
+ export type { CollapsibleTriggerProps } from "./collapsible.js";
4
+ export { Collapsible } from "./collapsible.js";
5
+ export { CollapsibleContent } from "./collapsible.js";
6
+ export { CollapsibleTrigger } from "./collapsible.js";
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/collapsible/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAC7D,YAAY,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/collapsible/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,YAAY,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAChE,YAAY,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1,3 +1,3 @@
1
- export { Collapsible } from "./collapsible";
2
- export { CollapsibleContent } from "./collapsible";
3
- export { CollapsibleTrigger } from "./collapsible";
1
+ export { Collapsible } from "./collapsible.js";
2
+ export { CollapsibleContent } from "./collapsible.js";
3
+ export { CollapsibleTrigger } from "./collapsible.js";
@@ -1,4 +1,5 @@
1
1
  import * as React from "react";
2
+ import { type UiLocale } from "../../locale/locale.js";
2
3
  export interface ColorPickerProps {
3
4
  value?: string;
4
5
  defaultValue?: string;
@@ -7,6 +8,11 @@ export interface ColorPickerProps {
7
8
  className?: string;
8
9
  /** Accessible name for the color swatch, which otherwise has no visible text. */
9
10
  ariaLabel?: string;
11
+ /**
12
+ * Language of the built-in labels — French by default, or the nearest
13
+ * `UiLocaleProvider`'s. Explicit text props still win.
14
+ */
15
+ locale?: UiLocale;
10
16
  }
11
17
  /**
12
18
  * A color swatch + hex text input, kept in sync — built on the browser's
@@ -22,5 +28,5 @@ export interface ColorPickerProps {
22
28
  * @author Forth
23
29
  * @copyright 2026 Forth
24
30
  */
25
- export declare function ColorPicker({ value, defaultValue, onValueChange, disabled, className, ariaLabel, }: ColorPickerProps): React.JSX.Element;
31
+ export declare function ColorPicker({ value, defaultValue, onValueChange, disabled, className, ariaLabel, locale, }: ColorPickerProps): React.JSX.Element;
26
32
  //# sourceMappingURL=color-picker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"color-picker.d.ts","sourceRoot":"","sources":["../../../src/components/color-picker/color-picker.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,YAAwB,EACxB,aAAa,EACb,QAAgB,EAChB,SAAS,EACT,SAA0B,GAC3B,EAAE,gBAAgB,qBAoDlB"}
1
+ {"version":3,"file":"color-picker.d.ts","sourceRoot":"","sources":["../../../src/components/color-picker/color-picker.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,OAAO,EAAE,KAAK,QAAQ,EAAiB,MAAM,wBAAwB,CAAC;AAEtE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB;AAID;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,YAAwB,EACxB,aAAa,EACb,QAAgB,EAChB,SAAS,EACT,SAAS,EACT,MAAM,GACP,EAAE,gBAAgB,qBAsDlB"}
@@ -3,6 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
4
  import { Input } from "@forthtilliath/shadcn-ui/components/input";
5
5
  import { cn } from "@forthtilliath/shadcn-ui/lib/utils";
6
+ import { useUiMessages } from "../../locale/locale.js";
6
7
  const HEX_PATTERN = /^#[0-9a-f]{6}$/i;
7
8
  /**
8
9
  * A color swatch + hex text input, kept in sync — built on the browser's
@@ -18,7 +19,8 @@ const HEX_PATTERN = /^#[0-9a-f]{6}$/i;
18
19
  * @author Forth
19
20
  * @copyright 2026 Forth
20
21
  */
21
- export function ColorPicker({ value, defaultValue = "#000000", onValueChange, disabled = false, className, ariaLabel = "Choose color", }) {
22
+ export function ColorPicker({ value, defaultValue = "#000000", onValueChange, disabled = false, className, ariaLabel, locale, }) {
23
+ const messages = useUiMessages(locale);
22
24
  const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue);
23
25
  const [textValue, setTextValue] = React.useState(defaultValue);
24
26
  const color = value ?? uncontrolledValue;
@@ -27,9 +29,9 @@ export function ColorPicker({ value, defaultValue = "#000000", onValueChange, di
27
29
  setTextValue(next);
28
30
  onValueChange?.(next);
29
31
  }
30
- return (_jsxs("div", { "data-slot": "color-picker", className: cn("flex items-center gap-2", className), children: [_jsx("label", { "aria-label": ariaLabel, className: cn("border-input size-9 shrink-0 overflow-hidden rounded-md border shadow-xs", disabled && "pointer-events-none opacity-50"), style: { backgroundColor: color }, children: _jsx("input", { type: "color", value: color, disabled: disabled, onChange: (e) => {
32
+ return (_jsxs("div", { "data-slot": "color-picker", className: cn("flex items-center gap-2", className), children: [_jsx("label", { "aria-label": ariaLabel ?? messages.colorPicker.choose, className: cn("border-input size-9 shrink-0 overflow-hidden rounded-md border shadow-xs", disabled && "pointer-events-none opacity-50"), style: { backgroundColor: color }, children: _jsx("input", { type: "color", value: color, disabled: disabled, onChange: (e) => {
31
33
  commit(e.target.value);
32
- }, className: "size-full cursor-pointer opacity-0" }) }), _jsx(Input, { value: textValue, disabled: disabled, onChange: (e) => {
34
+ }, className: "size-full cursor-pointer opacity-0" }) }), _jsx(Input, { value: textValue, "aria-label": messages.colorPicker.hex, disabled: disabled, onChange: (e) => {
33
35
  setTextValue(e.target.value);
34
36
  if (HEX_PATTERN.test(e.target.value)) {
35
37
  commit(e.target.value);
@@ -1,3 +1,3 @@
1
- export type { ColorPickerProps } from "./color-picker";
2
- export { ColorPicker } from "./color-picker";
1
+ export type { ColorPickerProps } from "./color-picker.js";
2
+ export { ColorPicker } from "./color-picker.js";
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/color-picker/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/color-picker/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
@@ -1 +1 @@
1
- export { ColorPicker } from "./color-picker";
1
+ export { ColorPicker } from "./color-picker.js";
@@ -0,0 +1,39 @@
1
+ import type { ColumnMenuColumn, ColumnMenuLabels } from "./types.js";
2
+ export interface ColumnMenuProps<C extends ColumnMenuColumn> {
3
+ columns: C[];
4
+ /** Restored by the reset button. */
5
+ defaultColumns: C[];
6
+ /** Receives an updater, so a `useState` setter can be passed directly. */
7
+ onColumnsChange: (update: (prev: C[]) => C[]) => void;
8
+ /** Overrides some or all of the displayed texts. */
9
+ labels?: Partial<ColumnMenuLabels>;
10
+ /** Side of the trigger the dropdown is aligned to (default: `"end"`). */
11
+ align?: "start" | "end";
12
+ /**
13
+ * Custom classes for each part of the component.
14
+ *
15
+ * - `root` wraps the trigger and the dropdown.
16
+ * - `trigger` is the toggle button.
17
+ * - `badge` is the "visible / total" counter inside the trigger.
18
+ * - `content` is the dropdown panel.
19
+ * - `header` is the title + reset bar.
20
+ * - `hint` is the usage hint under the header.
21
+ * - `list` wraps the rows.
22
+ * - `row` is applied to every column row.
23
+ */
24
+ className?: Partial<Record<"root" | "trigger" | "badge" | "content" | "header" | "hint" | "list" | "row", string>>;
25
+ }
26
+ /**
27
+ * A dropdown to show/hide and reorder (drag and drop, touch and keyboard
28
+ * included) the columns of a table, with a "visible / total" counter and a
29
+ * reset button. Closes on outside click and `Escape`.
30
+ *
31
+ * Pair it with `createColumnStorage` from `@forthtilliath/ts-kit` to persist
32
+ * the user's layout.
33
+ *
34
+ * @version 0.1.0
35
+ * @author Forth
36
+ * @copyright 2026 Forth
37
+ */
38
+ export declare function ColumnMenu<C extends ColumnMenuColumn>({ columns, defaultColumns, onColumnsChange, labels, align, className, }: ColumnMenuProps<C>): import("react").JSX.Element;
39
+ //# sourceMappingURL=column-menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-menu.d.ts","sourceRoot":"","sources":["../../../src/components/column-menu/column-menu.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAIrE,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,gBAAgB;IACzD,OAAO,EAAE,CAAC,EAAE,CAAC;IACb,oCAAoC;IACpC,cAAc,EAAE,CAAC,EAAE,CAAC;IACpB,0EAA0E;IAC1E,eAAe,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC;IACtD,oDAAoD;IACpD,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACnC,yEAAyE;IACzE,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACxB;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,EAAE,OAAO,CACjB,MAAM,CACF,MAAM,GACN,SAAS,GACT,OAAO,GACP,SAAS,GACT,QAAQ,GACR,MAAM,GACN,MAAM,GACN,KAAK,EACP,MAAM,CACP,CACF,CAAC;CACH;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,gBAAgB,EAAE,EACrD,OAAO,EACP,cAAc,EACd,eAAe,EACf,MAAM,EACN,KAAa,EACb,SAAS,GACV,EAAE,eAAe,CAAC,CAAC,CAAC,+BAyJpB"}
@@ -0,0 +1,74 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useId, useRef, useState } from "react";
4
+ import { closestCenter, DndContext } from "@dnd-kit/core";
5
+ import { arrayMove, SortableContext, verticalListSortingStrategy, } from "@dnd-kit/sortable";
6
+ import { ChevronDown, RotateCcw } from "lucide-react";
7
+ import { cn } from "@forthtilliath/shadcn-ui/lib/utils";
8
+ import { SortableColumnRow } from "./sortable-column-row.js";
9
+ import { DEFAULT_COLUMN_MENU_LABELS } from "./types.js";
10
+ import { useDndSensors } from "./use-dnd-sensors.js";
11
+ /**
12
+ * A dropdown to show/hide and reorder (drag and drop, touch and keyboard
13
+ * included) the columns of a table, with a "visible / total" counter and a
14
+ * reset button. Closes on outside click and `Escape`.
15
+ *
16
+ * Pair it with `createColumnStorage` from `@forthtilliath/ts-kit` to persist
17
+ * the user's layout.
18
+ *
19
+ * @version 0.1.0
20
+ * @author Forth
21
+ * @copyright 2026 Forth
22
+ */
23
+ export function ColumnMenu({ columns, defaultColumns, onColumnsChange, labels, align = "end", className, }) {
24
+ const text = { ...DEFAULT_COLUMN_MENU_LABELS, ...labels };
25
+ // Stable id: avoids a hydration mismatch on dnd-kit's aria-describedby
26
+ const dndId = useId();
27
+ const contentId = useId();
28
+ const rootRef = useRef(null);
29
+ const [open, setOpen] = useState(false);
30
+ const sensors = useDndSensors();
31
+ const visibleCount = columns.filter((c) => c.visible).length;
32
+ const allVisible = visibleCount === columns.length;
33
+ useEffect(() => {
34
+ if (!open)
35
+ return;
36
+ function handlePointerDown(event) {
37
+ if (!rootRef.current?.contains(event.target))
38
+ setOpen(false);
39
+ }
40
+ function handleKeyDown(event) {
41
+ if (event.key === "Escape")
42
+ setOpen(false);
43
+ }
44
+ document.addEventListener("pointerdown", handlePointerDown);
45
+ document.addEventListener("keydown", handleKeyDown);
46
+ return () => {
47
+ document.removeEventListener("pointerdown", handlePointerDown);
48
+ document.removeEventListener("keydown", handleKeyDown);
49
+ };
50
+ }, [open]);
51
+ function handleDragEnd({ active, over }) {
52
+ if (!over || active.id === over.id)
53
+ return;
54
+ onColumnsChange((prev) => {
55
+ const oldIndex = prev.findIndex((c) => c.key === active.id);
56
+ const newIndex = prev.findIndex((c) => c.key === over.id);
57
+ return arrayMove(prev, oldIndex, newIndex);
58
+ });
59
+ }
60
+ function toggleColumn(key) {
61
+ onColumnsChange((prev) => prev.map((c) => (c.key === key ? { ...c, visible: !c.visible } : c)));
62
+ }
63
+ function reset() {
64
+ onColumnsChange(() => defaultColumns);
65
+ setOpen(false);
66
+ }
67
+ return (_jsxs("div", { ref: rootRef, "data-slot": "column-menu", className: cn("relative", className?.root), children: [_jsxs("button", { type: "button", "aria-expanded": open, "aria-controls": contentId, onClick: () => {
68
+ setOpen((v) => !v);
69
+ }, className: cn("flex items-center gap-1.5 rounded-lg border px-2.5 py-1.5 text-sm transition-all", open
70
+ ? "border-primary bg-primary/10 text-primary"
71
+ : "border-border text-foreground/60 hover:border-primary hover:text-foreground", className?.trigger), children: [_jsx("span", { className: "hidden sm:inline", children: text.trigger }), _jsxs("span", { className: cn("rounded-full px-1.5 py-0.5 text-xs font-medium", allVisible
72
+ ? "bg-foreground/10 text-foreground/40"
73
+ : "bg-primary text-primary-foreground", className?.badge), children: [visibleCount, "/", columns.length] }), _jsx(ChevronDown, { className: cn("size-3.5 opacity-60 transition-transform", open && "rotate-180"), "aria-hidden": "true" })] }), open && (_jsxs("div", { id: contentId, "data-slot": "column-menu-content", className: cn("bg-background border-border absolute top-full z-20 mt-2 w-64 overflow-hidden rounded-xl border shadow-xl", align === "end" ? "right-0" : "left-0", className?.content), children: [_jsxs("div", { className: cn("border-border bg-muted flex items-center justify-between border-b px-4 py-3", className?.header), children: [_jsx("p", { className: "text-foreground text-xs font-medium", children: text.title }), _jsxs("button", { type: "button", onClick: reset, className: "text-foreground/50 hover:text-primary flex items-center gap-1 text-xs transition-colors", children: [_jsx(RotateCcw, { className: "size-3", "aria-hidden": "true" }), text.reset] })] }), _jsx("p", { className: cn("border-border bg-muted/50 text-foreground/50 border-b px-4 py-2 text-xs", className?.hint), children: text.hint }), _jsx("div", { className: cn("p-2", className?.list), children: _jsx(DndContext, { id: dndId, sensors: sensors, collisionDetection: closestCenter, onDragEnd: handleDragEnd, children: _jsx(SortableContext, { items: columns.map((c) => c.key), strategy: verticalListSortingStrategy, children: columns.map((column, index) => (_jsx(SortableColumnRow, { column: column, index: index, total: columns.length, dragHandleLabel: text.dragHandle(column.label), onToggle: toggleColumn, className: className?.row }, column.key))) }) }) })] }))] }));
74
+ }
@@ -0,0 +1,6 @@
1
+ export type { ColumnMenuProps } from "./column-menu.js";
2
+ export { ColumnMenu } from "./column-menu.js";
3
+ export type { ColumnMenuColumn, ColumnMenuLabels } from "./types.js";
4
+ export { DEFAULT_COLUMN_MENU_LABELS } from "./types.js";
5
+ export { useDndSensors } from "./use-dnd-sensors.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/column-menu/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { ColumnMenu } from "./column-menu.js";
2
+ export { DEFAULT_COLUMN_MENU_LABELS } from "./types.js";
3
+ export { useDndSensors } from "./use-dnd-sensors.js";
@@ -0,0 +1,13 @@
1
+ import type { ColumnMenuColumn } from "./types.js";
2
+ export interface SortableColumnRowProps<K extends string> {
3
+ column: ColumnMenuColumn<K>;
4
+ index: number;
5
+ total: number;
6
+ dragHandleLabel: string;
7
+ onToggle: (key: K) => void;
8
+ /** Carries `data-dragging` while the row is being dragged. */
9
+ className?: string;
10
+ }
11
+ /** One row of `ColumnMenu`: drag handle, visibility switch, position. */
12
+ export declare function SortableColumnRow<K extends string>({ column, index, total, dragHandleLabel, onToggle, className, }: SortableColumnRowProps<K>): import("react").JSX.Element;
13
+ //# sourceMappingURL=sortable-column-row.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sortable-column-row.d.ts","sourceRoot":"","sources":["../../../src/components/column-menu/sortable-column-row.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,sBAAsB,CAAC,CAAC,SAAS,MAAM;IACtD,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;IAC3B,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,EAAE,EAClD,MAAM,EACN,KAAK,EACL,KAAK,EACL,eAAe,EACf,QAAQ,EACR,SAAS,GACV,EAAE,sBAAsB,CAAC,CAAC,CAAC,+BAuD3B"}
@@ -0,0 +1,22 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useSortable } from "@dnd-kit/sortable";
4
+ import { CSS } from "@dnd-kit/utilities";
5
+ import { GripVertical } from "lucide-react";
6
+ import { cn } from "@forthtilliath/shadcn-ui/lib/utils";
7
+ import { ToggleSwitch } from "../toggle-switch/index.js";
8
+ /** One row of `ColumnMenu`: drag handle, visibility switch, position. */
9
+ export function SortableColumnRow({ column, index, total, dragHandleLabel, onToggle, className, }) {
10
+ const { attributes, listeners, setNodeRef, transform, transition, isDragging, } = useSortable({ id: column.key });
11
+ return (_jsxs("div", { ref: setNodeRef, "data-slot": "column-menu-row", "data-dragging": isDragging || undefined, style: {
12
+ transform: CSS.Transform.toString(transform),
13
+ transition,
14
+ opacity: isDragging ? 0.5 : 1,
15
+ zIndex: isDragging ? 10 : undefined,
16
+ }, className: cn("flex items-center gap-3 rounded-lg px-3 py-2 transition-colors", isDragging ? "bg-primary/5 border-primary/20 border" : "hover:bg-muted", className), children: [_jsx("button", { type: "button", ...attributes, ...listeners, "aria-label": dragHandleLabel, title: dragHandleLabel, className: "text-foreground/30 hover:text-foreground/60 shrink-0 cursor-grab touch-none transition-colors active:cursor-grabbing", children: _jsx(GripVertical, { className: "size-4", "aria-hidden": "true" }) }), _jsx(ToggleSwitch, { size: "sm", checked: column.visible, onCheckedChange: () => {
17
+ onToggle(column.key);
18
+ }, label: column.label, className: {
19
+ root: "flex-1 gap-3",
20
+ label: "text-foreground/40 group-data-[state=checked]/toggle-switch:text-foreground flex-1 text-left transition-colors",
21
+ } }), _jsxs("span", { className: "text-foreground/30 shrink-0 font-mono text-xs", children: [index + 1, "/", total] })] }));
22
+ }
@@ -0,0 +1,21 @@
1
+ /** A table column the user can show/hide and reorder. */
2
+ export interface ColumnMenuColumn<K extends string = string> {
3
+ key: K;
4
+ label: string;
5
+ visible: boolean;
6
+ }
7
+ /** Texts displayed by `ColumnMenu` (English by default). */
8
+ export interface ColumnMenuLabels {
9
+ /** Trigger button text (hidden on small screens). */
10
+ trigger: string;
11
+ /** Menu title. */
12
+ title: string;
13
+ /** Reset button text. */
14
+ reset: string;
15
+ /** Usage hint under the title. */
16
+ hint: string;
17
+ /** Tooltip / accessible name of a row's drag handle. */
18
+ dragHandle: (label: string) => string;
19
+ }
20
+ export declare const DEFAULT_COLUMN_MENU_LABELS: ColumnMenuLabels;
21
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/column-menu/types.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IACzD,GAAG,EAAE,CAAC,CAAC;IACP,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,4DAA4D;AAC5D,MAAM,WAAW,gBAAgB;IAC/B,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACvC;AAED,eAAO,MAAM,0BAA0B,EAAE,gBAMxC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export const DEFAULT_COLUMN_MENU_LABELS = {
2
+ trigger: "Columns",
3
+ title: "Visible columns",
4
+ reset: "Reset",
5
+ hint: "Drag to reorder · toggle to show/hide",
6
+ dragHandle: (label) => `Move column ${label}`,
7
+ };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Mouse (5px threshold, so clicks still work), touch (250ms long press, so
3
+ * the list still scrolls) and keyboard sensors for a sortable list.
4
+ */
5
+ export declare function useDndSensors(): import("@dnd-kit/core").SensorDescriptor<import("@dnd-kit/core").SensorOptions>[];
6
+ //# sourceMappingURL=use-dnd-sensors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-dnd-sensors.d.ts","sourceRoot":"","sources":["../../../src/components/column-menu/use-dnd-sensors.ts"],"names":[],"mappings":"AAWA;;;GAGG;AACH,wBAAgB,aAAa,sFAU5B"}
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import { KeyboardSensor, MouseSensor, TouchSensor, useSensor, useSensors, } from "@dnd-kit/core";
3
+ import { sortableKeyboardCoordinates } from "@dnd-kit/sortable";
4
+ /**
5
+ * Mouse (5px threshold, so clicks still work), touch (250ms long press, so
6
+ * the list still scrolls) and keyboard sensors for a sortable list.
7
+ */
8
+ export function useDndSensors() {
9
+ return useSensors(useSensor(MouseSensor, { activationConstraint: { distance: 5 } }), useSensor(TouchSensor, {
10
+ activationConstraint: { delay: 250, tolerance: 5 },
11
+ }), useSensor(KeyboardSensor, {
12
+ coordinateGetter: sortableKeyboardCoordinates,
13
+ }));
14
+ }
@@ -1,4 +1,5 @@
1
1
  import * as React from "react";
2
+ import { type UiLocale } from "../../locale/locale.js";
2
3
  export interface ComboboxOption {
3
4
  label: string;
4
5
  value: string;
@@ -12,6 +13,20 @@ export interface ComboboxProps {
12
13
  emptyMessage?: string;
13
14
  disabled?: boolean;
14
15
  className?: string;
16
+ /** `id` of the trigger — set by `Field`, or for a `<label htmlFor>`. */
17
+ id?: string;
18
+ /**
19
+ * Accessible name of the trigger (a combobox takes no name from its text).
20
+ * Defaults to the placeholder, unless a `<label>` targets `id`.
21
+ */
22
+ ariaLabel?: string;
23
+ "aria-describedby"?: string;
24
+ "aria-invalid"?: boolean;
25
+ /**
26
+ * Language of the built-in labels — French by default, or the nearest
27
+ * `UiLocaleProvider`'s. Explicit text props still win.
28
+ */
29
+ locale?: UiLocale;
15
30
  }
16
31
  /**
17
32
  * An autocomplete/searchable select — shadcn-ui doesn't ship a standalone
@@ -27,5 +42,5 @@ export interface ComboboxProps {
27
42
  * @author Forth
28
43
  * @copyright 2026 Forth
29
44
  */
30
- export declare function Combobox({ options, value, onValueChange, placeholder, emptyMessage, disabled, className, }: ComboboxProps): React.JSX.Element;
45
+ export declare function Combobox({ options, value, onValueChange, placeholder, emptyMessage, disabled, className, locale, id, ariaLabel, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid, }: ComboboxProps): React.JSX.Element;
31
46
  //# sourceMappingURL=combobox.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"combobox.d.ts","sourceRoot":"","sources":["../../../src/components/combobox/combobox.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAoB/B,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,EACvB,OAAO,EACP,KAAK,EACL,aAAa,EACb,WAAuB,EACvB,YAAkC,EAClC,QAAgB,EAChB,SAAS,GACV,EAAE,aAAa,qBAkDf"}
1
+ {"version":3,"file":"combobox.d.ts","sourceRoot":"","sources":["../../../src/components/combobox/combobox.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAkB/B,OAAO,EAAE,KAAK,QAAQ,EAAiB,MAAM,wBAAwB,CAAC;AAGtE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,EACvB,OAAO,EACP,KAAK,EACL,aAAa,EACb,WAAW,EACX,YAAY,EACZ,QAAgB,EAChB,SAAS,EACT,MAAM,EACN,EAAE,EACF,SAAS,EACT,kBAAkB,EAAE,eAAe,EACnC,cAAc,EAAE,WAAW,GAC5B,EAAE,aAAa,qBA8Df"}
@@ -5,7 +5,8 @@ import { CheckIcon, ChevronsUpDownIcon } from "lucide-react";
5
5
  import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, } from "@forthtilliath/shadcn-ui/components/command";
6
6
  import { Popover, PopoverContent, PopoverTrigger, } from "@forthtilliath/shadcn-ui/components/popover";
7
7
  import { cn } from "@forthtilliath/shadcn-ui/lib/utils";
8
- import { Button } from "../button";
8
+ import { useUiMessages } from "../../locale/locale.js";
9
+ import { Button } from "../button/index.js";
9
10
  /**
10
11
  * An autocomplete/searchable select — shadcn-ui doesn't ship a standalone
11
12
  * Combobox primitive, only a docs recipe combining `Popover` + `Command`
@@ -20,10 +21,13 @@ import { Button } from "../button";
20
21
  * @author Forth
21
22
  * @copyright 2026 Forth
22
23
  */
23
- export function Combobox({ options, value, onValueChange, placeholder = "Select…", emptyMessage = "No results found.", disabled = false, className, }) {
24
+ export function Combobox({ options, value, onValueChange, placeholder, emptyMessage, disabled = false, className, locale, id, ariaLabel, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid, }) {
25
+ const messages = useUiMessages(locale);
26
+ const emptyMessageText = emptyMessage ?? messages.emptyResults;
27
+ const placeholderText = placeholder ?? messages.combobox.placeholder;
24
28
  const [open, setOpen] = React.useState(false);
25
29
  const selected = options.find((option) => option.value === value);
26
- return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { type: "button", variant: "outline", role: "combobox", "aria-expanded": open, disabled: disabled, className: cn("w-full justify-between font-normal", className), children: [selected?.label ?? placeholder, _jsx(ChevronsUpDownIcon, { className: "opacity-50" })] }) }), _jsx(PopoverContent, { className: "w-(--radix-popover-trigger-width) p-0", children: _jsxs(Command, { children: [_jsx(CommandInput, { placeholder: placeholder }), _jsxs(CommandList, { children: [_jsx(CommandEmpty, { children: emptyMessage }), _jsx(CommandGroup, { children: options.map((option) => (_jsxs(CommandItem, { value: option.label, disabled: option.disabled, onSelect: () => {
30
+ return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { type: "button", variant: "outline", id: id, role: "combobox", "aria-expanded": open, "aria-label": ariaLabel ?? (id === undefined ? placeholderText : undefined), "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid, disabled: disabled, className: cn("w-full justify-between font-normal", className), children: [selected?.label ?? placeholderText, _jsx(ChevronsUpDownIcon, { className: "opacity-50" })] }) }), _jsx(PopoverContent, { "aria-label": ariaLabel ?? placeholderText, className: "w-(--radix-popover-trigger-width) p-0", children: _jsxs(Command, { children: [_jsx(CommandInput, { placeholder: placeholderText }), _jsxs(CommandList, { children: [_jsx(CommandEmpty, { children: emptyMessageText }), _jsx(CommandGroup, { children: options.map((option) => (_jsxs(CommandItem, { value: option.label, disabled: option.disabled, onSelect: () => {
27
31
  onValueChange?.(option.value === value ? "" : option.value);
28
32
  setOpen(false);
29
33
  }, children: [_jsx(CheckIcon, { className: cn("size-4", option.value === value ? "opacity-100" : "opacity-0") }), option.label] }, option.value))) })] })] }) })] }));
@@ -1,5 +1,5 @@
1
- export type { ComboboxOption, ComboboxProps } from "./combobox";
2
- export { Combobox } from "./combobox";
3
- export type { MultiSelectOption, MultiSelectProps } from "./multi-select";
4
- export { MultiSelect } from "./multi-select";
1
+ export type { ComboboxOption, ComboboxProps } from "./combobox.js";
2
+ export { Combobox } from "./combobox.js";
3
+ export type { MultiSelectOption, MultiSelectProps } from "./multi-select.js";
4
+ export { MultiSelect } from "./multi-select.js";
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/combobox/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/combobox/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
@@ -1,2 +1,2 @@
1
- export { Combobox } from "./combobox";
2
- export { MultiSelect } from "./multi-select";
1
+ export { Combobox } from "./combobox.js";
2
+ export { MultiSelect } from "./multi-select.js";
@@ -1,5 +1,6 @@
1
1
  import * as React from "react";
2
- import type { ComboboxOption } from "./combobox";
2
+ import { type UiLocale } from "../../locale/locale.js";
3
+ import type { ComboboxOption } from "./combobox.js";
3
4
  export type MultiSelectOption = ComboboxOption;
4
5
  export interface MultiSelectProps {
5
6
  options: MultiSelectOption[];
@@ -10,6 +11,20 @@ export interface MultiSelectProps {
10
11
  emptyMessage?: string;
11
12
  disabled?: boolean;
12
13
  className?: string;
14
+ /** `id` of the trigger — set by `Field`, or for a `<label htmlFor>`. */
15
+ id?: string;
16
+ /**
17
+ * Accessible name of the trigger (a combobox takes no name from its text).
18
+ * Defaults to the placeholder, unless a `<label>` targets `id`.
19
+ */
20
+ ariaLabel?: string;
21
+ "aria-describedby"?: string;
22
+ "aria-invalid"?: boolean;
23
+ /**
24
+ * Language of the built-in labels — French by default, or the nearest
25
+ * `UiLocaleProvider`'s. Explicit text props still win.
26
+ */
27
+ locale?: UiLocale;
13
28
  }
14
29
  /**
15
30
  * `Combobox`'s multi-value sibling — selected options render as removable
@@ -26,5 +41,5 @@ export interface MultiSelectProps {
26
41
  * @author Forth
27
42
  * @copyright 2026 Forth
28
43
  */
29
- export declare function MultiSelect({ options, value, defaultValue, onValueChange, placeholder, emptyMessage, disabled, className, }: MultiSelectProps): React.JSX.Element;
44
+ export declare function MultiSelect({ options, value, defaultValue, onValueChange, placeholder, emptyMessage, disabled, className, locale, id, ariaLabel, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid, }: MultiSelectProps): React.JSX.Element;
30
45
  //# sourceMappingURL=multi-select.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"multi-select.d.ts","sourceRoot":"","sources":["../../../src/components/combobox/multi-select.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAqB/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,KAAK,EACL,YAAY,EACZ,aAAa,EACb,WAAuB,EACvB,YAAkC,EAClC,QAAgB,EAChB,SAAS,GACV,EAAE,gBAAgB,qBAoHlB"}
1
+ {"version":3,"file":"multi-select.d.ts","sourceRoot":"","sources":["../../../src/components/combobox/multi-select.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAmB/B,OAAO,EAAE,KAAK,QAAQ,EAAiB,MAAM,wBAAwB,CAAC;AAGtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,KAAK,EACL,YAAY,EACZ,aAAa,EACb,WAAW,EACX,YAAY,EACZ,QAAgB,EAChB,SAAS,EACT,MAAM,EACN,EAAE,EACF,SAAS,EACT,kBAAkB,EAAE,eAAe,EACnC,cAAc,EAAE,WAAW,GAC5B,EAAE,gBAAgB,qBA4HlB"}