@particle-academy/react-fancy 5.20.0 → 5.22.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/dist/accordion-panel.cjs +8 -8
- package/dist/accordion-panel.js +2 -2
- package/dist/accordion.cjs +4 -4
- package/dist/accordion.js +2 -2
- package/dist/audio-viewer.cjs +3 -3
- package/dist/audio-viewer.js +2 -2
- package/dist/autocomplete.cjs +3 -3
- package/dist/autocomplete.js +2 -2
- package/dist/avatar.cjs +3 -3
- package/dist/avatar.js +2 -2
- package/dist/badge.cjs +3 -3
- package/dist/badge.js +2 -2
- package/dist/brand.cjs +4 -4
- package/dist/brand.js +2 -2
- package/dist/breadcrumbs.cjs +3 -3
- package/dist/breadcrumbs.js +2 -2
- package/dist/button.cjs +5 -5
- package/dist/button.js +3 -3
- package/dist/calendar.cjs +3 -3
- package/dist/calendar.js +2 -2
- package/dist/callout.cjs +3 -3
- package/dist/callout.js +2 -2
- package/dist/card.cjs +7 -7
- package/dist/card.js +2 -2
- package/dist/carousel.cjs +8 -8
- package/dist/carousel.js +2 -2
- package/dist/chart.cjs +3 -3
- package/dist/chart.js +2 -2
- package/dist/chat-drawer.cjs +4 -4
- package/dist/chat-drawer.js +3 -3
- 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-ZLCVKYHY.js → chunk-25ZOOUFG.js} +3 -3
- package/dist/{chunk-ZLCVKYHY.js.map → chunk-25ZOOUFG.js.map} +1 -1
- package/dist/{chunk-UCYAHLGM.js → chunk-2LBRS6Z4.js} +3 -3
- package/dist/{chunk-UCYAHLGM.js.map → chunk-2LBRS6Z4.js.map} +1 -1
- package/dist/{chunk-E4LFD44D.js → chunk-35EN5AYE.js} +3 -3
- package/dist/{chunk-E4LFD44D.js.map → chunk-35EN5AYE.js.map} +1 -1
- package/dist/{chunk-AOOBRPTE.cjs → chunk-3EIB7RPD.cjs} +8 -8
- package/dist/{chunk-AOOBRPTE.cjs.map → chunk-3EIB7RPD.cjs.map} +1 -1
- package/dist/{chunk-GKGL7F36.js → chunk-3FG5K7A7.js} +3 -3
- package/dist/{chunk-GKGL7F36.js.map → chunk-3FG5K7A7.js.map} +1 -1
- package/dist/{chunk-WNIP443K.js → chunk-3LM47BME.js} +4 -4
- package/dist/{chunk-WNIP443K.js.map → chunk-3LM47BME.js.map} +1 -1
- package/dist/{chunk-NH7NRRII.js → chunk-4K4ECIKK.js} +3 -3
- package/dist/{chunk-NH7NRRII.js.map → chunk-4K4ECIKK.js.map} +1 -1
- package/dist/{chunk-KC6QBKKB.cjs → chunk-524TOKU3.cjs} +8 -8
- package/dist/{chunk-KC6QBKKB.cjs.map → chunk-524TOKU3.cjs.map} +1 -1
- package/dist/{chunk-6OSHAP6L.cjs → chunk-5CXJ5Z4C.cjs} +6 -6
- package/dist/{chunk-6OSHAP6L.cjs.map → chunk-5CXJ5Z4C.cjs.map} +1 -1
- package/dist/{chunk-AY3JABE3.cjs → chunk-5DSMOURR.cjs} +4 -4
- package/dist/{chunk-AY3JABE3.cjs.map → chunk-5DSMOURR.cjs.map} +1 -1
- package/dist/{chunk-VQ4M25U3.cjs → chunk-5P3PISAX.cjs} +4 -4
- package/dist/{chunk-VQ4M25U3.cjs.map → chunk-5P3PISAX.cjs.map} +1 -1
- package/dist/{chunk-P7AJAN62.js → chunk-5RLP77KK.js} +3 -3
- package/dist/{chunk-P7AJAN62.js.map → chunk-5RLP77KK.js.map} +1 -1
- package/dist/{chunk-FCAV5IFW.js → chunk-6GWOB2Z4.js} +3 -3
- package/dist/{chunk-FCAV5IFW.js.map → chunk-6GWOB2Z4.js.map} +1 -1
- package/dist/{chunk-JCOBDDHF.js → chunk-6KXAFP2T.js} +3 -3
- package/dist/{chunk-JCOBDDHF.js.map → chunk-6KXAFP2T.js.map} +1 -1
- package/dist/{chunk-E7PHL3TD.cjs → chunk-6LOV75CN.cjs} +5 -5
- package/dist/{chunk-E7PHL3TD.cjs.map → chunk-6LOV75CN.cjs.map} +1 -1
- package/dist/{chunk-CEEEENPW.js → chunk-6PF5ENWM.js} +3 -3
- package/dist/{chunk-CEEEENPW.js.map → chunk-6PF5ENWM.js.map} +1 -1
- package/dist/{chunk-2PELJ4VA.cjs → chunk-6SO2ZX3J.cjs} +15 -15
- package/dist/{chunk-2PELJ4VA.cjs.map → chunk-6SO2ZX3J.cjs.map} +1 -1
- package/dist/{chunk-AVR5P4GA.cjs → chunk-7B3HK6TY.cjs} +11 -11
- package/dist/{chunk-AVR5P4GA.cjs.map → chunk-7B3HK6TY.cjs.map} +1 -1
- package/dist/{chunk-YHXE274U.js → chunk-7CN7IHES.js} +3 -3
- package/dist/{chunk-YHXE274U.js.map → chunk-7CN7IHES.js.map} +1 -1
- package/dist/{chunk-7NLKXBZ2.cjs → chunk-7EZBMGEE.cjs} +8 -8
- package/dist/{chunk-7NLKXBZ2.cjs.map → chunk-7EZBMGEE.cjs.map} +1 -1
- package/dist/{chunk-ZFVSEO5Z.cjs → chunk-7HMEDY24.cjs} +6 -6
- package/dist/{chunk-ZFVSEO5Z.cjs.map → chunk-7HMEDY24.cjs.map} +1 -1
- package/dist/{chunk-YXC7QHNT.cjs → chunk-7VLRHXLQ.cjs} +6 -6
- package/dist/{chunk-YXC7QHNT.cjs.map → chunk-7VLRHXLQ.cjs.map} +1 -1
- package/dist/{chunk-GIDW3SUE.cjs → chunk-7Y2AENZD.cjs} +6 -6
- package/dist/{chunk-GIDW3SUE.cjs.map → chunk-7Y2AENZD.cjs.map} +1 -1
- package/dist/{chunk-ANEX75DF.cjs → chunk-AASQ6L6X.cjs} +4 -4
- package/dist/{chunk-ANEX75DF.cjs.map → chunk-AASQ6L6X.cjs.map} +1 -1
- package/dist/{chunk-ZWOEKDNI.js → chunk-AT5OG5N4.js} +3 -3
- package/dist/{chunk-ZWOEKDNI.js.map → chunk-AT5OG5N4.js.map} +1 -1
- package/dist/{chunk-TVRCOKJQ.cjs → chunk-ATJSHM6J.cjs} +4 -4
- package/dist/{chunk-TVRCOKJQ.cjs.map → chunk-ATJSHM6J.cjs.map} +1 -1
- package/dist/{chunk-A22T6DKO.cjs → chunk-AVCDGSXV.cjs} +13 -13
- package/dist/{chunk-A22T6DKO.cjs.map → chunk-AVCDGSXV.cjs.map} +1 -1
- package/dist/{chunk-MDUSUJWY.cjs → chunk-AVU4JOYM.cjs} +4 -4
- package/dist/{chunk-MDUSUJWY.cjs.map → chunk-AVU4JOYM.cjs.map} +1 -1
- package/dist/{chunk-AR2IBCX7.cjs → chunk-BZP4LOO5.cjs} +53 -53
- package/dist/{chunk-AR2IBCX7.cjs.map → chunk-BZP4LOO5.cjs.map} +1 -1
- package/dist/{chunk-HAOYXGGJ.js → chunk-CCG2L5EH.js} +3 -3
- package/dist/{chunk-HAOYXGGJ.js.map → chunk-CCG2L5EH.js.map} +1 -1
- package/dist/{chunk-Y5V5GBN4.cjs → chunk-CJVNO5YM.cjs} +6 -6
- package/dist/{chunk-Y5V5GBN4.cjs.map → chunk-CJVNO5YM.cjs.map} +1 -1
- package/dist/{chunk-PVWPZYTR.js → chunk-CK6LRROH.js} +3 -3
- package/dist/{chunk-PVWPZYTR.js.map → chunk-CK6LRROH.js.map} +1 -1
- package/dist/{chunk-LNWO23PU.cjs → chunk-COH45MGW.cjs} +7 -7
- package/dist/{chunk-LNWO23PU.cjs.map → chunk-COH45MGW.cjs.map} +1 -1
- package/dist/{chunk-EVXDG2XN.js → chunk-CRR3AMJ4.js} +3 -3
- package/dist/{chunk-EVXDG2XN.js.map → chunk-CRR3AMJ4.js.map} +1 -1
- package/dist/{chunk-BWT2L6XP.js → chunk-D7G53WOZ.js} +6 -6
- package/dist/{chunk-BWT2L6XP.js.map → chunk-D7G53WOZ.js.map} +1 -1
- package/dist/{chunk-JYKZKSZJ.js → chunk-DIHH75KD.js} +5 -5
- package/dist/{chunk-JYKZKSZJ.js.map → chunk-DIHH75KD.js.map} +1 -1
- package/dist/{chunk-ZT36VWIA.js → chunk-DKKU3VVJ.js} +5 -5
- package/dist/{chunk-ZT36VWIA.js.map → chunk-DKKU3VVJ.js.map} +1 -1
- package/dist/{chunk-PITWDKKY.js → chunk-EWRP6KCY.js} +3 -3
- package/dist/{chunk-PITWDKKY.js.map → chunk-EWRP6KCY.js.map} +1 -1
- package/dist/{chunk-HTKDPFLJ.cjs → chunk-F2VJEXN2.cjs} +16 -16
- package/dist/{chunk-HTKDPFLJ.cjs.map → chunk-F2VJEXN2.cjs.map} +1 -1
- package/dist/{chunk-DV4IMAQW.js → chunk-FA4IG5RB.js} +3 -3
- package/dist/{chunk-DV4IMAQW.js.map → chunk-FA4IG5RB.js.map} +1 -1
- package/dist/{chunk-FVV76TRF.js → chunk-FBWUXSKH.js} +3 -3
- package/dist/{chunk-FVV76TRF.js.map → chunk-FBWUXSKH.js.map} +1 -1
- package/dist/{chunk-XMBOZ73D.js → chunk-FCSR2WVS.js} +3 -3
- package/dist/{chunk-XMBOZ73D.js.map → chunk-FCSR2WVS.js.map} +1 -1
- package/dist/{chunk-3DJGPNUI.js → chunk-FERMW3YE.js} +3 -3
- package/dist/{chunk-3DJGPNUI.js.map → chunk-FERMW3YE.js.map} +1 -1
- package/dist/{chunk-M24NCWBU.js → chunk-FFWAY7F5.js} +3 -3
- package/dist/{chunk-M24NCWBU.js.map → chunk-FFWAY7F5.js.map} +1 -1
- package/dist/{chunk-SYXLPCQP.cjs → chunk-FQSSVOVQ.cjs} +4 -4
- package/dist/{chunk-SYXLPCQP.cjs.map → chunk-FQSSVOVQ.cjs.map} +1 -1
- package/dist/chunk-FWCREAIT.js +121 -0
- package/dist/chunk-FWCREAIT.js.map +1 -0
- package/dist/{chunk-RNHIDZLE.cjs → chunk-G7227RTY.cjs} +7 -7
- package/dist/{chunk-RNHIDZLE.cjs.map → chunk-G7227RTY.cjs.map} +1 -1
- package/dist/{chunk-KUKYJZIU.cjs → chunk-GBGJWAXZ.cjs} +8 -8
- package/dist/{chunk-KUKYJZIU.cjs.map → chunk-GBGJWAXZ.cjs.map} +1 -1
- package/dist/{chunk-IE4CM2SN.js → chunk-GIIGXAT4.js} +5 -5
- package/dist/{chunk-IE4CM2SN.js.map → chunk-GIIGXAT4.js.map} +1 -1
- package/dist/{chunk-SKI33QNW.js → chunk-GKEWT3DW.js} +3 -3
- package/dist/{chunk-SKI33QNW.js.map → chunk-GKEWT3DW.js.map} +1 -1
- package/dist/{chunk-X5VZRFQD.cjs → chunk-H5OPZEVQ.cjs} +5 -5
- package/dist/{chunk-X5VZRFQD.cjs.map → chunk-H5OPZEVQ.cjs.map} +1 -1
- package/dist/{chunk-CS4GQXYY.js → chunk-H6F6ZWAG.js} +3 -3
- package/dist/{chunk-CS4GQXYY.js.map → chunk-H6F6ZWAG.js.map} +1 -1
- package/dist/{chunk-T6IXZZBQ.cjs → chunk-HE3JJXIL.cjs} +4 -4
- package/dist/{chunk-T6IXZZBQ.cjs.map → chunk-HE3JJXIL.cjs.map} +1 -1
- package/dist/{chunk-ARSQY4P7.cjs → chunk-HIN6PHSE.cjs} +7 -7
- package/dist/{chunk-ARSQY4P7.cjs.map → chunk-HIN6PHSE.cjs.map} +1 -1
- package/dist/{chunk-WT72KW5M.cjs → chunk-HIOMHITU.cjs} +19 -19
- package/dist/{chunk-WT72KW5M.cjs.map → chunk-HIOMHITU.cjs.map} +1 -1
- package/dist/{chunk-B4JLRS5E.js → chunk-HOP3XXPV.js} +3 -3
- package/dist/{chunk-B4JLRS5E.js.map → chunk-HOP3XXPV.js.map} +1 -1
- package/dist/chunk-HPNIEYSJ.cjs +131 -0
- package/dist/chunk-HPNIEYSJ.cjs.map +1 -0
- package/dist/{chunk-CQWPMRYS.js → chunk-HYNED2OA.js} +5 -5
- package/dist/{chunk-CQWPMRYS.js.map → chunk-HYNED2OA.js.map} +1 -1
- package/dist/{chunk-IF5LOWUL.js → chunk-I3RPL3GE.js} +3 -3
- package/dist/{chunk-IF5LOWUL.js.map → chunk-I3RPL3GE.js.map} +1 -1
- package/dist/{chunk-6Y2QO7YV.cjs → chunk-ICT477LK.cjs} +8 -8
- package/dist/{chunk-6Y2QO7YV.cjs.map → chunk-ICT477LK.cjs.map} +1 -1
- package/dist/{chunk-VBZZ4CMM.cjs → chunk-ISPCXIJZ.cjs} +5 -5
- package/dist/{chunk-VBZZ4CMM.cjs.map → chunk-ISPCXIJZ.cjs.map} +1 -1
- package/dist/{chunk-M7EEQPE7.js → chunk-IVRYSSM7.js} +3 -3
- package/dist/{chunk-M7EEQPE7.js.map → chunk-IVRYSSM7.js.map} +1 -1
- package/dist/{chunk-D4WM23Y4.js → chunk-IWXP2YUP.js} +3 -3
- package/dist/{chunk-D4WM23Y4.js.map → chunk-IWXP2YUP.js.map} +1 -1
- package/dist/{chunk-6GC5DMOK.cjs → chunk-JFOORUUD.cjs} +8 -8
- package/dist/{chunk-6GC5DMOK.cjs.map → chunk-JFOORUUD.cjs.map} +1 -1
- package/dist/{chunk-MZIU27UY.js → chunk-JICO4LTT.js} +3 -3
- package/dist/{chunk-MZIU27UY.js.map → chunk-JICO4LTT.js.map} +1 -1
- package/dist/{chunk-ZNTEM7F2.js → chunk-JJBOKZWV.js} +3 -3
- package/dist/{chunk-ZNTEM7F2.js.map → chunk-JJBOKZWV.js.map} +1 -1
- package/dist/{chunk-FO4GCX67.cjs → chunk-JM2H642B.cjs} +9 -9
- package/dist/{chunk-FO4GCX67.cjs.map → chunk-JM2H642B.cjs.map} +1 -1
- package/dist/{chunk-7ZDIQOFH.cjs → chunk-JV6RDIA6.cjs} +13 -13
- package/dist/{chunk-7ZDIQOFH.cjs.map → chunk-JV6RDIA6.cjs.map} +1 -1
- package/dist/{chunk-K7JGOQJG.js → chunk-KKWNKBKR.js} +3 -3
- package/dist/{chunk-K7JGOQJG.js.map → chunk-KKWNKBKR.js.map} +1 -1
- package/dist/{chunk-QWSTG5MF.js → chunk-KO2HLNBB.js} +7 -7
- package/dist/{chunk-QWSTG5MF.js.map → chunk-KO2HLNBB.js.map} +1 -1
- package/dist/{chunk-5QL7XT3N.js → chunk-KQQA7JBC.js} +4 -4
- package/dist/{chunk-5QL7XT3N.js.map → chunk-KQQA7JBC.js.map} +1 -1
- package/dist/{chunk-DWRMC2FN.cjs → chunk-LMPPAQKP.cjs} +7 -7
- package/dist/{chunk-DWRMC2FN.cjs.map → chunk-LMPPAQKP.cjs.map} +1 -1
- package/dist/{chunk-JU5W65N3.cjs → chunk-LNFMT2CE.cjs} +18 -18
- package/dist/{chunk-JU5W65N3.cjs.map → chunk-LNFMT2CE.cjs.map} +1 -1
- package/dist/{chunk-M2S5GCXY.cjs → chunk-LY7PZEF4.cjs} +11 -11
- package/dist/{chunk-M2S5GCXY.cjs.map → chunk-LY7PZEF4.cjs.map} +1 -1
- package/dist/{chunk-AKIUDPJU.js → chunk-LYHQ4VBR.js} +3 -3
- package/dist/{chunk-AKIUDPJU.js.map → chunk-LYHQ4VBR.js.map} +1 -1
- package/dist/{chunk-MKFWFZVX.js → chunk-M6AONUIX.js} +3 -3
- package/dist/{chunk-MKFWFZVX.js.map → chunk-M6AONUIX.js.map} +1 -1
- package/dist/{chunk-KKYP5R3G.cjs → chunk-MCCE5RDB.cjs} +12 -12
- package/dist/{chunk-KKYP5R3G.cjs.map → chunk-MCCE5RDB.cjs.map} +1 -1
- package/dist/{chunk-X36ZGYTF.js → chunk-MEUR7C6X.js} +5 -5
- package/dist/{chunk-X36ZGYTF.js.map → chunk-MEUR7C6X.js.map} +1 -1
- package/dist/{chunk-RM4QWJS3.js → chunk-MIUSTEIV.js} +3 -3
- package/dist/{chunk-RM4QWJS3.js.map → chunk-MIUSTEIV.js.map} +1 -1
- package/dist/chunk-MMW2JGKZ.js +29 -0
- package/dist/chunk-MMW2JGKZ.js.map +1 -0
- package/dist/{chunk-RID7CYGD.js → chunk-MRRKDRZU.js} +5 -5
- package/dist/{chunk-RID7CYGD.js.map → chunk-MRRKDRZU.js.map} +1 -1
- package/dist/{chunk-A3CNYKT3.js → chunk-MUCXXYDN.js} +3 -3
- package/dist/{chunk-A3CNYKT3.js.map → chunk-MUCXXYDN.js.map} +1 -1
- package/dist/{chunk-CZZH45GQ.cjs → chunk-N4VHOTMK.cjs} +9 -9
- package/dist/{chunk-CZZH45GQ.cjs.map → chunk-N4VHOTMK.cjs.map} +1 -1
- package/dist/{chunk-6FBFE66M.cjs → chunk-N6K2CTSU.cjs} +5 -5
- package/dist/{chunk-6FBFE66M.cjs.map → chunk-N6K2CTSU.cjs.map} +1 -1
- package/dist/{chunk-DJ3YM72H.cjs → chunk-ND5D7GJB.cjs} +4 -4
- package/dist/{chunk-DJ3YM72H.cjs.map → chunk-ND5D7GJB.cjs.map} +1 -1
- package/dist/{chunk-YCZN4FWI.js → chunk-NDUEPDNS.js} +3 -3
- package/dist/{chunk-YCZN4FWI.js.map → chunk-NDUEPDNS.js.map} +1 -1
- package/dist/{chunk-6FYMMQ3G.cjs → chunk-NHTSQRAF.cjs} +10 -10
- package/dist/{chunk-6FYMMQ3G.cjs.map → chunk-NHTSQRAF.cjs.map} +1 -1
- package/dist/{chunk-PPLR2DNC.cjs → chunk-NP7SU2DF.cjs} +5 -5
- package/dist/{chunk-PPLR2DNC.cjs.map → chunk-NP7SU2DF.cjs.map} +1 -1
- package/dist/{chunk-POZZY3D5.cjs → chunk-NR346SKH.cjs} +5 -5
- package/dist/{chunk-POZZY3D5.cjs.map → chunk-NR346SKH.cjs.map} +1 -1
- package/dist/{chunk-TECFGOV2.js → chunk-NTMHP7FS.js} +3 -3
- package/dist/{chunk-TECFGOV2.js.map → chunk-NTMHP7FS.js.map} +1 -1
- package/dist/{chunk-7XDKIZQE.js → chunk-NUPQJ5SJ.js} +3 -3
- package/dist/{chunk-7XDKIZQE.js.map → chunk-NUPQJ5SJ.js.map} +1 -1
- package/dist/{chunk-M645OITZ.js → chunk-NYDR2VSA.js} +3 -3
- package/dist/{chunk-M645OITZ.js.map → chunk-NYDR2VSA.js.map} +1 -1
- package/dist/{chunk-3SQ34IQC.cjs → chunk-NZFJ4XMJ.cjs} +10 -10
- package/dist/{chunk-3SQ34IQC.cjs.map → chunk-NZFJ4XMJ.cjs.map} +1 -1
- package/dist/{chunk-YT42J4VQ.js → chunk-O6E2WC3J.js} +3 -3
- package/dist/{chunk-YT42J4VQ.js.map → chunk-O6E2WC3J.js.map} +1 -1
- package/dist/{chunk-5LHG7HEY.cjs → chunk-O6GTY53I.cjs} +4 -4
- package/dist/{chunk-5LHG7HEY.cjs.map → chunk-O6GTY53I.cjs.map} +1 -1
- package/dist/{chunk-ESKVRRVA.js → chunk-OFHO5SXA.js} +3 -3
- package/dist/{chunk-ESKVRRVA.js.map → chunk-OFHO5SXA.js.map} +1 -1
- package/dist/{chunk-SCPHSBBU.cjs → chunk-OGEE23SP.cjs} +4 -4
- package/dist/{chunk-SCPHSBBU.cjs.map → chunk-OGEE23SP.cjs.map} +1 -1
- package/dist/{chunk-RR7BWUVP.cjs → chunk-OS2QC3NE.cjs} +6 -6
- package/dist/{chunk-RR7BWUVP.cjs.map → chunk-OS2QC3NE.cjs.map} +1 -1
- package/dist/{chunk-F6SCZCJE.js → chunk-P7F32HIH.js} +3 -3
- package/dist/{chunk-F6SCZCJE.js.map → chunk-P7F32HIH.js.map} +1 -1
- package/dist/{chunk-WXADO5TS.cjs → chunk-PAESRUUH.cjs} +10 -10
- package/dist/{chunk-WXADO5TS.cjs.map → chunk-PAESRUUH.cjs.map} +1 -1
- package/dist/{chunk-PH3WGR5P.cjs → chunk-PFEFKLUV.cjs} +8 -8
- package/dist/{chunk-PH3WGR5P.cjs.map → chunk-PFEFKLUV.cjs.map} +1 -1
- package/dist/{chunk-5HOQ2PHR.cjs → chunk-PV5WDIGM.cjs} +9 -9
- package/dist/{chunk-5HOQ2PHR.cjs.map → chunk-PV5WDIGM.cjs.map} +1 -1
- package/dist/{chunk-DDRHCFUE.js → chunk-PVQBXEV3.js} +6 -6
- package/dist/{chunk-DDRHCFUE.js.map → chunk-PVQBXEV3.js.map} +1 -1
- package/dist/{chunk-D7NAXQ2N.js → chunk-PWEZCMIY.js} +3 -3
- package/dist/{chunk-D7NAXQ2N.js.map → chunk-PWEZCMIY.js.map} +1 -1
- package/dist/{chunk-LYFUPTLG.cjs → chunk-PWLBHNOA.cjs} +14 -14
- package/dist/{chunk-LYFUPTLG.cjs.map → chunk-PWLBHNOA.cjs.map} +1 -1
- package/dist/{chunk-BPBI3WWQ.cjs → chunk-QAFAPHAF.cjs} +8 -8
- package/dist/{chunk-BPBI3WWQ.cjs.map → chunk-QAFAPHAF.cjs.map} +1 -1
- package/dist/{chunk-AC7M7JDO.cjs → chunk-QDVDBUJM.cjs} +6 -6
- package/dist/{chunk-AC7M7JDO.cjs.map → chunk-QDVDBUJM.cjs.map} +1 -1
- package/dist/{chunk-2ICXWLKS.js → chunk-QJKWBU3I.js} +3 -3
- package/dist/{chunk-2ICXWLKS.js.map → chunk-QJKWBU3I.js.map} +1 -1
- package/dist/{chunk-JXIBUIEY.cjs → chunk-QKFOJKVE.cjs} +4 -4
- package/dist/{chunk-JXIBUIEY.cjs.map → chunk-QKFOJKVE.cjs.map} +1 -1
- package/dist/{chunk-NNSNANNY.cjs → chunk-QOGKO6JH.cjs} +5 -5
- package/dist/{chunk-NNSNANNY.cjs.map → chunk-QOGKO6JH.cjs.map} +1 -1
- package/dist/{chunk-B3HVWXIQ.cjs → chunk-QSFTWIUH.cjs} +8 -8
- package/dist/{chunk-B3HVWXIQ.cjs.map → chunk-QSFTWIUH.cjs.map} +1 -1
- package/dist/{chunk-3MHVFEIP.cjs → chunk-QW66UHWO.cjs} +4 -4
- package/dist/{chunk-3MHVFEIP.cjs.map → chunk-QW66UHWO.cjs.map} +1 -1
- package/dist/{chunk-IGYIMS6J.js → chunk-RA2VOQ46.js} +3 -3
- package/dist/{chunk-IGYIMS6J.js.map → chunk-RA2VOQ46.js.map} +1 -1
- package/dist/{chunk-HG6XUJOT.js → chunk-RFLPFQFF.js} +3 -3
- package/dist/{chunk-HG6XUJOT.js.map → chunk-RFLPFQFF.js.map} +1 -1
- package/dist/{chunk-KICZTIZL.cjs → chunk-RKG2Q2HT.cjs} +7 -7
- package/dist/{chunk-KICZTIZL.cjs.map → chunk-RKG2Q2HT.cjs.map} +1 -1
- package/dist/{chunk-PRJSEZ5F.cjs → chunk-RN2EW7CK.cjs} +12 -12
- package/dist/{chunk-PRJSEZ5F.cjs.map → chunk-RN2EW7CK.cjs.map} +1 -1
- package/dist/{chunk-EERAEPQO.cjs → chunk-RPVCMW64.cjs} +12 -12
- package/dist/{chunk-EERAEPQO.cjs.map → chunk-RPVCMW64.cjs.map} +1 -1
- package/dist/{chunk-ATFXU6R6.js → chunk-RSLZL6VP.js} +3 -3
- package/dist/{chunk-ATFXU6R6.js.map → chunk-RSLZL6VP.js.map} +1 -1
- package/dist/{chunk-HNITJ2UR.js → chunk-SAF5642F.js} +4 -4
- package/dist/{chunk-HNITJ2UR.js.map → chunk-SAF5642F.js.map} +1 -1
- package/dist/{chunk-4UA45GB4.js → chunk-SG3L4322.js} +6 -6
- package/dist/{chunk-4UA45GB4.js.map → chunk-SG3L4322.js.map} +1 -1
- package/dist/{chunk-PG3ILQIW.js → chunk-SLJD25VV.js} +3 -3
- package/dist/{chunk-PG3ILQIW.js.map → chunk-SLJD25VV.js.map} +1 -1
- package/dist/{chunk-EQGY3QDJ.cjs → chunk-SO4NNG26.cjs} +7 -7
- package/dist/{chunk-EQGY3QDJ.cjs.map → chunk-SO4NNG26.cjs.map} +1 -1
- package/dist/{chunk-DZD2RJVD.js → chunk-SOYORSLZ.js} +3 -3
- package/dist/{chunk-DZD2RJVD.js.map → chunk-SOYORSLZ.js.map} +1 -1
- package/dist/{chunk-MGZE2QEM.cjs → chunk-SUCBR6L5.cjs} +6 -6
- package/dist/{chunk-MGZE2QEM.cjs.map → chunk-SUCBR6L5.cjs.map} +1 -1
- package/dist/{chunk-NLJGNPNN.js → chunk-SWBF2BXA.js} +3 -3
- package/dist/{chunk-NLJGNPNN.js.map → chunk-SWBF2BXA.js.map} +1 -1
- package/dist/{chunk-6H6OYLMJ.js → chunk-SX4CSO6C.js} +3 -3
- package/dist/{chunk-6H6OYLMJ.js.map → chunk-SX4CSO6C.js.map} +1 -1
- package/dist/{chunk-ORFHF6PT.cjs → chunk-T5OCRKPD.cjs} +6 -6
- package/dist/{chunk-ORFHF6PT.cjs.map → chunk-T5OCRKPD.cjs.map} +1 -1
- package/dist/{chunk-AGDW5ENV.js → chunk-TB35HNBE.js} +3 -3
- package/dist/{chunk-AGDW5ENV.js.map → chunk-TB35HNBE.js.map} +1 -1
- package/dist/{chunk-RES2GOQQ.js → chunk-TDDWWAM5.js} +3 -3
- package/dist/{chunk-RES2GOQQ.js.map → chunk-TDDWWAM5.js.map} +1 -1
- package/dist/{chunk-6L6LI2RL.cjs → chunk-TGNQ5Y6F.cjs} +4 -4
- package/dist/{chunk-6L6LI2RL.cjs.map → chunk-TGNQ5Y6F.cjs.map} +1 -1
- package/dist/{chunk-I462NM2A.cjs → chunk-TH7VP4CL.cjs} +5 -5
- package/dist/{chunk-I462NM2A.cjs.map → chunk-TH7VP4CL.cjs.map} +1 -1
- package/dist/{chunk-PYRMH34E.js → chunk-TJJ63UJV.js} +3 -3
- package/dist/{chunk-PYRMH34E.js.map → chunk-TJJ63UJV.js.map} +1 -1
- package/dist/{chunk-I25RP6AM.js → chunk-TQFQUNV3.js} +3 -3
- package/dist/{chunk-I25RP6AM.js.map → chunk-TQFQUNV3.js.map} +1 -1
- package/dist/{chunk-RMFLRBUC.cjs → chunk-TWSPVX6X.cjs} +8 -8
- package/dist/{chunk-RMFLRBUC.cjs.map → chunk-TWSPVX6X.cjs.map} +1 -1
- package/dist/{chunk-UPVWN72I.cjs → chunk-TXCAIL5X.cjs} +7 -7
- package/dist/{chunk-UPVWN72I.cjs.map → chunk-TXCAIL5X.cjs.map} +1 -1
- package/dist/{chunk-LZL2KD4P.cjs → chunk-TZHK3LEW.cjs} +9 -9
- package/dist/{chunk-LZL2KD4P.cjs.map → chunk-TZHK3LEW.cjs.map} +1 -1
- package/dist/{chunk-74ZN5CNE.js → chunk-UIJR26YW.js} +3 -3
- package/dist/{chunk-74ZN5CNE.js.map → chunk-UIJR26YW.js.map} +1 -1
- package/dist/{chunk-CFBK5RIZ.js → chunk-UKUNWGL5.js} +3 -3
- package/dist/{chunk-CFBK5RIZ.js.map → chunk-UKUNWGL5.js.map} +1 -1
- package/dist/{chunk-IGU5YXRV.cjs → chunk-UMJ3JMDT.cjs} +9 -9
- package/dist/{chunk-IGU5YXRV.cjs.map → chunk-UMJ3JMDT.cjs.map} +1 -1
- package/dist/{chunk-JHEM6IGT.cjs → chunk-V35A6B7A.cjs} +4 -4
- package/dist/{chunk-JHEM6IGT.cjs.map → chunk-V35A6B7A.cjs.map} +1 -1
- package/dist/{chunk-PRDWJ4AR.js → chunk-VFIVF5YO.js} +3 -3
- package/dist/{chunk-PRDWJ4AR.js.map → chunk-VFIVF5YO.js.map} +1 -1
- package/dist/{chunk-Y6DK4CGY.js → chunk-VGAOLXTK.js} +14 -14
- package/dist/{chunk-Y6DK4CGY.js.map → chunk-VGAOLXTK.js.map} +1 -1
- package/dist/{chunk-IJ4I55QQ.cjs → chunk-VGBZWDMM.cjs} +4 -4
- package/dist/{chunk-IJ4I55QQ.cjs.map → chunk-VGBZWDMM.cjs.map} +1 -1
- package/dist/{chunk-DBJWHDWP.js → chunk-VKMPVFQK.js} +3 -3
- package/dist/{chunk-DBJWHDWP.js.map → chunk-VKMPVFQK.js.map} +1 -1
- package/dist/{chunk-5OC6DUYT.js → chunk-VME5743O.js} +3 -3
- package/dist/{chunk-5OC6DUYT.js.map → chunk-VME5743O.js.map} +1 -1
- package/dist/{chunk-YVDAXYHP.js → chunk-VOGI7GX3.js} +3 -3
- package/dist/{chunk-YVDAXYHP.js.map → chunk-VOGI7GX3.js.map} +1 -1
- package/dist/{chunk-R55HE5C5.js → chunk-VVL5LMLW.js} +3 -3
- package/dist/{chunk-R55HE5C5.js.map → chunk-VVL5LMLW.js.map} +1 -1
- package/dist/{chunk-2CYRAKWI.cjs → chunk-VW6WUXFR.cjs} +11 -11
- package/dist/{chunk-2CYRAKWI.cjs.map → chunk-VW6WUXFR.cjs.map} +1 -1
- package/dist/{chunk-6RYZ2MOE.js → chunk-VYQI4R6S.js} +4 -4
- package/dist/{chunk-6RYZ2MOE.js.map → chunk-VYQI4R6S.js.map} +1 -1
- package/dist/{chunk-HBFVOHQC.cjs → chunk-WCWZADR2.cjs} +7 -7
- package/dist/{chunk-HBFVOHQC.cjs.map → chunk-WCWZADR2.cjs.map} +1 -1
- package/dist/{chunk-IXHZVFHX.cjs → chunk-WKAEAGMT.cjs} +4 -4
- package/dist/{chunk-IXHZVFHX.cjs.map → chunk-WKAEAGMT.cjs.map} +1 -1
- package/dist/{chunk-PBXYU4EV.cjs → chunk-WKNVZUWZ.cjs} +5 -5
- package/dist/{chunk-PBXYU4EV.cjs.map → chunk-WKNVZUWZ.cjs.map} +1 -1
- package/dist/{chunk-6BW5BQMN.cjs → chunk-XKDW6B7X.cjs} +4 -4
- package/dist/{chunk-6BW5BQMN.cjs.map → chunk-XKDW6B7X.cjs.map} +1 -1
- package/dist/{chunk-23CLGUMT.cjs → chunk-XLFGWNW4.cjs} +4 -4
- package/dist/{chunk-23CLGUMT.cjs.map → chunk-XLFGWNW4.cjs.map} +1 -1
- package/dist/{chunk-PJ4TQ6YO.js → chunk-XLVYW5LK.js} +5 -5
- package/dist/{chunk-PJ4TQ6YO.js.map → chunk-XLVYW5LK.js.map} +1 -1
- package/dist/{chunk-MPDLL4X3.cjs → chunk-XQNYFXBY.cjs} +8 -8
- package/dist/{chunk-MPDLL4X3.cjs.map → chunk-XQNYFXBY.cjs.map} +1 -1
- package/dist/{chunk-I2JXK25I.js → chunk-XXBW4EUO.js} +3 -3
- package/dist/{chunk-I2JXK25I.js.map → chunk-XXBW4EUO.js.map} +1 -1
- package/dist/{chunk-RA3P63XW.cjs → chunk-Y3T7WMT6.cjs} +4 -4
- package/dist/{chunk-RA3P63XW.cjs.map → chunk-Y3T7WMT6.cjs.map} +1 -1
- package/dist/{chunk-LPQVXTKV.js → chunk-Y4UPKJN5.js} +3 -3
- package/dist/{chunk-LPQVXTKV.js.map → chunk-Y4UPKJN5.js.map} +1 -1
- package/dist/{chunk-47TFRODY.cjs → chunk-YAJYIRQL.cjs} +4 -4
- package/dist/{chunk-47TFRODY.cjs.map → chunk-YAJYIRQL.cjs.map} +1 -1
- package/dist/{chunk-DTPGJNOI.js → chunk-YCV43A7D.js} +3 -3
- package/dist/{chunk-DTPGJNOI.js.map → chunk-YCV43A7D.js.map} +1 -1
- package/dist/{chunk-YT6N44Z3.js → chunk-YF2EHBTV.js} +3 -3
- package/dist/{chunk-YT6N44Z3.js.map → chunk-YF2EHBTV.js.map} +1 -1
- package/dist/{chunk-4CM2VMLR.js → chunk-YLDYGT5O.js} +3 -3
- package/dist/{chunk-4CM2VMLR.js.map → chunk-YLDYGT5O.js.map} +1 -1
- package/dist/{chunk-JIYP73OJ.js → chunk-YQJWD53X.js} +3 -3
- package/dist/{chunk-JIYP73OJ.js.map → chunk-YQJWD53X.js.map} +1 -1
- package/dist/{chunk-O4MKOSU2.js → chunk-YTMQ2K64.js} +3 -3
- package/dist/{chunk-O4MKOSU2.js.map → chunk-YTMQ2K64.js.map} +1 -1
- package/dist/{chunk-IF25CE6S.cjs → chunk-YTXBU6QC.cjs} +6 -6
- package/dist/{chunk-IF25CE6S.cjs.map → chunk-YTXBU6QC.cjs.map} +1 -1
- package/dist/{chunk-F6NEPU67.cjs → chunk-Z43BI7CQ.cjs} +10 -10
- package/dist/{chunk-F6NEPU67.cjs.map → chunk-Z43BI7CQ.cjs.map} +1 -1
- package/dist/{chunk-BEGDL2CD.js → chunk-ZI7JP3TN.js} +3 -3
- package/dist/{chunk-BEGDL2CD.js.map → chunk-ZI7JP3TN.js.map} +1 -1
- package/dist/{chunk-3F66SAE7.js → chunk-ZKFFHIEW.js} +3 -3
- package/dist/{chunk-3F66SAE7.js.map → chunk-ZKFFHIEW.js.map} +1 -1
- package/dist/{chunk-QFFC2DKK.js → chunk-ZLWCZV7R.js} +3 -3
- package/dist/{chunk-QFFC2DKK.js.map → chunk-ZLWCZV7R.js.map} +1 -1
- package/dist/{chunk-BWTFK2GV.cjs → chunk-ZMD3PIYF.cjs} +12 -12
- package/dist/{chunk-BWTFK2GV.cjs.map → chunk-ZMD3PIYF.cjs.map} +1 -1
- package/dist/{chunk-5I4PR2KV.cjs → chunk-ZPHHKIFV.cjs} +10 -10
- package/dist/{chunk-5I4PR2KV.cjs.map → chunk-ZPHHKIFV.cjs.map} +1 -1
- package/dist/{chunk-JPTWZ3RF.cjs → chunk-ZTC3EQFZ.cjs} +8 -8
- package/dist/{chunk-JPTWZ3RF.cjs.map → chunk-ZTC3EQFZ.cjs.map} +1 -1
- package/dist/chunk-ZU5Q77OT.cjs +31 -0
- package/dist/chunk-ZU5Q77OT.cjs.map +1 -0
- package/dist/{chunk-ORPYY2MO.cjs → chunk-ZVDW2VX5.cjs} +4 -4
- package/dist/{chunk-ORPYY2MO.cjs.map → chunk-ZVDW2VX5.cjs.map} +1 -1
- package/dist/{chunk-4DQ6HX27.cjs → chunk-ZVRVOKXH.cjs} +7 -7
- package/dist/{chunk-4DQ6HX27.cjs.map → chunk-ZVRVOKXH.cjs.map} +1 -1
- package/dist/code-view.cjs +3 -3
- package/dist/code-view.js +2 -2
- package/dist/color-picker.cjs +3 -3
- package/dist/color-picker.js +2 -2
- package/dist/command.cjs +4 -4
- package/dist/command.js +2 -2
- package/dist/composer.cjs +3 -3
- package/dist/composer.js +2 -2
- package/dist/container.cjs +3 -3
- package/dist/container.js +2 -2
- package/dist/content-renderer.cjs +5 -5
- package/dist/content-renderer.js +2 -2
- package/dist/context-menu.cjs +4 -4
- package/dist/context-menu.js +2 -2
- package/dist/date-picker.cjs +5 -5
- package/dist/date-picker.js +4 -4
- package/dist/drawer.cjs +4 -4
- package/dist/drawer.js +2 -2
- package/dist/dropdown.cjs +4 -4
- package/dist/dropdown.js +2 -2
- package/dist/editor.cjs +7 -7
- package/dist/editor.js +5 -5
- package/dist/emoji-select.cjs +3 -3
- package/dist/emoji-select.js +2 -2
- package/dist/emoji.cjs +3 -3
- package/dist/emoji.js +2 -2
- package/dist/eyebrow.cjs +3 -3
- package/dist/eyebrow.js +2 -2
- package/dist/faux-client.cjs +3 -3
- package/dist/faux-client.js +2 -2
- package/dist/field.cjs +3 -3
- package/dist/field.js +2 -2
- package/dist/file-browser.cjs +6 -6
- package/dist/file-browser.js +2 -2
- package/dist/file-upload.cjs +4 -4
- package/dist/file-upload.js +2 -2
- package/dist/grid.cjs +3 -3
- package/dist/grid.js +2 -2
- package/dist/heading.cjs +3 -3
- package/dist/heading.js +2 -2
- package/dist/icon.cjs +8 -8
- package/dist/icon.js +2 -2
- package/dist/image-viewer.cjs +3 -3
- package/dist/image-viewer.js +2 -2
- package/dist/index-list.cjs +3 -3
- package/dist/index-list.js +2 -2
- package/dist/index.cjs +251 -223
- package/dist/index.d.cts +79 -2
- package/dist/index.d.ts +79 -2
- package/dist/index.js +88 -88
- package/dist/input.cjs +6 -6
- package/dist/input.js +5 -5
- package/dist/inputs.cjs +26 -26
- package/dist/inputs.js +14 -14
- package/dist/json-editor.cjs +27 -27
- package/dist/json-editor.js +16 -16
- package/dist/kanban.cjs +4 -4
- package/dist/kanban.js +2 -2
- package/dist/kbd.cjs +3 -3
- package/dist/kbd.js +2 -2
- package/dist/magic-wand.cjs +10 -10
- package/dist/magic-wand.js +9 -9
- package/dist/marquee.cjs +3 -3
- package/dist/marquee.js +2 -2
- package/dist/media-viewer.cjs +7 -7
- package/dist/media-viewer.js +6 -6
- package/dist/menu.cjs +4 -4
- package/dist/menu.js +2 -2
- package/dist/mobile-menu.cjs +5 -5
- package/dist/mobile-menu.js +3 -3
- package/dist/modal.cjs +4 -4
- package/dist/modal.js +2 -2
- package/dist/mode.cjs +3 -3
- package/dist/mode.js +2 -2
- package/dist/multi-switch.cjs +5 -5
- package/dist/multi-switch.js +4 -4
- package/dist/navbar.cjs +4 -4
- package/dist/navbar.js +2 -2
- package/dist/otp-input.cjs +3 -3
- package/dist/otp-input.js +2 -2
- package/dist/pagination.cjs +3 -3
- package/dist/pagination.js +2 -2
- package/dist/pdf-viewer.cjs +3 -3
- package/dist/pdf-viewer.js +2 -2
- package/dist/pillbox.cjs +3 -3
- package/dist/pillbox.js +2 -2
- package/dist/popover.cjs +4 -4
- package/dist/popover.js +2 -2
- package/dist/profile.cjs +4 -4
- package/dist/profile.js +3 -3
- package/dist/progress.cjs +3 -3
- package/dist/progress.js +2 -2
- package/dist/prompt-input.cjs +6 -6
- package/dist/prompt-input.js +5 -5
- package/dist/pull-quote.cjs +3 -3
- package/dist/pull-quote.js +2 -2
- package/dist/radio-group.cjs +5 -5
- package/dist/radio-group.js +4 -4
- package/dist/reason-tag.cjs +6 -6
- package/dist/reason-tag.js +5 -5
- package/dist/section.cjs +3 -3
- package/dist/section.js +2 -2
- package/dist/select.cjs +6 -6
- package/dist/select.js +5 -5
- package/dist/separator.cjs +3 -3
- package/dist/separator.js +2 -2
- package/dist/sidebar.cjs +5 -5
- package/dist/sidebar.js +3 -3
- package/dist/skeleton.cjs +3 -3
- package/dist/skeleton.js +2 -2
- package/dist/slider.cjs +5 -5
- package/dist/slider.js +4 -4
- package/dist/stat-list.cjs +3 -3
- package/dist/stat-list.js +2 -2
- package/dist/stat.cjs +4 -4
- package/dist/stat.js +2 -2
- package/dist/sticky-note.cjs +3 -3
- package/dist/sticky-note.js +2 -2
- package/dist/switch.cjs +3 -3
- package/dist/switch.js +2 -2
- package/dist/table.cjs +12 -12
- package/dist/table.js +2 -2
- package/dist/tabs.cjs +4 -4
- package/dist/tabs.js +2 -2
- package/dist/text.cjs +3 -3
- package/dist/text.js +2 -2
- package/dist/textarea.cjs +6 -6
- package/dist/textarea.js +5 -5
- package/dist/time-grid.cjs +3 -3
- package/dist/time-grid.js +2 -2
- package/dist/time-picker.cjs +3 -3
- package/dist/time-picker.js +2 -2
- package/dist/timeline.cjs +5 -5
- package/dist/timeline.js +2 -2
- package/dist/toast.cjs +4 -4
- package/dist/toast.js +2 -2
- package/dist/tooltip.cjs +3 -3
- package/dist/tooltip.js +2 -2
- package/dist/tree-nav.cjs +4 -4
- package/dist/tree-nav.js +2 -2
- package/dist/video-viewer.cjs +3 -3
- package/dist/video-viewer.js +2 -2
- package/package.json +2 -3
- package/dist/chunk-3Z6ALUWP.cjs +0 -13
- package/dist/chunk-3Z6ALUWP.cjs.map +0 -1
- package/dist/chunk-DSUHZO6T.js +0 -11
- package/dist/chunk-DSUHZO6T.js.map +0 -1
- package/dist/chunk-G34OBTU3.cjs +0 -27
- package/dist/chunk-G34OBTU3.cjs.map +0 -1
- package/dist/chunk-RNPFSVFN.js +0 -24
- package/dist/chunk-RNPFSVFN.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chunkOUOEQZHY_cjs = require('./chunk-OUOEQZHY.cjs');
|
|
4
|
-
var
|
|
4
|
+
var chunkZU5Q77OT_cjs = require('./chunk-ZU5Q77OT.cjs');
|
|
5
5
|
var react = require('react');
|
|
6
6
|
var lucideReact = require('lucide-react');
|
|
7
7
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -133,7 +133,7 @@ function FileBrowserPathBar({
|
|
|
133
133
|
"div",
|
|
134
134
|
{
|
|
135
135
|
"data-react-fancy-file-browser-path": "",
|
|
136
|
-
className:
|
|
136
|
+
className: chunkZU5Q77OT_cjs.cn(
|
|
137
137
|
"flex items-center gap-1 border-b border-zinc-200 px-2 py-1.5 dark:border-zinc-700",
|
|
138
138
|
className
|
|
139
139
|
),
|
|
@@ -273,7 +273,7 @@ function FileBrowserNewFolder({ className }) {
|
|
|
273
273
|
"data-react-fancy-file-browser-new-folder": "",
|
|
274
274
|
onClick: () => setOpen(true),
|
|
275
275
|
title: `New folder in ${path}`,
|
|
276
|
-
className:
|
|
276
|
+
className: chunkZU5Q77OT_cjs.cn(
|
|
277
277
|
"flex shrink-0 items-center gap-1 rounded-md px-1.5 py-0.5 text-xs text-zinc-500 transition-colors",
|
|
278
278
|
"hover:bg-zinc-100 hover:text-zinc-700 dark:hover:bg-zinc-800 dark:hover:text-zinc-300",
|
|
279
279
|
className
|
|
@@ -290,7 +290,7 @@ function FileBrowserNewFolder({ className }) {
|
|
|
290
290
|
"div",
|
|
291
291
|
{
|
|
292
292
|
"data-react-fancy-file-browser-new-folder-form": "",
|
|
293
|
-
className:
|
|
293
|
+
className: chunkZU5Q77OT_cjs.cn("flex shrink-0 flex-col gap-0.5", className),
|
|
294
294
|
children: [
|
|
295
295
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", children: [
|
|
296
296
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.FolderPlus, { size: 13, "aria-hidden": "true", className: "shrink-0 text-zinc-400" }),
|
|
@@ -319,7 +319,7 @@ function FileBrowserNewFolder({ className }) {
|
|
|
319
319
|
close();
|
|
320
320
|
}
|
|
321
321
|
},
|
|
322
|
-
className:
|
|
322
|
+
className: chunkZU5Q77OT_cjs.cn(
|
|
323
323
|
"w-32 min-w-0 rounded-md border px-1.5 py-0.5 text-xs outline-none",
|
|
324
324
|
"bg-transparent text-zinc-700 placeholder:text-zinc-400 dark:text-zinc-300",
|
|
325
325
|
shown ? "border-red-400 dark:border-red-500" : "border-zinc-200 dark:border-zinc-700"
|
|
@@ -373,7 +373,7 @@ function FileBrowserToolbar({ filterPlaceholder = "Filter", className }) {
|
|
|
373
373
|
"div",
|
|
374
374
|
{
|
|
375
375
|
"data-react-fancy-file-browser-toolbar": "",
|
|
376
|
-
className:
|
|
376
|
+
className: chunkZU5Q77OT_cjs.cn(
|
|
377
377
|
"flex items-center gap-2 border-b border-zinc-200 px-2 py-1.5 dark:border-zinc-700",
|
|
378
378
|
className
|
|
379
379
|
),
|
|
@@ -428,7 +428,7 @@ function FileBrowserToolbar({ filterPlaceholder = "Filter", className }) {
|
|
|
428
428
|
onClick: () => setSort(
|
|
429
429
|
active ? { by: field, direction: sort.direction === "asc" ? "desc" : "asc" } : { by: field, direction: "asc" }
|
|
430
430
|
),
|
|
431
|
-
className:
|
|
431
|
+
className: chunkZU5Q77OT_cjs.cn(
|
|
432
432
|
"flex items-center gap-0.5 rounded-md px-1.5 py-0.5 text-xs transition-colors",
|
|
433
433
|
active ? "bg-zinc-100 font-medium text-zinc-900 dark:bg-zinc-800 dark:text-white" : "text-zinc-500 hover:text-zinc-700 dark:text-zinc-400 dark:hover:text-zinc-300"
|
|
434
434
|
),
|
|
@@ -595,7 +595,7 @@ function FileBrowserNode({ entry, depth }) {
|
|
|
595
595
|
"data-react-fancy-file-browser-row": "",
|
|
596
596
|
onClick: handleClick,
|
|
597
597
|
onDoubleClick: handleDoubleClick,
|
|
598
|
-
className:
|
|
598
|
+
className: chunkZU5Q77OT_cjs.cn(
|
|
599
599
|
"flex w-full cursor-pointer items-center gap-1 rounded-md py-0.5 pr-2 text-left text-[13px] transition-colors select-none",
|
|
600
600
|
selected ? "bg-blue-500/15 text-blue-600 dark:text-blue-400" : "text-zinc-700 hover:bg-zinc-100 dark:text-zinc-300 dark:hover:bg-zinc-800",
|
|
601
601
|
entry.disabled && "pointer-events-none opacity-40",
|
|
@@ -615,7 +615,7 @@ function FileBrowserNode({ entry, depth }) {
|
|
|
615
615
|
lucideReact.ChevronRight,
|
|
616
616
|
{
|
|
617
617
|
size: 14,
|
|
618
|
-
className:
|
|
618
|
+
className: chunkZU5Q77OT_cjs.cn("transition-transform duration-150", expanded && "rotate-90")
|
|
619
619
|
}
|
|
620
620
|
)
|
|
621
621
|
}
|
|
@@ -741,7 +741,7 @@ function FileBrowserTree({ ariaLabel = "Files", className }) {
|
|
|
741
741
|
"aria-label": ariaLabel,
|
|
742
742
|
"aria-multiselectable": multiple || void 0,
|
|
743
743
|
"data-react-fancy-file-browser-tree": "",
|
|
744
|
-
className:
|
|
744
|
+
className: chunkZU5Q77OT_cjs.cn("min-h-0 flex-1 overflow-auto p-1", className),
|
|
745
745
|
onKeyDown: handleKeyDown,
|
|
746
746
|
children: [
|
|
747
747
|
rootEntries === void 0 && hasProvider && (rootStatus === "loading" || rootStatus === "idle") && /* @__PURE__ */ jsxRuntime.jsx(FileBrowserStatusRow, { depth: 0, kind: "loading" }),
|
|
@@ -1060,7 +1060,7 @@ function FileBrowserRoot({
|
|
|
1060
1060
|
"div",
|
|
1061
1061
|
{
|
|
1062
1062
|
"data-react-fancy-file-browser": "",
|
|
1063
|
-
className:
|
|
1063
|
+
className: chunkZU5Q77OT_cjs.cn(
|
|
1064
1064
|
"flex flex-col overflow-hidden rounded-lg border border-zinc-200 bg-white text-sm dark:border-zinc-700 dark:bg-zinc-900",
|
|
1065
1065
|
className
|
|
1066
1066
|
),
|
|
@@ -1084,5 +1084,5 @@ exports.FileBrowser = FileBrowser;
|
|
|
1084
1084
|
exports.FileBrowserNewFolder = FileBrowserNewFolder;
|
|
1085
1085
|
exports.useFileBrowser = useFileBrowser;
|
|
1086
1086
|
exports.validateFolderName = validateFolderName;
|
|
1087
|
-
//# sourceMappingURL=chunk-
|
|
1088
|
-
//# sourceMappingURL=chunk-
|
|
1087
|
+
//# sourceMappingURL=chunk-JV6RDIA6.cjs.map
|
|
1088
|
+
//# sourceMappingURL=chunk-JV6RDIA6.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/FileBrowser/FileBrowser.context.ts","../src/components/FileBrowser/FileBrowser.utils.ts","../src/components/FileBrowser/FileBrowserPathBar.tsx","../src/components/FileBrowser/FileBrowserNewFolder.tsx","../src/components/FileBrowser/FileBrowserToolbar.tsx","../src/components/FileBrowser/FileBrowserNode.tsx","../src/components/FileBrowser/FileBrowserTree.tsx","../src/components/FileBrowser/FileBrowser.tsx"],"names":["createContext","useContext","useState","jsxs","cn","jsx","Fragment","ChevronRight","Pencil","useRef","useEffect","FolderPlus","Search","X","ArrowUp","ArrowDown","CircleAlert","RotateCw","Loader2","useControllableState","useMemo","useCallback"],"mappings":"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","file":"chunk-7ZDIQOFH.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { FileBrowserContextValue } from \"./FileBrowser.types\";\n\nexport const FileBrowserContext = createContext<FileBrowserContextValue | null>(null);\n\nexport function useFileBrowser(): FileBrowserContextValue {\n const ctx = useContext(FileBrowserContext);\n if (!ctx) {\n throw new Error(\"useFileBrowser must be used within a <FileBrowser> component\");\n }\n return ctx;\n}\n","import type { FileEntry, FileSort } from \"./FileBrowser.types\";\n\n/**\n * Normalize free-typed path input: forward slashes, collapsed separators,\n * resolved `.` / `..` segments, no trailing slash. Absolute paths stay\n * absolute; relative paths stay relative (entry paths are identity and are\n * never rewritten — this is only for the editable path input).\n */\nexport function normalizePath(input: string): string {\n const raw = input.trim().replace(/\\\\/g, \"/\");\n if (raw === \"\") return \"/\";\n const absolute = raw.startsWith(\"/\");\n const out: string[] = [];\n for (const segment of raw.split(\"/\")) {\n if (segment === \"\" || segment === \".\") continue;\n if (segment === \"..\") {\n out.pop();\n continue;\n }\n out.push(segment);\n }\n if (out.length === 0) return \"/\";\n return (absolute ? \"/\" : \"\") + out.join(\"/\");\n}\n\n/** Parent of a path. Paths without a separator group under `\"/\"`. */\nexport function parentPath(path: string): string {\n const i = path.lastIndexOf(\"/\");\n if (i === -1) return \"/\";\n if (i === 0) return \"/\";\n return path.slice(0, i);\n}\n\nexport interface PathSegment {\n label: string;\n path: string;\n}\n\n/** Cumulative breadcrumb segments for a path (root anchor excluded). */\nexport function pathSegments(path: string): PathSegment[] {\n const absolute = path.startsWith(\"/\");\n const parts = path.split(\"/\").filter(Boolean);\n const segments: PathSegment[] = [];\n let acc = \"\";\n parts.forEach((part, i) => {\n acc = i === 0 && !absolute ? part : `${acc}/${part}`;\n segments.push({ label: part, path: acc });\n });\n return segments;\n}\n\n/**\n * Deterministic, numeric-aware name comparison. The locale is pinned to \"en\"\n * so server and client renders order identically (SSR safety).\n */\nfunction compareNames(a: string, b: string): number {\n const cmp = a.localeCompare(b, \"en\", { numeric: true, sensitivity: \"base\" });\n if (cmp !== 0) return cmp;\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\n/** Dirs-first, then the active sort field, with a stable ascending name tie-break. */\nexport function compareFileEntries(a: FileEntry, b: FileEntry, sort: FileSort): number {\n if (a.kind !== b.kind) return a.kind === \"dir\" ? -1 : 1;\n const direction = sort.direction === \"desc\" ? -1 : 1;\n let cmp: number;\n switch (sort.by) {\n case \"size\":\n cmp = (a.size ?? -1) - (b.size ?? -1);\n break;\n case \"mtime\": {\n const am = a.mtime ?? \"\";\n const bm = b.mtime ?? \"\";\n cmp = am < bm ? -1 : am > bm ? 1 : 0;\n break;\n }\n default:\n cmp = compareNames(a.name, b.name);\n }\n if (cmp !== 0) return direction * cmp;\n return compareNames(a.name, b.name);\n}\n\n/**\n * Whether a dir shows an expand affordance: known-empty dirs never do\n * (`hasChildren: false`, or a loaded/snapshot listing of zero entries);\n * unknown-depth dirs only do when a provider can load them.\n */\nexport function isEntryExpandable(\n entry: FileEntry,\n children: FileEntry[] | undefined,\n hasProvider: boolean,\n): boolean {\n if (entry.kind !== \"dir\" || entry.hasChildren === false) return false;\n if (children !== undefined) return children.length > 0;\n return hasProvider;\n}\n\n/**\n * Client-side name filter over loaded nodes only: an entry matches when its\n * name contains the query, or (for dirs) when any already-loaded descendant\n * matches. Never triggers loads.\n */\nexport function entryMatchesFilter(\n entry: FileEntry,\n query: string,\n entriesFor: (path: string) => FileEntry[] | undefined,\n visited: Set<string> = new Set(),\n): boolean {\n if (entry.name.toLowerCase().includes(query)) return true;\n if (entry.kind !== \"dir\" || visited.has(entry.path)) return false;\n visited.add(entry.path);\n const children = entriesFor(entry.path);\n return children?.some((child) => entryMatchesFilter(child, query, entriesFor, visited)) ?? false;\n}\n\n/** Compact, deterministic byte formatting (\"1.4 KB\", \"12 MB\"). */\nexport function formatFileSize(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return \"\";\n if (bytes < 1024) return `${bytes} B`;\n const units = [\"KB\", \"MB\", \"GB\", \"TB\"];\n let value = bytes;\n let unit = -1;\n do {\n value /= 1024;\n unit++;\n } while (value >= 1024 && unit < units.length - 1);\n const rounded = value >= 100 ? Math.round(value) : Math.round(value * 10) / 10;\n return `${rounded} ${units[unit]}`;\n}\n\n/**\n * Why a proposed folder name cannot be used, or `null` if it can.\n *\n * Only checks what the BROWSER can know: that the name is a name rather than a\n * path, and that nothing in this directory already answers to it. Case\n * sensitivity, reserved device names and length limits depend on a filesystem\n * this component cannot see, so they stay the host's to enforce — and the host\n * rejecting a create is a supported outcome, surfaced on the form.\n *\n * A collision counts against FILES too. `mkdir` fails the same way either way,\n * and \"there is already an index.ts here\" is the useful message.\n */\nexport function validateFolderName(\n raw: string,\n siblings: ReadonlyArray<{ name: string }>,\n): string | null {\n const name = raw.trim();\n\n if (name === \"\") return \"Enter a name.\";\n // `/` and `\\` make it a path, not a name; `.`/`..` are traversal. Forwarding\n // either would make the host decide what an escape attempt means.\n if (name.includes(\"/\") || name.includes(\"\\\\\")) return \"A name cannot contain / or \\.\";\n if (name === \".\" || name === \"..\") return \"That name is reserved.\";\n\n if (siblings.some((entry) => entry.name === name)) {\n return `“${name}” already exists here.`;\n }\n\n return null;\n}\n","import { Fragment, useState } from \"react\";\nimport { ChevronRight, Pencil } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useFileBrowser } from \"./FileBrowser.context\";\nimport { normalizePath, pathSegments } from \"./FileBrowser.utils\";\nimport type { FileBrowserPathBarProps } from \"./FileBrowser.types\";\n\n// Segment styling mirrors Breadcrumbs.Item (the Breadcrumbs component itself\n// is href-only and collapses to a dropdown on mobile, so the path bar renders\n// its own always-visible, click-to-navigate trail).\nconst SEGMENT_CLASS =\n \"shrink-0 rounded text-[13px] text-zinc-500 transition-colors hover:text-zinc-700 dark:text-zinc-400 dark:hover:text-zinc-300\";\nconst ACTIVE_SEGMENT_CLASS = \"shrink-0 truncate text-[13px] font-medium text-zinc-900 dark:text-white\";\n\n/**\n * Breadcrumb trail over the current directory plus an editable path input —\n * type a POSIX-style path and press Enter to navigate (lazy-loading it in\n * provider mode). Escape or blur cancels the edit.\n */\nexport function FileBrowserPathBar({\n editable = true,\n placeholder = \"/path/to/folder\",\n className,\n}: FileBrowserPathBarProps) {\n const { path, navigate } = useFileBrowser();\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState(\"\");\n\n const startEdit = () => {\n setDraft(path);\n setEditing(true);\n };\n\n const commit = () => {\n navigate(normalizePath(draft));\n setEditing(false);\n };\n\n const segments = pathSegments(path);\n const atRoot = segments.length === 0;\n\n return (\n <div\n data-react-fancy-file-browser-path=\"\"\n className={cn(\n \"flex items-center gap-1 border-b border-zinc-200 px-2 py-1.5 dark:border-zinc-700\",\n className,\n )}\n >\n {editing ? (\n <input\n data-react-fancy-file-browser-path-input=\"\"\n type=\"text\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commit();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setEditing(false);\n }\n }}\n onBlur={() => setEditing(false)}\n autoFocus\n spellCheck={false}\n placeholder={placeholder}\n aria-label=\"Path\"\n className=\"min-w-0 flex-1 rounded-md border border-zinc-300 bg-transparent px-2 py-0.5 font-mono text-xs text-zinc-700 outline-none placeholder:text-zinc-400 focus:border-blue-400 dark:border-zinc-600 dark:text-zinc-300\"\n />\n ) : (\n <nav\n aria-label=\"Path\"\n onDoubleClick={editable ? startEdit : undefined}\n className=\"flex min-w-0 flex-1 items-center gap-1 overflow-x-auto\"\n >\n {atRoot ? (\n <span data-react-fancy-file-browser-path-segment=\"\" aria-current=\"location\" className={ACTIVE_SEGMENT_CLASS}>\n /\n </span>\n ) : (\n <button\n type=\"button\"\n data-react-fancy-file-browser-path-segment=\"\"\n onClick={() => navigate(\"/\")}\n className={SEGMENT_CLASS}\n >\n /\n </button>\n )}\n {segments.map((segment, i) => {\n const last = i === segments.length - 1;\n return (\n <Fragment key={segment.path}>\n {i > 0 && (\n <ChevronRight size={12} aria-hidden=\"true\" className=\"shrink-0 text-zinc-400\" />\n )}\n {last ? (\n <span\n data-react-fancy-file-browser-path-segment=\"\"\n aria-current=\"location\"\n className={ACTIVE_SEGMENT_CLASS}\n >\n {segment.label}\n </span>\n ) : (\n <button\n type=\"button\"\n data-react-fancy-file-browser-path-segment=\"\"\n onClick={() => navigate(segment.path)}\n className={SEGMENT_CLASS}\n >\n {segment.label}\n </button>\n )}\n </Fragment>\n );\n })}\n </nav>\n )}\n {editable && !editing && (\n <button\n type=\"button\"\n aria-label=\"Edit path\"\n onClick={startEdit}\n className=\"shrink-0 rounded-md 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 >\n <Pencil size={13} />\n </button>\n )}\n </div>\n );\n}\n\nFileBrowserPathBar.displayName = \"FileBrowserPathBar\";\n","import { useEffect, useRef, useState } from \"react\";\nimport { FolderPlus } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useFileBrowser } from \"./FileBrowser.context\";\nimport { validateFolderName } from \"./FileBrowser.utils\";\n\n/**\n * The \"New folder\" affordance — rendered only when the host opted in by\n * supplying `onCreateFolder`.\n *\n * ## Why an inline input and not `window.prompt`\n *\n * A prompt blocks the event loop, cannot be styled or themed, is unusable on\n * mobile, and — the one that matters for this suite — cannot be driven by an\n * agent. The Human+ contract asks that every interactive element carry a stable\n * handle an agent can target; a native dialog has none.\n *\n * ## Why validation lives here\n *\n * The browser already knows what is in the current directory. The host would\n * have to round-trip to find out, so a duplicate name becomes a failed write\n * and an error toast instead of a message before anything is attempted. Name\n * rules that are about PATHS rather than policy — separators, `.`, `..` — are\n * checked here too: those are not names, and forwarding them makes the host\n * decide what a traversal attempt means.\n *\n * Anything else is the host's call. This does not guess at case-sensitivity,\n * reserved Windows device names, or length limits, because the answer depends\n * on a filesystem the browser cannot see.\n */\nexport function FileBrowserNewFolder({ className }: { className?: string }) {\n const { path, entriesFor, onCreateFolder, loadPath, hasProvider } = useFileBrowser();\n\n const [open, setOpen] = useState(false);\n const [name, setName] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (open) inputRef.current?.focus();\n }, [open]);\n\n // Navigating away mid-name would otherwise create the folder in a directory\n // the person is no longer looking at.\n useEffect(() => {\n setOpen(false);\n setName(\"\");\n setError(null);\n }, [path]);\n\n if (!onCreateFolder) return null;\n\n const siblings = entriesFor(path) ?? [];\n const problem = validateFolderName(name, siblings);\n const canSubmit = !busy && problem === null;\n\n const close = () => {\n setOpen(false);\n setName(\"\");\n setError(null);\n };\n\n const submit = async () => {\n if (busy) return;\n const trimmed = name.trim();\n const invalid = validateFolderName(name, siblings);\n if (invalid) {\n setError(invalid);\n return;\n }\n\n setBusy(true);\n setError(null);\n try {\n await onCreateFolder({ parentPath: path, name: trimmed });\n // Only on success. Reloading after a failure would hide the failure\n // behind an unchanged listing, and closing would claim it worked.\n if (hasProvider) loadPath(path, { reload: true });\n setOpen(false);\n setName(\"\");\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setBusy(false);\n }\n };\n\n if (!open) {\n return (\n <button\n type=\"button\"\n data-react-fancy-file-browser-new-folder=\"\"\n onClick={() => setOpen(true)}\n title={`New folder in ${path}`}\n className={cn(\n \"flex shrink-0 items-center gap-1 rounded-md px-1.5 py-0.5 text-xs text-zinc-500 transition-colors\",\n \"hover:bg-zinc-100 hover:text-zinc-700 dark:hover:bg-zinc-800 dark:hover:text-zinc-300\",\n className,\n )}\n >\n <FolderPlus size={13} aria-hidden=\"true\" />\n New folder\n </button>\n );\n }\n\n // Show the reason as soon as there is a name to judge — but not for an empty\n // field, which is \"not typed yet\" rather than wrong.\n //\n // This pairs with the disabled submit deliberately. A disabled button and no\n // explanation is the worst combination: the person has typed something\n // reasonable, the control is dead, and nothing says the folder already\n // exists. Either the button explains on click or the message is already\n // there; this takes the second, so the answer arrives before they reach for\n // the button.\n const shown = error ?? (name.trim() !== \"\" ? problem : null);\n\n return (\n <div\n data-react-fancy-file-browser-new-folder-form=\"\"\n className={cn(\"flex shrink-0 flex-col gap-0.5\", className)}\n >\n <div className=\"flex items-center gap-1\">\n <FolderPlus size={13} aria-hidden=\"true\" className=\"shrink-0 text-zinc-400\" />\n <input\n ref={inputRef}\n type=\"text\"\n data-react-fancy-file-browser-new-folder-input=\"\"\n value={name}\n disabled={busy}\n aria-label=\"New folder name\"\n aria-invalid={shown ? true : undefined}\n spellCheck={false}\n placeholder=\"Folder name\"\n onChange={(e) => {\n setName(e.target.value);\n if (error) setError(null);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n void submit();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n close();\n }\n }}\n className={cn(\n \"w-32 min-w-0 rounded-md border px-1.5 py-0.5 text-xs outline-none\",\n \"bg-transparent text-zinc-700 placeholder:text-zinc-400 dark:text-zinc-300\",\n shown ? \"border-red-400 dark:border-red-500\" : \"border-zinc-200 dark:border-zinc-700\",\n )}\n />\n <button\n type=\"button\"\n data-react-fancy-file-browser-new-folder-submit=\"\"\n disabled={!canSubmit}\n onClick={() => void submit()}\n className=\"rounded-md px-1.5 py-0.5 text-xs font-medium text-violet-600 transition-colors hover:bg-violet-50 disabled:cursor-not-allowed disabled:opacity-40 dark:text-violet-400 dark:hover:bg-violet-500/10\"\n >\n {busy ? \"Creating…\" : \"Create\"}\n </button>\n <button\n type=\"button\"\n data-react-fancy-file-browser-new-folder-cancel=\"\"\n onClick={close}\n className=\"rounded-md px-1.5 py-0.5 text-xs text-zinc-500 transition-colors hover:text-zinc-700 dark:hover:text-zinc-300\"\n >\n Cancel\n </button>\n </div>\n {shown && (\n <p\n data-react-fancy-file-browser-new-folder-error=\"\"\n role=\"alert\"\n className=\"pl-4 text-[11px] text-red-600 dark:text-red-400\"\n >\n {shown}\n </p>\n )}\n </div>\n );\n}\n\nFileBrowserNewFolder.displayName = \"FileBrowserNewFolder\";\n","import { ArrowDown, ArrowUp, Search, X } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useFileBrowser } from \"./FileBrowser.context\";\nimport { FileBrowserNewFolder } from \"./FileBrowserNewFolder\";\nimport type { FileBrowserToolbarProps, FileSortField } from \"./FileBrowser.types\";\n\nconst SORT_FIELDS: { field: FileSortField; label: string }[] = [\n { field: \"name\", label: \"Name\" },\n { field: \"size\", label: \"Size\" },\n { field: \"mtime\", label: \"Modified\" },\n];\n\n/**\n * Toolbar: client-side name filter (over loaded nodes only — never triggers\n * loads) plus a dirs-first sort control. Clicking the active sort field flips\n * its direction.\n */\nexport function FileBrowserToolbar({ filterPlaceholder = \"Filter\", className }: FileBrowserToolbarProps) {\n const { filter, setFilter, sort, setSort } = useFileBrowser();\n\n return (\n <div\n data-react-fancy-file-browser-toolbar=\"\"\n className={cn(\n \"flex items-center gap-2 border-b border-zinc-200 px-2 py-1.5 dark:border-zinc-700\",\n className,\n )}\n >\n <div\n data-react-fancy-file-browser-filter=\"\"\n className=\"flex min-w-0 flex-1 items-center gap-1.5 rounded-md border border-zinc-200 px-2 dark:border-zinc-700\"\n >\n <Search size={13} aria-hidden=\"true\" className=\"shrink-0 text-zinc-400\" />\n <input\n type=\"text\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n placeholder={filterPlaceholder}\n aria-label=\"Filter by name\"\n spellCheck={false}\n className=\"min-w-0 flex-1 bg-transparent py-1 text-xs text-zinc-700 outline-none placeholder:text-zinc-400 dark:text-zinc-300\"\n />\n {filter !== \"\" && (\n <button\n type=\"button\"\n aria-label=\"Clear filter\"\n onClick={() => setFilter(\"\")}\n className=\"shrink-0 text-zinc-400 transition-colors hover:text-zinc-600 dark:hover:text-zinc-300\"\n >\n <X size={12} />\n </button>\n )}\n </div>\n <div\n data-react-fancy-file-browser-sort=\"\"\n role=\"group\"\n aria-label=\"Sort\"\n className=\"flex shrink-0 items-center gap-0.5\"\n >\n {SORT_FIELDS.map(({ field, label }) => {\n const active = sort.by === field;\n return (\n <button\n key={field}\n type=\"button\"\n data-sort-field={field}\n aria-pressed={active}\n onClick={() =>\n setSort(\n active\n ? { by: field, direction: sort.direction === \"asc\" ? \"desc\" : \"asc\" }\n : { by: field, direction: \"asc\" },\n )\n }\n className={cn(\n \"flex items-center gap-0.5 rounded-md px-1.5 py-0.5 text-xs transition-colors\",\n active\n ? \"bg-zinc-100 font-medium text-zinc-900 dark:bg-zinc-800 dark:text-white\"\n : \"text-zinc-500 hover:text-zinc-700 dark:text-zinc-400 dark:hover:text-zinc-300\",\n )}\n >\n {label}\n {active &&\n (sort.direction === \"asc\" ? (\n <ArrowUp size={11} aria-hidden=\"true\" />\n ) : (\n <ArrowDown size={11} aria-hidden=\"true\" />\n ))}\n </button>\n );\n })}\n </div>\n <FileBrowserNewFolder />\n </div>\n );\n}\n\nFileBrowserToolbar.displayName = \"FileBrowserToolbar\";\n","import { ChevronRight, CircleAlert, Loader2, RotateCw } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useFileBrowser } from \"./FileBrowser.context\";\nimport { formatFileSize, isEntryExpandable } from \"./FileBrowser.utils\";\nimport type { FileBrowserNodeProps } from \"./FileBrowser.types\";\n\n// ---------------------------------------------------------------------------\n// Icons — mirror TreeNav's file/folder icons so both tree surfaces look the\n// same (TreeNav keeps them internal; duplicating ~40 lines beats widening its\n// public API).\n// ---------------------------------------------------------------------------\n\nconst EXT_COLORS: Record<string, string> = {\n ts: \"#3178c6\",\n tsx: \"#3178c6\",\n js: \"#f7df1e\",\n jsx: \"#f7df1e\",\n php: \"#777bb4\",\n html: \"#e34c26\",\n htm: \"#e34c26\",\n css: \"#264de4\",\n json: \"#a1a1aa\",\n md: \"#71717a\",\n yaml: \"#cb171e\",\n yml: \"#cb171e\",\n};\n\nfunction FileIcon({ ext }: { ext?: string }) {\n const color = (ext && EXT_COLORS[ext.toLowerCase()]) || \"#71717a\";\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0\">\n <path d=\"M4 1h5.5L13 4.5V14a1 1 0 01-1 1H4a1 1 0 01-1-1V2a1 1 0 011-1z\" stroke={color} strokeWidth=\"1.2\" />\n <path d=\"M9 1v4h4\" stroke={color} strokeWidth=\"1.2\" />\n </svg>\n );\n}\n\nfunction FolderIcon({ open }: { open: boolean }) {\n if (open) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0\">\n <path d=\"M1.5 3.5a1 1 0 011-1h3l1.5 1.5H13a1 1 0 011 1V5H2.5V3.5z\" fill=\"#fbbf24\" />\n <path d=\"M1 6h13l-1.5 7.5H2.5L1 6z\" fill=\"#fbbf24\" opacity=\"0.7\" />\n </svg>\n );\n }\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0\">\n <path d=\"M1.5 3a1 1 0 011-1h3l1.5 1.5H13a1 1 0 011 1v8a1 1 0 01-1 1H2.5a1 1 0 01-1-1V3z\" fill=\"#fbbf24\" />\n </svg>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Status rows — loading / error / empty placeholders inside the tree. Not\n// treeitems (they never receive roving focus); the owning folder carries\n// `aria-busy` while its children load.\n// ---------------------------------------------------------------------------\n\nexport interface FileBrowserStatusRowProps {\n depth: number;\n kind: \"loading\" | \"error\" | \"empty\" | \"no-matches\" | \"unknown\";\n message?: string;\n onRetry?: () => void;\n}\n\nexport function FileBrowserStatusRow({ depth, kind, message, onRetry }: FileBrowserStatusRowProps) {\n const { indentSize } = useFileBrowser();\n const paddingLeft = depth * indentSize + 4 + 18;\n\n if (kind === \"error\") {\n return (\n <div\n role=\"none\"\n data-react-fancy-file-browser-status=\"error\"\n className=\"flex items-center gap-1.5 py-0.5 pr-2 text-xs text-red-600 dark:text-red-400\"\n style={{ paddingLeft }}\n >\n <CircleAlert size={12} className=\"shrink-0\" />\n <span className=\"min-w-0 flex-1 truncate\">{message || \"Failed to load\"}</span>\n {onRetry && (\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"flex shrink-0 items-center gap-1 rounded-md px-1.5 py-0.5 text-[11px] text-zinc-500 transition-colors hover:bg-zinc-100 hover:text-zinc-700 dark:text-zinc-400 dark:hover:bg-zinc-800 dark:hover:text-zinc-200\"\n >\n <RotateCw size={11} />\n Retry\n </button>\n )}\n </div>\n );\n }\n\n return (\n <div\n role=\"none\"\n data-react-fancy-file-browser-status={kind}\n className=\"flex items-center gap-1.5 py-0.5 text-xs text-zinc-400 italic dark:text-zinc-500\"\n style={{ paddingLeft }}\n >\n {kind === \"loading\" && <Loader2 size={12} className=\"shrink-0 animate-spin\" aria-hidden=\"true\" />}\n <span className=\"truncate\">\n {kind === \"loading\" ? \"Loading…\" : kind === \"empty\" ? \"Empty\" : kind === \"no-matches\" ? \"No matches\" : \"No entries\"}\n </span>\n </div>\n );\n}\n\nFileBrowserStatusRow.displayName = \"FileBrowserStatusRow\";\n\n// ---------------------------------------------------------------------------\n// Node\n// ---------------------------------------------------------------------------\n\nexport function FileBrowserNode({ entry, depth }: FileBrowserNodeProps) {\n const {\n entriesFor, visibleChildrenFor, statusFor, errorFor, loadPath, hasProvider,\n expandedPaths, toggleExpanded, navigate,\n isSelected, isSelectable, selectEntry,\n tabFocusPath, setFocusedPath, focusRow, registerRow,\n indentSize, showIcons,\n } = useFileBrowser();\n\n const rawChildren = entriesFor(entry.path);\n const childrenKnown = rawChildren !== undefined;\n const expandable = isEntryExpandable(entry, rawChildren, hasProvider);\n const expanded = expandable && expandedPaths.includes(entry.path);\n const status = statusFor(entry.path);\n const selectable = isSelectable(entry);\n const selected = isSelected(entry.path);\n const loading = expanded && !childrenKnown && status === \"loading\";\n const paddingLeft = depth * indentSize + 4;\n const ext = entry.name.includes(\".\") ? entry.name.split(\".\").pop() : undefined;\n\n const handleClick = () => {\n if (entry.disabled) return;\n setFocusedPath(entry.path);\n focusRow(entry.path);\n if (selectable) selectEntry(entry);\n if (expandable) toggleExpanded(entry.path);\n };\n\n const handleDoubleClick = () => {\n if (entry.disabled || entry.kind !== \"dir\") return;\n navigate(entry.path);\n };\n\n const handleChevronClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!entry.disabled && expandable) toggleExpanded(entry.path);\n };\n\n const visibleChildren = expanded && childrenKnown ? visibleChildrenFor(entry.path) : [];\n\n return (\n <div\n role=\"treeitem\"\n data-react-fancy-file-browser-node=\"\"\n data-path={entry.path}\n data-kind={entry.kind}\n aria-level={depth + 1}\n aria-expanded={expandable ? expanded : undefined}\n aria-selected={selectable ? selected : undefined}\n aria-disabled={entry.disabled || undefined}\n aria-busy={loading || undefined}\n tabIndex={tabFocusPath === entry.path ? 0 : -1}\n ref={(el) => registerRow(entry.path, el)}\n onFocus={(e) => {\n if (e.target === e.currentTarget) setFocusedPath(entry.path);\n }}\n className=\"group outline-none\"\n >\n <div\n data-react-fancy-file-browser-row=\"\"\n onClick={handleClick}\n onDoubleClick={handleDoubleClick}\n className={cn(\n \"flex w-full cursor-pointer items-center gap-1 rounded-md py-0.5 pr-2 text-left text-[13px] transition-colors select-none\",\n selected\n ? \"bg-blue-500/15 text-blue-600 dark:text-blue-400\"\n : \"text-zinc-700 hover:bg-zinc-100 dark:text-zinc-300 dark:hover:bg-zinc-800\",\n entry.disabled && \"pointer-events-none opacity-40\",\n \"group-focus-visible:ring-2 group-focus-visible:ring-blue-500/40 group-focus-visible:ring-inset\",\n )}\n style={{ paddingLeft }}\n >\n {expandable ? (\n loading ? (\n <Loader2 size={14} className=\"shrink-0 animate-spin text-zinc-400\" aria-hidden=\"true\" />\n ) : (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-hidden=\"true\"\n onClick={handleChevronClick}\n className=\"flex shrink-0 items-center justify-center text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300\"\n >\n <ChevronRight\n size={14}\n className={cn(\"transition-transform duration-150\", expanded && \"rotate-90\")}\n />\n </button>\n )\n ) : (\n <span className=\"w-3.5 shrink-0\" />\n )}\n {showIcons &&\n (entry.kind === \"dir\" ? <FolderIcon open={expanded} /> : <FileIcon ext={ext} />)}\n <span className=\"min-w-0 flex-1 truncate\">{entry.name}</span>\n {entry.kind === \"file\" && entry.size !== undefined && (\n <span className=\"shrink-0 text-[11px] text-zinc-400 tabular-nums dark:text-zinc-500\">\n {formatFileSize(entry.size)}\n </span>\n )}\n </div>\n\n {expanded && (\n <div role=\"group\" data-react-fancy-file-browser-node-children=\"\">\n {/* An expanded-but-unknown folder is only reachable with a provider;\n \"idle\" means its lazy load is about to start, so render it as\n loading (keeps SSR output and the first client frame identical). */}\n {!childrenKnown && (status === \"loading\" || status === \"idle\") && (\n <FileBrowserStatusRow depth={depth + 1} kind=\"loading\" />\n )}\n {!childrenKnown && status === \"error\" && (\n <FileBrowserStatusRow\n depth={depth + 1}\n kind=\"error\"\n message={errorFor(entry.path)}\n onRetry={() => loadPath(entry.path, { reload: true })}\n />\n )}\n {childrenKnown &&\n (visibleChildren.length > 0 ? (\n visibleChildren.map((child) => (\n <FileBrowserNode key={child.path} entry={child} depth={depth + 1} />\n ))\n ) : (\n <FileBrowserStatusRow\n depth={depth + 1}\n kind={rawChildren!.length === 0 ? \"empty\" : \"no-matches\"}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nFileBrowserNode.displayName = \"FileBrowserNode\";\n","import { cn } from \"../../utils/cn\";\nimport { useFileBrowser } from \"./FileBrowser.context\";\nimport { FileBrowserNode, FileBrowserStatusRow } from \"./FileBrowserNode\";\nimport type { FileBrowserRow, FileBrowserTreeProps } from \"./FileBrowser.types\";\n\n/**\n * The tree pane: ARIA `tree` semantics, roving tabindex, and full keyboard\n * navigation (arrows / Enter / Space / Home / End) over the flattened row\n * order. Lazy loads fire on expand only.\n */\nexport function FileBrowserTree({ ariaLabel = \"Files\", className }: FileBrowserTreeProps) {\n const ctx = useFileBrowser();\n const {\n path, entriesFor, visibleChildrenFor, statusFor, errorFor, loadPath, hasProvider,\n visibleRows, tabFocusPath, setFocusedPath, focusRow,\n toggleExpanded, isSelectable, selectEntry, navigate, multiple,\n } = ctx;\n\n const rootEntries = entriesFor(path);\n const rootStatus = statusFor(path);\n const rootChildren = rootEntries !== undefined ? visibleChildrenFor(path) : [];\n\n const moveTo = (row: FileBrowserRow) => {\n setFocusedPath(row.entry.path);\n focusRow(row.entry.path);\n };\n\n const activate = (row: FileBrowserRow) => {\n if (row.entry.disabled) return;\n if (isSelectable(row.entry)) selectEntry(row.entry);\n if (row.expandable) toggleExpanded(row.entry.path);\n else if (row.entry.kind === \"dir\" && !isSelectable(row.entry)) navigate(row.entry.path);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n const rows = visibleRows;\n if (rows.length === 0) return;\n const index = rows.findIndex((row) => row.entry.path === tabFocusPath);\n const current = index >= 0 ? rows[index] : rows[0];\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n if (index < rows.length - 1) moveTo(rows[index + 1]);\n break;\n case \"ArrowUp\":\n e.preventDefault();\n if (index > 0) moveTo(rows[index - 1]);\n break;\n case \"Home\":\n e.preventDefault();\n moveTo(rows[0]);\n break;\n case \"End\":\n e.preventDefault();\n moveTo(rows[rows.length - 1]);\n break;\n case \"ArrowRight\":\n e.preventDefault();\n if (current.entry.disabled) break;\n if (current.expandable && !current.expanded) {\n toggleExpanded(current.entry.path);\n } else if (current.expanded) {\n const firstChild = rows[index + 1];\n if (firstChild && firstChild.parentPath === current.entry.path) moveTo(firstChild);\n }\n break;\n case \"ArrowLeft\":\n e.preventDefault();\n if (current.expanded && !current.entry.disabled) {\n toggleExpanded(current.entry.path);\n } else if (current.parentPath) {\n const parent = rows.find((row) => row.entry.path === current.parentPath);\n if (parent) moveTo(parent);\n }\n break;\n case \"Enter\":\n e.preventDefault();\n activate(current);\n break;\n case \" \":\n e.preventDefault();\n if (!current.entry.disabled) selectEntry(current.entry);\n break;\n }\n };\n\n return (\n <div\n role=\"tree\"\n aria-label={ariaLabel}\n aria-multiselectable={multiple || undefined}\n data-react-fancy-file-browser-tree=\"\"\n className={cn(\"min-h-0 flex-1 overflow-auto p-1\", className)}\n onKeyDown={handleKeyDown}\n >\n {/* \"idle\" with a provider renders as loading too: loads fire in an\n effect, so this is what the server (and first client frame) shows\n right before the request starts — keeps SSR + hydration identical. */}\n {rootEntries === undefined && hasProvider && (rootStatus === \"loading\" || rootStatus === \"idle\") && (\n <FileBrowserStatusRow depth={0} kind=\"loading\" />\n )}\n {rootEntries === undefined && rootStatus === \"error\" && (\n <FileBrowserStatusRow\n depth={0}\n kind=\"error\"\n message={errorFor(path)}\n onRetry={() => loadPath(path, { reload: true })}\n />\n )}\n {rootEntries === undefined && rootStatus === \"idle\" && !hasProvider && (\n <FileBrowserStatusRow depth={0} kind=\"unknown\" />\n )}\n {rootEntries !== undefined &&\n (rootChildren.length > 0 ? (\n rootChildren.map((entry) => (\n <FileBrowserNode key={entry.path} entry={entry} depth={0} />\n ))\n ) : (\n <FileBrowserStatusRow depth={0} kind={rootEntries.length === 0 ? \"empty\" : \"no-matches\"} />\n ))}\n </div>\n );\n}\n\nFileBrowserTree.displayName = \"FileBrowserTree\";\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\nimport { FileBrowserContext } from \"./FileBrowser.context\";\nimport { FileBrowserPathBar } from \"./FileBrowserPathBar\";\nimport { FileBrowserToolbar } from \"./FileBrowserToolbar\";\nimport { FileBrowserTree } from \"./FileBrowserTree\";\nimport { FileBrowserNode } from \"./FileBrowserNode\";\nimport {\n compareFileEntries,\n entryMatchesFilter,\n isEntryExpandable,\n parentPath,\n} from \"./FileBrowser.utils\";\nimport type {\n FileBrowserContextValue,\n FileBrowserProps,\n FileBrowserRow,\n FileEntry,\n FileLoadStatus,\n FileSnapshotNode,\n FileSort,\n} from \"./FileBrowser.types\";\n\nconst DEFAULT_SORT: FileSort = { by: \"name\", direction: \"asc\" };\n\nfunction snapshotNodeToEntry(node: FileSnapshotNode): FileEntry {\n const { children: _children, ...entry } = node;\n return entry;\n}\n\n/**\n * Index a snapshot tree into a `parent path -> children` map. Roots group\n * under their own parent path (usually `\"/\"`); any node with a materialized\n * `children` array defines that folder's listing. Dirs with `children`\n * undefined stay unknown — a provider fills them lazily in hybrid mode.\n */\nfunction buildSnapshotMap(snapshot: FileSnapshotNode[] | undefined): Map<string, FileEntry[]> {\n const map = new Map<string, FileEntry[]>();\n if (!snapshot || snapshot.length === 0) return map;\n\n for (const root of snapshot) {\n const parent = parentPath(root.path);\n const list = map.get(parent);\n if (list) list.push(snapshotNodeToEntry(root));\n else map.set(parent, [snapshotNodeToEntry(root)]);\n }\n\n const walk = (nodes: FileSnapshotNode[]) => {\n for (const node of nodes) {\n if (node.children) {\n map.set(node.path, node.children.map(snapshotNodeToEntry));\n walk(node.children);\n }\n }\n };\n walk(snapshot);\n\n return map;\n}\n\n/**\n * FileBrowser — remote-capable file/folder browser + directory picker.\n *\n * Browses any file tree the host can describe — local FS, HTTP, SSH, or a\n * remote machine streaming snapshots — via two feeding modes that may be\n * combined:\n *\n * - **Provider mode (lazy pull):** pass `provider.loadChildren(path)`. Folders\n * load on first expand with per-node loading + error states; the tree is\n * never walked eagerly.\n * - **Snapshot mode (streamed push):** pass a JSON-friendly `snapshot` tree\n * and replace/patch it as chunks arrive (relay / WebSocket / MCP). The\n * snapshot is the source of truth for every path it covers; with a provider\n * also present, unknown-depth folders stay lazily loadable (hybrid).\n *\n * Fully controlled per the Human+ component contract (`value`/`onChange`,\n * `path`/`onPathChange`, `expandedPaths`/`onExpandedChange`, plus\n * `sort`/`filter`), with uncontrolled `defaultX` fallbacks. Every row carries\n * a `data-path` attribute — paths are the stable handles agents target, never\n * indexes or generated ids.\n *\n * Agent bridge sketch (ships later in `@particle-academy/agent-integrations`):\n * `registerFilesBridge(server, { adapter })` will expose MCP tools over this\n * surface — `files_list(path)`, `files_expand(path)` / `files_collapse(path)`,\n * `files_select(paths)`, `files_navigate(path)`, and\n * `files_request_snapshot(path, depth)` — with each mutation emitting an\n * `AgentActivity` event so presence, undo, and coaching layers compose. The\n * adapter maps those tools onto the same controlled props\n * (`value`/`path`/`expandedPaths`) and provider/snapshot contract; no DOM\n * scraping required.\n *\n * Read-only in v1: no content preview (pair with fancy-code's `FileViewer`)\n * and no write operations — rename/delete/upload arrive later behind a\n * `pendingMode`-gated iteration.\n */\nfunction FileBrowserRoot({\n provider,\n snapshot,\n select = \"file\",\n multiple = false,\n value,\n defaultValue,\n onChange,\n path,\n defaultPath = \"/\",\n onPathChange,\n expandedPaths,\n defaultExpandedPaths,\n onExpandedChange,\n sort,\n defaultSort,\n onSortChange,\n filter,\n defaultFilter,\n onFilterChange,\n onError,\n onCreateFolder,\n indentSize = 16,\n showIcons = true,\n className,\n children,\n}: FileBrowserProps) {\n // ---------------------------------------------------------------------------\n // Controlled / uncontrolled state\n // ---------------------------------------------------------------------------\n\n const [currentPath, setCurrentPath] = useControllableState(path, defaultPath, onPathChange);\n const [expanded, setExpanded] = useControllableState(\n expandedPaths,\n defaultExpandedPaths ?? [],\n onExpandedChange,\n );\n const [sortState, setSortState] = useControllableState(sort, defaultSort ?? DEFAULT_SORT, onSortChange);\n const [filterState, setFilterState] = useControllableState(filter, defaultFilter ?? \"\", onFilterChange);\n\n // Selection is managed directly (not via useControllableState) because\n // onChange also receives the matching FileEntry objects.\n const [internalValue, setInternalValue] = useState<string | string[] | null>(\n () => defaultValue ?? (multiple ? [] : null),\n );\n const selection = value !== undefined ? value : internalValue;\n const selectedPaths = useMemo(\n () => (selection == null ? [] : Array.isArray(selection) ? selection : [selection]),\n [selection],\n );\n\n // ---------------------------------------------------------------------------\n // Data layer — snapshot map + lazy provider cache\n // ---------------------------------------------------------------------------\n\n const snapshotMap = useMemo(() => buildSnapshotMap(snapshot), [snapshot]);\n\n const [loadedChildren, setLoadedChildren] = useState<Record<string, FileEntry[]>>({});\n const [loadStatus, setLoadStatus] = useState<Record<string, FileLoadStatus>>({});\n const [loadErrors, setLoadErrors] = useState<Record<string, string>>({});\n\n const seqCounter = useRef(0);\n const requestSeq = useRef<Record<string, number>>({});\n\n // Latest-state refs so `loadPath` stays referentially stable.\n const stateRef = useRef({ snapshotMap, loadedChildren, loadStatus });\n stateRef.current = { snapshotMap, loadedChildren, loadStatus };\n const providerRef = useRef(provider);\n providerRef.current = provider;\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const loadPath = useCallback((targetPath: string, options?: { reload?: boolean }) => {\n const prov = providerRef.current;\n if (!prov) return;\n const { snapshotMap: snap, loadedChildren: loaded, loadStatus: statuses } = stateRef.current;\n const status = statuses[targetPath] ?? \"idle\";\n if (status === \"loading\") return;\n const known = snap.get(targetPath) ?? loaded[targetPath];\n if (!options?.reload && (known !== undefined || status === \"error\")) return;\n\n const requestId = ++seqCounter.current;\n requestSeq.current[targetPath] = requestId;\n setLoadStatus((prev) => ({ ...prev, [targetPath]: \"loading\" }));\n\n prov.loadChildren(targetPath).then(\n (entries) => {\n if (requestSeq.current[targetPath] !== requestId) return;\n setLoadedChildren((prev) => ({ ...prev, [targetPath]: entries }));\n setLoadStatus((prev) => ({ ...prev, [targetPath]: \"loaded\" }));\n setLoadErrors((prev) => {\n if (!(targetPath in prev)) return prev;\n const next = { ...prev };\n delete next[targetPath];\n return next;\n });\n },\n (error: unknown) => {\n if (requestSeq.current[targetPath] !== requestId) return;\n setLoadStatus((prev) => ({ ...prev, [targetPath]: \"error\" }));\n setLoadErrors((prev) => ({\n ...prev,\n [targetPath]: error instanceof Error ? error.message : String(error),\n }));\n onErrorRef.current?.(targetPath, error);\n },\n );\n }, []);\n\n const entriesFor = useCallback(\n (p: string) => snapshotMap.get(p) ?? loadedChildren[p],\n [snapshotMap, loadedChildren],\n );\n\n const statusFor = useCallback(\n (p: string): FileLoadStatus => {\n if (snapshotMap.has(p)) return \"loaded\";\n const status = loadStatus[p];\n if (status) return status;\n return loadedChildren[p] !== undefined ? \"loaded\" : \"idle\";\n },\n [snapshotMap, loadStatus, loadedChildren],\n );\n\n const errorFor = useCallback((p: string) => loadErrors[p], [loadErrors]);\n\n // Lazy loading — only the current directory and explicitly expanded folders\n // (including expansions driven from outside via the controlled\n // `expandedPaths` prop). Never an eager walk; errored paths wait for an\n // explicit retry.\n useEffect(() => {\n if (!provider) return;\n loadPath(currentPath);\n for (const p of expanded) loadPath(p);\n }, [provider, currentPath, expanded, snapshotMap, loadPath]);\n\n // ---------------------------------------------------------------------------\n // Filter + sort + flattened visible rows\n // ---------------------------------------------------------------------------\n\n const filterLower = filterState.trim().toLowerCase();\n\n const visibleChildrenFor = useCallback(\n (p: string): FileEntry[] => {\n const entries = entriesFor(p);\n if (!entries) return [];\n const filtered = filterLower\n ? entries.filter((entry) => entryMatchesFilter(entry, filterLower, entriesFor))\n : entries.slice();\n return filtered.sort((a, b) => compareFileEntries(a, b, sortState));\n },\n [entriesFor, filterLower, sortState],\n );\n\n const visibleRows = useMemo(() => {\n const rows: FileBrowserRow[] = [];\n const visited = new Set<string>([currentPath]);\n const walk = (p: string, depth: number, parent: string | null) => {\n for (const entry of visibleChildrenFor(p)) {\n const expandable = isEntryExpandable(entry, entriesFor(entry.path), !!provider);\n const isOpen = expandable && expanded.includes(entry.path);\n rows.push({ entry, depth, expandable, expanded: isOpen, parentPath: parent });\n if (isOpen && !visited.has(entry.path)) {\n visited.add(entry.path);\n walk(entry.path, depth + 1, entry.path);\n }\n }\n };\n walk(currentPath, 0, null);\n return rows;\n }, [visibleChildrenFor, entriesFor, provider, expanded, currentPath]);\n\n // ---------------------------------------------------------------------------\n // Selection\n // ---------------------------------------------------------------------------\n\n const entryIndex = useMemo(() => {\n const map = new Map<string, FileEntry>();\n for (const list of snapshotMap.values()) {\n for (const entry of list) map.set(entry.path, entry);\n }\n for (const list of Object.values(loadedChildren)) {\n for (const entry of list) {\n if (!map.has(entry.path)) map.set(entry.path, entry);\n }\n }\n return map;\n }, [snapshotMap, loadedChildren]);\n\n const isSelectable = useCallback(\n (entry: FileEntry) =>\n !entry.disabled &&\n (select === \"both\" || (select === \"file\" ? entry.kind === \"file\" : entry.kind === \"dir\")),\n [select],\n );\n\n const isSelected = useCallback((p: string) => selectedPaths.includes(p), [selectedPaths]);\n\n const commitSelection = useCallback(\n (paths: string[]) => {\n const nextValue = multiple ? paths : (paths[0] ?? null);\n if (value === undefined) setInternalValue(nextValue);\n onChangeRef.current?.(\n nextValue,\n paths\n .map((p) => entryIndex.get(p))\n .filter((entry): entry is FileEntry => entry !== undefined),\n );\n },\n [multiple, value, entryIndex],\n );\n\n const selectEntry = useCallback(\n (entry: FileEntry) => {\n if (!isSelectable(entry)) return;\n if (multiple) {\n commitSelection(\n selectedPaths.includes(entry.path)\n ? selectedPaths.filter((p) => p !== entry.path)\n : [...selectedPaths, entry.path],\n );\n } else {\n commitSelection([entry.path]);\n }\n },\n [isSelectable, multiple, selectedPaths, commitSelection],\n );\n\n // ---------------------------------------------------------------------------\n // Expansion, navigation, roving focus\n // ---------------------------------------------------------------------------\n\n const toggleExpanded = useCallback(\n (p: string) => {\n setExpanded((prev) => (prev.includes(p) ? prev.filter((x) => x !== p) : [...prev, p]));\n },\n [setExpanded],\n );\n\n const [focusedPath, setFocusedPath] = useState<string | null>(null);\n\n const navigate = useCallback(\n (p: string) => {\n setCurrentPath(p);\n setFilterState(\"\");\n setFocusedPath(null);\n },\n [setCurrentPath, setFilterState],\n );\n\n const rowRefs = useRef(new Map<string, HTMLElement>());\n\n const registerRow = useCallback((p: string, el: HTMLElement | null) => {\n if (el) rowRefs.current.set(p, el);\n else rowRefs.current.delete(p);\n }, []);\n\n const focusRow = useCallback((p: string) => {\n rowRefs.current.get(p)?.focus();\n }, []);\n\n const tabFocusPath = useMemo(() => {\n if (focusedPath && visibleRows.some((row) => row.entry.path === focusedPath)) {\n return focusedPath;\n }\n return visibleRows[0]?.entry.path ?? null;\n }, [focusedPath, visibleRows]);\n\n // ---------------------------------------------------------------------------\n // Context + render\n // ---------------------------------------------------------------------------\n\n const ctx = useMemo<FileBrowserContextValue>(\n () => ({\n entriesFor,\n visibleChildrenFor,\n statusFor,\n errorFor,\n loadPath,\n hasProvider: !!provider,\n path: currentPath,\n navigate,\n expandedPaths: expanded,\n toggleExpanded,\n select,\n multiple,\n selectedPaths,\n isSelected,\n isSelectable,\n selectEntry,\n sort: sortState,\n setSort: setSortState,\n filter: filterState,\n setFilter: setFilterState,\n visibleRows,\n focusedPath,\n setFocusedPath,\n tabFocusPath,\n focusRow,\n registerRow,\n indentSize,\n showIcons,\n onCreateFolder,\n }),\n [\n entriesFor, visibleChildrenFor, statusFor, errorFor, loadPath, provider,\n currentPath, navigate, expanded, toggleExpanded, select, multiple,\n selectedPaths, isSelected, isSelectable, selectEntry, sortState,\n setSortState, filterState, setFilterState, visibleRows, focusedPath,\n tabFocusPath, focusRow, registerRow, indentSize, showIcons, onCreateFolder,\n ],\n );\n\n return (\n <FileBrowserContext.Provider value={ctx}>\n <div\n data-react-fancy-file-browser=\"\"\n className={cn(\n \"flex flex-col overflow-hidden rounded-lg border border-zinc-200 bg-white text-sm dark:border-zinc-700 dark:bg-zinc-900\",\n className,\n )}\n >\n {children ?? (\n <>\n <FileBrowserPathBar />\n <FileBrowserToolbar />\n <FileBrowserTree />\n </>\n )}\n </div>\n </FileBrowserContext.Provider>\n );\n}\n\nFileBrowserRoot.displayName = \"FileBrowser\";\n\nexport const FileBrowser = Object.assign(FileBrowserRoot, {\n PathBar: FileBrowserPathBar,\n Toolbar: FileBrowserToolbar,\n Tree: FileBrowserTree,\n Node: FileBrowserNode,\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/FileBrowser/FileBrowser.context.ts","../src/components/FileBrowser/FileBrowser.utils.ts","../src/components/FileBrowser/FileBrowserPathBar.tsx","../src/components/FileBrowser/FileBrowserNewFolder.tsx","../src/components/FileBrowser/FileBrowserToolbar.tsx","../src/components/FileBrowser/FileBrowserNode.tsx","../src/components/FileBrowser/FileBrowserTree.tsx","../src/components/FileBrowser/FileBrowser.tsx"],"names":["createContext","useContext","useState","jsxs","cn","jsx","Fragment","ChevronRight","Pencil","useRef","useEffect","FolderPlus","Search","X","ArrowUp","ArrowDown","CircleAlert","RotateCw","Loader2","useControllableState","useMemo","useCallback"],"mappings":"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","file":"chunk-JV6RDIA6.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { FileBrowserContextValue } from \"./FileBrowser.types\";\n\nexport const FileBrowserContext = createContext<FileBrowserContextValue | null>(null);\n\nexport function useFileBrowser(): FileBrowserContextValue {\n const ctx = useContext(FileBrowserContext);\n if (!ctx) {\n throw new Error(\"useFileBrowser must be used within a <FileBrowser> component\");\n }\n return ctx;\n}\n","import type { FileEntry, FileSort } from \"./FileBrowser.types\";\n\n/**\n * Normalize free-typed path input: forward slashes, collapsed separators,\n * resolved `.` / `..` segments, no trailing slash. Absolute paths stay\n * absolute; relative paths stay relative (entry paths are identity and are\n * never rewritten — this is only for the editable path input).\n */\nexport function normalizePath(input: string): string {\n const raw = input.trim().replace(/\\\\/g, \"/\");\n if (raw === \"\") return \"/\";\n const absolute = raw.startsWith(\"/\");\n const out: string[] = [];\n for (const segment of raw.split(\"/\")) {\n if (segment === \"\" || segment === \".\") continue;\n if (segment === \"..\") {\n out.pop();\n continue;\n }\n out.push(segment);\n }\n if (out.length === 0) return \"/\";\n return (absolute ? \"/\" : \"\") + out.join(\"/\");\n}\n\n/** Parent of a path. Paths without a separator group under `\"/\"`. */\nexport function parentPath(path: string): string {\n const i = path.lastIndexOf(\"/\");\n if (i === -1) return \"/\";\n if (i === 0) return \"/\";\n return path.slice(0, i);\n}\n\nexport interface PathSegment {\n label: string;\n path: string;\n}\n\n/** Cumulative breadcrumb segments for a path (root anchor excluded). */\nexport function pathSegments(path: string): PathSegment[] {\n const absolute = path.startsWith(\"/\");\n const parts = path.split(\"/\").filter(Boolean);\n const segments: PathSegment[] = [];\n let acc = \"\";\n parts.forEach((part, i) => {\n acc = i === 0 && !absolute ? part : `${acc}/${part}`;\n segments.push({ label: part, path: acc });\n });\n return segments;\n}\n\n/**\n * Deterministic, numeric-aware name comparison. The locale is pinned to \"en\"\n * so server and client renders order identically (SSR safety).\n */\nfunction compareNames(a: string, b: string): number {\n const cmp = a.localeCompare(b, \"en\", { numeric: true, sensitivity: \"base\" });\n if (cmp !== 0) return cmp;\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\n/** Dirs-first, then the active sort field, with a stable ascending name tie-break. */\nexport function compareFileEntries(a: FileEntry, b: FileEntry, sort: FileSort): number {\n if (a.kind !== b.kind) return a.kind === \"dir\" ? -1 : 1;\n const direction = sort.direction === \"desc\" ? -1 : 1;\n let cmp: number;\n switch (sort.by) {\n case \"size\":\n cmp = (a.size ?? -1) - (b.size ?? -1);\n break;\n case \"mtime\": {\n const am = a.mtime ?? \"\";\n const bm = b.mtime ?? \"\";\n cmp = am < bm ? -1 : am > bm ? 1 : 0;\n break;\n }\n default:\n cmp = compareNames(a.name, b.name);\n }\n if (cmp !== 0) return direction * cmp;\n return compareNames(a.name, b.name);\n}\n\n/**\n * Whether a dir shows an expand affordance: known-empty dirs never do\n * (`hasChildren: false`, or a loaded/snapshot listing of zero entries);\n * unknown-depth dirs only do when a provider can load them.\n */\nexport function isEntryExpandable(\n entry: FileEntry,\n children: FileEntry[] | undefined,\n hasProvider: boolean,\n): boolean {\n if (entry.kind !== \"dir\" || entry.hasChildren === false) return false;\n if (children !== undefined) return children.length > 0;\n return hasProvider;\n}\n\n/**\n * Client-side name filter over loaded nodes only: an entry matches when its\n * name contains the query, or (for dirs) when any already-loaded descendant\n * matches. Never triggers loads.\n */\nexport function entryMatchesFilter(\n entry: FileEntry,\n query: string,\n entriesFor: (path: string) => FileEntry[] | undefined,\n visited: Set<string> = new Set(),\n): boolean {\n if (entry.name.toLowerCase().includes(query)) return true;\n if (entry.kind !== \"dir\" || visited.has(entry.path)) return false;\n visited.add(entry.path);\n const children = entriesFor(entry.path);\n return children?.some((child) => entryMatchesFilter(child, query, entriesFor, visited)) ?? false;\n}\n\n/** Compact, deterministic byte formatting (\"1.4 KB\", \"12 MB\"). */\nexport function formatFileSize(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return \"\";\n if (bytes < 1024) return `${bytes} B`;\n const units = [\"KB\", \"MB\", \"GB\", \"TB\"];\n let value = bytes;\n let unit = -1;\n do {\n value /= 1024;\n unit++;\n } while (value >= 1024 && unit < units.length - 1);\n const rounded = value >= 100 ? Math.round(value) : Math.round(value * 10) / 10;\n return `${rounded} ${units[unit]}`;\n}\n\n/**\n * Why a proposed folder name cannot be used, or `null` if it can.\n *\n * Only checks what the BROWSER can know: that the name is a name rather than a\n * path, and that nothing in this directory already answers to it. Case\n * sensitivity, reserved device names and length limits depend on a filesystem\n * this component cannot see, so they stay the host's to enforce — and the host\n * rejecting a create is a supported outcome, surfaced on the form.\n *\n * A collision counts against FILES too. `mkdir` fails the same way either way,\n * and \"there is already an index.ts here\" is the useful message.\n */\nexport function validateFolderName(\n raw: string,\n siblings: ReadonlyArray<{ name: string }>,\n): string | null {\n const name = raw.trim();\n\n if (name === \"\") return \"Enter a name.\";\n // `/` and `\\` make it a path, not a name; `.`/`..` are traversal. Forwarding\n // either would make the host decide what an escape attempt means.\n if (name.includes(\"/\") || name.includes(\"\\\\\")) return \"A name cannot contain / or \\.\";\n if (name === \".\" || name === \"..\") return \"That name is reserved.\";\n\n if (siblings.some((entry) => entry.name === name)) {\n return `“${name}” already exists here.`;\n }\n\n return null;\n}\n","import { Fragment, useState } from \"react\";\nimport { ChevronRight, Pencil } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useFileBrowser } from \"./FileBrowser.context\";\nimport { normalizePath, pathSegments } from \"./FileBrowser.utils\";\nimport type { FileBrowserPathBarProps } from \"./FileBrowser.types\";\n\n// Segment styling mirrors Breadcrumbs.Item (the Breadcrumbs component itself\n// is href-only and collapses to a dropdown on mobile, so the path bar renders\n// its own always-visible, click-to-navigate trail).\nconst SEGMENT_CLASS =\n \"shrink-0 rounded text-[13px] text-zinc-500 transition-colors hover:text-zinc-700 dark:text-zinc-400 dark:hover:text-zinc-300\";\nconst ACTIVE_SEGMENT_CLASS = \"shrink-0 truncate text-[13px] font-medium text-zinc-900 dark:text-white\";\n\n/**\n * Breadcrumb trail over the current directory plus an editable path input —\n * type a POSIX-style path and press Enter to navigate (lazy-loading it in\n * provider mode). Escape or blur cancels the edit.\n */\nexport function FileBrowserPathBar({\n editable = true,\n placeholder = \"/path/to/folder\",\n className,\n}: FileBrowserPathBarProps) {\n const { path, navigate } = useFileBrowser();\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState(\"\");\n\n const startEdit = () => {\n setDraft(path);\n setEditing(true);\n };\n\n const commit = () => {\n navigate(normalizePath(draft));\n setEditing(false);\n };\n\n const segments = pathSegments(path);\n const atRoot = segments.length === 0;\n\n return (\n <div\n data-react-fancy-file-browser-path=\"\"\n className={cn(\n \"flex items-center gap-1 border-b border-zinc-200 px-2 py-1.5 dark:border-zinc-700\",\n className,\n )}\n >\n {editing ? (\n <input\n data-react-fancy-file-browser-path-input=\"\"\n type=\"text\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commit();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setEditing(false);\n }\n }}\n onBlur={() => setEditing(false)}\n autoFocus\n spellCheck={false}\n placeholder={placeholder}\n aria-label=\"Path\"\n className=\"min-w-0 flex-1 rounded-md border border-zinc-300 bg-transparent px-2 py-0.5 font-mono text-xs text-zinc-700 outline-none placeholder:text-zinc-400 focus:border-blue-400 dark:border-zinc-600 dark:text-zinc-300\"\n />\n ) : (\n <nav\n aria-label=\"Path\"\n onDoubleClick={editable ? startEdit : undefined}\n className=\"flex min-w-0 flex-1 items-center gap-1 overflow-x-auto\"\n >\n {atRoot ? (\n <span data-react-fancy-file-browser-path-segment=\"\" aria-current=\"location\" className={ACTIVE_SEGMENT_CLASS}>\n /\n </span>\n ) : (\n <button\n type=\"button\"\n data-react-fancy-file-browser-path-segment=\"\"\n onClick={() => navigate(\"/\")}\n className={SEGMENT_CLASS}\n >\n /\n </button>\n )}\n {segments.map((segment, i) => {\n const last = i === segments.length - 1;\n return (\n <Fragment key={segment.path}>\n {i > 0 && (\n <ChevronRight size={12} aria-hidden=\"true\" className=\"shrink-0 text-zinc-400\" />\n )}\n {last ? (\n <span\n data-react-fancy-file-browser-path-segment=\"\"\n aria-current=\"location\"\n className={ACTIVE_SEGMENT_CLASS}\n >\n {segment.label}\n </span>\n ) : (\n <button\n type=\"button\"\n data-react-fancy-file-browser-path-segment=\"\"\n onClick={() => navigate(segment.path)}\n className={SEGMENT_CLASS}\n >\n {segment.label}\n </button>\n )}\n </Fragment>\n );\n })}\n </nav>\n )}\n {editable && !editing && (\n <button\n type=\"button\"\n aria-label=\"Edit path\"\n onClick={startEdit}\n className=\"shrink-0 rounded-md 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 >\n <Pencil size={13} />\n </button>\n )}\n </div>\n );\n}\n\nFileBrowserPathBar.displayName = \"FileBrowserPathBar\";\n","import { useEffect, useRef, useState } from \"react\";\nimport { FolderPlus } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useFileBrowser } from \"./FileBrowser.context\";\nimport { validateFolderName } from \"./FileBrowser.utils\";\n\n/**\n * The \"New folder\" affordance — rendered only when the host opted in by\n * supplying `onCreateFolder`.\n *\n * ## Why an inline input and not `window.prompt`\n *\n * A prompt blocks the event loop, cannot be styled or themed, is unusable on\n * mobile, and — the one that matters for this suite — cannot be driven by an\n * agent. The Human+ contract asks that every interactive element carry a stable\n * handle an agent can target; a native dialog has none.\n *\n * ## Why validation lives here\n *\n * The browser already knows what is in the current directory. The host would\n * have to round-trip to find out, so a duplicate name becomes a failed write\n * and an error toast instead of a message before anything is attempted. Name\n * rules that are about PATHS rather than policy — separators, `.`, `..` — are\n * checked here too: those are not names, and forwarding them makes the host\n * decide what a traversal attempt means.\n *\n * Anything else is the host's call. This does not guess at case-sensitivity,\n * reserved Windows device names, or length limits, because the answer depends\n * on a filesystem the browser cannot see.\n */\nexport function FileBrowserNewFolder({ className }: { className?: string }) {\n const { path, entriesFor, onCreateFolder, loadPath, hasProvider } = useFileBrowser();\n\n const [open, setOpen] = useState(false);\n const [name, setName] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (open) inputRef.current?.focus();\n }, [open]);\n\n // Navigating away mid-name would otherwise create the folder in a directory\n // the person is no longer looking at.\n useEffect(() => {\n setOpen(false);\n setName(\"\");\n setError(null);\n }, [path]);\n\n if (!onCreateFolder) return null;\n\n const siblings = entriesFor(path) ?? [];\n const problem = validateFolderName(name, siblings);\n const canSubmit = !busy && problem === null;\n\n const close = () => {\n setOpen(false);\n setName(\"\");\n setError(null);\n };\n\n const submit = async () => {\n if (busy) return;\n const trimmed = name.trim();\n const invalid = validateFolderName(name, siblings);\n if (invalid) {\n setError(invalid);\n return;\n }\n\n setBusy(true);\n setError(null);\n try {\n await onCreateFolder({ parentPath: path, name: trimmed });\n // Only on success. Reloading after a failure would hide the failure\n // behind an unchanged listing, and closing would claim it worked.\n if (hasProvider) loadPath(path, { reload: true });\n setOpen(false);\n setName(\"\");\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setBusy(false);\n }\n };\n\n if (!open) {\n return (\n <button\n type=\"button\"\n data-react-fancy-file-browser-new-folder=\"\"\n onClick={() => setOpen(true)}\n title={`New folder in ${path}`}\n className={cn(\n \"flex shrink-0 items-center gap-1 rounded-md px-1.5 py-0.5 text-xs text-zinc-500 transition-colors\",\n \"hover:bg-zinc-100 hover:text-zinc-700 dark:hover:bg-zinc-800 dark:hover:text-zinc-300\",\n className,\n )}\n >\n <FolderPlus size={13} aria-hidden=\"true\" />\n New folder\n </button>\n );\n }\n\n // Show the reason as soon as there is a name to judge — but not for an empty\n // field, which is \"not typed yet\" rather than wrong.\n //\n // This pairs with the disabled submit deliberately. A disabled button and no\n // explanation is the worst combination: the person has typed something\n // reasonable, the control is dead, and nothing says the folder already\n // exists. Either the button explains on click or the message is already\n // there; this takes the second, so the answer arrives before they reach for\n // the button.\n const shown = error ?? (name.trim() !== \"\" ? problem : null);\n\n return (\n <div\n data-react-fancy-file-browser-new-folder-form=\"\"\n className={cn(\"flex shrink-0 flex-col gap-0.5\", className)}\n >\n <div className=\"flex items-center gap-1\">\n <FolderPlus size={13} aria-hidden=\"true\" className=\"shrink-0 text-zinc-400\" />\n <input\n ref={inputRef}\n type=\"text\"\n data-react-fancy-file-browser-new-folder-input=\"\"\n value={name}\n disabled={busy}\n aria-label=\"New folder name\"\n aria-invalid={shown ? true : undefined}\n spellCheck={false}\n placeholder=\"Folder name\"\n onChange={(e) => {\n setName(e.target.value);\n if (error) setError(null);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n void submit();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n close();\n }\n }}\n className={cn(\n \"w-32 min-w-0 rounded-md border px-1.5 py-0.5 text-xs outline-none\",\n \"bg-transparent text-zinc-700 placeholder:text-zinc-400 dark:text-zinc-300\",\n shown ? \"border-red-400 dark:border-red-500\" : \"border-zinc-200 dark:border-zinc-700\",\n )}\n />\n <button\n type=\"button\"\n data-react-fancy-file-browser-new-folder-submit=\"\"\n disabled={!canSubmit}\n onClick={() => void submit()}\n className=\"rounded-md px-1.5 py-0.5 text-xs font-medium text-violet-600 transition-colors hover:bg-violet-50 disabled:cursor-not-allowed disabled:opacity-40 dark:text-violet-400 dark:hover:bg-violet-500/10\"\n >\n {busy ? \"Creating…\" : \"Create\"}\n </button>\n <button\n type=\"button\"\n data-react-fancy-file-browser-new-folder-cancel=\"\"\n onClick={close}\n className=\"rounded-md px-1.5 py-0.5 text-xs text-zinc-500 transition-colors hover:text-zinc-700 dark:hover:text-zinc-300\"\n >\n Cancel\n </button>\n </div>\n {shown && (\n <p\n data-react-fancy-file-browser-new-folder-error=\"\"\n role=\"alert\"\n className=\"pl-4 text-[11px] text-red-600 dark:text-red-400\"\n >\n {shown}\n </p>\n )}\n </div>\n );\n}\n\nFileBrowserNewFolder.displayName = \"FileBrowserNewFolder\";\n","import { ArrowDown, ArrowUp, Search, X } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useFileBrowser } from \"./FileBrowser.context\";\nimport { FileBrowserNewFolder } from \"./FileBrowserNewFolder\";\nimport type { FileBrowserToolbarProps, FileSortField } from \"./FileBrowser.types\";\n\nconst SORT_FIELDS: { field: FileSortField; label: string }[] = [\n { field: \"name\", label: \"Name\" },\n { field: \"size\", label: \"Size\" },\n { field: \"mtime\", label: \"Modified\" },\n];\n\n/**\n * Toolbar: client-side name filter (over loaded nodes only — never triggers\n * loads) plus a dirs-first sort control. Clicking the active sort field flips\n * its direction.\n */\nexport function FileBrowserToolbar({ filterPlaceholder = \"Filter\", className }: FileBrowserToolbarProps) {\n const { filter, setFilter, sort, setSort } = useFileBrowser();\n\n return (\n <div\n data-react-fancy-file-browser-toolbar=\"\"\n className={cn(\n \"flex items-center gap-2 border-b border-zinc-200 px-2 py-1.5 dark:border-zinc-700\",\n className,\n )}\n >\n <div\n data-react-fancy-file-browser-filter=\"\"\n className=\"flex min-w-0 flex-1 items-center gap-1.5 rounded-md border border-zinc-200 px-2 dark:border-zinc-700\"\n >\n <Search size={13} aria-hidden=\"true\" className=\"shrink-0 text-zinc-400\" />\n <input\n type=\"text\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n placeholder={filterPlaceholder}\n aria-label=\"Filter by name\"\n spellCheck={false}\n className=\"min-w-0 flex-1 bg-transparent py-1 text-xs text-zinc-700 outline-none placeholder:text-zinc-400 dark:text-zinc-300\"\n />\n {filter !== \"\" && (\n <button\n type=\"button\"\n aria-label=\"Clear filter\"\n onClick={() => setFilter(\"\")}\n className=\"shrink-0 text-zinc-400 transition-colors hover:text-zinc-600 dark:hover:text-zinc-300\"\n >\n <X size={12} />\n </button>\n )}\n </div>\n <div\n data-react-fancy-file-browser-sort=\"\"\n role=\"group\"\n aria-label=\"Sort\"\n className=\"flex shrink-0 items-center gap-0.5\"\n >\n {SORT_FIELDS.map(({ field, label }) => {\n const active = sort.by === field;\n return (\n <button\n key={field}\n type=\"button\"\n data-sort-field={field}\n aria-pressed={active}\n onClick={() =>\n setSort(\n active\n ? { by: field, direction: sort.direction === \"asc\" ? \"desc\" : \"asc\" }\n : { by: field, direction: \"asc\" },\n )\n }\n className={cn(\n \"flex items-center gap-0.5 rounded-md px-1.5 py-0.5 text-xs transition-colors\",\n active\n ? \"bg-zinc-100 font-medium text-zinc-900 dark:bg-zinc-800 dark:text-white\"\n : \"text-zinc-500 hover:text-zinc-700 dark:text-zinc-400 dark:hover:text-zinc-300\",\n )}\n >\n {label}\n {active &&\n (sort.direction === \"asc\" ? (\n <ArrowUp size={11} aria-hidden=\"true\" />\n ) : (\n <ArrowDown size={11} aria-hidden=\"true\" />\n ))}\n </button>\n );\n })}\n </div>\n <FileBrowserNewFolder />\n </div>\n );\n}\n\nFileBrowserToolbar.displayName = \"FileBrowserToolbar\";\n","import { ChevronRight, CircleAlert, Loader2, RotateCw } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useFileBrowser } from \"./FileBrowser.context\";\nimport { formatFileSize, isEntryExpandable } from \"./FileBrowser.utils\";\nimport type { FileBrowserNodeProps } from \"./FileBrowser.types\";\n\n// ---------------------------------------------------------------------------\n// Icons — mirror TreeNav's file/folder icons so both tree surfaces look the\n// same (TreeNav keeps them internal; duplicating ~40 lines beats widening its\n// public API).\n// ---------------------------------------------------------------------------\n\nconst EXT_COLORS: Record<string, string> = {\n ts: \"#3178c6\",\n tsx: \"#3178c6\",\n js: \"#f7df1e\",\n jsx: \"#f7df1e\",\n php: \"#777bb4\",\n html: \"#e34c26\",\n htm: \"#e34c26\",\n css: \"#264de4\",\n json: \"#a1a1aa\",\n md: \"#71717a\",\n yaml: \"#cb171e\",\n yml: \"#cb171e\",\n};\n\nfunction FileIcon({ ext }: { ext?: string }) {\n const color = (ext && EXT_COLORS[ext.toLowerCase()]) || \"#71717a\";\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0\">\n <path d=\"M4 1h5.5L13 4.5V14a1 1 0 01-1 1H4a1 1 0 01-1-1V2a1 1 0 011-1z\" stroke={color} strokeWidth=\"1.2\" />\n <path d=\"M9 1v4h4\" stroke={color} strokeWidth=\"1.2\" />\n </svg>\n );\n}\n\nfunction FolderIcon({ open }: { open: boolean }) {\n if (open) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0\">\n <path d=\"M1.5 3.5a1 1 0 011-1h3l1.5 1.5H13a1 1 0 011 1V5H2.5V3.5z\" fill=\"#fbbf24\" />\n <path d=\"M1 6h13l-1.5 7.5H2.5L1 6z\" fill=\"#fbbf24\" opacity=\"0.7\" />\n </svg>\n );\n }\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0\">\n <path d=\"M1.5 3a1 1 0 011-1h3l1.5 1.5H13a1 1 0 011 1v8a1 1 0 01-1 1H2.5a1 1 0 01-1-1V3z\" fill=\"#fbbf24\" />\n </svg>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Status rows — loading / error / empty placeholders inside the tree. Not\n// treeitems (they never receive roving focus); the owning folder carries\n// `aria-busy` while its children load.\n// ---------------------------------------------------------------------------\n\nexport interface FileBrowserStatusRowProps {\n depth: number;\n kind: \"loading\" | \"error\" | \"empty\" | \"no-matches\" | \"unknown\";\n message?: string;\n onRetry?: () => void;\n}\n\nexport function FileBrowserStatusRow({ depth, kind, message, onRetry }: FileBrowserStatusRowProps) {\n const { indentSize } = useFileBrowser();\n const paddingLeft = depth * indentSize + 4 + 18;\n\n if (kind === \"error\") {\n return (\n <div\n role=\"none\"\n data-react-fancy-file-browser-status=\"error\"\n className=\"flex items-center gap-1.5 py-0.5 pr-2 text-xs text-red-600 dark:text-red-400\"\n style={{ paddingLeft }}\n >\n <CircleAlert size={12} className=\"shrink-0\" />\n <span className=\"min-w-0 flex-1 truncate\">{message || \"Failed to load\"}</span>\n {onRetry && (\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"flex shrink-0 items-center gap-1 rounded-md px-1.5 py-0.5 text-[11px] text-zinc-500 transition-colors hover:bg-zinc-100 hover:text-zinc-700 dark:text-zinc-400 dark:hover:bg-zinc-800 dark:hover:text-zinc-200\"\n >\n <RotateCw size={11} />\n Retry\n </button>\n )}\n </div>\n );\n }\n\n return (\n <div\n role=\"none\"\n data-react-fancy-file-browser-status={kind}\n className=\"flex items-center gap-1.5 py-0.5 text-xs text-zinc-400 italic dark:text-zinc-500\"\n style={{ paddingLeft }}\n >\n {kind === \"loading\" && <Loader2 size={12} className=\"shrink-0 animate-spin\" aria-hidden=\"true\" />}\n <span className=\"truncate\">\n {kind === \"loading\" ? \"Loading…\" : kind === \"empty\" ? \"Empty\" : kind === \"no-matches\" ? \"No matches\" : \"No entries\"}\n </span>\n </div>\n );\n}\n\nFileBrowserStatusRow.displayName = \"FileBrowserStatusRow\";\n\n// ---------------------------------------------------------------------------\n// Node\n// ---------------------------------------------------------------------------\n\nexport function FileBrowserNode({ entry, depth }: FileBrowserNodeProps) {\n const {\n entriesFor, visibleChildrenFor, statusFor, errorFor, loadPath, hasProvider,\n expandedPaths, toggleExpanded, navigate,\n isSelected, isSelectable, selectEntry,\n tabFocusPath, setFocusedPath, focusRow, registerRow,\n indentSize, showIcons,\n } = useFileBrowser();\n\n const rawChildren = entriesFor(entry.path);\n const childrenKnown = rawChildren !== undefined;\n const expandable = isEntryExpandable(entry, rawChildren, hasProvider);\n const expanded = expandable && expandedPaths.includes(entry.path);\n const status = statusFor(entry.path);\n const selectable = isSelectable(entry);\n const selected = isSelected(entry.path);\n const loading = expanded && !childrenKnown && status === \"loading\";\n const paddingLeft = depth * indentSize + 4;\n const ext = entry.name.includes(\".\") ? entry.name.split(\".\").pop() : undefined;\n\n const handleClick = () => {\n if (entry.disabled) return;\n setFocusedPath(entry.path);\n focusRow(entry.path);\n if (selectable) selectEntry(entry);\n if (expandable) toggleExpanded(entry.path);\n };\n\n const handleDoubleClick = () => {\n if (entry.disabled || entry.kind !== \"dir\") return;\n navigate(entry.path);\n };\n\n const handleChevronClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!entry.disabled && expandable) toggleExpanded(entry.path);\n };\n\n const visibleChildren = expanded && childrenKnown ? visibleChildrenFor(entry.path) : [];\n\n return (\n <div\n role=\"treeitem\"\n data-react-fancy-file-browser-node=\"\"\n data-path={entry.path}\n data-kind={entry.kind}\n aria-level={depth + 1}\n aria-expanded={expandable ? expanded : undefined}\n aria-selected={selectable ? selected : undefined}\n aria-disabled={entry.disabled || undefined}\n aria-busy={loading || undefined}\n tabIndex={tabFocusPath === entry.path ? 0 : -1}\n ref={(el) => registerRow(entry.path, el)}\n onFocus={(e) => {\n if (e.target === e.currentTarget) setFocusedPath(entry.path);\n }}\n className=\"group outline-none\"\n >\n <div\n data-react-fancy-file-browser-row=\"\"\n onClick={handleClick}\n onDoubleClick={handleDoubleClick}\n className={cn(\n \"flex w-full cursor-pointer items-center gap-1 rounded-md py-0.5 pr-2 text-left text-[13px] transition-colors select-none\",\n selected\n ? \"bg-blue-500/15 text-blue-600 dark:text-blue-400\"\n : \"text-zinc-700 hover:bg-zinc-100 dark:text-zinc-300 dark:hover:bg-zinc-800\",\n entry.disabled && \"pointer-events-none opacity-40\",\n \"group-focus-visible:ring-2 group-focus-visible:ring-blue-500/40 group-focus-visible:ring-inset\",\n )}\n style={{ paddingLeft }}\n >\n {expandable ? (\n loading ? (\n <Loader2 size={14} className=\"shrink-0 animate-spin text-zinc-400\" aria-hidden=\"true\" />\n ) : (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-hidden=\"true\"\n onClick={handleChevronClick}\n className=\"flex shrink-0 items-center justify-center text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300\"\n >\n <ChevronRight\n size={14}\n className={cn(\"transition-transform duration-150\", expanded && \"rotate-90\")}\n />\n </button>\n )\n ) : (\n <span className=\"w-3.5 shrink-0\" />\n )}\n {showIcons &&\n (entry.kind === \"dir\" ? <FolderIcon open={expanded} /> : <FileIcon ext={ext} />)}\n <span className=\"min-w-0 flex-1 truncate\">{entry.name}</span>\n {entry.kind === \"file\" && entry.size !== undefined && (\n <span className=\"shrink-0 text-[11px] text-zinc-400 tabular-nums dark:text-zinc-500\">\n {formatFileSize(entry.size)}\n </span>\n )}\n </div>\n\n {expanded && (\n <div role=\"group\" data-react-fancy-file-browser-node-children=\"\">\n {/* An expanded-but-unknown folder is only reachable with a provider;\n \"idle\" means its lazy load is about to start, so render it as\n loading (keeps SSR output and the first client frame identical). */}\n {!childrenKnown && (status === \"loading\" || status === \"idle\") && (\n <FileBrowserStatusRow depth={depth + 1} kind=\"loading\" />\n )}\n {!childrenKnown && status === \"error\" && (\n <FileBrowserStatusRow\n depth={depth + 1}\n kind=\"error\"\n message={errorFor(entry.path)}\n onRetry={() => loadPath(entry.path, { reload: true })}\n />\n )}\n {childrenKnown &&\n (visibleChildren.length > 0 ? (\n visibleChildren.map((child) => (\n <FileBrowserNode key={child.path} entry={child} depth={depth + 1} />\n ))\n ) : (\n <FileBrowserStatusRow\n depth={depth + 1}\n kind={rawChildren!.length === 0 ? \"empty\" : \"no-matches\"}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nFileBrowserNode.displayName = \"FileBrowserNode\";\n","import { cn } from \"../../utils/cn\";\nimport { useFileBrowser } from \"./FileBrowser.context\";\nimport { FileBrowserNode, FileBrowserStatusRow } from \"./FileBrowserNode\";\nimport type { FileBrowserRow, FileBrowserTreeProps } from \"./FileBrowser.types\";\n\n/**\n * The tree pane: ARIA `tree` semantics, roving tabindex, and full keyboard\n * navigation (arrows / Enter / Space / Home / End) over the flattened row\n * order. Lazy loads fire on expand only.\n */\nexport function FileBrowserTree({ ariaLabel = \"Files\", className }: FileBrowserTreeProps) {\n const ctx = useFileBrowser();\n const {\n path, entriesFor, visibleChildrenFor, statusFor, errorFor, loadPath, hasProvider,\n visibleRows, tabFocusPath, setFocusedPath, focusRow,\n toggleExpanded, isSelectable, selectEntry, navigate, multiple,\n } = ctx;\n\n const rootEntries = entriesFor(path);\n const rootStatus = statusFor(path);\n const rootChildren = rootEntries !== undefined ? visibleChildrenFor(path) : [];\n\n const moveTo = (row: FileBrowserRow) => {\n setFocusedPath(row.entry.path);\n focusRow(row.entry.path);\n };\n\n const activate = (row: FileBrowserRow) => {\n if (row.entry.disabled) return;\n if (isSelectable(row.entry)) selectEntry(row.entry);\n if (row.expandable) toggleExpanded(row.entry.path);\n else if (row.entry.kind === \"dir\" && !isSelectable(row.entry)) navigate(row.entry.path);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n const rows = visibleRows;\n if (rows.length === 0) return;\n const index = rows.findIndex((row) => row.entry.path === tabFocusPath);\n const current = index >= 0 ? rows[index] : rows[0];\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n if (index < rows.length - 1) moveTo(rows[index + 1]);\n break;\n case \"ArrowUp\":\n e.preventDefault();\n if (index > 0) moveTo(rows[index - 1]);\n break;\n case \"Home\":\n e.preventDefault();\n moveTo(rows[0]);\n break;\n case \"End\":\n e.preventDefault();\n moveTo(rows[rows.length - 1]);\n break;\n case \"ArrowRight\":\n e.preventDefault();\n if (current.entry.disabled) break;\n if (current.expandable && !current.expanded) {\n toggleExpanded(current.entry.path);\n } else if (current.expanded) {\n const firstChild = rows[index + 1];\n if (firstChild && firstChild.parentPath === current.entry.path) moveTo(firstChild);\n }\n break;\n case \"ArrowLeft\":\n e.preventDefault();\n if (current.expanded && !current.entry.disabled) {\n toggleExpanded(current.entry.path);\n } else if (current.parentPath) {\n const parent = rows.find((row) => row.entry.path === current.parentPath);\n if (parent) moveTo(parent);\n }\n break;\n case \"Enter\":\n e.preventDefault();\n activate(current);\n break;\n case \" \":\n e.preventDefault();\n if (!current.entry.disabled) selectEntry(current.entry);\n break;\n }\n };\n\n return (\n <div\n role=\"tree\"\n aria-label={ariaLabel}\n aria-multiselectable={multiple || undefined}\n data-react-fancy-file-browser-tree=\"\"\n className={cn(\"min-h-0 flex-1 overflow-auto p-1\", className)}\n onKeyDown={handleKeyDown}\n >\n {/* \"idle\" with a provider renders as loading too: loads fire in an\n effect, so this is what the server (and first client frame) shows\n right before the request starts — keeps SSR + hydration identical. */}\n {rootEntries === undefined && hasProvider && (rootStatus === \"loading\" || rootStatus === \"idle\") && (\n <FileBrowserStatusRow depth={0} kind=\"loading\" />\n )}\n {rootEntries === undefined && rootStatus === \"error\" && (\n <FileBrowserStatusRow\n depth={0}\n kind=\"error\"\n message={errorFor(path)}\n onRetry={() => loadPath(path, { reload: true })}\n />\n )}\n {rootEntries === undefined && rootStatus === \"idle\" && !hasProvider && (\n <FileBrowserStatusRow depth={0} kind=\"unknown\" />\n )}\n {rootEntries !== undefined &&\n (rootChildren.length > 0 ? (\n rootChildren.map((entry) => (\n <FileBrowserNode key={entry.path} entry={entry} depth={0} />\n ))\n ) : (\n <FileBrowserStatusRow depth={0} kind={rootEntries.length === 0 ? \"empty\" : \"no-matches\"} />\n ))}\n </div>\n );\n}\n\nFileBrowserTree.displayName = \"FileBrowserTree\";\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\nimport { FileBrowserContext } from \"./FileBrowser.context\";\nimport { FileBrowserPathBar } from \"./FileBrowserPathBar\";\nimport { FileBrowserToolbar } from \"./FileBrowserToolbar\";\nimport { FileBrowserTree } from \"./FileBrowserTree\";\nimport { FileBrowserNode } from \"./FileBrowserNode\";\nimport {\n compareFileEntries,\n entryMatchesFilter,\n isEntryExpandable,\n parentPath,\n} from \"./FileBrowser.utils\";\nimport type {\n FileBrowserContextValue,\n FileBrowserProps,\n FileBrowserRow,\n FileEntry,\n FileLoadStatus,\n FileSnapshotNode,\n FileSort,\n} from \"./FileBrowser.types\";\n\nconst DEFAULT_SORT: FileSort = { by: \"name\", direction: \"asc\" };\n\nfunction snapshotNodeToEntry(node: FileSnapshotNode): FileEntry {\n const { children: _children, ...entry } = node;\n return entry;\n}\n\n/**\n * Index a snapshot tree into a `parent path -> children` map. Roots group\n * under their own parent path (usually `\"/\"`); any node with a materialized\n * `children` array defines that folder's listing. Dirs with `children`\n * undefined stay unknown — a provider fills them lazily in hybrid mode.\n */\nfunction buildSnapshotMap(snapshot: FileSnapshotNode[] | undefined): Map<string, FileEntry[]> {\n const map = new Map<string, FileEntry[]>();\n if (!snapshot || snapshot.length === 0) return map;\n\n for (const root of snapshot) {\n const parent = parentPath(root.path);\n const list = map.get(parent);\n if (list) list.push(snapshotNodeToEntry(root));\n else map.set(parent, [snapshotNodeToEntry(root)]);\n }\n\n const walk = (nodes: FileSnapshotNode[]) => {\n for (const node of nodes) {\n if (node.children) {\n map.set(node.path, node.children.map(snapshotNodeToEntry));\n walk(node.children);\n }\n }\n };\n walk(snapshot);\n\n return map;\n}\n\n/**\n * FileBrowser — remote-capable file/folder browser + directory picker.\n *\n * Browses any file tree the host can describe — local FS, HTTP, SSH, or a\n * remote machine streaming snapshots — via two feeding modes that may be\n * combined:\n *\n * - **Provider mode (lazy pull):** pass `provider.loadChildren(path)`. Folders\n * load on first expand with per-node loading + error states; the tree is\n * never walked eagerly.\n * - **Snapshot mode (streamed push):** pass a JSON-friendly `snapshot` tree\n * and replace/patch it as chunks arrive (relay / WebSocket / MCP). The\n * snapshot is the source of truth for every path it covers; with a provider\n * also present, unknown-depth folders stay lazily loadable (hybrid).\n *\n * Fully controlled per the Human+ component contract (`value`/`onChange`,\n * `path`/`onPathChange`, `expandedPaths`/`onExpandedChange`, plus\n * `sort`/`filter`), with uncontrolled `defaultX` fallbacks. Every row carries\n * a `data-path` attribute — paths are the stable handles agents target, never\n * indexes or generated ids.\n *\n * Agent bridge sketch (ships later in `@particle-academy/agent-integrations`):\n * `registerFilesBridge(server, { adapter })` will expose MCP tools over this\n * surface — `files_list(path)`, `files_expand(path)` / `files_collapse(path)`,\n * `files_select(paths)`, `files_navigate(path)`, and\n * `files_request_snapshot(path, depth)` — with each mutation emitting an\n * `AgentActivity` event so presence, undo, and coaching layers compose. The\n * adapter maps those tools onto the same controlled props\n * (`value`/`path`/`expandedPaths`) and provider/snapshot contract; no DOM\n * scraping required.\n *\n * Read-only in v1: no content preview (pair with fancy-code's `FileViewer`)\n * and no write operations — rename/delete/upload arrive later behind a\n * `pendingMode`-gated iteration.\n */\nfunction FileBrowserRoot({\n provider,\n snapshot,\n select = \"file\",\n multiple = false,\n value,\n defaultValue,\n onChange,\n path,\n defaultPath = \"/\",\n onPathChange,\n expandedPaths,\n defaultExpandedPaths,\n onExpandedChange,\n sort,\n defaultSort,\n onSortChange,\n filter,\n defaultFilter,\n onFilterChange,\n onError,\n onCreateFolder,\n indentSize = 16,\n showIcons = true,\n className,\n children,\n}: FileBrowserProps) {\n // ---------------------------------------------------------------------------\n // Controlled / uncontrolled state\n // ---------------------------------------------------------------------------\n\n const [currentPath, setCurrentPath] = useControllableState(path, defaultPath, onPathChange);\n const [expanded, setExpanded] = useControllableState(\n expandedPaths,\n defaultExpandedPaths ?? [],\n onExpandedChange,\n );\n const [sortState, setSortState] = useControllableState(sort, defaultSort ?? DEFAULT_SORT, onSortChange);\n const [filterState, setFilterState] = useControllableState(filter, defaultFilter ?? \"\", onFilterChange);\n\n // Selection is managed directly (not via useControllableState) because\n // onChange also receives the matching FileEntry objects.\n const [internalValue, setInternalValue] = useState<string | string[] | null>(\n () => defaultValue ?? (multiple ? [] : null),\n );\n const selection = value !== undefined ? value : internalValue;\n const selectedPaths = useMemo(\n () => (selection == null ? [] : Array.isArray(selection) ? selection : [selection]),\n [selection],\n );\n\n // ---------------------------------------------------------------------------\n // Data layer — snapshot map + lazy provider cache\n // ---------------------------------------------------------------------------\n\n const snapshotMap = useMemo(() => buildSnapshotMap(snapshot), [snapshot]);\n\n const [loadedChildren, setLoadedChildren] = useState<Record<string, FileEntry[]>>({});\n const [loadStatus, setLoadStatus] = useState<Record<string, FileLoadStatus>>({});\n const [loadErrors, setLoadErrors] = useState<Record<string, string>>({});\n\n const seqCounter = useRef(0);\n const requestSeq = useRef<Record<string, number>>({});\n\n // Latest-state refs so `loadPath` stays referentially stable.\n const stateRef = useRef({ snapshotMap, loadedChildren, loadStatus });\n stateRef.current = { snapshotMap, loadedChildren, loadStatus };\n const providerRef = useRef(provider);\n providerRef.current = provider;\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const loadPath = useCallback((targetPath: string, options?: { reload?: boolean }) => {\n const prov = providerRef.current;\n if (!prov) return;\n const { snapshotMap: snap, loadedChildren: loaded, loadStatus: statuses } = stateRef.current;\n const status = statuses[targetPath] ?? \"idle\";\n if (status === \"loading\") return;\n const known = snap.get(targetPath) ?? loaded[targetPath];\n if (!options?.reload && (known !== undefined || status === \"error\")) return;\n\n const requestId = ++seqCounter.current;\n requestSeq.current[targetPath] = requestId;\n setLoadStatus((prev) => ({ ...prev, [targetPath]: \"loading\" }));\n\n prov.loadChildren(targetPath).then(\n (entries) => {\n if (requestSeq.current[targetPath] !== requestId) return;\n setLoadedChildren((prev) => ({ ...prev, [targetPath]: entries }));\n setLoadStatus((prev) => ({ ...prev, [targetPath]: \"loaded\" }));\n setLoadErrors((prev) => {\n if (!(targetPath in prev)) return prev;\n const next = { ...prev };\n delete next[targetPath];\n return next;\n });\n },\n (error: unknown) => {\n if (requestSeq.current[targetPath] !== requestId) return;\n setLoadStatus((prev) => ({ ...prev, [targetPath]: \"error\" }));\n setLoadErrors((prev) => ({\n ...prev,\n [targetPath]: error instanceof Error ? error.message : String(error),\n }));\n onErrorRef.current?.(targetPath, error);\n },\n );\n }, []);\n\n const entriesFor = useCallback(\n (p: string) => snapshotMap.get(p) ?? loadedChildren[p],\n [snapshotMap, loadedChildren],\n );\n\n const statusFor = useCallback(\n (p: string): FileLoadStatus => {\n if (snapshotMap.has(p)) return \"loaded\";\n const status = loadStatus[p];\n if (status) return status;\n return loadedChildren[p] !== undefined ? \"loaded\" : \"idle\";\n },\n [snapshotMap, loadStatus, loadedChildren],\n );\n\n const errorFor = useCallback((p: string) => loadErrors[p], [loadErrors]);\n\n // Lazy loading — only the current directory and explicitly expanded folders\n // (including expansions driven from outside via the controlled\n // `expandedPaths` prop). Never an eager walk; errored paths wait for an\n // explicit retry.\n useEffect(() => {\n if (!provider) return;\n loadPath(currentPath);\n for (const p of expanded) loadPath(p);\n }, [provider, currentPath, expanded, snapshotMap, loadPath]);\n\n // ---------------------------------------------------------------------------\n // Filter + sort + flattened visible rows\n // ---------------------------------------------------------------------------\n\n const filterLower = filterState.trim().toLowerCase();\n\n const visibleChildrenFor = useCallback(\n (p: string): FileEntry[] => {\n const entries = entriesFor(p);\n if (!entries) return [];\n const filtered = filterLower\n ? entries.filter((entry) => entryMatchesFilter(entry, filterLower, entriesFor))\n : entries.slice();\n return filtered.sort((a, b) => compareFileEntries(a, b, sortState));\n },\n [entriesFor, filterLower, sortState],\n );\n\n const visibleRows = useMemo(() => {\n const rows: FileBrowserRow[] = [];\n const visited = new Set<string>([currentPath]);\n const walk = (p: string, depth: number, parent: string | null) => {\n for (const entry of visibleChildrenFor(p)) {\n const expandable = isEntryExpandable(entry, entriesFor(entry.path), !!provider);\n const isOpen = expandable && expanded.includes(entry.path);\n rows.push({ entry, depth, expandable, expanded: isOpen, parentPath: parent });\n if (isOpen && !visited.has(entry.path)) {\n visited.add(entry.path);\n walk(entry.path, depth + 1, entry.path);\n }\n }\n };\n walk(currentPath, 0, null);\n return rows;\n }, [visibleChildrenFor, entriesFor, provider, expanded, currentPath]);\n\n // ---------------------------------------------------------------------------\n // Selection\n // ---------------------------------------------------------------------------\n\n const entryIndex = useMemo(() => {\n const map = new Map<string, FileEntry>();\n for (const list of snapshotMap.values()) {\n for (const entry of list) map.set(entry.path, entry);\n }\n for (const list of Object.values(loadedChildren)) {\n for (const entry of list) {\n if (!map.has(entry.path)) map.set(entry.path, entry);\n }\n }\n return map;\n }, [snapshotMap, loadedChildren]);\n\n const isSelectable = useCallback(\n (entry: FileEntry) =>\n !entry.disabled &&\n (select === \"both\" || (select === \"file\" ? entry.kind === \"file\" : entry.kind === \"dir\")),\n [select],\n );\n\n const isSelected = useCallback((p: string) => selectedPaths.includes(p), [selectedPaths]);\n\n const commitSelection = useCallback(\n (paths: string[]) => {\n const nextValue = multiple ? paths : (paths[0] ?? null);\n if (value === undefined) setInternalValue(nextValue);\n onChangeRef.current?.(\n nextValue,\n paths\n .map((p) => entryIndex.get(p))\n .filter((entry): entry is FileEntry => entry !== undefined),\n );\n },\n [multiple, value, entryIndex],\n );\n\n const selectEntry = useCallback(\n (entry: FileEntry) => {\n if (!isSelectable(entry)) return;\n if (multiple) {\n commitSelection(\n selectedPaths.includes(entry.path)\n ? selectedPaths.filter((p) => p !== entry.path)\n : [...selectedPaths, entry.path],\n );\n } else {\n commitSelection([entry.path]);\n }\n },\n [isSelectable, multiple, selectedPaths, commitSelection],\n );\n\n // ---------------------------------------------------------------------------\n // Expansion, navigation, roving focus\n // ---------------------------------------------------------------------------\n\n const toggleExpanded = useCallback(\n (p: string) => {\n setExpanded((prev) => (prev.includes(p) ? prev.filter((x) => x !== p) : [...prev, p]));\n },\n [setExpanded],\n );\n\n const [focusedPath, setFocusedPath] = useState<string | null>(null);\n\n const navigate = useCallback(\n (p: string) => {\n setCurrentPath(p);\n setFilterState(\"\");\n setFocusedPath(null);\n },\n [setCurrentPath, setFilterState],\n );\n\n const rowRefs = useRef(new Map<string, HTMLElement>());\n\n const registerRow = useCallback((p: string, el: HTMLElement | null) => {\n if (el) rowRefs.current.set(p, el);\n else rowRefs.current.delete(p);\n }, []);\n\n const focusRow = useCallback((p: string) => {\n rowRefs.current.get(p)?.focus();\n }, []);\n\n const tabFocusPath = useMemo(() => {\n if (focusedPath && visibleRows.some((row) => row.entry.path === focusedPath)) {\n return focusedPath;\n }\n return visibleRows[0]?.entry.path ?? null;\n }, [focusedPath, visibleRows]);\n\n // ---------------------------------------------------------------------------\n // Context + render\n // ---------------------------------------------------------------------------\n\n const ctx = useMemo<FileBrowserContextValue>(\n () => ({\n entriesFor,\n visibleChildrenFor,\n statusFor,\n errorFor,\n loadPath,\n hasProvider: !!provider,\n path: currentPath,\n navigate,\n expandedPaths: expanded,\n toggleExpanded,\n select,\n multiple,\n selectedPaths,\n isSelected,\n isSelectable,\n selectEntry,\n sort: sortState,\n setSort: setSortState,\n filter: filterState,\n setFilter: setFilterState,\n visibleRows,\n focusedPath,\n setFocusedPath,\n tabFocusPath,\n focusRow,\n registerRow,\n indentSize,\n showIcons,\n onCreateFolder,\n }),\n [\n entriesFor, visibleChildrenFor, statusFor, errorFor, loadPath, provider,\n currentPath, navigate, expanded, toggleExpanded, select, multiple,\n selectedPaths, isSelected, isSelectable, selectEntry, sortState,\n setSortState, filterState, setFilterState, visibleRows, focusedPath,\n tabFocusPath, focusRow, registerRow, indentSize, showIcons, onCreateFolder,\n ],\n );\n\n return (\n <FileBrowserContext.Provider value={ctx}>\n <div\n data-react-fancy-file-browser=\"\"\n className={cn(\n \"flex flex-col overflow-hidden rounded-lg border border-zinc-200 bg-white text-sm dark:border-zinc-700 dark:bg-zinc-900\",\n className,\n )}\n >\n {children ?? (\n <>\n <FileBrowserPathBar />\n <FileBrowserToolbar />\n <FileBrowserTree />\n </>\n )}\n </div>\n </FileBrowserContext.Provider>\n );\n}\n\nFileBrowserRoot.displayName = \"FileBrowser\";\n\nexport const FileBrowser = Object.assign(FileBrowserRoot, {\n PathBar: FileBrowserPathBar,\n Toolbar: FileBrowserToolbar,\n Tree: FileBrowserTree,\n Node: FileBrowserNode,\n});\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { inputSizeClasses } from './chunk-GFYSELJF.js';
|
|
2
|
-
import { cn } from './chunk-
|
|
2
|
+
import { cn } from './chunk-MMW2JGKZ.js';
|
|
3
3
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
4
|
|
|
5
5
|
function isEmpty(value) {
|
|
@@ -51,5 +51,5 @@ function DisplayValue({
|
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
export { DisplayValue };
|
|
54
|
-
//# sourceMappingURL=chunk-
|
|
55
|
-
//# sourceMappingURL=chunk-
|
|
54
|
+
//# sourceMappingURL=chunk-KKWNKBKR.js.map
|
|
55
|
+
//# sourceMappingURL=chunk-KKWNKBKR.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/inputs/mode/DisplayValue.tsx"],"names":[],"mappings":";;;;AAsBA,SAAS,QAAQ,KAAA,EAA2B;AAC1C,EAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,EAAA;AAC5D;AAgBO,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,OAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,QAAA;AAAA,EACR,WAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,OAAA,GAAU,QAAQ,QAAQ,CAAA;AAEhC,EAAA,MAAM,SAAA,GAAY,WAAA,GACd,CAAC,CAAA,KAAqC;AACpC,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,UAAA,IAAa;AAAA,IACf;AAAA,EACF,CAAA,GACA,MAAA;AAEJ,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,0BAAA,EAAyB,EAAA;AAAA,MACzB,WAAA,EAAU,MAAA;AAAA,MACV,IAAA,EAAM,cAAc,QAAA,GAAW,MAAA;AAAA,MAC/B,QAAA,EAAU,cAAc,CAAA,GAAI,MAAA;AAAA,MAC5B,KAAA,EAAO,cAAc,eAAA,GAAkB,MAAA;AAAA,MACvC,OAAA,EAAS,cAAc,UAAA,GAAa,MAAA;AAAA,MACpC,SAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,iEAAA;AAAA,QACA,iBAAiB,IAAI,CAAA;AAAA;AAAA,QAErB,8BAAA;AAAA,QACA,WAAA,IACE,+JAAA;AAAA,QACF,OAAA,IAAW,kCAAA;AAAA,QACX;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,OAAA,oBAAW,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAoC,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,4BACvE,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAoB,QAAA,EAAA,OAAA,GAAU,QAAQ,QAAA,EAAS,CAAA;AAAA,QAC9D,QAAA,oBAAY,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAoC,QAAA,EAAA,QAAA,EAAS;AAAA;AAAA;AAAA,GAC5E;AAEJ","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/inputs/mode/DisplayValue.tsx"],"names":[],"mappings":";;;;AAsBA,SAAS,QAAQ,KAAA,EAA2B;AAC1C,EAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,EAAA;AAC5D;AAgBO,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,OAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,QAAA;AAAA,EACR,WAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,OAAA,GAAU,QAAQ,QAAQ,CAAA;AAEhC,EAAA,MAAM,SAAA,GAAY,WAAA,GACd,CAAC,CAAA,KAAqC;AACpC,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,UAAA,IAAa;AAAA,IACf;AAAA,EACF,CAAA,GACA,MAAA;AAEJ,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,0BAAA,EAAyB,EAAA;AAAA,MACzB,WAAA,EAAU,MAAA;AAAA,MACV,IAAA,EAAM,cAAc,QAAA,GAAW,MAAA;AAAA,MAC/B,QAAA,EAAU,cAAc,CAAA,GAAI,MAAA;AAAA,MAC5B,KAAA,EAAO,cAAc,eAAA,GAAkB,MAAA;AAAA,MACvC,OAAA,EAAS,cAAc,UAAA,GAAa,MAAA;AAAA,MACpC,SAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,iEAAA;AAAA,QACA,iBAAiB,IAAI,CAAA;AAAA;AAAA,QAErB,8BAAA;AAAA,QACA,WAAA,IACE,+JAAA;AAAA,QACF,OAAA,IAAW,kCAAA;AAAA,QACX;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,OAAA,oBAAW,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAoC,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,4BACvE,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAoB,QAAA,EAAA,OAAA,GAAU,QAAQ,QAAA,EAAS,CAAA;AAAA,QAC9D,QAAA,oBAAY,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAoC,QAAA,EAAA,QAAA,EAAS;AAAA;AAAA;AAAA,GAC5E;AAEJ","file":"chunk-KKWNKBKR.js","sourcesContent":["import type { KeyboardEvent, ReactNode } from \"react\";\nimport { cn } from \"../../../utils/cn\";\nimport type { Size } from \"../../../utils/types\";\nimport { inputSizeClasses } from \"../inputs.utils\";\n\nexport interface DisplayValueProps {\n /** The formatted value to show. Empty / null / undefined renders `empty`. */\n children?: ReactNode;\n size?: Size;\n /** Static adornment rendered before the value (mirrors an input's `leading`/`prefix`). */\n leading?: ReactNode;\n /** Static adornment rendered after the value (mirrors an input's `trailing`/`suffix`). */\n trailing?: ReactNode;\n /** Shown when the value is empty. Default `—`. */\n empty?: ReactNode;\n /** When true the value is clickable to enter edit mode (inline click-to-edit). */\n interactive?: boolean;\n /** Called when an interactive value is activated (click / Enter / Space). */\n onActivate?: () => void;\n className?: string;\n}\n\nfunction isEmpty(value: ReactNode): boolean {\n return value === null || value === undefined || value === \"\";\n}\n\n/**\n * The read-only counterpart to an `<input>`. Renders a non-interactive value\n * with the same size rhythm as the editable control (reusing\n * {@link inputSizeClasses}) but without the border / background / focus ring.\n *\n * When `interactive` (inline click-to-edit), the value becomes a focusable,\n * hoverable target that calls `onActivate` on click / Enter / Space to swap in\n * the real control. Dropped into the SAME `Field` wrapper the editable control\n * uses, so label / description / error chrome stays byte-identical between the\n * display and the editor.\n *\n * Carries `data-react-fancy-display` / `data-mode=\"view\"` stable handles for\n * agents and tests (Human+ contract).\n */\nexport function DisplayValue({\n children,\n size = \"md\",\n leading,\n trailing,\n empty = \"—\",\n interactive,\n onActivate,\n className,\n}: DisplayValueProps) {\n const empties = isEmpty(children);\n\n const onKeyDown = interactive\n ? (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onActivate?.();\n }\n }\n : undefined;\n\n return (\n <div\n data-react-fancy-display=\"\"\n data-mode=\"view\"\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n title={interactive ? \"Click to edit\" : undefined}\n onClick={interactive ? onActivate : undefined}\n onKeyDown={onKeyDown}\n className={cn(\n \"flex w-full items-center gap-2 text-zinc-900 dark:text-zinc-100\",\n inputSizeClasses[size],\n // Strip the editable box look — keep only the size/padding rhythm.\n \"border-0 bg-transparent px-0\",\n interactive &&\n \"-mx-2 cursor-text rounded-md px-2 outline-none transition-colors hover:bg-zinc-100 focus-visible:ring-2 focus-visible:ring-blue-500/40 dark:hover:bg-zinc-800\",\n empties && \"text-zinc-400 dark:text-zinc-500\",\n className,\n )}\n >\n {leading && <span className=\"text-zinc-400 dark:text-zinc-500\">{leading}</span>}\n <span className=\"min-w-0 truncate\">{empties ? empty : children}</span>\n {trailing && <span className=\"text-zinc-400 dark:text-zinc-500\">{trailing}</span>}\n </div>\n );\n}\n"]}
|