@forthtilliath/forth-ui 0.3.0 → 0.4.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 (357) hide show
  1. package/README.md +75 -22
  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 +12 -4
  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 +1 -1
  95. package/dist/components/column-menu/column-menu.d.ts.map +1 -1
  96. package/dist/components/column-menu/column-menu.js +3 -3
  97. package/dist/components/column-menu/index.d.ts +5 -5
  98. package/dist/components/column-menu/index.d.ts.map +1 -1
  99. package/dist/components/column-menu/index.js +3 -3
  100. package/dist/components/column-menu/sortable-column-row.d.ts +1 -1
  101. package/dist/components/column-menu/sortable-column-row.d.ts.map +1 -1
  102. package/dist/components/column-menu/sortable-column-row.js +1 -1
  103. package/dist/components/combobox/combobox.d.ts +16 -1
  104. package/dist/components/combobox/combobox.d.ts.map +1 -1
  105. package/dist/components/combobox/combobox.js +7 -3
  106. package/dist/components/combobox/index.d.ts +4 -4
  107. package/dist/components/combobox/index.d.ts.map +1 -1
  108. package/dist/components/combobox/index.js +2 -2
  109. package/dist/components/combobox/multi-select.d.ts +17 -2
  110. package/dist/components/combobox/multi-select.d.ts.map +1 -1
  111. package/dist/components/combobox/multi-select.js +8 -4
  112. package/dist/components/command-palette/command-palette.d.ts +7 -1
  113. package/dist/components/command-palette/command-palette.d.ts.map +1 -1
  114. package/dist/components/command-palette/command-palette.js +6 -2
  115. package/dist/components/command-palette/index.d.ts +2 -2
  116. package/dist/components/command-palette/index.d.ts.map +1 -1
  117. package/dist/components/command-palette/index.js +1 -1
  118. package/dist/components/confirm-dialog/confirm-dialog.d.ts +7 -1
  119. package/dist/components/confirm-dialog/confirm-dialog.d.ts.map +1 -1
  120. package/dist/components/confirm-dialog/confirm-dialog.js +12 -6
  121. package/dist/components/confirm-dialog/index.d.ts +3 -3
  122. package/dist/components/confirm-dialog/index.d.ts.map +1 -1
  123. package/dist/components/confirm-dialog/index.js +2 -2
  124. package/dist/components/confirm-dialog/use-confirm.d.ts +1 -1
  125. package/dist/components/confirm-dialog/use-confirm.d.ts.map +1 -1
  126. package/dist/components/confirm-dialog/use-confirm.js +1 -1
  127. package/dist/components/copy-menu-item/copy-menu-item.d.ts +18 -0
  128. package/dist/components/copy-menu-item/copy-menu-item.d.ts.map +1 -0
  129. package/dist/components/copy-menu-item/copy-menu-item.js +23 -0
  130. package/dist/components/copy-menu-item/index.d.ts +3 -0
  131. package/dist/components/copy-menu-item/index.d.ts.map +1 -0
  132. package/dist/components/copy-menu-item/index.js +1 -0
  133. package/dist/components/count-animation/index.d.ts +2 -2
  134. package/dist/components/count-animation/index.d.ts.map +1 -1
  135. package/dist/components/count-animation/index.js +1 -1
  136. package/dist/components/date-picker/date-picker.d.ts +7 -1
  137. package/dist/components/date-picker/date-picker.d.ts.map +1 -1
  138. package/dist/components/date-picker/date-picker.js +6 -3
  139. package/dist/components/date-picker/index.d.ts +2 -2
  140. package/dist/components/date-picker/index.d.ts.map +1 -1
  141. package/dist/components/date-picker/index.js +1 -1
  142. package/dist/components/description-list/index.d.ts +1 -1
  143. package/dist/components/description-list/index.d.ts.map +1 -1
  144. package/dist/components/description-list/index.js +1 -1
  145. package/dist/components/dropdrawer/index.d.ts +2 -2
  146. package/dist/components/dropdrawer/index.d.ts.map +1 -1
  147. package/dist/components/dropdrawer/index.js +1 -1
  148. package/dist/components/dropzone/dropzone.d.ts +7 -1
  149. package/dist/components/dropzone/dropzone.d.ts.map +1 -1
  150. package/dist/components/dropzone/dropzone.js +5 -3
  151. package/dist/components/dropzone/index.d.ts +2 -2
  152. package/dist/components/dropzone/index.d.ts.map +1 -1
  153. package/dist/components/dropzone/index.js +1 -1
  154. package/dist/components/field/index.d.ts +2 -2
  155. package/dist/components/field/index.d.ts.map +1 -1
  156. package/dist/components/field/index.js +1 -1
  157. package/dist/components/file-list/file-list.d.ts +4 -1
  158. package/dist/components/file-list/file-list.d.ts.map +1 -1
  159. package/dist/components/file-list/file-list.js +4 -1
  160. package/dist/components/file-list/index.d.ts +2 -2
  161. package/dist/components/file-list/index.d.ts.map +1 -1
  162. package/dist/components/file-list/index.js +1 -1
  163. package/dist/components/gradient-frame/index.d.ts +2 -2
  164. package/dist/components/gradient-frame/index.d.ts.map +1 -1
  165. package/dist/components/gradient-frame/index.js +1 -1
  166. package/dist/components/grid/context.d.ts.map +1 -1
  167. package/dist/components/grid/context.js +1 -0
  168. package/dist/components/grid/grid-item.d.ts +1 -1
  169. package/dist/components/grid/grid-item.d.ts.map +1 -1
  170. package/dist/components/grid/grid-item.js +3 -2
  171. package/dist/components/grid/grid.d.ts +3 -3
  172. package/dist/components/grid/grid.d.ts.map +1 -1
  173. package/dist/components/grid/grid.js +4 -3
  174. package/dist/components/grid/index.d.ts +2 -2
  175. package/dist/components/grid/index.d.ts.map +1 -1
  176. package/dist/components/grid/index.js +2 -2
  177. package/dist/components/grid/variants.d.ts +1 -1
  178. package/dist/components/icon-bubble/icon-bubble.d.ts +1 -1
  179. package/dist/components/icon-bubble/icon-bubble.d.ts.map +1 -1
  180. package/dist/components/icon-bubble/icon-bubble.js +1 -1
  181. package/dist/components/icon-bubble/index.d.ts +3 -3
  182. package/dist/components/icon-bubble/index.d.ts.map +1 -1
  183. package/dist/components/icon-bubble/index.js +1 -1
  184. package/dist/components/image-input/image-input.d.ts +7 -1
  185. package/dist/components/image-input/image-input.d.ts.map +1 -1
  186. package/dist/components/image-input/image-input.js +4 -2
  187. package/dist/components/image-input/index.d.ts +2 -2
  188. package/dist/components/image-input/index.d.ts.map +1 -1
  189. package/dist/components/image-input/index.js +1 -1
  190. package/dist/components/infinite-scroll/index.d.ts +2 -2
  191. package/dist/components/infinite-scroll/index.d.ts.map +1 -1
  192. package/dist/components/infinite-scroll/index.js +1 -1
  193. package/dist/components/kbd/index.d.ts +1 -1
  194. package/dist/components/kbd/index.d.ts.map +1 -1
  195. package/dist/components/kbd/index.js +1 -1
  196. package/dist/components/link/index.d.ts +6 -6
  197. package/dist/components/link/index.d.ts.map +1 -1
  198. package/dist/components/link/index.js +3 -3
  199. package/dist/components/link/link.d.ts +1 -1
  200. package/dist/components/link/link.d.ts.map +1 -1
  201. package/dist/components/link/link.js +1 -1
  202. package/dist/components/marquee/index.d.ts +2 -2
  203. package/dist/components/marquee/index.d.ts.map +1 -1
  204. package/dist/components/marquee/index.js +1 -1
  205. package/dist/components/mode-toggle/index.d.ts +4 -0
  206. package/dist/components/mode-toggle/index.d.ts.map +1 -0
  207. package/dist/components/mode-toggle/index.js +2 -0
  208. package/dist/components/mode-toggle/mode-toggle.d.ts +22 -0
  209. package/dist/components/mode-toggle/mode-toggle.d.ts.map +1 -0
  210. package/dist/components/mode-toggle/mode-toggle.js +26 -0
  211. package/dist/components/mode-toggle/theme-provider.d.ts +13 -0
  212. package/dist/components/mode-toggle/theme-provider.d.ts.map +1 -0
  213. package/dist/components/mode-toggle/theme-provider.js +15 -0
  214. package/dist/components/multi-step-loader/index.d.ts +2 -2
  215. package/dist/components/multi-step-loader/index.d.ts.map +1 -1
  216. package/dist/components/multi-step-loader/index.js +1 -1
  217. package/dist/components/multi-step-loader/multi-step-loader.js +2 -2
  218. package/dist/components/navbar/index.d.ts +4 -4
  219. package/dist/components/navbar/index.d.ts.map +1 -1
  220. package/dist/components/navbar/index.js +2 -2
  221. package/dist/components/navbar/navbar-mobile-menu.d.ts +7 -1
  222. package/dist/components/navbar/navbar-mobile-menu.d.ts.map +1 -1
  223. package/dist/components/navbar/navbar-mobile-menu.js +5 -3
  224. package/dist/components/notification-center/index.d.ts +2 -2
  225. package/dist/components/notification-center/index.d.ts.map +1 -1
  226. package/dist/components/notification-center/index.js +1 -1
  227. package/dist/components/notification-center/notification-center.d.ts +7 -1
  228. package/dist/components/notification-center/notification-center.d.ts.map +1 -1
  229. package/dist/components/notification-center/notification-center.js +7 -4
  230. package/dist/components/number-input/index.d.ts +2 -2
  231. package/dist/components/number-input/index.d.ts.map +1 -1
  232. package/dist/components/number-input/index.js +1 -1
  233. package/dist/components/number-input/number-input.d.ts +11 -1
  234. package/dist/components/number-input/number-input.d.ts.map +1 -1
  235. package/dist/components/number-input/number-input.js +51 -9
  236. package/dist/components/pagination/index.d.ts +4 -4
  237. package/dist/components/pagination/index.d.ts.map +1 -1
  238. package/dist/components/pagination/index.js +2 -2
  239. package/dist/components/pagination/pagination.d.ts +8 -2
  240. package/dist/components/pagination/pagination.d.ts.map +1 -1
  241. package/dist/components/pagination/pagination.js +12 -9
  242. package/dist/components/password-input/index.d.ts +4 -4
  243. package/dist/components/password-input/index.d.ts.map +1 -1
  244. package/dist/components/password-input/index.js +2 -2
  245. package/dist/components/password-input/password-input.d.ts +9 -2
  246. package/dist/components/password-input/password-input.d.ts.map +1 -1
  247. package/dist/components/password-input/password-input.js +4 -2
  248. package/dist/components/progress/index.d.ts +3 -3
  249. package/dist/components/progress/index.d.ts.map +1 -1
  250. package/dist/components/progress/index.js +1 -1
  251. package/dist/components/progress/progress.d.ts +5 -2
  252. package/dist/components/progress/progress.d.ts.map +1 -1
  253. package/dist/components/progress/progress.js +5 -3
  254. package/dist/components/qr-code/index.d.ts +2 -2
  255. package/dist/components/qr-code/index.d.ts.map +1 -1
  256. package/dist/components/qr-code/index.js +1 -1
  257. package/dist/components/qr-code/qr-code.d.ts +7 -1
  258. package/dist/components/qr-code/qr-code.d.ts.map +1 -1
  259. package/dist/components/qr-code/qr-code.js +5 -2
  260. package/dist/components/radio/index.d.ts +2 -2
  261. package/dist/components/radio/index.d.ts.map +1 -1
  262. package/dist/components/radio/index.js +1 -1
  263. package/dist/components/rating/index.d.ts +2 -2
  264. package/dist/components/rating/index.d.ts.map +1 -1
  265. package/dist/components/rating/index.js +1 -1
  266. package/dist/components/rating/rating.d.ts +7 -1
  267. package/dist/components/rating/rating.d.ts.map +1 -1
  268. package/dist/components/rating/rating.js +23 -2
  269. package/dist/components/relative-time/index.d.ts +2 -2
  270. package/dist/components/relative-time/index.d.ts.map +1 -1
  271. package/dist/components/relative-time/index.js +1 -1
  272. package/dist/components/reparent/index.d.ts +2 -2
  273. package/dist/components/reparent/index.d.ts.map +1 -1
  274. package/dist/components/reparent/index.js +1 -1
  275. package/dist/components/repeat/index.d.ts +1 -1
  276. package/dist/components/repeat/index.d.ts.map +1 -1
  277. package/dist/components/repeat/index.js +1 -1
  278. package/dist/components/scroll-progress/index.d.ts +2 -2
  279. package/dist/components/scroll-progress/index.d.ts.map +1 -1
  280. package/dist/components/scroll-progress/index.js +1 -1
  281. package/dist/components/scroll-shadow/index.d.ts +2 -2
  282. package/dist/components/scroll-shadow/index.d.ts.map +1 -1
  283. package/dist/components/scroll-shadow/index.js +1 -1
  284. package/dist/components/scroll-shadow/scroll-shadow.d.ts.map +1 -1
  285. package/dist/components/scroll-shadow/scroll-shadow.js +3 -1
  286. package/dist/components/scrollspy/index.d.ts +2 -2
  287. package/dist/components/scrollspy/index.d.ts.map +1 -1
  288. package/dist/components/scrollspy/index.js +1 -1
  289. package/dist/components/separator/index.d.ts +2 -2
  290. package/dist/components/separator/index.d.ts.map +1 -1
  291. package/dist/components/separator/index.js +1 -1
  292. package/dist/components/snippet/index.d.ts +2 -2
  293. package/dist/components/snippet/index.d.ts.map +1 -1
  294. package/dist/components/snippet/index.js +1 -1
  295. package/dist/components/snippet/snippet.d.ts +7 -1
  296. package/dist/components/snippet/snippet.d.ts.map +1 -1
  297. package/dist/components/snippet/snippet.js +6 -2
  298. package/dist/components/sortable/index.d.ts +2 -2
  299. package/dist/components/sortable/index.d.ts.map +1 -1
  300. package/dist/components/sortable/index.js +1 -1
  301. package/dist/components/spacer/index.d.ts +2 -2
  302. package/dist/components/spacer/index.d.ts.map +1 -1
  303. package/dist/components/spacer/index.js +1 -1
  304. package/dist/components/spinner/index.d.ts +3 -3
  305. package/dist/components/spinner/index.d.ts.map +1 -1
  306. package/dist/components/spinner/index.js +1 -1
  307. package/dist/components/spinner/spinner.d.ts +8 -2
  308. package/dist/components/spinner/spinner.d.ts.map +1 -1
  309. package/dist/components/spinner/spinner.js +6 -3
  310. package/dist/components/stepper/index.d.ts +2 -2
  311. package/dist/components/stepper/index.d.ts.map +1 -1
  312. package/dist/components/stepper/index.js +1 -1
  313. package/dist/components/submit-button/index.d.ts +2 -2
  314. package/dist/components/submit-button/index.d.ts.map +1 -1
  315. package/dist/components/submit-button/index.js +1 -1
  316. package/dist/components/submit-button/submit-button.d.ts +1 -1
  317. package/dist/components/submit-button/submit-button.d.ts.map +1 -1
  318. package/dist/components/submit-button/submit-button.js +1 -1
  319. package/dist/components/tags-input/index.d.ts +2 -2
  320. package/dist/components/tags-input/index.d.ts.map +1 -1
  321. package/dist/components/tags-input/index.js +1 -1
  322. package/dist/components/tags-input/tags-input.d.ts +14 -1
  323. package/dist/components/tags-input/tags-input.d.ts.map +1 -1
  324. package/dist/components/tags-input/tags-input.js +7 -4
  325. package/dist/components/theme-image/index.d.ts +3 -0
  326. package/dist/components/theme-image/index.d.ts.map +1 -0
  327. package/dist/components/theme-image/index.js +1 -0
  328. package/dist/components/theme-image/theme-image.d.ts +25 -0
  329. package/dist/components/theme-image/theme-image.d.ts.map +1 -0
  330. package/dist/components/theme-image/theme-image.js +19 -0
  331. package/dist/components/timeline/index.d.ts +2 -2
  332. package/dist/components/timeline/index.d.ts.map +1 -1
  333. package/dist/components/timeline/index.js +1 -1
  334. package/dist/components/toggle-switch/index.d.ts +3 -3
  335. package/dist/components/toggle-switch/index.d.ts.map +1 -1
  336. package/dist/components/toggle-switch/index.js +1 -1
  337. package/dist/components/toggle-switch/toggle-switch.d.ts +1 -1
  338. package/dist/components/toggle-switch/toggle-switch.d.ts.map +1 -1
  339. package/dist/components/toggle-switch/toggle-switch.js +1 -1
  340. package/dist/components/tree/index.d.ts +2 -2
  341. package/dist/components/tree/index.d.ts.map +1 -1
  342. package/dist/components/tree/index.js +1 -1
  343. package/dist/components/tree/tree.js +1 -1
  344. package/dist/globals.css +1267 -81
  345. package/dist/locale/UiLocaleProvider.d.ts +19 -0
  346. package/dist/locale/UiLocaleProvider.d.ts.map +1 -0
  347. package/dist/locale/UiLocaleProvider.js +17 -0
  348. package/dist/locale/index.d.ts +4 -0
  349. package/dist/locale/index.d.ts.map +1 -0
  350. package/dist/locale/index.js +3 -0
  351. package/dist/locale/locale.d.ts +15 -0
  352. package/dist/locale/locale.d.ts.map +1 -0
  353. package/dist/locale/locale.js +19 -0
  354. package/dist/locale/messages.d.ts +98 -0
  355. package/dist/locale/messages.d.ts.map +1 -0
  356. package/dist/locale/messages.js +99 -0
  357. package/package.json +31 -15
package/README.md CHANGED
@@ -17,6 +17,7 @@ so you don't have to wire the same recipe from scratch in every project.
17
17
  - [Why forth-ui](#why-forth-ui)
18
18
  - [Installation](#installation)
19
19
  - [Usage](#usage)
20
+ - [Language](#language)
20
21
  - [Components](#components)
21
22
  - [Conventions](#conventions)
22
23
  - [Theming](#theming)
@@ -60,6 +61,12 @@ Import the compiled stylesheet once, alongside your component imports:
60
61
  import "@forthtilliath/forth-ui/styles/globals.css";
61
62
  ```
62
63
 
64
+ It covers forth-ui's components and the shadcn-ui ones they're built on
65
+ (Dialog, Popover…) — not every shadcn-ui component. If your app also uses
66
+ others directly (Sidebar, Table…), or has its own Tailwind build anyway,
67
+ use the [Theming](#theming) setup instead: your Tailwind then scans both
68
+ packages.
69
+
63
70
  ### As a workspace package (this monorepo)
64
71
 
65
72
  Within this monorepo, `forth-ui` is consumed the same way, just via the
@@ -131,6 +138,28 @@ function Example() {
131
138
  }
132
139
  ```
133
140
 
141
+ ## Language
142
+
143
+ Built-in labels (`aria-label`s, default placeholders, empty states, the
144
+ Pagination and ConfirmDialog buttons…) are available in **French** (the
145
+ default) and **English**. For a bilingual site, set the language once with
146
+ `UiLocaleProvider`; a component's own `locale` prop wins over it, and its
147
+ text props (`placeholder`, `emptyMessage`, `ariaLabel`, a ConfirmDialog's
148
+ `cancelLabel`…) still override individual strings.
149
+
150
+ ```tsx
151
+ import { UiLocaleProvider } from "@forthtilliath/forth-ui/locale";
152
+
153
+ <UiLocaleProvider locale={lang /* "fr" | "en" */}>{children}</UiLocaleProvider>;
154
+
155
+ // or per component:
156
+ <Spinner locale="en" />;
157
+ ```
158
+
159
+ `UI_MESSAGES` (same entry point) holds every label, grouped by component.
160
+ Components rendered from shadcn-ui as-is (e.g. a Dialog's close button) keep
161
+ shadcn's English text.
162
+
134
163
  ## Components
135
164
 
136
165
  Grouped the same way as the Storybook sidebar (`forth-ui/<Category>/...`).
@@ -164,10 +193,11 @@ Grouped the same way as the Storybook sidebar (`forth-ui/<Category>/...`).
164
193
 
165
194
  ### Buttons & Actions
166
195
 
167
- | Component | Import | Description |
168
- | ----------------------- | ------------------- | ------------------------------------------------------------------------------ |
169
- | `Button`, `ButtonGroup` | `components/button` | A button, or a component that looks like one, plus joined button rows/columns. |
170
- | `Chip` | `components/chip` | A compact, interactive element for status, categories, or filters. |
196
+ | Component | Import | Description |
197
+ | ----------------------------- | ------------------------ | ------------------------------------------------------------------------------- |
198
+ | `Button`, `ButtonGroup` | `components/button` | A button, or a component that looks like one, plus joined button rows/columns. |
199
+ | `Chip` | `components/chip` | A compact, interactive element for status, categories, or filters. |
200
+ | `ModeToggle`, `ThemeProvider` | `components/mode-toggle` | A light / dark / system theme switcher (needs the optional `next-themes` peer). |
171
201
 
172
202
  ### Forms
173
203
 
@@ -208,6 +238,7 @@ Grouped the same way as the Storybook sidebar (`forth-ui/<Category>/...`).
208
238
  | ---------------- | ---------------------------- | ----------------------------------------------------------------------------------- |
209
239
  | `CommandPalette` | `components/command-palette` | A global command menu (Cmd/Ctrl+K to open). |
210
240
  | `useConfirm` | `components/confirm-dialog` | An imperative `await confirm({...})` alternative to hand-wiring an `AlertDialog`. |
241
+ | `CopyMenuItem` | `components/copy-menu-item` | A `DropdownMenuItem` that copies a value and briefly shows a checkmark. |
211
242
  | `Dropdrawer` | `components/dropdrawer` | A menu that renders as a `DropdownMenu` on desktop and a bottom `Drawer` on mobile. |
212
243
 
213
244
  ### Data Display
@@ -224,6 +255,7 @@ Grouped the same way as the Storybook sidebar (`forth-ui/<Category>/...`).
224
255
  | `QrCode` | `components/qr-code` | Generates a QR code from a string, rendered as inline SVG. |
225
256
  | `RelativeTime` | `components/relative-time` | Displays a live-updating time, defaulting to the local timezone. |
226
257
  | `Sortable` | `components/sortable` | A drag-to-reorder list built on native HTML5 drag events. |
258
+ | `ThemeImage` | `components/theme-image` | An image with a light and a dark version (`as={Image}` for Next.js). |
227
259
  | `Timeline` | `components/timeline` | A vertical sequence of dated events, connected by a line. |
228
260
  | `Tree` | `components/tree` | A hierarchical, expandable/collapsible list of nodes. |
229
261
 
@@ -294,25 +326,46 @@ Tailwind v4 expects any npm-distributed component library to be consumed.
294
326
 
295
327
  ### Available themes
296
328
 
297
- 11 [tweakcn](https://tweakcn.com)-generated themes ship under
329
+ 19 themes ship under
298
330
  `@forthtilliath/shadcn-ui/styles/themes/`, all rendered here with the same
299
- components:
300
-
301
- | `default` | `blue` | `bubblegum` |
302
- | ------------------------------------------- | ------------------------------------- | ----------------------------------------------- |
303
- | ![default theme](./docs/themes/default.png) | ![blue theme](./docs/themes/blue.png) | ![bubblegum theme](./docs/themes/bubblegum.png) |
304
-
305
- | `claymorphism` | `green` | `orange` |
306
- | ----------------------------------------------------- | --------------------------------------- | ----------------------------------------- |
307
- | ![claymorphism theme](./docs/themes/claymorphism.png) | ![green theme](./docs/themes/green.png) | ![orange theme](./docs/themes/orange.png) |
308
-
309
- | `red` | `rose` | `twitter` |
310
- | ----------------------------------- | ------------------------------------- | ------------------------------------------- |
311
- | ![red theme](./docs/themes/red.png) | ![rose theme](./docs/themes/rose.png) | ![twitter theme](./docs/themes/twitter.png) |
312
-
313
- | `violet` | `yellow` |
314
- | ----------------------------------------- | ----------------------------------------- |
315
- | ![violet theme](./docs/themes/violet.png) | ![yellow theme](./docs/themes/yellow.png) |
331
+ components (light and dark mode).
332
+
333
+ The first 11 are [tweakcn](https://tweakcn.com)-generated — most of them only
334
+ change the colors:
335
+
336
+ | Theme | Style | Light | Dark |
337
+ | -------------- | -------------------------------------------------------------- | ------------------------------------------------------------ | ---------------------------------------------------------------- |
338
+ | `default` | shadcn's neutral default: black on white, grey accents. | ![default theme, light](./docs/themes/default.png) | ![default theme, dark](./docs/themes/default-dark.png) |
339
+ | `blue` | The default look with a blue primary. | ![blue theme, light](./docs/themes/blue.png) | ![blue theme, dark](./docs/themes/blue-dark.png) |
340
+ | `bubblegum` | Candy pink and pastels, Poppins, hard offset shadows. | ![bubblegum theme, light](./docs/themes/bubblegum.png) | ![bubblegum theme, dark](./docs/themes/bubblegum-dark.png) |
341
+ | `claymorphism` | Soft clay: warm greys and indigo, very round, pillowy shadows. | ![claymorphism theme, light](./docs/themes/claymorphism.png) | ![claymorphism theme, dark](./docs/themes/claymorphism-dark.png) |
342
+ | `green` | The default look with a green primary. | ![green theme, light](./docs/themes/green.png) | ![green theme, dark](./docs/themes/green-dark.png) |
343
+ | `orange` | The default look with an orange primary. | ![orange theme, light](./docs/themes/orange.png) | ![orange theme, dark](./docs/themes/orange-dark.png) |
344
+ | `red` | The default look with a red primary. | ![red theme, light](./docs/themes/red.png) | ![red theme, dark](./docs/themes/red-dark.png) |
345
+ | `rose` | The default look with a rose primary. | ![rose theme, light](./docs/themes/rose.png) | ![rose theme, dark](./docs/themes/rose-dark.png) |
346
+ | `twitter` | Twitter blue, Open Sans, very round corners. | ![twitter theme, light](./docs/themes/twitter.png) | ![twitter theme, dark](./docs/themes/twitter-dark.png) |
347
+ | `violet` | The default look with a violet primary. | ![violet theme, light](./docs/themes/violet.png) | ![violet theme, dark](./docs/themes/violet-dark.png) |
348
+ | `yellow` | The default look with a yellow primary. | ![yellow theme, light](./docs/themes/yellow.png) | ![yellow theme, dark](./docs/themes/yellow-dark.png) |
349
+
350
+ The other 8 go further: besides fonts, radius and shadows, each
351
+ adds **signature effects** — plain CSS rules on shadcn-ui's `data-slot`
352
+ attributes (pixel frames, scanlines, frosted glass, hand-drawn outlines…),
353
+ active only while the theme is imported. The components themselves are
354
+ untouched, and focus stays visible (a theme restyling a button's shadow
355
+ gets an outline instead). Their fonts fall back to system stacks; load the
356
+ fonts named at the top of each file (Google Fonts, `next/font`…) for the
357
+ full look.
358
+
359
+ | Theme | Style | Light | Dark |
360
+ | ----------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------ | ---------------------------------------------------------- |
361
+ | `brutalist` | Neo-brutalism: thick black outlines, hard offset shadows, buttons that press in, dotted paper. | ![brutalist theme, light](./docs/themes/brutalist.png) | ![brutalist theme, dark](./docs/themes/brutalist-dark.png) |
362
+ | `pixel` | 8-bit: notched pixel frames, pixel type, checkerboard — Game Boy greens (light), PICO-8 night (dark). | ![pixel theme, light](./docs/themes/pixel.png) | ![pixel theme, dark](./docs/themes/pixel-dark.png) |
363
+ | `crt` | CRT monitor: amber phosphor, scanlines and vignette, glowing text, blinking cursor. | ![crt theme, light](./docs/themes/crt.png) | ![crt theme, dark](./docs/themes/crt-dark.png) |
364
+ | `synthwave` | Synthwave: sunset sky over a perspective grid, chrome titles, neon gradient buttons. | ![synthwave theme, light](./docs/themes/synthwave.png) | ![synthwave theme, dark](./docs/themes/synthwave-dark.png) |
365
+ | `glass` | Glassmorphism: frosted translucent surfaces floating over a colorful gradient mesh. | ![glass theme, light](./docs/themes/glass.png) | ![glass theme, dark](./docs/themes/glass-dark.png) |
366
+ | `sketch` | Hand-drawn: wobbly inked outlines and handwriting — lined notebook (light), chalkboard (dark). | ![sketch theme, light](./docs/themes/sketch.png) | ![sketch theme, dark](./docs/themes/sketch-dark.png) |
367
+ | `newspaper` | Newspaper: newsprint and ink, Didone headlines over double rules, halftone dots, small caps. | ![newspaper theme, light](./docs/themes/newspaper.png) | ![newspaper theme, dark](./docs/themes/newspaper-dark.png) |
368
+ | `memphis` | Memphis pop: confetti pattern, asymmetric corners, squiggly underlined titles, colored hard shadows. | ![memphis theme, light](./docs/themes/memphis.png) | ![memphis theme, dark](./docs/themes/memphis-dark.png) |
316
369
 
317
370
  ## Development
318
371
 
@@ -1,3 +1,3 @@
1
- import type { AccordionProps } from "./types";
1
+ import type { AccordionProps } from "./types.js";
2
2
  export declare function Items({ hideChevron, chevronAlignment, customChevron, items, icon, classNameItem, classNameTrigger, classNameContent, variant, size, generateId, }: Omit<AccordionProps, "multiple" | "className">): import("react").JSX.Element[];
3
3
  //# sourceMappingURL=accordion-items.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"accordion-items.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/accordion-items.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAO9C,wBAAgB,KAAK,CAAC,EACpB,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,KAAK,EACL,IAAI,EACJ,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,OAAO,EACP,IAAI,EACJ,UAA+C,GAChD,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,GAAG,WAAW,CAAC,iCAuEhD"}
1
+ {"version":3,"file":"accordion-items.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/accordion-items.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAOjD,wBAAgB,KAAK,CAAC,EACpB,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,KAAK,EACL,IAAI,EACJ,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,OAAO,EACP,IAAI,EACJ,UAA+C,GAChD,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,GAAG,WAAW,CAAC,iCAuEhD"}
@@ -1,7 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { AccordionContent, AccordionItem, AccordionTrigger, } from "@forthtilliath/shadcn-ui/components/accordion";
2
+ import { AccordionContent, AccordionItem, } from "@forthtilliath/shadcn-ui/components/accordion";
3
3
  import { cn } from "@forthtilliath/shadcn-ui/lib/utils";
4
- import { accordionContentVariants, accordionItemVariants, accordionTriggerVariants, } from "./variants";
4
+ import { AccordionTrigger } from "./accordion-trigger.js";
5
+ import { accordionContentVariants, accordionItemVariants, accordionTriggerVariants, } from "./variants.js";
5
6
  export function Items({ hideChevron, chevronAlignment, customChevron, items, icon, classNameItem, classNameTrigger, classNameContent, variant, size, generateId = (index) => `item-${String(index)}`, }) {
6
7
  return items.map(({ title, subtitle, content, disabled, ...props }, index) => {
7
8
  let iconItem = icon;
@@ -1,3 +1,3 @@
1
- import type { MultipleProps } from "./types";
1
+ import type { MultipleProps } from "./types.js";
2
2
  export declare function AccordionMultiple({ className, variant, size, hideChevron, chevronAlignment, customChevron, items, icon, classNameItem, classNameTrigger, classNameContent, generateId, ...props }: MultipleProps): import("react").JSX.Element;
3
3
  //# sourceMappingURL=accordion-multiple.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"accordion-multiple.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/accordion-multiple.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAG7C,wBAAgB,iBAAiB,CAAC,EAChC,SAAS,EACT,OAAO,EACP,IAAI,EACJ,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,KAAK,EACL,IAAI,EACJ,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,GAAG,KAAK,EACT,EAAE,aAAa,+BAsBf"}
1
+ {"version":3,"file":"accordion-multiple.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/accordion-multiple.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,wBAAgB,iBAAiB,CAAC,EAChC,SAAS,EACT,OAAO,EACP,IAAI,EACJ,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,KAAK,EACL,IAAI,EACJ,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,GAAG,KAAK,EACT,EAAE,aAAa,+BAsBf"}
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { Accordion as AccordionPrimitive } from "@forthtilliath/shadcn-ui/components/accordion";
3
3
  import { cn } from "@forthtilliath/shadcn-ui/lib/utils";
4
- import { Items } from "./accordion-items";
5
- import { accordionRootVariants } from "./variants";
4
+ import { Items } from "./accordion-items.js";
5
+ import { accordionRootVariants } from "./variants.js";
6
6
  export function AccordionMultiple({ className, variant, size, hideChevron, chevronAlignment, customChevron, items, icon, classNameItem, classNameTrigger, classNameContent, generateId, ...props }) {
7
7
  return (_jsx(AccordionPrimitive, { type: "multiple", className: cn(accordionRootVariants({ variant, size }), className), ...props, children: _jsx(Items, { variant: variant, size: size, hideChevron: hideChevron, chevronAlignment: chevronAlignment, customChevron: customChevron, items: items, icon: icon, classNameItem: classNameItem, classNameTrigger: classNameTrigger, classNameContent: classNameContent, generateId: generateId }) }));
8
8
  }
@@ -1,3 +1,3 @@
1
- import type { SingleProps } from "./types";
1
+ import type { SingleProps } from "./types.js";
2
2
  export declare function AccordionSingle({ className, variant, size, hideChevron, chevronAlignment, customChevron, items, icon, classNameItem, classNameTrigger, classNameContent, generateId, ...props }: SingleProps): import("react").JSX.Element;
3
3
  //# sourceMappingURL=accordion-single.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"accordion-single.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/accordion-single.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,OAAO,EACP,IAAI,EACJ,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,KAAK,EACL,IAAI,EACJ,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,GAAG,KAAK,EACT,EAAE,WAAW,+BAsBb"}
1
+ {"version":3,"file":"accordion-single.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/accordion-single.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,OAAO,EACP,IAAI,EACJ,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,KAAK,EACL,IAAI,EACJ,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,GAAG,KAAK,EACT,EAAE,WAAW,+BAsBb"}
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { Accordion as AccordionPrimitive } from "@forthtilliath/shadcn-ui/components/accordion";
3
3
  import { cn } from "@forthtilliath/shadcn-ui/lib/utils";
4
- import { Items } from "./accordion-items";
5
- import { accordionRootVariants } from "./variants";
4
+ import { Items } from "./accordion-items.js";
5
+ import { accordionRootVariants } from "./variants.js";
6
6
  export function AccordionSingle({ className, variant, size, hideChevron, chevronAlignment, customChevron, items, icon, classNameItem, classNameTrigger, classNameContent, generateId, ...props }) {
7
7
  return (_jsx(AccordionPrimitive, { type: "single", className: cn(accordionRootVariants({ variant, size }), className), ...props, children: _jsx(Items, { variant: variant, size: size, hideChevron: hideChevron, chevronAlignment: chevronAlignment, customChevron: customChevron, items: items, icon: icon, classNameItem: classNameItem, classNameTrigger: classNameTrigger, classNameContent: classNameContent, generateId: generateId }) }));
8
8
  }
@@ -0,0 +1,15 @@
1
+ import * as React from "react";
2
+ import * as AccordionPrimitive from "@radix-ui/react-accordion";
3
+ import type { LucideProps } from "lucide-react";
4
+ export type AccordionTriggerProps = React.ComponentProps<typeof AccordionPrimitive.Trigger> & {
5
+ hideChevron?: boolean;
6
+ customChevron?: React.ReactElement<LucideProps>;
7
+ };
8
+ /**
9
+ * shadcn-ui's `AccordionTrigger` markup, plus `hideChevron` / `customChevron`
10
+ * — built here on the Radix primitive rather than relying on a customized
11
+ * shadcn copy, so forth-ui also works with the upstream shadcn `accordion`
12
+ * (e.g. installed through the registry).
13
+ */
14
+ export declare function AccordionTrigger({ className, hideChevron, customChevron, children, ...props }: AccordionTriggerProps): React.JSX.Element;
15
+ //# sourceMappingURL=accordion-trigger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accordion-trigger.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/accordion-trigger.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,kBAAkB,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAKhD,MAAM,MAAM,qBAAqB,GAAG,KAAK,CAAC,cAAc,CACtD,OAAO,kBAAkB,CAAC,OAAO,CAClC,GAAG;IACF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;CACjD,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,WAAmB,EACnB,aAAa,EACb,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,qBAAqB,qBAkCvB"}
@@ -0,0 +1,25 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import * as AccordionPrimitive from "@radix-ui/react-accordion";
5
+ import { ChevronDownIcon } from "lucide-react";
6
+ import { cn } from "@forthtilliath/shadcn-ui/lib/utils";
7
+ /**
8
+ * shadcn-ui's `AccordionTrigger` markup, plus `hideChevron` / `customChevron`
9
+ * — built here on the Radix primitive rather than relying on a customized
10
+ * shadcn copy, so forth-ui also works with the upstream shadcn `accordion`
11
+ * (e.g. installed through the registry).
12
+ */
13
+ export function AccordionTrigger({ className, hideChevron = false, customChevron, children, ...props }) {
14
+ const chevronClassName = cn("text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200", customChevron?.props.className);
15
+ let chevron = null;
16
+ if (!hideChevron) {
17
+ chevron = customChevron ? (
18
+ // cloneElement (not `Slot`) so the merged className goes through
19
+ // `cn()`'s tailwind-merge dedup, and the icon stays the trigger's
20
+ // direct child for the `>svg` selector below.
21
+ // eslint-disable-next-line @eslint-react/no-clone-element
22
+ React.cloneElement(customChevron, { className: chevronClassName })) : (_jsx(ChevronDownIcon, { className: chevronClassName }));
23
+ }
24
+ return (_jsx(AccordionPrimitive.Header, { className: "flex", children: _jsxs(AccordionPrimitive.Trigger, { "data-slot": "accordion-trigger", className: cn("focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180", className), ...props, children: [children, chevron] }) }));
25
+ }
@@ -1,4 +1,4 @@
1
- import type { AccordionProps } from "./types";
1
+ import type { AccordionProps } from "./types.js";
2
2
  /**
3
3
  * A vertically stacked set of interactive headings that each reveal a section of content.
4
4
  *
@@ -1 +1 @@
1
- {"version":3,"file":"accordion.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/accordion.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAA8B,MAAM,SAAS,CAAC;AAE1E;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,+BAU/D"}
1
+ {"version":3,"file":"accordion.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/accordion.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAA8B,MAAM,YAAY,CAAC;AAE7E;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,+BAU/D"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { AccordionMultiple } from "./accordion-multiple";
3
- import { AccordionSingle } from "./accordion-single";
2
+ import { AccordionMultiple } from "./accordion-multiple.js";
3
+ import { AccordionSingle } from "./accordion-single.js";
4
4
  /**
5
5
  * A vertically stacked set of interactive headings that each reveal a section of content.
6
6
  *
@@ -1,2 +1,2 @@
1
- export { Accordion } from "./accordion";
1
+ export { Accordion } from "./accordion.js";
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
@@ -1 +1 @@
1
- export { Accordion } from "./accordion";
1
+ export { Accordion } from "./accordion.js";
@@ -1,7 +1,7 @@
1
1
  import type React from "react";
2
2
  import { type AccordionMultipleProps, type AccordionSingleProps } from "@radix-ui/react-accordion";
3
3
  import type { LucideProps } from "lucide-react";
4
- import type { AccordionTriggerVariants } from "./variants";
4
+ import type { AccordionTriggerVariants } from "./variants.js";
5
5
  type AccordionVariantType = "default" | "outline" | "box" | "contained" | "box-contained" | "tabs" | "highlight-active";
6
6
  type AccordionSizeType = "sm" | "default" | "lg";
7
7
  interface Item {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EAC1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE3D,KAAK,oBAAoB,GACrB,SAAS,GACT,SAAS,GACT,KAAK,GACL,WAAW,GACX,eAAe,GACf,MAAM,GACN,kBAAkB,CAAC;AAEvB,KAAK,iBAAiB,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;AAEjD,UAAU,IAAI;IACZ,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,YAAa,SAAQ,IAAI;IACjC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;CACvB;AAED,UAAU,SAAS;IACjB;;OAEG;IACH,KAAK,EAAE,IAAI,EAAE,GAAG,YAAY,EAAE,CAAC;IAC/B;;;;OAIG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,wBAAwB,CAAC,kBAAkB,CAAC,CAAC;IAChE;;OAEG;IACH,aAAa,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IAChD;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B;;;OAGG;IACH,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACxC;AAED,KAAK,YAAY,GAAG,MAAM,GAAG,cAAc,GAAG,aAAa,CAAC;AAC5D,MAAM,MAAM,WAAW,GAAG,SAAS,GACjC,IAAI,CAAC,oBAAoB,EAAE,YAAY,CAAC,GAAG;IACzC;;;OAGG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,gCAAgC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AACJ,MAAM,MAAM,aAAa,GAAG,SAAS,GACnC,IAAI,CAAC,sBAAsB,EAAE,YAAY,CAAC,GAAG;IAC3C,QAAQ,EAAE,IAAI,CAAC;IACf,iCAAiC;IACjC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;;OAGG;IACH,WAAW,CAAC,EAAE,IAAI,CAAC;CACpB,CAAC;AAEJ,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,aAAa,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EAC1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAE9D,KAAK,oBAAoB,GACrB,SAAS,GACT,SAAS,GACT,KAAK,GACL,WAAW,GACX,eAAe,GACf,MAAM,GACN,kBAAkB,CAAC;AAEvB,KAAK,iBAAiB,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;AAEjD,UAAU,IAAI;IACZ,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,YAAa,SAAQ,IAAI;IACjC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;CACvB;AAED,UAAU,SAAS;IACjB;;OAEG;IACH,KAAK,EAAE,IAAI,EAAE,GAAG,YAAY,EAAE,CAAC;IAC/B;;;;OAIG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,wBAAwB,CAAC,kBAAkB,CAAC,CAAC;IAChE;;OAEG;IACH,aAAa,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IAChD;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B;;;OAGG;IACH,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACxC;AAED,KAAK,YAAY,GAAG,MAAM,GAAG,cAAc,GAAG,aAAa,CAAC;AAC5D,MAAM,MAAM,WAAW,GAAG,SAAS,GACjC,IAAI,CAAC,oBAAoB,EAAE,YAAY,CAAC,GAAG;IACzC;;;OAGG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,gCAAgC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AACJ,MAAM,MAAM,aAAa,GAAG,SAAS,GACnC,IAAI,CAAC,sBAAsB,EAAE,YAAY,CAAC,GAAG;IAC3C,QAAQ,EAAE,IAAI,CAAC;IACf,iCAAiC;IACjC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;;OAGG;IACH,WAAW,CAAC,EAAE,IAAI,CAAC;CACpB,CAAC;AAEJ,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,aAAa,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import * as React from "react";
2
- import type { AlertVariants } from "./variants";
2
+ import { type UiLocale } from "../../locale/locale.js";
3
+ import type { AlertVariants } from "./variants.js";
3
4
  export type AlertProps = React.ComponentProps<"div"> & AlertVariants & {
4
5
  /**
5
6
  * Shows a close button. Uncontrolled by default (the alert hides itself
@@ -20,6 +21,11 @@ export type AlertProps = React.ComponentProps<"div"> & AlertVariants & {
20
21
  * close button when `dismissible` is also set.
21
22
  */
22
23
  action?: React.ReactNode;
24
+ /**
25
+ * Language of the built-in labels — French by default, or the nearest
26
+ * `UiLocaleProvider`'s. Explicit text props still win.
27
+ */
28
+ locale?: UiLocale;
23
29
  };
24
30
  /**
25
31
  * Displays a callout for user attention.
@@ -34,5 +40,5 @@ export type AlertProps = React.ComponentProps<"div"> & AlertVariants & {
34
40
  * @author Forth
35
41
  * @copyright 2026 Forth
36
42
  */
37
- export declare function Alert({ className, variant, look, size, dismissible, open, onOpenChange, action, children, ...props }: AlertProps): React.JSX.Element | null;
43
+ export declare function Alert({ className, variant, look, size, dismissible, open, onOpenChange, action, children, locale, ...props }: AlertProps): React.JSX.Element | null;
38
44
  //# sourceMappingURL=alert.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"alert.d.ts","sourceRoot":"","sources":["../../../src/components/alert/alert.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,MAAM,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAClD,aAAa,GAAG;IACd;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC;;;OAGG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B,CAAC;AAEJ;;;;;;;;;;;;GAYG;AACH,wBAAgB,KAAK,CAAC,EACpB,SAAS,EACT,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,WAAmB,EACnB,IAAI,EACJ,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,UAAU,4BA8CZ"}
1
+ {"version":3,"file":"alert.d.ts","sourceRoot":"","sources":["../../../src/components/alert/alert.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,OAAO,EAAE,KAAK,QAAQ,EAAiB,MAAM,wBAAwB,CAAC;AAEtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,MAAM,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAClD,aAAa,GAAG;IACd;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC;;;OAGG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB;;;OAGG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB,CAAC;AAEJ;;;;;;;;;;;;GAYG;AACH,wBAAgB,KAAK,CAAC,EACpB,SAAS,EACT,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,WAAmB,EACnB,IAAI,EACJ,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,MAAM,EACN,GAAG,KAAK,EACT,EAAE,UAAU,4BA+CZ"}
@@ -3,7 +3,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
4
  import { X } from "lucide-react";
5
5
  import { cn } from "@forthtilliath/shadcn-ui/lib/utils";
6
- import { alertVariants } from "./variants";
6
+ import { useUiMessages } from "../../locale/locale.js";
7
+ import { alertVariants } from "./variants.js";
7
8
  /**
8
9
  * Displays a callout for user attention.
9
10
  *
@@ -17,7 +18,8 @@ import { alertVariants } from "./variants";
17
18
  * @author Forth
18
19
  * @copyright 2026 Forth
19
20
  */
20
- export function Alert({ className, variant, look, size, dismissible = false, open, onOpenChange, action, children, ...props }) {
21
+ export function Alert({ className, variant, look, size, dismissible = false, open, onOpenChange, action, children, locale, ...props }) {
22
+ const messages = useUiMessages(locale);
21
23
  const [uncontrolledOpen, setUncontrolledOpen] = React.useState(true);
22
24
  const isOpen = open ?? uncontrolledOpen;
23
25
  const hasActions = Boolean(action) || dismissible;
@@ -28,5 +30,5 @@ export function Alert({ className, variant, look, size, dismissible = false, ope
28
30
  if (!isOpen) {
29
31
  return null;
30
32
  }
31
- return (_jsxs("div", { "data-slot": "alert", role: "alert", className: cn(alertVariants({ variant, look, size }), hasActions && "pr-10", className), ...props, children: [children, hasActions && (_jsxs("div", { "data-slot": "alert-actions", className: "absolute top-2.5 right-2.5 flex items-center gap-1.5", children: [action, dismissible && (_jsx("button", { type: "button", onClick: handleDismiss, "aria-label": "Dismiss", className: "rounded-sm opacity-70 transition-opacity outline-none hover:opacity-100 focus-visible:ring-2 focus-visible:ring-current", children: _jsx(X, { className: "size-3.5" }) }))] }))] }));
33
+ return (_jsxs("div", { "data-slot": "alert", role: "alert", className: cn(alertVariants({ variant, look, size }), hasActions && "pr-10", className), ...props, children: [children, hasActions && (_jsxs("div", { "data-slot": "alert-actions", className: "absolute top-2.5 right-2.5 flex items-center gap-1.5", children: [action, dismissible && (_jsx("button", { type: "button", onClick: handleDismiss, "aria-label": messages.dismiss, className: "rounded-sm opacity-70 transition-opacity outline-none hover:opacity-100 focus-visible:ring-2 focus-visible:ring-current", children: _jsx(X, { className: "size-3.5" }) }))] }))] }));
32
34
  }
@@ -1,5 +1,5 @@
1
- export type { AlertProps } from "./alert";
2
- export { Alert } from "./alert";
3
- export type { AlertVariants } from "./variants";
1
+ export type { AlertProps } from "./alert.js";
2
+ export { Alert } from "./alert.js";
3
+ export type { AlertVariants } from "./variants.js";
4
4
  export { AlertDescription, AlertTitle, } from "@forthtilliath/shadcn-ui/components/alert";
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/alert/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD,OAAO,EACL,gBAAgB,EAChB,UAAU,GACX,MAAM,2CAA2C,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/alert/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAInD,OAAO,EACL,gBAAgB,EAChB,UAAU,GACX,MAAM,2CAA2C,CAAC"}
@@ -1,4 +1,4 @@
1
- export { Alert } from "./alert";
1
+ export { Alert } from "./alert.js";
2
2
  // Title/description need no forth-ui-specific behavior on top of shadcn-ui's
3
3
  // — re-exported here so consumers only need one import path.
4
4
  export { AlertDescription, AlertTitle, } from "@forthtilliath/shadcn-ui/components/alert";
@@ -1 +1 @@
1
- {"version":3,"file":"variants.d.ts","sourceRoot":"","sources":["../../../src/components/alert/variants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAK7D,eAAO,MAAM,aAAa;;;;8EAsHzB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC"}
1
+ {"version":3,"file":"variants.d.ts","sourceRoot":"","sources":["../../../src/components/alert/variants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAK7D,eAAO,MAAM,aAAa;;;;8EA6HzB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC"}
@@ -28,6 +28,13 @@ export const alertVariants = cva("relative grid w-full grid-cols-[0_1fr] items-s
28
28
  size: "default",
29
29
  },
30
30
  compoundVariants: [
31
+ { variant: "default", look: "outline", className: "bg-card" },
32
+ // shadcn's AlertDescription is muted-foreground (grey), unreadable on a
33
+ // colored background: colored alerts give it their own text color.
34
+ {
35
+ variant: ["primary", "success", "warning", "info", "destructive"],
36
+ className: "*:data-[slot=alert-description]:text-current",
37
+ },
31
38
  // default (neutral) ignores `look` — none of the reference sources
32
39
  // show a "solid neutral" or "outline neutral" alert, only colored
33
40
  // ones vary by look.
@@ -49,7 +56,7 @@ export const alertVariants = cva("relative grid w-full grid-cols-[0_1fr] items-s
49
56
  {
50
57
  variant: "success",
51
58
  look: "solid",
52
- className: "bg-green-600 text-white border-transparent",
59
+ className: "bg-green-700 text-white border-transparent",
53
60
  },
54
61
  {
55
62
  variant: "success",
@@ -64,7 +71,7 @@ export const alertVariants = cva("relative grid w-full grid-cols-[0_1fr] items-s
64
71
  {
65
72
  variant: "warning",
66
73
  look: "solid",
67
- className: "bg-amber-500 text-white border-transparent",
74
+ className: "bg-amber-500 text-amber-950 border-transparent",
68
75
  },
69
76
  {
70
77
  variant: "warning",
@@ -79,7 +86,7 @@ export const alertVariants = cva("relative grid w-full grid-cols-[0_1fr] items-s
79
86
  {
80
87
  variant: "info",
81
88
  look: "solid",
82
- className: "bg-sky-600 text-white border-transparent",
89
+ className: "bg-sky-700 text-white border-transparent",
83
90
  },
84
91
  {
85
92
  variant: "info",
@@ -99,7 +106,7 @@ export const alertVariants = cva("relative grid w-full grid-cols-[0_1fr] items-s
99
106
  {
100
107
  variant: "destructive",
101
108
  look: "soft",
102
- className: "bg-destructive/10 text-destructive border-destructive/20 [&>svg]:text-destructive",
109
+ className: "bg-red-50 text-red-700 border-red-200 [&>svg]:text-red-600 dark:bg-red-950 dark:text-red-300 dark:border-red-900 dark:[&>svg]:text-red-400",
103
110
  },
104
111
  {
105
112
  variant: "destructive",
@@ -1,5 +1,5 @@
1
1
  import type { JSX } from "react";
2
- import type { AvatarProps } from "./avatar";
2
+ import type { AvatarProps } from "./avatar.js";
3
3
  export type AvatarGroupProps = React.ComponentProps<"div"> & {
4
4
  avatars: AvatarProps[];
5
5
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"avatar-group.d.ts","sourceRoot":"","sources":["../../../src/components/avatar/avatar-group.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAIjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAG5C,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC3D,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAIF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,OAAO,EACP,GAAG,EACH,GAAG,KAAK,EACT,EAAE,gBAAgB,GAAG,GAAG,CAAC,OAAO,CA6BhC"}
1
+ {"version":3,"file":"avatar-group.d.ts","sourceRoot":"","sources":["../../../src/components/avatar/avatar-group.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAIjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC3D,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAIF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,OAAO,EACP,GAAG,EACH,GAAG,KAAK,EACT,EAAE,gBAAgB,GAAG,GAAG,CAAC,OAAO,CA6BhC"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { cn } from "@forthtilliath/shadcn-ui/lib/utils";
3
- import { Avatar } from "./avatar";
3
+ import { Avatar } from "./avatar.js";
4
4
  const RING_CLASS = "ring-2 ring-background hover:z-10";
5
5
  /**
6
6
  * A component to group multiple avatars together.
@@ -1,7 +1,8 @@
1
1
  import type React from "react";
2
2
  import { Avatar as AvatarPrimitive } from "@forthtilliath/shadcn-ui/components/avatar";
3
- import type { Shape, Size } from "./constants";
4
- import type { BadgeVariants, FallbackVariants, StatusVariants } from "./variants";
3
+ import { type UiLocale } from "../../locale/locale.js";
4
+ import type { Shape, Size } from "./constants.js";
5
+ import type { BadgeVariants, FallbackVariants, StatusVariants } from "./variants.js";
5
6
  export type AvatarProps = Omit<React.ComponentProps<typeof AvatarPrimitive>, "className" | "size"> & {
6
7
  /**
7
8
  * The source URL of the image.
@@ -89,6 +90,11 @@ export type AvatarProps = Omit<React.ComponentProps<typeof AvatarPrimitive>, "cl
89
90
  * - `tooltipContent` is the tooltip content element.
90
91
  */
91
92
  className?: Partial<Record<"root" | "image" | "fallback" | "status" | "badge" | "tooltipTrigger" | "tooltipContent", string>>;
93
+ /**
94
+ * Language of the built-in labels — French by default, or the nearest
95
+ * `UiLocaleProvider`'s. Explicit text props still win.
96
+ */
97
+ locale?: UiLocale;
92
98
  };
93
99
  /**
94
100
  * An image element with a fallback for representing the user.
@@ -103,5 +109,5 @@ export type AvatarProps = Omit<React.ComponentProps<typeof AvatarPrimitive>, "cl
103
109
  * @author Forth
104
110
  * @copyright 2025 Forth
105
111
  */
106
- export declare function Avatar({ src, alt, fallback, fallbackVariant, shape, size, ring, status, position, badge, badgeVariant, badgePosition, className, renderTooltip, ...props }: AvatarProps): React.JSX.Element;
112
+ export declare function Avatar({ src, alt, fallback, fallbackVariant, shape, size, ring, status, position, badge, badgeVariant, badgePosition, className, renderTooltip, locale, ...props }: AvatarProps): React.JSX.Element;
107
113
  //# sourceMappingURL=avatar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../../src/components/avatar/avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EACL,MAAM,IAAI,eAAe,EAG1B,MAAM,4CAA4C,CAAC;AAQpD,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,cAAc,EACf,MAAM,YAAY,CAAC;AASpB,MAAM,MAAM,WAAW,GAAG,IAAI,CAC5B,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,EAC5C,WAAW,GAAG,MAAM,CACrB,GAAG;IACF;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;;;;;OAUG;IACH,eAAe,CAAC,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IACtD;;OAEG;IACH,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;OAEG;IACH,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClC;;OAEG;IACH,QAAQ,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACtC;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB;;OAEG;IACH,YAAY,CAAC,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IAC7C;;;OAGG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC1C;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IAEtC;;;;;;;;;;OAUG;IACH,SAAS,CAAC,EAAE,OAAO,CACjB,MAAM,CACF,MAAM,GACN,OAAO,GACP,UAAU,GACV,QAAQ,GACR,OAAO,GACP,gBAAgB,GAChB,gBAAgB,EAClB,MAAM,CACP,CACF,CAAC;CACH,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,MAAM,CAAC,EACrB,GAAG,EACH,GAAG,EACH,QAAQ,EACR,eAAe,EACf,KAAK,EACL,IAAI,EACJ,IAAY,EACZ,MAAM,EACN,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,aAAsC,EACtC,SAAS,EACT,aAAa,EACb,GAAG,KAAK,EACT,EAAE,WAAW,qBAgEb"}
1
+ {"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../../src/components/avatar/avatar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EACL,MAAM,IAAI,eAAe,EAG1B,MAAM,4CAA4C,CAAC;AAQpD,OAAO,EAAE,KAAK,QAAQ,EAAiB,MAAM,wBAAwB,CAAC;AAEtE,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,cAAc,EACf,MAAM,eAAe,CAAC;AASvB,MAAM,MAAM,WAAW,GAAG,IAAI,CAC5B,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,EAC5C,WAAW,GAAG,MAAM,CACrB,GAAG;IACF;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;;;;;OAUG;IACH,eAAe,CAAC,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IACtD;;OAEG;IACH,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;OAEG;IACH,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClC;;OAEG;IACH,QAAQ,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACtC;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB;;OAEG;IACH,YAAY,CAAC,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IAC7C;;;OAGG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC1C;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IAEtC;;;;;;;;;;OAUG;IACH,SAAS,CAAC,EAAE,OAAO,CACjB,MAAM,CACF,MAAM,GACN,OAAO,GACP,UAAU,GACV,QAAQ,GACR,OAAO,GACP,gBAAgB,GAChB,gBAAgB,EAClB,MAAM,CACP,CACF,CAAC;IACF;;;OAGG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,MAAM,CAAC,EACrB,GAAG,EACH,GAAG,EACH,QAAQ,EACR,eAAe,EACf,KAAK,EACL,IAAI,EACJ,IAAY,EACZ,MAAM,EACN,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,aAAsC,EACtC,SAAS,EACT,aAAa,EACb,MAAM,EACN,GAAG,KAAK,EACT,EAAE,WAAW,qBAiEb"}
@@ -1,9 +1,11 @@
1
+ "use client";
1
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
3
  import { Avatar as AvatarPrimitive, AvatarFallback, AvatarImage, } from "@forthtilliath/shadcn-ui/components/avatar";
3
4
  import { Tooltip, TooltipContent, TooltipTrigger, } from "@forthtilliath/shadcn-ui/components/tooltip";
4
5
  import { cn } from "@forthtilliath/shadcn-ui/lib/utils";
5
- import { DEFAULT_BADGE_POSITION, STATUS_LABEL } from "./constants";
6
- import { avatarVariants, badgeVariants, fallbackVariants, statusVariants, tooltipTriggerVariants, } from "./variants";
6
+ import { useUiMessages } from "../../locale/locale.js";
7
+ import { DEFAULT_BADGE_POSITION } from "./constants.js";
8
+ import { avatarVariants, badgeVariants, fallbackVariants, statusVariants, tooltipTriggerVariants, } from "./variants.js";
7
9
  /**
8
10
  * An image element with a fallback for representing the user.
9
11
  *
@@ -17,8 +19,9 @@ import { avatarVariants, badgeVariants, fallbackVariants, statusVariants, toolti
17
19
  * @author Forth
18
20
  * @copyright 2025 Forth
19
21
  */
20
- export function Avatar({ src, alt, fallback, fallbackVariant, shape, size, ring = false, status, position, badge, badgeVariant, badgePosition = DEFAULT_BADGE_POSITION, className, renderTooltip, ...props }) {
21
- const avatar = (_jsxs("div", { className: "relative", children: [_jsxs(AvatarPrimitive, { className: cn("block", avatarVariants({ shape, ring, size }), className?.root), ...props, children: [_jsx(AvatarImage, { src: src, alt: alt, className: className?.image }), _jsx(AvatarFallback, { className: cn(fallbackVariants({ fallbackVariant, shape }), className?.fallback), children: fallback })] }), status && (_jsx("div", { className: cn(statusVariants({ status, position }), className?.status), children: _jsx("span", { className: "sr-only", children: STATUS_LABEL[status] }) })), badge !== undefined && (_jsx("div", { className: cn(badgeVariants({ badgeVariant, position: badgePosition }), className?.badge), children: badge }))] }));
22
+ export function Avatar({ src, alt, fallback, fallbackVariant, shape, size, ring = false, status, position, badge, badgeVariant, badgePosition = DEFAULT_BADGE_POSITION, className, renderTooltip, locale, ...props }) {
23
+ const messages = useUiMessages(locale);
24
+ const avatar = (_jsxs("div", { className: "relative", children: [_jsxs(AvatarPrimitive, { className: cn("block", avatarVariants({ shape, ring, size }), className?.root), ...props, children: [_jsx(AvatarImage, { src: src, alt: alt, className: className?.image }), _jsx(AvatarFallback, { className: cn(fallbackVariants({ fallbackVariant, shape }), className?.fallback), children: fallback })] }), status && (_jsx("div", { className: cn(statusVariants({ status, position }), className?.status), children: _jsx("span", { className: "sr-only", children: messages.avatar[status] }) })), badge !== undefined && (_jsx("div", { className: cn(badgeVariants({ badgeVariant, position: badgePosition }), className?.badge), children: badge }))] }));
22
25
  if (typeof renderTooltip === "function") {
23
26
  return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { className: cn(tooltipTriggerVariants({ shape }), className?.tooltipTrigger), asChild: true, children: avatar }), _jsx(TooltipContent, { className: cn(className?.tooltipContent), children: renderTooltip() })] }));
24
27
  }
@@ -1,5 +1,5 @@
1
- export type { AvatarProps } from "./avatar";
2
- export { Avatar } from "./avatar";
3
- export type { AvatarGroupProps } from "./avatar-group";
4
- export { AvatarGroup } from "./avatar-group";
1
+ export type { AvatarProps } from "./avatar.js";
2
+ export { Avatar } from "./avatar.js";
3
+ export type { AvatarGroupProps } from "./avatar-group.js";
4
+ export { AvatarGroup } from "./avatar-group.js";
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/avatar/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,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/avatar/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
@@ -1,2 +1,2 @@
1
- export { Avatar } from "./avatar";
2
- export { AvatarGroup } from "./avatar-group";
1
+ export { Avatar } from "./avatar.js";
2
+ export { AvatarGroup } from "./avatar-group.js";