@dsfrkit/react 0.1.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 (728) hide show
  1. package/README.md +115 -0
  2. package/dist/artwork-B3QGyilb.d.mts +156 -0
  3. package/dist/artwork-B3QGyilb.d.ts +156 -0
  4. package/dist/artwork-CW2iQ_23.d.mts +171 -0
  5. package/dist/artwork-CW2iQ_23.d.ts +171 -0
  6. package/dist/chunk-23I7BDV6.mjs +39 -0
  7. package/dist/chunk-24DYKVTR.mjs +144 -0
  8. package/dist/chunk-2BB27XUW.mjs +65 -0
  9. package/dist/chunk-2BJMVHYD.mjs +137 -0
  10. package/dist/chunk-2EW2GCGT.mjs +137 -0
  11. package/dist/chunk-2HZIFFGX.mjs +144 -0
  12. package/dist/chunk-2LHWW7HN.mjs +114 -0
  13. package/dist/chunk-2LXQNL5D.mjs +113 -0
  14. package/dist/chunk-2NH3AUHW.mjs +79 -0
  15. package/dist/chunk-2PJ4EU56.mjs +203 -0
  16. package/dist/chunk-2QH4KMWT.mjs +8 -0
  17. package/dist/chunk-2RNER4KC.mjs +144 -0
  18. package/dist/chunk-2U3S73BF.mjs +8 -0
  19. package/dist/chunk-2V722J6M.mjs +8 -0
  20. package/dist/chunk-37CO3FHD.mjs +125 -0
  21. package/dist/chunk-3BTPUF5K.mjs +144 -0
  22. package/dist/chunk-3GBCT2U3.mjs +156 -0
  23. package/dist/chunk-3HHH4GMH.mjs +110 -0
  24. package/dist/chunk-3IMYMASJ.mjs +194 -0
  25. package/dist/chunk-3J555ZVB.mjs +122 -0
  26. package/dist/chunk-3JFXRCOL.mjs +1 -0
  27. package/dist/chunk-3JUY36HV.mjs +127 -0
  28. package/dist/chunk-3THML6BJ.mjs +22 -0
  29. package/dist/chunk-3VPGNSKX.mjs +834 -0
  30. package/dist/chunk-3YSDF6VX.mjs +221 -0
  31. package/dist/chunk-43XOENR2.mjs +53 -0
  32. package/dist/chunk-43ZFDH2Q.mjs +122 -0
  33. package/dist/chunk-44UGQHBU.mjs +166 -0
  34. package/dist/chunk-474LZSO7.mjs +122 -0
  35. package/dist/chunk-4KCVV4LR.mjs +156 -0
  36. package/dist/chunk-4LGWCPN4.mjs +92 -0
  37. package/dist/chunk-4LVHKND5.mjs +129 -0
  38. package/dist/chunk-4NU2XZIG.mjs +137 -0
  39. package/dist/chunk-4PA73RZ4.mjs +221 -0
  40. package/dist/chunk-4UBXW6O2.mjs +63 -0
  41. package/dist/chunk-4ZFM6M7C.mjs +127 -0
  42. package/dist/chunk-52BJN7DC.mjs +504 -0
  43. package/dist/chunk-53M2BTB5.mjs +22 -0
  44. package/dist/chunk-552MR22F.mjs +93 -0
  45. package/dist/chunk-57DNFR54.mjs +92 -0
  46. package/dist/chunk-5FHDLYYI.mjs +200 -0
  47. package/dist/chunk-5I2Y5M2K.mjs +514 -0
  48. package/dist/chunk-5IJLRY6P.mjs +504 -0
  49. package/dist/chunk-5IQADW3H.mjs +82 -0
  50. package/dist/chunk-5MEHDSPX.mjs +137 -0
  51. package/dist/chunk-5OYV672H.mjs +122 -0
  52. package/dist/chunk-5TQ2XLQH.mjs +91 -0
  53. package/dist/chunk-5WNMRXFG.mjs +137 -0
  54. package/dist/chunk-5ZBE6TNA.mjs +137 -0
  55. package/dist/chunk-5ZNBGCHW.mjs +105 -0
  56. package/dist/chunk-6AVQRAR3.mjs +729 -0
  57. package/dist/chunk-6BGCPIW7.mjs +127 -0
  58. package/dist/chunk-6BOEMNY4.mjs +94 -0
  59. package/dist/chunk-6FCPWBF2.mjs +137 -0
  60. package/dist/chunk-6HDE47EI.mjs +141 -0
  61. package/dist/chunk-6OSSG7EX.mjs +291 -0
  62. package/dist/chunk-6U5FC3RG.mjs +85 -0
  63. package/dist/chunk-6XZ4GBJ6.mjs +83 -0
  64. package/dist/chunk-6YGKYFPL.mjs +137 -0
  65. package/dist/chunk-6Z77GLN6.mjs +72 -0
  66. package/dist/chunk-6ZP4SKO6.mjs +144 -0
  67. package/dist/chunk-6ZWOOE2S.mjs +60 -0
  68. package/dist/chunk-762QFXXR.mjs +141 -0
  69. package/dist/chunk-76L74JUY.mjs +115 -0
  70. package/dist/chunk-76VC5YPU.mjs +113 -0
  71. package/dist/chunk-7BWEILU6.mjs +95 -0
  72. package/dist/chunk-7DGUHXUB.mjs +156 -0
  73. package/dist/chunk-7DTPT7EQ.mjs +220 -0
  74. package/dist/chunk-7FDDD5IV.mjs +203 -0
  75. package/dist/chunk-7H6WDKNO.mjs +141 -0
  76. package/dist/chunk-7KDRU2XY.mjs +145 -0
  77. package/dist/chunk-7QZTUZPL.mjs +137 -0
  78. package/dist/chunk-7REZ747L.mjs +122 -0
  79. package/dist/chunk-7RV4WZVM.mjs +203 -0
  80. package/dist/chunk-7VT2ZJBR.mjs +122 -0
  81. package/dist/chunk-7XPLI6X6.mjs +129 -0
  82. package/dist/chunk-7XYNKZWU.mjs +32 -0
  83. package/dist/chunk-A5OCX7PW.mjs +141 -0
  84. package/dist/chunk-A734PEYB.mjs +20 -0
  85. package/dist/chunk-ACBEJHSN.mjs +89 -0
  86. package/dist/chunk-ADRORWCA.mjs +95 -0
  87. package/dist/chunk-AGELEW5Q.mjs +121 -0
  88. package/dist/chunk-AGFBCPPH.mjs +78 -0
  89. package/dist/chunk-AHDHVUSU.mjs +105 -0
  90. package/dist/chunk-AKXX5JM5.mjs +122 -0
  91. package/dist/chunk-AM2FMPVS.mjs +299 -0
  92. package/dist/chunk-AMLQ6RI2.mjs +72 -0
  93. package/dist/chunk-ARTXTVIX.mjs +156 -0
  94. package/dist/chunk-ARZVIKN2.mjs +114 -0
  95. package/dist/chunk-ATLMREKL.mjs +117 -0
  96. package/dist/chunk-AVN6NSOQ.mjs +504 -0
  97. package/dist/chunk-AWOTVASU.mjs +82 -0
  98. package/dist/chunk-AZWGY2SR.mjs +101 -0
  99. package/dist/chunk-B5T4EO6N.mjs +122 -0
  100. package/dist/chunk-BDPEOSAY.mjs +80 -0
  101. package/dist/chunk-BHUY7ML7.mjs +95 -0
  102. package/dist/chunk-BMGFO5X6.mjs +127 -0
  103. package/dist/chunk-BRDUOWC4.mjs +385 -0
  104. package/dist/chunk-BRX2NAAS.mjs +52 -0
  105. package/dist/chunk-BTFAMY6E.mjs +65 -0
  106. package/dist/chunk-C4BBQTZ3.mjs +20 -0
  107. package/dist/chunk-CEFGBZXZ.mjs +165 -0
  108. package/dist/chunk-CF6SPRDA.mjs +56 -0
  109. package/dist/chunk-CIOYPW7H.mjs +137 -0
  110. package/dist/chunk-CVGHZFZK.mjs +117 -0
  111. package/dist/chunk-D4XAI2WD.mjs +65 -0
  112. package/dist/chunk-DAECVI5O.mjs +113 -0
  113. package/dist/chunk-DD7O3SCJ.mjs +144 -0
  114. package/dist/chunk-DDQTQ7Z2.mjs +172 -0
  115. package/dist/chunk-DGYJH7JG.mjs +259 -0
  116. package/dist/chunk-DLRDFCPW.mjs +60 -0
  117. package/dist/chunk-DN67LFQR.mjs +81 -0
  118. package/dist/chunk-DOXA63UH.mjs +504 -0
  119. package/dist/chunk-DSU6MKPW.mjs +137 -0
  120. package/dist/chunk-DTK5B22N.mjs +65 -0
  121. package/dist/chunk-DTOWE2MA.mjs +89 -0
  122. package/dist/chunk-DUXLKXFH.mjs +91 -0
  123. package/dist/chunk-DW62DTCF.mjs +87 -0
  124. package/dist/chunk-DWGELT6B.mjs +21 -0
  125. package/dist/chunk-DX4476KH.mjs +831 -0
  126. package/dist/chunk-E63ZEQE4.mjs +732 -0
  127. package/dist/chunk-EA3TIJMP.mjs +196 -0
  128. package/dist/chunk-EA5VCJ4G.mjs +85 -0
  129. package/dist/chunk-EAZ6NHW3.mjs +141 -0
  130. package/dist/chunk-EBDDPXU3.mjs +122 -0
  131. package/dist/chunk-ELEGVKVJ.mjs +122 -0
  132. package/dist/chunk-EX3RF7CE.mjs +294 -0
  133. package/dist/chunk-EXL24QAL.mjs +95 -0
  134. package/dist/chunk-F3W67E3Q.mjs +22 -0
  135. package/dist/chunk-F4A4IDZT.mjs +116 -0
  136. package/dist/chunk-FA7MQI6D.mjs +36 -0
  137. package/dist/chunk-FDFTH2OA.mjs +90 -0
  138. package/dist/chunk-FDRHBZZC.mjs +144 -0
  139. package/dist/chunk-FG3S54WT.mjs +211 -0
  140. package/dist/chunk-FI3PDDER.mjs +122 -0
  141. package/dist/chunk-FIXSMDQ7.mjs +141 -0
  142. package/dist/chunk-FK6JIEEN.mjs +516 -0
  143. package/dist/chunk-FL5D63D7.mjs +71 -0
  144. package/dist/chunk-FMWN44M7.mjs +92 -0
  145. package/dist/chunk-FNJYYQWC.mjs +60 -0
  146. package/dist/chunk-FNW7PJBZ.mjs +64 -0
  147. package/dist/chunk-FNWRRTCO.mjs +39 -0
  148. package/dist/chunk-FW4K4W3K.mjs +141 -0
  149. package/dist/chunk-GERPY3SW.mjs +63 -0
  150. package/dist/chunk-GKDVJ2TL.mjs +95 -0
  151. package/dist/chunk-GLRU4LYS.mjs +504 -0
  152. package/dist/chunk-GVW4A5MT.mjs +60 -0
  153. package/dist/chunk-GXJ5KSWO.mjs +165 -0
  154. package/dist/chunk-GZGPV2GH.mjs +122 -0
  155. package/dist/chunk-H3MN7LXP.mjs +36 -0
  156. package/dist/chunk-H7FFO2UX.mjs +121 -0
  157. package/dist/chunk-H7PNKXKX.mjs +56 -0
  158. package/dist/chunk-HAAWMTFK.mjs +98 -0
  159. package/dist/chunk-HFWOG3A4.mjs +137 -0
  160. package/dist/chunk-HGZHZHVX.mjs +47 -0
  161. package/dist/chunk-HP6JAQYJ.mjs +94 -0
  162. package/dist/chunk-HU4E64GQ.mjs +71 -0
  163. package/dist/chunk-HVKU5XVM.mjs +53 -0
  164. package/dist/chunk-HXQU5KQU.mjs +95 -0
  165. package/dist/chunk-IFYYNQ45.mjs +58 -0
  166. package/dist/chunk-IHMJCY2Z.mjs +87 -0
  167. package/dist/chunk-IHWNEZFG.mjs +36 -0
  168. package/dist/chunk-IM6BEVG6.mjs +71 -0
  169. package/dist/chunk-INM7YQKC.mjs +127 -0
  170. package/dist/chunk-IOD6W4YR.mjs +127 -0
  171. package/dist/chunk-IRDSRZ6X.mjs +62 -0
  172. package/dist/chunk-ITVUL6I2.mjs +98 -0
  173. package/dist/chunk-JAJOT3LV.mjs +87 -0
  174. package/dist/chunk-JAWTBRNS.mjs +122 -0
  175. package/dist/chunk-JR35S45U.mjs +22 -0
  176. package/dist/chunk-JWP5ZC5R.mjs +122 -0
  177. package/dist/chunk-JXBXEIER.mjs +126 -0
  178. package/dist/chunk-KCTGBTKI.mjs +145 -0
  179. package/dist/chunk-KEVX5SBT.mjs +221 -0
  180. package/dist/chunk-KFCM7PTR.mjs +98 -0
  181. package/dist/chunk-KIIWOL5Y.mjs +144 -0
  182. package/dist/chunk-KJ22LZMS.mjs +122 -0
  183. package/dist/chunk-KLJX3KQD.mjs +291 -0
  184. package/dist/chunk-KLMBFT3I.mjs +137 -0
  185. package/dist/chunk-KQPVSMIE.mjs +119 -0
  186. package/dist/chunk-KSK2RMP2.mjs +91 -0
  187. package/dist/chunk-KVVAUT3G.mjs +104 -0
  188. package/dist/chunk-KYKGI5BT.mjs +29 -0
  189. package/dist/chunk-L56KCHUI.mjs +116 -0
  190. package/dist/chunk-L65SLADH.mjs +137 -0
  191. package/dist/chunk-LASIEVVD.mjs +185 -0
  192. package/dist/chunk-LCTUVPNY.mjs +297 -0
  193. package/dist/chunk-LNHBVSNL.mjs +60 -0
  194. package/dist/chunk-LO5DFSJW.mjs +145 -0
  195. package/dist/chunk-LZRZUFF7.mjs +145 -0
  196. package/dist/chunk-M2LTIUBU.mjs +122 -0
  197. package/dist/chunk-M3KPXPDL.mjs +29 -0
  198. package/dist/chunk-M4PKDGE6.mjs +84 -0
  199. package/dist/chunk-M5SSDTTI.mjs +144 -0
  200. package/dist/chunk-MEJPZHAU.mjs +137 -0
  201. package/dist/chunk-ML7LO7IA.mjs +117 -0
  202. package/dist/chunk-MMILCSIS.mjs +228 -0
  203. package/dist/chunk-MNRZGIJQ.mjs +71 -0
  204. package/dist/chunk-MR6L2TFX.mjs +108 -0
  205. package/dist/chunk-MSNX3AR7.mjs +77 -0
  206. package/dist/chunk-MTLKC5UG.mjs +52 -0
  207. package/dist/chunk-MVEJMLQV.mjs +121 -0
  208. package/dist/chunk-MXMPDB4C.mjs +115 -0
  209. package/dist/chunk-N4RS42JQ.mjs +95 -0
  210. package/dist/chunk-N57TKKRF.mjs +156 -0
  211. package/dist/chunk-NF7PDBLJ.mjs +137 -0
  212. package/dist/chunk-NFEGQZI6.mjs +137 -0
  213. package/dist/chunk-NFXJSDUN.mjs +141 -0
  214. package/dist/chunk-NIWPLXZV.mjs +156 -0
  215. package/dist/chunk-NLA4YXGL.mjs +514 -0
  216. package/dist/chunk-NMLAW5NT.mjs +122 -0
  217. package/dist/chunk-NR66XXLN.mjs +156 -0
  218. package/dist/chunk-NRMIWRV6.mjs +297 -0
  219. package/dist/chunk-NWFMBDRM.mjs +24 -0
  220. package/dist/chunk-NXDYVTFV.mjs +122 -0
  221. package/dist/chunk-O42L54HQ.mjs +64 -0
  222. package/dist/chunk-O6DX3UFY.mjs +144 -0
  223. package/dist/chunk-O6H6FK6Y.mjs +137 -0
  224. package/dist/chunk-OD2MYXSX.mjs +117 -0
  225. package/dist/chunk-OHDAB5RA.mjs +514 -0
  226. package/dist/chunk-OIVUFVD4.mjs +122 -0
  227. package/dist/chunk-OKNSXEYQ.mjs +23 -0
  228. package/dist/chunk-OODDZ36D.mjs +221 -0
  229. package/dist/chunk-OPSBOV67.mjs +103 -0
  230. package/dist/chunk-OR2S4A6H.mjs +95 -0
  231. package/dist/chunk-OSLWGGF7.mjs +206 -0
  232. package/dist/chunk-OTBJ3BDC.mjs +137 -0
  233. package/dist/chunk-OZ37V2CL.mjs +116 -0
  234. package/dist/chunk-OZVAPU5J.mjs +127 -0
  235. package/dist/chunk-P2PN6HBO.mjs +95 -0
  236. package/dist/chunk-P3RTX23Z.mjs +133 -0
  237. package/dist/chunk-P5JZQIOK.mjs +103 -0
  238. package/dist/chunk-P7R26T3Z.mjs +145 -0
  239. package/dist/chunk-PGTGRJXX.mjs +122 -0
  240. package/dist/chunk-POBPYPUF.mjs +112 -0
  241. package/dist/chunk-PWUDSGHY.mjs +503 -0
  242. package/dist/chunk-PYQP4S3P.mjs +121 -0
  243. package/dist/chunk-Q4X44C4L.mjs +144 -0
  244. package/dist/chunk-QADKEWBW.mjs +91 -0
  245. package/dist/chunk-QEJXAPVP.mjs +193 -0
  246. package/dist/chunk-QEXXBZLP.mjs +137 -0
  247. package/dist/chunk-QFDUI4JF.mjs +137 -0
  248. package/dist/chunk-QIRIOLSQ.mjs +36 -0
  249. package/dist/chunk-QKZKXMDP.mjs +116 -0
  250. package/dist/chunk-QM44OKQB.mjs +110 -0
  251. package/dist/chunk-QUDEY3ZC.mjs +184 -0
  252. package/dist/chunk-QXBXBOPT.mjs +14 -0
  253. package/dist/chunk-R3HLKKGQ.mjs +200 -0
  254. package/dist/chunk-R7Q3PWPD.mjs +138 -0
  255. package/dist/chunk-RE55YFSX.mjs +70 -0
  256. package/dist/chunk-RH2JCZ3S.mjs +144 -0
  257. package/dist/chunk-RIHKQMJZ.mjs +71 -0
  258. package/dist/chunk-RLESRYZ7.mjs +141 -0
  259. package/dist/chunk-RN7K57U3.mjs +108 -0
  260. package/dist/chunk-RPZ6KAGN.mjs +156 -0
  261. package/dist/chunk-RSK73346.mjs +507 -0
  262. package/dist/chunk-RSYSJQNC.mjs +156 -0
  263. package/dist/chunk-RVYMEMGV.mjs +141 -0
  264. package/dist/chunk-RWQEGPN3.mjs +47 -0
  265. package/dist/chunk-RXUR5LHG.mjs +221 -0
  266. package/dist/chunk-RZCB3IFV.mjs +151 -0
  267. package/dist/chunk-RZJMZDH6.mjs +24 -0
  268. package/dist/chunk-S6BMBKPF.mjs +108 -0
  269. package/dist/chunk-S6BOOCIS.mjs +82 -0
  270. package/dist/chunk-S72JYZ34.mjs +205 -0
  271. package/dist/chunk-SAMWUGZH.mjs +200 -0
  272. package/dist/chunk-SF72OO5J.mjs +141 -0
  273. package/dist/chunk-SGES2MH4.mjs +141 -0
  274. package/dist/chunk-SH42XLB3.mjs +126 -0
  275. package/dist/chunk-SHZX3OGO.mjs +89 -0
  276. package/dist/chunk-SJLOQ3VX.mjs +113 -0
  277. package/dist/chunk-SJSM5PK5.mjs +110 -0
  278. package/dist/chunk-SUCVL4AR.mjs +127 -0
  279. package/dist/chunk-SZOFVBTZ.mjs +9 -0
  280. package/dist/chunk-SZPASZJ7.mjs +137 -0
  281. package/dist/chunk-T26S5SRN.mjs +52 -0
  282. package/dist/chunk-TAPPN5PM.mjs +72 -0
  283. package/dist/chunk-TCLGXTVU.mjs +221 -0
  284. package/dist/chunk-TFWWQZZK.mjs +89 -0
  285. package/dist/chunk-TGMDRDFD.mjs +127 -0
  286. package/dist/chunk-THEZTSDO.mjs +122 -0
  287. package/dist/chunk-TNHL4DWX.mjs +116 -0
  288. package/dist/chunk-TNKFYE4G.mjs +30 -0
  289. package/dist/chunk-TR24H7UQ.mjs +95 -0
  290. package/dist/chunk-TTMH3FVZ.mjs +119 -0
  291. package/dist/chunk-TTQCH2X2.mjs +113 -0
  292. package/dist/chunk-TXZDAPDU.mjs +129 -0
  293. package/dist/chunk-TY4VNBLX.mjs +137 -0
  294. package/dist/chunk-U3P6M5T4.mjs +127 -0
  295. package/dist/chunk-U6OTBZMO.mjs +507 -0
  296. package/dist/chunk-UB6RKUH5.mjs +89 -0
  297. package/dist/chunk-UDUTTGR5.mjs +89 -0
  298. package/dist/chunk-UENEQHEN.mjs +506 -0
  299. package/dist/chunk-UGGMZF3C.mjs +87 -0
  300. package/dist/chunk-UMB7ZMKX.mjs +122 -0
  301. package/dist/chunk-UNL4F3FH.mjs +122 -0
  302. package/dist/chunk-UOP3WPZG.mjs +60 -0
  303. package/dist/chunk-UPBRQJAU.mjs +512 -0
  304. package/dist/chunk-UPPVJWBO.mjs +116 -0
  305. package/dist/chunk-UYFHSIC7.mjs +81 -0
  306. package/dist/chunk-UZJQAAOZ.mjs +108 -0
  307. package/dist/chunk-V2JDJALG.mjs +125 -0
  308. package/dist/chunk-V2YC7EE6.mjs +122 -0
  309. package/dist/chunk-V3UXNKVL.mjs +122 -0
  310. package/dist/chunk-V5FP5GDQ.mjs +95 -0
  311. package/dist/chunk-VCHYQYFB.mjs +503 -0
  312. package/dist/chunk-VJEJD4DF.mjs +52 -0
  313. package/dist/chunk-VL4PZ5RI.mjs +113 -0
  314. package/dist/chunk-VNGGNO3R.mjs +32 -0
  315. package/dist/chunk-VNWV6LZP.mjs +38 -0
  316. package/dist/chunk-VOQEOCHD.mjs +511 -0
  317. package/dist/chunk-VW33ORR4.mjs +301 -0
  318. package/dist/chunk-VZ6VFS3D.mjs +109 -0
  319. package/dist/chunk-W3SECUBG.mjs +14 -0
  320. package/dist/chunk-W5OZFHOX.mjs +193 -0
  321. package/dist/chunk-WCSWQVFA.mjs +96 -0
  322. package/dist/chunk-WELBZQP2.mjs +137 -0
  323. package/dist/chunk-WGJWOF4K.mjs +122 -0
  324. package/dist/chunk-WJUBYR25.mjs +122 -0
  325. package/dist/chunk-WKSLZG4X.mjs +122 -0
  326. package/dist/chunk-WO4BCKRI.mjs +145 -0
  327. package/dist/chunk-WRJ47AVE.mjs +136 -0
  328. package/dist/chunk-WWAEK25T.mjs +92 -0
  329. package/dist/chunk-X3N6PDZV.mjs +71 -0
  330. package/dist/chunk-X437NODC.mjs +122 -0
  331. package/dist/chunk-X4FBB2TI.mjs +32 -0
  332. package/dist/chunk-XAJVDNFJ.mjs +119 -0
  333. package/dist/chunk-XGIDLCZI.mjs +137 -0
  334. package/dist/chunk-XGPUTXJT.mjs +122 -0
  335. package/dist/chunk-XHSCOABH.mjs +138 -0
  336. package/dist/chunk-XRM6FF22.mjs +61 -0
  337. package/dist/chunk-XTG2CB35.mjs +122 -0
  338. package/dist/chunk-XX22JBNI.mjs +139 -0
  339. package/dist/chunk-Y2W5252F.mjs +515 -0
  340. package/dist/chunk-Y3UMAK4V.mjs +141 -0
  341. package/dist/chunk-Y4M4BHVP.mjs +106 -0
  342. package/dist/chunk-Y5TUAI6V.mjs +127 -0
  343. package/dist/chunk-Y6F7EJOV.mjs +129 -0
  344. package/dist/chunk-YCITYGTH.mjs +20 -0
  345. package/dist/chunk-YD3HHOXQ.mjs +120 -0
  346. package/dist/chunk-YE3IUCBS.mjs +81 -0
  347. package/dist/chunk-YG2I4KKR.mjs +156 -0
  348. package/dist/chunk-YQGPAXSD.mjs +24 -0
  349. package/dist/chunk-YSAEDU4W.mjs +137 -0
  350. package/dist/chunk-YSZMXNWH.mjs +30 -0
  351. package/dist/chunk-YW3ZBLND.mjs +8 -0
  352. package/dist/chunk-YZC2FQVP.mjs +78 -0
  353. package/dist/chunk-Z3MPWBBS.mjs +109 -0
  354. package/dist/chunk-Z3NBRL3F.mjs +108 -0
  355. package/dist/chunk-ZF5BUSKM.mjs +122 -0
  356. package/dist/chunk-ZF5CW4JH.mjs +91 -0
  357. package/dist/chunk-ZFUAZYLA.mjs +20 -0
  358. package/dist/chunk-ZJ7EMTGD.mjs +83 -0
  359. package/dist/chunk-ZPBOEUI7.mjs +56 -0
  360. package/dist/chunk-ZPFY4R5H.mjs +514 -0
  361. package/dist/chunk-ZRUMMJPO.mjs +127 -0
  362. package/dist/chunk-ZTLWJFDN.mjs +110 -0
  363. package/dist/chunk-ZVMW2BJZ.mjs +206 -0
  364. package/dist/components/dashboard/index.d.mts +135 -0
  365. package/dist/components/dashboard/index.d.ts +135 -0
  366. package/dist/components/dashboard/index.js +260 -0
  367. package/dist/components/dashboard/index.mjs +228 -0
  368. package/dist/components/layout/index.d.mts +2 -0
  369. package/dist/components/layout/index.d.ts +2 -0
  370. package/dist/components/layout/index.js +2 -0
  371. package/dist/components/layout/index.mjs +1 -0
  372. package/dist/components/navigation/index.d.mts +261 -0
  373. package/dist/components/navigation/index.d.ts +261 -0
  374. package/dist/components/navigation/index.js +552 -0
  375. package/dist/components/navigation/index.mjs +3 -0
  376. package/dist/components/ui/accordion.d.mts +37 -0
  377. package/dist/components/ui/accordion.d.ts +37 -0
  378. package/dist/components/ui/accordion.js +120 -0
  379. package/dist/components/ui/accordion.mjs +2 -0
  380. package/dist/components/ui/alert.d.mts +49 -0
  381. package/dist/components/ui/alert.d.ts +49 -0
  382. package/dist/components/ui/alert.js +149 -0
  383. package/dist/components/ui/alert.mjs +2 -0
  384. package/dist/components/ui/artwork.d.mts +2 -0
  385. package/dist/components/ui/artwork.d.ts +2 -0
  386. package/dist/components/ui/artwork.js +950 -0
  387. package/dist/components/ui/artwork.mjs +3 -0
  388. package/dist/components/ui/avatar.d.mts +36 -0
  389. package/dist/components/ui/avatar.d.ts +36 -0
  390. package/dist/components/ui/avatar.js +231 -0
  391. package/dist/components/ui/avatar.mjs +3 -0
  392. package/dist/components/ui/badge.d.mts +32 -0
  393. package/dist/components/ui/badge.d.ts +32 -0
  394. package/dist/components/ui/badge.js +119 -0
  395. package/dist/components/ui/badge.mjs +2 -0
  396. package/dist/components/ui/box.d.mts +8 -0
  397. package/dist/components/ui/box.d.ts +8 -0
  398. package/dist/components/ui/box.js +41 -0
  399. package/dist/components/ui/box.mjs +2 -0
  400. package/dist/components/ui/breadcrumb.d.mts +57 -0
  401. package/dist/components/ui/breadcrumb.d.ts +57 -0
  402. package/dist/components/ui/breadcrumb.js +162 -0
  403. package/dist/components/ui/breadcrumb.mjs +3 -0
  404. package/dist/components/ui/button-group.d.mts +54 -0
  405. package/dist/components/ui/button-group.d.ts +54 -0
  406. package/dist/components/ui/button-group.js +113 -0
  407. package/dist/components/ui/button-group.mjs +2 -0
  408. package/dist/components/ui/button.d.mts +38 -0
  409. package/dist/components/ui/button.d.ts +38 -0
  410. package/dist/components/ui/button.js +149 -0
  411. package/dist/components/ui/button.mjs +2 -0
  412. package/dist/components/ui/calendar.d.mts +15 -0
  413. package/dist/components/ui/calendar.d.ts +15 -0
  414. package/dist/components/ui/calendar.js +282 -0
  415. package/dist/components/ui/calendar.mjs +3 -0
  416. package/dist/components/ui/callout.d.mts +32 -0
  417. package/dist/components/ui/callout.d.ts +32 -0
  418. package/dist/components/ui/callout.js +93 -0
  419. package/dist/components/ui/callout.mjs +2 -0
  420. package/dist/components/ui/card.d.mts +63 -0
  421. package/dist/components/ui/card.d.ts +63 -0
  422. package/dist/components/ui/card.js +112 -0
  423. package/dist/components/ui/card.mjs +2 -0
  424. package/dist/components/ui/checkbox.d.mts +37 -0
  425. package/dist/components/ui/checkbox.d.ts +37 -0
  426. package/dist/components/ui/checkbox.js +132 -0
  427. package/dist/components/ui/checkbox.mjs +2 -0
  428. package/dist/components/ui/code.d.mts +9 -0
  429. package/dist/components/ui/code.d.ts +9 -0
  430. package/dist/components/ui/code.js +57 -0
  431. package/dist/components/ui/code.mjs +2 -0
  432. package/dist/components/ui/command.d.mts +85 -0
  433. package/dist/components/ui/command.d.ts +85 -0
  434. package/dist/components/ui/command.js +243 -0
  435. package/dist/components/ui/command.mjs +3 -0
  436. package/dist/components/ui/consent.d.mts +8 -0
  437. package/dist/components/ui/consent.d.ts +8 -0
  438. package/dist/components/ui/consent.js +68 -0
  439. package/dist/components/ui/consent.mjs +2 -0
  440. package/dist/components/ui/container.d.mts +9 -0
  441. package/dist/components/ui/container.d.ts +9 -0
  442. package/dist/components/ui/container.js +59 -0
  443. package/dist/components/ui/container.mjs +2 -0
  444. package/dist/components/ui/data-list.d.mts +13 -0
  445. package/dist/components/ui/data-list.d.ts +13 -0
  446. package/dist/components/ui/data-list.js +79 -0
  447. package/dist/components/ui/data-list.mjs +2 -0
  448. package/dist/components/ui/dropdown-menu.d.mts +30 -0
  449. package/dist/components/ui/dropdown-menu.d.ts +30 -0
  450. package/dist/components/ui/dropdown-menu.js +213 -0
  451. package/dist/components/ui/dropdown-menu.mjs +2 -0
  452. package/dist/components/ui/flex.d.mts +12 -0
  453. package/dist/components/ui/flex.d.ts +12 -0
  454. package/dist/components/ui/flex.js +79 -0
  455. package/dist/components/ui/flex.mjs +2 -0
  456. package/dist/components/ui/follow.d.mts +9 -0
  457. package/dist/components/ui/follow.d.ts +9 -0
  458. package/dist/components/ui/follow.js +63 -0
  459. package/dist/components/ui/follow.mjs +2 -0
  460. package/dist/components/ui/grid.d.mts +12 -0
  461. package/dist/components/ui/grid.d.ts +12 -0
  462. package/dist/components/ui/grid.js +92 -0
  463. package/dist/components/ui/grid.mjs +2 -0
  464. package/dist/components/ui/heading.d.mts +11 -0
  465. package/dist/components/ui/heading.d.ts +11 -0
  466. package/dist/components/ui/heading.js +63 -0
  467. package/dist/components/ui/heading.mjs +2 -0
  468. package/dist/components/ui/highlight.d.mts +27 -0
  469. package/dist/components/ui/highlight.d.ts +27 -0
  470. package/dist/components/ui/highlight.js +74 -0
  471. package/dist/components/ui/highlight.mjs +2 -0
  472. package/dist/components/ui/hover-card.d.mts +8 -0
  473. package/dist/components/ui/hover-card.d.ts +8 -0
  474. package/dist/components/ui/hover-card.js +52 -0
  475. package/dist/components/ui/hover-card.mjs +2 -0
  476. package/dist/components/ui/indicator.d.mts +32 -0
  477. package/dist/components/ui/indicator.d.ts +32 -0
  478. package/dist/components/ui/indicator.js +88 -0
  479. package/dist/components/ui/indicator.mjs +2 -0
  480. package/dist/components/ui/input-otp.d.mts +37 -0
  481. package/dist/components/ui/input-otp.d.ts +37 -0
  482. package/dist/components/ui/input-otp.js +94 -0
  483. package/dist/components/ui/input-otp.mjs +2 -0
  484. package/dist/components/ui/input.d.mts +74 -0
  485. package/dist/components/ui/input.d.ts +74 -0
  486. package/dist/components/ui/input.js +416 -0
  487. package/dist/components/ui/input.mjs +2 -0
  488. package/dist/components/ui/kbd.d.mts +8 -0
  489. package/dist/components/ui/kbd.d.ts +8 -0
  490. package/dist/components/ui/kbd.js +51 -0
  491. package/dist/components/ui/kbd.mjs +2 -0
  492. package/dist/components/ui/link.d.mts +56 -0
  493. package/dist/components/ui/link.d.ts +56 -0
  494. package/dist/components/ui/link.js +150 -0
  495. package/dist/components/ui/link.mjs +3 -0
  496. package/dist/components/ui/logo.d.mts +58 -0
  497. package/dist/components/ui/logo.d.ts +58 -0
  498. package/dist/components/ui/logo.js +225 -0
  499. package/dist/components/ui/logo.mjs +2 -0
  500. package/dist/components/ui/modal.d.mts +34 -0
  501. package/dist/components/ui/modal.d.ts +34 -0
  502. package/dist/components/ui/modal.js +153 -0
  503. package/dist/components/ui/modal.mjs +2 -0
  504. package/dist/components/ui/notice.d.mts +56 -0
  505. package/dist/components/ui/notice.d.ts +56 -0
  506. package/dist/components/ui/notice.js +126 -0
  507. package/dist/components/ui/notice.mjs +2 -0
  508. package/dist/components/ui/pagination.d.mts +100 -0
  509. package/dist/components/ui/pagination.d.ts +100 -0
  510. package/dist/components/ui/pagination.js +248 -0
  511. package/dist/components/ui/pagination.mjs +3 -0
  512. package/dist/components/ui/pictograms.d.mts +2 -0
  513. package/dist/components/ui/pictograms.d.ts +2 -0
  514. package/dist/components/ui/pictograms.js +924 -0
  515. package/dist/components/ui/pictograms.mjs +1 -0
  516. package/dist/components/ui/popover.d.mts +9 -0
  517. package/dist/components/ui/popover.d.ts +9 -0
  518. package/dist/components/ui/popover.js +54 -0
  519. package/dist/components/ui/popover.mjs +2 -0
  520. package/dist/components/ui/progress.d.mts +16 -0
  521. package/dist/components/ui/progress.d.ts +16 -0
  522. package/dist/components/ui/progress.js +99 -0
  523. package/dist/components/ui/progress.mjs +2 -0
  524. package/dist/components/ui/quote.d.mts +41 -0
  525. package/dist/components/ui/quote.d.ts +41 -0
  526. package/dist/components/ui/quote.js +91 -0
  527. package/dist/components/ui/quote.mjs +2 -0
  528. package/dist/components/ui/radio.d.mts +32 -0
  529. package/dist/components/ui/radio.d.ts +32 -0
  530. package/dist/components/ui/radio.js +111 -0
  531. package/dist/components/ui/radio.mjs +2 -0
  532. package/dist/components/ui/range.d.mts +27 -0
  533. package/dist/components/ui/range.d.ts +27 -0
  534. package/dist/components/ui/range.js +137 -0
  535. package/dist/components/ui/range.mjs +2 -0
  536. package/dist/components/ui/section.d.mts +9 -0
  537. package/dist/components/ui/section.d.ts +9 -0
  538. package/dist/components/ui/section.js +56 -0
  539. package/dist/components/ui/section.mjs +2 -0
  540. package/dist/components/ui/select.d.mts +27 -0
  541. package/dist/components/ui/select.d.ts +27 -0
  542. package/dist/components/ui/select.js +222 -0
  543. package/dist/components/ui/select.mjs +2 -0
  544. package/dist/components/ui/separator.d.mts +6 -0
  545. package/dist/components/ui/separator.d.ts +6 -0
  546. package/dist/components/ui/separator.js +49 -0
  547. package/dist/components/ui/separator.mjs +2 -0
  548. package/dist/components/ui/sheet.d.mts +29 -0
  549. package/dist/components/ui/sheet.d.ts +29 -0
  550. package/dist/components/ui/sheet.js +140 -0
  551. package/dist/components/ui/sheet.mjs +2 -0
  552. package/dist/components/ui/skeleton.d.mts +13 -0
  553. package/dist/components/ui/skeleton.d.ts +13 -0
  554. package/dist/components/ui/skeleton.js +28 -0
  555. package/dist/components/ui/skeleton.mjs +2 -0
  556. package/dist/components/ui/stepper.d.mts +36 -0
  557. package/dist/components/ui/stepper.d.ts +36 -0
  558. package/dist/components/ui/stepper.js +98 -0
  559. package/dist/components/ui/stepper.mjs +2 -0
  560. package/dist/components/ui/table.d.mts +20 -0
  561. package/dist/components/ui/table.d.ts +20 -0
  562. package/dist/components/ui/table.js +121 -0
  563. package/dist/components/ui/table.mjs +2 -0
  564. package/dist/components/ui/tabs.d.mts +18 -0
  565. package/dist/components/ui/tabs.d.ts +18 -0
  566. package/dist/components/ui/tabs.js +126 -0
  567. package/dist/components/ui/tabs.mjs +2 -0
  568. package/dist/components/ui/tag.d.mts +61 -0
  569. package/dist/components/ui/tag.d.ts +61 -0
  570. package/dist/components/ui/tag.js +328 -0
  571. package/dist/components/ui/tag.mjs +2 -0
  572. package/dist/components/ui/text.d.mts +11 -0
  573. package/dist/components/ui/text.d.ts +11 -0
  574. package/dist/components/ui/text.js +66 -0
  575. package/dist/components/ui/text.mjs +2 -0
  576. package/dist/components/ui/theme-artwork.d.mts +22 -0
  577. package/dist/components/ui/theme-artwork.d.ts +22 -0
  578. package/dist/components/ui/theme-artwork.js +158 -0
  579. package/dist/components/ui/theme-artwork.mjs +2 -0
  580. package/dist/components/ui/theme-toggle.d.mts +23 -0
  581. package/dist/components/ui/theme-toggle.d.ts +23 -0
  582. package/dist/components/ui/theme-toggle.js +567 -0
  583. package/dist/components/ui/theme-toggle.mjs +9 -0
  584. package/dist/components/ui/tile.d.mts +57 -0
  585. package/dist/components/ui/tile.d.ts +57 -0
  586. package/dist/components/ui/tile.js +248 -0
  587. package/dist/components/ui/tile.mjs +2 -0
  588. package/dist/components/ui/toast.d.mts +18 -0
  589. package/dist/components/ui/toast.d.ts +18 -0
  590. package/dist/components/ui/toast.js +141 -0
  591. package/dist/components/ui/toast.mjs +2 -0
  592. package/dist/components/ui/toaster.d.mts +8 -0
  593. package/dist/components/ui/toaster.d.ts +8 -0
  594. package/dist/components/ui/toaster.js +263 -0
  595. package/dist/components/ui/toaster.mjs +4 -0
  596. package/dist/components/ui/toggle.d.mts +39 -0
  597. package/dist/components/ui/toggle.d.ts +39 -0
  598. package/dist/components/ui/toggle.js +156 -0
  599. package/dist/components/ui/toggle.mjs +2 -0
  600. package/dist/components/ui/tooltip.d.mts +26 -0
  601. package/dist/components/ui/tooltip.d.ts +26 -0
  602. package/dist/components/ui/tooltip.js +85 -0
  603. package/dist/components/ui/tooltip.mjs +2 -0
  604. package/dist/components/ui/translate.d.mts +36 -0
  605. package/dist/components/ui/translate.d.ts +36 -0
  606. package/dist/components/ui/translate.js +191 -0
  607. package/dist/components/ui/translate.mjs +2 -0
  608. package/dist/components/ui/upload.d.mts +37 -0
  609. package/dist/components/ui/upload.d.ts +37 -0
  610. package/dist/components/ui/upload.js +89 -0
  611. package/dist/components/ui/upload.mjs +2 -0
  612. package/dist/components/ui/use-toast.d.mts +49 -0
  613. package/dist/components/ui/use-toast.d.ts +49 -0
  614. package/dist/components/ui/use-toast.js +142 -0
  615. package/dist/components/ui/use-toast.mjs +1 -0
  616. package/dist/hooks/index.d.mts +40 -0
  617. package/dist/hooks/index.d.ts +40 -0
  618. package/dist/hooks/index.js +87 -0
  619. package/dist/hooks/index.mjs +2 -0
  620. package/dist/i18n/index.d.mts +160 -0
  621. package/dist/i18n/index.d.ts +160 -0
  622. package/dist/i18n/index.js +228 -0
  623. package/dist/i18n/index.mjs +191 -0
  624. package/dist/index.d.mts +96 -0
  625. package/dist/index.d.ts +96 -0
  626. package/dist/index.js +7183 -0
  627. package/dist/index.mjs +67 -0
  628. package/dist/primitives/index.d.mts +30 -0
  629. package/dist/primitives/index.d.ts +30 -0
  630. package/dist/primitives/index.js +48 -0
  631. package/dist/primitives/index.mjs +1 -0
  632. package/dist/providers/index.d.mts +155 -0
  633. package/dist/providers/index.d.ts +155 -0
  634. package/dist/providers/index.js +203 -0
  635. package/dist/providers/index.mjs +3 -0
  636. package/dist/theme-provider-DQSD5lrW.d.mts +82 -0
  637. package/dist/theme-provider-DQSD5lrW.d.ts +82 -0
  638. package/dist/theme-script-BIZ1PX7u.d.mts +75 -0
  639. package/dist/theme-script-BIZ1PX7u.d.ts +75 -0
  640. package/package.json +120 -0
  641. package/src/components/navigation/footer.tsx +173 -0
  642. package/src/components/navigation/header.tsx +236 -0
  643. package/src/components/navigation/index.ts +29 -0
  644. package/src/components/navigation/nav-link.tsx +135 -0
  645. package/src/components/navigation/navigation.tsx +336 -0
  646. package/src/components/navigation/skip-links.tsx +75 -0
  647. package/src/components/ui/accordion.test.tsx +56 -0
  648. package/src/components/ui/accordion.tsx +150 -0
  649. package/src/components/ui/alert.test.tsx +58 -0
  650. package/src/components/ui/alert.tsx +181 -0
  651. package/src/components/ui/artwork.tsx +166 -0
  652. package/src/components/ui/avatar.tsx +198 -0
  653. package/src/components/ui/badge.test.tsx +44 -0
  654. package/src/components/ui/badge.tsx +144 -0
  655. package/src/components/ui/box.tsx +17 -0
  656. package/src/components/ui/breadcrumb.tsx +189 -0
  657. package/src/components/ui/button-group.tsx +146 -0
  658. package/src/components/ui/button.test.tsx +56 -0
  659. package/src/components/ui/button.tsx +160 -0
  660. package/src/components/ui/calendar.tsx +159 -0
  661. package/src/components/ui/callout.test.tsx +36 -0
  662. package/src/components/ui/callout.tsx +131 -0
  663. package/src/components/ui/card.tsx +151 -0
  664. package/src/components/ui/checkbox.test.tsx +38 -0
  665. package/src/components/ui/checkbox.tsx +142 -0
  666. package/src/components/ui/code.tsx +33 -0
  667. package/src/components/ui/command.tsx +162 -0
  668. package/src/components/ui/consent.tsx +46 -0
  669. package/src/components/ui/container.tsx +35 -0
  670. package/src/components/ui/data-list.tsx +59 -0
  671. package/src/components/ui/dropdown-menu.tsx +226 -0
  672. package/src/components/ui/flex.tsx +62 -0
  673. package/src/components/ui/follow.tsx +52 -0
  674. package/src/components/ui/grid.tsx +75 -0
  675. package/src/components/ui/heading.tsx +42 -0
  676. package/src/components/ui/highlight.tsx +71 -0
  677. package/src/components/ui/hover-card.tsx +29 -0
  678. package/src/components/ui/indicator.tsx +108 -0
  679. package/src/components/ui/input-otp.tsx +85 -0
  680. package/src/components/ui/input.tsx +508 -0
  681. package/src/components/ui/kbd.tsx +26 -0
  682. package/src/components/ui/link.tsx +191 -0
  683. package/src/components/ui/logo.tsx +298 -0
  684. package/src/components/ui/modal.tsx +176 -0
  685. package/src/components/ui/notice.tsx +157 -0
  686. package/src/components/ui/pagination.tsx +348 -0
  687. package/src/components/ui/pictograms.ts +1197 -0
  688. package/src/components/ui/popover.tsx +33 -0
  689. package/src/components/ui/progress.tsx +79 -0
  690. package/src/components/ui/quote.tsx +132 -0
  691. package/src/components/ui/radio.test.tsx +48 -0
  692. package/src/components/ui/radio.tsx +126 -0
  693. package/src/components/ui/range.tsx +156 -0
  694. package/src/components/ui/section.tsx +32 -0
  695. package/src/components/ui/select.tsx +257 -0
  696. package/src/components/ui/separator.tsx +26 -0
  697. package/src/components/ui/sheet.tsx +137 -0
  698. package/src/components/ui/skeleton.tsx +26 -0
  699. package/src/components/ui/stepper.tsx +124 -0
  700. package/src/components/ui/table.tsx +158 -0
  701. package/src/components/ui/tabs.tsx +118 -0
  702. package/src/components/ui/tag.tsx +406 -0
  703. package/src/components/ui/text.tsx +45 -0
  704. package/src/components/ui/theme-artwork.tsx +122 -0
  705. package/src/components/ui/theme-toggle.tsx +154 -0
  706. package/src/components/ui/tile.tsx +337 -0
  707. package/src/components/ui/toast.tsx +140 -0
  708. package/src/components/ui/toaster.tsx +35 -0
  709. package/src/components/ui/toggle.tsx +187 -0
  710. package/src/components/ui/tooltip.tsx +96 -0
  711. package/src/components/ui/translate.tsx +203 -0
  712. package/src/components/ui/upload.tsx +118 -0
  713. package/src/components/ui/use-toast.ts +185 -0
  714. package/src/hooks/index.ts +10 -0
  715. package/src/hooks/use-media-query.ts +74 -0
  716. package/src/hooks/use-theme.ts +5 -0
  717. package/src/i18n/index.ts +35 -0
  718. package/src/i18n/provider.tsx +82 -0
  719. package/src/i18n/strings.ts +196 -0
  720. package/src/i18n/types.ts +95 -0
  721. package/src/index.ts +348 -0
  722. package/src/lib/utils.ts +10 -0
  723. package/src/primitives/index.ts +8 -0
  724. package/src/primitives/polymorphic.tsx +52 -0
  725. package/src/providers/index.ts +20 -0
  726. package/src/providers/router-provider.tsx +99 -0
  727. package/src/providers/theme-provider.tsx +218 -0
  728. package/src/providers/theme-script.tsx +135 -0
@@ -0,0 +1,160 @@
1
+ import { Slot } from '@radix-ui/react-slot'
2
+ import { cva, type VariantProps } from 'class-variance-authority'
3
+ import * as React from 'react'
4
+ import { cn } from '../../lib/utils'
5
+
6
+ /**
7
+ * Variants du bouton DSFR
8
+ * Conforme au design system : https://www.systeme-de-design.gouv.fr/elements-d-interface/composants/bouton
9
+ */
10
+ const buttonVariants = cva(
11
+ // Classes de base - DSFR n'utilise pas de border-radius
12
+ 'inline-flex items-center justify-center gap-2 font-bold transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:bg-background-contrast disabled:text-foreground-disabled disabled:shadow-none',
13
+ {
14
+ variants: {
15
+ variant: {
16
+ // Bouton primaire - fond bleu france
17
+ primary:
18
+ 'bg-primary text-primary-foreground hover:bg-primary-hover active:bg-primary-active',
19
+ // Bouton secondaire DSFR - bordure bleu france, fond transparent, survol fond bleu très clair
20
+ secondary:
21
+ 'bg-transparent text-primary shadow-[inset_0_0_0_1px_currentColor] hover:bg-background-open-blue-france active:bg-background-open-blue-france/80',
22
+ // Bouton tertiaire DSFR - bordure grise, fond transparent
23
+ tertiary:
24
+ 'bg-transparent text-primary shadow-sm ring-1 ring-inset ring-border hover:bg-background-contrast active:bg-background-contrast/80',
25
+ // Bouton tertiaire sans contour (ghost) - sans bordure
26
+ ghost: 'bg-transparent text-primary hover:bg-muted active:bg-background-contrast',
27
+ // Variantes sémantiques
28
+ destructive: 'bg-destructive text-foreground-inverted hover:opacity-90 active:opacity-80',
29
+ danger: 'bg-destructive text-foreground-inverted hover:opacity-90 active:opacity-80',
30
+ success: 'bg-success text-foreground-inverted hover:opacity-90 active:opacity-80',
31
+ warning: 'bg-warning text-foreground-inverted hover:opacity-90 active:opacity-80',
32
+ // Bouton lien
33
+ link: 'bg-transparent text-primary underline underline-offset-4 hover:text-primary-hover',
34
+ },
35
+ size: {
36
+ // Tailles DSFR officielles
37
+ sm: 'min-h-8 py-1 px-3 text-sm leading-6',
38
+ md: 'min-h-10 py-2 px-4 text-base leading-6',
39
+ lg: 'min-h-12 py-3 px-6 text-lg leading-6',
40
+ },
41
+ fullWidth: {
42
+ true: 'w-full flex',
43
+ false: '',
44
+ },
45
+ },
46
+ defaultVariants: {
47
+ variant: 'primary',
48
+ size: 'md',
49
+ fullWidth: false,
50
+ },
51
+ }
52
+ )
53
+
54
+ export interface ButtonProps
55
+ extends React.ButtonHTMLAttributes<HTMLButtonElement>,
56
+ VariantProps<typeof buttonVariants> {
57
+ /**
58
+ * Si true, rend le composant enfant au lieu d'un bouton
59
+ * Utile pour l'intégration avec les routeurs (Next.js, React Router, etc.)
60
+ */
61
+ asChild?: boolean
62
+ /**
63
+ * L'icône à afficher dans le bouton (ex: `<RemixIcon />`)
64
+ */
65
+ icon?: React.ReactNode
66
+ /**
67
+ * La position de l'icône ('start' ou 'end'). Par défaut: 'start'
68
+ */
69
+ iconPosition?: 'start' | 'end'
70
+ /**
71
+ * Si true, affiche un spinner de chargement et désactive le bouton
72
+ */
73
+ loading?: boolean
74
+ }
75
+
76
+ /**
77
+ * Composant Button DSFR
78
+ */
79
+ const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
80
+ (
81
+ {
82
+ className,
83
+ variant,
84
+ size,
85
+ fullWidth,
86
+ asChild = false,
87
+ icon,
88
+ iconPosition = 'start',
89
+ loading = false,
90
+ disabled,
91
+ children,
92
+ ...props
93
+ },
94
+ ref
95
+ ) => {
96
+ const isActuallyDisabled = disabled || loading
97
+
98
+ const actualIcon = loading ? (
99
+ <svg
100
+ className="animate-spin h-5 w-5 text-current"
101
+ xmlns="http://www.w3.org/2000/svg"
102
+ fill="none"
103
+ viewBox="0 0 24 24"
104
+ >
105
+ <circle
106
+ className="opacity-25"
107
+ cx="12"
108
+ cy="12"
109
+ r="10"
110
+ stroke="currentColor"
111
+ strokeWidth="4"
112
+ />
113
+ <path
114
+ className="opacity-75"
115
+ fill="currentColor"
116
+ d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
117
+ />
118
+ </svg>
119
+ ) : (
120
+ icon
121
+ )
122
+
123
+ if (asChild) {
124
+ return (
125
+ <Slot
126
+ className={cn(buttonVariants({ variant, size, fullWidth, className }))}
127
+ ref={ref}
128
+ {...props}
129
+ >
130
+ {children}
131
+ </Slot>
132
+ )
133
+ }
134
+
135
+ return (
136
+ <button
137
+ className={cn(buttonVariants({ variant, size, fullWidth, className }))}
138
+ ref={ref}
139
+ disabled={isActuallyDisabled}
140
+ {...props}
141
+ >
142
+ {actualIcon && iconPosition === 'start' && (
143
+ <span className="flex-shrink-0 flex items-center justify-center" aria-hidden="true">
144
+ {actualIcon}
145
+ </span>
146
+ )}
147
+ {children}
148
+ {actualIcon && iconPosition === 'end' && (
149
+ <span className="flex-shrink-0 flex items-center justify-center" aria-hidden="true">
150
+ {actualIcon}
151
+ </span>
152
+ )}
153
+ </button>
154
+ )
155
+ }
156
+ )
157
+
158
+ Button.displayName = 'Button'
159
+
160
+ export { Button, buttonVariants }
@@ -0,0 +1,159 @@
1
+ 'use client'
2
+
3
+ import type * as React from 'react'
4
+ import { DayPicker } from 'react-day-picker'
5
+ import { cn } from '../../lib/utils'
6
+ import { buttonVariants } from './button'
7
+
8
+ export type CalendarProps = React.ComponentProps<typeof DayPicker>
9
+
10
+ /**
11
+ * Composant de calendrier interactif basé sur react-day-picker v9.
12
+ * Conçu pour s'intégrer harmonieusement avec le DSFR et les DatePickers complexes.
13
+ */
14
+ function Calendar({ className, classNames, showOutsideDays = true, ...props }: CalendarProps) {
15
+ return (
16
+ <DayPicker
17
+ showOutsideDays={showOutsideDays}
18
+ className={cn('relative p-3 w-fit', className)}
19
+ classNames={{
20
+ root: '',
21
+ months: 'flex flex-col sm:flex-row space-y-2 sm:space-y-0',
22
+ month: 'space-y-2',
23
+ month_caption: 'flex justify-center items-center h-8 mb-2',
24
+ caption_label:
25
+ 'flex items-center gap-1 text-sm font-bold text-foreground-title rdp-caption_label',
26
+ nav: 'flex items-center justify-between absolute inset-x-0 top-3 z-10 h-8 px-1',
27
+ button_previous: cn(
28
+ buttonVariants({ variant: 'ghost' }),
29
+ 'h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100 flex items-center justify-center'
30
+ ),
31
+ button_next: cn(
32
+ buttonVariants({ variant: 'ghost' }),
33
+ 'h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100 flex items-center justify-center'
34
+ ),
35
+ month_grid: 'w-full border-collapse',
36
+ weekdays: 'flex',
37
+ weekday: 'text-foreground-muted w-9 font-normal text-[0.8rem] text-center',
38
+ week: 'flex w-full mt-1',
39
+ day: cn(
40
+ 'h-9 w-9 p-0 text-center text-sm relative group',
41
+ 'focus-within:relative focus-within:z-20'
42
+ ),
43
+ day_button: cn(
44
+ 'inline-flex items-center justify-center transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:bg-background-contrast disabled:opacity-50',
45
+ 'bg-transparent hover:bg-background-open-blue-france active:bg-background-open-blue-france/80',
46
+ 'h-9 w-9 p-0 font-normal rounded-md',
47
+ 'aria-selected:bg-primary aria-selected:text-primary-foreground aria-selected:hover:bg-primary-hover aria-selected:active:bg-primary-active aria-selected:font-bold'
48
+ ),
49
+ selected: 'bg-background-contrast font-bold text-primary',
50
+ today: 'bg-background-contrast font-bold text-primary',
51
+ outside:
52
+ 'text-foreground-muted opacity-50 aria-selected:bg-background-open-blue-france/50 aria-selected:text-foreground-muted aria-selected:opacity-30',
53
+ disabled: 'text-foreground-muted opacity-50',
54
+ hidden: 'invisible',
55
+ range_middle:
56
+ '!bg-background-open-blue-france !text-primary rounded-none hover:!bg-background-open-blue-france/80 aria-selected:!bg-background-open-blue-france aria-selected:!text-primary',
57
+ range_end: 'rounded-r-md rounded-l-none',
58
+ range_start: 'rounded-l-md rounded-r-none',
59
+ dropdowns: 'flex items-center justify-center gap-2 rdp-dropdowns z-20',
60
+ dropdown_root:
61
+ 'relative inline-flex items-center gap-1 font-bold text-sm text-foreground-title hover:text-primary [&_select]:absolute [&_select]:inset-0 [&_select]:w-full [&_select]:h-full [&_select]:opacity-0 [&_select]:cursor-pointer [&_select]:z-10',
62
+ dropdown: 'flex items-center',
63
+ months_dropdown: '',
64
+ years_dropdown: '',
65
+ dropdown_icon: 'h-4 w-4 opacity-50 shrink-0',
66
+ ...classNames,
67
+ }}
68
+ components={{
69
+ Chevron: (chevronProps) => {
70
+ if (chevronProps.orientation === 'left') {
71
+ return (
72
+ <svg
73
+ xmlns="http://www.w3.org/2000/svg"
74
+ width="24"
75
+ height="24"
76
+ viewBox="0 0 24 24"
77
+ fill="none"
78
+ aria-hidden="true"
79
+ stroke="currentColor"
80
+ strokeWidth="2"
81
+ strokeLinecap="round"
82
+ strokeLinejoin="round"
83
+ className="h-4 w-4"
84
+ >
85
+ <path d="m15 18-6-6 6-6" />
86
+ </svg>
87
+ )
88
+ }
89
+ if (chevronProps.orientation === 'down') {
90
+ return (
91
+ <svg
92
+ xmlns="http://www.w3.org/2000/svg"
93
+ width="24"
94
+ height="24"
95
+ viewBox="0 0 24 24"
96
+ fill="none"
97
+ aria-hidden="true"
98
+ stroke="currentColor"
99
+ strokeWidth="2"
100
+ strokeLinecap="round"
101
+ strokeLinejoin="round"
102
+ className="h-4 w-4"
103
+ >
104
+ <path d="m6 9 6 6 6-6" />
105
+ </svg>
106
+ )
107
+ }
108
+ if (chevronProps.orientation === 'up') {
109
+ return (
110
+ <svg
111
+ xmlns="http://www.w3.org/2000/svg"
112
+ width="24"
113
+ height="24"
114
+ viewBox="0 0 24 24"
115
+ fill="none"
116
+ aria-hidden="true"
117
+ stroke="currentColor"
118
+ strokeWidth="2"
119
+ strokeLinecap="round"
120
+ strokeLinejoin="round"
121
+ className="h-4 w-4"
122
+ >
123
+ <path d="m18 15-6-6-6 6" />
124
+ </svg>
125
+ )
126
+ }
127
+ return (
128
+ <svg
129
+ xmlns="http://www.w3.org/2000/svg"
130
+ width="24"
131
+ height="24"
132
+ viewBox="0 0 24 24"
133
+ fill="none"
134
+ aria-hidden="true"
135
+ stroke="currentColor"
136
+ strokeWidth="2"
137
+ strokeLinecap="round"
138
+ strokeLinejoin="round"
139
+ className="h-4 w-4"
140
+ >
141
+ <path d="m9 18 6-6-6-6" />
142
+ </svg>
143
+ )
144
+ },
145
+ }}
146
+ {...props}
147
+ />
148
+ )
149
+ }
150
+ Calendar.displayName = 'Calendar'
151
+
152
+ export { Calendar }
153
+
154
+ /**
155
+ * @example
156
+ * ```tsx
157
+ * <Calendar mode="single" selected={date} onSelect={setDate} />
158
+ * ```
159
+ */
@@ -0,0 +1,36 @@
1
+ import { render, screen } from '@testing-library/react'
2
+ import { describe, expect, it } from 'vitest'
3
+ import { Callout } from './callout'
4
+
5
+ describe('Component: Callout (DSFR)', () => {
6
+ it('should render a callout with a properly structured h3 title by default', () => {
7
+ render(<Callout title="A noter">Les inscriptions se terminent ce soir.</Callout>)
8
+
9
+ const titleObj = screen.getByRole('heading', { level: 3, name: 'A noter' })
10
+ expect(titleObj).toBeInTheDocument()
11
+ expect(screen.getByText('Les inscriptions se terminent ce soir.')).toBeInTheDocument()
12
+ })
13
+
14
+ it('should respect semantic DOM modifications through titleMarkup', () => {
15
+ render(
16
+ <Callout title="Attention" titleMarkup="h2">
17
+ Alerte enlèvement
18
+ </Callout>
19
+ )
20
+
21
+ // Check if the title is actually rendered as an H2
22
+ const h2Title = screen.getByRole('heading', { level: 2, name: 'Attention' })
23
+ expect(h2Title).toBeInTheDocument()
24
+ })
25
+
26
+ it('should inject actionable content at the bottom', () => {
27
+ render(<Callout action={<button type="button">S'inscrire</button>}>Rejoignez-nous!</Callout>)
28
+ expect(screen.getByRole('button', { name: "S'inscrire" })).toBeInTheDocument()
29
+ })
30
+
31
+ it('should map the specific DSFR styling for info variant', () => {
32
+ const { container } = render(<Callout accent="info">Information</Callout>)
33
+ // Inspect the outer div
34
+ expect(container.firstChild).toHaveClass('border-l-info', 'bg-info-background')
35
+ })
36
+ })
@@ -0,0 +1,131 @@
1
+ import { cva, type VariantProps } from 'class-variance-authority'
2
+ import * as React from 'react'
3
+ import { cn } from '../../lib/utils'
4
+
5
+ /**
6
+ * Composant Callout DSFR ("Mise en avant")
7
+ * Conforme au design system : https://www.systeme-de-design.gouv.fr/elements-d-interface/composants/mise-en-avant
8
+ *
9
+ * Bloc de mise en avant avec bordure gauche épaisse colorée et fond adaptatif.
10
+ * Utilisé pour mettre en valeur une information clé.
11
+ */
12
+
13
+ const calloutVariants = cva(
14
+ // Base DSFR : bordure gauche épaisse (4px), pas de border-radius, fond adaptatif
15
+ 'relative w-full border-l-[4px] transition-colors',
16
+ {
17
+ variants: {
18
+ accent: {
19
+ // Default : bordure bleue france, fond alt
20
+ default: 'bg-muted border-l-primary text-foreground',
21
+ // Statuts
22
+ info: 'bg-info-background border-l-info text-info',
23
+ success: 'bg-success-background border-l-success text-success',
24
+ warning: 'bg-warning-background border-l-warning text-warning',
25
+ error: 'bg-destructive-background border-l-destructive text-destructive',
26
+ // Accentuations DSFR
27
+ 'green-tilleul-verveine':
28
+ 'bg-[var(--background-contrast-green-tilleul-verveine)] border-l-[var(--border-default-green-tilleul-verveine)] text-[var(--text-label-green-tilleul-verveine)]',
29
+ 'green-bourgeon':
30
+ 'bg-[var(--background-contrast-green-bourgeon)] border-l-[var(--border-default-green-bourgeon)] text-[var(--text-label-green-bourgeon)]',
31
+ 'green-emeraude':
32
+ 'bg-[var(--background-contrast-green-emeraude)] border-l-[var(--border-default-green-emeraude)] text-[var(--text-label-green-emeraude)]',
33
+ 'green-menthe':
34
+ 'bg-[var(--background-contrast-green-menthe)] border-l-[var(--border-default-green-menthe)] text-[var(--text-label-green-menthe)]',
35
+ 'green-archipel':
36
+ 'bg-[var(--background-contrast-green-archipel)] border-l-[var(--border-default-green-archipel)] text-[var(--text-label-green-archipel)]',
37
+ 'blue-ecume':
38
+ 'bg-[var(--background-contrast-blue-ecume)] border-l-[var(--border-default-blue-ecume)] text-[var(--text-label-blue-ecume)]',
39
+ 'blue-cumulus':
40
+ 'bg-[var(--background-contrast-blue-cumulus)] border-l-[var(--border-default-blue-cumulus)] text-[var(--text-label-blue-cumulus)]',
41
+ 'purple-glycine':
42
+ 'bg-[var(--background-contrast-purple-glycine)] border-l-[var(--border-default-purple-glycine)] text-[var(--text-label-purple-glycine)]',
43
+ 'pink-macaron':
44
+ 'bg-[var(--background-contrast-pink-macaron)] border-l-[var(--border-default-pink-macaron)] text-[var(--text-label-pink-macaron)]',
45
+ 'pink-tuile':
46
+ 'bg-[var(--background-contrast-pink-tuile)] border-l-[var(--border-default-pink-tuile)] text-[var(--text-label-pink-tuile)]',
47
+ 'yellow-tournesol':
48
+ 'bg-[var(--background-contrast-yellow-tournesol)] border-l-[var(--border-default-yellow-tournesol)] text-[var(--text-label-yellow-tournesol)]',
49
+ 'yellow-moutarde':
50
+ 'bg-[var(--background-contrast-yellow-moutarde)] border-l-[var(--border-default-yellow-moutarde)] text-[var(--text-label-yellow-moutarde)]',
51
+ 'orange-terre-battue':
52
+ 'bg-[var(--background-contrast-orange-terre-battue)] border-l-[var(--border-default-orange-terre-battue)] text-[var(--text-label-orange-terre-battue)]',
53
+ 'brown-cafe-creme':
54
+ 'bg-[var(--background-contrast-brown-cafe-creme)] border-l-[var(--border-default-brown-cafe-creme)] text-[var(--text-label-brown-cafe-creme)]',
55
+ 'brown-caramel':
56
+ 'bg-[var(--background-contrast-brown-caramel)] border-l-[var(--border-default-brown-caramel)] text-[var(--text-label-brown-caramel)]',
57
+ 'brown-opera':
58
+ 'bg-[var(--background-contrast-brown-opera)] border-l-[var(--border-default-brown-opera)] text-[var(--text-label-brown-opera)]',
59
+ 'beige-gris-galet':
60
+ 'bg-[var(--background-contrast-beige-gris-galet)] border-l-[var(--border-default-beige-gris-galet)] text-[var(--text-label-beige-gris-galet)]',
61
+ },
62
+ size: {
63
+ sm: 'px-3 py-3 text-sm',
64
+ md: 'px-4 py-4 text-base',
65
+ lg: 'px-5 py-5 text-lg',
66
+ },
67
+ },
68
+ defaultVariants: {
69
+ accent: 'default',
70
+ size: 'md',
71
+ },
72
+ }
73
+ )
74
+
75
+ export interface CalloutProps
76
+ extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'>,
77
+ VariantProps<typeof calloutVariants> {
78
+ /** Titre optionnel affiché en gras au-dessus du contenu */
79
+ title?: React.ReactNode
80
+ /**
81
+ * Niveau sémantique du titre.
82
+ * Modifie la balise générée (h2-h6, p, div, span) tout en gardant l'apparence visuelle.
83
+ * @default "h3"
84
+ */
85
+ titleMarkup?: 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'div' | 'span'
86
+ /** Icône optionnelle à afficher avant le titre */
87
+ icon?: React.ReactNode
88
+ /** Composant optionnel de bouton d'action affiché en bas de la mise en avant */
89
+ action?: React.ReactNode
90
+ }
91
+
92
+ const Callout = React.forwardRef<HTMLDivElement, CalloutProps>(
93
+ (
94
+ { className, accent, size, title, titleMarkup = 'h3', icon, action, children, ...props },
95
+ ref
96
+ ) => {
97
+ const TitleTag = titleMarkup
98
+
99
+ return (
100
+ <div ref={ref} className={cn(calloutVariants({ accent, size }), className)} {...props}>
101
+ {(icon || title) && (
102
+ <div className="flex items-start gap-2 mb-2">
103
+ {icon && (
104
+ <span className="mt-0.5 shrink-0 text-current" aria-hidden="true">
105
+ {icon}
106
+ </span>
107
+ )}
108
+ {title && (
109
+ <TitleTag className="font-bold text-[1.125em] leading-snug m-0">{title}</TitleTag>
110
+ )}
111
+ </div>
112
+ )}
113
+ {children && <div className="mt-1">{children}</div>}
114
+ {action && <div className="mt-4">{action}</div>}
115
+ </div>
116
+ )
117
+ }
118
+ )
119
+
120
+ Callout.displayName = 'Callout'
121
+
122
+ export { Callout, calloutVariants }
123
+
124
+ /**
125
+ * @example
126
+ * ```tsx
127
+ * <Callout title="Attention">
128
+ * Ceci est une information importante.
129
+ * </Callout>
130
+ * ```
131
+ */
@@ -0,0 +1,151 @@
1
+ import { cva, type VariantProps } from 'class-variance-authority'
2
+ import * as React from 'react'
3
+ import { cn } from '../../lib/utils'
4
+
5
+ /**
6
+ * Variants de la carte DSFR
7
+ * Conforme au design system : https://www.systeme-de-design.gouv.fr/elements-d-interface/composants/carte
8
+ *
9
+ * Les cartes DSFR n'ont pas de border-radius et utilisent des bordures fines
10
+ */
11
+ const cardVariants = cva(
12
+ // Base DSFR : pas de border-radius, fond adaptatif au thème, flex column
13
+ 'flex flex-col relative bg-background transition-colors',
14
+ {
15
+ variants: {
16
+ variant: {
17
+ // Default : bordure grise fine sur tous les côtés
18
+ default: 'border border-border',
19
+ // Bordered : bordure bleue
20
+ bordered: 'border-2 border-primary',
21
+ // Shadow : avec ombre portée
22
+ shadow: 'shadow-md hover:shadow-lg border border-border',
23
+ // Ghost : sans bordure
24
+ ghost: 'border-transparent',
25
+ // Outlined : bordure simple sans hover
26
+ outlined: 'border border-border',
27
+ },
28
+ size: {
29
+ sm: '',
30
+ md: '',
31
+ lg: '',
32
+ },
33
+ },
34
+ defaultVariants: {
35
+ variant: 'default',
36
+ size: 'md',
37
+ },
38
+ }
39
+ )
40
+
41
+ export interface CardProps
42
+ extends React.HTMLAttributes<HTMLDivElement>,
43
+ VariantProps<typeof cardVariants> {}
44
+
45
+ /**
46
+ * Composant Card DSFR
47
+ *
48
+ * @example
49
+ * ```tsx
50
+ * <Card>
51
+ * <CardHeader>
52
+ * <CardTitle>Titre de la carte</CardTitle>
53
+ * <CardDescription>Description de la carte</CardDescription>
54
+ * </CardHeader>
55
+ * <CardContent>
56
+ * Contenu de la carte
57
+ * </CardContent>
58
+ * <CardFooter>
59
+ * <Button>Action</Button>
60
+ * </CardFooter>
61
+ * </Card>
62
+ * ```
63
+ */
64
+ const Card = React.forwardRef<HTMLDivElement, CardProps>(
65
+ ({ className, variant, size, ...props }, ref) => {
66
+ return <div ref={ref} className={cn(cardVariants({ variant, size, className }))} {...props} />
67
+ }
68
+ )
69
+
70
+ Card.displayName = 'Card'
71
+
72
+ /**
73
+ * En-tête de carte DSFR (pour l'image ou les badges, et très souvent les titres/descriptions)
74
+ */
75
+ const CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
76
+ ({ className, ...props }, ref) => (
77
+ <div
78
+ ref={ref}
79
+ className={cn('relative flex-shrink-0 flex flex-col gap-1 px-6 pt-6', className)}
80
+ {...props}
81
+ />
82
+ )
83
+ )
84
+ CardHeader.displayName = 'CardHeader'
85
+
86
+ /**
87
+ * Corps de carte DSFR
88
+ * Conforme DSFR : padding latéral 16px, vertical 16px haut / 32px bas
89
+ */
90
+ const CardBody = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
91
+ ({ className, ...props }, ref) => (
92
+ <div ref={ref} className={cn('flex flex-col flex-1 px-6 pt-2 pb-8', className)} {...props} />
93
+ )
94
+ )
95
+ CardBody.displayName = 'CardBody'
96
+
97
+ /**
98
+ * Titre de carte DSFR
99
+ */
100
+ const CardTitle = React.forwardRef<HTMLHeadingElement, React.HTMLAttributes<HTMLHeadingElement>>(
101
+ ({ className, ...props }, ref) => (
102
+ <h3
103
+ ref={ref}
104
+ className={cn('text-lg font-bold leading-6 text-foreground-title', className)}
105
+ {...props}
106
+ />
107
+ )
108
+ )
109
+ CardTitle.displayName = 'CardTitle'
110
+
111
+ /**
112
+ * Description de carte DSFR
113
+ */
114
+ const CardDescription = React.forwardRef<
115
+ HTMLParagraphElement,
116
+ React.HTMLAttributes<HTMLParagraphElement>
117
+ >(({ className, ...props }, ref) => (
118
+ <p ref={ref} className={cn('text-sm leading-6 text-foreground', className)} {...props} />
119
+ ))
120
+ CardDescription.displayName = 'CardDescription'
121
+
122
+ /**
123
+ * Contenu de carte DSFR (alias de CardBody pour compatibilité)
124
+ */
125
+ const CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
126
+ ({ className, ...props }, ref) => (
127
+ <div ref={ref} className={cn('flex flex-col flex-1 px-4 pt-4 pb-8', className)} {...props} />
128
+ )
129
+ )
130
+ CardContent.displayName = 'CardContent'
131
+
132
+ /**
133
+ * Pied de carte DSFR — aligné sur le bas du body avec le bon padding
134
+ */
135
+ const CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
136
+ ({ className, ...props }, ref) => (
137
+ <div ref={ref} className={cn('flex items-center gap-4 px-4 pb-4', className)} {...props} />
138
+ )
139
+ )
140
+ CardFooter.displayName = 'CardFooter'
141
+
142
+ export {
143
+ Card,
144
+ CardBody,
145
+ CardContent,
146
+ CardDescription,
147
+ CardFooter,
148
+ CardHeader,
149
+ CardTitle,
150
+ cardVariants,
151
+ }
@@ -0,0 +1,38 @@
1
+ import { render, screen } from '@testing-library/react'
2
+ import userEvent from '@testing-library/user-event'
3
+ import { describe, expect, it } from 'vitest'
4
+ import { Checkbox } from './checkbox'
5
+
6
+ describe('Component: Checkbox (DSFR/Radix)', () => {
7
+ it('should guarantee base accessibility (id, labels linking)', async () => {
8
+ const user = userEvent.setup()
9
+
10
+ render(
11
+ <Checkbox label="Je déclare avoir lu les conditions" hint="Obligatoire pour poursuivre" />
12
+ )
13
+
14
+ // Radix Checkbox defines its role
15
+ const checkbox = screen.getByRole('checkbox', { name: 'Je déclare avoir lu les conditions' })
16
+ expect(checkbox).toBeInTheDocument()
17
+ expect(checkbox).not.toBeChecked()
18
+
19
+ // Test clicking the label triggers the checkbox
20
+ const label = screen.getByText('Je déclare avoir lu les conditions')
21
+ await user.click(label)
22
+
23
+ expect(checkbox).toBeChecked()
24
+
25
+ // Test hint presence
26
+ expect(screen.getByText('Obligatoire pour poursuivre')).toBeInTheDocument()
27
+ })
28
+
29
+ it('should strictly tie aria-invalid when an error is flagged', () => {
30
+ render(<Checkbox label="Acceptation GCG" error="Vous devez accepter pour continuer" />)
31
+
32
+ const checkbox = screen.getByRole('checkbox')
33
+ expect(checkbox).toHaveAttribute('aria-invalid', 'true')
34
+
35
+ const errorMessage = screen.getByText('Vous devez accepter pour continuer')
36
+ expect(errorMessage).toHaveClass('text-error')
37
+ })
38
+ })