@banzamel/mineralui 2.1.1 → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/{MAvatar-BcO8hMnU.js → MAvatar-DtJCj3dD.js} +1 -1
- package/dist/{MAvatar-BcO8hMnU.js.map → MAvatar-DtJCj3dD.js.map} +1 -1
- package/dist/{MAvatar-C4N2ztLf.cjs → MAvatar-bUWENcq-.cjs} +2 -2
- package/dist/{MAvatar-C4N2ztLf.cjs.map → MAvatar-bUWENcq-.cjs.map} +1 -1
- package/dist/{MButton-B8kFTOPJ.cjs → MButton-R08y1HCT.cjs} +2 -2
- package/dist/{MButton-B8kFTOPJ.cjs.map → MButton-R08y1HCT.cjs.map} +1 -1
- package/dist/{MButtonGroup-C3Ar0gfk.cjs → MButtonGroup-C-LiXWRC.cjs} +2 -2
- package/dist/{MButtonGroup-C3Ar0gfk.cjs.map → MButtonGroup-C-LiXWRC.cjs.map} +1 -1
- package/dist/{MCard-szs5kIek.cjs → MCard-1OVOl4Ql.cjs} +2 -2
- package/dist/{MCard-szs5kIek.cjs.map → MCard-1OVOl4Ql.cjs.map} +1 -1
- package/dist/{MCard-dLMQQ97e.js → MCard-azpp4YVD.js} +1 -1
- package/dist/{MCard-dLMQQ97e.js.map → MCard-azpp4YVD.js.map} +1 -1
- package/dist/{MCheckbox-CATWU11D.cjs → MCheckbox-CM5HJQWW.cjs} +2 -2
- package/dist/{MCheckbox-CATWU11D.cjs.map → MCheckbox-CM5HJQWW.cjs.map} +1 -1
- package/dist/{MConflictIllustration-Mnz1q7Ey.cjs → MConflictIllustration-B2AtfpYO.cjs} +2 -2
- package/dist/{MConflictIllustration-Mnz1q7Ey.cjs.map → MConflictIllustration-B2AtfpYO.cjs.map} +1 -1
- package/dist/{MDetailList-BBgUaSDJ.cjs → MDetailList-BhKBJwpd.cjs} +2 -2
- package/dist/{MDetailList-BBgUaSDJ.cjs.map → MDetailList-BhKBJwpd.cjs.map} +1 -1
- package/dist/{MDetailList-zlwdeA-r.js → MDetailList-BjvZUyNj.js} +2 -2
- package/dist/{MDetailList-zlwdeA-r.js.map → MDetailList-BjvZUyNj.js.map} +1 -1
- package/dist/{MDropdownMenu-omTEUh4V.js → MDropdownMenu-CZmU3uku.js} +1 -1
- package/dist/{MDropdownMenu-omTEUh4V.js.map → MDropdownMenu-CZmU3uku.js.map} +1 -1
- package/dist/{MDropdownMenu-1RqWjxHp.cjs → MDropdownMenu-hXaIMkAj.cjs} +2 -2
- package/dist/{MDropdownMenu-1RqWjxHp.cjs.map → MDropdownMenu-hXaIMkAj.cjs.map} +1 -1
- package/dist/{MGrid-B2qzYD6S.cjs → MGrid-B_0kFUws.cjs} +2 -2
- package/dist/{MGrid-B2qzYD6S.cjs.map → MGrid-B_0kFUws.cjs.map} +1 -1
- package/dist/{MGrid-Cy44dWyC.js → MGrid-CYL3cbUI.js} +1 -1
- package/dist/{MGrid-Cy44dWyC.js.map → MGrid-CYL3cbUI.js.map} +1 -1
- package/dist/{MHeading-CyuxSnhl.cjs → MHeading-BLnb3dNv.cjs} +2 -2
- package/dist/{MHeading-CyuxSnhl.cjs.map → MHeading-BLnb3dNv.cjs.map} +1 -1
- package/dist/{MI18nProvider-C90EVyFz.cjs → MI18nProvider-Cg-vxV6j.cjs} +2 -2
- package/dist/{MI18nProvider-C90EVyFz.cjs.map → MI18nProvider-Cg-vxV6j.cjs.map} +1 -1
- package/dist/{MInput-Cw9ZVcNO.cjs → MInput-BhTAfpYS.cjs} +2 -2
- package/dist/{MInput-Cw9ZVcNO.cjs.map → MInput-BhTAfpYS.cjs.map} +1 -1
- package/dist/{MInput-Baokf17V.js → MInput-CgtX0fUN.js} +1 -1
- package/dist/{MInput-Baokf17V.js.map → MInput-CgtX0fUN.js.map} +1 -1
- package/dist/{MInputCVC-DNzDAbfU.js → MInputCVC-BGYhUGDE.js} +3 -3
- package/dist/{MInputCVC-DNzDAbfU.js.map → MInputCVC-BGYhUGDE.js.map} +1 -1
- package/dist/{MInputCVC-Bqcp5Uu3.cjs → MInputCVC-E2Z2hYfy.cjs} +2 -2
- package/dist/{MInputCVC-Bqcp5Uu3.cjs.map → MInputCVC-E2Z2hYfy.cjs.map} +1 -1
- package/dist/{MInputSearch-D9bp1QAz.cjs → MInputSearch-DE9Jqp0i.cjs} +2 -2
- package/dist/{MInputSearch-D9bp1QAz.cjs.map → MInputSearch-DE9Jqp0i.cjs.map} +1 -1
- package/dist/{MInputSearch-Bswi-Kj0.js → MInputSearch-DEr5HBgw.js} +2 -2
- package/dist/{MInputSearch-Bswi-Kj0.js.map → MInputSearch-DEr5HBgw.js.map} +1 -1
- package/dist/{MKbd-CiwDwFwA.cjs → MKbd-n4fhKIxb.cjs} +2 -2
- package/dist/{MKbd-CiwDwFwA.cjs.map → MKbd-n4fhKIxb.cjs.map} +1 -1
- package/dist/{MLink-B7gXA8qY.cjs → MLink-Biipj7xz.cjs} +2 -2
- package/dist/{MLink-B7gXA8qY.cjs.map → MLink-Biipj7xz.cjs.map} +1 -1
- package/dist/MLoader-CnvWqFtA.js +41 -0
- package/dist/MLoader-CnvWqFtA.js.map +1 -0
- package/dist/MLoader-XcpKlLrd.cjs +2 -0
- package/dist/MLoader-XcpKlLrd.cjs.map +1 -0
- package/dist/{MPagination-DpUtB6t6.js → MPagination-7yTbB8dZ.js} +1 -1
- package/dist/{MPagination-DpUtB6t6.js.map → MPagination-7yTbB8dZ.js.map} +1 -1
- package/dist/{MPagination-C2GmGkVA.cjs → MPagination-DTqT33Mx.cjs} +2 -2
- package/dist/{MPagination-C2GmGkVA.cjs.map → MPagination-DTqT33Mx.cjs.map} +1 -1
- package/dist/{MPopover-BVBN5SJi.cjs → MPopover-hDqrn317.cjs} +2 -2
- package/dist/{MPopover-BVBN5SJi.cjs.map → MPopover-hDqrn317.cjs.map} +1 -1
- package/dist/{MPortal-Djrw2WhD.cjs → MPortal-BciZHNDC.cjs} +2 -2
- package/dist/{MPortal-Djrw2WhD.cjs.map → MPortal-BciZHNDC.cjs.map} +1 -1
- package/dist/{MSimpleGrid-BVeCK9Ci.js → MSimpleGrid-BWKurW6H.js} +1 -1
- package/dist/{MSimpleGrid-BVeCK9Ci.js.map → MSimpleGrid-BWKurW6H.js.map} +1 -1
- package/dist/{MSimpleGrid-BR352NiK.cjs → MSimpleGrid-BwNfaxQP.cjs} +2 -2
- package/dist/{MSimpleGrid-BR352NiK.cjs.map → MSimpleGrid-BwNfaxQP.cjs.map} +1 -1
- package/dist/{MSkeleton-DyQBeuVT.cjs → MSkeleton-CLSU5pL6.cjs} +2 -2
- package/dist/{MSkeleton-DyQBeuVT.cjs.map → MSkeleton-CLSU5pL6.cjs.map} +1 -1
- package/dist/{MSlider-Ds2Fls86.cjs → MSlider-DZnMB49q.cjs} +2 -2
- package/dist/{MSlider-Ds2Fls86.cjs.map → MSlider-DZnMB49q.cjs.map} +1 -1
- package/dist/{MStack-BdVvJN5S.cjs → MStack-BP_BUeCc.cjs} +2 -2
- package/dist/{MStack-BdVvJN5S.cjs.map → MStack-BP_BUeCc.cjs.map} +1 -1
- package/dist/{MStack-h11pHEmc.js → MStack-CSCw6to2.js} +1 -1
- package/dist/{MStack-h11pHEmc.js.map → MStack-CSCw6to2.js.map} +1 -1
- package/dist/{MSubText-DWNMJupD.cjs → MSubText-VHsgFsv2.cjs} +2 -2
- package/dist/{MSubText-DWNMJupD.cjs.map → MSubText-VHsgFsv2.cjs.map} +1 -1
- package/dist/{MSurface-BS9l7GDH.cjs → MSurface-CYeVFOw_.cjs} +2 -2
- package/dist/{MSurface-BS9l7GDH.cjs.map → MSurface-CYeVFOw_.cjs.map} +1 -1
- package/dist/{MTag-BwQbycZO.cjs → MTag-BtlOVMRl.cjs} +2 -2
- package/dist/{MTag-BwQbycZO.cjs.map → MTag-BtlOVMRl.cjs.map} +1 -1
- package/dist/{MText-Cjt1oTPr.cjs → MText-j6Zbbj5Y.cjs} +2 -2
- package/dist/{MText-Cjt1oTPr.cjs.map → MText-j6Zbbj5Y.cjs.map} +1 -1
- package/dist/{MTooltip-gpvKWQzD.cjs → MTooltip-BEfO9jTe.cjs} +2 -2
- package/dist/{MTooltip-gpvKWQzD.cjs.map → MTooltip-BEfO9jTe.cjs.map} +1 -1
- package/dist/{MTooltip-Ctyjwxv-.js → MTooltip-BTJkzOah.js} +1 -1
- package/dist/{MTooltip-Ctyjwxv-.js.map → MTooltip-BTJkzOah.js.map} +1 -1
- package/dist/{MTreeView-BS60bIj7.cjs → MTreeView-1IqmVPMv.cjs} +2 -2
- package/dist/{MTreeView-BS60bIj7.cjs.map → MTreeView-1IqmVPMv.cjs.map} +1 -1
- package/dist/{MTreeView-DTsi4bye.js → MTreeView-DQaRF0ty.js} +1 -1
- package/dist/{MTreeView-DTsi4bye.js.map → MTreeView-DQaRF0ty.js.map} +1 -1
- package/dist/{arduino-CA8n1Qq3.cjs → arduino-DdDHMIWB.cjs} +1 -1
- package/dist/{arduino-CA8n1Qq3.cjs.map → arduino-DdDHMIWB.cjs.map} +1 -1
- package/dist/{arduino-WKgN2ikT.js → arduino-UeOrXakL.js} +1 -1
- package/dist/{arduino-WKgN2ikT.js.map → arduino-UeOrXakL.js.map} +1 -1
- package/dist/{bash-DObE5DDq.cjs → bash-B17_F5Sw.cjs} +1 -1
- package/dist/{bash-DObE5DDq.cjs.map → bash-B17_F5Sw.cjs.map} +1 -1
- package/dist/{bash-vBtVVub9.js → bash-CrHemXky.js} +1 -1
- package/dist/{bash-vBtVVub9.js.map → bash-CrHemXky.js.map} +1 -1
- package/dist/{c-7RiNX--m.js → c-D9302r2r.js} +1 -1
- package/dist/{c-7RiNX--m.js.map → c-D9302r2r.js.map} +1 -1
- package/dist/{c-Bb-MtVny.cjs → c-ODLxeMV_.cjs} +1 -1
- package/dist/{c-Bb-MtVny.cjs.map → c-ODLxeMV_.cjs.map} +1 -1
- package/dist/cards-BBYh24NQ.cjs +2 -0
- package/dist/cards-BBYh24NQ.cjs.map +1 -0
- package/dist/{cards-BkRqUJ2V.js → cards-Du2kX3Br.js} +377 -359
- package/dist/{cards-BkRqUJ2V.js.map → cards-Du2kX3Br.js.map} +1 -1
- package/dist/cards.cjs +1 -1
- package/dist/cards.js +2 -2
- package/dist/components/cards/MCardGrid/MCardGrid.d.ts +1 -1
- package/dist/components/cards/MCardGrid/MCardGrid.types.d.ts +16 -0
- package/dist/components/data/MDataTable/MDataTable.d.ts +1 -1
- package/dist/components/data/MDataTable/MDataTable.types.d.ts +16 -0
- package/dist/components/data/useMCardGrid.d.ts +2 -0
- package/dist/components/data/useMTable.d.ts +2 -0
- package/dist/{controls-CSTIosnc.js → controls-Cbv4FmNq.js} +2 -2
- package/dist/{controls-CSTIosnc.js.map → controls-Cbv4FmNq.js.map} +1 -1
- package/dist/{controls-BopaNWb_.cjs → controls-DrdHBBtm.cjs} +2 -2
- package/dist/{controls-BopaNWb_.cjs.map → controls-DrdHBBtm.cjs.map} +1 -1
- package/dist/controls.cjs +1 -1
- package/dist/controls.js +1 -1
- package/dist/{core-o3cw16Db.cjs → core-DBpQf3uY.cjs} +1 -1
- package/dist/{core-o3cw16Db.cjs.map → core-DBpQf3uY.cjs.map} +1 -1
- package/dist/{core-DC6zSfZo.js → core-yRqh2XLu.js} +1 -1
- package/dist/{core-DC6zSfZo.js.map → core-yRqh2XLu.js.map} +1 -1
- package/dist/{cpp-CaNnFjgy.js → cpp-CLYSpJBB.js} +1 -1
- package/dist/{cpp-CaNnFjgy.js.map → cpp-CLYSpJBB.js.map} +1 -1
- package/dist/{cpp-BVKrJvso.cjs → cpp-DuTgLZC1.cjs} +1 -1
- package/dist/{cpp-BVKrJvso.cjs.map → cpp-DuTgLZC1.cjs.map} +1 -1
- package/dist/{css-NqBDP7ZC.js → css-BgGh0eG1.js} +1 -1
- package/dist/{css-NqBDP7ZC.js.map → css-BgGh0eG1.js.map} +1 -1
- package/dist/{css-C2sjPfLl.cjs → css-D0f-qByc.cjs} +1 -1
- package/dist/{css-C2sjPfLl.cjs.map → css-D0f-qByc.cjs.map} +1 -1
- package/dist/data-BgTkBMkP.js +674 -0
- package/dist/data-BgTkBMkP.js.map +1 -0
- package/dist/data-Csb03WFo.cjs +2 -0
- package/dist/data-Csb03WFo.cjs.map +1 -0
- package/dist/data.cjs +1 -1
- package/dist/data.js +2 -2
- package/dist/{display-B7Wh5nnM.js → display-D9H8MP8D.js} +15 -15
- package/dist/{display-B7Wh5nnM.js.map → display-D9H8MP8D.js.map} +1 -1
- package/dist/{display-BgZbdTDd.cjs → display-IMWtdmxS.cjs} +2 -2
- package/dist/{display-BgZbdTDd.cjs.map → display-IMWtdmxS.cjs.map} +1 -1
- package/dist/display.cjs +1 -1
- package/dist/display.js +2 -2
- package/dist/{dropdowns-Befc3lmC.cjs → dropdowns-D_nUdflh.cjs} +2 -2
- package/dist/{dropdowns-Befc3lmC.cjs.map → dropdowns-D_nUdflh.cjs.map} +1 -1
- package/dist/{dropdowns-DGvRs-VE.js → dropdowns-oj4--GbK.js} +3 -3
- package/dist/{dropdowns-DGvRs-VE.js.map → dropdowns-oj4--GbK.js.map} +1 -1
- package/dist/dropdowns.cjs +1 -1
- package/dist/dropdowns.js +1 -1
- package/dist/{feedback-C445FEHb.js → feedback-D7BTlioj.js} +79 -114
- package/dist/feedback-D7BTlioj.js.map +1 -0
- package/dist/feedback-u1ssUT7e.cjs +2 -0
- package/dist/{feedback-C8RfsfYJ.cjs.map → feedback-u1ssUT7e.cjs.map} +1 -1
- package/dist/feedback.cjs +1 -1
- package/dist/feedback.js +5 -4
- package/dist/{form-DSlAmTT1.cjs → form-BWGLrCPi.cjs} +2 -2
- package/dist/{form-DSlAmTT1.cjs.map → form-BWGLrCPi.cjs.map} +1 -1
- package/dist/{form-BWWLNji0.js → form-CgH1hioG.js} +1 -1
- package/dist/{form-BWWLNji0.js.map → form-CgH1hioG.js.map} +1 -1
- package/dist/form.cjs +1 -1
- package/dist/form.js +1 -1
- package/dist/i18n.cjs +1 -1
- package/dist/{icons-DX_cScBq.cjs → icons-BfdQ45F2.cjs} +2 -2
- package/dist/{icons-DX_cScBq.cjs.map → icons-BfdQ45F2.cjs.map} +1 -1
- package/dist/icons.cjs +1 -1
- package/dist/illustrations.cjs +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +31 -30
- package/dist/{inputs-BZxorlLv.js → inputs-DQrjGfwd.js} +2 -2
- package/dist/{inputs-BZxorlLv.js.map → inputs-DQrjGfwd.js.map} +1 -1
- package/dist/{inputs-BiZXyZSE.cjs → inputs-DsFdc0Io.cjs} +2 -2
- package/dist/{inputs-BiZXyZSE.cjs.map → inputs-DsFdc0Io.cjs.map} +1 -1
- package/dist/inputs.cjs +1 -1
- package/dist/inputs.js +4 -4
- package/dist/{javascript-BgwyrBZi.cjs → javascript-CGjvHPZ1.cjs} +1 -1
- package/dist/{javascript-BgwyrBZi.cjs.map → javascript-CGjvHPZ1.cjs.map} +1 -1
- package/dist/{javascript-BltQGQAn.js → javascript-CX3JhsYu.js} +1 -1
- package/dist/{javascript-BltQGQAn.js.map → javascript-CX3JhsYu.js.map} +1 -1
- package/dist/{json-DWmLrT_r.cjs → json-B8svQsK0.cjs} +1 -1
- package/dist/{json-DWmLrT_r.cjs.map → json-B8svQsK0.cjs.map} +1 -1
- package/dist/{json-DbCISZXi.js → json-BPIcVdlp.js} +1 -1
- package/dist/{json-DbCISZXi.js.map → json-BPIcVdlp.js.map} +1 -1
- package/dist/{layout-Ct6ViwDQ.cjs → layout-B_2yBP1M.cjs} +2 -2
- package/dist/{layout-Ct6ViwDQ.cjs.map → layout-B_2yBP1M.cjs.map} +1 -1
- package/dist/{layout-CnEOTJnJ.js → layout-BuvV-N9H.js} +4 -4
- package/dist/{layout-CnEOTJnJ.js.map → layout-BuvV-N9H.js.map} +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +5 -5
- package/dist/{licensing-hMT26Vnv.cjs → licensing-DysMClel.cjs} +2 -2
- package/dist/{licensing-hMT26Vnv.cjs.map → licensing-DysMClel.cjs.map} +1 -1
- package/dist/{locale-BNyzqXAU.js → locale-CS1-IY_I.js} +1 -1
- package/dist/{locale-BNyzqXAU.js.map → locale-CS1-IY_I.js.map} +1 -1
- package/dist/{locale-C5ik0c3d.cjs → locale-CbnstsMH.cjs} +2 -2
- package/dist/{locale-C5ik0c3d.cjs.map → locale-CbnstsMH.cjs.map} +1 -1
- package/dist/{media-DxnELIZO.js → media-5IsYrhIQ.js} +1 -1
- package/dist/{media-DxnELIZO.js.map → media-5IsYrhIQ.js.map} +1 -1
- package/dist/{media-DZaGKh5V.cjs → media-Xt6MkVhb.cjs} +2 -2
- package/dist/{media-DZaGKh5V.cjs.map → media-Xt6MkVhb.cjs.map} +1 -1
- package/dist/media.cjs +1 -1
- package/dist/media.js +2 -2
- package/dist/{overlays-WsQqxqk1.cjs → overlays-BAJDNT1m.cjs} +2 -2
- package/dist/{overlays-WsQqxqk1.cjs.map → overlays-BAJDNT1m.cjs.map} +1 -1
- package/dist/{overlays-BfIrSHDo.js → overlays-WA3jnWTG.js} +6 -6
- package/dist/{overlays-BfIrSHDo.js.map → overlays-WA3jnWTG.js.map} +1 -1
- package/dist/overlays.cjs +1 -1
- package/dist/overlays.js +3 -3
- package/dist/{php-dSXzrC_Z.js → php-CBRzjinf.js} +1 -1
- package/dist/{php-dSXzrC_Z.js.map → php-CBRzjinf.js.map} +1 -1
- package/dist/{php-CssmZWrI.cjs → php-CKyelegh.cjs} +1 -1
- package/dist/{php-CssmZWrI.cjs.map → php-CKyelegh.cjs.map} +1 -1
- package/dist/primitives.cjs +1 -1
- package/dist/style-runtime.cjs +1 -1
- package/dist/style-runtime.js +1 -1
- package/dist/styles.css +1 -1
- package/dist/{theme-DltOEniv.cjs → theme-BfNZicWk.cjs} +2 -2
- package/dist/{theme-DltOEniv.cjs.map → theme-BfNZicWk.cjs.map} +1 -1
- package/dist/theme.cjs +1 -1
- package/dist/{typescript-DeaMWtYF.cjs → typescript-D6PDzwkM.cjs} +1 -1
- package/dist/{typescript-DeaMWtYF.cjs.map → typescript-D6PDzwkM.cjs.map} +1 -1
- package/dist/{typescript-CxKdKTKz.js → typescript-Xt3Sotw5.js} +1 -1
- package/dist/{typescript-CxKdKTKz.js.map → typescript-Xt3Sotw5.js.map} +1 -1
- package/dist/{typography-vZwd5E5h.cjs → typography-Dk9kIORI.cjs} +2 -2
- package/dist/{typography-vZwd5E5h.cjs.map → typography-Dk9kIORI.cjs.map} +1 -1
- package/dist/typography.cjs +1 -1
- package/dist/{useGhostText-Nw9XCpWS.cjs → useGhostText-Dmkw3Am8.cjs} +2 -2
- package/dist/{useGhostText-Nw9XCpWS.cjs.map → useGhostText-Dmkw3Am8.cjs.map} +1 -1
- package/dist/{useInteractionEffect-Gs9HBi2T.cjs → useInteractionEffect-DFTdcWHl.cjs} +2 -2
- package/dist/{useInteractionEffect-Gs9HBi2T.cjs.map → useInteractionEffect-DFTdcWHl.cjs.map} +1 -1
- package/dist/{useKeyboardNav-DDN-oeqd.cjs → useKeyboardNav-HVG9JFD2.cjs} +2 -2
- package/dist/{useKeyboardNav-DDN-oeqd.cjs.map → useKeyboardNav-HVG9JFD2.cjs.map} +1 -1
- package/dist/utils.cjs +1 -1
- package/dist/{xml-BUuYcpx2.cjs → xml-4YlaGgjP.cjs} +1 -1
- package/dist/{xml-BUuYcpx2.cjs.map → xml-4YlaGgjP.cjs.map} +1 -1
- package/dist/{xml-BPoVPJlJ.js → xml-CrpWqcDk.js} +1 -1
- package/dist/{xml-BPoVPJlJ.js.map → xml-CrpWqcDk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/cards-DK7j03NN.cjs +0 -2
- package/dist/cards-DK7j03NN.cjs.map +0 -1
- package/dist/data-CjVcevdT.js +0 -654
- package/dist/data-CjVcevdT.js.map +0 -1
- package/dist/data-D8qUIvWv.cjs +0 -2
- package/dist/data-D8qUIvWv.cjs.map +0 -1
- package/dist/feedback-C445FEHb.js.map +0 -1
- package/dist/feedback-C8RfsfYJ.cjs +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MText-
|
|
1
|
+
{"version":3,"file":"MText-j6Zbbj5Y.cjs","names":[],"sources":["../src/utils/appearanceProps.ts","../src/components/typography/MText/MText.tsx"],"sourcesContent":["import type {MColor} from '../theme'\n\nexport interface AppearanceProps {\n color?: MColor\n}\n\n// Translate semantic appearance props into shared utility classes.\nexport function getAppearanceClassNames({color}: AppearanceProps): Array<string | false | undefined> {\n return [color && `fcolor-${color}`]\n}\n","import type {MTextProps} from './MText.types'\nimport {getHiddenProps} from '../../../theme'\nimport {cn} from '../../../utils/cn'\nimport {getAppearanceClassNames} from '../../../utils/appearanceProps'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport './MText.css'\n\n// Render body copy with shared tone, size and weight controls.\nexport function MText({\n as = 'p',\n tone = 'default',\n size,\n align = 'left',\n hidden,\n color,\n weight = 'normal',\n truncate,\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n children,\n ...rest\n}: MTextProps) {\n const Component = as\n const utilityStyle = getLayoutUtilityStyles({fsize})\n const lines = typeof truncate === 'number' ? truncate : undefined\n\n return (\n <Component\n className={cn(\n 'text',\n !color && tone,\n size,\n align,\n weight,\n truncate === true && 'truncate',\n lines != null && 'line-clamp',\n ...getAppearanceClassNames({color}),\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{\n ...utilityStyle,\n ...(lines ? ({'--line-clamp': lines} as React.CSSProperties) : undefined),\n ...style,\n }}\n {...getHiddenProps(hidden)}\n {...rest}\n >\n {children}\n </Component>\n )\n}\n"],"mappings":"iLAOA,SAAgB,EAAwB,CAAC,SAA4D,CACjG,MAAO,CAAC,GAAS,UAAU,IAAQ,CCAvC,SAAgB,EAAM,CAClB,KAAK,IACL,OAAO,UACP,OACA,QAAQ,OACR,SACA,QACA,SAAS,SACT,WACA,UACA,UACA,QACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,YACA,YACA,QACA,WACA,GAAG,GACQ,CACX,IAAM,EAAY,EACZ,EAAe,EAAA,EAAuB,CAAC,QAAM,CAAC,CAC9C,EAAQ,OAAO,GAAa,SAAW,EAAW,IAAA,GAExD,OACI,EAAA,EAAA,KAAC,EAAD,CACI,UAAW,EAAA,EACP,OACA,CAAC,GAAS,EACV,EACA,EACA,EACA,IAAa,IAAQ,WACrB,GAAS,MAAQ,aACjB,GAAG,EAAwB,CAAC,QAAM,CAAC,CACnC,GAAG,EAAA,EAA2B,CAC1B,UACA,UACA,QACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,YACH,CAAC,CACF,EACH,CACD,MAAO,CACH,GAAG,EACH,GAAI,EAAS,CAAC,eAAgB,EAAM,CAA2B,IAAA,GAC/D,GAAG,EACN,CACD,GAAI,EAAA,EAAe,EAAO,CAC1B,GAAI,EAEH,WACO,CAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`./cn-CU5TNITO.cjs`),t=require(`./MPortal-
|
|
2
|
-
//# sourceMappingURL=MTooltip-
|
|
1
|
+
const e=require(`./cn-CU5TNITO.cjs`),t=require(`./MPortal-BciZHNDC.cjs`);require(`./core-DBpQf3uY.cjs`);let n=require(`react`),r=require(`react/jsx-runtime`);function i(e,t,n){switch(n){case`bottom`:return{top:e.bottom+6,left:e.left+e.width/2-t.width/2};case`left`:return{top:e.top+e.height/2-t.height/2,left:e.left-t.width-6};case`right`:return{top:e.top+e.height/2-t.height/2,left:e.right+6};default:return{top:e.top-t.height-6,left:e.left+e.width/2-t.width/2}}}function a({content:a,placement:o=`top`,delay:s=0,className:c,children:l,...u}){let[d,f]=(0,n.useState)(!1),[p,m]=(0,n.useState)(null),h=(0,n.useRef)(null),g=(0,n.useRef)(null),_=(0,n.useRef)(null),v=(0,n.useCallback)(()=>{s>0?_.current=setTimeout(()=>f(!0),s):f(!0)},[s]),y=(0,n.useCallback)(()=>{_.current&&=(clearTimeout(_.current),null),f(!1),m(null)},[]);return(0,n.useLayoutEffect)(()=>{!d||!h.current||!g.current||m(i(h.current.getBoundingClientRect(),g.current.getBoundingClientRect(),o))},[d,o]),(0,r.jsxs)(`div`,{ref:h,className:e.t(`tooltip wrapper`,c),onMouseEnter:v,onMouseLeave:y,onFocus:v,onBlur:y,...u,children:[l,d&&(0,r.jsx)(t.t,{children:(0,r.jsx)(`div`,{ref:g,className:e.t(`tooltip bubble`,o),role:`tooltip`,style:p?{top:p.top,left:p.left}:{visibility:`hidden`},children:a})})]})}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return a}});
|
|
2
|
+
//# sourceMappingURL=MTooltip-BEfO9jTe.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MTooltip-
|
|
1
|
+
{"version":3,"file":"MTooltip-BEfO9jTe.cjs","names":[],"sources":["../src/components/overlays/MTooltip/MTooltip.tsx"],"sourcesContent":["import {useRef, useState, useCallback, useLayoutEffect} from 'react'\nimport type {MTooltipProps} from './MTooltip.types'\nimport {cn} from '../../../utils/cn'\nimport {MPortal} from '../../primitives'\nimport './MTooltip.css'\n\nfunction computePosition(trigger: DOMRect, bubble: DOMRect, placement: string): {top: number; left: number} {\n const gap = 6\n switch (placement) {\n case 'bottom':\n return {top: trigger.bottom + gap, left: trigger.left + trigger.width / 2 - bubble.width / 2}\n case 'left':\n return {top: trigger.top + trigger.height / 2 - bubble.height / 2, left: trigger.left - bubble.width - gap}\n case 'right':\n return {top: trigger.top + trigger.height / 2 - bubble.height / 2, left: trigger.right + gap}\n default:\n return {top: trigger.top - bubble.height - gap, left: trigger.left + trigger.width / 2 - bubble.width / 2}\n }\n}\n\nexport function MTooltip({content, placement = 'top', delay = 0, className, children, ...rest}: MTooltipProps) {\n const [visible, setVisible] = useState(false)\n const [pos, setPos] = useState<{top: number; left: number} | null>(null)\n const wrapperRef = useRef<HTMLDivElement>(null)\n const bubbleRef = useRef<HTMLDivElement>(null)\n const timeoutRef = useRef<ReturnType<typeof setTimeout>>(null)\n\n const show = useCallback(() => {\n if (delay > 0) {\n timeoutRef.current = setTimeout(() => setVisible(true), delay)\n } else {\n setVisible(true)\n }\n }, [delay])\n\n const hide = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = null\n }\n setVisible(false)\n setPos(null)\n }, [])\n\n useLayoutEffect(() => {\n if (!visible || !wrapperRef.current || !bubbleRef.current) return\n const triggerRect = wrapperRef.current.getBoundingClientRect()\n const bubbleRect = bubbleRef.current.getBoundingClientRect()\n setPos(computePosition(triggerRect, bubbleRect, placement))\n }, [visible, placement])\n\n return (\n <div\n ref={wrapperRef}\n className={cn('tooltip wrapper', className)}\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocus={show}\n onBlur={hide}\n {...rest}\n >\n {children}\n {visible && (\n <MPortal>\n <div\n ref={bubbleRef}\n className={cn('tooltip bubble', placement)}\n role=\"tooltip\"\n style={pos ? {top: pos.top, left: pos.left} : {visibility: 'hidden'}}\n >\n {content}\n </div>\n </MPortal>\n )}\n </div>\n )\n}\n"],"mappings":"8JAMA,SAAS,EAAgB,EAAkB,EAAiB,EAAgD,CAExG,OAAQ,EAAR,CACI,IAAK,SACD,MAAO,CAAC,IAAK,EAAQ,OAAS,EAAK,KAAM,EAAQ,KAAO,EAAQ,MAAQ,EAAI,EAAO,MAAQ,EAAE,CACjG,IAAK,OACD,MAAO,CAAC,IAAK,EAAQ,IAAM,EAAQ,OAAS,EAAI,EAAO,OAAS,EAAG,KAAM,EAAQ,KAAO,EAAO,MAAQ,EAAI,CAC/G,IAAK,QACD,MAAO,CAAC,IAAK,EAAQ,IAAM,EAAQ,OAAS,EAAI,EAAO,OAAS,EAAG,KAAM,EAAQ,MAAQ,EAAI,CACjG,QACI,MAAO,CAAC,IAAK,EAAQ,IAAM,EAAO,OAAS,EAAK,KAAM,EAAQ,KAAO,EAAQ,MAAQ,EAAI,EAAO,MAAQ,EAAE,EAItH,SAAgB,EAAS,CAAC,UAAS,YAAY,MAAO,QAAQ,EAAG,YAAW,WAAU,GAAG,GAAsB,CAC3G,GAAM,CAAC,EAAS,IAAA,EAAA,EAAA,UAAuB,GAAM,CACvC,CAAC,EAAK,IAAA,EAAA,EAAA,UAAuD,KAAK,CAClE,GAAA,EAAA,EAAA,QAAoC,KAAK,CACzC,GAAA,EAAA,EAAA,QAAmC,KAAK,CACxC,GAAA,EAAA,EAAA,QAAmD,KAAK,CAExD,GAAA,EAAA,EAAA,iBAAyB,CACvB,EAAQ,EACR,EAAW,QAAU,eAAiB,EAAW,GAAK,CAAE,EAAM,CAE9D,EAAW,GAAK,EAErB,CAAC,EAAM,CAAC,CAEL,GAAA,EAAA,EAAA,iBAAyB,CAC3B,AAEI,EAAW,WADX,aAAa,EAAW,QAAQ,CACX,MAEzB,EAAW,GAAM,CACjB,EAAO,KAAK,EACb,EAAE,CAAC,CASN,OAPA,EAAA,EAAA,qBAAsB,CACd,CAAC,GAAW,CAAC,EAAW,SAAW,CAAC,EAAU,SAGlD,EAAO,EAFa,EAAW,QAAQ,uBAAuB,CAC3C,EAAU,QAAQ,uBAAuB,CACZ,EAAU,CAAC,EAC5D,CAAC,EAAS,EAAU,CAAC,EAGpB,EAAA,EAAA,MAAC,MAAD,CACI,IAAK,EACL,UAAW,EAAA,EAAG,kBAAmB,EAAU,CAC3C,aAAc,EACd,aAAc,EACd,QAAS,EACT,OAAQ,EACR,GAAI,WAPR,CASK,EACA,IACG,EAAA,EAAA,KAAC,EAAA,EAAD,CAAA,UACI,EAAA,EAAA,KAAC,MAAD,CACI,IAAK,EACL,UAAW,EAAA,EAAG,iBAAkB,EAAU,CAC1C,KAAK,UACL,MAAO,EAAM,CAAC,IAAK,EAAI,IAAK,KAAM,EAAI,KAAK,CAAG,CAAC,WAAY,SAAS,UAEnE,EACC,CAAA,CACA,CAAA,CAEZ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MTooltip-
|
|
1
|
+
{"version":3,"file":"MTooltip-BTJkzOah.js","names":[],"sources":["../src/components/overlays/MTooltip/MTooltip.tsx"],"sourcesContent":["import {useRef, useState, useCallback, useLayoutEffect} from 'react'\nimport type {MTooltipProps} from './MTooltip.types'\nimport {cn} from '../../../utils/cn'\nimport {MPortal} from '../../primitives'\nimport './MTooltip.css'\n\nfunction computePosition(trigger: DOMRect, bubble: DOMRect, placement: string): {top: number; left: number} {\n const gap = 6\n switch (placement) {\n case 'bottom':\n return {top: trigger.bottom + gap, left: trigger.left + trigger.width / 2 - bubble.width / 2}\n case 'left':\n return {top: trigger.top + trigger.height / 2 - bubble.height / 2, left: trigger.left - bubble.width - gap}\n case 'right':\n return {top: trigger.top + trigger.height / 2 - bubble.height / 2, left: trigger.right + gap}\n default:\n return {top: trigger.top - bubble.height - gap, left: trigger.left + trigger.width / 2 - bubble.width / 2}\n }\n}\n\nexport function MTooltip({content, placement = 'top', delay = 0, className, children, ...rest}: MTooltipProps) {\n const [visible, setVisible] = useState(false)\n const [pos, setPos] = useState<{top: number; left: number} | null>(null)\n const wrapperRef = useRef<HTMLDivElement>(null)\n const bubbleRef = useRef<HTMLDivElement>(null)\n const timeoutRef = useRef<ReturnType<typeof setTimeout>>(null)\n\n const show = useCallback(() => {\n if (delay > 0) {\n timeoutRef.current = setTimeout(() => setVisible(true), delay)\n } else {\n setVisible(true)\n }\n }, [delay])\n\n const hide = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = null\n }\n setVisible(false)\n setPos(null)\n }, [])\n\n useLayoutEffect(() => {\n if (!visible || !wrapperRef.current || !bubbleRef.current) return\n const triggerRect = wrapperRef.current.getBoundingClientRect()\n const bubbleRect = bubbleRef.current.getBoundingClientRect()\n setPos(computePosition(triggerRect, bubbleRect, placement))\n }, [visible, placement])\n\n return (\n <div\n ref={wrapperRef}\n className={cn('tooltip wrapper', className)}\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocus={show}\n onBlur={hide}\n {...rest}\n >\n {children}\n {visible && (\n <MPortal>\n <div\n ref={bubbleRef}\n className={cn('tooltip bubble', placement)}\n role=\"tooltip\"\n style={pos ? {top: pos.top, left: pos.left} : {visibility: 'hidden'}}\n >\n {content}\n </div>\n </MPortal>\n )}\n </div>\n )\n}\n"],"mappings":";;;;;AAMA,SAAS,EAAgB,GAAkB,GAAiB,GAAgD;AAExG,SAAQ,GAAR;EACI,KAAK,SACD,QAAO;GAAC,KAAK,EAAQ,SAAS;GAAK,MAAM,EAAQ,OAAO,EAAQ,QAAQ,IAAI,EAAO,QAAQ;GAAE;EACjG,KAAK,OACD,QAAO;GAAC,KAAK,EAAQ,MAAM,EAAQ,SAAS,IAAI,EAAO,SAAS;GAAG,MAAM,EAAQ,OAAO,EAAO,QAAQ;GAAI;EAC/G,KAAK,QACD,QAAO;GAAC,KAAK,EAAQ,MAAM,EAAQ,SAAS,IAAI,EAAO,SAAS;GAAG,MAAM,EAAQ,QAAQ;GAAI;EACjG,QACI,QAAO;GAAC,KAAK,EAAQ,MAAM,EAAO,SAAS;GAAK,MAAM,EAAQ,OAAO,EAAQ,QAAQ,IAAI,EAAO,QAAQ;GAAE;;;AAItH,SAAgB,EAAS,EAAC,YAAS,eAAY,OAAO,WAAQ,GAAG,cAAW,aAAU,GAAG,KAAsB;CAC3G,IAAM,CAAC,GAAS,KAAc,EAAS,GAAM,EACvC,CAAC,GAAK,KAAU,EAA6C,KAAK,EAClE,IAAa,EAAuB,KAAK,EACzC,IAAY,EAAuB,KAAK,EACxC,IAAa,EAAsC,KAAK,EAExD,IAAO,QAAkB;AAC3B,EAAI,IAAQ,IACR,EAAW,UAAU,iBAAiB,EAAW,GAAK,EAAE,EAAM,GAE9D,EAAW,GAAK;IAErB,CAAC,EAAM,CAAC,EAEL,IAAO,QAAkB;AAM3B,EALA,AAEI,EAAW,aADX,aAAa,EAAW,QAAQ,EACX,OAEzB,EAAW,GAAM,EACjB,EAAO,KAAK;IACb,EAAE,CAAC;AASN,QAPA,QAAsB;AACd,GAAC,KAAW,CAAC,EAAW,WAAW,CAAC,EAAU,WAGlD,EAAO,EAFa,EAAW,QAAQ,uBAAuB,EAC3C,EAAU,QAAQ,uBAAuB,EACZ,EAAU,CAAC;IAC5D,CAAC,GAAS,EAAU,CAAC,EAGpB,kBAAC,OAAD;EACI,KAAK;EACL,WAAW,EAAG,mBAAmB,EAAU;EAC3C,cAAc;EACd,cAAc;EACd,SAAS;EACT,QAAQ;EACR,GAAI;YAPR,CASK,GACA,KACG,kBAAC,GAAD,EAAA,UACI,kBAAC,OAAD;GACI,KAAK;GACL,WAAW,EAAG,kBAAkB,EAAU;GAC1C,MAAK;GACL,OAAO,IAAM;IAAC,KAAK,EAAI;IAAK,MAAM,EAAI;IAAK,GAAG,EAAC,YAAY,UAAS;aAEnE;GACC,CAAA,EACA,CAAA,CAEZ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`./icons-
|
|
2
|
-
//# sourceMappingURL=MTreeView-
|
|
1
|
+
const e=require(`./icons-BfdQ45F2.cjs`),t=require(`./cn-CU5TNITO.cjs`),n=require(`./MPortal-BciZHNDC.cjs`),r=require(`./MCheckbox-CM5HJQWW.cjs`);require(`./core-DBpQf3uY.cjs`);let i=require(`react`),a=require(`react/jsx-runtime`);var o={pdf:(0,a.jsx)(e.li,{}),ts:(0,a.jsx)(e.Qr,{}),tsx:(0,a.jsx)(e.$r,{}),js:(0,a.jsx)(e.Br,{}),jsx:(0,a.jsx)(e.si,{}),css:(0,a.jsx)(e.Nr,{}),scss:(0,a.jsx)(e.Nr,{}),html:(0,a.jsx)(e.Rr,{}),json:(0,a.jsx)(e.Vr,{}),md:(0,a.jsx)(e.Ur,{}),txt:(0,a.jsx)(e.ei,{}),csv:(0,a.jsx)(e.Pr,{}),zip:(0,a.jsx)(e.ii,{}),rar:(0,a.jsx)(e.Xr,{}),svg:(0,a.jsx)(e.Zr,{}),png:(0,a.jsx)(e.Jr,{}),jpg:(0,a.jsx)(e.zr,{}),jpeg:(0,a.jsx)(e.ci,{}),gif:(0,a.jsx)(e.Lr,{}),webp:(0,a.jsx)(e.ti,{}),php:(0,a.jsx)(e.qr,{}),xml:(0,a.jsx)(e.ri,{}),xls:(0,a.jsx)(e.ni,{}),ppt:(0,a.jsx)(e.Yr,{}),odt:(0,a.jsx)(e.Kr,{}),exe:(0,a.jsx)(e.Ir,{}),mp3:(0,a.jsx)(e.Wr,{}),mp4:(0,a.jsx)(e.Gr,{})};function s(e){let t=e.lastIndexOf(`.`);return t<1?null:e.slice(t+1).toLowerCase()}function c(e){return e.kind===`folder`||!!e.children?.length}function l(t){let n=s(t);return n?o[n]??(0,a.jsx)(e.ui,{}):(0,a.jsx)(e.pi,{})}function ee(t,n,r){return t.icon?t.icon:r?c(t)?n?(0,a.jsx)(e.jr,{}):(0,a.jsx)(e.Mr,{}):l(t.label):null}function u(e){let t=new Map,n=new Map,r=new Map;function i(e){t.set(e.id,e);let a=new Set;for(let t of e.children??[])r.set(t.id,e.id),a.add(t.id),i(t).forEach(e=>a.add(e));return n.set(e.id,a),a}return e.forEach(i),{nodeMap:t,descendants:n,parentMap:r}}function d(e,t){let n=new Set;function r(e){if(!e.children?.length)return t.has(e.id)?{checked:1,total:1}:{checked:0,total:1};let i=0,a=0;for(let t of e.children){let e=r(t);i+=e.checked,a+=e.total}return i>0&&i<a&&n.add(e.id),{checked:i,total:a}}return e.forEach(r),n}function f(e,t){return typeof window>`u`?{x:e,y:t}:{x:Math.max(8,Math.min(e,window.innerWidth-220)),y:Math.max(8,Math.min(t,window.innerHeight-16))}}function p({node:n,color:i,level:o,expandable:s,selectable:l,expandedIds:u,selectedId:d,draggedId:f,dropTargetId:m,onToggle:h,onSelect:g,checkable:_,checkedIds:v,indeterminateIds:y,onCheck:b,indent:x,showLines:S,fileIcons:C,draggable:w,canDropOnNode:T,onContextMenu:E,onDragStart:D,onDragOver:O,onDrop:k,onDragEnd:A}){let j=c(n),M=u.has(n.id),N=d===n.id,P=f===n.id,te=m===n.id,F=T?.(n),I=ee(n,M,!!C),L=v?.has(n.id)??!1,R=y?.has(n.id)??!1;return(0,a.jsxs)(`li`,{role:`treeitem`,"aria-expanded":j?M:void 0,children:[(0,a.jsxs)(`div`,{className:t.t(`item`,N&&`selected`,n.disabled&&`disabled`,l&&!n.disabled&&`selectable`,w&&!n.disabled&&`draggable`,P&&`dragging`,F&&`can-drop`,te&&`drop-target`),"data-color":i,style:{paddingLeft:o*x},draggable:w&&!n.disabled,onClick:()=>{n.disabled||(j&&s&&h(n.id),l&&g?.(n.id,n))},onContextMenu:e=>E?.(e,n),onDragStart:e=>D?.(e,n),onDragOver:e=>O?.(e,n),onDrop:e=>k?.(e,n),onDragEnd:A,children:[(0,a.jsx)(`span`,{className:`toggle`,children:j&&s?(0,a.jsx)(`span`,{className:t.t(`arrow`,M&&`expanded`),children:(0,a.jsx)(e.Ui,{})}):(0,a.jsx)(`span`,{className:`spacer`})}),_&&(0,a.jsx)(`span`,{className:`check`,onClick:e=>e.stopPropagation(),children:(0,a.jsx)(r.t,{size:`sm`,clickEffect:`none`,disabled:n.disabled,checked:L,indeterminate:R,onChange:()=>b?.(n.id)})}),I&&(0,a.jsx)(`span`,{className:`icon`,children:I}),(0,a.jsx)(`span`,{className:`label`,children:n.label})]}),j&&M&&(0,a.jsx)(`ul`,{className:`list`,role:`group`,style:S?{"--line-left":`${o*x+17}px`}:void 0,children:(n.children??[]).map(e=>(0,a.jsx)(p,{node:e,color:i,level:o+1,expandable:s,selectable:l,expandedIds:u,selectedId:d,draggedId:f,dropTargetId:m,onToggle:h,onSelect:g,checkable:_,checkedIds:v,indeterminateIds:y,onCheck:b,indent:x,showLines:S,fileIcons:C,draggable:w,canDropOnNode:T,onContextMenu:E,onDragStart:D,onDragOver:O,onDrop:k,onDragEnd:A},e.id))})]})}function m({items:e,color:r=`primary`,expandable:o=!0,selectable:s=!1,defaultExpanded:l=[],expanded:ee,onExpandChange:m,selected:h,onSelect:g,checkable:_=!1,defaultChecked:v=[],checked:y,onCheckedChange:b,indent:x=20,showLines:S=!0,fileIcons:C=!0,draggable:w=!1,canDrop:T,onMove:E,contextMenuItems:D,onContextMenuAction:O,className:k,...A}){let[j,M]=(0,i.useState)(l),[N,P]=(0,i.useState)(null),[te,F]=(0,i.useState)(v),[I,L]=(0,i.useState)(null),[R,z]=(0,i.useState)(null),[B,V]=(0,i.useState)(null),H=(0,i.useRef)(null),U=ee??j,W=new Set(U),ne=h===void 0?N:h,G=new Set(y??te),re=_?d(e,G):new Set,{nodeMap:K,descendants:q,parentMap:J}=u(e),Y=I?K.get(I)??null:null;(0,i.useEffect)(()=>{if(!B)return;function e(e){e&&H.current&&H.current.contains(e.target)||V(null)}function t(e){e.key===`Escape`&&V(null)}return document.addEventListener(`mousedown`,e),document.addEventListener(`scroll`,e,!0),window.addEventListener(`resize`,e),document.addEventListener(`keydown`,t),()=>{document.removeEventListener(`mousedown`,e),document.removeEventListener(`scroll`,e,!0),window.removeEventListener(`resize`,e),document.removeEventListener(`keydown`,t)}},[B]);function X(e){let t=W.has(e)?U.filter(t=>t!==e):[...U,e];m?m(t):M(t)}function Z(e,t){g?g(e,t):P(e)}function ie(e){let t=K.get(e);if(!t||t.disabled)return;let n=new Set(G),r=n.has(e),i=[e,...Array.from(q.get(e)??[])];if(r)for(let e of i)n.delete(e);else for(let e of i){let t=K.get(e);t&&!t.disabled&&n.add(e)}let a=J.get(e);for(;a;){let e=K.get(a);if(!e)break;let t=(e.children??[]).every(e=>e.disabled||n.has(e.id)),r=(e.children??[]).some(e=>!e.disabled);t&&r?n.add(a):n.delete(a),a=J.get(a)}let o=Array.from(n);y===void 0&&F(o),b?.(o)}function Q(){L(null),z(null)}function $(e){return!Y||!w||!E||e.disabled||!c(e)||e.id===Y.id||q.get(Y.id)?.has(e.id)?!1:T?T(Y,e):!0}function ae(e,t){if(!D||t.disabled)return;let n=D(t).filter(Boolean);if(!n.length)return;e.preventDefault(),Z(t.id,t);let r=f(e.clientX,e.clientY);V({node:t,items:n,x:r.x,y:r.y})}function oe(e,t){!w||t.disabled||(e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,t.id),V(null),L(t.id))}function se(e,t){$(t)&&(e.preventDefault(),e.dataTransfer.dropEffect=`move`,z(t.id))}function ce(e,t){if(e.preventDefault(),!Y||!$(t)){Q();return}E?.({draggedId:Y.id,draggedNode:Y,targetId:t.id,targetNode:t}),o&&!W.has(t.id)&&X(t.id),Q()}return(0,a.jsxs)(`div`,{className:t.t(`tree`,`color-${r}`,S&&`lines`,k),...A,children:[(0,a.jsx)(`ul`,{className:`list`,role:`tree`,children:e.map(e=>(0,a.jsx)(p,{node:e,color:r,level:0,expandable:o,selectable:s,expandedIds:W,selectedId:ne,draggedId:I,dropTargetId:R,onToggle:X,onSelect:Z,checkable:_,checkedIds:G,indeterminateIds:re,onCheck:ie,indent:x,showLines:S,fileIcons:C,draggable:w,canDropOnNode:$,onContextMenu:ae,onDragStart:oe,onDragOver:se,onDrop:ce,onDragEnd:Q},e.id))}),B&&(0,a.jsx)(n.t,{children:(0,a.jsx)(`div`,{ref:H,className:`tree menu`,style:{top:B.y,left:B.x},role:`menu`,children:B.items.map(e=>(0,a.jsxs)(`button`,{type:`button`,className:t.t(`action`,e.color,e.disabled&&`disabled`),role:`menuitem`,disabled:e.disabled,onClick:()=>{e.disabled||(O?.(e.id,B.node),V(null))},children:[e.icon&&(0,a.jsx)(`span`,{className:`icon`,children:e.icon}),(0,a.jsx)(`span`,{children:e.label})]},e.id))})})]})}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return m}});
|
|
2
|
+
//# sourceMappingURL=MTreeView-1IqmVPMv.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MTreeView-BS60bIj7.cjs","names":[],"sources":["../src/components/data/MTreeView/MTreeView.tsx"],"sourcesContent":["import {useEffect, useRef, useState} from 'react'\nimport type {CSSProperties, DragEvent, MouseEvent, ReactNode} from 'react'\nimport type {\n MTreeViewProps,\n MTreeItemProps,\n MTreeNode,\n MTreeViewContextMenuItem,\n MTreeViewMoveEvent,\n} from './MTreeView.types'\nimport {cn} from '../../../utils/cn'\nimport {MCheckbox} from '../../controls'\nimport {MPortal} from '../../primitives'\nimport {\n MChevronRightIcon,\n MFileCodeIcon,\n MFileCsvIcon,\n MFileCssIcon,\n MFileExeIcon,\n MFileGifIcon,\n MFileHtmlIcon,\n MFileIcon,\n MFileImageIcon,\n MFileJpgIcon,\n MFileJsIcon,\n MFileJsonIcon,\n MFileMdIcon,\n MFileMp3Icon,\n MFileMp4Icon,\n MFileOdtIcon,\n MFilePdfIcon,\n MFilePhpIcon,\n MFilePngIcon,\n MFilePptIcon,\n MFileRarIcon,\n MFileSvgIcon,\n MFileTextIcon,\n MFileTsIcon,\n MFileTsxIcon,\n MFileTxtIcon,\n MFileWebpIcon,\n MFileXlsIcon,\n MFileXmlIcon,\n MFileZipIcon,\n MFolderIcon,\n MFolderOpenIcon,\n} from '../../../icons'\nimport './MTreeView.css'\nconst fileTypeMap: Record<string, ReactNode> = {\n pdf: <MFilePdfIcon />,\n ts: <MFileTsIcon />,\n tsx: <MFileTsxIcon />,\n js: <MFileJsIcon />,\n jsx: <MFileCodeIcon />,\n css: <MFileCssIcon />,\n scss: <MFileCssIcon />,\n html: <MFileHtmlIcon />,\n json: <MFileJsonIcon />,\n md: <MFileMdIcon />,\n txt: <MFileTxtIcon />,\n csv: <MFileCsvIcon />,\n zip: <MFileZipIcon />,\n rar: <MFileRarIcon />,\n svg: <MFileSvgIcon />,\n png: <MFilePngIcon />,\n jpg: <MFileJpgIcon />,\n jpeg: <MFileImageIcon />,\n gif: <MFileGifIcon />,\n webp: <MFileWebpIcon />,\n php: <MFilePhpIcon />,\n xml: <MFileXmlIcon />,\n xls: <MFileXlsIcon />,\n ppt: <MFilePptIcon />,\n odt: <MFileOdtIcon />,\n exe: <MFileExeIcon />,\n mp3: <MFileMp3Icon />,\n mp4: <MFileMp4Icon />,\n}\n\n// Read the file extension once so icon logic stays predictable.\nfunction getFileExtension(label: string): string | null {\n const dot = label.lastIndexOf('.')\n if (dot < 1) return null\n return label.slice(dot + 1).toLowerCase()\n}\n\n// Treat explicit folders and nodes with children as directory-like.\nfunction isFolderNode(node: MTreeNode) {\n return node.kind === 'folder' || Boolean(node.children?.length)\n}\n\n// Resolve the proper file icon by extension.\nfunction getFileIcon(label: string): ReactNode {\n const ext = getFileExtension(label)\n if (!ext) return <MFileIcon />\n\n return fileTypeMap[ext] ?? <MFileTextIcon />\n}\n\n// Prefer custom icons first, then fall back to folder or file visuals.\nfunction getDefaultIcon(node: MTreeNode, isExpanded: boolean, fileIcons: boolean) {\n if (node.icon) return node.icon\n if (!fileIcons) return null\n\n if (isFolderNode(node)) return isExpanded ? <MFolderOpenIcon /> : <MFolderIcon />\n\n return getFileIcon(node.label)\n}\n\n// Cache nodes and descendants so drag-drop validation stays fast.\nfunction buildTreeLookup(items: MTreeNode[]) {\n const nodeMap = new Map<string, MTreeNode>()\n const descendants = new Map<string, Set<string>>()\n const parentMap = new Map<string, string>()\n\n function walk(node: MTreeNode) {\n nodeMap.set(node.id, node)\n\n const childIds = new Set<string>()\n\n for (const child of node.children ?? []) {\n parentMap.set(child.id, node.id)\n childIds.add(child.id)\n\n const nestedIds = walk(child)\n nestedIds.forEach((id) => childIds.add(id))\n }\n\n descendants.set(node.id, childIds)\n return childIds\n }\n\n items.forEach(walk)\n\n return {nodeMap, descendants, parentMap}\n}\n\n// Compute indeterminate ids: a node where some but not all leaf descendants are checked.\nfunction computeIndeterminate(items: MTreeNode[], checked: Set<string>): Set<string> {\n const indeterminate = new Set<string>()\n\n function walk(node: MTreeNode): {checked: number; total: number} {\n if (!node.children?.length) {\n return checked.has(node.id) ? {checked: 1, total: 1} : {checked: 0, total: 1}\n }\n\n let c = 0\n let t = 0\n\n for (const child of node.children) {\n const r = walk(child)\n c += r.checked\n t += r.total\n }\n\n if (c > 0 && c < t) indeterminate.add(node.id)\n return {checked: c, total: t}\n }\n\n items.forEach(walk)\n return indeterminate\n}\n\n// Keep the context menu inside the viewport.\nfunction clampMenuPosition(x: number, y: number) {\n if (typeof window === 'undefined') {\n return {x, y}\n }\n\n return {\n x: Math.max(8, Math.min(x, window.innerWidth - 220)),\n y: Math.max(8, Math.min(y, window.innerHeight - 16)),\n }\n}\n\n// Render one visible row and recurse into children when expanded.\nfunction TreeItem({\n node,\n color,\n level,\n expandable,\n selectable,\n expandedIds,\n selectedId,\n draggedId,\n dropTargetId,\n onToggle,\n onSelect,\n checkable,\n checkedIds,\n indeterminateIds,\n onCheck,\n indent,\n showLines,\n fileIcons,\n draggable,\n canDropOnNode,\n onContextMenu,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n}: MTreeItemProps) {\n const hasChildren = isFolderNode(node)\n const isExpanded = expandedIds.has(node.id)\n const isSelected = selectedId === node.id\n const isDragging = draggedId === node.id\n const isDropTarget = dropTargetId === node.id\n const canDrop = canDropOnNode?.(node)\n const icon = getDefaultIcon(node, isExpanded, !!fileIcons)\n const isChecked = checkedIds?.has(node.id) ?? false\n const isIndeterminate = indeterminateIds?.has(node.id) ?? false\n\n return (\n <li role=\"treeitem\" aria-expanded={hasChildren ? isExpanded : undefined}>\n <div\n className={cn(\n 'item',\n isSelected && 'selected',\n node.disabled && 'disabled',\n selectable && !node.disabled && 'selectable',\n draggable && !node.disabled && 'draggable',\n isDragging && 'dragging',\n canDrop && 'can-drop',\n isDropTarget && 'drop-target'\n )}\n data-color={color}\n style={{paddingLeft: level * indent}}\n draggable={draggable && !node.disabled}\n onClick={() => {\n if (node.disabled) return\n if (hasChildren && expandable) onToggle(node.id)\n if (selectable) onSelect?.(node.id, node)\n }}\n onContextMenu={(event) => onContextMenu?.(event, node)}\n onDragStart={(event) => onDragStart?.(event, node)}\n onDragOver={(event) => onDragOver?.(event, node)}\n onDrop={(event) => onDrop?.(event, node)}\n onDragEnd={onDragEnd}\n >\n <span className=\"toggle\">\n {hasChildren && expandable ? (\n <span className={cn('arrow', isExpanded && 'expanded')}>\n <MChevronRightIcon />\n </span>\n ) : (\n <span className=\"spacer\" />\n )}\n </span>\n {checkable && (\n <span className=\"check\" onClick={(event) => event.stopPropagation()}>\n <MCheckbox\n size=\"sm\"\n clickEffect=\"none\"\n disabled={node.disabled}\n checked={isChecked}\n indeterminate={isIndeterminate}\n onChange={() => onCheck?.(node.id)}\n />\n </span>\n )}\n {icon && <span className=\"icon\">{icon}</span>}\n <span className=\"label\">{node.label}</span>\n </div>\n {hasChildren && isExpanded && (\n <ul\n className=\"list\"\n role=\"group\"\n style={showLines ? ({'--line-left': `${level * indent + 17}px`} as CSSProperties) : undefined}\n >\n {(node.children ?? []).map((child) => (\n <TreeItem\n key={child.id}\n node={child}\n color={color}\n level={level + 1}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={onToggle}\n onSelect={onSelect}\n checkable={checkable}\n checkedIds={checkedIds}\n indeterminateIds={indeterminateIds}\n onCheck={onCheck}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={canDropOnNode}\n onContextMenu={onContextMenu}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDrop={onDrop}\n onDragEnd={onDragEnd}\n />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\n// Render a file tree with selection, context actions and folder moves.\nexport function MTreeView({\n items,\n color = 'primary',\n expandable = true,\n selectable = false,\n defaultExpanded = [],\n expanded: controlledExpanded,\n onExpandChange,\n selected: controlledSelected,\n onSelect,\n checkable = false,\n defaultChecked = [],\n checked: controlledChecked,\n onCheckedChange,\n indent = 20,\n showLines = true,\n fileIcons = true,\n draggable = false,\n canDrop,\n onMove,\n contextMenuItems,\n onContextMenuAction,\n className,\n ...rest\n}: MTreeViewProps) {\n const [internalExpanded, setInternalExpanded] = useState<string[]>(defaultExpanded)\n const [internalSelected, setInternalSelected] = useState<string | null>(null)\n const [internalChecked, setInternalChecked] = useState<string[]>(defaultChecked)\n const [draggedId, setDraggedId] = useState<string | null>(null)\n const [dropTargetId, setDropTargetId] = useState<string | null>(null)\n const [menu, setMenu] = useState<{\n node: MTreeNode\n items: MTreeViewContextMenuItem[]\n x: number\n y: number\n } | null>(null)\n const menuRef = useRef<HTMLDivElement>(null)\n\n const expandedArr = controlledExpanded ?? internalExpanded\n const expandedIds = new Set(expandedArr)\n const selectedId = controlledSelected !== undefined ? controlledSelected : internalSelected\n const checkedArr = controlledChecked ?? internalChecked\n const checkedIds = new Set(checkedArr)\n const indeterminateIds = checkable ? computeIndeterminate(items, checkedIds) : new Set<string>()\n const {nodeMap, descendants, parentMap} = buildTreeLookup(items)\n const draggedNode = draggedId ? (nodeMap.get(draggedId) ?? null) : null\n\n useEffect(() => {\n if (!menu) return\n\n function closeMenu(event?: Event) {\n if (event && menuRef.current && menuRef.current.contains(event.target as Node)) {\n return\n }\n\n setMenu(null)\n }\n\n function handleKey(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n setMenu(null)\n }\n }\n\n document.addEventListener('mousedown', closeMenu)\n document.addEventListener('scroll', closeMenu, true)\n window.addEventListener('resize', closeMenu)\n document.addEventListener('keydown', handleKey)\n\n return () => {\n document.removeEventListener('mousedown', closeMenu)\n document.removeEventListener('scroll', closeMenu, true)\n window.removeEventListener('resize', closeMenu)\n document.removeEventListener('keydown', handleKey)\n }\n }, [menu])\n\n function handleToggle(id: string) {\n const next = expandedIds.has(id) ? expandedArr.filter((e) => e !== id) : [...expandedArr, id]\n if (onExpandChange) onExpandChange(next)\n else setInternalExpanded(next)\n }\n\n function handleSelect(id: string, node: MTreeNode) {\n if (onSelect) onSelect(id, node)\n else setInternalSelected(id)\n }\n\n function handleCheck(id: string) {\n const node = nodeMap.get(id)\n if (!node || node.disabled) return\n\n const next = new Set(checkedIds)\n const isCurrentlyChecked = next.has(id)\n const subtree = [id, ...Array.from(descendants.get(id) ?? [])]\n\n if (isCurrentlyChecked) {\n for (const sid of subtree) next.delete(sid)\n } else {\n for (const sid of subtree) {\n const sNode = nodeMap.get(sid)\n if (sNode && !sNode.disabled) next.add(sid)\n }\n }\n\n let parentId = parentMap.get(id)\n\n while (parentId) {\n const parent = nodeMap.get(parentId)\n if (!parent) break\n\n const allChildrenChecked = (parent.children ?? []).every((child) => child.disabled || next.has(child.id))\n const hasEnabledChild = (parent.children ?? []).some((child) => !child.disabled)\n\n if (allChildrenChecked && hasEnabledChild) next.add(parentId)\n else next.delete(parentId)\n\n parentId = parentMap.get(parentId)\n }\n\n const nextArr = Array.from(next)\n\n if (controlledChecked === undefined) setInternalChecked(nextArr)\n onCheckedChange?.(nextArr)\n }\n\n function closeDrag() {\n setDraggedId(null)\n setDropTargetId(null)\n }\n\n function isValidDropTarget(targetNode: MTreeNode) {\n if (!draggedNode || !draggable || !onMove) return false\n if (targetNode.disabled || !isFolderNode(targetNode)) return false\n if (targetNode.id === draggedNode.id) return false\n if (descendants.get(draggedNode.id)?.has(targetNode.id)) return false\n\n return canDrop ? canDrop(draggedNode, targetNode) : true\n }\n\n function handleContextMenu(event: MouseEvent<HTMLDivElement>, node: MTreeNode) {\n if (!contextMenuItems || node.disabled) return\n\n const items = contextMenuItems(node).filter(Boolean)\n if (!items.length) return\n\n event.preventDefault()\n handleSelect(node.id, node)\n\n const pos = clampMenuPosition(event.clientX, event.clientY)\n setMenu({\n node,\n items,\n x: pos.x,\n y: pos.y,\n })\n }\n\n function handleDragStart(event: DragEvent<HTMLDivElement>, node: MTreeNode) {\n if (!draggable || node.disabled) return\n\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.setData('text/plain', node.id)\n setMenu(null)\n setDraggedId(node.id)\n }\n\n function handleDragOver(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n if (!isValidDropTarget(targetNode)) return\n\n event.preventDefault()\n event.dataTransfer.dropEffect = 'move'\n setDropTargetId(targetNode.id)\n }\n\n function handleDrop(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n event.preventDefault()\n\n if (!draggedNode || !isValidDropTarget(targetNode)) {\n closeDrag()\n return\n }\n\n onMove?.({\n draggedId: draggedNode.id,\n draggedNode,\n targetId: targetNode.id,\n targetNode,\n } satisfies MTreeViewMoveEvent)\n\n if (expandable && !expandedIds.has(targetNode.id)) {\n handleToggle(targetNode.id)\n }\n\n closeDrag()\n }\n\n return (\n <div className={cn('tree', `color-${color}`, showLines && 'lines', className)} {...rest}>\n <ul className=\"list\" role=\"tree\">\n {items.map((item) => (\n <TreeItem\n key={item.id}\n node={item}\n color={color}\n level={0}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={handleToggle}\n onSelect={handleSelect}\n checkable={checkable}\n checkedIds={checkedIds}\n indeterminateIds={indeterminateIds}\n onCheck={handleCheck}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={isValidDropTarget}\n onContextMenu={handleContextMenu}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n onDragEnd={closeDrag}\n />\n ))}\n </ul>\n {menu && (\n <MPortal>\n <div ref={menuRef} className=\"tree menu\" style={{top: menu.y, left: menu.x}} role=\"menu\">\n {menu.items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className={cn('action', item.color, item.disabled && 'disabled')}\n role=\"menuitem\"\n disabled={item.disabled}\n onClick={() => {\n if (item.disabled) return\n onContextMenuAction?.(item.id, menu.node)\n setMenu(null)\n }}\n >\n {item.icon && <span className=\"icon\">{item.icon}</span>}\n <span>{item.label}</span>\n </button>\n ))}\n </div>\n </MPortal>\n )}\n </div>\n )\n}\n"],"mappings":"sOA+CA,IAAM,EAAyC,CAC3C,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,IAAI,EAAA,EAAA,KAAC,EAAA,GAAD,EAAe,CAAA,CACnB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,IAAI,EAAA,EAAA,KAAC,EAAA,GAAD,EAAe,CAAA,CACnB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAiB,CAAA,CACtB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,MAAM,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACtB,MAAM,EAAA,EAAA,KAAC,EAAA,GAAD,EAAiB,CAAA,CACvB,MAAM,EAAA,EAAA,KAAC,EAAA,GAAD,EAAiB,CAAA,CACvB,IAAI,EAAA,EAAA,KAAC,EAAA,GAAD,EAAe,CAAA,CACnB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,MAAM,EAAA,EAAA,KAAC,EAAA,GAAD,EAAkB,CAAA,CACxB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,MAAM,EAAA,EAAA,KAAC,EAAA,GAAD,EAAiB,CAAA,CACvB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACxB,CAGD,SAAS,EAAiB,EAA8B,CACpD,IAAM,EAAM,EAAM,YAAY,IAAI,CAElC,OADI,EAAM,EAAU,KACb,EAAM,MAAM,EAAM,EAAE,CAAC,aAAa,CAI7C,SAAS,EAAa,EAAiB,CACnC,OAAO,EAAK,OAAS,UAAY,EAAQ,EAAK,UAAU,OAI5D,SAAS,EAAY,EAA0B,CAC3C,IAAM,EAAM,EAAiB,EAAM,CAGnC,OAFK,EAEE,EAAY,KAAQ,EAAA,EAAA,KAAC,EAAA,GAAD,EAAiB,CAAA,EAF3B,EAAA,EAAA,KAAC,EAAA,GAAD,EAAa,CAAA,CAMlC,SAAS,GAAe,EAAiB,EAAqB,EAAoB,CAM9E,OALI,EAAK,KAAa,EAAK,KACtB,EAED,EAAa,EAAK,CAAS,GAAa,EAAA,EAAA,KAAC,EAAA,GAAD,EAAmB,CAAA,EAAG,EAAA,EAAA,KAAC,EAAA,GAAD,EAAe,CAAA,CAE1E,EAAY,EAAK,MAAM,CAJP,KAQ3B,SAAS,EAAgB,EAAoB,CACzC,IAAM,EAAU,IAAI,IACd,EAAc,IAAI,IAClB,EAAY,IAAI,IAEtB,SAAS,EAAK,EAAiB,CAC3B,EAAQ,IAAI,EAAK,GAAI,EAAK,CAE1B,IAAM,EAAW,IAAI,IAErB,IAAK,IAAM,KAAS,EAAK,UAAY,EAAE,CACnC,EAAU,IAAI,EAAM,GAAI,EAAK,GAAG,CAChC,EAAS,IAAI,EAAM,GAAG,CAEJ,EAAK,EAAM,CACnB,QAAS,GAAO,EAAS,IAAI,EAAG,CAAC,CAI/C,OADA,EAAY,IAAI,EAAK,GAAI,EAAS,CAC3B,EAKX,OAFA,EAAM,QAAQ,EAAK,CAEZ,CAAC,UAAS,cAAa,YAAU,CAI5C,SAAS,EAAqB,EAAoB,EAAmC,CACjF,IAAM,EAAgB,IAAI,IAE1B,SAAS,EAAK,EAAmD,CAC7D,GAAI,CAAC,EAAK,UAAU,OAChB,OAAO,EAAQ,IAAI,EAAK,GAAG,CAAG,CAAC,QAAS,EAAG,MAAO,EAAE,CAAG,CAAC,QAAS,EAAG,MAAO,EAAE,CAGjF,IAAI,EAAI,EACJ,EAAI,EAER,IAAK,IAAM,KAAS,EAAK,SAAU,CAC/B,IAAM,EAAI,EAAK,EAAM,CACrB,GAAK,EAAE,QACP,GAAK,EAAE,MAIX,OADI,EAAI,GAAK,EAAI,GAAG,EAAc,IAAI,EAAK,GAAG,CACvC,CAAC,QAAS,EAAG,MAAO,EAAE,CAIjC,OADA,EAAM,QAAQ,EAAK,CACZ,EAIX,SAAS,EAAkB,EAAW,EAAW,CAK7C,OAJI,OAAO,OAAW,IACX,CAAC,IAAG,IAAE,CAGV,CACH,EAAG,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,OAAO,WAAa,IAAI,CAAC,CACpD,EAAG,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,OAAO,YAAc,GAAG,CAAC,CACvD,CAIL,SAAS,EAAS,CACd,OACA,QACA,QACA,aACA,aACA,cACA,aACA,YACA,eACA,WACA,WACA,YACA,aACA,mBACA,UACA,SACA,YACA,YACA,YACA,gBACA,gBACA,cACA,aACA,SACA,aACe,CACf,IAAM,EAAc,EAAa,EAAK,CAChC,EAAa,EAAY,IAAI,EAAK,GAAG,CACrC,EAAa,IAAe,EAAK,GACjC,EAAa,IAAc,EAAK,GAChC,GAAe,IAAiB,EAAK,GACrC,EAAU,IAAgB,EAAK,CAC/B,EAAO,GAAe,EAAM,EAAY,CAAC,CAAC,EAAU,CACpD,EAAY,GAAY,IAAI,EAAK,GAAG,EAAI,GACxC,EAAkB,GAAkB,IAAI,EAAK,GAAG,EAAI,GAE1D,OACI,EAAA,EAAA,MAAC,KAAD,CAAI,KAAK,WAAW,gBAAe,EAAc,EAAa,IAAA,YAA9D,EACI,EAAA,EAAA,MAAC,MAAD,CACI,UAAW,EAAA,EACP,OACA,GAAc,WACd,EAAK,UAAY,WACjB,GAAc,CAAC,EAAK,UAAY,aAChC,GAAa,CAAC,EAAK,UAAY,YAC/B,GAAc,WACd,GAAW,WACX,IAAgB,cACnB,CACD,aAAY,EACZ,MAAO,CAAC,YAAa,EAAQ,EAAO,CACpC,UAAW,GAAa,CAAC,EAAK,SAC9B,YAAe,CACP,EAAK,WACL,GAAe,GAAY,EAAS,EAAK,GAAG,CAC5C,GAAY,IAAW,EAAK,GAAI,EAAK,GAE7C,cAAgB,GAAU,IAAgB,EAAO,EAAK,CACtD,YAAc,GAAU,IAAc,EAAO,EAAK,CAClD,WAAa,GAAU,IAAa,EAAO,EAAK,CAChD,OAAS,GAAU,IAAS,EAAO,EAAK,CAC7B,qBAvBf,EAyBI,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,kBACX,GAAe,GACZ,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAA,EAAG,QAAS,GAAc,WAAW,WAClD,EAAA,EAAA,KAAC,EAAA,GAAD,EAAqB,CAAA,CAClB,CAAA,EAEP,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,SAAW,CAAA,CAE5B,CAAA,CACN,IACG,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,QAAQ,QAAU,GAAU,EAAM,iBAAiB,WAC/D,EAAA,EAAA,KAAC,EAAA,EAAD,CACI,KAAK,KACL,YAAY,OACZ,SAAU,EAAK,SACf,QAAS,EACT,cAAe,EACf,aAAgB,IAAU,EAAK,GAAG,CACpC,CAAA,CACC,CAAA,CAEV,IAAQ,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,gBAAQ,EAAY,CAAA,EAC7C,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,iBAAS,EAAK,MAAa,CAAA,CACzC,GACL,GAAe,IACZ,EAAA,EAAA,KAAC,KAAD,CACI,UAAU,OACV,KAAK,QACL,MAAO,EAAa,CAAC,cAAe,GAAG,EAAQ,EAAS,GAAG,IAAI,CAAqB,IAAA,aAElF,EAAK,UAAY,EAAE,EAAE,IAAK,IACxB,EAAA,EAAA,KAAC,EAAD,CAEI,KAAM,EACC,QACP,MAAO,EAAQ,EACH,aACA,aACC,cACD,aACD,YACG,eACJ,WACA,WACC,YACC,aACM,mBACT,UACD,SACG,YACA,YACA,YACI,gBACA,gBACF,cACD,aACJ,SACG,YACb,CA1BO,EAAM,GA0Bb,CACJ,CACD,CAAA,CAER,GAKb,SAAgB,EAAU,CACtB,QACA,QAAQ,UACR,aAAa,GACb,aAAa,GACb,kBAAkB,EAAE,CACpB,SAAU,GACV,iBACA,SAAU,EACV,WACA,YAAY,GACZ,iBAAiB,EAAE,CACnB,QAAS,EACT,kBACA,SAAS,GACT,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,UACA,SACA,mBACA,sBACA,YACA,GAAG,GACY,CACf,GAAM,CAAC,EAAkB,IAAA,EAAA,EAAA,UAA0C,EAAgB,CAC7E,CAAC,EAAkB,IAAA,EAAA,EAAA,UAA+C,KAAK,CACvE,CAAC,GAAiB,IAAA,EAAA,EAAA,UAAyC,EAAe,CAC1E,CAAC,EAAW,IAAA,EAAA,EAAA,UAAwC,KAAK,CACzD,CAAC,EAAc,IAAA,EAAA,EAAA,UAA2C,KAAK,CAC/D,CAAC,EAAM,IAAA,EAAA,EAAA,UAKH,KAAK,CACT,GAAA,EAAA,EAAA,QAAiC,KAAK,CAEtC,EAAc,IAAsB,EACpC,EAAc,IAAI,IAAI,EAAY,CAClC,GAAa,IAAuB,IAAA,GAAiC,EAArB,EAEhD,EAAa,IAAI,IADJ,GAAqB,GACF,CAChC,GAAmB,EAAY,EAAqB,EAAO,EAAW,CAAG,IAAI,IAC7E,CAAC,UAAS,cAAa,aAAa,EAAgB,EAAM,CAC1D,EAAc,EAAa,EAAQ,IAAI,EAAU,EAAI,KAAQ,MAEnE,EAAA,EAAA,eAAgB,CACZ,GAAI,CAAC,EAAM,OAEX,SAAS,EAAU,EAAe,CAC1B,GAAS,EAAQ,SAAW,EAAQ,QAAQ,SAAS,EAAM,OAAe,EAI9E,EAAQ,KAAK,CAGjB,SAAS,EAAU,EAAsB,CACjC,EAAM,MAAQ,UACd,EAAQ,KAAK,CASrB,OALA,SAAS,iBAAiB,YAAa,EAAU,CACjD,SAAS,iBAAiB,SAAU,EAAW,GAAK,CACpD,OAAO,iBAAiB,SAAU,EAAU,CAC5C,SAAS,iBAAiB,UAAW,EAAU,KAElC,CACT,SAAS,oBAAoB,YAAa,EAAU,CACpD,SAAS,oBAAoB,SAAU,EAAW,GAAK,CACvD,OAAO,oBAAoB,SAAU,EAAU,CAC/C,SAAS,oBAAoB,UAAW,EAAU,GAEvD,CAAC,EAAK,CAAC,CAEV,SAAS,EAAa,EAAY,CAC9B,IAAM,EAAO,EAAY,IAAI,EAAG,CAAG,EAAY,OAAQ,GAAM,IAAM,EAAG,CAAG,CAAC,GAAG,EAAa,EAAG,CACzF,EAAgB,EAAe,EAAK,CACnC,EAAoB,EAAK,CAGlC,SAAS,EAAa,EAAY,EAAiB,CAC3C,EAAU,EAAS,EAAI,EAAK,CAC3B,EAAoB,EAAG,CAGhC,SAAS,GAAY,EAAY,CAC7B,IAAM,EAAO,EAAQ,IAAI,EAAG,CAC5B,GAAI,CAAC,GAAQ,EAAK,SAAU,OAE5B,IAAM,EAAO,IAAI,IAAI,EAAW,CAC1B,EAAqB,EAAK,IAAI,EAAG,CACjC,EAAU,CAAC,EAAI,GAAG,MAAM,KAAK,EAAY,IAAI,EAAG,EAAI,EAAE,CAAC,CAAC,CAE9D,GAAI,EACA,IAAK,IAAM,KAAO,EAAS,EAAK,OAAO,EAAI,MAE3C,IAAK,IAAM,KAAO,EAAS,CACvB,IAAM,EAAQ,EAAQ,IAAI,EAAI,CAC1B,GAAS,CAAC,EAAM,UAAU,EAAK,IAAI,EAAI,CAInD,IAAI,EAAW,EAAU,IAAI,EAAG,CAEhC,KAAO,GAAU,CACb,IAAM,EAAS,EAAQ,IAAI,EAAS,CACpC,GAAI,CAAC,EAAQ,MAEb,IAAM,GAAsB,EAAO,UAAY,EAAE,EAAE,MAAO,GAAU,EAAM,UAAY,EAAK,IAAI,EAAM,GAAG,CAAC,CACnG,GAAmB,EAAO,UAAY,EAAE,EAAE,KAAM,GAAU,CAAC,EAAM,SAAS,CAE5E,GAAsB,EAAiB,EAAK,IAAI,EAAS,CACxD,EAAK,OAAO,EAAS,CAE1B,EAAW,EAAU,IAAI,EAAS,CAGtC,IAAM,EAAU,MAAM,KAAK,EAAK,CAE5B,IAAsB,IAAA,IAAW,EAAmB,EAAQ,CAChE,IAAkB,EAAQ,CAG9B,SAAS,GAAY,CACjB,EAAa,KAAK,CAClB,EAAgB,KAAK,CAGzB,SAAS,EAAkB,EAAuB,CAM9C,MALI,CAAC,GAAe,CAAC,GAAa,CAAC,GAC/B,EAAW,UAAY,CAAC,EAAa,EAAW,EAChD,EAAW,KAAO,EAAY,IAC9B,EAAY,IAAI,EAAY,GAAG,EAAE,IAAI,EAAW,GAAG,CAAS,GAEzD,EAAU,EAAQ,EAAa,EAAW,CAAG,GAGxD,SAAS,GAAkB,EAAmC,EAAiB,CAC3E,GAAI,CAAC,GAAoB,EAAK,SAAU,OAExC,IAAM,EAAQ,EAAiB,EAAK,CAAC,OAAO,QAAQ,CACpD,GAAI,CAAC,EAAM,OAAQ,OAEnB,EAAM,gBAAgB,CACtB,EAAa,EAAK,GAAI,EAAK,CAE3B,IAAM,EAAM,EAAkB,EAAM,QAAS,EAAM,QAAQ,CAC3D,EAAQ,CACJ,OACA,QACA,EAAG,EAAI,EACP,EAAG,EAAI,EACV,CAAC,CAGN,SAAS,GAAgB,EAAkC,EAAiB,CACpE,CAAC,GAAa,EAAK,WAEvB,EAAM,aAAa,cAAgB,OACnC,EAAM,aAAa,QAAQ,aAAc,EAAK,GAAG,CACjD,EAAQ,KAAK,CACb,EAAa,EAAK,GAAG,EAGzB,SAAS,GAAe,EAAkC,EAAuB,CACxE,EAAkB,EAAW,GAElC,EAAM,gBAAgB,CACtB,EAAM,aAAa,WAAa,OAChC,EAAgB,EAAW,GAAG,EAGlC,SAAS,GAAW,EAAkC,EAAuB,CAGzE,GAFA,EAAM,gBAAgB,CAElB,CAAC,GAAe,CAAC,EAAkB,EAAW,CAAE,CAChD,GAAW,CACX,OAGJ,IAAS,CACL,UAAW,EAAY,GACvB,cACA,SAAU,EAAW,GACrB,aACH,CAA8B,CAE3B,GAAc,CAAC,EAAY,IAAI,EAAW,GAAG,EAC7C,EAAa,EAAW,GAAG,CAG/B,GAAW,CAGf,OACI,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,EAAA,EAAG,OAAQ,SAAS,IAAS,GAAa,QAAS,EAAU,CAAE,GAAI,WAAnF,EACI,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,OAAO,KAAK,gBACrB,EAAM,IAAK,IACR,EAAA,EAAA,KAAC,EAAD,CAEI,KAAM,EACC,QACP,MAAO,EACK,aACA,aACC,cACD,cACD,YACG,eACd,SAAU,EACV,SAAU,EACC,YACC,aACM,oBAClB,QAAS,GACD,SACG,YACA,YACA,YACX,cAAe,EACf,cAAe,GACf,YAAa,GACb,WAAY,GACZ,OAAQ,GACR,UAAW,EACb,CA1BO,EAAK,GA0BZ,CACJ,CACD,CAAA,CACJ,IACG,EAAA,EAAA,KAAC,EAAA,EAAD,CAAA,UACI,EAAA,EAAA,KAAC,MAAD,CAAK,IAAK,EAAS,UAAU,YAAY,MAAO,CAAC,IAAK,EAAK,EAAG,KAAM,EAAK,EAAE,CAAE,KAAK,gBAC7E,EAAK,MAAM,IAAK,IACb,EAAA,EAAA,MAAC,SAAD,CAEI,KAAK,SACL,UAAW,EAAA,EAAG,SAAU,EAAK,MAAO,EAAK,UAAY,WAAW,CAChE,KAAK,WACL,SAAU,EAAK,SACf,YAAe,CACP,EAAK,WACT,IAAsB,EAAK,GAAI,EAAK,KAAK,CACzC,EAAQ,KAAK,YATrB,CAYK,EAAK,OAAQ,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,gBAAQ,EAAK,KAAY,CAAA,EACvD,EAAA,EAAA,KAAC,OAAD,CAAA,SAAO,EAAK,MAAa,CAAA,CACpB,EAbA,EAAK,GAaL,CACX,CACA,CAAA,CACA,CAAA,CAEZ"}
|
|
1
|
+
{"version":3,"file":"MTreeView-1IqmVPMv.cjs","names":[],"sources":["../src/components/data/MTreeView/MTreeView.tsx"],"sourcesContent":["import {useEffect, useRef, useState} from 'react'\nimport type {CSSProperties, DragEvent, MouseEvent, ReactNode} from 'react'\nimport type {\n MTreeViewProps,\n MTreeItemProps,\n MTreeNode,\n MTreeViewContextMenuItem,\n MTreeViewMoveEvent,\n} from './MTreeView.types'\nimport {cn} from '../../../utils/cn'\nimport {MCheckbox} from '../../controls'\nimport {MPortal} from '../../primitives'\nimport {\n MChevronRightIcon,\n MFileCodeIcon,\n MFileCsvIcon,\n MFileCssIcon,\n MFileExeIcon,\n MFileGifIcon,\n MFileHtmlIcon,\n MFileIcon,\n MFileImageIcon,\n MFileJpgIcon,\n MFileJsIcon,\n MFileJsonIcon,\n MFileMdIcon,\n MFileMp3Icon,\n MFileMp4Icon,\n MFileOdtIcon,\n MFilePdfIcon,\n MFilePhpIcon,\n MFilePngIcon,\n MFilePptIcon,\n MFileRarIcon,\n MFileSvgIcon,\n MFileTextIcon,\n MFileTsIcon,\n MFileTsxIcon,\n MFileTxtIcon,\n MFileWebpIcon,\n MFileXlsIcon,\n MFileXmlIcon,\n MFileZipIcon,\n MFolderIcon,\n MFolderOpenIcon,\n} from '../../../icons'\nimport './MTreeView.css'\nconst fileTypeMap: Record<string, ReactNode> = {\n pdf: <MFilePdfIcon />,\n ts: <MFileTsIcon />,\n tsx: <MFileTsxIcon />,\n js: <MFileJsIcon />,\n jsx: <MFileCodeIcon />,\n css: <MFileCssIcon />,\n scss: <MFileCssIcon />,\n html: <MFileHtmlIcon />,\n json: <MFileJsonIcon />,\n md: <MFileMdIcon />,\n txt: <MFileTxtIcon />,\n csv: <MFileCsvIcon />,\n zip: <MFileZipIcon />,\n rar: <MFileRarIcon />,\n svg: <MFileSvgIcon />,\n png: <MFilePngIcon />,\n jpg: <MFileJpgIcon />,\n jpeg: <MFileImageIcon />,\n gif: <MFileGifIcon />,\n webp: <MFileWebpIcon />,\n php: <MFilePhpIcon />,\n xml: <MFileXmlIcon />,\n xls: <MFileXlsIcon />,\n ppt: <MFilePptIcon />,\n odt: <MFileOdtIcon />,\n exe: <MFileExeIcon />,\n mp3: <MFileMp3Icon />,\n mp4: <MFileMp4Icon />,\n}\n\n// Read the file extension once so icon logic stays predictable.\nfunction getFileExtension(label: string): string | null {\n const dot = label.lastIndexOf('.')\n if (dot < 1) return null\n return label.slice(dot + 1).toLowerCase()\n}\n\n// Treat explicit folders and nodes with children as directory-like.\nfunction isFolderNode(node: MTreeNode) {\n return node.kind === 'folder' || Boolean(node.children?.length)\n}\n\n// Resolve the proper file icon by extension.\nfunction getFileIcon(label: string): ReactNode {\n const ext = getFileExtension(label)\n if (!ext) return <MFileIcon />\n\n return fileTypeMap[ext] ?? <MFileTextIcon />\n}\n\n// Prefer custom icons first, then fall back to folder or file visuals.\nfunction getDefaultIcon(node: MTreeNode, isExpanded: boolean, fileIcons: boolean) {\n if (node.icon) return node.icon\n if (!fileIcons) return null\n\n if (isFolderNode(node)) return isExpanded ? <MFolderOpenIcon /> : <MFolderIcon />\n\n return getFileIcon(node.label)\n}\n\n// Cache nodes and descendants so drag-drop validation stays fast.\nfunction buildTreeLookup(items: MTreeNode[]) {\n const nodeMap = new Map<string, MTreeNode>()\n const descendants = new Map<string, Set<string>>()\n const parentMap = new Map<string, string>()\n\n function walk(node: MTreeNode) {\n nodeMap.set(node.id, node)\n\n const childIds = new Set<string>()\n\n for (const child of node.children ?? []) {\n parentMap.set(child.id, node.id)\n childIds.add(child.id)\n\n const nestedIds = walk(child)\n nestedIds.forEach((id) => childIds.add(id))\n }\n\n descendants.set(node.id, childIds)\n return childIds\n }\n\n items.forEach(walk)\n\n return {nodeMap, descendants, parentMap}\n}\n\n// Compute indeterminate ids: a node where some but not all leaf descendants are checked.\nfunction computeIndeterminate(items: MTreeNode[], checked: Set<string>): Set<string> {\n const indeterminate = new Set<string>()\n\n function walk(node: MTreeNode): {checked: number; total: number} {\n if (!node.children?.length) {\n return checked.has(node.id) ? {checked: 1, total: 1} : {checked: 0, total: 1}\n }\n\n let c = 0\n let t = 0\n\n for (const child of node.children) {\n const r = walk(child)\n c += r.checked\n t += r.total\n }\n\n if (c > 0 && c < t) indeterminate.add(node.id)\n return {checked: c, total: t}\n }\n\n items.forEach(walk)\n return indeterminate\n}\n\n// Keep the context menu inside the viewport.\nfunction clampMenuPosition(x: number, y: number) {\n if (typeof window === 'undefined') {\n return {x, y}\n }\n\n return {\n x: Math.max(8, Math.min(x, window.innerWidth - 220)),\n y: Math.max(8, Math.min(y, window.innerHeight - 16)),\n }\n}\n\n// Render one visible row and recurse into children when expanded.\nfunction TreeItem({\n node,\n color,\n level,\n expandable,\n selectable,\n expandedIds,\n selectedId,\n draggedId,\n dropTargetId,\n onToggle,\n onSelect,\n checkable,\n checkedIds,\n indeterminateIds,\n onCheck,\n indent,\n showLines,\n fileIcons,\n draggable,\n canDropOnNode,\n onContextMenu,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n}: MTreeItemProps) {\n const hasChildren = isFolderNode(node)\n const isExpanded = expandedIds.has(node.id)\n const isSelected = selectedId === node.id\n const isDragging = draggedId === node.id\n const isDropTarget = dropTargetId === node.id\n const canDrop = canDropOnNode?.(node)\n const icon = getDefaultIcon(node, isExpanded, !!fileIcons)\n const isChecked = checkedIds?.has(node.id) ?? false\n const isIndeterminate = indeterminateIds?.has(node.id) ?? false\n\n return (\n <li role=\"treeitem\" aria-expanded={hasChildren ? isExpanded : undefined}>\n <div\n className={cn(\n 'item',\n isSelected && 'selected',\n node.disabled && 'disabled',\n selectable && !node.disabled && 'selectable',\n draggable && !node.disabled && 'draggable',\n isDragging && 'dragging',\n canDrop && 'can-drop',\n isDropTarget && 'drop-target'\n )}\n data-color={color}\n style={{paddingLeft: level * indent}}\n draggable={draggable && !node.disabled}\n onClick={() => {\n if (node.disabled) return\n if (hasChildren && expandable) onToggle(node.id)\n if (selectable) onSelect?.(node.id, node)\n }}\n onContextMenu={(event) => onContextMenu?.(event, node)}\n onDragStart={(event) => onDragStart?.(event, node)}\n onDragOver={(event) => onDragOver?.(event, node)}\n onDrop={(event) => onDrop?.(event, node)}\n onDragEnd={onDragEnd}\n >\n <span className=\"toggle\">\n {hasChildren && expandable ? (\n <span className={cn('arrow', isExpanded && 'expanded')}>\n <MChevronRightIcon />\n </span>\n ) : (\n <span className=\"spacer\" />\n )}\n </span>\n {checkable && (\n <span className=\"check\" onClick={(event) => event.stopPropagation()}>\n <MCheckbox\n size=\"sm\"\n clickEffect=\"none\"\n disabled={node.disabled}\n checked={isChecked}\n indeterminate={isIndeterminate}\n onChange={() => onCheck?.(node.id)}\n />\n </span>\n )}\n {icon && <span className=\"icon\">{icon}</span>}\n <span className=\"label\">{node.label}</span>\n </div>\n {hasChildren && isExpanded && (\n <ul\n className=\"list\"\n role=\"group\"\n style={showLines ? ({'--line-left': `${level * indent + 17}px`} as CSSProperties) : undefined}\n >\n {(node.children ?? []).map((child) => (\n <TreeItem\n key={child.id}\n node={child}\n color={color}\n level={level + 1}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={onToggle}\n onSelect={onSelect}\n checkable={checkable}\n checkedIds={checkedIds}\n indeterminateIds={indeterminateIds}\n onCheck={onCheck}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={canDropOnNode}\n onContextMenu={onContextMenu}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDrop={onDrop}\n onDragEnd={onDragEnd}\n />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\n// Render a file tree with selection, context actions and folder moves.\nexport function MTreeView({\n items,\n color = 'primary',\n expandable = true,\n selectable = false,\n defaultExpanded = [],\n expanded: controlledExpanded,\n onExpandChange,\n selected: controlledSelected,\n onSelect,\n checkable = false,\n defaultChecked = [],\n checked: controlledChecked,\n onCheckedChange,\n indent = 20,\n showLines = true,\n fileIcons = true,\n draggable = false,\n canDrop,\n onMove,\n contextMenuItems,\n onContextMenuAction,\n className,\n ...rest\n}: MTreeViewProps) {\n const [internalExpanded, setInternalExpanded] = useState<string[]>(defaultExpanded)\n const [internalSelected, setInternalSelected] = useState<string | null>(null)\n const [internalChecked, setInternalChecked] = useState<string[]>(defaultChecked)\n const [draggedId, setDraggedId] = useState<string | null>(null)\n const [dropTargetId, setDropTargetId] = useState<string | null>(null)\n const [menu, setMenu] = useState<{\n node: MTreeNode\n items: MTreeViewContextMenuItem[]\n x: number\n y: number\n } | null>(null)\n const menuRef = useRef<HTMLDivElement>(null)\n\n const expandedArr = controlledExpanded ?? internalExpanded\n const expandedIds = new Set(expandedArr)\n const selectedId = controlledSelected !== undefined ? controlledSelected : internalSelected\n const checkedArr = controlledChecked ?? internalChecked\n const checkedIds = new Set(checkedArr)\n const indeterminateIds = checkable ? computeIndeterminate(items, checkedIds) : new Set<string>()\n const {nodeMap, descendants, parentMap} = buildTreeLookup(items)\n const draggedNode = draggedId ? (nodeMap.get(draggedId) ?? null) : null\n\n useEffect(() => {\n if (!menu) return\n\n function closeMenu(event?: Event) {\n if (event && menuRef.current && menuRef.current.contains(event.target as Node)) {\n return\n }\n\n setMenu(null)\n }\n\n function handleKey(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n setMenu(null)\n }\n }\n\n document.addEventListener('mousedown', closeMenu)\n document.addEventListener('scroll', closeMenu, true)\n window.addEventListener('resize', closeMenu)\n document.addEventListener('keydown', handleKey)\n\n return () => {\n document.removeEventListener('mousedown', closeMenu)\n document.removeEventListener('scroll', closeMenu, true)\n window.removeEventListener('resize', closeMenu)\n document.removeEventListener('keydown', handleKey)\n }\n }, [menu])\n\n function handleToggle(id: string) {\n const next = expandedIds.has(id) ? expandedArr.filter((e) => e !== id) : [...expandedArr, id]\n if (onExpandChange) onExpandChange(next)\n else setInternalExpanded(next)\n }\n\n function handleSelect(id: string, node: MTreeNode) {\n if (onSelect) onSelect(id, node)\n else setInternalSelected(id)\n }\n\n function handleCheck(id: string) {\n const node = nodeMap.get(id)\n if (!node || node.disabled) return\n\n const next = new Set(checkedIds)\n const isCurrentlyChecked = next.has(id)\n const subtree = [id, ...Array.from(descendants.get(id) ?? [])]\n\n if (isCurrentlyChecked) {\n for (const sid of subtree) next.delete(sid)\n } else {\n for (const sid of subtree) {\n const sNode = nodeMap.get(sid)\n if (sNode && !sNode.disabled) next.add(sid)\n }\n }\n\n let parentId = parentMap.get(id)\n\n while (parentId) {\n const parent = nodeMap.get(parentId)\n if (!parent) break\n\n const allChildrenChecked = (parent.children ?? []).every((child) => child.disabled || next.has(child.id))\n const hasEnabledChild = (parent.children ?? []).some((child) => !child.disabled)\n\n if (allChildrenChecked && hasEnabledChild) next.add(parentId)\n else next.delete(parentId)\n\n parentId = parentMap.get(parentId)\n }\n\n const nextArr = Array.from(next)\n\n if (controlledChecked === undefined) setInternalChecked(nextArr)\n onCheckedChange?.(nextArr)\n }\n\n function closeDrag() {\n setDraggedId(null)\n setDropTargetId(null)\n }\n\n function isValidDropTarget(targetNode: MTreeNode) {\n if (!draggedNode || !draggable || !onMove) return false\n if (targetNode.disabled || !isFolderNode(targetNode)) return false\n if (targetNode.id === draggedNode.id) return false\n if (descendants.get(draggedNode.id)?.has(targetNode.id)) return false\n\n return canDrop ? canDrop(draggedNode, targetNode) : true\n }\n\n function handleContextMenu(event: MouseEvent<HTMLDivElement>, node: MTreeNode) {\n if (!contextMenuItems || node.disabled) return\n\n const items = contextMenuItems(node).filter(Boolean)\n if (!items.length) return\n\n event.preventDefault()\n handleSelect(node.id, node)\n\n const pos = clampMenuPosition(event.clientX, event.clientY)\n setMenu({\n node,\n items,\n x: pos.x,\n y: pos.y,\n })\n }\n\n function handleDragStart(event: DragEvent<HTMLDivElement>, node: MTreeNode) {\n if (!draggable || node.disabled) return\n\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.setData('text/plain', node.id)\n setMenu(null)\n setDraggedId(node.id)\n }\n\n function handleDragOver(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n if (!isValidDropTarget(targetNode)) return\n\n event.preventDefault()\n event.dataTransfer.dropEffect = 'move'\n setDropTargetId(targetNode.id)\n }\n\n function handleDrop(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n event.preventDefault()\n\n if (!draggedNode || !isValidDropTarget(targetNode)) {\n closeDrag()\n return\n }\n\n onMove?.({\n draggedId: draggedNode.id,\n draggedNode,\n targetId: targetNode.id,\n targetNode,\n } satisfies MTreeViewMoveEvent)\n\n if (expandable && !expandedIds.has(targetNode.id)) {\n handleToggle(targetNode.id)\n }\n\n closeDrag()\n }\n\n return (\n <div className={cn('tree', `color-${color}`, showLines && 'lines', className)} {...rest}>\n <ul className=\"list\" role=\"tree\">\n {items.map((item) => (\n <TreeItem\n key={item.id}\n node={item}\n color={color}\n level={0}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={handleToggle}\n onSelect={handleSelect}\n checkable={checkable}\n checkedIds={checkedIds}\n indeterminateIds={indeterminateIds}\n onCheck={handleCheck}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={isValidDropTarget}\n onContextMenu={handleContextMenu}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n onDragEnd={closeDrag}\n />\n ))}\n </ul>\n {menu && (\n <MPortal>\n <div ref={menuRef} className=\"tree menu\" style={{top: menu.y, left: menu.x}} role=\"menu\">\n {menu.items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className={cn('action', item.color, item.disabled && 'disabled')}\n role=\"menuitem\"\n disabled={item.disabled}\n onClick={() => {\n if (item.disabled) return\n onContextMenuAction?.(item.id, menu.node)\n setMenu(null)\n }}\n >\n {item.icon && <span className=\"icon\">{item.icon}</span>}\n <span>{item.label}</span>\n </button>\n ))}\n </div>\n </MPortal>\n )}\n </div>\n )\n}\n"],"mappings":"sOA+CA,IAAM,EAAyC,CAC3C,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,IAAI,EAAA,EAAA,KAAC,EAAA,GAAD,EAAe,CAAA,CACnB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,IAAI,EAAA,EAAA,KAAC,EAAA,GAAD,EAAe,CAAA,CACnB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAiB,CAAA,CACtB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,MAAM,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACtB,MAAM,EAAA,EAAA,KAAC,EAAA,GAAD,EAAiB,CAAA,CACvB,MAAM,EAAA,EAAA,KAAC,EAAA,GAAD,EAAiB,CAAA,CACvB,IAAI,EAAA,EAAA,KAAC,EAAA,GAAD,EAAe,CAAA,CACnB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,MAAM,EAAA,EAAA,KAAC,EAAA,GAAD,EAAkB,CAAA,CACxB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,MAAM,EAAA,EAAA,KAAC,EAAA,GAAD,EAAiB,CAAA,CACvB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACrB,KAAK,EAAA,EAAA,KAAC,EAAA,GAAD,EAAgB,CAAA,CACxB,CAGD,SAAS,EAAiB,EAA8B,CACpD,IAAM,EAAM,EAAM,YAAY,IAAI,CAElC,OADI,EAAM,EAAU,KACb,EAAM,MAAM,EAAM,EAAE,CAAC,aAAa,CAI7C,SAAS,EAAa,EAAiB,CACnC,OAAO,EAAK,OAAS,UAAY,EAAQ,EAAK,UAAU,OAI5D,SAAS,EAAY,EAA0B,CAC3C,IAAM,EAAM,EAAiB,EAAM,CAGnC,OAFK,EAEE,EAAY,KAAQ,EAAA,EAAA,KAAC,EAAA,GAAD,EAAiB,CAAA,EAF3B,EAAA,EAAA,KAAC,EAAA,GAAD,EAAa,CAAA,CAMlC,SAAS,GAAe,EAAiB,EAAqB,EAAoB,CAM9E,OALI,EAAK,KAAa,EAAK,KACtB,EAED,EAAa,EAAK,CAAS,GAAa,EAAA,EAAA,KAAC,EAAA,GAAD,EAAmB,CAAA,EAAG,EAAA,EAAA,KAAC,EAAA,GAAD,EAAe,CAAA,CAE1E,EAAY,EAAK,MAAM,CAJP,KAQ3B,SAAS,EAAgB,EAAoB,CACzC,IAAM,EAAU,IAAI,IACd,EAAc,IAAI,IAClB,EAAY,IAAI,IAEtB,SAAS,EAAK,EAAiB,CAC3B,EAAQ,IAAI,EAAK,GAAI,EAAK,CAE1B,IAAM,EAAW,IAAI,IAErB,IAAK,IAAM,KAAS,EAAK,UAAY,EAAE,CACnC,EAAU,IAAI,EAAM,GAAI,EAAK,GAAG,CAChC,EAAS,IAAI,EAAM,GAAG,CAEJ,EAAK,EAAM,CACnB,QAAS,GAAO,EAAS,IAAI,EAAG,CAAC,CAI/C,OADA,EAAY,IAAI,EAAK,GAAI,EAAS,CAC3B,EAKX,OAFA,EAAM,QAAQ,EAAK,CAEZ,CAAC,UAAS,cAAa,YAAU,CAI5C,SAAS,EAAqB,EAAoB,EAAmC,CACjF,IAAM,EAAgB,IAAI,IAE1B,SAAS,EAAK,EAAmD,CAC7D,GAAI,CAAC,EAAK,UAAU,OAChB,OAAO,EAAQ,IAAI,EAAK,GAAG,CAAG,CAAC,QAAS,EAAG,MAAO,EAAE,CAAG,CAAC,QAAS,EAAG,MAAO,EAAE,CAGjF,IAAI,EAAI,EACJ,EAAI,EAER,IAAK,IAAM,KAAS,EAAK,SAAU,CAC/B,IAAM,EAAI,EAAK,EAAM,CACrB,GAAK,EAAE,QACP,GAAK,EAAE,MAIX,OADI,EAAI,GAAK,EAAI,GAAG,EAAc,IAAI,EAAK,GAAG,CACvC,CAAC,QAAS,EAAG,MAAO,EAAE,CAIjC,OADA,EAAM,QAAQ,EAAK,CACZ,EAIX,SAAS,EAAkB,EAAW,EAAW,CAK7C,OAJI,OAAO,OAAW,IACX,CAAC,IAAG,IAAE,CAGV,CACH,EAAG,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,OAAO,WAAa,IAAI,CAAC,CACpD,EAAG,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,OAAO,YAAc,GAAG,CAAC,CACvD,CAIL,SAAS,EAAS,CACd,OACA,QACA,QACA,aACA,aACA,cACA,aACA,YACA,eACA,WACA,WACA,YACA,aACA,mBACA,UACA,SACA,YACA,YACA,YACA,gBACA,gBACA,cACA,aACA,SACA,aACe,CACf,IAAM,EAAc,EAAa,EAAK,CAChC,EAAa,EAAY,IAAI,EAAK,GAAG,CACrC,EAAa,IAAe,EAAK,GACjC,EAAa,IAAc,EAAK,GAChC,GAAe,IAAiB,EAAK,GACrC,EAAU,IAAgB,EAAK,CAC/B,EAAO,GAAe,EAAM,EAAY,CAAC,CAAC,EAAU,CACpD,EAAY,GAAY,IAAI,EAAK,GAAG,EAAI,GACxC,EAAkB,GAAkB,IAAI,EAAK,GAAG,EAAI,GAE1D,OACI,EAAA,EAAA,MAAC,KAAD,CAAI,KAAK,WAAW,gBAAe,EAAc,EAAa,IAAA,YAA9D,EACI,EAAA,EAAA,MAAC,MAAD,CACI,UAAW,EAAA,EACP,OACA,GAAc,WACd,EAAK,UAAY,WACjB,GAAc,CAAC,EAAK,UAAY,aAChC,GAAa,CAAC,EAAK,UAAY,YAC/B,GAAc,WACd,GAAW,WACX,IAAgB,cACnB,CACD,aAAY,EACZ,MAAO,CAAC,YAAa,EAAQ,EAAO,CACpC,UAAW,GAAa,CAAC,EAAK,SAC9B,YAAe,CACP,EAAK,WACL,GAAe,GAAY,EAAS,EAAK,GAAG,CAC5C,GAAY,IAAW,EAAK,GAAI,EAAK,GAE7C,cAAgB,GAAU,IAAgB,EAAO,EAAK,CACtD,YAAc,GAAU,IAAc,EAAO,EAAK,CAClD,WAAa,GAAU,IAAa,EAAO,EAAK,CAChD,OAAS,GAAU,IAAS,EAAO,EAAK,CAC7B,qBAvBf,EAyBI,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,kBACX,GAAe,GACZ,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAA,EAAG,QAAS,GAAc,WAAW,WAClD,EAAA,EAAA,KAAC,EAAA,GAAD,EAAqB,CAAA,CAClB,CAAA,EAEP,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,SAAW,CAAA,CAE5B,CAAA,CACN,IACG,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,QAAQ,QAAU,GAAU,EAAM,iBAAiB,WAC/D,EAAA,EAAA,KAAC,EAAA,EAAD,CACI,KAAK,KACL,YAAY,OACZ,SAAU,EAAK,SACf,QAAS,EACT,cAAe,EACf,aAAgB,IAAU,EAAK,GAAG,CACpC,CAAA,CACC,CAAA,CAEV,IAAQ,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,gBAAQ,EAAY,CAAA,EAC7C,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,iBAAS,EAAK,MAAa,CAAA,CACzC,GACL,GAAe,IACZ,EAAA,EAAA,KAAC,KAAD,CACI,UAAU,OACV,KAAK,QACL,MAAO,EAAa,CAAC,cAAe,GAAG,EAAQ,EAAS,GAAG,IAAI,CAAqB,IAAA,aAElF,EAAK,UAAY,EAAE,EAAE,IAAK,IACxB,EAAA,EAAA,KAAC,EAAD,CAEI,KAAM,EACC,QACP,MAAO,EAAQ,EACH,aACA,aACC,cACD,aACD,YACG,eACJ,WACA,WACC,YACC,aACM,mBACT,UACD,SACG,YACA,YACA,YACI,gBACA,gBACF,cACD,aACJ,SACG,YACb,CA1BO,EAAM,GA0Bb,CACJ,CACD,CAAA,CAER,GAKb,SAAgB,EAAU,CACtB,QACA,QAAQ,UACR,aAAa,GACb,aAAa,GACb,kBAAkB,EAAE,CACpB,SAAU,GACV,iBACA,SAAU,EACV,WACA,YAAY,GACZ,iBAAiB,EAAE,CACnB,QAAS,EACT,kBACA,SAAS,GACT,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,UACA,SACA,mBACA,sBACA,YACA,GAAG,GACY,CACf,GAAM,CAAC,EAAkB,IAAA,EAAA,EAAA,UAA0C,EAAgB,CAC7E,CAAC,EAAkB,IAAA,EAAA,EAAA,UAA+C,KAAK,CACvE,CAAC,GAAiB,IAAA,EAAA,EAAA,UAAyC,EAAe,CAC1E,CAAC,EAAW,IAAA,EAAA,EAAA,UAAwC,KAAK,CACzD,CAAC,EAAc,IAAA,EAAA,EAAA,UAA2C,KAAK,CAC/D,CAAC,EAAM,IAAA,EAAA,EAAA,UAKH,KAAK,CACT,GAAA,EAAA,EAAA,QAAiC,KAAK,CAEtC,EAAc,IAAsB,EACpC,EAAc,IAAI,IAAI,EAAY,CAClC,GAAa,IAAuB,IAAA,GAAiC,EAArB,EAEhD,EAAa,IAAI,IADJ,GAAqB,GACF,CAChC,GAAmB,EAAY,EAAqB,EAAO,EAAW,CAAG,IAAI,IAC7E,CAAC,UAAS,cAAa,aAAa,EAAgB,EAAM,CAC1D,EAAc,EAAa,EAAQ,IAAI,EAAU,EAAI,KAAQ,MAEnE,EAAA,EAAA,eAAgB,CACZ,GAAI,CAAC,EAAM,OAEX,SAAS,EAAU,EAAe,CAC1B,GAAS,EAAQ,SAAW,EAAQ,QAAQ,SAAS,EAAM,OAAe,EAI9E,EAAQ,KAAK,CAGjB,SAAS,EAAU,EAAsB,CACjC,EAAM,MAAQ,UACd,EAAQ,KAAK,CASrB,OALA,SAAS,iBAAiB,YAAa,EAAU,CACjD,SAAS,iBAAiB,SAAU,EAAW,GAAK,CACpD,OAAO,iBAAiB,SAAU,EAAU,CAC5C,SAAS,iBAAiB,UAAW,EAAU,KAElC,CACT,SAAS,oBAAoB,YAAa,EAAU,CACpD,SAAS,oBAAoB,SAAU,EAAW,GAAK,CACvD,OAAO,oBAAoB,SAAU,EAAU,CAC/C,SAAS,oBAAoB,UAAW,EAAU,GAEvD,CAAC,EAAK,CAAC,CAEV,SAAS,EAAa,EAAY,CAC9B,IAAM,EAAO,EAAY,IAAI,EAAG,CAAG,EAAY,OAAQ,GAAM,IAAM,EAAG,CAAG,CAAC,GAAG,EAAa,EAAG,CACzF,EAAgB,EAAe,EAAK,CACnC,EAAoB,EAAK,CAGlC,SAAS,EAAa,EAAY,EAAiB,CAC3C,EAAU,EAAS,EAAI,EAAK,CAC3B,EAAoB,EAAG,CAGhC,SAAS,GAAY,EAAY,CAC7B,IAAM,EAAO,EAAQ,IAAI,EAAG,CAC5B,GAAI,CAAC,GAAQ,EAAK,SAAU,OAE5B,IAAM,EAAO,IAAI,IAAI,EAAW,CAC1B,EAAqB,EAAK,IAAI,EAAG,CACjC,EAAU,CAAC,EAAI,GAAG,MAAM,KAAK,EAAY,IAAI,EAAG,EAAI,EAAE,CAAC,CAAC,CAE9D,GAAI,EACA,IAAK,IAAM,KAAO,EAAS,EAAK,OAAO,EAAI,MAE3C,IAAK,IAAM,KAAO,EAAS,CACvB,IAAM,EAAQ,EAAQ,IAAI,EAAI,CAC1B,GAAS,CAAC,EAAM,UAAU,EAAK,IAAI,EAAI,CAInD,IAAI,EAAW,EAAU,IAAI,EAAG,CAEhC,KAAO,GAAU,CACb,IAAM,EAAS,EAAQ,IAAI,EAAS,CACpC,GAAI,CAAC,EAAQ,MAEb,IAAM,GAAsB,EAAO,UAAY,EAAE,EAAE,MAAO,GAAU,EAAM,UAAY,EAAK,IAAI,EAAM,GAAG,CAAC,CACnG,GAAmB,EAAO,UAAY,EAAE,EAAE,KAAM,GAAU,CAAC,EAAM,SAAS,CAE5E,GAAsB,EAAiB,EAAK,IAAI,EAAS,CACxD,EAAK,OAAO,EAAS,CAE1B,EAAW,EAAU,IAAI,EAAS,CAGtC,IAAM,EAAU,MAAM,KAAK,EAAK,CAE5B,IAAsB,IAAA,IAAW,EAAmB,EAAQ,CAChE,IAAkB,EAAQ,CAG9B,SAAS,GAAY,CACjB,EAAa,KAAK,CAClB,EAAgB,KAAK,CAGzB,SAAS,EAAkB,EAAuB,CAM9C,MALI,CAAC,GAAe,CAAC,GAAa,CAAC,GAC/B,EAAW,UAAY,CAAC,EAAa,EAAW,EAChD,EAAW,KAAO,EAAY,IAC9B,EAAY,IAAI,EAAY,GAAG,EAAE,IAAI,EAAW,GAAG,CAAS,GAEzD,EAAU,EAAQ,EAAa,EAAW,CAAG,GAGxD,SAAS,GAAkB,EAAmC,EAAiB,CAC3E,GAAI,CAAC,GAAoB,EAAK,SAAU,OAExC,IAAM,EAAQ,EAAiB,EAAK,CAAC,OAAO,QAAQ,CACpD,GAAI,CAAC,EAAM,OAAQ,OAEnB,EAAM,gBAAgB,CACtB,EAAa,EAAK,GAAI,EAAK,CAE3B,IAAM,EAAM,EAAkB,EAAM,QAAS,EAAM,QAAQ,CAC3D,EAAQ,CACJ,OACA,QACA,EAAG,EAAI,EACP,EAAG,EAAI,EACV,CAAC,CAGN,SAAS,GAAgB,EAAkC,EAAiB,CACpE,CAAC,GAAa,EAAK,WAEvB,EAAM,aAAa,cAAgB,OACnC,EAAM,aAAa,QAAQ,aAAc,EAAK,GAAG,CACjD,EAAQ,KAAK,CACb,EAAa,EAAK,GAAG,EAGzB,SAAS,GAAe,EAAkC,EAAuB,CACxE,EAAkB,EAAW,GAElC,EAAM,gBAAgB,CACtB,EAAM,aAAa,WAAa,OAChC,EAAgB,EAAW,GAAG,EAGlC,SAAS,GAAW,EAAkC,EAAuB,CAGzE,GAFA,EAAM,gBAAgB,CAElB,CAAC,GAAe,CAAC,EAAkB,EAAW,CAAE,CAChD,GAAW,CACX,OAGJ,IAAS,CACL,UAAW,EAAY,GACvB,cACA,SAAU,EAAW,GACrB,aACH,CAA8B,CAE3B,GAAc,CAAC,EAAY,IAAI,EAAW,GAAG,EAC7C,EAAa,EAAW,GAAG,CAG/B,GAAW,CAGf,OACI,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,EAAA,EAAG,OAAQ,SAAS,IAAS,GAAa,QAAS,EAAU,CAAE,GAAI,WAAnF,EACI,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,OAAO,KAAK,gBACrB,EAAM,IAAK,IACR,EAAA,EAAA,KAAC,EAAD,CAEI,KAAM,EACC,QACP,MAAO,EACK,aACA,aACC,cACD,cACD,YACG,eACd,SAAU,EACV,SAAU,EACC,YACC,aACM,oBAClB,QAAS,GACD,SACG,YACA,YACA,YACX,cAAe,EACf,cAAe,GACf,YAAa,GACb,WAAY,GACZ,OAAQ,GACR,UAAW,EACb,CA1BO,EAAK,GA0BZ,CACJ,CACD,CAAA,CACJ,IACG,EAAA,EAAA,KAAC,EAAA,EAAD,CAAA,UACI,EAAA,EAAA,KAAC,MAAD,CAAK,IAAK,EAAS,UAAU,YAAY,MAAO,CAAC,IAAK,EAAK,EAAG,KAAM,EAAK,EAAE,CAAE,KAAK,gBAC7E,EAAK,MAAM,IAAK,IACb,EAAA,EAAA,MAAC,SAAD,CAEI,KAAK,SACL,UAAW,EAAA,EAAG,SAAU,EAAK,MAAO,EAAK,UAAY,WAAW,CAChE,KAAK,WACL,SAAU,EAAK,SACf,YAAe,CACP,EAAK,WACT,IAAsB,EAAK,GAAI,EAAK,KAAK,CACzC,EAAQ,KAAK,YATrB,CAYK,EAAK,OAAQ,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,gBAAQ,EAAK,KAAY,CAAA,EACvD,EAAA,EAAA,KAAC,OAAD,CAAA,SAAO,EAAK,MAAa,CAAA,CACpB,EAbA,EAAK,GAaL,CACX,CACA,CAAA,CACA,CAAA,CAEZ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MTreeView-DTsi4bye.js","names":[],"sources":["../src/components/data/MTreeView/MTreeView.tsx"],"sourcesContent":["import {useEffect, useRef, useState} from 'react'\nimport type {CSSProperties, DragEvent, MouseEvent, ReactNode} from 'react'\nimport type {\n MTreeViewProps,\n MTreeItemProps,\n MTreeNode,\n MTreeViewContextMenuItem,\n MTreeViewMoveEvent,\n} from './MTreeView.types'\nimport {cn} from '../../../utils/cn'\nimport {MCheckbox} from '../../controls'\nimport {MPortal} from '../../primitives'\nimport {\n MChevronRightIcon,\n MFileCodeIcon,\n MFileCsvIcon,\n MFileCssIcon,\n MFileExeIcon,\n MFileGifIcon,\n MFileHtmlIcon,\n MFileIcon,\n MFileImageIcon,\n MFileJpgIcon,\n MFileJsIcon,\n MFileJsonIcon,\n MFileMdIcon,\n MFileMp3Icon,\n MFileMp4Icon,\n MFileOdtIcon,\n MFilePdfIcon,\n MFilePhpIcon,\n MFilePngIcon,\n MFilePptIcon,\n MFileRarIcon,\n MFileSvgIcon,\n MFileTextIcon,\n MFileTsIcon,\n MFileTsxIcon,\n MFileTxtIcon,\n MFileWebpIcon,\n MFileXlsIcon,\n MFileXmlIcon,\n MFileZipIcon,\n MFolderIcon,\n MFolderOpenIcon,\n} from '../../../icons'\nimport './MTreeView.css'\nconst fileTypeMap: Record<string, ReactNode> = {\n pdf: <MFilePdfIcon />,\n ts: <MFileTsIcon />,\n tsx: <MFileTsxIcon />,\n js: <MFileJsIcon />,\n jsx: <MFileCodeIcon />,\n css: <MFileCssIcon />,\n scss: <MFileCssIcon />,\n html: <MFileHtmlIcon />,\n json: <MFileJsonIcon />,\n md: <MFileMdIcon />,\n txt: <MFileTxtIcon />,\n csv: <MFileCsvIcon />,\n zip: <MFileZipIcon />,\n rar: <MFileRarIcon />,\n svg: <MFileSvgIcon />,\n png: <MFilePngIcon />,\n jpg: <MFileJpgIcon />,\n jpeg: <MFileImageIcon />,\n gif: <MFileGifIcon />,\n webp: <MFileWebpIcon />,\n php: <MFilePhpIcon />,\n xml: <MFileXmlIcon />,\n xls: <MFileXlsIcon />,\n ppt: <MFilePptIcon />,\n odt: <MFileOdtIcon />,\n exe: <MFileExeIcon />,\n mp3: <MFileMp3Icon />,\n mp4: <MFileMp4Icon />,\n}\n\n// Read the file extension once so icon logic stays predictable.\nfunction getFileExtension(label: string): string | null {\n const dot = label.lastIndexOf('.')\n if (dot < 1) return null\n return label.slice(dot + 1).toLowerCase()\n}\n\n// Treat explicit folders and nodes with children as directory-like.\nfunction isFolderNode(node: MTreeNode) {\n return node.kind === 'folder' || Boolean(node.children?.length)\n}\n\n// Resolve the proper file icon by extension.\nfunction getFileIcon(label: string): ReactNode {\n const ext = getFileExtension(label)\n if (!ext) return <MFileIcon />\n\n return fileTypeMap[ext] ?? <MFileTextIcon />\n}\n\n// Prefer custom icons first, then fall back to folder or file visuals.\nfunction getDefaultIcon(node: MTreeNode, isExpanded: boolean, fileIcons: boolean) {\n if (node.icon) return node.icon\n if (!fileIcons) return null\n\n if (isFolderNode(node)) return isExpanded ? <MFolderOpenIcon /> : <MFolderIcon />\n\n return getFileIcon(node.label)\n}\n\n// Cache nodes and descendants so drag-drop validation stays fast.\nfunction buildTreeLookup(items: MTreeNode[]) {\n const nodeMap = new Map<string, MTreeNode>()\n const descendants = new Map<string, Set<string>>()\n const parentMap = new Map<string, string>()\n\n function walk(node: MTreeNode) {\n nodeMap.set(node.id, node)\n\n const childIds = new Set<string>()\n\n for (const child of node.children ?? []) {\n parentMap.set(child.id, node.id)\n childIds.add(child.id)\n\n const nestedIds = walk(child)\n nestedIds.forEach((id) => childIds.add(id))\n }\n\n descendants.set(node.id, childIds)\n return childIds\n }\n\n items.forEach(walk)\n\n return {nodeMap, descendants, parentMap}\n}\n\n// Compute indeterminate ids: a node where some but not all leaf descendants are checked.\nfunction computeIndeterminate(items: MTreeNode[], checked: Set<string>): Set<string> {\n const indeterminate = new Set<string>()\n\n function walk(node: MTreeNode): {checked: number; total: number} {\n if (!node.children?.length) {\n return checked.has(node.id) ? {checked: 1, total: 1} : {checked: 0, total: 1}\n }\n\n let c = 0\n let t = 0\n\n for (const child of node.children) {\n const r = walk(child)\n c += r.checked\n t += r.total\n }\n\n if (c > 0 && c < t) indeterminate.add(node.id)\n return {checked: c, total: t}\n }\n\n items.forEach(walk)\n return indeterminate\n}\n\n// Keep the context menu inside the viewport.\nfunction clampMenuPosition(x: number, y: number) {\n if (typeof window === 'undefined') {\n return {x, y}\n }\n\n return {\n x: Math.max(8, Math.min(x, window.innerWidth - 220)),\n y: Math.max(8, Math.min(y, window.innerHeight - 16)),\n }\n}\n\n// Render one visible row and recurse into children when expanded.\nfunction TreeItem({\n node,\n color,\n level,\n expandable,\n selectable,\n expandedIds,\n selectedId,\n draggedId,\n dropTargetId,\n onToggle,\n onSelect,\n checkable,\n checkedIds,\n indeterminateIds,\n onCheck,\n indent,\n showLines,\n fileIcons,\n draggable,\n canDropOnNode,\n onContextMenu,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n}: MTreeItemProps) {\n const hasChildren = isFolderNode(node)\n const isExpanded = expandedIds.has(node.id)\n const isSelected = selectedId === node.id\n const isDragging = draggedId === node.id\n const isDropTarget = dropTargetId === node.id\n const canDrop = canDropOnNode?.(node)\n const icon = getDefaultIcon(node, isExpanded, !!fileIcons)\n const isChecked = checkedIds?.has(node.id) ?? false\n const isIndeterminate = indeterminateIds?.has(node.id) ?? false\n\n return (\n <li role=\"treeitem\" aria-expanded={hasChildren ? isExpanded : undefined}>\n <div\n className={cn(\n 'item',\n isSelected && 'selected',\n node.disabled && 'disabled',\n selectable && !node.disabled && 'selectable',\n draggable && !node.disabled && 'draggable',\n isDragging && 'dragging',\n canDrop && 'can-drop',\n isDropTarget && 'drop-target'\n )}\n data-color={color}\n style={{paddingLeft: level * indent}}\n draggable={draggable && !node.disabled}\n onClick={() => {\n if (node.disabled) return\n if (hasChildren && expandable) onToggle(node.id)\n if (selectable) onSelect?.(node.id, node)\n }}\n onContextMenu={(event) => onContextMenu?.(event, node)}\n onDragStart={(event) => onDragStart?.(event, node)}\n onDragOver={(event) => onDragOver?.(event, node)}\n onDrop={(event) => onDrop?.(event, node)}\n onDragEnd={onDragEnd}\n >\n <span className=\"toggle\">\n {hasChildren && expandable ? (\n <span className={cn('arrow', isExpanded && 'expanded')}>\n <MChevronRightIcon />\n </span>\n ) : (\n <span className=\"spacer\" />\n )}\n </span>\n {checkable && (\n <span className=\"check\" onClick={(event) => event.stopPropagation()}>\n <MCheckbox\n size=\"sm\"\n clickEffect=\"none\"\n disabled={node.disabled}\n checked={isChecked}\n indeterminate={isIndeterminate}\n onChange={() => onCheck?.(node.id)}\n />\n </span>\n )}\n {icon && <span className=\"icon\">{icon}</span>}\n <span className=\"label\">{node.label}</span>\n </div>\n {hasChildren && isExpanded && (\n <ul\n className=\"list\"\n role=\"group\"\n style={showLines ? ({'--line-left': `${level * indent + 17}px`} as CSSProperties) : undefined}\n >\n {(node.children ?? []).map((child) => (\n <TreeItem\n key={child.id}\n node={child}\n color={color}\n level={level + 1}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={onToggle}\n onSelect={onSelect}\n checkable={checkable}\n checkedIds={checkedIds}\n indeterminateIds={indeterminateIds}\n onCheck={onCheck}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={canDropOnNode}\n onContextMenu={onContextMenu}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDrop={onDrop}\n onDragEnd={onDragEnd}\n />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\n// Render a file tree with selection, context actions and folder moves.\nexport function MTreeView({\n items,\n color = 'primary',\n expandable = true,\n selectable = false,\n defaultExpanded = [],\n expanded: controlledExpanded,\n onExpandChange,\n selected: controlledSelected,\n onSelect,\n checkable = false,\n defaultChecked = [],\n checked: controlledChecked,\n onCheckedChange,\n indent = 20,\n showLines = true,\n fileIcons = true,\n draggable = false,\n canDrop,\n onMove,\n contextMenuItems,\n onContextMenuAction,\n className,\n ...rest\n}: MTreeViewProps) {\n const [internalExpanded, setInternalExpanded] = useState<string[]>(defaultExpanded)\n const [internalSelected, setInternalSelected] = useState<string | null>(null)\n const [internalChecked, setInternalChecked] = useState<string[]>(defaultChecked)\n const [draggedId, setDraggedId] = useState<string | null>(null)\n const [dropTargetId, setDropTargetId] = useState<string | null>(null)\n const [menu, setMenu] = useState<{\n node: MTreeNode\n items: MTreeViewContextMenuItem[]\n x: number\n y: number\n } | null>(null)\n const menuRef = useRef<HTMLDivElement>(null)\n\n const expandedArr = controlledExpanded ?? internalExpanded\n const expandedIds = new Set(expandedArr)\n const selectedId = controlledSelected !== undefined ? controlledSelected : internalSelected\n const checkedArr = controlledChecked ?? internalChecked\n const checkedIds = new Set(checkedArr)\n const indeterminateIds = checkable ? computeIndeterminate(items, checkedIds) : new Set<string>()\n const {nodeMap, descendants, parentMap} = buildTreeLookup(items)\n const draggedNode = draggedId ? (nodeMap.get(draggedId) ?? null) : null\n\n useEffect(() => {\n if (!menu) return\n\n function closeMenu(event?: Event) {\n if (event && menuRef.current && menuRef.current.contains(event.target as Node)) {\n return\n }\n\n setMenu(null)\n }\n\n function handleKey(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n setMenu(null)\n }\n }\n\n document.addEventListener('mousedown', closeMenu)\n document.addEventListener('scroll', closeMenu, true)\n window.addEventListener('resize', closeMenu)\n document.addEventListener('keydown', handleKey)\n\n return () => {\n document.removeEventListener('mousedown', closeMenu)\n document.removeEventListener('scroll', closeMenu, true)\n window.removeEventListener('resize', closeMenu)\n document.removeEventListener('keydown', handleKey)\n }\n }, [menu])\n\n function handleToggle(id: string) {\n const next = expandedIds.has(id) ? expandedArr.filter((e) => e !== id) : [...expandedArr, id]\n if (onExpandChange) onExpandChange(next)\n else setInternalExpanded(next)\n }\n\n function handleSelect(id: string, node: MTreeNode) {\n if (onSelect) onSelect(id, node)\n else setInternalSelected(id)\n }\n\n function handleCheck(id: string) {\n const node = nodeMap.get(id)\n if (!node || node.disabled) return\n\n const next = new Set(checkedIds)\n const isCurrentlyChecked = next.has(id)\n const subtree = [id, ...Array.from(descendants.get(id) ?? [])]\n\n if (isCurrentlyChecked) {\n for (const sid of subtree) next.delete(sid)\n } else {\n for (const sid of subtree) {\n const sNode = nodeMap.get(sid)\n if (sNode && !sNode.disabled) next.add(sid)\n }\n }\n\n let parentId = parentMap.get(id)\n\n while (parentId) {\n const parent = nodeMap.get(parentId)\n if (!parent) break\n\n const allChildrenChecked = (parent.children ?? []).every((child) => child.disabled || next.has(child.id))\n const hasEnabledChild = (parent.children ?? []).some((child) => !child.disabled)\n\n if (allChildrenChecked && hasEnabledChild) next.add(parentId)\n else next.delete(parentId)\n\n parentId = parentMap.get(parentId)\n }\n\n const nextArr = Array.from(next)\n\n if (controlledChecked === undefined) setInternalChecked(nextArr)\n onCheckedChange?.(nextArr)\n }\n\n function closeDrag() {\n setDraggedId(null)\n setDropTargetId(null)\n }\n\n function isValidDropTarget(targetNode: MTreeNode) {\n if (!draggedNode || !draggable || !onMove) return false\n if (targetNode.disabled || !isFolderNode(targetNode)) return false\n if (targetNode.id === draggedNode.id) return false\n if (descendants.get(draggedNode.id)?.has(targetNode.id)) return false\n\n return canDrop ? canDrop(draggedNode, targetNode) : true\n }\n\n function handleContextMenu(event: MouseEvent<HTMLDivElement>, node: MTreeNode) {\n if (!contextMenuItems || node.disabled) return\n\n const items = contextMenuItems(node).filter(Boolean)\n if (!items.length) return\n\n event.preventDefault()\n handleSelect(node.id, node)\n\n const pos = clampMenuPosition(event.clientX, event.clientY)\n setMenu({\n node,\n items,\n x: pos.x,\n y: pos.y,\n })\n }\n\n function handleDragStart(event: DragEvent<HTMLDivElement>, node: MTreeNode) {\n if (!draggable || node.disabled) return\n\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.setData('text/plain', node.id)\n setMenu(null)\n setDraggedId(node.id)\n }\n\n function handleDragOver(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n if (!isValidDropTarget(targetNode)) return\n\n event.preventDefault()\n event.dataTransfer.dropEffect = 'move'\n setDropTargetId(targetNode.id)\n }\n\n function handleDrop(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n event.preventDefault()\n\n if (!draggedNode || !isValidDropTarget(targetNode)) {\n closeDrag()\n return\n }\n\n onMove?.({\n draggedId: draggedNode.id,\n draggedNode,\n targetId: targetNode.id,\n targetNode,\n } satisfies MTreeViewMoveEvent)\n\n if (expandable && !expandedIds.has(targetNode.id)) {\n handleToggle(targetNode.id)\n }\n\n closeDrag()\n }\n\n return (\n <div className={cn('tree', `color-${color}`, showLines && 'lines', className)} {...rest}>\n <ul className=\"list\" role=\"tree\">\n {items.map((item) => (\n <TreeItem\n key={item.id}\n node={item}\n color={color}\n level={0}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={handleToggle}\n onSelect={handleSelect}\n checkable={checkable}\n checkedIds={checkedIds}\n indeterminateIds={indeterminateIds}\n onCheck={handleCheck}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={isValidDropTarget}\n onContextMenu={handleContextMenu}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n onDragEnd={closeDrag}\n />\n ))}\n </ul>\n {menu && (\n <MPortal>\n <div ref={menuRef} className=\"tree menu\" style={{top: menu.y, left: menu.x}} role=\"menu\">\n {menu.items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className={cn('action', item.color, item.disabled && 'disabled')}\n role=\"menuitem\"\n disabled={item.disabled}\n onClick={() => {\n if (item.disabled) return\n onContextMenuAction?.(item.id, menu.node)\n setMenu(null)\n }}\n >\n {item.icon && <span className=\"icon\">{item.icon}</span>}\n <span>{item.label}</span>\n </button>\n ))}\n </div>\n </MPortal>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MTreeView-DQaRF0ty.js","names":[],"sources":["../src/components/data/MTreeView/MTreeView.tsx"],"sourcesContent":["import {useEffect, useRef, useState} from 'react'\nimport type {CSSProperties, DragEvent, MouseEvent, ReactNode} from 'react'\nimport type {\n MTreeViewProps,\n MTreeItemProps,\n MTreeNode,\n MTreeViewContextMenuItem,\n MTreeViewMoveEvent,\n} from './MTreeView.types'\nimport {cn} from '../../../utils/cn'\nimport {MCheckbox} from '../../controls'\nimport {MPortal} from '../../primitives'\nimport {\n MChevronRightIcon,\n MFileCodeIcon,\n MFileCsvIcon,\n MFileCssIcon,\n MFileExeIcon,\n MFileGifIcon,\n MFileHtmlIcon,\n MFileIcon,\n MFileImageIcon,\n MFileJpgIcon,\n MFileJsIcon,\n MFileJsonIcon,\n MFileMdIcon,\n MFileMp3Icon,\n MFileMp4Icon,\n MFileOdtIcon,\n MFilePdfIcon,\n MFilePhpIcon,\n MFilePngIcon,\n MFilePptIcon,\n MFileRarIcon,\n MFileSvgIcon,\n MFileTextIcon,\n MFileTsIcon,\n MFileTsxIcon,\n MFileTxtIcon,\n MFileWebpIcon,\n MFileXlsIcon,\n MFileXmlIcon,\n MFileZipIcon,\n MFolderIcon,\n MFolderOpenIcon,\n} from '../../../icons'\nimport './MTreeView.css'\nconst fileTypeMap: Record<string, ReactNode> = {\n pdf: <MFilePdfIcon />,\n ts: <MFileTsIcon />,\n tsx: <MFileTsxIcon />,\n js: <MFileJsIcon />,\n jsx: <MFileCodeIcon />,\n css: <MFileCssIcon />,\n scss: <MFileCssIcon />,\n html: <MFileHtmlIcon />,\n json: <MFileJsonIcon />,\n md: <MFileMdIcon />,\n txt: <MFileTxtIcon />,\n csv: <MFileCsvIcon />,\n zip: <MFileZipIcon />,\n rar: <MFileRarIcon />,\n svg: <MFileSvgIcon />,\n png: <MFilePngIcon />,\n jpg: <MFileJpgIcon />,\n jpeg: <MFileImageIcon />,\n gif: <MFileGifIcon />,\n webp: <MFileWebpIcon />,\n php: <MFilePhpIcon />,\n xml: <MFileXmlIcon />,\n xls: <MFileXlsIcon />,\n ppt: <MFilePptIcon />,\n odt: <MFileOdtIcon />,\n exe: <MFileExeIcon />,\n mp3: <MFileMp3Icon />,\n mp4: <MFileMp4Icon />,\n}\n\n// Read the file extension once so icon logic stays predictable.\nfunction getFileExtension(label: string): string | null {\n const dot = label.lastIndexOf('.')\n if (dot < 1) return null\n return label.slice(dot + 1).toLowerCase()\n}\n\n// Treat explicit folders and nodes with children as directory-like.\nfunction isFolderNode(node: MTreeNode) {\n return node.kind === 'folder' || Boolean(node.children?.length)\n}\n\n// Resolve the proper file icon by extension.\nfunction getFileIcon(label: string): ReactNode {\n const ext = getFileExtension(label)\n if (!ext) return <MFileIcon />\n\n return fileTypeMap[ext] ?? <MFileTextIcon />\n}\n\n// Prefer custom icons first, then fall back to folder or file visuals.\nfunction getDefaultIcon(node: MTreeNode, isExpanded: boolean, fileIcons: boolean) {\n if (node.icon) return node.icon\n if (!fileIcons) return null\n\n if (isFolderNode(node)) return isExpanded ? <MFolderOpenIcon /> : <MFolderIcon />\n\n return getFileIcon(node.label)\n}\n\n// Cache nodes and descendants so drag-drop validation stays fast.\nfunction buildTreeLookup(items: MTreeNode[]) {\n const nodeMap = new Map<string, MTreeNode>()\n const descendants = new Map<string, Set<string>>()\n const parentMap = new Map<string, string>()\n\n function walk(node: MTreeNode) {\n nodeMap.set(node.id, node)\n\n const childIds = new Set<string>()\n\n for (const child of node.children ?? []) {\n parentMap.set(child.id, node.id)\n childIds.add(child.id)\n\n const nestedIds = walk(child)\n nestedIds.forEach((id) => childIds.add(id))\n }\n\n descendants.set(node.id, childIds)\n return childIds\n }\n\n items.forEach(walk)\n\n return {nodeMap, descendants, parentMap}\n}\n\n// Compute indeterminate ids: a node where some but not all leaf descendants are checked.\nfunction computeIndeterminate(items: MTreeNode[], checked: Set<string>): Set<string> {\n const indeterminate = new Set<string>()\n\n function walk(node: MTreeNode): {checked: number; total: number} {\n if (!node.children?.length) {\n return checked.has(node.id) ? {checked: 1, total: 1} : {checked: 0, total: 1}\n }\n\n let c = 0\n let t = 0\n\n for (const child of node.children) {\n const r = walk(child)\n c += r.checked\n t += r.total\n }\n\n if (c > 0 && c < t) indeterminate.add(node.id)\n return {checked: c, total: t}\n }\n\n items.forEach(walk)\n return indeterminate\n}\n\n// Keep the context menu inside the viewport.\nfunction clampMenuPosition(x: number, y: number) {\n if (typeof window === 'undefined') {\n return {x, y}\n }\n\n return {\n x: Math.max(8, Math.min(x, window.innerWidth - 220)),\n y: Math.max(8, Math.min(y, window.innerHeight - 16)),\n }\n}\n\n// Render one visible row and recurse into children when expanded.\nfunction TreeItem({\n node,\n color,\n level,\n expandable,\n selectable,\n expandedIds,\n selectedId,\n draggedId,\n dropTargetId,\n onToggle,\n onSelect,\n checkable,\n checkedIds,\n indeterminateIds,\n onCheck,\n indent,\n showLines,\n fileIcons,\n draggable,\n canDropOnNode,\n onContextMenu,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n}: MTreeItemProps) {\n const hasChildren = isFolderNode(node)\n const isExpanded = expandedIds.has(node.id)\n const isSelected = selectedId === node.id\n const isDragging = draggedId === node.id\n const isDropTarget = dropTargetId === node.id\n const canDrop = canDropOnNode?.(node)\n const icon = getDefaultIcon(node, isExpanded, !!fileIcons)\n const isChecked = checkedIds?.has(node.id) ?? false\n const isIndeterminate = indeterminateIds?.has(node.id) ?? false\n\n return (\n <li role=\"treeitem\" aria-expanded={hasChildren ? isExpanded : undefined}>\n <div\n className={cn(\n 'item',\n isSelected && 'selected',\n node.disabled && 'disabled',\n selectable && !node.disabled && 'selectable',\n draggable && !node.disabled && 'draggable',\n isDragging && 'dragging',\n canDrop && 'can-drop',\n isDropTarget && 'drop-target'\n )}\n data-color={color}\n style={{paddingLeft: level * indent}}\n draggable={draggable && !node.disabled}\n onClick={() => {\n if (node.disabled) return\n if (hasChildren && expandable) onToggle(node.id)\n if (selectable) onSelect?.(node.id, node)\n }}\n onContextMenu={(event) => onContextMenu?.(event, node)}\n onDragStart={(event) => onDragStart?.(event, node)}\n onDragOver={(event) => onDragOver?.(event, node)}\n onDrop={(event) => onDrop?.(event, node)}\n onDragEnd={onDragEnd}\n >\n <span className=\"toggle\">\n {hasChildren && expandable ? (\n <span className={cn('arrow', isExpanded && 'expanded')}>\n <MChevronRightIcon />\n </span>\n ) : (\n <span className=\"spacer\" />\n )}\n </span>\n {checkable && (\n <span className=\"check\" onClick={(event) => event.stopPropagation()}>\n <MCheckbox\n size=\"sm\"\n clickEffect=\"none\"\n disabled={node.disabled}\n checked={isChecked}\n indeterminate={isIndeterminate}\n onChange={() => onCheck?.(node.id)}\n />\n </span>\n )}\n {icon && <span className=\"icon\">{icon}</span>}\n <span className=\"label\">{node.label}</span>\n </div>\n {hasChildren && isExpanded && (\n <ul\n className=\"list\"\n role=\"group\"\n style={showLines ? ({'--line-left': `${level * indent + 17}px`} as CSSProperties) : undefined}\n >\n {(node.children ?? []).map((child) => (\n <TreeItem\n key={child.id}\n node={child}\n color={color}\n level={level + 1}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={onToggle}\n onSelect={onSelect}\n checkable={checkable}\n checkedIds={checkedIds}\n indeterminateIds={indeterminateIds}\n onCheck={onCheck}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={canDropOnNode}\n onContextMenu={onContextMenu}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDrop={onDrop}\n onDragEnd={onDragEnd}\n />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\n// Render a file tree with selection, context actions and folder moves.\nexport function MTreeView({\n items,\n color = 'primary',\n expandable = true,\n selectable = false,\n defaultExpanded = [],\n expanded: controlledExpanded,\n onExpandChange,\n selected: controlledSelected,\n onSelect,\n checkable = false,\n defaultChecked = [],\n checked: controlledChecked,\n onCheckedChange,\n indent = 20,\n showLines = true,\n fileIcons = true,\n draggable = false,\n canDrop,\n onMove,\n contextMenuItems,\n onContextMenuAction,\n className,\n ...rest\n}: MTreeViewProps) {\n const [internalExpanded, setInternalExpanded] = useState<string[]>(defaultExpanded)\n const [internalSelected, setInternalSelected] = useState<string | null>(null)\n const [internalChecked, setInternalChecked] = useState<string[]>(defaultChecked)\n const [draggedId, setDraggedId] = useState<string | null>(null)\n const [dropTargetId, setDropTargetId] = useState<string | null>(null)\n const [menu, setMenu] = useState<{\n node: MTreeNode\n items: MTreeViewContextMenuItem[]\n x: number\n y: number\n } | null>(null)\n const menuRef = useRef<HTMLDivElement>(null)\n\n const expandedArr = controlledExpanded ?? internalExpanded\n const expandedIds = new Set(expandedArr)\n const selectedId = controlledSelected !== undefined ? controlledSelected : internalSelected\n const checkedArr = controlledChecked ?? internalChecked\n const checkedIds = new Set(checkedArr)\n const indeterminateIds = checkable ? computeIndeterminate(items, checkedIds) : new Set<string>()\n const {nodeMap, descendants, parentMap} = buildTreeLookup(items)\n const draggedNode = draggedId ? (nodeMap.get(draggedId) ?? null) : null\n\n useEffect(() => {\n if (!menu) return\n\n function closeMenu(event?: Event) {\n if (event && menuRef.current && menuRef.current.contains(event.target as Node)) {\n return\n }\n\n setMenu(null)\n }\n\n function handleKey(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n setMenu(null)\n }\n }\n\n document.addEventListener('mousedown', closeMenu)\n document.addEventListener('scroll', closeMenu, true)\n window.addEventListener('resize', closeMenu)\n document.addEventListener('keydown', handleKey)\n\n return () => {\n document.removeEventListener('mousedown', closeMenu)\n document.removeEventListener('scroll', closeMenu, true)\n window.removeEventListener('resize', closeMenu)\n document.removeEventListener('keydown', handleKey)\n }\n }, [menu])\n\n function handleToggle(id: string) {\n const next = expandedIds.has(id) ? expandedArr.filter((e) => e !== id) : [...expandedArr, id]\n if (onExpandChange) onExpandChange(next)\n else setInternalExpanded(next)\n }\n\n function handleSelect(id: string, node: MTreeNode) {\n if (onSelect) onSelect(id, node)\n else setInternalSelected(id)\n }\n\n function handleCheck(id: string) {\n const node = nodeMap.get(id)\n if (!node || node.disabled) return\n\n const next = new Set(checkedIds)\n const isCurrentlyChecked = next.has(id)\n const subtree = [id, ...Array.from(descendants.get(id) ?? [])]\n\n if (isCurrentlyChecked) {\n for (const sid of subtree) next.delete(sid)\n } else {\n for (const sid of subtree) {\n const sNode = nodeMap.get(sid)\n if (sNode && !sNode.disabled) next.add(sid)\n }\n }\n\n let parentId = parentMap.get(id)\n\n while (parentId) {\n const parent = nodeMap.get(parentId)\n if (!parent) break\n\n const allChildrenChecked = (parent.children ?? []).every((child) => child.disabled || next.has(child.id))\n const hasEnabledChild = (parent.children ?? []).some((child) => !child.disabled)\n\n if (allChildrenChecked && hasEnabledChild) next.add(parentId)\n else next.delete(parentId)\n\n parentId = parentMap.get(parentId)\n }\n\n const nextArr = Array.from(next)\n\n if (controlledChecked === undefined) setInternalChecked(nextArr)\n onCheckedChange?.(nextArr)\n }\n\n function closeDrag() {\n setDraggedId(null)\n setDropTargetId(null)\n }\n\n function isValidDropTarget(targetNode: MTreeNode) {\n if (!draggedNode || !draggable || !onMove) return false\n if (targetNode.disabled || !isFolderNode(targetNode)) return false\n if (targetNode.id === draggedNode.id) return false\n if (descendants.get(draggedNode.id)?.has(targetNode.id)) return false\n\n return canDrop ? canDrop(draggedNode, targetNode) : true\n }\n\n function handleContextMenu(event: MouseEvent<HTMLDivElement>, node: MTreeNode) {\n if (!contextMenuItems || node.disabled) return\n\n const items = contextMenuItems(node).filter(Boolean)\n if (!items.length) return\n\n event.preventDefault()\n handleSelect(node.id, node)\n\n const pos = clampMenuPosition(event.clientX, event.clientY)\n setMenu({\n node,\n items,\n x: pos.x,\n y: pos.y,\n })\n }\n\n function handleDragStart(event: DragEvent<HTMLDivElement>, node: MTreeNode) {\n if (!draggable || node.disabled) return\n\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.setData('text/plain', node.id)\n setMenu(null)\n setDraggedId(node.id)\n }\n\n function handleDragOver(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n if (!isValidDropTarget(targetNode)) return\n\n event.preventDefault()\n event.dataTransfer.dropEffect = 'move'\n setDropTargetId(targetNode.id)\n }\n\n function handleDrop(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n event.preventDefault()\n\n if (!draggedNode || !isValidDropTarget(targetNode)) {\n closeDrag()\n return\n }\n\n onMove?.({\n draggedId: draggedNode.id,\n draggedNode,\n targetId: targetNode.id,\n targetNode,\n } satisfies MTreeViewMoveEvent)\n\n if (expandable && !expandedIds.has(targetNode.id)) {\n handleToggle(targetNode.id)\n }\n\n closeDrag()\n }\n\n return (\n <div className={cn('tree', `color-${color}`, showLines && 'lines', className)} {...rest}>\n <ul className=\"list\" role=\"tree\">\n {items.map((item) => (\n <TreeItem\n key={item.id}\n node={item}\n color={color}\n level={0}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={handleToggle}\n onSelect={handleSelect}\n checkable={checkable}\n checkedIds={checkedIds}\n indeterminateIds={indeterminateIds}\n onCheck={handleCheck}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={isValidDropTarget}\n onContextMenu={handleContextMenu}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n onDragEnd={closeDrag}\n />\n ))}\n </ul>\n {menu && (\n <MPortal>\n <div ref={menuRef} className=\"tree menu\" style={{top: menu.y, left: menu.x}} role=\"menu\">\n {menu.items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className={cn('action', item.color, item.disabled && 'disabled')}\n role=\"menuitem\"\n disabled={item.disabled}\n onClick={() => {\n if (item.disabled) return\n onContextMenuAction?.(item.id, menu.node)\n setMenu(null)\n }}\n >\n {item.icon && <span className=\"icon\">{item.icon}</span>}\n <span>{item.label}</span>\n </button>\n ))}\n </div>\n </MPortal>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
function e(e){let t=e.regex,n=e.COMMENT(`//`,`$`,{contains:[{begin:/\\\n/}]}),r=`decltype\\(auto\\)`,i=`[a-zA-Z_]\\w*::`,a=`(?!struct)(`+r+`|`+t.optional(i)+`[a-zA-Z_]\\w*`+t.optional(`<[^<>]+>`)+`)`,o={className:`type`,begin:`\\b[a-z\\d_]*_t\\b`},s={className:`string`,variants:[{begin:`(u8?|U|L)?"`,end:`"`,illegal:`\\n`,contains:[e.BACKSLASH_ESCAPE]},{begin:`(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)`,end:`'`,illegal:`.`},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},c={className:`number`,variants:[{begin:`[+-]?(?:(?:[0-9](?:'?[0-9])*\\.(?:[0-9](?:'?[0-9])*)?|\\.[0-9](?:'?[0-9])*)(?:[Ee][+-]?[0-9](?:'?[0-9])*)?|[0-9](?:'?[0-9])*[Ee][+-]?[0-9](?:'?[0-9])*|0[Xx](?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*(?:\\.(?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)?)?|\\.[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)[Pp][+-]?[0-9](?:'?[0-9])*)(?:[Ff](?:16|32|64|128)?|(BF|bf)16|[Ll]|)`},{begin:`[+-]?\\b(?:0[Bb][01](?:'?[01])*|0[Xx][0-9A-Fa-f](?:'?[0-9A-Fa-f])*|0(?:'?[0-7])*|[1-9](?:'?[0-9])*)(?:[Uu](?:LL?|ll?)|[Uu][Zz]?|(?:LL?|ll?)[Uu]?|[Zz][Uu]|)`}],relevance:0},l={className:`meta`,begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:`if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include`},contains:[{begin:/\\\n/,relevance:0},e.inherit(s,{className:`string`}),{className:`string`,begin:/<.*?>/},n,e.C_BLOCK_COMMENT_MODE]},u={className:`title`,begin:t.optional(i)+e.IDENT_RE,relevance:0},d=t.optional(i)+e.IDENT_RE+`\\s*\\(`,f=`alignas.alignof.and.and_eq.asm.atomic_cancel.atomic_commit.atomic_noexcept.auto.bitand.bitor.break.case.catch.class.co_await.co_return.co_yield.compl.concept.const_cast|10.consteval.constexpr.constinit.continue.decltype.default.delete.do.dynamic_cast|10.else.enum.explicit.export.extern.false.final.for.friend.goto.if.import.inline.module.mutable.namespace.new.noexcept.not.not_eq.nullptr.operator.or.or_eq.override.private.protected.public.reflexpr.register.reinterpret_cast|10.requires.return.sizeof.static_assert.static_cast|10.struct.switch.synchronized.template.this.thread_local.throw.transaction_safe.transaction_safe_dynamic.true.try.typedef.typeid.typename.union.using.virtual.volatile.while.xor.xor_eq`.split(`.`),p=[`bool`,`char`,`char16_t`,`char32_t`,`char8_t`,`double`,`float`,`int`,`long`,`short`,`void`,`wchar_t`,`unsigned`,`signed`,`const`,`static`],m=`any.auto_ptr.barrier.binary_semaphore.bitset.complex.condition_variable.condition_variable_any.counting_semaphore.deque.false_type.flat_map.flat_set.future.imaginary.initializer_list.istringstream.jthread.latch.lock_guard.multimap.multiset.mutex.optional.ostringstream.packaged_task.pair.promise.priority_queue.queue.recursive_mutex.recursive_timed_mutex.scoped_lock.set.shared_future.shared_lock.shared_mutex.shared_timed_mutex.shared_ptr.stack.string_view.stringstream.timed_mutex.thread.true_type.tuple.unique_lock.unique_ptr.unordered_map.unordered_multimap.unordered_multiset.unordered_set.variant.vector.weak_ptr.wstring.wstring_view`.split(`.`),h=`abort.abs.acos.apply.as_const.asin.atan.atan2.calloc.ceil.cerr.cin.clog.cos.cosh.cout.declval.endl.exchange.exit.exp.fabs.floor.fmod.forward.fprintf.fputs.free.frexp.fscanf.future.invoke.isalnum.isalpha.iscntrl.isdigit.isgraph.islower.isprint.ispunct.isspace.isupper.isxdigit.labs.launder.ldexp.log.log10.make_pair.make_shared.make_shared_for_overwrite.make_tuple.make_unique.malloc.memchr.memcmp.memcpy.memset.modf.move.pow.printf.putchar.puts.realloc.scanf.sin.sinh.snprintf.sprintf.sqrt.sscanf.std.stderr.stdin.stdout.strcat.strchr.strcmp.strcpy.strcspn.strlen.strncat.strncmp.strncpy.strpbrk.strrchr.strspn.strstr.swap.tan.tanh.terminate.to_underlying.tolower.toupper.vfprintf.visit.vprintf.vsprintf`.split(`.`),g={type:p,keyword:f,literal:[`NULL`,`false`,`nullopt`,`nullptr`,`true`],built_in:[`_Pragma`],_type_hints:m},_={className:`function.dispatch`,relevance:0,keywords:{_hint:h},begin:t.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,e.IDENT_RE,t.lookahead(/(<[^<>]+>|)\s*\(/))},v=[_,l,o,n,e.C_BLOCK_COMMENT_MODE,c,s],y={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:`new throw return else`,end:/;/}],keywords:g,contains:v.concat([{begin:/\(/,end:/\)/,keywords:g,contains:v.concat([`self`]),relevance:0}]),relevance:0},b={className:`function`,begin:`(`+a+`[\\*&\\s]+)+`+d,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:g,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:r,keywords:g,relevance:0},{begin:d,returnBegin:!0,contains:[u],relevance:0},{begin:/::/,relevance:0},{begin:/:/,endsWithParent:!0,contains:[s,c]},{relevance:0,match:/,/},{className:`params`,begin:/\(/,end:/\)/,keywords:g,relevance:0,contains:[n,e.C_BLOCK_COMMENT_MODE,s,c,o,{begin:/\(/,end:/\)/,keywords:g,relevance:0,contains:[`self`,n,e.C_BLOCK_COMMENT_MODE,s,c,o]}]},o,n,e.C_BLOCK_COMMENT_MODE,l]};return{name:`C++`,aliases:[`cc`,`c++`,`h++`,`hpp`,`hh`,`hxx`,`cxx`],keywords:g,illegal:`</`,classNameAliases:{"function.dispatch":`built_in`},contains:[].concat(y,b,_,v,[l,{begin:`\\b(deque|list|queue|priority_queue|pair|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array|tuple|optional|variant|function|flat_map|flat_set)\\s*<(?!<)`,end:`>`,keywords:g,contains:[`self`,o]},{begin:e.IDENT_RE+`::`,keywords:g},{match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/],className:{1:`keyword`,3:`title.class`}}])}}function t(t){let n={type:[`boolean`,`byte`,`word`,`String`],built_in:`KeyboardController.MouseController.SoftwareSerial.EthernetServer.EthernetClient.LiquidCrystal.RobotControl.GSMVoiceCall.EthernetUDP.EsploraTFT.HttpClient.RobotMotor.WiFiClient.GSMScanner.FileSystem.Scheduler.GSMServer.YunClient.YunServer.IPAddress.GSMClient.GSMModem.Keyboard.Ethernet.Console.GSMBand.Esplora.Stepper.Process.WiFiUDP.GSM_SMS.Mailbox.USBHost.Firmata.PImage.Client.Server.GSMPIN.FileIO.Bridge.Serial.EEPROM.Stream.Mouse.Audio.Servo.File.Task.GPRS.WiFi.Wire.TFT.GSM.SPI.SD`.split(`.`),_hints:`setup.loop.runShellCommandAsynchronously.analogWriteResolution.retrieveCallingNumber.printFirmwareVersion.analogReadResolution.sendDigitalPortPair.noListenOnLocalhost.readJoystickButton.setFirmwareVersion.readJoystickSwitch.scrollDisplayRight.getVoiceCallStatus.scrollDisplayLeft.writeMicroseconds.delayMicroseconds.beginTransmission.getSignalStrength.runAsynchronously.getAsynchronously.listenOnLocalhost.getCurrentCarrier.readAccelerometer.messageAvailable.sendDigitalPorts.lineFollowConfig.countryNameWrite.runShellCommand.readStringUntil.rewindDirectory.readTemperature.setClockDivider.readLightSensor.endTransmission.analogReference.detachInterrupt.countryNameRead.attachInterrupt.encryptionType.readBytesUntil.robotNameWrite.readMicrophone.robotNameRead.cityNameWrite.userNameWrite.readJoystickY.readJoystickX.mouseReleased.openNextFile.scanNetworks.noInterrupts.digitalWrite.beginSpeaker.mousePressed.isActionDone.mouseDragged.displayLogos.noAutoscroll.addParameter.remoteNumber.getModifiers.keyboardRead.userNameRead.waitContinue.processInput.parseCommand.printVersion.readNetworks.writeMessage.blinkVersion.cityNameRead.readMessage.setDataMode.parsePacket.isListening.setBitOrder.beginPacket.isDirectory.motorsWrite.drawCompass.digitalRead.clearScreen.serialEvent.rightToLeft.setTextSize.leftToRight.requestFrom.keyReleased.compassRead.analogWrite.interrupts.WiFiServer.disconnect.playMelody.parseFloat.autoscroll.getPINUsed.setPINUsed.setTimeout.sendAnalog.readSlider.analogRead.beginWrite.createChar.motorsStop.keyPressed.tempoWrite.readButton.subnetMask.debugPrint.macAddress.writeGreen.randomSeed.attachGPRS.readString.sendString.remotePort.releaseAll.mouseMoved.background.getXChange.getYChange.answerCall.getResult.voiceCall.endPacket.constrain.getSocket.writeJSON.getButton.available.connected.findUntil.readBytes.exitValue.readGreen.writeBlue.startLoop.IPAddress.isPressed.sendSysex.pauseMode.gatewayIP.setCursor.getOemKey.tuneWrite.noDisplay.loadImage.switchPIN.onRequest.onReceive.changePIN.playFile.noBuffer.parseInt.overflow.checkPIN.knobRead.beginTFT.bitClear.updateIR.bitWrite.position.writeRGB.highByte.writeRed.setSpeed.readBlue.noStroke.remoteIP.transfer.shutdown.hangCall.beginSMS.endWrite.attached.maintain.noCursor.checkReg.checkPUK.shiftOut.isValid.shiftIn.pulseIn.connect.println.localIP.pinMode.getIMEI.display.noBlink.process.getBand.running.beginSD.drawBMP.lowByte.setBand.release.bitRead.prepare.pointTo.readRed.setMode.noFill.remove.listen.stroke.detach.attach.noTone.exists.buffer.height.bitSet.circle.config.cursor.random.IRread.setDNS.endSMS.getKey.micros.millis.begin.print.write.ready.flush.width.isPIN.blink.clear.press.mkdir.rmdir.close.point.yield.image.BSSID.click.delay.read.text.move.peek.beep.rect.line.open.seek.fill.size.turn.stop.home.find.step.tone.sqrt.RSSI.SSID.end.bit.tan.cos.sin.pow.map.abs.max.min.get.run.put`.split(`.`),literal:[`DIGITAL_MESSAGE`,`FIRMATA_STRING`,`ANALOG_MESSAGE`,`REPORT_DIGITAL`,`REPORT_ANALOG`,`INPUT_PULLUP`,`SET_PIN_MODE`,`INTERNAL2V56`,`SYSTEM_RESET`,`LED_BUILTIN`,`INTERNAL1V1`,`SYSEX_START`,`INTERNAL`,`EXTERNAL`,`DEFAULT`,`OUTPUT`,`INPUT`,`HIGH`,`LOW`]},r=e(t),i=r.keywords;return i.type=[...i.type,...n.type],i.literal=[...i.literal,...n.literal],i.built_in=[...i.built_in,...n.built_in],i._hints=n._hints,r.name=`Arduino`,r.aliases=[`ino`],r.supersetOf=`cpp`,r}exports.default=t;
|
|
2
|
-
//# sourceMappingURL=arduino-
|
|
2
|
+
//# sourceMappingURL=arduino-DdDHMIWB.cjs.map
|