@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.
- package/README.md +115 -0
- package/dist/artwork-B3QGyilb.d.mts +156 -0
- package/dist/artwork-B3QGyilb.d.ts +156 -0
- package/dist/artwork-CW2iQ_23.d.mts +171 -0
- package/dist/artwork-CW2iQ_23.d.ts +171 -0
- package/dist/chunk-23I7BDV6.mjs +39 -0
- package/dist/chunk-24DYKVTR.mjs +144 -0
- package/dist/chunk-2BB27XUW.mjs +65 -0
- package/dist/chunk-2BJMVHYD.mjs +137 -0
- package/dist/chunk-2EW2GCGT.mjs +137 -0
- package/dist/chunk-2HZIFFGX.mjs +144 -0
- package/dist/chunk-2LHWW7HN.mjs +114 -0
- package/dist/chunk-2LXQNL5D.mjs +113 -0
- package/dist/chunk-2NH3AUHW.mjs +79 -0
- package/dist/chunk-2PJ4EU56.mjs +203 -0
- package/dist/chunk-2QH4KMWT.mjs +8 -0
- package/dist/chunk-2RNER4KC.mjs +144 -0
- package/dist/chunk-2U3S73BF.mjs +8 -0
- package/dist/chunk-2V722J6M.mjs +8 -0
- package/dist/chunk-37CO3FHD.mjs +125 -0
- package/dist/chunk-3BTPUF5K.mjs +144 -0
- package/dist/chunk-3GBCT2U3.mjs +156 -0
- package/dist/chunk-3HHH4GMH.mjs +110 -0
- package/dist/chunk-3IMYMASJ.mjs +194 -0
- package/dist/chunk-3J555ZVB.mjs +122 -0
- package/dist/chunk-3JFXRCOL.mjs +1 -0
- package/dist/chunk-3JUY36HV.mjs +127 -0
- package/dist/chunk-3THML6BJ.mjs +22 -0
- package/dist/chunk-3VPGNSKX.mjs +834 -0
- package/dist/chunk-3YSDF6VX.mjs +221 -0
- package/dist/chunk-43XOENR2.mjs +53 -0
- package/dist/chunk-43ZFDH2Q.mjs +122 -0
- package/dist/chunk-44UGQHBU.mjs +166 -0
- package/dist/chunk-474LZSO7.mjs +122 -0
- package/dist/chunk-4KCVV4LR.mjs +156 -0
- package/dist/chunk-4LGWCPN4.mjs +92 -0
- package/dist/chunk-4LVHKND5.mjs +129 -0
- package/dist/chunk-4NU2XZIG.mjs +137 -0
- package/dist/chunk-4PA73RZ4.mjs +221 -0
- package/dist/chunk-4UBXW6O2.mjs +63 -0
- package/dist/chunk-4ZFM6M7C.mjs +127 -0
- package/dist/chunk-52BJN7DC.mjs +504 -0
- package/dist/chunk-53M2BTB5.mjs +22 -0
- package/dist/chunk-552MR22F.mjs +93 -0
- package/dist/chunk-57DNFR54.mjs +92 -0
- package/dist/chunk-5FHDLYYI.mjs +200 -0
- package/dist/chunk-5I2Y5M2K.mjs +514 -0
- package/dist/chunk-5IJLRY6P.mjs +504 -0
- package/dist/chunk-5IQADW3H.mjs +82 -0
- package/dist/chunk-5MEHDSPX.mjs +137 -0
- package/dist/chunk-5OYV672H.mjs +122 -0
- package/dist/chunk-5TQ2XLQH.mjs +91 -0
- package/dist/chunk-5WNMRXFG.mjs +137 -0
- package/dist/chunk-5ZBE6TNA.mjs +137 -0
- package/dist/chunk-5ZNBGCHW.mjs +105 -0
- package/dist/chunk-6AVQRAR3.mjs +729 -0
- package/dist/chunk-6BGCPIW7.mjs +127 -0
- package/dist/chunk-6BOEMNY4.mjs +94 -0
- package/dist/chunk-6FCPWBF2.mjs +137 -0
- package/dist/chunk-6HDE47EI.mjs +141 -0
- package/dist/chunk-6OSSG7EX.mjs +291 -0
- package/dist/chunk-6U5FC3RG.mjs +85 -0
- package/dist/chunk-6XZ4GBJ6.mjs +83 -0
- package/dist/chunk-6YGKYFPL.mjs +137 -0
- package/dist/chunk-6Z77GLN6.mjs +72 -0
- package/dist/chunk-6ZP4SKO6.mjs +144 -0
- package/dist/chunk-6ZWOOE2S.mjs +60 -0
- package/dist/chunk-762QFXXR.mjs +141 -0
- package/dist/chunk-76L74JUY.mjs +115 -0
- package/dist/chunk-76VC5YPU.mjs +113 -0
- package/dist/chunk-7BWEILU6.mjs +95 -0
- package/dist/chunk-7DGUHXUB.mjs +156 -0
- package/dist/chunk-7DTPT7EQ.mjs +220 -0
- package/dist/chunk-7FDDD5IV.mjs +203 -0
- package/dist/chunk-7H6WDKNO.mjs +141 -0
- package/dist/chunk-7KDRU2XY.mjs +145 -0
- package/dist/chunk-7QZTUZPL.mjs +137 -0
- package/dist/chunk-7REZ747L.mjs +122 -0
- package/dist/chunk-7RV4WZVM.mjs +203 -0
- package/dist/chunk-7VT2ZJBR.mjs +122 -0
- package/dist/chunk-7XPLI6X6.mjs +129 -0
- package/dist/chunk-7XYNKZWU.mjs +32 -0
- package/dist/chunk-A5OCX7PW.mjs +141 -0
- package/dist/chunk-A734PEYB.mjs +20 -0
- package/dist/chunk-ACBEJHSN.mjs +89 -0
- package/dist/chunk-ADRORWCA.mjs +95 -0
- package/dist/chunk-AGELEW5Q.mjs +121 -0
- package/dist/chunk-AGFBCPPH.mjs +78 -0
- package/dist/chunk-AHDHVUSU.mjs +105 -0
- package/dist/chunk-AKXX5JM5.mjs +122 -0
- package/dist/chunk-AM2FMPVS.mjs +299 -0
- package/dist/chunk-AMLQ6RI2.mjs +72 -0
- package/dist/chunk-ARTXTVIX.mjs +156 -0
- package/dist/chunk-ARZVIKN2.mjs +114 -0
- package/dist/chunk-ATLMREKL.mjs +117 -0
- package/dist/chunk-AVN6NSOQ.mjs +504 -0
- package/dist/chunk-AWOTVASU.mjs +82 -0
- package/dist/chunk-AZWGY2SR.mjs +101 -0
- package/dist/chunk-B5T4EO6N.mjs +122 -0
- package/dist/chunk-BDPEOSAY.mjs +80 -0
- package/dist/chunk-BHUY7ML7.mjs +95 -0
- package/dist/chunk-BMGFO5X6.mjs +127 -0
- package/dist/chunk-BRDUOWC4.mjs +385 -0
- package/dist/chunk-BRX2NAAS.mjs +52 -0
- package/dist/chunk-BTFAMY6E.mjs +65 -0
- package/dist/chunk-C4BBQTZ3.mjs +20 -0
- package/dist/chunk-CEFGBZXZ.mjs +165 -0
- package/dist/chunk-CF6SPRDA.mjs +56 -0
- package/dist/chunk-CIOYPW7H.mjs +137 -0
- package/dist/chunk-CVGHZFZK.mjs +117 -0
- package/dist/chunk-D4XAI2WD.mjs +65 -0
- package/dist/chunk-DAECVI5O.mjs +113 -0
- package/dist/chunk-DD7O3SCJ.mjs +144 -0
- package/dist/chunk-DDQTQ7Z2.mjs +172 -0
- package/dist/chunk-DGYJH7JG.mjs +259 -0
- package/dist/chunk-DLRDFCPW.mjs +60 -0
- package/dist/chunk-DN67LFQR.mjs +81 -0
- package/dist/chunk-DOXA63UH.mjs +504 -0
- package/dist/chunk-DSU6MKPW.mjs +137 -0
- package/dist/chunk-DTK5B22N.mjs +65 -0
- package/dist/chunk-DTOWE2MA.mjs +89 -0
- package/dist/chunk-DUXLKXFH.mjs +91 -0
- package/dist/chunk-DW62DTCF.mjs +87 -0
- package/dist/chunk-DWGELT6B.mjs +21 -0
- package/dist/chunk-DX4476KH.mjs +831 -0
- package/dist/chunk-E63ZEQE4.mjs +732 -0
- package/dist/chunk-EA3TIJMP.mjs +196 -0
- package/dist/chunk-EA5VCJ4G.mjs +85 -0
- package/dist/chunk-EAZ6NHW3.mjs +141 -0
- package/dist/chunk-EBDDPXU3.mjs +122 -0
- package/dist/chunk-ELEGVKVJ.mjs +122 -0
- package/dist/chunk-EX3RF7CE.mjs +294 -0
- package/dist/chunk-EXL24QAL.mjs +95 -0
- package/dist/chunk-F3W67E3Q.mjs +22 -0
- package/dist/chunk-F4A4IDZT.mjs +116 -0
- package/dist/chunk-FA7MQI6D.mjs +36 -0
- package/dist/chunk-FDFTH2OA.mjs +90 -0
- package/dist/chunk-FDRHBZZC.mjs +144 -0
- package/dist/chunk-FG3S54WT.mjs +211 -0
- package/dist/chunk-FI3PDDER.mjs +122 -0
- package/dist/chunk-FIXSMDQ7.mjs +141 -0
- package/dist/chunk-FK6JIEEN.mjs +516 -0
- package/dist/chunk-FL5D63D7.mjs +71 -0
- package/dist/chunk-FMWN44M7.mjs +92 -0
- package/dist/chunk-FNJYYQWC.mjs +60 -0
- package/dist/chunk-FNW7PJBZ.mjs +64 -0
- package/dist/chunk-FNWRRTCO.mjs +39 -0
- package/dist/chunk-FW4K4W3K.mjs +141 -0
- package/dist/chunk-GERPY3SW.mjs +63 -0
- package/dist/chunk-GKDVJ2TL.mjs +95 -0
- package/dist/chunk-GLRU4LYS.mjs +504 -0
- package/dist/chunk-GVW4A5MT.mjs +60 -0
- package/dist/chunk-GXJ5KSWO.mjs +165 -0
- package/dist/chunk-GZGPV2GH.mjs +122 -0
- package/dist/chunk-H3MN7LXP.mjs +36 -0
- package/dist/chunk-H7FFO2UX.mjs +121 -0
- package/dist/chunk-H7PNKXKX.mjs +56 -0
- package/dist/chunk-HAAWMTFK.mjs +98 -0
- package/dist/chunk-HFWOG3A4.mjs +137 -0
- package/dist/chunk-HGZHZHVX.mjs +47 -0
- package/dist/chunk-HP6JAQYJ.mjs +94 -0
- package/dist/chunk-HU4E64GQ.mjs +71 -0
- package/dist/chunk-HVKU5XVM.mjs +53 -0
- package/dist/chunk-HXQU5KQU.mjs +95 -0
- package/dist/chunk-IFYYNQ45.mjs +58 -0
- package/dist/chunk-IHMJCY2Z.mjs +87 -0
- package/dist/chunk-IHWNEZFG.mjs +36 -0
- package/dist/chunk-IM6BEVG6.mjs +71 -0
- package/dist/chunk-INM7YQKC.mjs +127 -0
- package/dist/chunk-IOD6W4YR.mjs +127 -0
- package/dist/chunk-IRDSRZ6X.mjs +62 -0
- package/dist/chunk-ITVUL6I2.mjs +98 -0
- package/dist/chunk-JAJOT3LV.mjs +87 -0
- package/dist/chunk-JAWTBRNS.mjs +122 -0
- package/dist/chunk-JR35S45U.mjs +22 -0
- package/dist/chunk-JWP5ZC5R.mjs +122 -0
- package/dist/chunk-JXBXEIER.mjs +126 -0
- package/dist/chunk-KCTGBTKI.mjs +145 -0
- package/dist/chunk-KEVX5SBT.mjs +221 -0
- package/dist/chunk-KFCM7PTR.mjs +98 -0
- package/dist/chunk-KIIWOL5Y.mjs +144 -0
- package/dist/chunk-KJ22LZMS.mjs +122 -0
- package/dist/chunk-KLJX3KQD.mjs +291 -0
- package/dist/chunk-KLMBFT3I.mjs +137 -0
- package/dist/chunk-KQPVSMIE.mjs +119 -0
- package/dist/chunk-KSK2RMP2.mjs +91 -0
- package/dist/chunk-KVVAUT3G.mjs +104 -0
- package/dist/chunk-KYKGI5BT.mjs +29 -0
- package/dist/chunk-L56KCHUI.mjs +116 -0
- package/dist/chunk-L65SLADH.mjs +137 -0
- package/dist/chunk-LASIEVVD.mjs +185 -0
- package/dist/chunk-LCTUVPNY.mjs +297 -0
- package/dist/chunk-LNHBVSNL.mjs +60 -0
- package/dist/chunk-LO5DFSJW.mjs +145 -0
- package/dist/chunk-LZRZUFF7.mjs +145 -0
- package/dist/chunk-M2LTIUBU.mjs +122 -0
- package/dist/chunk-M3KPXPDL.mjs +29 -0
- package/dist/chunk-M4PKDGE6.mjs +84 -0
- package/dist/chunk-M5SSDTTI.mjs +144 -0
- package/dist/chunk-MEJPZHAU.mjs +137 -0
- package/dist/chunk-ML7LO7IA.mjs +117 -0
- package/dist/chunk-MMILCSIS.mjs +228 -0
- package/dist/chunk-MNRZGIJQ.mjs +71 -0
- package/dist/chunk-MR6L2TFX.mjs +108 -0
- package/dist/chunk-MSNX3AR7.mjs +77 -0
- package/dist/chunk-MTLKC5UG.mjs +52 -0
- package/dist/chunk-MVEJMLQV.mjs +121 -0
- package/dist/chunk-MXMPDB4C.mjs +115 -0
- package/dist/chunk-N4RS42JQ.mjs +95 -0
- package/dist/chunk-N57TKKRF.mjs +156 -0
- package/dist/chunk-NF7PDBLJ.mjs +137 -0
- package/dist/chunk-NFEGQZI6.mjs +137 -0
- package/dist/chunk-NFXJSDUN.mjs +141 -0
- package/dist/chunk-NIWPLXZV.mjs +156 -0
- package/dist/chunk-NLA4YXGL.mjs +514 -0
- package/dist/chunk-NMLAW5NT.mjs +122 -0
- package/dist/chunk-NR66XXLN.mjs +156 -0
- package/dist/chunk-NRMIWRV6.mjs +297 -0
- package/dist/chunk-NWFMBDRM.mjs +24 -0
- package/dist/chunk-NXDYVTFV.mjs +122 -0
- package/dist/chunk-O42L54HQ.mjs +64 -0
- package/dist/chunk-O6DX3UFY.mjs +144 -0
- package/dist/chunk-O6H6FK6Y.mjs +137 -0
- package/dist/chunk-OD2MYXSX.mjs +117 -0
- package/dist/chunk-OHDAB5RA.mjs +514 -0
- package/dist/chunk-OIVUFVD4.mjs +122 -0
- package/dist/chunk-OKNSXEYQ.mjs +23 -0
- package/dist/chunk-OODDZ36D.mjs +221 -0
- package/dist/chunk-OPSBOV67.mjs +103 -0
- package/dist/chunk-OR2S4A6H.mjs +95 -0
- package/dist/chunk-OSLWGGF7.mjs +206 -0
- package/dist/chunk-OTBJ3BDC.mjs +137 -0
- package/dist/chunk-OZ37V2CL.mjs +116 -0
- package/dist/chunk-OZVAPU5J.mjs +127 -0
- package/dist/chunk-P2PN6HBO.mjs +95 -0
- package/dist/chunk-P3RTX23Z.mjs +133 -0
- package/dist/chunk-P5JZQIOK.mjs +103 -0
- package/dist/chunk-P7R26T3Z.mjs +145 -0
- package/dist/chunk-PGTGRJXX.mjs +122 -0
- package/dist/chunk-POBPYPUF.mjs +112 -0
- package/dist/chunk-PWUDSGHY.mjs +503 -0
- package/dist/chunk-PYQP4S3P.mjs +121 -0
- package/dist/chunk-Q4X44C4L.mjs +144 -0
- package/dist/chunk-QADKEWBW.mjs +91 -0
- package/dist/chunk-QEJXAPVP.mjs +193 -0
- package/dist/chunk-QEXXBZLP.mjs +137 -0
- package/dist/chunk-QFDUI4JF.mjs +137 -0
- package/dist/chunk-QIRIOLSQ.mjs +36 -0
- package/dist/chunk-QKZKXMDP.mjs +116 -0
- package/dist/chunk-QM44OKQB.mjs +110 -0
- package/dist/chunk-QUDEY3ZC.mjs +184 -0
- package/dist/chunk-QXBXBOPT.mjs +14 -0
- package/dist/chunk-R3HLKKGQ.mjs +200 -0
- package/dist/chunk-R7Q3PWPD.mjs +138 -0
- package/dist/chunk-RE55YFSX.mjs +70 -0
- package/dist/chunk-RH2JCZ3S.mjs +144 -0
- package/dist/chunk-RIHKQMJZ.mjs +71 -0
- package/dist/chunk-RLESRYZ7.mjs +141 -0
- package/dist/chunk-RN7K57U3.mjs +108 -0
- package/dist/chunk-RPZ6KAGN.mjs +156 -0
- package/dist/chunk-RSK73346.mjs +507 -0
- package/dist/chunk-RSYSJQNC.mjs +156 -0
- package/dist/chunk-RVYMEMGV.mjs +141 -0
- package/dist/chunk-RWQEGPN3.mjs +47 -0
- package/dist/chunk-RXUR5LHG.mjs +221 -0
- package/dist/chunk-RZCB3IFV.mjs +151 -0
- package/dist/chunk-RZJMZDH6.mjs +24 -0
- package/dist/chunk-S6BMBKPF.mjs +108 -0
- package/dist/chunk-S6BOOCIS.mjs +82 -0
- package/dist/chunk-S72JYZ34.mjs +205 -0
- package/dist/chunk-SAMWUGZH.mjs +200 -0
- package/dist/chunk-SF72OO5J.mjs +141 -0
- package/dist/chunk-SGES2MH4.mjs +141 -0
- package/dist/chunk-SH42XLB3.mjs +126 -0
- package/dist/chunk-SHZX3OGO.mjs +89 -0
- package/dist/chunk-SJLOQ3VX.mjs +113 -0
- package/dist/chunk-SJSM5PK5.mjs +110 -0
- package/dist/chunk-SUCVL4AR.mjs +127 -0
- package/dist/chunk-SZOFVBTZ.mjs +9 -0
- package/dist/chunk-SZPASZJ7.mjs +137 -0
- package/dist/chunk-T26S5SRN.mjs +52 -0
- package/dist/chunk-TAPPN5PM.mjs +72 -0
- package/dist/chunk-TCLGXTVU.mjs +221 -0
- package/dist/chunk-TFWWQZZK.mjs +89 -0
- package/dist/chunk-TGMDRDFD.mjs +127 -0
- package/dist/chunk-THEZTSDO.mjs +122 -0
- package/dist/chunk-TNHL4DWX.mjs +116 -0
- package/dist/chunk-TNKFYE4G.mjs +30 -0
- package/dist/chunk-TR24H7UQ.mjs +95 -0
- package/dist/chunk-TTMH3FVZ.mjs +119 -0
- package/dist/chunk-TTQCH2X2.mjs +113 -0
- package/dist/chunk-TXZDAPDU.mjs +129 -0
- package/dist/chunk-TY4VNBLX.mjs +137 -0
- package/dist/chunk-U3P6M5T4.mjs +127 -0
- package/dist/chunk-U6OTBZMO.mjs +507 -0
- package/dist/chunk-UB6RKUH5.mjs +89 -0
- package/dist/chunk-UDUTTGR5.mjs +89 -0
- package/dist/chunk-UENEQHEN.mjs +506 -0
- package/dist/chunk-UGGMZF3C.mjs +87 -0
- package/dist/chunk-UMB7ZMKX.mjs +122 -0
- package/dist/chunk-UNL4F3FH.mjs +122 -0
- package/dist/chunk-UOP3WPZG.mjs +60 -0
- package/dist/chunk-UPBRQJAU.mjs +512 -0
- package/dist/chunk-UPPVJWBO.mjs +116 -0
- package/dist/chunk-UYFHSIC7.mjs +81 -0
- package/dist/chunk-UZJQAAOZ.mjs +108 -0
- package/dist/chunk-V2JDJALG.mjs +125 -0
- package/dist/chunk-V2YC7EE6.mjs +122 -0
- package/dist/chunk-V3UXNKVL.mjs +122 -0
- package/dist/chunk-V5FP5GDQ.mjs +95 -0
- package/dist/chunk-VCHYQYFB.mjs +503 -0
- package/dist/chunk-VJEJD4DF.mjs +52 -0
- package/dist/chunk-VL4PZ5RI.mjs +113 -0
- package/dist/chunk-VNGGNO3R.mjs +32 -0
- package/dist/chunk-VNWV6LZP.mjs +38 -0
- package/dist/chunk-VOQEOCHD.mjs +511 -0
- package/dist/chunk-VW33ORR4.mjs +301 -0
- package/dist/chunk-VZ6VFS3D.mjs +109 -0
- package/dist/chunk-W3SECUBG.mjs +14 -0
- package/dist/chunk-W5OZFHOX.mjs +193 -0
- package/dist/chunk-WCSWQVFA.mjs +96 -0
- package/dist/chunk-WELBZQP2.mjs +137 -0
- package/dist/chunk-WGJWOF4K.mjs +122 -0
- package/dist/chunk-WJUBYR25.mjs +122 -0
- package/dist/chunk-WKSLZG4X.mjs +122 -0
- package/dist/chunk-WO4BCKRI.mjs +145 -0
- package/dist/chunk-WRJ47AVE.mjs +136 -0
- package/dist/chunk-WWAEK25T.mjs +92 -0
- package/dist/chunk-X3N6PDZV.mjs +71 -0
- package/dist/chunk-X437NODC.mjs +122 -0
- package/dist/chunk-X4FBB2TI.mjs +32 -0
- package/dist/chunk-XAJVDNFJ.mjs +119 -0
- package/dist/chunk-XGIDLCZI.mjs +137 -0
- package/dist/chunk-XGPUTXJT.mjs +122 -0
- package/dist/chunk-XHSCOABH.mjs +138 -0
- package/dist/chunk-XRM6FF22.mjs +61 -0
- package/dist/chunk-XTG2CB35.mjs +122 -0
- package/dist/chunk-XX22JBNI.mjs +139 -0
- package/dist/chunk-Y2W5252F.mjs +515 -0
- package/dist/chunk-Y3UMAK4V.mjs +141 -0
- package/dist/chunk-Y4M4BHVP.mjs +106 -0
- package/dist/chunk-Y5TUAI6V.mjs +127 -0
- package/dist/chunk-Y6F7EJOV.mjs +129 -0
- package/dist/chunk-YCITYGTH.mjs +20 -0
- package/dist/chunk-YD3HHOXQ.mjs +120 -0
- package/dist/chunk-YE3IUCBS.mjs +81 -0
- package/dist/chunk-YG2I4KKR.mjs +156 -0
- package/dist/chunk-YQGPAXSD.mjs +24 -0
- package/dist/chunk-YSAEDU4W.mjs +137 -0
- package/dist/chunk-YSZMXNWH.mjs +30 -0
- package/dist/chunk-YW3ZBLND.mjs +8 -0
- package/dist/chunk-YZC2FQVP.mjs +78 -0
- package/dist/chunk-Z3MPWBBS.mjs +109 -0
- package/dist/chunk-Z3NBRL3F.mjs +108 -0
- package/dist/chunk-ZF5BUSKM.mjs +122 -0
- package/dist/chunk-ZF5CW4JH.mjs +91 -0
- package/dist/chunk-ZFUAZYLA.mjs +20 -0
- package/dist/chunk-ZJ7EMTGD.mjs +83 -0
- package/dist/chunk-ZPBOEUI7.mjs +56 -0
- package/dist/chunk-ZPFY4R5H.mjs +514 -0
- package/dist/chunk-ZRUMMJPO.mjs +127 -0
- package/dist/chunk-ZTLWJFDN.mjs +110 -0
- package/dist/chunk-ZVMW2BJZ.mjs +206 -0
- package/dist/components/dashboard/index.d.mts +135 -0
- package/dist/components/dashboard/index.d.ts +135 -0
- package/dist/components/dashboard/index.js +260 -0
- package/dist/components/dashboard/index.mjs +228 -0
- package/dist/components/layout/index.d.mts +2 -0
- package/dist/components/layout/index.d.ts +2 -0
- package/dist/components/layout/index.js +2 -0
- package/dist/components/layout/index.mjs +1 -0
- package/dist/components/navigation/index.d.mts +261 -0
- package/dist/components/navigation/index.d.ts +261 -0
- package/dist/components/navigation/index.js +552 -0
- package/dist/components/navigation/index.mjs +3 -0
- package/dist/components/ui/accordion.d.mts +37 -0
- package/dist/components/ui/accordion.d.ts +37 -0
- package/dist/components/ui/accordion.js +120 -0
- package/dist/components/ui/accordion.mjs +2 -0
- package/dist/components/ui/alert.d.mts +49 -0
- package/dist/components/ui/alert.d.ts +49 -0
- package/dist/components/ui/alert.js +149 -0
- package/dist/components/ui/alert.mjs +2 -0
- package/dist/components/ui/artwork.d.mts +2 -0
- package/dist/components/ui/artwork.d.ts +2 -0
- package/dist/components/ui/artwork.js +950 -0
- package/dist/components/ui/artwork.mjs +3 -0
- package/dist/components/ui/avatar.d.mts +36 -0
- package/dist/components/ui/avatar.d.ts +36 -0
- package/dist/components/ui/avatar.js +231 -0
- package/dist/components/ui/avatar.mjs +3 -0
- package/dist/components/ui/badge.d.mts +32 -0
- package/dist/components/ui/badge.d.ts +32 -0
- package/dist/components/ui/badge.js +119 -0
- package/dist/components/ui/badge.mjs +2 -0
- package/dist/components/ui/box.d.mts +8 -0
- package/dist/components/ui/box.d.ts +8 -0
- package/dist/components/ui/box.js +41 -0
- package/dist/components/ui/box.mjs +2 -0
- package/dist/components/ui/breadcrumb.d.mts +57 -0
- package/dist/components/ui/breadcrumb.d.ts +57 -0
- package/dist/components/ui/breadcrumb.js +162 -0
- package/dist/components/ui/breadcrumb.mjs +3 -0
- package/dist/components/ui/button-group.d.mts +54 -0
- package/dist/components/ui/button-group.d.ts +54 -0
- package/dist/components/ui/button-group.js +113 -0
- package/dist/components/ui/button-group.mjs +2 -0
- package/dist/components/ui/button.d.mts +38 -0
- package/dist/components/ui/button.d.ts +38 -0
- package/dist/components/ui/button.js +149 -0
- package/dist/components/ui/button.mjs +2 -0
- package/dist/components/ui/calendar.d.mts +15 -0
- package/dist/components/ui/calendar.d.ts +15 -0
- package/dist/components/ui/calendar.js +282 -0
- package/dist/components/ui/calendar.mjs +3 -0
- package/dist/components/ui/callout.d.mts +32 -0
- package/dist/components/ui/callout.d.ts +32 -0
- package/dist/components/ui/callout.js +93 -0
- package/dist/components/ui/callout.mjs +2 -0
- package/dist/components/ui/card.d.mts +63 -0
- package/dist/components/ui/card.d.ts +63 -0
- package/dist/components/ui/card.js +112 -0
- package/dist/components/ui/card.mjs +2 -0
- package/dist/components/ui/checkbox.d.mts +37 -0
- package/dist/components/ui/checkbox.d.ts +37 -0
- package/dist/components/ui/checkbox.js +132 -0
- package/dist/components/ui/checkbox.mjs +2 -0
- package/dist/components/ui/code.d.mts +9 -0
- package/dist/components/ui/code.d.ts +9 -0
- package/dist/components/ui/code.js +57 -0
- package/dist/components/ui/code.mjs +2 -0
- package/dist/components/ui/command.d.mts +85 -0
- package/dist/components/ui/command.d.ts +85 -0
- package/dist/components/ui/command.js +243 -0
- package/dist/components/ui/command.mjs +3 -0
- package/dist/components/ui/consent.d.mts +8 -0
- package/dist/components/ui/consent.d.ts +8 -0
- package/dist/components/ui/consent.js +68 -0
- package/dist/components/ui/consent.mjs +2 -0
- package/dist/components/ui/container.d.mts +9 -0
- package/dist/components/ui/container.d.ts +9 -0
- package/dist/components/ui/container.js +59 -0
- package/dist/components/ui/container.mjs +2 -0
- package/dist/components/ui/data-list.d.mts +13 -0
- package/dist/components/ui/data-list.d.ts +13 -0
- package/dist/components/ui/data-list.js +79 -0
- package/dist/components/ui/data-list.mjs +2 -0
- package/dist/components/ui/dropdown-menu.d.mts +30 -0
- package/dist/components/ui/dropdown-menu.d.ts +30 -0
- package/dist/components/ui/dropdown-menu.js +213 -0
- package/dist/components/ui/dropdown-menu.mjs +2 -0
- package/dist/components/ui/flex.d.mts +12 -0
- package/dist/components/ui/flex.d.ts +12 -0
- package/dist/components/ui/flex.js +79 -0
- package/dist/components/ui/flex.mjs +2 -0
- package/dist/components/ui/follow.d.mts +9 -0
- package/dist/components/ui/follow.d.ts +9 -0
- package/dist/components/ui/follow.js +63 -0
- package/dist/components/ui/follow.mjs +2 -0
- package/dist/components/ui/grid.d.mts +12 -0
- package/dist/components/ui/grid.d.ts +12 -0
- package/dist/components/ui/grid.js +92 -0
- package/dist/components/ui/grid.mjs +2 -0
- package/dist/components/ui/heading.d.mts +11 -0
- package/dist/components/ui/heading.d.ts +11 -0
- package/dist/components/ui/heading.js +63 -0
- package/dist/components/ui/heading.mjs +2 -0
- package/dist/components/ui/highlight.d.mts +27 -0
- package/dist/components/ui/highlight.d.ts +27 -0
- package/dist/components/ui/highlight.js +74 -0
- package/dist/components/ui/highlight.mjs +2 -0
- package/dist/components/ui/hover-card.d.mts +8 -0
- package/dist/components/ui/hover-card.d.ts +8 -0
- package/dist/components/ui/hover-card.js +52 -0
- package/dist/components/ui/hover-card.mjs +2 -0
- package/dist/components/ui/indicator.d.mts +32 -0
- package/dist/components/ui/indicator.d.ts +32 -0
- package/dist/components/ui/indicator.js +88 -0
- package/dist/components/ui/indicator.mjs +2 -0
- package/dist/components/ui/input-otp.d.mts +37 -0
- package/dist/components/ui/input-otp.d.ts +37 -0
- package/dist/components/ui/input-otp.js +94 -0
- package/dist/components/ui/input-otp.mjs +2 -0
- package/dist/components/ui/input.d.mts +74 -0
- package/dist/components/ui/input.d.ts +74 -0
- package/dist/components/ui/input.js +416 -0
- package/dist/components/ui/input.mjs +2 -0
- package/dist/components/ui/kbd.d.mts +8 -0
- package/dist/components/ui/kbd.d.ts +8 -0
- package/dist/components/ui/kbd.js +51 -0
- package/dist/components/ui/kbd.mjs +2 -0
- package/dist/components/ui/link.d.mts +56 -0
- package/dist/components/ui/link.d.ts +56 -0
- package/dist/components/ui/link.js +150 -0
- package/dist/components/ui/link.mjs +3 -0
- package/dist/components/ui/logo.d.mts +58 -0
- package/dist/components/ui/logo.d.ts +58 -0
- package/dist/components/ui/logo.js +225 -0
- package/dist/components/ui/logo.mjs +2 -0
- package/dist/components/ui/modal.d.mts +34 -0
- package/dist/components/ui/modal.d.ts +34 -0
- package/dist/components/ui/modal.js +153 -0
- package/dist/components/ui/modal.mjs +2 -0
- package/dist/components/ui/notice.d.mts +56 -0
- package/dist/components/ui/notice.d.ts +56 -0
- package/dist/components/ui/notice.js +126 -0
- package/dist/components/ui/notice.mjs +2 -0
- package/dist/components/ui/pagination.d.mts +100 -0
- package/dist/components/ui/pagination.d.ts +100 -0
- package/dist/components/ui/pagination.js +248 -0
- package/dist/components/ui/pagination.mjs +3 -0
- package/dist/components/ui/pictograms.d.mts +2 -0
- package/dist/components/ui/pictograms.d.ts +2 -0
- package/dist/components/ui/pictograms.js +924 -0
- package/dist/components/ui/pictograms.mjs +1 -0
- package/dist/components/ui/popover.d.mts +9 -0
- package/dist/components/ui/popover.d.ts +9 -0
- package/dist/components/ui/popover.js +54 -0
- package/dist/components/ui/popover.mjs +2 -0
- package/dist/components/ui/progress.d.mts +16 -0
- package/dist/components/ui/progress.d.ts +16 -0
- package/dist/components/ui/progress.js +99 -0
- package/dist/components/ui/progress.mjs +2 -0
- package/dist/components/ui/quote.d.mts +41 -0
- package/dist/components/ui/quote.d.ts +41 -0
- package/dist/components/ui/quote.js +91 -0
- package/dist/components/ui/quote.mjs +2 -0
- package/dist/components/ui/radio.d.mts +32 -0
- package/dist/components/ui/radio.d.ts +32 -0
- package/dist/components/ui/radio.js +111 -0
- package/dist/components/ui/radio.mjs +2 -0
- package/dist/components/ui/range.d.mts +27 -0
- package/dist/components/ui/range.d.ts +27 -0
- package/dist/components/ui/range.js +137 -0
- package/dist/components/ui/range.mjs +2 -0
- package/dist/components/ui/section.d.mts +9 -0
- package/dist/components/ui/section.d.ts +9 -0
- package/dist/components/ui/section.js +56 -0
- package/dist/components/ui/section.mjs +2 -0
- package/dist/components/ui/select.d.mts +27 -0
- package/dist/components/ui/select.d.ts +27 -0
- package/dist/components/ui/select.js +222 -0
- package/dist/components/ui/select.mjs +2 -0
- package/dist/components/ui/separator.d.mts +6 -0
- package/dist/components/ui/separator.d.ts +6 -0
- package/dist/components/ui/separator.js +49 -0
- package/dist/components/ui/separator.mjs +2 -0
- package/dist/components/ui/sheet.d.mts +29 -0
- package/dist/components/ui/sheet.d.ts +29 -0
- package/dist/components/ui/sheet.js +140 -0
- package/dist/components/ui/sheet.mjs +2 -0
- package/dist/components/ui/skeleton.d.mts +13 -0
- package/dist/components/ui/skeleton.d.ts +13 -0
- package/dist/components/ui/skeleton.js +28 -0
- package/dist/components/ui/skeleton.mjs +2 -0
- package/dist/components/ui/stepper.d.mts +36 -0
- package/dist/components/ui/stepper.d.ts +36 -0
- package/dist/components/ui/stepper.js +98 -0
- package/dist/components/ui/stepper.mjs +2 -0
- package/dist/components/ui/table.d.mts +20 -0
- package/dist/components/ui/table.d.ts +20 -0
- package/dist/components/ui/table.js +121 -0
- package/dist/components/ui/table.mjs +2 -0
- package/dist/components/ui/tabs.d.mts +18 -0
- package/dist/components/ui/tabs.d.ts +18 -0
- package/dist/components/ui/tabs.js +126 -0
- package/dist/components/ui/tabs.mjs +2 -0
- package/dist/components/ui/tag.d.mts +61 -0
- package/dist/components/ui/tag.d.ts +61 -0
- package/dist/components/ui/tag.js +328 -0
- package/dist/components/ui/tag.mjs +2 -0
- package/dist/components/ui/text.d.mts +11 -0
- package/dist/components/ui/text.d.ts +11 -0
- package/dist/components/ui/text.js +66 -0
- package/dist/components/ui/text.mjs +2 -0
- package/dist/components/ui/theme-artwork.d.mts +22 -0
- package/dist/components/ui/theme-artwork.d.ts +22 -0
- package/dist/components/ui/theme-artwork.js +158 -0
- package/dist/components/ui/theme-artwork.mjs +2 -0
- package/dist/components/ui/theme-toggle.d.mts +23 -0
- package/dist/components/ui/theme-toggle.d.ts +23 -0
- package/dist/components/ui/theme-toggle.js +567 -0
- package/dist/components/ui/theme-toggle.mjs +9 -0
- package/dist/components/ui/tile.d.mts +57 -0
- package/dist/components/ui/tile.d.ts +57 -0
- package/dist/components/ui/tile.js +248 -0
- package/dist/components/ui/tile.mjs +2 -0
- package/dist/components/ui/toast.d.mts +18 -0
- package/dist/components/ui/toast.d.ts +18 -0
- package/dist/components/ui/toast.js +141 -0
- package/dist/components/ui/toast.mjs +2 -0
- package/dist/components/ui/toaster.d.mts +8 -0
- package/dist/components/ui/toaster.d.ts +8 -0
- package/dist/components/ui/toaster.js +263 -0
- package/dist/components/ui/toaster.mjs +4 -0
- package/dist/components/ui/toggle.d.mts +39 -0
- package/dist/components/ui/toggle.d.ts +39 -0
- package/dist/components/ui/toggle.js +156 -0
- package/dist/components/ui/toggle.mjs +2 -0
- package/dist/components/ui/tooltip.d.mts +26 -0
- package/dist/components/ui/tooltip.d.ts +26 -0
- package/dist/components/ui/tooltip.js +85 -0
- package/dist/components/ui/tooltip.mjs +2 -0
- package/dist/components/ui/translate.d.mts +36 -0
- package/dist/components/ui/translate.d.ts +36 -0
- package/dist/components/ui/translate.js +191 -0
- package/dist/components/ui/translate.mjs +2 -0
- package/dist/components/ui/upload.d.mts +37 -0
- package/dist/components/ui/upload.d.ts +37 -0
- package/dist/components/ui/upload.js +89 -0
- package/dist/components/ui/upload.mjs +2 -0
- package/dist/components/ui/use-toast.d.mts +49 -0
- package/dist/components/ui/use-toast.d.ts +49 -0
- package/dist/components/ui/use-toast.js +142 -0
- package/dist/components/ui/use-toast.mjs +1 -0
- package/dist/hooks/index.d.mts +40 -0
- package/dist/hooks/index.d.ts +40 -0
- package/dist/hooks/index.js +87 -0
- package/dist/hooks/index.mjs +2 -0
- package/dist/i18n/index.d.mts +160 -0
- package/dist/i18n/index.d.ts +160 -0
- package/dist/i18n/index.js +228 -0
- package/dist/i18n/index.mjs +191 -0
- package/dist/index.d.mts +96 -0
- package/dist/index.d.ts +96 -0
- package/dist/index.js +7183 -0
- package/dist/index.mjs +67 -0
- package/dist/primitives/index.d.mts +30 -0
- package/dist/primitives/index.d.ts +30 -0
- package/dist/primitives/index.js +48 -0
- package/dist/primitives/index.mjs +1 -0
- package/dist/providers/index.d.mts +155 -0
- package/dist/providers/index.d.ts +155 -0
- package/dist/providers/index.js +203 -0
- package/dist/providers/index.mjs +3 -0
- package/dist/theme-provider-DQSD5lrW.d.mts +82 -0
- package/dist/theme-provider-DQSD5lrW.d.ts +82 -0
- package/dist/theme-script-BIZ1PX7u.d.mts +75 -0
- package/dist/theme-script-BIZ1PX7u.d.ts +75 -0
- package/package.json +120 -0
- package/src/components/navigation/footer.tsx +173 -0
- package/src/components/navigation/header.tsx +236 -0
- package/src/components/navigation/index.ts +29 -0
- package/src/components/navigation/nav-link.tsx +135 -0
- package/src/components/navigation/navigation.tsx +336 -0
- package/src/components/navigation/skip-links.tsx +75 -0
- package/src/components/ui/accordion.test.tsx +56 -0
- package/src/components/ui/accordion.tsx +150 -0
- package/src/components/ui/alert.test.tsx +58 -0
- package/src/components/ui/alert.tsx +181 -0
- package/src/components/ui/artwork.tsx +166 -0
- package/src/components/ui/avatar.tsx +198 -0
- package/src/components/ui/badge.test.tsx +44 -0
- package/src/components/ui/badge.tsx +144 -0
- package/src/components/ui/box.tsx +17 -0
- package/src/components/ui/breadcrumb.tsx +189 -0
- package/src/components/ui/button-group.tsx +146 -0
- package/src/components/ui/button.test.tsx +56 -0
- package/src/components/ui/button.tsx +160 -0
- package/src/components/ui/calendar.tsx +159 -0
- package/src/components/ui/callout.test.tsx +36 -0
- package/src/components/ui/callout.tsx +131 -0
- package/src/components/ui/card.tsx +151 -0
- package/src/components/ui/checkbox.test.tsx +38 -0
- package/src/components/ui/checkbox.tsx +142 -0
- package/src/components/ui/code.tsx +33 -0
- package/src/components/ui/command.tsx +162 -0
- package/src/components/ui/consent.tsx +46 -0
- package/src/components/ui/container.tsx +35 -0
- package/src/components/ui/data-list.tsx +59 -0
- package/src/components/ui/dropdown-menu.tsx +226 -0
- package/src/components/ui/flex.tsx +62 -0
- package/src/components/ui/follow.tsx +52 -0
- package/src/components/ui/grid.tsx +75 -0
- package/src/components/ui/heading.tsx +42 -0
- package/src/components/ui/highlight.tsx +71 -0
- package/src/components/ui/hover-card.tsx +29 -0
- package/src/components/ui/indicator.tsx +108 -0
- package/src/components/ui/input-otp.tsx +85 -0
- package/src/components/ui/input.tsx +508 -0
- package/src/components/ui/kbd.tsx +26 -0
- package/src/components/ui/link.tsx +191 -0
- package/src/components/ui/logo.tsx +298 -0
- package/src/components/ui/modal.tsx +176 -0
- package/src/components/ui/notice.tsx +157 -0
- package/src/components/ui/pagination.tsx +348 -0
- package/src/components/ui/pictograms.ts +1197 -0
- package/src/components/ui/popover.tsx +33 -0
- package/src/components/ui/progress.tsx +79 -0
- package/src/components/ui/quote.tsx +132 -0
- package/src/components/ui/radio.test.tsx +48 -0
- package/src/components/ui/radio.tsx +126 -0
- package/src/components/ui/range.tsx +156 -0
- package/src/components/ui/section.tsx +32 -0
- package/src/components/ui/select.tsx +257 -0
- package/src/components/ui/separator.tsx +26 -0
- package/src/components/ui/sheet.tsx +137 -0
- package/src/components/ui/skeleton.tsx +26 -0
- package/src/components/ui/stepper.tsx +124 -0
- package/src/components/ui/table.tsx +158 -0
- package/src/components/ui/tabs.tsx +118 -0
- package/src/components/ui/tag.tsx +406 -0
- package/src/components/ui/text.tsx +45 -0
- package/src/components/ui/theme-artwork.tsx +122 -0
- package/src/components/ui/theme-toggle.tsx +154 -0
- package/src/components/ui/tile.tsx +337 -0
- package/src/components/ui/toast.tsx +140 -0
- package/src/components/ui/toaster.tsx +35 -0
- package/src/components/ui/toggle.tsx +187 -0
- package/src/components/ui/tooltip.tsx +96 -0
- package/src/components/ui/translate.tsx +203 -0
- package/src/components/ui/upload.tsx +118 -0
- package/src/components/ui/use-toast.ts +185 -0
- package/src/hooks/index.ts +10 -0
- package/src/hooks/use-media-query.ts +74 -0
- package/src/hooks/use-theme.ts +5 -0
- package/src/i18n/index.ts +35 -0
- package/src/i18n/provider.tsx +82 -0
- package/src/i18n/strings.ts +196 -0
- package/src/i18n/types.ts +95 -0
- package/src/index.ts +348 -0
- package/src/lib/utils.ts +10 -0
- package/src/primitives/index.ts +8 -0
- package/src/primitives/polymorphic.tsx +52 -0
- package/src/providers/index.ts +20 -0
- package/src/providers/router-provider.tsx +99 -0
- package/src/providers/theme-provider.tsx +218 -0
- 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
|
+
})
|