@particle-academy/react-fancy 5.51.1 → 5.52.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/CHANGELOG.md +90 -0
- package/README.md +43 -0
- package/dist/accordion-panel.cjs +7 -7
- package/dist/accordion-panel.js +1 -1
- package/dist/accordion.cjs +3 -3
- package/dist/accordion.js +1 -1
- package/dist/activity-light.cjs +2 -2
- package/dist/activity-light.js +1 -1
- package/dist/audio-viewer.cjs +2 -2
- package/dist/audio-viewer.js +1 -1
- package/dist/autocomplete.cjs +2 -2
- package/dist/autocomplete.js +1 -1
- package/dist/avatar.cjs +2 -2
- package/dist/avatar.js +1 -1
- package/dist/brand.cjs +3 -3
- package/dist/brand.js +1 -1
- package/dist/breadcrumbs.cjs +2 -2
- package/dist/breadcrumbs.js +1 -1
- package/dist/button.cjs +3 -3
- package/dist/button.js +1 -1
- package/dist/calendar.cjs +2 -2
- package/dist/calendar.js +1 -1
- package/dist/card.cjs +9 -9
- package/dist/card.js +3 -3
- package/dist/carousel.cjs +7 -7
- package/dist/carousel.js +1 -1
- package/dist/chart.cjs +2 -2
- package/dist/chart.js +1 -1
- package/dist/chat-drawer.cjs +2 -2
- package/dist/chat-drawer.js +1 -1
- package/dist/checkbox-group.cjs +5 -5
- package/dist/checkbox-group.js +4 -4
- package/dist/checkbox.cjs +3 -3
- package/dist/checkbox.js +2 -2
- package/dist/{chunk-KODD54GT.js → chunk-26JZ47BJ.js} +5 -5
- package/dist/{chunk-KODD54GT.js.map → chunk-26JZ47BJ.js.map} +1 -1
- package/dist/{chunk-VKXNCYLE.cjs → chunk-2GFM5WD4.cjs} +5 -5
- package/dist/chunk-2GFM5WD4.cjs.map +1 -0
- package/dist/{chunk-MGE5KOVA.js → chunk-2MUGEPRD.js} +10 -10
- package/dist/{chunk-MGE5KOVA.js.map → chunk-2MUGEPRD.js.map} +1 -1
- package/dist/{chunk-UIJR26YW.js → chunk-2OMA3O63.js} +4 -4
- package/dist/{chunk-UIJR26YW.js.map → chunk-2OMA3O63.js.map} +1 -1
- package/dist/{chunk-OC75GWX5.js → chunk-2UTN3EFK.js} +6 -6
- package/dist/{chunk-OC75GWX5.js.map → chunk-2UTN3EFK.js.map} +1 -1
- package/dist/{chunk-CF2U25LM.js → chunk-2XO6EYZ7.js} +9 -9
- package/dist/chunk-2XO6EYZ7.js.map +1 -0
- package/dist/{chunk-QSFTWIUH.cjs → chunk-36HG5JK6.cjs} +6 -6
- package/dist/chunk-36HG5JK6.cjs.map +1 -0
- package/dist/{chunk-TDDWWAM5.js → chunk-3AYRLFNO.js} +6 -6
- package/dist/chunk-3AYRLFNO.js.map +1 -0
- package/dist/{chunk-7JDVCQXD.js → chunk-3EWO5EBI.js} +14 -14
- package/dist/chunk-3EWO5EBI.js.map +1 -0
- package/dist/{chunk-Z3NSPDTW.cjs → chunk-3YA6FDVN.cjs} +8 -8
- package/dist/chunk-3YA6FDVN.cjs.map +1 -0
- package/dist/{chunk-SYVOGYJG.cjs → chunk-43ZRUYJC.cjs} +11 -11
- package/dist/{chunk-SYVOGYJG.cjs.map → chunk-43ZRUYJC.cjs.map} +1 -1
- package/dist/{chunk-NDUEPDNS.js → chunk-44VYWOCG.js} +4 -4
- package/dist/{chunk-NDUEPDNS.js.map → chunk-44VYWOCG.js.map} +1 -1
- package/dist/{chunk-LYHQ4VBR.js → chunk-45FDQ3R5.js} +3 -3
- package/dist/{chunk-LYHQ4VBR.js.map → chunk-45FDQ3R5.js.map} +1 -1
- package/dist/{chunk-LBU3T2LF.js → chunk-4FH2JHUY.js} +7 -7
- package/dist/{chunk-LBU3T2LF.js.map → chunk-4FH2JHUY.js.map} +1 -1
- package/dist/{chunk-5F6V5HHT.cjs → chunk-4JT2QANA.cjs} +11 -11
- package/dist/chunk-4JT2QANA.cjs.map +1 -0
- package/dist/{chunk-N6OZZAOT.js → chunk-4TVAHZ35.js} +9 -9
- package/dist/chunk-4TVAHZ35.js.map +1 -0
- package/dist/{chunk-XLFGWNW4.cjs → chunk-4XMBXG4K.cjs} +4 -4
- package/dist/{chunk-XLFGWNW4.cjs.map → chunk-4XMBXG4K.cjs.map} +1 -1
- package/dist/{chunk-N4VHOTMK.cjs → chunk-546K5LRX.cjs} +3 -3
- package/dist/{chunk-N4VHOTMK.cjs.map → chunk-546K5LRX.cjs.map} +1 -1
- package/dist/{chunk-P7Q2YIIS.js → chunk-5DG4CAWS.js} +8 -8
- package/dist/chunk-5DG4CAWS.js.map +1 -0
- package/dist/{chunk-GU5BYZTR.cjs → chunk-5H6IUCOD.cjs} +8 -8
- package/dist/chunk-5H6IUCOD.cjs.map +1 -0
- package/dist/{chunk-ZY4CVNNZ.js → chunk-5JA4ENMF.js} +6 -6
- package/dist/chunk-5JA4ENMF.js.map +1 -0
- package/dist/{chunk-R3UG6PVX.cjs → chunk-5JK2VDWY.cjs} +7 -7
- package/dist/{chunk-R3UG6PVX.cjs.map → chunk-5JK2VDWY.cjs.map} +1 -1
- package/dist/{chunk-5MU6X3KO.js → chunk-5WQ6FPSP.js} +4 -4
- package/dist/{chunk-5MU6X3KO.js.map → chunk-5WQ6FPSP.js.map} +1 -1
- package/dist/{chunk-TNYWQ6EQ.js → chunk-6HJF55U7.js} +8 -8
- package/dist/chunk-6HJF55U7.js.map +1 -0
- package/dist/{chunk-F7YCIII4.cjs → chunk-6MXFZ3B5.cjs} +3 -3
- package/dist/{chunk-F7YCIII4.cjs.map → chunk-6MXFZ3B5.cjs.map} +1 -1
- package/dist/{chunk-7Y2AENZD.cjs → chunk-7DDUMW4R.cjs} +4 -4
- package/dist/{chunk-7Y2AENZD.cjs.map → chunk-7DDUMW4R.cjs.map} +1 -1
- package/dist/{chunk-2KZINS6D.cjs → chunk-7QENPLOP.cjs} +9 -9
- package/dist/{chunk-2KZINS6D.cjs.map → chunk-7QENPLOP.cjs.map} +1 -1
- package/dist/{chunk-25UPDBI6.cjs → chunk-A5DN2XNM.cjs} +9 -9
- package/dist/chunk-A5DN2XNM.cjs.map +1 -0
- package/dist/{chunk-RA2VOQ46.js → chunk-A5RTALZJ.js} +6 -6
- package/dist/chunk-A5RTALZJ.js.map +1 -0
- package/dist/{chunk-WN45ZE37.cjs → chunk-AVEFCM6T.cjs} +3 -3
- package/dist/{chunk-WN45ZE37.cjs.map → chunk-AVEFCM6T.cjs.map} +1 -1
- package/dist/{chunk-TGNQ5Y6F.cjs → chunk-AYBKPAI2.cjs} +6 -6
- package/dist/{chunk-TGNQ5Y6F.cjs.map → chunk-AYBKPAI2.cjs.map} +1 -1
- package/dist/{chunk-OTCLBINT.js → chunk-AZQXPI5S.js} +7 -7
- package/dist/{chunk-OTCLBINT.js.map → chunk-AZQXPI5S.js.map} +1 -1
- package/dist/{chunk-RWOH2ADL.cjs → chunk-B4YV2V7G.cjs} +4 -4
- package/dist/{chunk-RWOH2ADL.cjs.map → chunk-B4YV2V7G.cjs.map} +1 -1
- package/dist/{chunk-AR3JOPGT.cjs → chunk-BDUL42VO.cjs} +31 -31
- package/dist/{chunk-AR3JOPGT.cjs.map → chunk-BDUL42VO.cjs.map} +1 -1
- package/dist/{chunk-5CXJ5Z4C.cjs → chunk-BJL3VDRK.cjs} +4 -4
- package/dist/{chunk-5CXJ5Z4C.cjs.map → chunk-BJL3VDRK.cjs.map} +1 -1
- package/dist/{chunk-WKAEAGMT.cjs → chunk-BK6XQQYG.cjs} +4 -4
- package/dist/{chunk-WKAEAGMT.cjs.map → chunk-BK6XQQYG.cjs.map} +1 -1
- package/dist/{chunk-UKUNWGL5.js → chunk-BLOX7MRO.js} +6 -6
- package/dist/{chunk-UKUNWGL5.js.map → chunk-BLOX7MRO.js.map} +1 -1
- package/dist/{chunk-Q7O5TLVU.js → chunk-BX7EDTL4.js} +3 -3
- package/dist/{chunk-Q7O5TLVU.js.map → chunk-BX7EDTL4.js.map} +1 -1
- package/dist/{chunk-SAPOYAGN.cjs → chunk-BYUJJXGY.cjs} +9 -9
- package/dist/{chunk-SAPOYAGN.cjs.map → chunk-BYUJJXGY.cjs.map} +1 -1
- package/dist/{chunk-FWA4PCW7.cjs → chunk-CAMQ5B3V.cjs} +5 -5
- package/dist/{chunk-FWA4PCW7.cjs.map → chunk-CAMQ5B3V.cjs.map} +1 -1
- package/dist/{chunk-I6L7OP7G.cjs → chunk-CG3RCQVL.cjs} +5 -5
- package/dist/chunk-CG3RCQVL.cjs.map +1 -0
- package/dist/{chunk-3Q4NSAEA.cjs → chunk-CQ54H7DZ.cjs} +8 -8
- package/dist/{chunk-3Q4NSAEA.cjs.map → chunk-CQ54H7DZ.cjs.map} +1 -1
- package/dist/{chunk-YOTCZUNW.js → chunk-D4QOV56U.js} +7 -7
- package/dist/{chunk-YOTCZUNW.js.map → chunk-D4QOV56U.js.map} +1 -1
- package/dist/{chunk-BZDXX6E3.cjs → chunk-DJB3N4G3.cjs} +11 -11
- package/dist/{chunk-BZDXX6E3.cjs.map → chunk-DJB3N4G3.cjs.map} +1 -1
- package/dist/{chunk-BMTTSBHF.js → chunk-DJYG7DXS.js} +4 -4
- package/dist/{chunk-BMTTSBHF.js.map → chunk-DJYG7DXS.js.map} +1 -1
- package/dist/{chunk-WBVWV2V7.cjs → chunk-DN244T6G.cjs} +6 -6
- package/dist/chunk-DN244T6G.cjs.map +1 -0
- package/dist/{chunk-NCXH5O4I.cjs → chunk-E4TRDGSU.cjs} +10 -10
- package/dist/{chunk-NCXH5O4I.cjs.map → chunk-E4TRDGSU.cjs.map} +1 -1
- package/dist/{chunk-FVG3YXXM.cjs → chunk-EEMNTO7L.cjs} +8 -8
- package/dist/{chunk-FVG3YXXM.cjs.map → chunk-EEMNTO7L.cjs.map} +1 -1
- package/dist/{chunk-IAUJKZAQ.js → chunk-ELBCK3V7.js} +13 -13
- package/dist/{chunk-IAUJKZAQ.js.map → chunk-ELBCK3V7.js.map} +1 -1
- package/dist/{chunk-Y4UPKJN5.js → chunk-EQ7G5F6K.js} +4 -4
- package/dist/{chunk-Y4UPKJN5.js.map → chunk-EQ7G5F6K.js.map} +1 -1
- package/dist/{chunk-U7PFHQBN.cjs → chunk-ETNQ4AEQ.cjs} +6 -6
- package/dist/{chunk-U7PFHQBN.cjs.map → chunk-ETNQ4AEQ.cjs.map} +1 -1
- package/dist/{chunk-23PAOCQQ.cjs → chunk-EXQ33MJR.cjs} +5 -5
- package/dist/{chunk-23PAOCQQ.cjs.map → chunk-EXQ33MJR.cjs.map} +1 -1
- package/dist/{chunk-HKRB2Z6R.cjs → chunk-FGI2EC32.cjs} +8 -8
- package/dist/chunk-FGI2EC32.cjs.map +1 -0
- package/dist/{chunk-AASQ6L6X.cjs → chunk-FNIHCNVD.cjs} +3 -3
- package/dist/{chunk-AASQ6L6X.cjs.map → chunk-FNIHCNVD.cjs.map} +1 -1
- package/dist/{chunk-PCTZNK2Z.js → chunk-FVDQNQKA.js} +9 -9
- package/dist/chunk-FVDQNQKA.js.map +1 -0
- package/dist/{chunk-O6GTY53I.cjs → chunk-FVQO75KY.cjs} +4 -4
- package/dist/{chunk-O6GTY53I.cjs.map → chunk-FVQO75KY.cjs.map} +1 -1
- package/dist/{chunk-FCSR2WVS.js → chunk-FWAVMWMP.js} +4 -4
- package/dist/{chunk-FCSR2WVS.js.map → chunk-FWAVMWMP.js.map} +1 -1
- package/dist/{chunk-FSRPZYZZ.js → chunk-G35XN5WV.js} +4 -4
- package/dist/chunk-G35XN5WV.js.map +1 -0
- package/dist/{chunk-HE3JJXIL.cjs → chunk-G4M3MCJO.cjs} +5 -5
- package/dist/{chunk-HE3JJXIL.cjs.map → chunk-G4M3MCJO.cjs.map} +1 -1
- package/dist/{chunk-T45XK5GN.cjs → chunk-G5DMYAWL.cjs} +19 -19
- package/dist/chunk-G5DMYAWL.cjs.map +1 -0
- package/dist/{chunk-7CN7IHES.js → chunk-GF23UBOT.js} +3 -3
- package/dist/{chunk-7CN7IHES.js.map → chunk-GF23UBOT.js.map} +1 -1
- package/dist/{chunk-BVRPDMB7.cjs → chunk-GKLETY7D.cjs} +4 -4
- package/dist/{chunk-BVRPDMB7.cjs.map → chunk-GKLETY7D.cjs.map} +1 -1
- package/dist/{chunk-KQQA7JBC.js → chunk-GOE36IXL.js} +5 -5
- package/dist/{chunk-KQQA7JBC.js.map → chunk-GOE36IXL.js.map} +1 -1
- package/dist/{chunk-XZUGREDI.js → chunk-GVMWJ4NI.js} +6 -6
- package/dist/{chunk-XZUGREDI.js.map → chunk-GVMWJ4NI.js.map} +1 -1
- package/dist/{chunk-FPZYPD3N.cjs → chunk-H7ELUIF6.cjs} +12 -12
- package/dist/{chunk-FPZYPD3N.cjs.map → chunk-H7ELUIF6.cjs.map} +1 -1
- package/dist/{chunk-VB3QJ6QE.js → chunk-HRH5BIYG.js} +4 -4
- package/dist/{chunk-VB3QJ6QE.js.map → chunk-HRH5BIYG.js.map} +1 -1
- package/dist/{chunk-NTMHP7FS.js → chunk-HVND2IIB.js} +6 -6
- package/dist/{chunk-NTMHP7FS.js.map → chunk-HVND2IIB.js.map} +1 -1
- package/dist/{chunk-ASS6EWNI.js → chunk-ICMLLZKZ.js} +8 -8
- package/dist/{chunk-ASS6EWNI.js.map → chunk-ICMLLZKZ.js.map} +1 -1
- package/dist/{chunk-FNEPZ33A.js → chunk-IU5WQUUC.js} +8 -8
- package/dist/{chunk-FNEPZ33A.js.map → chunk-IU5WQUUC.js.map} +1 -1
- package/dist/{chunk-ATANWEXA.cjs → chunk-JBHQQGG5.cjs} +50 -50
- package/dist/{chunk-ATANWEXA.cjs.map → chunk-JBHQQGG5.cjs.map} +1 -1
- package/dist/{chunk-7ZDJPHLJ.cjs → chunk-JRRYYW3Y.cjs} +24 -24
- package/dist/{chunk-7ZDJPHLJ.cjs.map → chunk-JRRYYW3Y.cjs.map} +1 -1
- package/dist/{chunk-ZLWCZV7R.js → chunk-JSD6IEBW.js} +7 -7
- package/dist/chunk-JSD6IEBW.js.map +1 -0
- package/dist/{chunk-QAFAPHAF.cjs → chunk-JUQZMNPR.cjs} +4 -4
- package/dist/chunk-JUQZMNPR.cjs.map +1 -0
- package/dist/{chunk-PFEFKLUV.cjs → chunk-K5MQZTDW.cjs} +6 -6
- package/dist/{chunk-PFEFKLUV.cjs.map → chunk-K5MQZTDW.cjs.map} +1 -1
- package/dist/{chunk-32AJIHBZ.js → chunk-K6Q542VL.js} +5 -5
- package/dist/chunk-K6Q542VL.js.map +1 -0
- package/dist/{chunk-OFHO5SXA.js → chunk-KC3PYCBO.js} +4 -4
- package/dist/{chunk-OFHO5SXA.js.map → chunk-KC3PYCBO.js.map} +1 -1
- package/dist/{chunk-QW66UHWO.cjs → chunk-KE4XURZD.cjs} +4 -4
- package/dist/{chunk-QW66UHWO.cjs.map → chunk-KE4XURZD.cjs.map} +1 -1
- package/dist/{chunk-JFOORUUD.cjs → chunk-KNKOSMOQ.cjs} +6 -6
- package/dist/chunk-KNKOSMOQ.cjs.map +1 -0
- package/dist/{chunk-LLA33GKC.cjs → chunk-KSU6RYWU.cjs} +4 -4
- package/dist/chunk-KSU6RYWU.cjs.map +1 -0
- package/dist/{chunk-PWEZCMIY.js → chunk-KXYMMNNV.js} +7 -7
- package/dist/chunk-KXYMMNNV.js.map +1 -0
- package/dist/{chunk-SUCBR6L5.cjs → chunk-L4JIBKFW.cjs} +3 -3
- package/dist/{chunk-SUCBR6L5.cjs.map → chunk-L4JIBKFW.cjs.map} +1 -1
- package/dist/{chunk-VGBZWDMM.cjs → chunk-LIVC3WUU.cjs} +4 -4
- package/dist/{chunk-VGBZWDMM.cjs.map → chunk-LIVC3WUU.cjs.map} +1 -1
- package/dist/{chunk-YF2EHBTV.js → chunk-LKN7FYW6.js} +3 -3
- package/dist/{chunk-YF2EHBTV.js.map → chunk-LKN7FYW6.js.map} +1 -1
- package/dist/{chunk-RPVCMW64.cjs → chunk-LX23ZJDM.cjs} +6 -6
- package/dist/chunk-LX23ZJDM.cjs.map +1 -0
- package/dist/{chunk-RU6ZTA4M.cjs → chunk-M5SEYDSS.cjs} +6 -6
- package/dist/{chunk-RU6ZTA4M.cjs.map → chunk-M5SEYDSS.cjs.map} +1 -1
- package/dist/{chunk-FYKOLKQZ.js → chunk-M6XBF2ZS.js} +4 -4
- package/dist/chunk-M6XBF2ZS.js.map +1 -0
- package/dist/{chunk-V6VFSX6V.cjs → chunk-MAZEX4EZ.cjs} +13 -13
- package/dist/{chunk-V6VFSX6V.cjs.map → chunk-MAZEX4EZ.cjs.map} +1 -1
- package/dist/{chunk-7EZBMGEE.cjs → chunk-MRZXTL46.cjs} +7 -7
- package/dist/chunk-MRZXTL46.cjs.map +1 -0
- package/dist/{chunk-M5ACSJJ4.js → chunk-MV6BK4WG.js} +13 -14
- package/dist/chunk-MV6BK4WG.js.map +1 -0
- package/dist/{chunk-GAB2QXHH.js → chunk-N2JESOCJ.js} +7 -7
- package/dist/{chunk-GAB2QXHH.js.map → chunk-N2JESOCJ.js.map} +1 -1
- package/dist/{chunk-K6EJLBBQ.js → chunk-N5XMBHX7.js} +3 -3
- package/dist/{chunk-K6EJLBBQ.js.map → chunk-N5XMBHX7.js.map} +1 -1
- package/dist/{chunk-MH4QS7OE.cjs → chunk-N7ABDCQ6.cjs} +16 -16
- package/dist/{chunk-MH4QS7OE.cjs.map → chunk-N7ABDCQ6.cjs.map} +1 -1
- package/dist/{chunk-G73TVXDQ.js → chunk-NVXTHTJI.js} +9 -9
- package/dist/{chunk-G73TVXDQ.js.map → chunk-NVXTHTJI.js.map} +1 -1
- package/dist/{chunk-YLGTDBB2.cjs → chunk-O3F6DYWR.cjs} +3 -3
- package/dist/{chunk-YLGTDBB2.cjs.map → chunk-O3F6DYWR.cjs.map} +1 -1
- package/dist/{chunk-IECPLOSZ.js → chunk-OFNA5HS5.js} +12 -12
- package/dist/{chunk-IECPLOSZ.js.map → chunk-OFNA5HS5.js.map} +1 -1
- package/dist/{chunk-4HRD4S25.js → chunk-OTM7RL2L.js} +5 -5
- package/dist/{chunk-4HRD4S25.js.map → chunk-OTM7RL2L.js.map} +1 -1
- package/dist/{chunk-TJJ63UJV.js → chunk-OTSVOPKP.js} +3 -3
- package/dist/{chunk-TJJ63UJV.js.map → chunk-OTSVOPKP.js.map} +1 -1
- package/dist/{chunk-PLNDZF2A.cjs → chunk-OWT5B3C2.cjs} +10 -10
- package/dist/chunk-OWT5B3C2.cjs.map +1 -0
- package/dist/{chunk-ZVXOL5H3.js → chunk-OYDJVGFS.js} +3 -3
- package/dist/{chunk-ZVXOL5H3.js.map → chunk-OYDJVGFS.js.map} +1 -1
- package/dist/{chunk-XKDW6B7X.cjs → chunk-P53432AK.cjs} +9 -9
- package/dist/{chunk-XKDW6B7X.cjs.map → chunk-P53432AK.cjs.map} +1 -1
- package/dist/{chunk-WNUU7T62.cjs → chunk-PBZHLHSA.cjs} +3 -3
- package/dist/{chunk-WNUU7T62.cjs.map → chunk-PBZHLHSA.cjs.map} +1 -1
- package/dist/{chunk-S5KUYX3Z.cjs → chunk-PCNJJVTF.cjs} +7 -7
- package/dist/{chunk-S5KUYX3Z.cjs.map → chunk-PCNJJVTF.cjs.map} +1 -1
- package/dist/{chunk-O6E2WC3J.js → chunk-PRP5N7NY.js} +4 -4
- package/dist/chunk-PRP5N7NY.js.map +1 -0
- package/dist/{chunk-MFQ5NBSV.cjs → chunk-QAKIG43N.cjs} +3 -3
- package/dist/{chunk-MFQ5NBSV.cjs.map → chunk-QAKIG43N.cjs.map} +1 -1
- package/dist/{chunk-BBOIFV27.cjs → chunk-QF7CD4JH.cjs} +5 -5
- package/dist/{chunk-BBOIFV27.cjs.map → chunk-QF7CD4JH.cjs.map} +1 -1
- package/dist/{chunk-ZI7JP3TN.js → chunk-QFC736WY.js} +5 -5
- package/dist/{chunk-ZI7JP3TN.js.map → chunk-QFC736WY.js.map} +1 -1
- package/dist/{chunk-ZUQUL53P.cjs → chunk-QHN63FRP.cjs} +10 -10
- package/dist/{chunk-ZUQUL53P.cjs.map → chunk-QHN63FRP.cjs.map} +1 -1
- package/dist/{chunk-CESGP5AF.js → chunk-QPM4CZ4G.js} +3 -3
- package/dist/{chunk-CESGP5AF.js.map → chunk-QPM4CZ4G.js.map} +1 -1
- package/dist/{chunk-LMPPAQKP.cjs → chunk-QUKUX5KU.cjs} +4 -4
- package/dist/{chunk-LMPPAQKP.cjs.map → chunk-QUKUX5KU.cjs.map} +1 -1
- package/dist/{chunk-RUSRAKKA.js → chunk-RANTYGKW.js} +7 -7
- package/dist/{chunk-RUSRAKKA.js.map → chunk-RANTYGKW.js.map} +1 -1
- package/dist/{chunk-M52IS5SO.cjs → chunk-RGMHRPHQ.cjs} +15 -15
- package/dist/chunk-RGMHRPHQ.cjs.map +1 -0
- package/dist/{chunk-Y52NXM73.cjs → chunk-RVBTDXPD.cjs} +5 -5
- package/dist/{chunk-Y52NXM73.cjs.map → chunk-RVBTDXPD.cjs.map} +1 -1
- package/dist/{chunk-RLMU3NHQ.cjs → chunk-S3V2C4DW.cjs} +14 -14
- package/dist/chunk-S3V2C4DW.cjs.map +1 -0
- package/dist/{chunk-6IBBAOQC.cjs → chunk-SONXLQPJ.cjs} +8 -8
- package/dist/chunk-SONXLQPJ.cjs.map +1 -0
- package/dist/{chunk-HIN6PHSE.cjs → chunk-SSCW67KA.cjs} +3 -3
- package/dist/{chunk-HIN6PHSE.cjs.map → chunk-SSCW67KA.cjs.map} +1 -1
- package/dist/{chunk-F2GAZZVS.js → chunk-SVSQXKFL.js} +4 -4
- package/dist/{chunk-F2GAZZVS.js.map → chunk-SVSQXKFL.js.map} +1 -1
- package/dist/{chunk-ZKFFHIEW.js → chunk-SXXDTW7S.js} +4 -4
- package/dist/{chunk-ZKFFHIEW.js.map → chunk-SXXDTW7S.js.map} +1 -1
- package/dist/{chunk-TT3K5D6J.js → chunk-T67FLC55.js} +8 -8
- package/dist/{chunk-TT3K5D6J.js.map → chunk-T67FLC55.js.map} +1 -1
- package/dist/{chunk-FNJDMGJ3.js → chunk-TAYJSIOP.js} +7 -7
- package/dist/{chunk-FNJDMGJ3.js.map → chunk-TAYJSIOP.js.map} +1 -1
- package/dist/{chunk-GCWIZNN2.cjs → chunk-TFKG5FSG.cjs} +8 -8
- package/dist/{chunk-GCWIZNN2.cjs.map → chunk-TFKG5FSG.cjs.map} +1 -1
- package/dist/{chunk-MFBUK4RV.cjs → chunk-TJTC4WNY.cjs} +8 -8
- package/dist/{chunk-MFBUK4RV.cjs.map → chunk-TJTC4WNY.cjs.map} +1 -1
- package/dist/{chunk-BZZDHDMK.cjs → chunk-TLRFXSPA.cjs} +14 -14
- package/dist/{chunk-BZZDHDMK.cjs.map → chunk-TLRFXSPA.cjs.map} +1 -1
- package/dist/{chunk-XDJSFGXW.js → chunk-TMQF2CRN.js} +4 -4
- package/dist/chunk-TMQF2CRN.js.map +1 -0
- package/dist/{chunk-65HKNZFG.cjs → chunk-TTZJ2KXK.cjs} +3 -3
- package/dist/{chunk-65HKNZFG.cjs.map → chunk-TTZJ2KXK.cjs.map} +1 -1
- package/dist/{chunk-P7PKK5BO.js → chunk-UE3QO7R3.js} +4 -4
- package/dist/{chunk-P7PKK5BO.js.map → chunk-UE3QO7R3.js.map} +1 -1
- package/dist/{chunk-QOGKO6JH.cjs → chunk-UET6D7B3.cjs} +6 -6
- package/dist/{chunk-QOGKO6JH.cjs.map → chunk-UET6D7B3.cjs.map} +1 -1
- package/dist/chunk-USWQAMI3.js +35 -0
- package/dist/{chunk-GFYSELJF.js.map → chunk-USWQAMI3.js.map} +1 -1
- package/dist/{chunk-YD4SXA6K.js → chunk-UVMIJCY3.js} +8 -8
- package/dist/chunk-UVMIJCY3.js.map +1 -0
- package/dist/{chunk-DEFGT75G.js → chunk-UVUBV4VZ.js} +6 -6
- package/dist/{chunk-DEFGT75G.js.map → chunk-UVUBV4VZ.js.map} +1 -1
- package/dist/{chunk-CRR3AMJ4.js → chunk-UZCR7DK5.js} +4 -4
- package/dist/{chunk-CRR3AMJ4.js.map → chunk-UZCR7DK5.js.map} +1 -1
- package/dist/{chunk-WKNVZUWZ.cjs → chunk-UZG6LO4Z.cjs} +3 -3
- package/dist/{chunk-WKNVZUWZ.cjs.map → chunk-UZG6LO4Z.cjs.map} +1 -1
- package/dist/{chunk-DCVR6NPP.js → chunk-V4235IZO.js} +3 -3
- package/dist/{chunk-DCVR6NPP.js.map → chunk-V4235IZO.js.map} +1 -1
- package/dist/{chunk-WIS4QRGK.cjs → chunk-V5JTTLJP.cjs} +6 -6
- package/dist/{chunk-WIS4QRGK.cjs.map → chunk-V5JTTLJP.cjs.map} +1 -1
- package/dist/{chunk-NBAHXZHJ.js → chunk-VQXXX6DK.js} +4 -4
- package/dist/{chunk-NBAHXZHJ.js.map → chunk-VQXXX6DK.js.map} +1 -1
- package/dist/{chunk-COH45MGW.cjs → chunk-WFHK2DKG.cjs} +3 -3
- package/dist/{chunk-COH45MGW.cjs.map → chunk-WFHK2DKG.cjs.map} +1 -1
- package/dist/{chunk-VYHZEQIG.js → chunk-WGRLNXNB.js} +6 -6
- package/dist/{chunk-VYHZEQIG.js.map → chunk-WGRLNXNB.js.map} +1 -1
- package/dist/{chunk-XK5WHQ3O.cjs → chunk-WMANILKC.cjs} +4 -4
- package/dist/chunk-WMANILKC.cjs.map +1 -0
- package/dist/{chunk-DHIUMQLP.cjs → chunk-WNUAGRQN.cjs} +4 -4
- package/dist/{chunk-DHIUMQLP.cjs.map → chunk-WNUAGRQN.cjs.map} +1 -1
- package/dist/{chunk-B6CQ4KK7.cjs → chunk-WONP337S.cjs} +13 -14
- package/dist/chunk-WONP337S.cjs.map +1 -0
- package/dist/{chunk-ENYHLZ2X.js → chunk-WW56U3RV.js} +5 -5
- package/dist/{chunk-ENYHLZ2X.js.map → chunk-WW56U3RV.js.map} +1 -1
- package/dist/{chunk-KKWNKBKR.js → chunk-WX5XYDVN.js} +8 -8
- package/dist/{chunk-KKWNKBKR.js.map → chunk-WX5XYDVN.js.map} +1 -1
- package/dist/{chunk-TB35HNBE.js → chunk-X7VIIM2P.js} +3 -3
- package/dist/{chunk-TB35HNBE.js.map → chunk-X7VIIM2P.js.map} +1 -1
- package/dist/{chunk-4NBM3LXN.js → chunk-XB3H2EEL.js} +5 -5
- package/dist/{chunk-4NBM3LXN.js.map → chunk-XB3H2EEL.js.map} +1 -1
- package/dist/{chunk-5RLP77KK.js → chunk-XM3V3RSU.js} +4 -4
- package/dist/{chunk-5RLP77KK.js.map → chunk-XM3V3RSU.js.map} +1 -1
- package/dist/{chunk-IYVV4RD3.cjs → chunk-XM3W5ETT.cjs} +5 -5
- package/dist/{chunk-IYVV4RD3.cjs.map → chunk-XM3W5ETT.cjs.map} +1 -1
- package/dist/{chunk-IWXP2YUP.js → chunk-XOYRJFMU.js} +6 -6
- package/dist/chunk-XOYRJFMU.js.map +1 -0
- package/dist/{chunk-XB6YHUKW.js → chunk-XQDGUXMS.js} +10 -10
- package/dist/{chunk-XB6YHUKW.js.map → chunk-XQDGUXMS.js.map} +1 -1
- package/dist/{chunk-2KAJ4L7C.js → chunk-XS3EIQFP.js} +19 -19
- package/dist/chunk-XS3EIQFP.js.map +1 -0
- package/dist/{chunk-6KXAFP2T.js → chunk-XYOT75HH.js} +3 -3
- package/dist/{chunk-6KXAFP2T.js.map → chunk-XYOT75HH.js.map} +1 -1
- package/dist/{chunk-UDEEPMQ4.js → chunk-Y6LL3B5P.js} +4 -4
- package/dist/{chunk-UDEEPMQ4.js.map → chunk-Y6LL3B5P.js.map} +1 -1
- package/dist/{chunk-OS2QC3NE.cjs → chunk-Y7RGUUTS.cjs} +7 -7
- package/dist/chunk-Y7RGUUTS.cjs.map +1 -0
- package/dist/{chunk-Z6RVBZQ4.js → chunk-Y7UE37QZ.js} +8 -8
- package/dist/{chunk-Z6RVBZQ4.js.map → chunk-Y7UE37QZ.js.map} +1 -1
- package/dist/{chunk-YMDYDUBH.cjs → chunk-YH75G6SP.cjs} +7 -7
- package/dist/{chunk-YMDYDUBH.cjs.map → chunk-YH75G6SP.cjs.map} +1 -1
- package/dist/{chunk-PHDIQ4VC.js → chunk-YQTKTEWS.js} +8 -8
- package/dist/chunk-YQTKTEWS.js.map +1 -0
- package/dist/{chunk-AOFDFBRV.js → chunk-Z4EPQWVC.js} +10 -10
- package/dist/chunk-Z4EPQWVC.js.map +1 -0
- package/dist/{chunk-FVTCPERB.cjs → chunk-Z4UXLQSK.cjs} +15 -15
- package/dist/{chunk-FVTCPERB.cjs.map → chunk-Z4UXLQSK.cjs.map} +1 -1
- package/dist/{chunk-W6RDAZJC.js → chunk-ZAX72LXL.js} +5 -5
- package/dist/chunk-ZAX72LXL.js.map +1 -0
- package/dist/{chunk-NE3Z4AWP.js → chunk-ZULMMW5W.js} +7 -7
- package/dist/{chunk-NE3Z4AWP.js.map → chunk-ZULMMW5W.js.map} +1 -1
- package/dist/color-picker.cjs +2 -2
- package/dist/color-picker.js +1 -1
- package/dist/command.cjs +3 -3
- package/dist/command.js +1 -1
- package/dist/composer.cjs +5 -5
- package/dist/composer.js +3 -3
- package/dist/content-renderer.cjs +4 -4
- package/dist/content-renderer.js +1 -1
- package/dist/context-menu.cjs +3 -3
- package/dist/context-menu.js +1 -1
- package/dist/date-picker.cjs +5 -5
- package/dist/date-picker.js +4 -4
- package/dist/drawer.cjs +3 -3
- package/dist/drawer.js +1 -1
- package/dist/dropdown.cjs +3 -3
- package/dist/dropdown.js +1 -1
- package/dist/editor.cjs +4 -4
- package/dist/editor.js +2 -2
- package/dist/emoji-select.cjs +2 -2
- package/dist/emoji-select.js +1 -1
- package/dist/eyebrow.cjs +2 -2
- package/dist/eyebrow.js +1 -1
- package/dist/faux-client.cjs +2 -2
- package/dist/faux-client.js +1 -1
- package/dist/field.cjs +3 -3
- package/dist/field.js +2 -2
- package/dist/file-browser.cjs +5 -5
- package/dist/file-browser.js +1 -1
- package/dist/file-upload.cjs +3 -3
- package/dist/file-upload.js +1 -1
- package/dist/heading.cjs +2 -2
- package/dist/heading.js +1 -1
- package/dist/image-viewer.cjs +3 -3
- package/dist/image-viewer.js +2 -2
- package/dist/index-list.cjs +2 -2
- package/dist/index-list.js +1 -1
- package/dist/index.cjs +285 -212
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +114 -1
- package/dist/index.d.ts +114 -1
- package/dist/index.js +155 -79
- package/dist/index.js.map +1 -1
- package/dist/input-tag.cjs +6 -6
- package/dist/input-tag.js +1 -1
- package/dist/input.cjs +8 -8
- package/dist/input.js +7 -7
- package/dist/inputs.cjs +28 -28
- package/dist/inputs.js +16 -16
- package/dist/json-editor.cjs +26 -26
- package/dist/json-editor.js +15 -15
- package/dist/kanban.cjs +3 -3
- package/dist/kanban.js +1 -1
- package/dist/kbd.cjs +2 -2
- package/dist/kbd.js +1 -1
- package/dist/magic-wand.cjs +8 -8
- package/dist/magic-wand.js +7 -7
- package/dist/media-viewer.cjs +6 -6
- package/dist/media-viewer.js +5 -5
- package/dist/menu.cjs +3 -3
- package/dist/menu.js +1 -1
- package/dist/mobile-menu.cjs +3 -3
- package/dist/mobile-menu.js +1 -1
- package/dist/modal.cjs +3 -3
- package/dist/modal.js +1 -1
- package/dist/mode.cjs +3 -3
- package/dist/mode.js +2 -2
- package/dist/mood-meter.cjs +2 -2
- package/dist/mood-meter.js +1 -1
- package/dist/multi-switch.cjs +5 -5
- package/dist/multi-switch.js +4 -4
- package/dist/navbar.cjs +3 -3
- package/dist/navbar.js +1 -1
- package/dist/otp-input.cjs +2 -2
- package/dist/otp-input.js +1 -1
- package/dist/pagination.cjs +2 -2
- package/dist/pagination.js +1 -1
- package/dist/paste-pills.cjs +15 -15
- package/dist/paste-pills.js +2 -2
- package/dist/pdf-viewer.cjs +3 -3
- package/dist/pdf-viewer.js +2 -2
- package/dist/pillbox.cjs +2 -2
- package/dist/pillbox.js +1 -1
- package/dist/popover.cjs +3 -3
- package/dist/popover.js +1 -1
- package/dist/profile.cjs +3 -3
- package/dist/profile.js +2 -2
- package/dist/progress.cjs +2 -2
- package/dist/progress.js +1 -1
- package/dist/prompt-input.cjs +5 -5
- package/dist/prompt-input.js +4 -4
- package/dist/pull-quote.cjs +2 -2
- package/dist/pull-quote.js +1 -1
- package/dist/radio-group.cjs +5 -5
- package/dist/radio-group.js +4 -4
- package/dist/reason-tag.cjs +4 -4
- package/dist/reason-tag.js +3 -3
- package/dist/select.cjs +6 -6
- package/dist/select.js +5 -5
- package/dist/separator.cjs +2 -2
- package/dist/separator.js +1 -1
- package/dist/sidebar.cjs +3 -3
- package/dist/sidebar.js +1 -1
- package/dist/skeleton.cjs +2 -2
- package/dist/skeleton.js +1 -1
- package/dist/slider.cjs +5 -5
- package/dist/slider.js +4 -4
- package/dist/stat-list.cjs +2 -2
- package/dist/stat-list.js +1 -1
- package/dist/stat.cjs +3 -3
- package/dist/stat.js +1 -1
- package/dist/styles.css +15 -15
- package/dist/styles.css.map +1 -1
- package/dist/switch.cjs +3 -3
- package/dist/switch.js +2 -2
- package/dist/table.cjs +11 -11
- package/dist/table.js +1 -1
- package/dist/tabs.cjs +3 -3
- package/dist/tabs.js +1 -1
- package/dist/text.cjs +2 -2
- package/dist/text.js +1 -1
- package/dist/textarea.cjs +6 -6
- package/dist/textarea.js +5 -5
- package/dist/time-grid.cjs +2 -2
- package/dist/time-grid.js +1 -1
- package/dist/time-picker.cjs +2 -2
- package/dist/time-picker.js +1 -1
- package/dist/timeline.cjs +4 -4
- package/dist/timeline.js +1 -1
- package/dist/toast.cjs +3 -3
- package/dist/toast.js +1 -1
- package/dist/tree-nav.cjs +3 -3
- package/dist/tree-nav.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-25UPDBI6.cjs.map +0 -1
- package/dist/chunk-2KAJ4L7C.js.map +0 -1
- package/dist/chunk-32AJIHBZ.js.map +0 -1
- package/dist/chunk-5F6V5HHT.cjs.map +0 -1
- package/dist/chunk-6IBBAOQC.cjs.map +0 -1
- package/dist/chunk-7EZBMGEE.cjs.map +0 -1
- package/dist/chunk-7JDVCQXD.js.map +0 -1
- package/dist/chunk-AOFDFBRV.js.map +0 -1
- package/dist/chunk-B6CQ4KK7.cjs.map +0 -1
- package/dist/chunk-CF2U25LM.js.map +0 -1
- package/dist/chunk-FSRPZYZZ.js.map +0 -1
- package/dist/chunk-FYKOLKQZ.js.map +0 -1
- package/dist/chunk-GFYSELJF.js +0 -35
- package/dist/chunk-GU5BYZTR.cjs.map +0 -1
- package/dist/chunk-HKRB2Z6R.cjs.map +0 -1
- package/dist/chunk-I6L7OP7G.cjs.map +0 -1
- package/dist/chunk-IWXP2YUP.js.map +0 -1
- package/dist/chunk-JFOORUUD.cjs.map +0 -1
- package/dist/chunk-LLA33GKC.cjs.map +0 -1
- package/dist/chunk-M52IS5SO.cjs.map +0 -1
- package/dist/chunk-M5ACSJJ4.js.map +0 -1
- package/dist/chunk-N6OZZAOT.js.map +0 -1
- package/dist/chunk-O6E2WC3J.js.map +0 -1
- package/dist/chunk-OS2QC3NE.cjs.map +0 -1
- package/dist/chunk-P7Q2YIIS.js.map +0 -1
- package/dist/chunk-PCTZNK2Z.js.map +0 -1
- package/dist/chunk-PHDIQ4VC.js.map +0 -1
- package/dist/chunk-PLNDZF2A.cjs.map +0 -1
- package/dist/chunk-PWEZCMIY.js.map +0 -1
- package/dist/chunk-QAFAPHAF.cjs.map +0 -1
- package/dist/chunk-QSFTWIUH.cjs.map +0 -1
- package/dist/chunk-RA2VOQ46.js.map +0 -1
- package/dist/chunk-RLMU3NHQ.cjs.map +0 -1
- package/dist/chunk-RPVCMW64.cjs.map +0 -1
- package/dist/chunk-T45XK5GN.cjs.map +0 -1
- package/dist/chunk-TDDWWAM5.js.map +0 -1
- package/dist/chunk-TNYWQ6EQ.js.map +0 -1
- package/dist/chunk-VKXNCYLE.cjs.map +0 -1
- package/dist/chunk-W6RDAZJC.js.map +0 -1
- package/dist/chunk-WBVWV2V7.cjs.map +0 -1
- package/dist/chunk-XDJSFGXW.js.map +0 -1
- package/dist/chunk-XK5WHQ3O.cjs.map +0 -1
- package/dist/chunk-YD4SXA6K.js.map +0 -1
- package/dist/chunk-Z3NSPDTW.cjs.map +0 -1
- package/dist/chunk-ZLWCZV7R.js.map +0 -1
- package/dist/chunk-ZY4CVNNZ.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Chart/chart.utils.ts","../src/components/Chart/ChartBar.tsx","../src/components/Chart/ChartDonut.tsx","../src/components/Chart/ChartAxis.tsx","../src/components/Chart/ChartGrid.tsx","../src/components/Chart/ChartTooltip.tsx","../src/components/Chart/ChartLine.tsx","../src/components/Chart/ChartArea.tsx","../src/components/Chart/ChartPie.tsx","../src/components/Chart/ChartSparkline.tsx","../src/components/Chart/ChartHorizontalBar.tsx","../src/components/Chart/ChartStackedBar.tsx","../src/components/Chart/Chart.tsx"],"names":["useMemo","jsxs","cn","jsx","useRef","useState","PADDING"],"mappings":"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","file":"chunk-B6CQ4KK7.cjs","sourcesContent":["export const DEFAULT_COLORS = [\n \"#3b82f6\", \"#10b981\", \"#f59e0b\", \"#ef4444\", \"#8b5cf6\",\n \"#06b6d4\", \"#ec4899\", \"#f97316\",\n];\n\nexport function createLinearScale(\n domain: [number, number],\n range: [number, number],\n): (value: number) => number {\n const [d0, d1] = domain;\n const [r0, r1] = range;\n const span = d1 - d0 || 1;\n return (value: number) => r0 + ((value - d0) / span) * (r1 - r0);\n}\n\nexport function linearPath(points: [number, number][]): string {\n if (points.length === 0) return \"\";\n return points.map((p, i) => `${i === 0 ? \"M\" : \"L\"}${p[0]},${p[1]}`).join(\" \");\n}\n\nexport function monotonePath(points: [number, number][]): string {\n if (points.length < 2) return linearPath(points);\n if (points.length === 2) return linearPath(points);\n\n const n = points.length;\n const dx: number[] = [];\n const dy: number[] = [];\n const m: number[] = [];\n\n for (let i = 0; i < n - 1; i++) {\n dx.push(points[i + 1][0] - points[i][0]);\n dy.push(points[i + 1][1] - points[i][1]);\n m.push(dy[i] / (dx[i] || 1));\n }\n\n // Fritsch-Carlson tangents\n const tangents: number[] = [m[0]];\n for (let i = 1; i < n - 1; i++) {\n if (m[i - 1] * m[i] <= 0) {\n tangents.push(0);\n } else {\n tangents.push((m[i - 1] + m[i]) / 2);\n }\n }\n tangents.push(m[n - 2]);\n\n // Clamp tangents\n for (let i = 0; i < n - 1; i++) {\n if (Math.abs(m[i]) < 1e-6) {\n tangents[i] = 0;\n tangents[i + 1] = 0;\n } else {\n const a = tangents[i] / m[i];\n const b = tangents[i + 1] / m[i];\n const s = a * a + b * b;\n if (s > 9) {\n const t = 3 / Math.sqrt(s);\n tangents[i] = t * a * m[i];\n tangents[i + 1] = t * b * m[i];\n }\n }\n }\n\n let d = `M${points[0][0]},${points[0][1]}`;\n for (let i = 0; i < n - 1; i++) {\n const p0 = points[i];\n const p1 = points[i + 1];\n const dxi = dx[i] / 3;\n const cp1x = p0[0] + dxi;\n const cp1y = p0[1] + tangents[i] * dxi;\n const cp2x = p1[0] - dxi;\n const cp2y = p1[1] - tangents[i + 1] * dxi;\n d += ` C${cp1x},${cp1y} ${cp2x},${cp2y} ${p1[0]},${p1[1]}`;\n }\n\n return d;\n}\n\nexport function areaPath(points: [number, number][], baseline: number): string {\n if (points.length === 0) return \"\";\n const top = monotonePath(points);\n const lastPoint = points[points.length - 1];\n const firstPoint = points[0];\n return `${top} L${lastPoint[0]},${baseline} L${firstPoint[0]},${baseline} Z`;\n}\n\nexport function computeTicks(min: number, max: number, count: number = 5): number[] {\n if (count < 2) return [min];\n const ticks: number[] = [];\n const step = (max - min) / (count - 1);\n for (let i = 0; i < count; i++) {\n ticks.push(min + step * i);\n }\n return ticks;\n}\n\nexport function niceNum(range: number, round: boolean): number {\n const exponent = Math.floor(Math.log10(range));\n const fraction = range / Math.pow(10, exponent);\n let niceFraction: number;\n if (round) {\n if (fraction < 1.5) niceFraction = 1;\n else if (fraction < 3) niceFraction = 2;\n else if (fraction < 7) niceFraction = 5;\n else niceFraction = 10;\n } else {\n if (fraction <= 1) niceFraction = 1;\n else if (fraction <= 2) niceFraction = 2;\n else if (fraction <= 5) niceFraction = 5;\n else niceFraction = 10;\n }\n return niceFraction * Math.pow(10, exponent);\n}\n\nexport function niceScale(min: number, max: number, tickCount: number = 5): { min: number; max: number; ticks: number[] } {\n if (min === max) {\n return { min: min - 1, max: max + 1, ticks: computeTicks(min - 1, max + 1, tickCount) };\n }\n const range = niceNum(max - min, false);\n const tickSpacing = niceNum(range / (tickCount - 1), true);\n const niceMin = Math.floor(min / tickSpacing) * tickSpacing;\n const niceMax = Math.ceil(max / tickSpacing) * tickSpacing;\n const ticks: number[] = [];\n for (let v = niceMin; v <= niceMax + tickSpacing * 0.5; v += tickSpacing) {\n ticks.push(Math.round(v * 1e10) / 1e10);\n }\n return { min: niceMin, max: niceMax, ticks };\n}\n","import { useMemo } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { DEFAULT_COLORS } from \"./chart.utils\";\nimport type { ChartBarProps } from \"./Chart.types\";\n\nexport function ChartBar({\n data,\n height = 200,\n showValues = false,\n className,\n}: ChartBarProps) {\n const maxValue = useMemo(\n () => Math.max(...data.map((d) => d.value), 1),\n [data],\n );\n\n return (\n <div className={cn(\"w-full\", className)} data-react-fancy-chart-bar=\"\">\n {showValues && (\n <div className=\"mb-1 flex gap-2\">\n {data.map((item) => (\n <div\n key={item.label}\n className=\"flex-1 text-center text-xs font-medium text-zinc-500 dark:text-zinc-400\"\n >\n {item.value}\n </div>\n ))}\n </div>\n )}\n <div\n className=\"flex items-end gap-2\"\n style={{ height }}\n >\n {data.map((item, i) => {\n const barHeight = (item.value / maxValue) * 100;\n const color = item.color ?? DEFAULT_COLORS[i % DEFAULT_COLORS.length];\n\n return (\n <div\n key={item.label}\n className=\"flex h-full flex-1 items-end justify-center\"\n data-react-fancy-chart-bar-column=\"\"\n >\n <div\n data-react-fancy-chart-bar-item=\"\"\n className=\"w-full rounded-t-md transition-all duration-500\"\n style={{\n height: `${barHeight}%`,\n backgroundColor: color,\n minHeight: 4,\n }}\n />\n </div>\n );\n })}\n </div>\n <div className=\"mt-2 flex gap-2\">\n {data.map((item) => (\n <div\n key={item.label}\n className=\"flex-1 text-center text-xs text-zinc-500 dark:text-zinc-400\"\n >\n {item.label}\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nChartBar.displayName = \"ChartBar\";\n","import { useMemo } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { DEFAULT_COLORS } from \"./chart.utils\";\nimport type { ChartDonutProps } from \"./Chart.types\";\n\nexport function ChartDonut({\n data,\n size = 160,\n strokeWidth = 24,\n showLegend = true,\n className,\n}: ChartDonutProps) {\n const total = useMemo(() => data.reduce((s, d) => s + d.value, 0), [data]);\n const radius = (size - strokeWidth) / 2;\n const circumference = 2 * Math.PI * radius;\n\n const segments = useMemo(() => {\n let offset = 0;\n return data.map((item, i) => {\n const pct = total > 0 ? item.value / total : 0;\n const dash = pct * circumference;\n const gap = circumference - dash;\n const rotation = (offset / total) * 360;\n offset += item.value;\n\n return {\n ...item,\n dash,\n gap,\n rotation,\n color: item.color ?? DEFAULT_COLORS[i % DEFAULT_COLORS.length],\n };\n });\n }, [data, total, circumference]);\n\n return (\n <div data-react-fancy-chart-donut=\"\" className={cn(\"inline-flex items-center gap-6\", className)}>\n <svg width={size} height={size} viewBox={`0 0 ${size} ${size}`}>\n {segments.map((seg) => (\n <circle\n key={seg.label}\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n stroke={seg.color}\n strokeWidth={strokeWidth}\n strokeDasharray={`${seg.dash} ${seg.gap}`}\n strokeLinecap=\"round\"\n transform={`rotate(${seg.rotation - 90} ${size / 2} ${size / 2})`}\n />\n ))}\n </svg>\n {showLegend && (\n <div className=\"flex flex-col gap-2\">\n {segments.map((seg) => (\n <div key={seg.label} className=\"flex items-center gap-2 text-sm\">\n <div\n className=\"h-3 w-3 rounded-full\"\n style={{ backgroundColor: seg.color }}\n />\n <span className=\"text-zinc-600 dark:text-zinc-400\">\n {seg.label}\n </span>\n <span className=\"font-medium\">{seg.value}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nChartDonut.displayName = \"ChartDonut\";\n","interface ChartAxisProps {\n orientation: \"x\" | \"y\";\n ticks: number[];\n scale: (value: number) => number;\n x: number;\n y: number;\n length: number;\n label?: string;\n formatTick?: (value: number) => string;\n}\n\nfunction defaultFormat(value: number): string {\n if (Math.abs(value) >= 1000) return `${(value / 1000).toFixed(value % 1000 === 0 ? 0 : 1)}k`;\n if (Number.isInteger(value)) return String(value);\n return value.toFixed(1);\n}\n\nexport function ChartAxis({\n orientation,\n ticks,\n scale,\n x,\n y,\n length,\n label,\n formatTick = defaultFormat,\n}: ChartAxisProps) {\n if (orientation === \"x\") {\n return (\n <g>\n <line x1={x} y1={y} x2={x + length} y2={y} stroke=\"currentColor\" className=\"text-zinc-200 dark:text-zinc-700\" />\n {ticks.map((tick) => {\n const tx = scale(tick);\n return (\n <g key={tick}>\n <line x1={tx} y1={y} x2={tx} y2={y + 4} stroke=\"currentColor\" className=\"text-zinc-300 dark:text-zinc-600\" />\n <text x={tx} y={y + 16} textAnchor=\"middle\" className=\"fill-zinc-500 text-[10px] dark:fill-zinc-400\">\n {formatTick(tick)}\n </text>\n </g>\n );\n })}\n {label && (\n <text x={x + length / 2} y={y + 32} textAnchor=\"middle\" className=\"fill-zinc-500 text-[11px] dark:fill-zinc-400\">\n {label}\n </text>\n )}\n </g>\n );\n }\n\n return (\n <g>\n <line x1={x} y1={y} x2={x} y2={y + length} stroke=\"currentColor\" className=\"text-zinc-200 dark:text-zinc-700\" />\n {ticks.map((tick) => {\n const ty = scale(tick);\n return (\n <g key={tick}>\n <line x1={x - 4} y1={ty} x2={x} y2={ty} stroke=\"currentColor\" className=\"text-zinc-300 dark:text-zinc-600\" />\n <text x={x - 8} y={ty + 3} textAnchor=\"end\" className=\"fill-zinc-500 text-[10px] dark:fill-zinc-400\">\n {formatTick(tick)}\n </text>\n </g>\n );\n })}\n {label && (\n <text\n x={x - 36}\n y={y + length / 2}\n textAnchor=\"middle\"\n transform={`rotate(-90, ${x - 36}, ${y + length / 2})`}\n className=\"fill-zinc-500 text-[11px] dark:fill-zinc-400\"\n >\n {label}\n </text>\n )}\n </g>\n );\n}\n\nChartAxis.displayName = \"ChartAxis\";\n","interface ChartGridProps {\n x: number;\n y: number;\n width: number;\n height: number;\n horizontal?: { ticks: number[]; scale: (v: number) => number };\n vertical?: { ticks: number[]; scale: (v: number) => number };\n}\n\nexport function ChartGrid({ x, y, width, height, horizontal, vertical }: ChartGridProps) {\n return (\n <g>\n {horizontal?.ticks.map((tick) => {\n const ty = horizontal.scale(tick);\n return (\n <line\n key={`h-${tick}`}\n x1={x}\n y1={ty}\n x2={x + width}\n y2={ty}\n stroke=\"currentColor\"\n strokeDasharray=\"4 4\"\n className=\"text-zinc-100 dark:text-zinc-800\"\n />\n );\n })}\n {vertical?.ticks.map((tick) => {\n const tx = vertical.scale(tick);\n return (\n <line\n key={`v-${tick}`}\n x1={tx}\n y1={y}\n x2={tx}\n y2={y + height}\n stroke=\"currentColor\"\n strokeDasharray=\"4 4\"\n className=\"text-zinc-100 dark:text-zinc-800\"\n />\n );\n })}\n </g>\n );\n}\n\nChartGrid.displayName = \"ChartGrid\";\n","import { cn } from \"../../utils/cn\";\n\ninterface ChartTooltipProps {\n visible: boolean;\n x: number;\n y: number;\n content: React.ReactNode;\n className?: string;\n}\n\nexport function ChartTooltip({ visible, x, y, content, className }: ChartTooltipProps) {\n if (!visible) return null;\n\n return (\n <div\n className={cn(\n \"pointer-events-none absolute z-50 rounded-lg border border-zinc-200 bg-white px-3 py-2 text-xs shadow-lg dark:border-zinc-700 dark:bg-zinc-900\",\n className,\n )}\n style={{\n left: x,\n top: y,\n transform: \"translate(-50%, -100%) translateY(-8px)\",\n }}\n >\n {content}\n </div>\n );\n}\n\nChartTooltip.displayName = \"ChartTooltip\";\n","import { useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { DEFAULT_COLORS, createLinearScale, linearPath, monotonePath, niceScale } from \"./chart.utils\";\nimport { ChartAxis } from \"./ChartAxis\";\nimport { ChartGrid } from \"./ChartGrid\";\nimport { ChartTooltip } from \"./ChartTooltip\";\nimport type { ChartLineProps } from \"./Chart.types\";\n\nconst PADDING = { top: 16, right: 16, bottom: 40, left: 48 };\n\nexport function ChartLine({\n labels,\n series,\n height = 240,\n curve = \"monotone\",\n showDots = true,\n fill = false,\n fillOpacity = 0.1,\n xAxis = true,\n yAxis = true,\n grid = true,\n tooltip = true,\n animate = true,\n responsive = false,\n className,\n}: ChartLineProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [hoverInfo, setHoverInfo] = useState<{ x: number; y: number; labelIdx: number } | null>(null);\n const width = 500;\n\n const plotWidth = width - PADDING.left - PADDING.right;\n const plotHeight = height - PADDING.top - PADDING.bottom;\n\n const allValues = series.flatMap((s) => s.data);\n const dataMin = Math.min(0, ...allValues);\n const dataMax = Math.max(...allValues);\n\n const { min: yMin, max: yMax, ticks: yTicks } = useMemo(\n () => niceScale(dataMin, dataMax, 5),\n [dataMin, dataMax],\n );\n\n const xScale = useMemo(\n () => createLinearScale([0, labels.length - 1], [PADDING.left, PADDING.left + plotWidth]),\n [labels.length, plotWidth],\n );\n const yScale = useMemo(\n () => createLinearScale([yMin, yMax], [PADDING.top + plotHeight, PADDING.top]),\n [yMin, yMax, plotHeight],\n );\n\n const pathFn = curve === \"monotone\" ? monotonePath : linearPath;\n\n const handleMouseMove = (e: React.MouseEvent) => {\n if (!tooltip || !containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n const svgX = ((e.clientX - rect.left) / rect.width) * width;\n const closestIdx = Math.round(((svgX - PADDING.left) / plotWidth) * (labels.length - 1));\n const idx = Math.max(0, Math.min(labels.length - 1, closestIdx));\n setHoverInfo({\n x: ((xScale(idx) / width) * rect.width),\n y: e.clientY - rect.top,\n labelIdx: idx,\n });\n };\n\n const svgProps = responsive\n ? { viewBox: `0 0 ${width} ${height}`, width: \"100%\", preserveAspectRatio: \"xMidYMid meet\" as const }\n : { width, height };\n\n return (\n <div\n ref={containerRef}\n data-react-fancy-chart-line=\"\"\n className={cn(\"relative\", className)}\n onMouseMove={handleMouseMove}\n onMouseLeave={() => setHoverInfo(null)}\n >\n <svg {...svgProps} height={responsive ? undefined : height}>\n {grid && (\n <ChartGrid\n x={PADDING.left}\n y={PADDING.top}\n width={plotWidth}\n height={plotHeight}\n horizontal={{ ticks: yTicks, scale: yScale }}\n />\n )}\n\n {series.map((s, si) => {\n const color = s.color ?? DEFAULT_COLORS[si % DEFAULT_COLORS.length];\n const points: [number, number][] = s.data.map((v, i) => [xScale(i), yScale(v)]);\n const d = pathFn(points);\n\n return (\n <g key={s.label}>\n {fill && (\n <path\n d={`${d} L${points[points.length - 1][0]},${yScale(yMin)} L${points[0][0]},${yScale(yMin)} Z`}\n fill={color}\n fillOpacity={fillOpacity}\n />\n )}\n <path\n d={d}\n fill=\"none\"\n stroke={color}\n strokeWidth={2}\n className={animate ? \"transition-all duration-500\" : \"\"}\n />\n {showDots && points.map(([px, py], i) => (\n <circle\n key={i}\n cx={px}\n cy={py}\n r={3}\n fill=\"white\"\n stroke={color}\n strokeWidth={2}\n />\n ))}\n </g>\n );\n })}\n\n {yAxis && (\n <ChartAxis orientation=\"y\" ticks={yTicks} scale={yScale} x={PADDING.left} y={PADDING.top} length={plotHeight} />\n )}\n {xAxis && (\n <ChartAxis\n orientation=\"x\"\n ticks={labels.map((_, i) => i)}\n scale={xScale}\n x={PADDING.left}\n y={PADDING.top + plotHeight}\n length={plotWidth}\n formatTick={(v) => labels[Math.round(v)] ?? \"\"}\n />\n )}\n\n {/* Hover line */}\n {hoverInfo !== null && (\n <line\n x1={xScale(hoverInfo.labelIdx)}\n y1={PADDING.top}\n x2={xScale(hoverInfo.labelIdx)}\n y2={PADDING.top + plotHeight}\n stroke=\"currentColor\"\n strokeDasharray=\"4 4\"\n className=\"text-zinc-300 dark:text-zinc-600\"\n />\n )}\n </svg>\n\n {tooltip && hoverInfo !== null && (\n <ChartTooltip\n visible\n x={hoverInfo.x}\n y={hoverInfo.y}\n content={\n <div>\n <div className=\"mb-1 font-medium\">{labels[hoverInfo.labelIdx]}</div>\n {series.map((s, si) => (\n <div key={s.label} className=\"flex items-center gap-2\">\n <span\n className=\"inline-block h-2 w-2 rounded-full\"\n style={{ backgroundColor: s.color ?? DEFAULT_COLORS[si % DEFAULT_COLORS.length] }}\n />\n <span className=\"text-zinc-500\">{s.label}:</span>\n <span className=\"font-medium\">{s.data[hoverInfo.labelIdx]}</span>\n </div>\n ))}\n </div>\n }\n />\n )}\n\n {/* Legend */}\n {series.length > 1 && (\n <div className=\"mt-2 flex flex-wrap items-center justify-center gap-4\">\n {series.map((s, si) => (\n <div key={s.label} className=\"flex items-center gap-1.5 text-xs\">\n <span\n className=\"inline-block h-2.5 w-2.5 rounded-full\"\n style={{ backgroundColor: s.color ?? DEFAULT_COLORS[si % DEFAULT_COLORS.length] }}\n />\n <span className=\"text-zinc-600 dark:text-zinc-400\">{s.label}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nChartLine.displayName = \"ChartLine\";\n","import { ChartLine } from \"./ChartLine\";\nimport type { ChartAreaProps } from \"./Chart.types\";\n\nexport function ChartArea(props: ChartAreaProps) {\n return <ChartLine {...props} fill fillOpacity={0.15} />;\n}\n\nChartArea.displayName = \"ChartArea\";\n","import { useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { DEFAULT_COLORS } from \"./chart.utils\";\nimport { ChartTooltip } from \"./ChartTooltip\";\nimport type { ChartPieProps } from \"./Chart.types\";\n\nexport function ChartPie({\n data,\n size = 200,\n showLabels = false,\n tooltip = true,\n className,\n}: ChartPieProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [hoverIdx, setHoverIdx] = useState<number | null>(null);\n const [tooltipPos, setTooltipPos] = useState({ x: 0, y: 0 });\n\n const total = useMemo(() => data.reduce((s, d) => s + d.value, 0), [data]);\n const center = size / 2;\n const radius = size / 2 - 4;\n\n const slices = useMemo(() => {\n let startAngle = -Math.PI / 2;\n return data.map((item, i) => {\n const pct = total > 0 ? item.value / total : 0;\n const angle = pct * 2 * Math.PI;\n const endAngle = startAngle + angle;\n const largeArc = angle > Math.PI ? 1 : 0;\n\n const x1 = center + radius * Math.cos(startAngle);\n const y1 = center + radius * Math.sin(startAngle);\n const x2 = center + radius * Math.cos(endAngle);\n const y2 = center + radius * Math.sin(endAngle);\n\n const midAngle = startAngle + angle / 2;\n const labelX = center + (radius * 0.65) * Math.cos(midAngle);\n const labelY = center + (radius * 0.65) * Math.sin(midAngle);\n\n const d = pct >= 1\n ? `M${center},${center - radius} A${radius},${radius} 0 1 1 ${center},${center + radius} A${radius},${radius} 0 1 1 ${center},${center - radius}`\n : `M${center},${center} L${x1},${y1} A${radius},${radius} 0 ${largeArc} 1 ${x2},${y2} Z`;\n\n const color = item.color ?? DEFAULT_COLORS[i % DEFAULT_COLORS.length];\n startAngle = endAngle;\n\n return { ...item, d, color, labelX, labelY, pct };\n });\n }, [data, total, center, radius]);\n\n const handleMouseMove = (e: React.MouseEvent) => {\n if (!containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n setTooltipPos({ x: e.clientX - rect.left, y: e.clientY - rect.top });\n };\n\n return (\n <div ref={containerRef} data-react-fancy-chart-pie=\"\" className={cn(\"relative inline-flex items-center gap-6\", className)} onMouseMove={handleMouseMove}>\n <svg width={size} height={size}>\n {slices.map((slice, i) => (\n <g key={slice.label}>\n <path\n d={slice.d}\n fill={slice.color}\n stroke=\"white\"\n strokeWidth={2}\n className=\"transition-opacity\"\n opacity={hoverIdx !== null && hoverIdx !== i ? 0.5 : 1}\n onMouseEnter={() => setHoverIdx(i)}\n onMouseLeave={() => setHoverIdx(null)}\n />\n {showLabels && slice.pct > 0.05 && (\n <text\n x={slice.labelX}\n y={slice.labelY}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n className=\"fill-white text-[10px] font-medium\"\n >\n {Math.round(slice.pct * 100)}%\n </text>\n )}\n </g>\n ))}\n </svg>\n\n {/* Legend */}\n <div className=\"flex flex-col gap-2\">\n {slices.map((slice) => (\n <div key={slice.label} className=\"flex items-center gap-2 text-sm\">\n <div className=\"h-3 w-3 rounded-full\" style={{ backgroundColor: slice.color }} />\n <span className=\"text-zinc-600 dark:text-zinc-400\">{slice.label}</span>\n <span className=\"font-medium\">{slice.value}</span>\n </div>\n ))}\n </div>\n\n {tooltip && hoverIdx !== null && (\n <ChartTooltip\n visible\n x={tooltipPos.x}\n y={tooltipPos.y}\n content={\n <div>\n <span className=\"font-medium\">{slices[hoverIdx].label}</span>:{\" \"}\n {slices[hoverIdx].value} ({Math.round(slices[hoverIdx].pct * 100)}%)\n </div>\n }\n />\n )}\n </div>\n );\n}\n\nChartPie.displayName = \"ChartPie\";\n","import { useMemo } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { createLinearScale, monotonePath } from \"./chart.utils\";\nimport type { ChartSparklineProps } from \"./Chart.types\";\n\nexport function ChartSparkline({\n data,\n width = 120,\n height = 32,\n color = \"#3b82f6\",\n min: floor,\n className,\n}: ChartSparklineProps) {\n const d = useMemo(() => {\n if (data.length < 2) return \"\";\n // `min` lowers the bottom of the scale. A value below it still extends the\n // scale, as `Chart.Line` does with zero, so no point lands outside the box.\n const dataMin = Math.min(...data);\n const min = floor === undefined ? dataMin : Math.min(floor, dataMin);\n const max = Math.max(...data);\n const xScale = createLinearScale([0, data.length - 1], [1, width - 1]);\n const yScale = createLinearScale([min, max], [height - 2, 2]);\n const points: [number, number][] = data.map((v, i) => [xScale(i), yScale(v)]);\n return monotonePath(points);\n }, [data, width, height, floor]);\n\n return (\n <svg\n width={width}\n height={height}\n className={cn(\"inline-block\", className)}\n data-react-fancy-chart-sparkline=\"\"\n >\n <path d={d} fill=\"none\" stroke={color} strokeWidth={1.5} strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nChartSparkline.displayName = \"ChartSparkline\";\n","import { useMemo } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { DEFAULT_COLORS } from \"./chart.utils\";\nimport type { ChartHorizontalBarProps } from \"./Chart.types\";\n\nexport function ChartHorizontalBar({\n data,\n height,\n showValues = true,\n className,\n}: ChartHorizontalBarProps) {\n const maxValue = useMemo(\n () => Math.max(...data.map((d) => d.value), 1),\n [data],\n );\n\n const barHeight = 28;\n const gap = 8;\n const computedHeight = height ?? data.length * (barHeight + gap) - gap;\n\n return (\n <div className={cn(\"w-full\", className)} data-react-fancy-chart-horizontal-bar=\"\">\n <div className=\"flex flex-col gap-2\" style={{ height: computedHeight }}>\n {data.map((item, i) => {\n const widthPct = (item.value / maxValue) * 100;\n const color = item.color ?? DEFAULT_COLORS[i % DEFAULT_COLORS.length];\n\n return (\n <div key={item.label} className=\"flex items-center gap-3\">\n <span className=\"w-20 shrink-0 truncate text-right text-xs text-zinc-500 dark:text-zinc-400\">\n {item.label}\n </span>\n <div className=\"relative flex-1\">\n <div\n className=\"h-7 rounded-r-md transition-all duration-500\"\n style={{\n width: `${widthPct}%`,\n backgroundColor: color,\n minWidth: 4,\n }}\n />\n {showValues && (\n <span className=\"absolute top-1/2 left-full ml-2 -translate-y-1/2 text-xs font-medium text-zinc-500\">\n {item.value}\n </span>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nChartHorizontalBar.displayName = \"ChartHorizontalBar\";\n","import { useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { DEFAULT_COLORS, createLinearScale, niceScale } from \"./chart.utils\";\nimport { ChartAxis } from \"./ChartAxis\";\nimport { ChartGrid } from \"./ChartGrid\";\nimport { ChartTooltip } from \"./ChartTooltip\";\nimport type { ChartStackedBarProps } from \"./Chart.types\";\n\nconst PADDING = { top: 16, right: 16, bottom: 40, left: 48 };\n\nexport function ChartStackedBar({\n labels,\n series,\n height = 240,\n xAxis = true,\n yAxis = true,\n grid = true,\n tooltip = true,\n responsive = false,\n className,\n}: ChartStackedBarProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [hoverIdx, setHoverIdx] = useState<number | null>(null);\n const [tooltipPos, setTooltipPos] = useState({ x: 0, y: 0 });\n const width = 500;\n\n const plotWidth = width - PADDING.left - PADDING.right;\n const plotHeight = height - PADDING.top - PADDING.bottom;\n\n const stackTotals = useMemo(\n () => labels.map((_, li) => series.reduce((sum, s) => sum + (s.data[li] ?? 0), 0)),\n [labels, series],\n );\n\n const maxTotal = Math.max(...stackTotals, 1);\n const { min: yMin, max: yMax, ticks: yTicks } = useMemo(\n () => niceScale(0, maxTotal, 5),\n [maxTotal],\n );\n\n const yScale = useMemo(\n () => createLinearScale([yMin, yMax], [PADDING.top + plotHeight, PADDING.top]),\n [yMin, yMax, plotHeight],\n );\n\n const barWidth = Math.max(8, (plotWidth / labels.length) * 0.6);\n const barGap = (plotWidth - barWidth * labels.length) / (labels.length + 1);\n\n const handleMouseMove = (e: React.MouseEvent) => {\n if (!tooltip || !containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n setTooltipPos({ x: e.clientX - rect.left, y: e.clientY - rect.top });\n };\n\n const svgProps = responsive\n ? { viewBox: `0 0 ${width} ${height}`, width: \"100%\", preserveAspectRatio: \"xMidYMid meet\" as const }\n : { width, height };\n\n return (\n <div ref={containerRef} data-react-fancy-chart-stacked-bar=\"\" className={cn(\"relative\", className)} onMouseMove={handleMouseMove}>\n <svg {...svgProps} height={responsive ? undefined : height}>\n {grid && (\n <ChartGrid\n x={PADDING.left}\n y={PADDING.top}\n width={plotWidth}\n height={plotHeight}\n horizontal={{ ticks: yTicks, scale: yScale }}\n />\n )}\n\n {labels.map((label, li) => {\n const x = PADDING.left + barGap * (li + 1) + barWidth * li;\n let cumulative = 0;\n\n return (\n <g\n key={label}\n onMouseEnter={() => setHoverIdx(li)}\n onMouseLeave={() => setHoverIdx(null)}\n >\n {series.map((s, si) => {\n const val = s.data[li] ?? 0;\n const y0 = yScale(cumulative);\n const y1 = yScale(cumulative + val);\n cumulative += val;\n const color = s.color ?? DEFAULT_COLORS[si % DEFAULT_COLORS.length];\n\n return (\n <rect\n key={s.label}\n x={x}\n y={y1}\n width={barWidth}\n height={Math.max(0, y0 - y1)}\n fill={color}\n rx={si === series.length - 1 ? 3 : 0}\n className=\"transition-opacity\"\n opacity={hoverIdx !== null && hoverIdx !== li ? 0.5 : 1}\n />\n );\n })}\n </g>\n );\n })}\n\n {yAxis && (\n <ChartAxis orientation=\"y\" ticks={yTicks} scale={yScale} x={PADDING.left} y={PADDING.top} length={plotHeight} />\n )}\n {xAxis && (\n <ChartAxis\n orientation=\"x\"\n ticks={labels.map((_, i) => i)}\n scale={(i) => PADDING.left + barGap * (i + 1) + barWidth * i + barWidth / 2}\n x={PADDING.left}\n y={PADDING.top + plotHeight}\n length={plotWidth}\n formatTick={(v) => labels[Math.round(v)] ?? \"\"}\n />\n )}\n </svg>\n\n {tooltip && hoverIdx !== null && (\n <ChartTooltip\n visible\n x={tooltipPos.x}\n y={tooltipPos.y}\n content={\n <div>\n <div className=\"mb-1 font-medium\">{labels[hoverIdx]}</div>\n {series.map((s, si) => (\n <div key={s.label} className=\"flex items-center gap-2\">\n <span\n className=\"inline-block h-2 w-2 rounded-full\"\n style={{ backgroundColor: s.color ?? DEFAULT_COLORS[si % DEFAULT_COLORS.length] }}\n />\n <span className=\"text-zinc-500\">{s.label}:</span>\n <span className=\"font-medium\">{s.data[hoverIdx] ?? 0}</span>\n </div>\n ))}\n <div className=\"mt-1 border-t border-zinc-200 pt-1 text-zinc-500 dark:border-zinc-700\">\n Total: <span className=\"font-medium text-zinc-900 dark:text-white\">{stackTotals[hoverIdx]}</span>\n </div>\n </div>\n }\n />\n )}\n\n {/* Legend */}\n <div className=\"mt-2 flex flex-wrap items-center justify-center gap-4\">\n {series.map((s, si) => (\n <div key={s.label} className=\"flex items-center gap-1.5 text-xs\">\n <span\n className=\"inline-block h-2.5 w-2.5 rounded-full\"\n style={{ backgroundColor: s.color ?? DEFAULT_COLORS[si % DEFAULT_COLORS.length] }}\n />\n <span className=\"text-zinc-600 dark:text-zinc-400\">{s.label}</span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nChartStackedBar.displayName = \"ChartStackedBar\";\n","import { ChartBar } from \"./ChartBar\";\nimport { ChartDonut } from \"./ChartDonut\";\nimport { ChartLine } from \"./ChartLine\";\nimport { ChartArea } from \"./ChartArea\";\nimport { ChartPie } from \"./ChartPie\";\nimport { ChartSparkline } from \"./ChartSparkline\";\nimport { ChartHorizontalBar } from \"./ChartHorizontalBar\";\nimport { ChartStackedBar } from \"./ChartStackedBar\";\n\nexport const Chart = {\n Bar: ChartBar,\n Donut: ChartDonut,\n Line: ChartLine,\n Area: ChartArea,\n Pie: ChartPie,\n Sparkline: ChartSparkline,\n HorizontalBar: ChartHorizontalBar,\n StackedBar: ChartStackedBar,\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Card/Card.context.ts","../src/components/Card/Card.scales.ts","../src/components/Card/CardSection.tsx","../src/components/Card/CardHeader.tsx","../src/components/Card/CardBody.tsx","../src/components/Card/CardFooter.tsx","../src/components/Card/CardMedia.tsx","../src/components/Card/CardBleed.tsx","../src/components/Card/Card.tsx"],"names":["forwardRef","jsx","jsxs"],"mappings":"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","file":"chunk-CF2U25LM.js","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { CardContextValue, CardPadding } from \"./Card.types\";\n\n/**\n * What a Card tells its parts.\n *\n * `null` is a SUPPORTED state, not an error — unlike `useAccordion`, which\n * throws. `Card.Header` and `Card.Footer` are usable on their own, as a section\n * heading above a card, and before this existed they rendered with a\n * `border-bottom` belonging to a card they were not inside. So the absence of a\n * card is information: it means \"style yourself standalone\", and it is why this\n * hook returns the value rather than asserting it.\n */\nexport const CardContext = createContext<CardContextValue | null>(null);\n\nexport function useCardContext(): CardContextValue | null {\n return useContext(CardContext);\n}\n\n/**\n * The padding step of the section a child sits inside, or `null` when there is\n * no padded section above it.\n *\n * `Card.Bleed` needs it because escaping the padding is two different\n * operations depending on depth, and a component cannot see its own depth:\n *\n * - Bleed inside a Header/Body/Footer is a GRANDchild of the card — the\n * padding is on that section, and reaching the card's edge means a negative\n * margin.\n * - Bleed as a direct child of the card IS the padded element — the padding\n * is on Bleed itself, and reaching the edge means zeroing it. A negative\n * margin here would pull the content outside the card entirely.\n *\n * Both look like \"cancel the padding\" and neither works for the other case,\n * which is exactly the kind of thing that ships looking fine in one demo.\n *\n * It carries the STEP rather than a boolean because the step is the only thing\n * the bleed actually needs, and it is NOT always derivable from the card's\n * `size`: `<Card size=\"md\" padding=\"lg\">` pads its children by `lg`, and a\n * standalone `Card.Header` has a card-less step of its own. A boolean sent the\n * bleed back to `size` for the distance, which was wrong in both of those\n * cases — by a whole padding step, silently.\n */\nexport const CardSectionContext = createContext<CardPadding | null>(null);\n\nexport function useCardSectionPadding(): CardPadding | null {\n return useContext(CardSectionContext);\n}\n","import type { CardPadding, CardSize } from \"./Card.types\";\n\n/**\n * One table per thing a `size` or a `padding` step scales.\n *\n * They live together, and apart from the components, because four of them have\n * to agree: the card's own radius, `Card.Media`'s top radius, the inset a\n * `dividerInset` rule stops at, and the negative margin a `Card.Bleed` uses to\n * escape. Those last three are all derived from the PADDING step — get one\n * wrong and the mismatch is a few pixels, which is the kind of defect that\n * survives review and then looks like a browser bug.\n *\n * Radius is keyed by `size`; everything that has to line up with the padding is\n * keyed by the padding step. Those are NOT the same key: `size` only picks the\n * DEFAULT padding, and an explicit `padding` prop overrides it. Keying the\n * inset and the bleed off `size` made `<Card size=\"md\" padding=\"lg\">` draw a\n * rule inset by 1rem over content inset by 1.5rem, and `padding=\"none\"` pull a\n * bleed clean outside the card.\n *\n * **`md` must stay byte-identical to what Card rendered before `size` existed**\n * (`rounded-lg`, `px-4`, `py-3`). `size` defaults to `md`, so that is what\n * makes this whole feature additive rather than a restyle of every consumer.\n */\n\nexport const paddingClasses: Record<CardPadding, string> = {\n none: \"\",\n xs: \"[&>*]:px-2 [&>*]:py-1.5\",\n sm: \"[&>*]:px-3 [&>*]:py-2\",\n md: \"[&>*]:px-4 [&>*]:py-3\",\n lg: \"[&>*]:px-6 [&>*]:py-4\",\n};\n\n/** The padding step a `size` implies when `padding` is not given. */\nexport const sizePadding: Record<CardSize, CardPadding> = {\n xs: \"xs\",\n sm: \"sm\",\n md: \"md\",\n lg: \"lg\",\n};\n\nexport const radiusClasses: Record<CardSize, string> = {\n xs: \"rounded\",\n sm: \"rounded-md\",\n md: \"rounded-lg\",\n lg: \"rounded-xl\",\n};\n\n/** `rounded-t-*` / `rounded-b-*` counterparts, for media and bleed. */\nexport const radiusTop: Record<CardSize, string> = {\n xs: \"rounded-t\",\n sm: \"rounded-t-md\",\n md: \"rounded-t-lg\",\n lg: \"rounded-t-xl\",\n};\n\nexport const radiusBottom: Record<CardSize, string> = {\n xs: \"rounded-b\",\n sm: \"rounded-b-md\",\n md: \"rounded-b-lg\",\n lg: \"rounded-b-xl\",\n};\n\n/** Padding a STANDALONE header/footer applies to itself, having no card. */\nexport const selfPadding: Record<CardPadding, string> = {\n none: \"\",\n xs: \"px-2 py-1.5\",\n sm: \"px-3 py-2\",\n md: \"px-4 py-3\",\n lg: \"px-6 py-4\",\n};\n\n/**\n * Where an inset divider stops — matches the horizontal padding step.\n *\n * Written out per variant rather than composed as `` `after:${insetX[step]}` ``.\n * **Tailwind generates CSS by scanning source for LITERAL class names**, so a\n * template string produces a class that exists in the DOM and in no stylesheet:\n * the divider silently does not render, and nothing in the build complains. The\n * duplication is the price of the scanner being a text search, and\n * `tests/card-tailwind.test.ts` compiles every one of these through Tailwind so\n * a typo cannot pass either.\n */\nexport const dividerInsetAfter: Record<CardPadding, string> = {\n none: \"after:inset-x-0\",\n xs: \"after:inset-x-2\",\n sm: \"after:inset-x-3\",\n md: \"after:inset-x-4\",\n lg: \"after:inset-x-6\",\n};\n\nexport const dividerInsetBefore: Record<CardPadding, string> = {\n none: \"before:inset-x-0\",\n xs: \"before:inset-x-2\",\n sm: \"before:inset-x-3\",\n md: \"before:inset-x-4\",\n lg: \"before:inset-x-6\",\n};\n\n/**\n * Negative margins a nested `Card.Bleed` uses to reach the card's edges.\n *\n * `none` is empty on purpose: with no padding to escape, a negative margin\n * would drag the content OUT of the card rather than to its edge.\n */\nexport const bleedX: Record<CardPadding, string> = {\n none: \"\",\n xs: \"-mx-2\",\n sm: \"-mx-3\",\n md: \"-mx-4\",\n lg: \"-mx-6\",\n};\n\nexport const bleedTop: Record<CardPadding, string> = {\n none: \"\",\n xs: \"-mt-1.5\",\n sm: \"-mt-2\",\n md: \"-mt-3\",\n lg: \"-mt-4\",\n};\n\nexport const bleedBottom: Record<CardPadding, string> = {\n none: \"\",\n xs: \"-mb-1.5\",\n sm: \"-mb-2\",\n md: \"-mb-3\",\n lg: \"-mb-4\",\n};\n","import { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Heading } from \"../Heading/Heading\";\nimport { Text } from \"../Text/Text\";\nimport { CardSectionContext, useCardContext } from \"./Card.context\";\nimport { dividerInsetAfter, dividerInsetBefore, selfPadding, sizePadding } from \"./Card.scales\";\nimport type { CardSectionProps } from \"./Card.types\";\n\n/**\n * The shared body of `Card.Header` and `Card.Footer`.\n *\n * They differ in exactly ONE way — which edge the rule sits on — so they are\n * one implementation with an `edge` argument rather than two files that have to\n * be kept in step. Composition, including where a lone `actions` block lands,\n * is identical in both. The previous pair had already drifted from\n * `ModalFooter`, which lays its actions out with `flex items-center\n * justify-end gap-3` while `Card.Footer` laid out nothing.\n */\nexport interface CardSectionInternalProps extends CardSectionProps {\n edge: \"top\" | \"bottom\";\n handle: string;\n}\n\nexport const CardSection = forwardRef<HTMLDivElement, CardSectionInternalProps>(\n (\n {\n edge,\n handle,\n heading,\n headingLevel = \"h3\",\n description,\n actions,\n size: sizeProp,\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const card = useCardContext();\n\n // No card above us means this is a standalone section — a heading ABOVE a\n // card, which Flux supports and we rendered wrongly: it kept the rule that\n // belongs to a card it was not inside. Standalone also has to pad itself,\n // because the padding normally comes from the card's `[&>*]` rule.\n const standalone = card === null;\n const size = card?.size ?? sizeProp ?? \"md\";\n const sections = card?.sections ?? \"plain\";\n const dividerInset = card?.dividerInset ?? false;\n\n // The step the content is inset by, whoever applied it — the card's\n // `[&>*]` rule, or this element's own padding when standalone. An inset\n // rule has to stop exactly there, and a nested `Card.Bleed` has to travel\n // exactly that far back out, so both read this one value.\n const padding = card?.padding ?? sizePadding[size];\n\n const ruled = sections === \"divided\";\n const banded = sections === \"banded\";\n\n // Children WIN. Rendering both would give anyone who passed each by mistake\n // two titles, and silently ignoring children would be worse.\n const composed = children ?? null;\n const hasComposition = composed === null && (heading != null || description != null || actions != null);\n\n return (\n <div\n ref={ref}\n {...{ [handle]: \"\" }}\n className={cn(\n standalone && selfPadding[padding],\n banded && \"bg-zinc-50 dark:bg-zinc-800/50\",\n ruled &&\n !dividerInset &&\n (edge === \"bottom\"\n ? \"border-b border-zinc-200 dark:border-zinc-700\"\n : \"border-t border-zinc-200 dark:border-zinc-700\"),\n // An inset rule cannot be a border: a border draws on the element's\n // own edge, and the whole point is to stop short of it. So it is a\n // one-pixel pseudo-element, inset by the same step the padding uses —\n // which is why both come out of one table in Card.scales.\n ruled &&\n dividerInset &&\n cn(\n \"relative\",\n edge === \"bottom\"\n ? \"after:absolute after:bottom-0 after:h-px after:bg-zinc-200 dark:after:bg-zinc-700\"\n : \"before:absolute before:top-0 before:h-px before:bg-zinc-200 dark:before:bg-zinc-700\",\n edge === \"bottom\"\n ? dividerInsetAfter[padding]\n : dividerInsetBefore[padding],\n ),\n hasComposition && \"flex items-center gap-3\",\n hasComposition && (heading != null || description != null ? \"justify-between\" : \"justify-end\"),\n className,\n )}\n {...props}\n >\n {/* Padding is on THIS element either way -- from the card's `[&>*]`\n rule, or from `selfPadding` when standalone. A nested `Card.Bleed`\n escapes it with a negative margin in both cases, so the step goes\n down unconditionally; it used to be suppressed when standalone,\n which left a bleed inside a card-less header doing nothing. */}\n <CardSectionContext.Provider value={padding}>\n {composed ?? (\n <>\n {(heading != null || description != null) && (\n <div className=\"min-w-0\">\n {heading != null && (\n <Heading\n as={headingLevel}\n size=\"sm\"\n weight=\"semibold\"\n data-react-fancy-card-heading=\"\"\n >\n {heading}\n </Heading>\n )}\n {description != null && (\n <Text\n size=\"sm\"\n color=\"muted\"\n data-react-fancy-card-description=\"\"\n >\n {description}\n </Text>\n )}\n </div>\n )}\n {actions != null && (\n <div\n data-react-fancy-card-actions=\"\"\n className=\"flex shrink-0 items-center gap-2\"\n >\n {actions}\n </div>\n )}\n </>\n )}\n </CardSectionContext.Provider>\n </div>\n );\n },\n);\n\nCardSection.displayName = \"CardSection\";\n","import { forwardRef } from \"react\";\nimport { CardSection } from \"./CardSection\";\nimport type { CardHeaderProps } from \"./Card.types\";\n\n/**\n * A card's header. Also usable on its own, as a section heading above a card —\n * see `CardSection`, which decides that from the absence of a `CardContext`.\n */\nexport const CardHeader = forwardRef<HTMLDivElement, CardHeaderProps>(\n (props, ref) => (\n <CardSection\n ref={ref}\n edge=\"bottom\"\n handle=\"data-react-fancy-card-header\"\n {...props}\n />\n ),\n);\n\nCardHeader.displayName = \"CardHeader\";\n","import { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { CardSectionContext, useCardContext } from \"./Card.context\";\nimport type { CardBodyProps } from \"./Card.types\";\n\nexport const CardBody = forwardRef<HTMLDivElement, CardBodyProps>(\n ({ className, children, ...props }, ref) => {\n // The step the CARD pads this element by. `\"none\"` with no card above,\n // because then nothing pads it and there is nothing for a nested\n // `Card.Bleed` to escape.\n const padding = useCardContext()?.padding ?? \"none\";\n\n return (\n <div\n ref={ref}\n data-react-fancy-card-body=\"\"\n className={cn(className)}\n {...props}\n >\n {/*\n Body carries no classes of its own -- the card pads it through\n `[&>*]`, and giving it padding here would double that. The context is\n the only thing it adds: it tells a nested `Card.Bleed` that the\n padding to escape is on THIS element, and how much of it there is.\n */}\n <CardSectionContext.Provider value={padding}>{children}</CardSectionContext.Provider>\n </div>\n );\n },\n);\n\nCardBody.displayName = \"CardBody\";\n","import { forwardRef } from \"react\";\nimport { CardSection } from \"./CardSection\";\nimport type { CardFooterProps } from \"./Card.types\";\n\n/**\n * A card's footer. Its rule sits on the TOP edge, and a lone `actions` block\n * aligns to the end — matching `ModalFooter`, which has always done that while\n * this component laid out nothing.\n */\nexport const CardFooter = forwardRef<HTMLDivElement, CardFooterProps>(\n (props, ref) => (\n <CardSection\n ref={ref}\n edge=\"top\"\n handle=\"data-react-fancy-card-footer\"\n {...props}\n />\n ),\n);\n\nCardFooter.displayName = \"CardFooter\";\n","import { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useCardContext } from \"./Card.context\";\nimport { radiusTop } from \"./Card.scales\";\nimport type { CardMediaProps } from \"./Card.types\";\n\n/**\n * The fixed-ratio media region at the top of a card: a thumbnail, gradient or\n * solid swatch, with slots pinned to its corners.\n *\n * This is `Card.Media` rather than a separate `<MediaCard>` because the thing\n * being asked for was never a different card — it was a card with a picture in\n * it. Four surfaces had each rebuilt exactly this (a gallery index, a package\n * grid, a starter-kit grid and a showcase grid) and one of them was already\n * wrapping `Card` and hand-rolling only this region.\n *\n * ## The `background` is not decoration\n *\n * It shows through while the image loads and stays visible if the image never\n * arrives. The gallery relied on that: each style card is keyed to a swatch, so\n * a missing screenshot degrades to the right colour rather than to a hole.\n */\nexport const CardMedia = forwardRef<HTMLDivElement, CardMediaProps>(\n (\n {\n src,\n alt = \"\",\n ratio = \"16/9\",\n height,\n background,\n objectPosition = \"center\",\n loading = \"lazy\",\n topLeft,\n topRight,\n bottomLeft,\n bottomRight,\n className,\n style,\n children,\n ...props\n },\n ref,\n ) => {\n const cardSize = useCardContext()?.size ?? \"md\";\n\n return (\n <div\n ref={ref}\n data-react-fancy-card-media=\"\"\n className={cn(\n \"relative overflow-hidden\",\n // Follows the CARD's radius step rather than hardcoding `rounded-t-lg`.\n // It was fixed, so a `size=\"lg\"` card put a `rounded-xl` frame around\n // a `rounded-t-lg` image and left a visible sliver of card showing\n // through each top corner. Defaults to `md` with no card above, which\n // is the class it used to hardcode.\n radiusTop[cardSize],\n // Card's `padding` prop pads EVERY direct child\n // (`[&>*]:px-4 …`), which would inset the media and break the\n // flush-to-the-edge look every caller wants. `!` wins regardless of\n // stylesheet order, which plain `p-0` would not.\n \"!px-0 !py-0\",\n className,\n )}\n style={{\n ...(height === undefined ? { aspectRatio: ratio } : { height }),\n ...(background ? { background } : null),\n ...style,\n }}\n {...props}\n >\n {src ? (\n <img\n src={src}\n alt={alt}\n loading={loading}\n className=\"absolute inset-0 h-full w-full object-cover\"\n style={{ objectPosition }}\n />\n ) : null}\n\n {children}\n\n {topLeft ? <span className=\"absolute left-2 top-2 z-10\">{topLeft}</span> : null}\n {topRight ? <span className=\"absolute right-2 top-2 z-10\">{topRight}</span> : null}\n {bottomLeft ? <span className=\"absolute bottom-2 left-2 z-10\">{bottomLeft}</span> : null}\n {bottomRight ? <span className=\"absolute bottom-2 right-2 z-10\">{bottomRight}</span> : null}\n </div>\n );\n },\n);\n\nCardMedia.displayName = \"CardMedia\";\n","import { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useCardContext, useCardSectionPadding } from \"./Card.context\";\nimport { bleedBottom, bleedTop, bleedX, radiusBottom, radiusTop } from \"./Card.scales\";\nimport type { CardBleedProps } from \"./Card.types\";\n\n/**\n * Run content out to the card's edges — an image, a table, a chart strip.\n *\n * ## Why this is arithmetic and not a CSS-variable protocol\n *\n * Flux solves the same problem with a published set of custom properties\n * (`--flux-bleed-x`, `--flux-bleed-top`, …) that any child component may read.\n * It has to: its padding sits on the CARD, so a descendant has no way to know\n * how far it must reach. That is a public CSS API — a cross-package contract to\n * version forever.\n *\n * Ours does not need one, because padding sits on the card's direct CHILDREN.\n * The distance to the edge is therefore always one padding step, which the\n * padded section passes down in context. No variables, nothing for a consumer\n * to depend on, nothing to keep stable across releases.\n *\n * ## Two cases, and they are opposites\n *\n * - **Inside a `Card.Header` / `Card.Body` / `Card.Footer`** (the normal case):\n * the padding is on that section, so reaching the edge is a NEGATIVE MARGIN.\n * - **As a direct child of `Card`**: the padding is on this element, so\n * reaching the edge is ZEROING it. A negative margin here would pull the\n * content clean outside the card.\n *\n * A component cannot see its own depth, so the sections publish their padding\n * step in context and its absence means \"you are the padded element\". Both\n * cases read as \"cancel the padding\", which is exactly why picking either one\n * alone ships looking correct in whichever demo the author happened to write.\n *\n * The distance comes from that context and NOT from the card's `size`, because\n * the two disagree whenever `padding` is passed explicitly — and disagree by a\n * whole step, which looks like a rendering bug rather than a prop conflict.\n *\n * Corners are rounded only where the content actually meets the card's edge, so\n * a mid-body strip stays square while one at the top follows the card's radius.\n */\nexport const CardBleed = forwardRef<HTMLDivElement, CardBleedProps>(\n ({ edges = \"x\", className, children, ...props }, ref) => {\n const card = useCardContext();\n const section = useCardSectionPadding();\n // Radius follows the CARD (that is whose corners are being met); the\n // distance follows the PADDING.\n const size = card?.size ?? \"md\";\n\n const touchesTop = edges === \"top\" || edges === \"all\";\n const touchesBottom = edges === \"bottom\" || edges === \"all\";\n\n return (\n <div\n ref={ref}\n data-react-fancy-card-bleed=\"\"\n className={cn(\n // Clip children to whatever corners we round, or an image's square\n // edge sits over the card's curve.\n \"overflow-hidden\",\n section !== null\n ? cn(\n bleedX[section],\n touchesTop && bleedTop[section],\n touchesBottom && bleedBottom[section],\n )\n : // Direct child of the card: `!` because the padding it is undoing\n // comes from the card's own `[&>*]` rule, which is equally\n // specific. Same mechanism `Card.Media` uses.\n cn(\n \"!px-0\",\n touchesTop && \"!pt-0\",\n touchesBottom && \"!pb-0\",\n ),\n touchesTop && radiusTop[size],\n touchesBottom && radiusBottom[size],\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n },\n);\n\nCardBleed.displayName = \"CardBleed\";\n","import { forwardRef, useMemo } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { CardHeader } from \"./CardHeader\";\nimport { CardBody } from \"./CardBody\";\nimport { CardFooter } from \"./CardFooter\";\nimport { CardMedia } from \"./CardMedia\";\nimport { CardBleed } from \"./CardBleed\";\nimport { CardContext } from \"./Card.context\";\nimport { paddingClasses, radiusClasses, sizePadding } from \"./Card.scales\";\nimport type { CardContextValue, CardProps } from \"./Card.types\";\n\nconst variantClasses: Record<NonNullable<CardProps[\"variant\"]>, string> = {\n outlined: \"border border-zinc-200 dark:border-zinc-700\",\n elevated: \"shadow-md border border-zinc-100 dark:border-zinc-800\",\n flat: \"bg-zinc-50 dark:bg-zinc-800/50\",\n // Tint steps between \"no tint\" and `flat`. They work the same way `flat`\n // does: a later `bg-*` in the class string beats the base `bg-white`, because\n // `cn` is tailwind-merge and resolves conflicting utilities last-wins. Class\n // ORDER decides this, not CSS specificity — so these must stay after the base\n // background in the `cn(...)` call below.\n muted: \"bg-zinc-100 dark:bg-zinc-800\",\n soft: \"bg-zinc-50/70 dark:bg-zinc-800/40\",\n};\n\n/**\n * Padding is applied to the card's DIRECT CHILDREN rather than the card\n * itself, so a full-bleed child (`Card.Media`) can opt out with `!px-0`\n * without having to undo a padding that is already baked into the frame.\n *\n * The selector is `&>*`, not `&>div`. It was `&>div` until 5.24.0, which meant\n * the tag a caller happened to choose silently decided whether that child was\n * padded: `<Card><div>a</div><p>b</p></Card>` inset the div and left the\n * paragraph hard against the border. Nothing in the caller's code hinted at\n * the rule, and the result read as a bug in the card.\n *\n * It is also why there is no `gap` to scale with `size`, which looks like an\n * omission and is not: each direct child carries its own `py-*`, so two\n * adjacent parts already have twice that between their content. Adding a row\n * gap on the card would double a space that is already there.\n */\n\nconst CardRoot = forwardRef<HTMLDivElement, CardProps>(\n (\n {\n variant = \"outlined\",\n size = \"md\",\n padding,\n sections = \"divided\",\n dividerInset = false,\n highlight = false,\n interactive = false,\n className,\n children,\n ...props\n },\n ref,\n ) => {\n // `padding` stays authoritative over the step `size` implies. That order is\n // what keeps `size` additive: a caller already passing `padding` sees no\n // change, and `padding=\"none\"` still means none.\n const resolvedPadding = padding ?? sizePadding[size];\n\n // The RESOLVED step goes into the context, not `size`. A part that has to\n // meet the content's edge — an inset divider, a `Card.Bleed` — needs the\n // distance the card actually applied, and `size` is only the default.\n const context = useMemo<CardContextValue>(\n () => ({ size, padding: resolvedPadding, sections, dividerInset }),\n [size, resolvedPadding, sections, dividerInset],\n );\n\n return (\n <CardContext.Provider value={context}>\n <div\n ref={ref}\n data-react-fancy-card=\"\"\n className={cn(\n \"bg-white dark:bg-zinc-900\",\n radiusClasses[size],\n variantClasses[variant],\n // A pseudo-element rather than an inset box-shadow: `shadow-*` and\n // `shadow-[inset...]` are the same tailwind-merge group, so an\n // inset shadow here would have SILENTLY DELETED `elevated`'s\n // `shadow-md`. Highlight and elevation have to be able to coexist.\n // `dark:` carries a REAL colour. It was `dark:before:bg-transparent`,\n // which made `highlight` a no-op in the mode that needs it most:\n // a dark surface has no border contrast of its own, and a 10% white\n // top edge is the whole reason Flux turns this on by default.\n highlight &&\n \"relative before:pointer-events-none before:absolute before:inset-x-0 before:top-0 before:h-px before:bg-white/70 dark:before:bg-white/10\",\n // `overflow-hidden` is part of `interactive` rather than always-on:\n // clipping unconditionally would cut off popovers and dropdowns that\n // legitimately overflow a static card.\n interactive &&\n \"overflow-hidden transition hover:-translate-y-0.5 hover:shadow-lg hover:border-zinc-300 dark:hover:border-zinc-600\",\n paddingClasses[resolvedPadding],\n className,\n )}\n {...props}\n >\n {children}\n </div>\n </CardContext.Provider>\n );\n },\n);\n\nCardRoot.displayName = \"Card\";\n\nexport const Card = Object.assign(CardRoot, {\n Media: CardMedia,\n Header: CardHeader,\n Body: CardBody,\n Footer: CardFooter,\n Bleed: CardBleed,\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Pillbox/Pillbox.tsx"],"names":["Pillbox"],"mappings":"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","file":"chunk-FSRPZYZZ.js","sourcesContent":["import { forwardRef, useCallback, useRef, useState } from \"react\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\nimport type { PillboxProps } from \"./Pillbox.types\";\n\nexport const Pillbox = forwardRef<HTMLDivElement, PillboxProps>(\n function Pillbox(\n {\n value: controlledValue,\n defaultValue = [],\n onChange,\n placeholder = \"Type and press Enter...\",\n maxItems,\n disabled = false,\n className,\n },\n ref,\n ) {\n const [items, setItems] = useControllableState(\n controlledValue,\n defaultValue,\n onChange,\n );\n const [input, setInput] = useState(\"\");\n const inputRef = useRef<HTMLInputElement>(null);\n\n const addItem = useCallback(\n (text: string) => {\n const trimmed = text.trim();\n if (!trimmed || items.includes(trimmed)) return;\n if (maxItems && items.length >= maxItems) return;\n setItems([...items, trimmed]);\n setInput(\"\");\n },\n [items, setItems, maxItems],\n );\n\n const removeItem = useCallback(\n (index: number) => {\n setItems(items.filter((_, i) => i !== index));\n },\n [items, setItems],\n );\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n addItem(input);\n } else if (e.key === \"Backspace\" && !input && items.length > 0) {\n removeItem(items.length - 1);\n }\n };\n\n return (\n <div\n data-react-fancy-pillbox=\"\"\n ref={ref}\n className={cn(\n \"flex flex-wrap items-center gap-1.5 rounded-lg border border-zinc-200 bg-white px-3 py-2 transition-[border-color,box-shadow] duration-150 focus-within:border-blue-500 focus-within:ring-2 focus-within:ring-blue-500/40 dark:border-zinc-700 dark:bg-[#1e1e24] dark:text-zinc-100 dark:focus-within:border-blue-400 dark:focus-within:ring-blue-400/20\",\n disabled && \"cursor-not-allowed opacity-50\",\n className,\n )}\n onClick={() => inputRef.current?.focus()}\n >\n {items.map((item, i) => (\n <span\n key={`${item}-${i}`}\n className=\"inline-flex items-center gap-1 rounded-md bg-zinc-100 px-2 py-0.5 text-sm dark:bg-zinc-800\"\n >\n {item}\n {!disabled && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n removeItem(i);\n }}\n className=\"text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300\"\n aria-label={`Remove ${item}`}\n >\n <X size={12} />\n </button>\n )}\n </span>\n ))}\n <input\n ref={inputRef}\n type=\"text\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={items.length === 0 ? placeholder : \"\"}\n disabled={disabled}\n className=\"min-w-[80px] flex-1 bg-transparent text-sm outline-none placeholder:text-zinc-400\"\n />\n </div>\n );\n },\n);\n\nPillbox.displayName = \"Pillbox\";\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/PastePills/use-paste-pills.ts","../src/components/PastePills/InlinePill.tsx","../src/components/PastePills/paste-markers.ts","../src/components/PastePills/use-inline-paste.tsx","../src/components/PastePills/InlinePasteEditor.tsx","../src/components/PastePills/PastedFilesInput.tsx"],"names":["useRef","useCallback","useState","jsx","InlinePasteEditor","id","range","jsxs","useEffect"],"mappings":"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","file":"chunk-FYKOLKQZ.js","sourcesContent":["import { useCallback, useRef } from \"react\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\n\n/**\n * A paste held beside a composer rather than inserted into it.\n *\n * There is deliberately **no `length` field.** It would be `text.length` and\n * nothing else, and a derived value stored beside its source is a value that can\n * disagree with it — the two drift the moment anything edits one. Read\n * `paste.text.length`.\n */\nexport interface HeldPaste {\n id: string;\n text: string;\n}\n\n/**\n * The minimum of a clipboard event this hook touches.\n *\n * Structural rather than `React.ClipboardEvent` so a host can call it from a\n * native listener, a synthetic one, or a test double. React's own event satisfies\n * it.\n */\nexport interface PasteEventLike {\n clipboardData?: { getData(type: string): string } | null;\n preventDefault(): void;\n}\n\nexport interface UsePastePillsOptions {\n /**\n * Hold a paste of at least this many characters. Try 500 — about a long\n * paragraph.\n *\n * **No default, on purpose.** Paste is a fundamental interaction, so holding one\n * is something a host asks for rather than something it discovers. Omit this and\n * `handlePaste` always returns `false` and touches nothing.\n */\n threshold?: number;\n /** Own the list yourself. Omit to let the hook keep it. */\n heldPastes?: HeldPaste[];\n onHeldPastesChange?: (pastes: HeldPaste[]) => void;\n}\n\nexport interface UsePastePillsResult {\n heldPastes: HeldPaste[];\n /**\n * Call this from your OWN paste handler. Returns `true` if it took the paste —\n * in which case it has already called `preventDefault()` — and `false` if it\n * declined, having touched nothing.\n *\n * Composable on purpose: a host whose handler already intercepts paste for its\n * own reasons needs to ask \"did you want this?\" rather than hand over the event.\n *\n * function onPaste(e) {\n * if (pills.handlePaste(e)) return;\n * // ...your own handling\n * }\n */\n handlePaste: (event: PasteEventLike) => boolean;\n /**\n * Hold `text` unconditionally and return the new pill's id.\n *\n * For a host that decides for itself what to hold and needs to know WHICH pill\n * it made — `Composer`'s inline placement puts the pill at the caret, so it needs\n * the id at paste time. Ignores `threshold`; the caller has already decided.\n */\n hold: (text: string) => string;\n /**\n * Removes the paste and returns its text, for the host to insert into its own\n * surface. `undefined` if there is no such id.\n *\n * The hook cannot insert it — it owns no DOM and does not know what a host's\n * surface is. That is the point.\n */\n expand: (id: string) => string | undefined;\n /** Discard one without returning it. */\n remove: (id: string) => void;\n /** Empty the list, e.g. after a send. */\n clear: () => void;\n}\n\n/**\n * Hold a large paste as state, so a composer can show it as a pill instead of\n * turning itself into a scrolling wall.\n *\n * ---------------------------------------------------------------------------\n * Why this is a hook and not just a feature of `Composer`\n * ---------------------------------------------------------------------------\n *\n * `Composer` shipped the behaviour in 5.31.0 and the MOIC estate, who specified it,\n * then established something I had missed: their chat input is a contenteditable\n * rendering inline `[deal:42|Acme]` badges, so they **cannot** adopt `Composer` (a\n * plain textarea) however much they want its behaviour. Their plan to delete their\n * own composer when ours landed could never have worked.\n *\n * So the logic lives here and **`Composer` is its first caller.** One\n * implementation rather than two, which matters more than the convenience: two\n * copies of a rule drift, and the copy nobody reads is the one that rots. The rule\n * that must not drift is the one in `Composer`'s own tests — a send with pills\n * still closed carries the text.\n *\n * It owns no DOM. The host renders the pills.\n *\n * ---------------------------------------------------------------------------\n * Who actually calls this (as of 5.32.0): `Composer`, and nothing else\n * ---------------------------------------------------------------------------\n *\n * The estate that specified it **withdrew before adopting it**, hours after it\n * shipped — their design moved the pill INTO the message as a `[paste:id|label]`\n * marker in the same grammar as their other object tags, which makes the message\n * itself the record of what is attached. A parallel `heldPastes` array would then be\n * a second place answering \"what am I sending?\", and the two would disagree the\n * moment someone backspaced a badge. Their reasoning was better than the spec.\n *\n * Recorded because a reader should not infer an extension point under active\n * external use. It is kept rather than withdrawn for two reasons that are about\n * cost, not optimism: it is published API on a 5.x package, so removing it needs a\n * major; and `Composer` calls it, so it is exercised by that component's tests on\n * every run and cannot rot unnoticed.\n *\n * **It gets no further surface without a real caller.** No extra options, no second\n * hook. An API with one hypothetical consumer is how a package accumulates surface\n * nobody uses.\n *\n * `hold` (5.38.0) met that bar: `Composer`'s inline placement — MOIC's\n * pill-inside-the-message design, built into the component — needs the id of the\n * pill it just made so it can put it at the caret.\n */\nexport function usePastePills({\n threshold,\n heldPastes: controlledHeldPastes,\n onHeldPastesChange,\n}: UsePastePillsOptions = {}): UsePastePillsResult {\n const [heldPastes, setHeldPastes] = useControllableState<HeldPaste[]>(\n controlledHeldPastes,\n [],\n onHeldPastesChange,\n );\n\n /*\n * A counter rather than `crypto.randomUUID()` or an index.\n *\n * An index is not an id — removing the first pill renumbers the rest, and a host\n * keying its DOM on that remounts every pill and loses hover state. A counter in\n * a ref is stable for the life of the component and needs no platform API that a\n * server renderer might lack.\n */\n const nextId = useRef(0);\n\n const hold = useCallback(\n (text: string): string => {\n /*\n * Skip any id the list already holds. A controlled list can arrive seeded\n * (restored drafts, an agent attaching a paste) before this counter has\n * counted anything, and minting `paste-1` beside an existing `paste-1` gives\n * two pills one id — expanding either then takes both.\n */\n let id: string;\n do {\n nextId.current += 1;\n id = `paste-${nextId.current}`;\n } while (heldPastes.some((p) => p.id === id));\n\n setHeldPastes((current) => [...current, { id, text }]);\n\n return id;\n },\n [heldPastes, setHeldPastes],\n );\n\n const handlePaste = useCallback(\n (event: PasteEventLike): boolean => {\n if (!threshold || threshold <= 0) return false;\n\n const text = event.clipboardData?.getData(\"text/plain\") ?? \"\";\n\n // Below the threshold, decline WITHOUT touching the event. A host calling\n // this from inside its own handler has to be able to carry on as if the hook\n // were not there.\n if (text.length < threshold) return false;\n\n event.preventDefault();\n hold(text);\n\n return true;\n },\n [threshold, hold],\n );\n\n const expand = useCallback(\n (id: string): string | undefined => {\n const found = heldPastes.find((p) => p.id === id);\n\n if (found === undefined) return undefined;\n\n setHeldPastes((current) => current.filter((p) => p.id !== id));\n\n return found.text;\n },\n [heldPastes, setHeldPastes],\n );\n\n const remove = useCallback(\n (id: string) => setHeldPastes((current) => current.filter((p) => p.id !== id)),\n [setHeldPastes],\n );\n\n const clear = useCallback(() => setHeldPastes([]), [setHeldPastes]);\n\n return { heldPastes, handlePaste, hold, expand, remove, clear };\n}\n","import { useEffect, useState, type ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Popover } from \"../Popover\";\nimport type { ComposerPasteClassNames, ComposerPastePreview } from \"./PastePills.types\";\n\n/**\n * Thousands separators, written out rather than left to `toLocaleString()`.\n *\n * The number exists so someone can size the paste at a glance, and `2,036` sizes\n * faster than `2036`. It is not left to the runtime locale because the label beside\n * it (\"Pasted text\") is not localised either, so a locale-formatted number next to\n * an English noun would be half a translation.\n */\nexport function withSeparators(n: number): string {\n return String(n).replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n}\n\n/** First and last N characters, middle elided. The ends say WHICH paste this is. */\nexport function endsOf(text: string, chars: number): string {\n if (text.length <= chars * 2) return text;\n\n return `${text.slice(0, chars)} … ${text.slice(-chars)}`;\n}\n\nconst PILL_BASE =\n \"inline-flex select-none items-center rounded-md px-2 py-0.5 text-xs leading-5 transition-colors\";\nconst TEXT_PILL =\n \"cursor-pointer bg-zinc-100 text-zinc-700 hover:bg-zinc-200 dark:bg-zinc-800 dark:text-zinc-200 dark:hover:bg-zinc-700\";\nconst IMAGE_PILL =\n \"bg-rose-100 font-medium text-rose-600 dark:bg-rose-500/20 dark:text-rose-300\";\n/** Merged onto the Popover panel's own defaults: tighter padding for a preview. */\nconst PREVIEW_BASE = \"max-w-xs whitespace-pre-wrap break-all p-2 text-xs\";\n\n/**\n * An image's thumbnail, made from the File only while the preview is open.\n *\n * If the image cannot be shown — a Content-Security-Policy without `blob:` in\n * `img-src` is the usual reason — the label is shown instead. A broken `<img>`\n * with an empty `alt` renders as nothing at all, which is how a preview ends up\n * as an empty box.\n */\nfunction ImageThumb({ file, label }: { file: File; label: string }) {\n const [url, setUrl] = useState<string | null>(null);\n const [failed, setFailed] = useState(false);\n\n useEffect(() => {\n if (typeof URL.createObjectURL !== \"function\") return;\n const made = URL.createObjectURL(file);\n setUrl(made);\n setFailed(false);\n return () => URL.revokeObjectURL(made);\n }, [file]);\n\n return url && !failed ? (\n <img\n src={url}\n alt={label}\n onError={() => setFailed(true)}\n className=\"block max-h-40 max-w-[16rem] rounded\"\n />\n ) : (\n <span>{label}</span>\n );\n}\n\ninterface InlinePillProps {\n preview: ComposerPastePreview;\n previewChars: number;\n renderPastePreview?: (preview: ComposerPastePreview) => ReactNode;\n classNames?: ComposerPasteClassNames;\n disabled: boolean;\n onExpand: (id: string) => void;\n}\n\n/**\n * One pill inside the message, portalled by `Composer` into a placeholder the\n * editor made. Internal — its own file so its props are not read as `Composer`'s.\n *\n * The preview is a hover `Popover` (portalled, so the scrolling input cannot clip\n * it), and it opens on FOCUS too, so a keyboard user reaches the same preview. It\n * was a `Tooltip` until 5.51.0; a tooltip is for a short label, not an image.\n */\nexport function InlinePill({\n preview,\n previewChars,\n renderPastePreview,\n classNames,\n disabled,\n onExpand,\n}: InlinePillProps) {\n const [open, setOpen] = useState(false);\n const id = preview.kind === \"text\" ? preview.paste.id : preview.image.id;\n const content = (\n <span data-react-fancy-composer-paste-pill-preview={id}>\n {renderPastePreview?.(preview) ??\n (preview.kind === \"text\" ? (\n endsOf(preview.paste.text, previewChars)\n ) : (\n <ImageThumb file={preview.image.file} label={preview.image.label} />\n ))}\n </span>\n );\n const focusOpen = {\n onFocus: () => setOpen(true),\n onBlur: () => setOpen(false),\n };\n\n const pill =\n preview.kind === \"image\" ? (\n <span\n data-react-fancy-composer-image-pill={id}\n role=\"img\"\n tabIndex={0}\n aria-label={preview.image.label}\n {...focusOpen}\n className={cn(PILL_BASE, IMAGE_PILL, classNames?.pill, classNames?.imagePill)}\n >\n {preview.image.label}\n </span>\n ) : (\n <button\n type=\"button\"\n data-react-fancy-composer-paste-pill={id}\n onClick={() => onExpand(id)}\n disabled={disabled}\n aria-label={`Insert this pasted text, ${withSeparators(preview.paste.text.length)} characters`}\n {...focusOpen}\n className={cn(PILL_BASE, TEXT_PILL, classNames?.pill, classNames?.textPill)}\n >\n Pasted text · {withSeparators(preview.paste.text.length)} characters\n </button>\n );\n\n return (\n <Popover hover open={open} onOpenChange={setOpen} placement=\"top\">\n <Popover.Trigger>{pill}</Popover.Trigger>\n <Popover.Content className={cn(PREVIEW_BASE, classNames?.preview)}>\n {content}\n </Popover.Content>\n </Popover>\n );\n}\n","import type { HeldPaste } from \"./use-paste-pills\";\n\n/**\n * An image pasted into a `Composer` and held as a pill.\n *\n * `label` is stored rather than derived because the number in it is the order of\n * ARRIVAL: \"Pasted image 2\" must stay 2 after image 1 is deleted, and nothing left\n * in the list could recompute that.\n */\nexport interface HeldImage {\n id: string;\n file: File;\n label: string;\n}\n\n/**\n * U+FFFC OBJECT REPLACEMENT CHARACTER — Unicode's own \"an embedded object sits\n * here\". A marker is the id wrapped in a pair of them.\n *\n * Why the message carries a marker at all: with inline placement the message\n * ITSELF is the record of what is attached and where, so there is one answer to\n * \"what am I sending?\" rather than a text plus a parallel list that can disagree\n * the moment someone backspaces a pill. This is the MOIC estate's design for their\n * own composer, and the reason they withdrew from the beside-the-input layout.\n *\n * Only a marker whose id the composer actually holds is a pill; anything else is\n * left as text, so a stray U+FFFC in pasted content cannot invent an attachment.\n */\nexport const PILL_MARK = \"\\uFFFC\";\n\nconst MARKER = /\\uFFFC([^\\uFFFC\\n]+)\\uFFFC/g;\n\n/** The marker for a held paste or image, for a host or agent writing `value` itself. */\nexport function pasteMarker(id: string): string {\n return `${PILL_MARK}${id}${PILL_MARK}`;\n}\n\nexport type ValueSegment =\n | { type: \"text\"; text: string }\n | { type: \"pill\"; id: string };\n\n/** Split a value into text and pills. Markers for ids not in `known` stay text. */\nexport function segmentValue(value: string, known: ReadonlySet<string>): ValueSegment[] {\n const out: ValueSegment[] = [];\n let last = 0;\n\n for (const match of value.matchAll(MARKER)) {\n const id = match[1];\n if (!known.has(id)) continue;\n\n const start = match.index ?? 0;\n if (start > last) out.push({ type: \"text\", text: value.slice(last, start) });\n out.push({ type: \"pill\", id });\n last = start + match[0].length;\n }\n\n if (last < value.length) out.push({ type: \"text\", text: value.slice(last) });\n\n return out;\n}\n\n/** The id of every marker the value contains, in order, held or not. */\nexport function markedIds(value: string): string[] {\n return Array.from(value.matchAll(MARKER), (m) => m[1]);\n}\n\n/**\n * What actually gets sent: every text pill replaced by its full text, every image\n * pill by `[Pasted image N]` so the reader of the message can see where the image\n * sat. The images themselves go to `onSubmit`'s second argument.\n */\nexport function expandMarkers(\n value: string,\n pastes: readonly HeldPaste[],\n images: readonly HeldImage[],\n): string {\n const text = new Map(pastes.map((p) => [p.id, p.text]));\n const image = new Map(images.map((i) => [i.id, `[${i.label}]`]));\n\n return value.replace(MARKER, (whole, id: string) => text.get(id) ?? image.get(id) ?? whole);\n}\n","import { useCallback, useMemo, useRef, useState, type ReactNode, type RefObject } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\nimport { usePastePills, type HeldPaste } from \"./use-paste-pills\";\nimport { InlinePill } from \"./InlinePill\";\nimport type { InlinePasteEditorHandle, PillToInsert } from \"./InlinePasteEditor\";\nimport { expandMarkers, markedIds, type HeldImage } from \"./paste-markers\";\nimport type { ComposerPasteClassNames, ComposerPastePreview } from \"./PastePills.types\";\n\nexport interface UseInlinePasteOptions {\n pasteThreshold?: number;\n pasteImages?: boolean;\n previewChars: number;\n renderPastePreview?: (preview: ComposerPastePreview) => ReactNode;\n classNames?: ComposerPasteClassNames;\n disabled: boolean;\n heldPastes?: HeldPaste[];\n onHeldPastesChange?: (pastes: HeldPaste[]) => void;\n heldImages?: HeldImage[];\n onHeldImagesChange?: (images: HeldImage[]) => void;\n editorRef: RefObject<InlinePasteEditorHandle | null>;\n /**\n * Give a text pill a line to itself. Default `true`; a single-line field\n * (`Input`) has no lines to give, so its pills sit in the text.\n */\n blockText?: boolean;\n}\n\n/**\n * Everything inline paste pills need besides the editor itself: the held pastes\n * and images, deciding what a paste becomes, dropping a pill's hold when it is\n * deleted from the message, rendering the pills into the editor, and expanding\n * them on send.\n *\n * Shared by `Composer`, `PromptInput` and `Input` so they cannot disagree about\n * what a pill means. The rule that must not drift is the one `expand` and `imagesIn`\n * carry: a send with pills still closed carries everything they hold.\n */\nexport function useInlinePaste({\n pasteThreshold,\n pasteImages = false,\n previewChars,\n renderPastePreview,\n classNames,\n disabled,\n heldPastes: controlledHeldPastes,\n onHeldPastesChange,\n heldImages: controlledHeldImages,\n onHeldImagesChange,\n editorRef,\n blockText = true,\n}: UseInlinePasteOptions) {\n const pills = usePastePills({\n threshold: pasteThreshold,\n heldPastes: controlledHeldPastes,\n onHeldPastesChange,\n });\n const heldPastes = pills.heldPastes;\n const [heldImages, setHeldImages] = useControllableState<HeldImage[]>(\n controlledHeldImages,\n [],\n onHeldImagesChange,\n );\n const imageCount = useRef(0);\n\n const known = useMemo(\n () => new Set([...heldPastes.map((p) => p.id), ...heldImages.map((i) => i.id)]),\n [heldPastes, heldImages],\n );\n\n const holdImage = useCallback(\n (file: File): string => {\n let id: string;\n do {\n imageCount.current += 1;\n id = `image-${imageCount.current}`;\n } while (heldImages.some((i) => i.id === id));\n\n const image = { id, file, label: `Pasted image ${imageCount.current}` };\n setHeldImages((current) => [...current, image]);\n\n return id;\n },\n [heldImages, setHeldImages],\n );\n\n /** What a paste becomes. `null` means \"just text\". */\n const decidePaste = useCallback(\n (data: DataTransfer | null): PillToInsert[] | null => {\n const text = data?.getData(\"text/plain\") ?? \"\";\n\n // Only a PURE image paste: a clipboard with text as well usually carries a\n // picture OF that text (copying from a document), and holding it would turn\n // every pasted sentence into a screenshot of the sentence.\n if (pasteImages && text === \"\") {\n const files = Array.from(data?.files ?? []).filter((f) =>\n f.type.startsWith(\"image/\"),\n );\n if (files.length > 0) {\n return files.map((file) => ({ id: holdImage(file), block: false }));\n }\n }\n\n if (pasteThreshold && pasteThreshold > 0 && text.length >= pasteThreshold) {\n return [{ id: pills.hold(text), block: blockText }];\n }\n\n return null;\n },\n [pasteImages, pasteThreshold, holdImage, pills, blockText],\n );\n\n /*\n * The message is the record of what is attached. A pill backspaced out of it is\n * no longer attached, so its held entry goes too — otherwise state would say\n * \"attached\" about something the message no longer contains.\n */\n const prune = useCallback(\n (next: string) => {\n const present = new Set(markedIds(next));\n for (const paste of heldPastes) if (!present.has(paste.id)) pills.remove(paste.id);\n if (heldImages.some((i) => !present.has(i.id))) {\n setHeldImages((current) => current.filter((i) => present.has(i.id)));\n }\n },\n [heldPastes, heldImages, pills, setHeldImages],\n );\n\n const [hosts, setHosts] = useState<ReadonlyMap<string, HTMLElement>>(new Map());\n const onHostsChange = useCallback((next: ReadonlyMap<string, HTMLElement>) => {\n setHosts((prev) => {\n if (prev.size === next.size && [...next].every(([id, el]) => prev.get(id) === el)) {\n return prev;\n }\n return next;\n });\n }, []);\n\n /** Click a text pill and its full text takes the pill's place. */\n const expandPill = useCallback(\n (id: string) => {\n const text = pills.expand(id);\n if (text === undefined) return;\n editorRef.current?.replacePill(id, text);\n },\n [pills, editorRef],\n );\n\n /** The value as it is sent: every text pill expanded, every image marked. */\n const expand = useCallback(\n (value: string) => expandMarkers(value, heldPastes, heldImages),\n [heldPastes, heldImages],\n );\n\n /** The images the value still contains, in message order. */\n const imagesIn = useCallback(\n (value: string) =>\n markedIds(value).flatMap((id) => heldImages.filter((i) => i.id === id)),\n [heldImages],\n );\n\n const clear = useCallback(() => {\n pills.clear();\n setHeldImages([]);\n }, [pills, setHeldImages]);\n\n /** The pills, portalled into the placeholders the editor made. Render this anywhere. */\n const portals = Array.from(hosts, ([id, host]) => {\n const paste = heldPastes.find((p) => p.id === id);\n const image = paste ? undefined : heldImages.find((i) => i.id === id);\n const preview: ComposerPastePreview | null = paste\n ? { kind: \"text\", paste }\n : image\n ? { kind: \"image\", image }\n : null;\n\n return preview\n ? createPortal(\n <InlinePill\n preview={preview}\n previewChars={previewChars}\n renderPastePreview={renderPastePreview}\n classNames={classNames}\n disabled={disabled}\n onExpand={expandPill}\n />,\n host,\n id,\n )\n : null;\n });\n\n return {\n pills,\n heldPastes,\n heldImages,\n known,\n decidePaste,\n prune,\n onHostsChange,\n expand,\n imagesIn,\n clear,\n portals,\n };\n}\n","import {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useLayoutEffect,\n useRef,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { PILL_MARK, pasteMarker, segmentValue } from \"./paste-markers\";\n\n/** The attribute on the placeholder span a pill is portalled into. */\nexport const HOST_ATTR = \"data-react-fancy-composer-paste-host\";\n\n/** What a paste becomes, as decided by `Composer`. `block` pills get their own line. */\nexport interface PillToInsert {\n id: string;\n block: boolean;\n}\n\nexport interface InlinePasteEditorHandle {\n focus(): void;\n /** Swap a pill for plain text, where it sits. */\n replacePill(id: string, text: string): void;\n /**\n * Replace the whole value and put the caret at `caret` (an offset into the\n * value). For a host that edits text itself — `PromptInput`'s `/` and `@`\n * pickers — where rebuilding from `value` alone would lose the caret.\n */\n setValue(value: string, caret: number): void;\n}\n\ninterface InlinePasteEditorProps {\n value: string;\n /** Ids the composer holds. A marker for anything else stays text. */\n known: ReadonlySet<string>;\n /** `caret` is the caret's offset into `value`, or `value.length` if it is elsewhere. */\n onChange(value: string, caret: number): void;\n onSubmit(): void;\n /**\n * Which key sends. `\"enter\"` (default): Enter sends, Shift+Enter is a newline.\n * `\"mod-enter\"`: Ctrl/⌘+Enter sends and a plain Enter is a newline.\n */\n submitKey?: \"enter\" | \"mod-enter\";\n /** Runs BEFORE the editor's own key handling; `preventDefault()` to claim the key. */\n onKeyDown?(e: React.KeyboardEvent<HTMLDivElement>): void;\n placeholderClassName?: string;\n /** Height in px past which the input scrolls. Defaults to the class's max height. */\n maxHeight?: number;\n /** Return the pills a paste becomes, or null to insert its text as typed. */\n onPaste(data: DataTransfer | null): PillToInsert[] | null;\n /** Every pill placeholder currently in the editor, for the composer to portal into. */\n onHostsChange(hosts: ReadonlyMap<string, HTMLElement>): void;\n placeholder: string;\n disabled: boolean;\n className?: string;\n /**\n * `false` makes it a single-line field, as `Input` uses it: Enter always\n * submits, and a newline in pasted text becomes a space, as a browser does for\n * an `<input>`. A held paste keeps its newlines; it is only the field that has\n * one line. Default `true`.\n */\n multiline?: boolean;\n /** The editable surface's id, so a host can find it. */\n id?: string;\n /** Names the textbox for assistive tech; a `<div>` cannot be the target of a `<label>`. */\n ariaLabelledBy?: string;\n ariaInvalid?: boolean;\n style?: React.CSSProperties;\n}\n\n/**\n * Walk a node's children back into a value string.\n *\n * `<br>` as the LAST child of its parent is filler — browsers put one in an empty\n * line, and this editor puts one after a trailing newline so the caret has a line\n * to sit on — so it counts for nothing. Block elements a browser invents count as\n * a line break before them. Non-breaking spaces become spaces: a browser inserts\n * them for typed spaces it fears would collapse, not because anyone asked.\n */\nfunction serialize(parent: Node, keep: (id: string) => boolean): string {\n let out = \"\";\n const children = Array.from(parent.childNodes);\n\n children.forEach((node, i) => {\n if (node.nodeType === Node.TEXT_NODE) {\n out += (node.textContent ?? \"\").replace(/\\u00A0/g, \" \");\n return;\n }\n if (!(node instanceof HTMLElement)) return;\n\n const id = node.getAttribute(HOST_ATTR);\n if (id !== null) {\n if (keep(id)) out += pasteMarker(id);\n return;\n }\n if (node.tagName === \"BR\") {\n if (i !== children.length - 1) out += \"\\n\";\n return;\n }\n if (/^(DIV|P)$/.test(node.tagName) && out.length > 0 && !out.endsWith(\"\\n\")) {\n out += \"\\n\";\n }\n out += serialize(node, keep);\n });\n\n return out;\n}\n\nfunction makeHost(id: string): HTMLElement {\n const host = document.createElement(\"span\");\n host.setAttribute(\"contenteditable\", \"false\");\n host.setAttribute(HOST_ATTR, id);\n host.className = \"inline-block align-baseline\";\n return host;\n}\n\n/** A value ending in a newline needs a `<br>` after it, or the caret has no line to sit on. */\nfunction ensureTrailingBreak(root: HTMLElement, value: string) {\n const last = root.lastChild;\n const hasBreak = last instanceof HTMLElement && last.tagName === \"BR\";\n\n if (value.endsWith(\"\\n\") && !hasBreak) root.append(document.createElement(\"br\"));\n if (!value.endsWith(\"\\n\") && hasBreak && value.length > 0) last.remove();\n}\n\nfunction placeCaretAfter(node: Node) {\n const selection = window.getSelection();\n if (!selection) return;\n\n const range = document.createRange();\n range.setStartAfter(node);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n}\n\n/**\n * Put the caret `offset` characters into the serialised value. Walks the shape\n * `render` produces — text nodes, pill hosts (each worth its marker's length) and\n * a trailing `<br>` — so it is only called straight after a render.\n */\nfunction placeCaretAtOffset(root: HTMLElement, offset: number, keep: (id: string) => boolean) {\n const selection = window.getSelection();\n if (!selection) return;\n\n const range = document.createRange();\n let remaining = offset;\n let placed = false;\n\n for (const node of Array.from(root.childNodes)) {\n if (node.nodeType === Node.TEXT_NODE) {\n const length = node.textContent?.length ?? 0;\n if (remaining <= length) {\n range.setStart(node, remaining);\n placed = true;\n break;\n }\n remaining -= length;\n continue;\n }\n const id = node instanceof HTMLElement ? node.getAttribute(HOST_ATTR) : null;\n if (id !== null && keep(id)) {\n const length = pasteMarker(id).length;\n if (remaining < length) {\n range.setStartAfter(node);\n placed = true;\n break;\n }\n remaining -= length;\n }\n }\n\n if (!placed) {\n range.selectNodeContents(root);\n range.collapse(false);\n const last = root.lastChild;\n if (last instanceof HTMLElement && last.tagName === \"BR\") range.setStartBefore(last);\n }\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n}\n\n/**\n * The plain-text-plus-pills surface behind `Composer`'s inline placement.\n *\n * The DOM is the source of truth WHILE TYPING and `value` is its serialisation;\n * the DOM is rebuilt from `value` only when `value` changes from outside (a send,\n * a host, an agent). Rebuilding on every keystroke would throw the caret away.\n *\n * Every insertion is done here by hand, never by the browser: a paste is always\n * intercepted, so no foreign HTML ever lands in the editor, and Enter is handled\n * so a browser never invents a `<div>` per line.\n */\nexport const InlinePasteEditor = forwardRef<InlinePasteEditorHandle, InlinePasteEditorProps>(\n function InlinePasteEditor(\n {\n value,\n known,\n onChange,\n onSubmit,\n onPaste,\n onHostsChange,\n placeholder,\n disabled,\n className,\n submitKey = \"enter\",\n onKeyDown,\n placeholderClassName,\n maxHeight,\n multiline = true,\n id,\n ariaLabelledBy,\n ariaInvalid,\n style,\n },\n ref,\n ) {\n const rootRef = useRef<HTMLDivElement>(null);\n /** The last value this editor produced or rendered. Anything else came from outside. */\n const lastValue = useRef<string | null>(null);\n /**\n * Ids inserted here whose hold has not reached `known` yet. A pill is held and\n * placed in the same event, and the composer's state lands a render later.\n */\n const pending = useRef(new Set<string>());\n const knownRef = useRef(known);\n knownRef.current = known;\n\n const keep = useCallback(\n (id: string) => knownRef.current.has(id) || pending.current.has(id),\n [],\n );\n\n const reportHosts = useCallback(() => {\n const root = rootRef.current;\n if (!root) return;\n\n const hosts = new Map<string, HTMLElement>();\n root.querySelectorAll<HTMLElement>(`[${HOST_ATTR}]`).forEach((el) => {\n const id = el.getAttribute(HOST_ATTR)!;\n if (keep(id)) hosts.set(id, el);\n });\n onHostsChange(hosts);\n }, [keep, onHostsChange]);\n\n /** The caret's offset into the serialised value, or its length if the caret is elsewhere. */\n const caretOffset = useCallback(\n (whole: string): number => {\n const root = rootRef.current;\n const selection = window.getSelection();\n if (!root || !selection || selection.rangeCount === 0) return whole.length;\n\n const range = selection.getRangeAt(0);\n if (!root.contains(range.endContainer)) return whole.length;\n\n const head = document.createRange();\n head.selectNodeContents(root);\n head.setEnd(range.endContainer, range.endOffset);\n return serialize(head.cloneContents(), keep).length;\n },\n [keep],\n );\n\n /** Read the DOM back into a value and tell the composer. */\n const emit = useCallback(() => {\n const root = rootRef.current;\n if (!root) return;\n\n const next = serialize(root, keep);\n ensureTrailingBreak(root, next);\n reportHosts();\n\n // Reported even when the value is unchanged: a host reading the caret (a\n // `/` picker) needs to hear about it.\n lastValue.current = next;\n onChange(next, caretOffset(next));\n }, [keep, onChange, reportHosts, caretOffset]);\n\n /** Rebuild the DOM from a value. Throws the caret away; callers put it back. */\n const render = useCallback(\n (next: string) => {\n const root = rootRef.current;\n if (!root) return;\n\n root.replaceChildren();\n for (const segment of segmentValue(next, knownRef.current)) {\n if (segment.type === \"text\") {\n root.append(document.createTextNode(segment.text));\n } else {\n root.append(makeHost(segment.id));\n }\n }\n ensureTrailingBreak(root, next);\n lastValue.current = next;\n reportHosts();\n },\n [reportHosts],\n );\n\n /** The caret's range, or the end of the editor if the caret is elsewhere. */\n const caret = useCallback((): Range => {\n const root = rootRef.current!;\n const selection = window.getSelection();\n\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n if (root.contains(range.commonAncestorContainer)) return range;\n }\n\n const range = document.createRange();\n range.selectNodeContents(root);\n range.collapse(false);\n const last = root.lastChild;\n if (last instanceof HTMLElement && last.tagName === \"BR\") {\n range.setStartBefore(last);\n range.collapse(true);\n }\n return range;\n }, []);\n\n /** Replace the selection with `nodes` and leave the caret after them. */\n const insert = useCallback(\n (build: (before: string, after: string) => Node[]) => {\n const root = rootRef.current!;\n const range = caret();\n range.deleteContents();\n\n const head = document.createRange();\n head.selectNodeContents(root);\n head.setEnd(range.startContainer, range.startOffset);\n const tail = document.createRange();\n tail.selectNodeContents(root);\n tail.setStart(range.endContainer, range.endOffset);\n\n const nodes = build(\n serialize(head.cloneContents(), () => true),\n serialize(tail.cloneContents(), () => true),\n );\n if (nodes.length === 0) return;\n\n const fragment = document.createDocumentFragment();\n nodes.forEach((n) => fragment.append(n));\n range.insertNode(fragment);\n placeCaretAfter(nodes[nodes.length - 1]);\n emit();\n },\n [caret, emit],\n );\n\n const insertText = useCallback(\n (text: string) => insert(() => (text ? [document.createTextNode(text)] : [])),\n [insert],\n );\n\n /*\n * Rebuild from `value` when it changed from outside — or when `known` now\n * disagrees with the pills on screen, e.g. a host set a marker and then the\n * paste it names. Never on our own edits: that would discard the caret.\n */\n useLayoutEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n\n for (const id of pending.current) if (known.has(id)) pending.current.delete(id);\n\n const wanted = segmentValue(value, known)\n .flatMap((s) => (s.type === \"pill\" ? [s.id] : []))\n .join(PILL_MARK);\n const onScreen = Array.from(root.querySelectorAll(`[${HOST_ATTR}]`))\n .map((el) => el.getAttribute(HOST_ATTR))\n .filter((id): id is string => id !== null && keep(id))\n .join(PILL_MARK);\n\n if (value === lastValue.current && wanted === onScreen) return;\n\n render(value);\n }, [value, known, keep, render]);\n\n useImperativeHandle(\n ref,\n () => ({\n focus() {\n const root = rootRef.current;\n if (!root) return;\n root.focus();\n const range = caret();\n const selection = window.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(range);\n },\n replacePill(id, text) {\n const root = rootRef.current;\n const host = Array.from(\n root?.querySelectorAll(`[${HOST_ATTR}]`) ?? [],\n ).find((el) => el.getAttribute(HOST_ATTR) === id);\n if (!root || !host) return;\n\n const node = document.createTextNode(text);\n host.replaceWith(node);\n root.focus();\n placeCaretAfter(node);\n emit();\n },\n setValue(next, offset) {\n const root = rootRef.current;\n if (!root) return;\n\n render(next);\n root.focus();\n placeCaretAtOffset(root, offset, keep);\n emit();\n },\n }),\n [caret, emit, render, keep],\n );\n\n const handlePaste = (e: React.ClipboardEvent<HTMLDivElement>) => {\n // ALWAYS intercepted: a browser left to paste into a contenteditable inserts\n // the clipboard's HTML, styles and all.\n e.preventDefault();\n if (disabled) return;\n\n const pills = onPaste(e.clipboardData);\n\n if (pills === null) {\n const text = (e.clipboardData?.getData(\"text/plain\") ?? \"\").replace(/\\r\\n?/g, \"\\n\");\n insertText(multiline ? text : text.replace(/\\n+/g, \" \"));\n return;\n }\n\n for (const { id } of pills) pending.current.add(id);\n\n insert((before, after) => {\n const nodes: Node[] = [];\n\n for (const { id, block } of pills) {\n if (block) {\n // A text pill gets a line to itself: a newline above unless it is\n // already at the start of one, and below unless one follows.\n const precededByBreak =\n nodes.length === 0\n ? before === \"\" || before.endsWith(\"\\n\")\n : nodes[nodes.length - 1].textContent === \"\\n\";\n if (!precededByBreak) nodes.push(document.createTextNode(\"\\n\"));\n nodes.push(makeHost(id));\n nodes.push(document.createTextNode(\"\\n\"));\n } else {\n nodes.push(makeHost(id));\n }\n }\n\n // The trailing newline of a block pill is redundant if one already follows.\n const last = nodes[nodes.length - 1];\n if (last.textContent === \"\\n\" && after.startsWith(\"\\n\")) nodes.pop();\n\n return nodes;\n });\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (e.key !== \"Enter\" || e.nativeEvent.isComposing) return;\n\n e.preventDefault();\n const sends =\n !multiline || (submitKey === \"mod-enter\" ? e.ctrlKey || e.metaKey : !e.shiftKey);\n if (sends) {\n onSubmit();\n } else {\n insertText(\"\\n\");\n }\n };\n\n return (\n <div className=\"relative\">\n {value === \"\" && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute left-4 top-3 text-sm text-zinc-400\",\n placeholderClassName,\n )}\n >\n {placeholder}\n </span>\n )}\n <div\n ref={rootRef}\n id={id}\n data-react-fancy-composer-input=\"\"\n role=\"textbox\"\n aria-multiline={multiline}\n aria-labelledby={ariaLabelledBy}\n aria-invalid={ariaInvalid || undefined}\n aria-placeholder={placeholder}\n aria-disabled={disabled || undefined}\n contentEditable={!disabled}\n suppressContentEditableWarning\n onInput={emit}\n onPaste={handlePaste}\n onKeyDown={handleKeyDown}\n style={maxHeight === undefined ? style : { ...style, maxHeight }}\n className={cn(\n \"max-h-72 min-h-[4.5rem] w-full overflow-y-auto whitespace-pre-wrap break-words bg-transparent px-4 pt-3 text-sm outline-none\",\n className,\n )}\n />\n </div>\n );\n },\n);\n","import { useEffect, useRef } from \"react\";\n\nexport interface PastedFilesInputProps {\n /** The form field name the files are submitted under. */\n name: string;\n /** The files to submit, in the order the message holds them. */\n files: readonly File[];\n /** Associate with a `<form id>` elsewhere in the document, as `<input form>` does. */\n form?: string;\n}\n\n/**\n * A hidden `<input type=\"file\">` carrying the files pasted into a field, so a\n * plain `<form>` submits them with everything else.\n *\n * A pasted file is not in any form field: the clipboard hands it to the paste\n * handler and nowhere else. Held as a pill, it is attached as far as the person can\n * see, and a native submit would then post the text without it. A file input is\n * the one element a form posts files from, and its `files` can be set from a\n * `DataTransfer`, so the pills keep it in step: delete a pill and its file leaves\n * the input too.\n *\n * Hidden rather than visually hidden: `hidden` keeps it out of the tab order and\n * the accessibility tree, where the pills already represent it, and does not stop\n * a form submitting it.\n */\nexport function PastedFilesInput({ name, files, form }: PastedFilesInputProps) {\n const ref = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n const el = ref.current;\n // No DataTransfer (a server render, an old engine): nothing can be set, and\n // the host still has the files from its own state.\n if (!el || typeof DataTransfer === \"undefined\") return;\n\n const transfer = new DataTransfer();\n for (const file of files) transfer.items.add(file);\n el.files = transfer.files;\n }, [files]);\n\n return (\n <input\n ref={ref}\n type=\"file\"\n name={name}\n form={form}\n multiple\n hidden\n tabIndex={-1}\n data-react-fancy-pasted-files={name}\n />\n );\n}\n"]}
|
package/dist/chunk-GFYSELJF.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
// src/components/inputs/inputs.utils.ts
|
|
2
|
-
var inputSizeClasses = {
|
|
3
|
-
xs: "px-2 py-1 text-xs rounded",
|
|
4
|
-
sm: "px-2.5 py-1.5 text-sm rounded-md",
|
|
5
|
-
md: "px-3 py-2 text-sm rounded-lg",
|
|
6
|
-
lg: "px-4 py-2.5 text-base rounded-lg",
|
|
7
|
-
xl: "px-5 py-3 text-lg rounded-xl"
|
|
8
|
-
};
|
|
9
|
-
var labelSizeClasses = {
|
|
10
|
-
xs: "text-xs",
|
|
11
|
-
sm: "text-xs",
|
|
12
|
-
md: "text-sm",
|
|
13
|
-
lg: "text-sm",
|
|
14
|
-
xl: "text-base"
|
|
15
|
-
};
|
|
16
|
-
function dirtyClasses(dirty) {
|
|
17
|
-
return dirty ? "border-l-[3px] border-l-amber-400" : "";
|
|
18
|
-
}
|
|
19
|
-
function dirtyRingClasses(dirty) {
|
|
20
|
-
return dirty ? "ring-2 ring-amber-400/50" : "";
|
|
21
|
-
}
|
|
22
|
-
function errorClasses(error) {
|
|
23
|
-
return error ? "border-red-500 focus:ring-red-500" : "";
|
|
24
|
-
}
|
|
25
|
-
var inputBaseClasses = "border border-zinc-300 bg-white text-zinc-900 placeholder:text-zinc-400 transition-[border-color,box-shadow] duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500/40 focus:border-blue-500 disabled:opacity-50 disabled:cursor-not-allowed dark:border-zinc-700 dark:bg-[#1e1e24] dark:text-zinc-100 dark:placeholder:text-zinc-500 dark:focus:border-blue-400 dark:focus:ring-blue-400/20";
|
|
26
|
-
function resolveOption(option) {
|
|
27
|
-
if (typeof option === "string") {
|
|
28
|
-
return { value: option, label: option };
|
|
29
|
-
}
|
|
30
|
-
return option;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export { dirtyClasses, dirtyRingClasses, errorClasses, inputBaseClasses, inputSizeClasses, labelSizeClasses, resolveOption };
|
|
34
|
-
//# sourceMappingURL=chunk-GFYSELJF.js.map
|
|
35
|
-
//# sourceMappingURL=chunk-GFYSELJF.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Drawer/Drawer.context.ts","../src/components/Drawer/DrawerHeader.tsx","../src/components/Drawer/DrawerBody.tsx","../src/components/Drawer/DrawerFooter.tsx","../src/components/Drawer/DrawerContainer.tsx","../src/components/Drawer/Drawer.tsx"],"names":["createContext","useContext","jsxs","cn","jsx","X","useRef","useCallback","useEscapeKey","useFocusTrap","useEffect","useAnimation","useMemo","Portal"],"mappings":"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","file":"chunk-GU5BYZTR.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { DrawerContextValue } from \"./Drawer.types\";\n\nexport const DrawerContext = createContext<DrawerContextValue | null>(null);\n\nexport function useDrawer(): DrawerContextValue {\n const ctx = useContext(DrawerContext);\n if (!ctx) {\n throw new Error(\"Drawer compound components must be used within <Drawer>\");\n }\n return ctx;\n}\n","import { X } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useDrawer } from \"./Drawer.context\";\nimport type { DrawerHeaderProps } from \"./Drawer.types\";\n\nexport function DrawerHeader({ children, closable = true, className }: DrawerHeaderProps) {\n const { close } = useDrawer();\n\n return (\n <div\n data-react-fancy-drawer-header=\"\"\n className={cn(\n \"flex shrink-0 items-center justify-between border-b border-zinc-200 px-4 py-3 dark:border-zinc-700\",\n className,\n )}\n >\n <div className=\"text-sm font-semibold text-zinc-900 dark:text-zinc-100\">{children}</div>\n {closable ? (\n <button\n type=\"button\"\n onClick={close}\n className=\"rounded-lg p-1 text-zinc-400 transition-colors hover:bg-zinc-100 hover:text-zinc-600 dark:hover:bg-zinc-800 dark:hover:text-zinc-300\"\n aria-label=\"Close\"\n >\n <X size={18} />\n </button>\n ) : null}\n </div>\n );\n}\n\nDrawerHeader.displayName = \"DrawerHeader\";\n","import { cn } from \"../../utils/cn\";\nimport type { DrawerBodyProps } from \"./Drawer.types\";\n\nexport function DrawerBody({ children, className }: DrawerBodyProps) {\n return (\n <div\n data-react-fancy-drawer-body=\"\"\n className={cn(\"min-h-0 flex-1 overflow-auto px-4 py-3 text-zinc-700 dark:text-zinc-300\", className)}\n >\n {children}\n </div>\n );\n}\n\nDrawerBody.displayName = \"DrawerBody\";\n","import { cn } from \"../../utils/cn\";\nimport type { DrawerFooterProps } from \"./Drawer.types\";\n\nexport function DrawerFooter({ children, className }: DrawerFooterProps) {\n return (\n <div\n data-react-fancy-drawer-footer=\"\"\n className={cn(\n \"flex shrink-0 items-center justify-end gap-2 border-t border-zinc-200 px-4 py-3 dark:border-zinc-700\",\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\nDrawerFooter.displayName = \"DrawerFooter\";\n","import { cn } from \"../../utils/cn\";\nimport type { DrawerContainerProps } from \"./Drawer.types\";\n\n/**\n * The anchor for `<Drawer attach=\"container\">`.\n *\n * A container-attached drawer positions itself `absolute`, which resolves\n * against the nearest *positioned* ancestor — so without `relative` somewhere\n * above it, the drawer silently escapes to the viewport and looks like it\n * ignored `attach` entirely. This wrapper supplies `relative` + `overflow-hidden`\n * so the panel slides within the box rather than out of it.\n *\n * <Drawer.Container className=\"h-80 rounded-xl border\">\n * <YourContent />\n * <Drawer attach=\"container\" side=\"bottom\" open={open} onClose={close}>\n * <Drawer.Body>Filters</Drawer.Body>\n * </Drawer>\n * </Drawer.Container>\n *\n * Any element works as long as it is positioned — this is the shortcut, not a\n * requirement. Wrapping a Card, a layout pane, or a prompt-input shell in\n * `relative overflow-hidden` does the same job.\n */\nexport function DrawerContainer({ children, className, ...rest }: DrawerContainerProps) {\n return (\n <div\n data-react-fancy-drawer-container=\"\"\n {...rest}\n className={cn(\"relative overflow-hidden\", className)}\n >\n {children}\n </div>\n );\n}\n\nDrawerContainer.displayName = \"DrawerContainer\";\n","import { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Portal } from \"../Portal\";\nimport { DrawerContext } from \"./Drawer.context\";\nimport { DrawerHeader } from \"./DrawerHeader\";\nimport { DrawerBody } from \"./DrawerBody\";\nimport { DrawerFooter } from \"./DrawerFooter\";\nimport { DrawerContainer } from \"./DrawerContainer\";\nimport { useFocusTrap } from \"../../hooks/use-focus-trap\";\nimport { useEscapeKey } from \"../../hooks/use-escape-key\";\nimport { useAnimation } from \"../../hooks/use-animation\";\nimport type { DrawerProps, DrawerSide } from \"./Drawer.types\";\n\n/**\n * `size` addresses the drawer's own axis: width on the horizontal edges,\n * height on the vertical ones. Keeping one scale across both means `size=\"lg\"`\n * does not have to be re-learned when a drawer moves from the side to the\n * bottom.\n */\nconst WIDTH = {\n sm: \"w-64\",\n md: \"w-80\",\n lg: \"w-96\",\n xl: \"w-[32rem]\",\n full: \"w-full\",\n} as const;\n\nconst HEIGHT = {\n sm: \"h-32\",\n md: \"h-64\",\n lg: \"h-96\",\n xl: \"h-[32rem]\",\n full: \"h-full\",\n} as const;\n\nconst ANCHOR: Record<DrawerSide, string> = {\n left: \"inset-y-0 left-0\",\n right: \"inset-y-0 right-0\",\n top: \"inset-x-0 top-0\",\n bottom: \"inset-x-0 bottom-0\",\n};\n\nconst ENTER: Record<DrawerSide, string> = {\n left: \"fancy-slide-in-left\",\n right: \"fancy-slide-in-right\",\n top: \"fancy-slide-in-top\",\n bottom: \"fancy-slide-in-bottom\",\n};\n\nconst EXIT: Record<DrawerSide, string> = {\n left: \"fancy-slide-out-left\",\n right: \"fancy-slide-out-right\",\n top: \"fancy-slide-out-top\",\n bottom: \"fancy-slide-out-bottom\",\n};\n\n/** The panel's edge shadow reads as depth away from the anchored edge. */\nconst EDGE: Record<DrawerSide, string> = {\n left: \"border-r\",\n right: \"border-l\",\n top: \"border-b\",\n bottom: \"border-t\",\n};\n\nfunction DrawerRoot({\n children,\n open,\n onClose,\n side = \"right\",\n size = \"md\",\n attach = \"viewport\",\n backdrop = true,\n dismissOnBackdrop = true,\n dismissOnEscape = true,\n className,\n ...rest\n}: DrawerProps) {\n const panelRef = useRef<HTMLDivElement>(null);\n const horizontal = side === \"left\" || side === \"right\";\n const isViewport = attach === \"viewport\";\n\n const close = useCallback(() => onClose(), [onClose]);\n useEscapeKey(close, open && dismissOnEscape);\n\n // A container-attached drawer is a panel, not a dialog — trapping focus in it\n // would strand keyboard users inside a Card. Only the viewport form is modal.\n useFocusTrap(panelRef, open && isViewport);\n\n useEffect(() => {\n if (!open || !isViewport) return;\n const original = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = original;\n };\n }, [open, isViewport]);\n\n const { mounted, className: animClass, ref: animRef } = useAnimation({\n open,\n enterClass: ENTER[side],\n exitClass: EXIT[side],\n });\n\n const ctx = useMemo(() => ({ open, close, side }), [open, close, side]);\n\n if (!mounted) return null;\n\n const frame = (\n <div\n data-react-fancy-drawer-frame=\"\"\n className={cn(isViewport ? \"fixed inset-0 z-50\" : \"absolute inset-0 z-20\", !backdrop && \"pointer-events-none\")}\n >\n {backdrop ? (\n <div\n data-react-fancy-drawer-backdrop=\"\"\n className={cn(\n \"absolute inset-0 bg-black/40 transition-opacity\",\n isViewport && \"backdrop-blur-sm\",\n open ? \"opacity-100\" : \"opacity-0\",\n )}\n onClick={dismissOnBackdrop ? close : undefined}\n aria-hidden=\"true\"\n />\n ) : null}\n\n <div\n ref={(node) => {\n panelRef.current = node;\n (animRef as React.MutableRefObject<HTMLElement | null>).current = node;\n }}\n data-react-fancy-drawer=\"\"\n data-side={side}\n role=\"dialog\"\n aria-modal={isViewport || undefined}\n {...rest}\n className={cn(\n \"pointer-events-auto absolute flex flex-col border-zinc-200 bg-white shadow-xl dark:border-zinc-700 dark:bg-zinc-900\",\n ANCHOR[side],\n EDGE[side],\n horizontal ? WIDTH[size] : HEIGHT[size],\n // Cross-axis fills the anchor; the main axis is capped so a viewport\n // drawer can never grow past the screen on a small device.\n horizontal ? \"h-full\" : \"w-full\",\n isViewport && (horizontal ? \"max-w-[90vw]\" : \"max-h-[90vh]\"),\n !isViewport && (horizontal ? \"max-w-full\" : \"max-h-full\"),\n animClass,\n className,\n )}\n >\n {children}\n </div>\n </div>\n );\n\n return (\n <DrawerContext.Provider value={ctx}>\n {isViewport ? <Portal>{frame}</Portal> : frame}\n </DrawerContext.Provider>\n );\n}\n\nexport const Drawer = Object.assign(DrawerRoot, {\n Header: DrawerHeader,\n Body: DrawerBody,\n Footer: DrawerFooter,\n Container: DrawerContainer,\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Modal/Modal.context.ts","../src/components/Modal/ModalHeader.tsx","../src/components/Modal/ModalBody.tsx","../src/components/Modal/ModalFooter.tsx","../src/components/Modal/Modal.tsx"],"names":["createContext","useContext","jsxs","cn","jsx","X","useRef","useCallback","useEscapeKey","useFocusTrap","useEffect","useAnimation","useMemo","Portal"],"mappings":"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","file":"chunk-HKRB2Z6R.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { ModalContextValue } from \"./Modal.types\";\n\nexport const ModalContext = createContext<ModalContextValue | null>(null);\n\nexport function useModal(): ModalContextValue {\n const ctx = useContext(ModalContext);\n if (!ctx) {\n throw new Error(\"Modal compound components must be used within <Modal>\");\n }\n return ctx;\n}\n","import { X } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useModal } from \"./Modal.context\";\nimport type { ModalHeaderProps } from \"./Modal.types\";\n\nexport function ModalHeader({ children, className }: ModalHeaderProps) {\n const { close } = useModal();\n\n return (\n <div\n data-react-fancy-modal-header=\"\"\n className={cn(\n \"flex items-center justify-between border-b border-zinc-200 px-6 py-4 dark:border-zinc-700\",\n className,\n )}\n >\n <div className=\"text-lg font-semibold text-zinc-900 dark:text-zinc-100\">{children}</div>\n <button\n type=\"button\"\n onClick={close}\n className=\"rounded-lg p-1 text-zinc-400 transition-colors hover:bg-zinc-100 hover:text-zinc-600 dark:hover:bg-zinc-800 dark:hover:text-zinc-300\"\n aria-label=\"Close\"\n >\n <X size={20} />\n </button>\n </div>\n );\n}\n\nModalHeader.displayName = \"ModalHeader\";\n","import { cn } from \"../../utils/cn\";\nimport type { ModalBodyProps } from \"./Modal.types\";\n\nexport function ModalBody({ children, className }: ModalBodyProps) {\n return (\n // `min-h-0` is load-bearing, not decoration. A flex child defaults to\n // `min-height: auto`, which refuses to shrink below its content — so\n // `flex-1` alone would push the panel through its own max-height and the\n // scrollbar would never appear. This is what permits the overflow that\n // `overflow-y-auto` then handles.\n <div data-react-fancy-modal-body=\"\" className={cn(\"min-h-0 flex-1 overflow-y-auto px-6 py-4 text-zinc-700 dark:text-zinc-300\", className)}>\n {children}\n </div>\n );\n}\n\nModalBody.displayName = \"ModalBody\";\n","import { cn } from \"../../utils/cn\";\nimport type { ModalFooterProps } from \"./Modal.types\";\n\nexport function ModalFooter({ children, className }: ModalFooterProps) {\n return (\n <div\n data-react-fancy-modal-footer=\"\"\n className={cn(\n \"flex items-center justify-end gap-3 border-t border-zinc-200 px-6 py-4 dark:border-zinc-700\",\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\nModalFooter.displayName = \"ModalFooter\";\n","import { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Portal } from \"../Portal\";\nimport { ModalContext } from \"./Modal.context\";\nimport { ModalHeader } from \"./ModalHeader\";\nimport { ModalBody } from \"./ModalBody\";\nimport { ModalFooter } from \"./ModalFooter\";\nimport { useFocusTrap } from \"../../hooks/use-focus-trap\";\nimport { useEscapeKey } from \"../../hooks/use-escape-key\";\nimport { useAnimation } from \"../../hooks/use-animation\";\nimport type { ModalProps } from \"./Modal.types\";\n\n/**\n * Every size is capped against the VIEWPORT, not just the width.\n *\n * Only `full` used to carry a max-height. The other four were width-constrained\n * and vertically unbounded, so a modal with long content simply grew past the\n * bottom of the screen and the rest became unreachable — no scrollbar, because\n * there was no overflow to scroll: the box got taller instead.\n *\n * `ModalBody` already had `flex-1 overflow-y-auto` and the panel already had\n * `overflow-hidden`. The scrolling machinery was complete and inert, waiting on\n * the one constraint that makes it engage.\n *\n * `dvh` over `vh` deliberately: on mobile browsers `100vh` is the tallest the\n * viewport ever gets, ignoring the address bar, so a `vh`-capped modal still\n * runs under the chrome on exactly the devices with least room. `dvh` tracks\n * the visible height. The `vh` fallback is listed first for any engine that\n * does not know `dvh` yet — an unknown unit drops the declaration, so ordering\n * is what keeps the old behaviour rather than none.\n */\nconst VIEWPORT_CAP = \"max-h-[calc(100vh-2rem)] max-h-[calc(100dvh-2rem)]\";\n\nconst SIZE_MAP = {\n sm: `max-w-sm ${VIEWPORT_CAP}`,\n md: `max-w-lg ${VIEWPORT_CAP}`,\n lg: `max-w-2xl ${VIEWPORT_CAP}`,\n xl: `max-w-4xl ${VIEWPORT_CAP}`,\n full: `max-w-[calc(100vw-2rem)] ${VIEWPORT_CAP}`,\n} as const;\n\nfunction ModalRoot({\n children,\n open,\n onClose,\n size = \"md\",\n className,\n ...rest\n}: ModalProps) {\n const panelRef = useRef<HTMLDivElement>(null);\n\n const close = useCallback(() => onClose(), [onClose]);\n useEscapeKey(close, open);\n useFocusTrap(panelRef, open);\n\n // Body scroll lock\n useEffect(() => {\n if (open) {\n const original = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = original;\n };\n }\n }, [open]);\n\n const { mounted, className: animClass, ref: animRef } = useAnimation({\n open,\n enterClass: \"fancy-slide-up\",\n exitClass: \"fancy-fade-out\",\n });\n\n const ctx = useMemo(() => ({ open, close }), [open, close]);\n\n if (!mounted) return null;\n\n return (\n <ModalContext.Provider value={ctx}>\n <Portal>\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-4\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-black/50 backdrop-blur-sm\"\n onClick={close}\n aria-hidden=\"true\"\n />\n {/* Panel */}\n <div\n ref={(node) => {\n panelRef.current = node;\n (animRef as React.MutableRefObject<HTMLElement | null>).current =\n node;\n }}\n data-react-fancy-modal=\"\"\n role=\"dialog\"\n aria-modal=\"true\"\n {...rest}\n className={cn(\n \"relative flex w-full flex-col overflow-hidden rounded-2xl border border-zinc-200 bg-white shadow-xl dark:border-zinc-700 dark:bg-zinc-900\",\n SIZE_MAP[size],\n animClass,\n className,\n )}\n >\n {children}\n </div>\n </div>\n </Portal>\n </ModalContext.Provider>\n );\n}\n\nexport const Modal = Object.assign(ModalRoot, {\n Header: ModalHeader,\n Body: ModalBody,\n Footer: ModalFooter,\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/MoodMeter/MoodMeter.tsx"],"names":["useRef","useState","useCallback","jsxs","jsx","Fragment"],"mappings":"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","file":"chunk-I6L7OP7G.cjs","sourcesContent":["import { useCallback, useRef, useState } from \"react\";\n\n/**\n * MoodMeter — a 2D draggable pad that captures a value AND the\n * confidence in that value on the same handle.\n *\n * <MoodMeter\n * min={0} max={1}\n * value={value} confidence={confidence}\n * onChange={(v, c) => { setValue(v); setConfidence(c); }}\n * />\n *\n * • x-axis maps to [min..max]\n * • y-axis maps to [0..1] confidence (top = sure)\n * • the halo around the handle scales inversely with confidence —\n * uncertain readings literally look fuzzier\n *\n * Why pair them in one control? When AIs post a number, humans\n * immediately ask \"how sure are you?\". Making confidence an explicit\n * sibling of value — and letting the user drag either independently —\n * turns vague \"AI suggestion\" UX into something you can argue with\n * precisely.\n *\n * The agent's posted value/confidence renders as a dashed ghost\n * handle alongside the live user handle, so the human can see where\n * the agent landed and how far they've drifted.\n */\nexport interface MoodMeterProps {\n /** Range minimum. */\n min: number;\n /** Range maximum. */\n max: number;\n /** Step for value snapping. Defaults to (max-min)/100. */\n step?: number;\n /** Current value (controlled). */\n value: number;\n /** Current confidence 0..1 (controlled). */\n confidence: number;\n /** Called with (value, confidence) on drag / pointer events. */\n onChange: (value: number, confidence: number) => void;\n /** Optional agent post — renders as a dashed ghost handle. */\n posted?: { value: number; confidence: number };\n /** Pixel width of the pad. Defaults to 320. */\n width?: number;\n /** Pixel height of the pad. Defaults to 220. */\n height?: number;\n /** Show the grid + axis labels. Defaults to true. */\n showGrid?: boolean;\n /** Color of the user handle. Defaults to sky blue. */\n color?: string;\n /** Color of the posted-ghost handle. Defaults to violet. */\n postedColor?: string;\n /** Optional prefix for the value label (e.g. \"$\"). */\n prefix?: string;\n /** Optional suffix for the value label (e.g. \"k\", \"%\"). */\n suffix?: string;\n /** Optional label text override. Falls back to formatted value. */\n formatValue?: (v: number) => string;\n /** Optional className applied to the outer pad. */\n className?: string;\n}\n\nexport function MoodMeter({\n min,\n max,\n step,\n value,\n confidence,\n onChange,\n posted,\n width = 320,\n height = 220,\n showGrid = true,\n color = \"#0ea5e9\",\n postedColor = \"#a855f7\",\n prefix = \"\",\n suffix = \"\",\n formatValue,\n className,\n}: MoodMeterProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [dragging, setDragging] = useState(false);\n\n const snapStep = step ?? (max - min) / 100;\n\n const fmt = useCallback(\n (v: number) => {\n if (formatValue) return formatValue(v);\n const num = snapStep < 1 ? v.toFixed(2) : Math.round(v).toString();\n return `${prefix}${num}${suffix}`;\n },\n [formatValue, snapStep, prefix, suffix],\n );\n\n const set = useCallback(\n (clientX: number, clientY: number) => {\n const el = ref.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const x = clamp((clientX - rect.left) / rect.width, 0, 1);\n const y = clamp((clientY - rect.top) / rect.height, 0, 1);\n const raw = min + x * (max - min);\n const snapped = round(raw, snapStep, min);\n const c = clamp(1 - y, 0, 1);\n onChange(snapped, Math.round(c * 100) / 100);\n },\n [min, max, snapStep, onChange],\n );\n\n const onPointerDown = (e: React.PointerEvent<HTMLDivElement>) => {\n (e.target as Element).setPointerCapture?.(e.pointerId);\n setDragging(true);\n set(e.clientX, e.clientY);\n };\n const onPointerMove = (e: React.PointerEvent<HTMLDivElement>) => {\n if (!dragging) return;\n set(e.clientX, e.clientY);\n };\n const onPointerUp = () => setDragging(false);\n\n const xPct = ((value - min) / (max - min)) * 100;\n const yPct = (1 - confidence) * 100;\n const haloR = 18 + (1 - confidence) * 70;\n\n const pxPct = posted ? ((posted.value - min) / (max - min)) * 100 : 0;\n const pyPct = posted ? (1 - posted.confidence) * 100 : 0;\n const pHaloR = posted ? 16 + (1 - posted.confidence) * 60 : 0;\n\n return (\n <div\n ref={ref}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n className={`relative cursor-crosshair touch-none select-none overflow-hidden rounded-md border border-zinc-200 bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-950 ${className ?? \"\"}`}\n style={{ width, height }}\n >\n {showGrid && (\n <svg className=\"pointer-events-none absolute inset-0 h-full w-full\" aria-hidden>\n {[0.25, 0.5, 0.75].map((p, i) => (\n <line\n key={`v${i}`}\n x1={`${p * 100}%`}\n x2={`${p * 100}%`}\n y1=\"0\"\n y2=\"100%\"\n stroke=\"#a1a1aa\"\n strokeOpacity={0.18}\n strokeDasharray=\"3 4\"\n />\n ))}\n {[0.25, 0.5, 0.75].map((p, i) => (\n <line\n key={`h${i}`}\n x1=\"0\"\n x2=\"100%\"\n y1={`${p * 100}%`}\n y2={`${p * 100}%`}\n stroke=\"#a1a1aa\"\n strokeOpacity={0.18}\n strokeDasharray=\"3 4\"\n />\n ))}\n </svg>\n )}\n\n {showGrid && (\n <>\n <div className=\"pointer-events-none absolute left-1.5 top-1.5 text-[10px] uppercase tracking-wider text-zinc-400\">\n ↑ sure\n </div>\n <div className=\"pointer-events-none absolute bottom-1.5 left-1.5 text-[10px] uppercase tracking-wider text-zinc-400\">\n ↓ unsure\n </div>\n <div className=\"pointer-events-none absolute right-1.5 top-1.5 text-[10px] uppercase tracking-wider text-zinc-400\">\n {fmt(max)} →\n </div>\n <div className=\"pointer-events-none absolute bottom-1.5 right-1.5 text-[10px] uppercase tracking-wider text-zinc-400\">\n ← {fmt(min)}\n </div>\n </>\n )}\n\n {posted && (\n <Handle\n xPct={pxPct}\n yPct={pyPct}\n haloR={pHaloR}\n color={postedColor}\n dashed\n label=\"agent\"\n />\n )}\n <Handle\n xPct={xPct}\n yPct={yPct}\n haloR={haloR}\n color={color}\n label={fmt(value)}\n />\n </div>\n );\n}\n\nfunction Handle({\n xPct,\n yPct,\n haloR,\n color,\n dashed = false,\n label,\n}: {\n xPct: number;\n yPct: number;\n haloR: number;\n color: string;\n dashed?: boolean;\n label: string;\n}) {\n return (\n <>\n <div\n className=\"pointer-events-none absolute -translate-x-1/2 -translate-y-1/2 rounded-full\"\n style={{\n left: `${xPct}%`,\n top: `${yPct}%`,\n width: haloR * 2,\n height: haloR * 2,\n background: color + (dashed ? \"11\" : \"22\"),\n border: dashed ? `1px dashed ${color}` : \"none\",\n }}\n />\n <div\n className=\"pointer-events-none absolute -translate-x-1/2 -translate-y-1/2 rounded-full ring-2 ring-white dark:ring-zinc-900\"\n style={{\n left: `${xPct}%`,\n top: `${yPct}%`,\n width: 14,\n height: 14,\n background: color,\n opacity: dashed ? 0.6 : 1,\n }}\n />\n <div\n className=\"pointer-events-none absolute -translate-x-1/2 rounded px-1.5 py-0.5 font-mono text-[10px]\"\n style={{\n left: `${xPct}%`,\n top: `calc(${yPct}% + 14px)`,\n color,\n }}\n >\n {label}\n </div>\n </>\n );\n}\n\nfunction clamp(n: number, lo: number, hi: number) {\n return Math.max(lo, Math.min(hi, n));\n}\n\nfunction round(n: number, step: number, min: number) {\n if (step >= 1) return Math.round(n);\n return Math.round((n - min) / step) * step + min;\n}\n"]}
|