@mieweb/ui 0.10.0-dev.31 → 0.10.0-dev.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CsvBlock-CFXSDPBI.js +9 -0
- package/dist/{CsvBlock-VLMG7GUO.js.map → CsvBlock-CFXSDPBI.js.map} +1 -1
- package/dist/CsvBlock-RGO7JXHJ.cjs +18 -0
- package/dist/{CsvBlock-FX5YNGNE.cjs.map → CsvBlock-RGO7JXHJ.cjs.map} +1 -1
- package/dist/HtmlPreviewBlock-VBYXCXVT.cjs +18 -0
- package/dist/{HtmlPreviewBlock-UO37JQ3K.cjs.map → HtmlPreviewBlock-VBYXCXVT.cjs.map} +1 -1
- package/dist/HtmlPreviewBlock-Z2GCK325.js +9 -0
- package/dist/{HtmlPreviewBlock-5JE7L3GR.js.map → HtmlPreviewBlock-Z2GCK325.js.map} +1 -1
- package/dist/MermaidBlock-I2R2BQOX.cjs +18 -0
- package/dist/{MermaidBlock-RZ75RPZA.cjs.map → MermaidBlock-I2R2BQOX.cjs.map} +1 -1
- package/dist/MermaidBlock-XCAK7IA5.js +9 -0
- package/dist/{MermaidBlock-3XHFBAMV.js.map → MermaidBlock-XCAK7IA5.js.map} +1 -1
- package/dist/SurveyBlock-KI5JOWCL.js +9 -0
- package/dist/{SurveyBlock-MUVJ3JUI.js.map → SurveyBlock-KI5JOWCL.js.map} +1 -1
- package/dist/SurveyBlock-UKSGISRT.cjs +18 -0
- package/dist/{SurveyBlock-VH47YXZC.cjs.map → SurveyBlock-UKSGISRT.cjs.map} +1 -1
- package/dist/brands/index.cjs +7 -7
- package/dist/brands/index.js +2 -2
- package/dist/{chunk-6ZPTZTKN.js → chunk-24AFHH4J.js} +3 -3
- package/dist/{chunk-6ZPTZTKN.js.map → chunk-24AFHH4J.js.map} +1 -1
- package/dist/{chunk-BNH4SXJB.js → chunk-2X54ZLT6.js} +6 -6
- package/dist/{chunk-BNH4SXJB.js.map → chunk-2X54ZLT6.js.map} +1 -1
- package/dist/{chunk-TYE5K5WV.cjs → chunk-32ZCJOSR.cjs} +4 -4
- package/dist/{chunk-TYE5K5WV.cjs.map → chunk-32ZCJOSR.cjs.map} +1 -1
- package/dist/chunk-47P5QLX4.cjs +42 -0
- package/dist/chunk-47P5QLX4.cjs.map +1 -0
- package/dist/chunk-4ZB7RSMY.cjs +306 -0
- package/dist/chunk-4ZB7RSMY.cjs.map +1 -0
- package/dist/chunk-56VTM4OX.js +261 -0
- package/dist/chunk-56VTM4OX.js.map +1 -0
- package/dist/{chunk-D22GE27K.js → chunk-5A4SL436.js} +4 -4
- package/dist/{chunk-D22GE27K.js.map → chunk-5A4SL436.js.map} +1 -1
- package/dist/chunk-6BNZLN4B.cjs +548 -0
- package/dist/chunk-6BNZLN4B.cjs.map +1 -0
- package/dist/chunk-6JSFT2J5.js +130 -0
- package/dist/chunk-6JSFT2J5.js.map +1 -0
- package/dist/chunk-6N7NMOSV.js +233 -0
- package/dist/chunk-6N7NMOSV.js.map +1 -0
- package/dist/chunk-6TTCZY3P.cjs +4 -0
- package/dist/chunk-6TTCZY3P.cjs.map +1 -0
- package/dist/{chunk-TTSSUOEV.cjs → chunk-7C5W744U.cjs} +8 -8
- package/dist/{chunk-TTSSUOEV.cjs.map → chunk-7C5W744U.cjs.map} +1 -1
- package/dist/chunk-7HUTR6RX.js +178 -0
- package/dist/chunk-7HUTR6RX.js.map +1 -0
- package/dist/chunk-7IRTD4JT.cjs +61 -0
- package/dist/chunk-7IRTD4JT.cjs.map +1 -0
- package/dist/{chunk-YU55JD35.js → chunk-7QW6TU4X.js} +3 -3
- package/dist/{chunk-YU55JD35.js.map → chunk-7QW6TU4X.js.map} +1 -1
- package/dist/chunk-7WJ6MBF5.cjs +47 -0
- package/dist/chunk-7WJ6MBF5.cjs.map +1 -0
- package/dist/chunk-A4W5CSK7.cjs +216 -0
- package/dist/chunk-A4W5CSK7.cjs.map +1 -0
- package/dist/{chunk-WXFGHDTV.cjs → chunk-AJPFQF3H.cjs} +18 -18
- package/dist/{chunk-WXFGHDTV.cjs.map → chunk-AJPFQF3H.cjs.map} +1 -1
- package/dist/chunk-AMYFRY7K.js +3 -0
- package/dist/chunk-AMYFRY7K.js.map +1 -0
- package/dist/{chunk-X6A27RGO.cjs → chunk-ANMX7YDL.cjs} +2 -2
- package/dist/{chunk-X6A27RGO.cjs.map → chunk-ANMX7YDL.cjs.map} +1 -1
- package/dist/{chunk-DVOQ3JNO.js → chunk-B4CKCNWD.js} +16 -8
- package/dist/chunk-B4CKCNWD.js.map +1 -0
- package/dist/chunk-BJ6ABRSQ.cjs +256 -0
- package/dist/chunk-BJ6ABRSQ.cjs.map +1 -0
- package/dist/chunk-BXRQ6HEP.cjs +4 -0
- package/dist/chunk-BXRQ6HEP.cjs.map +1 -0
- package/dist/{chunk-TJCX4OML.cjs → chunk-C77FAR3F.cjs} +2 -2
- package/dist/{chunk-TJCX4OML.cjs.map → chunk-C77FAR3F.cjs.map} +1 -1
- package/dist/chunk-CBBKWRLG.js +213 -0
- package/dist/chunk-CBBKWRLG.js.map +1 -0
- package/dist/{chunk-ZTMYKAVU.cjs → chunk-CCAVJSWL.cjs} +49 -48
- package/dist/chunk-CCAVJSWL.cjs.map +1 -0
- package/dist/chunk-CPDNX3LS.cjs +47 -0
- package/dist/chunk-CPDNX3LS.cjs.map +1 -0
- package/dist/chunk-CVNPNZMX.js +44 -0
- package/dist/chunk-CVNPNZMX.js.map +1 -0
- package/dist/chunk-DHGCLPFZ.js +91 -0
- package/dist/chunk-DHGCLPFZ.js.map +1 -0
- package/dist/chunk-DO2YN46R.cjs +201 -0
- package/dist/chunk-DO2YN46R.cjs.map +1 -0
- package/dist/chunk-DVDT7TX7.js +151 -0
- package/dist/chunk-DVDT7TX7.js.map +1 -0
- package/dist/{chunk-R5Z7AOVU.cjs → chunk-DZ3JTMKM.cjs} +9 -9
- package/dist/{chunk-R5Z7AOVU.cjs.map → chunk-DZ3JTMKM.cjs.map} +1 -1
- package/dist/chunk-EACNRR3C.cjs +4 -0
- package/dist/chunk-EACNRR3C.cjs.map +1 -0
- package/dist/{chunk-E2PBPQGS.js → chunk-EEOGIGIA.js} +2 -2
- package/dist/{chunk-E2PBPQGS.js.map → chunk-EEOGIGIA.js.map} +1 -1
- package/dist/chunk-EPCUPHEO.js +193 -0
- package/dist/chunk-EPCUPHEO.js.map +1 -0
- package/dist/chunk-EPTP3VKT.js +283 -0
- package/dist/chunk-EPTP3VKT.js.map +1 -0
- package/dist/{chunk-HIZWOAWY.cjs → chunk-ERACGSDY.cjs} +8 -8
- package/dist/{chunk-HIZWOAWY.cjs.map → chunk-ERACGSDY.cjs.map} +1 -1
- package/dist/{chunk-VOQJHSXN.cjs → chunk-F2FOG4EG.cjs} +9 -9
- package/dist/{chunk-VOQJHSXN.cjs.map → chunk-F2FOG4EG.cjs.map} +1 -1
- package/dist/{chunk-GBUVIGD5.js → chunk-F3EWRDIT.js} +99 -3
- package/dist/chunk-F3EWRDIT.js.map +1 -0
- package/dist/{chunk-GVLNXPJX.js → chunk-FGLIP6YR.js} +4 -4
- package/dist/{chunk-GVLNXPJX.js.map → chunk-FGLIP6YR.js.map} +1 -1
- package/dist/chunk-FKGFOBC2.js +314 -0
- package/dist/chunk-FKGFOBC2.js.map +1 -0
- package/dist/chunk-FSGJXCBG.cjs +318 -0
- package/dist/chunk-FSGJXCBG.cjs.map +1 -0
- package/dist/chunk-FTEZNCRI.js +29 -0
- package/dist/chunk-FTEZNCRI.js.map +1 -0
- package/dist/{chunk-COM7RNZU.cjs → chunk-FYQZWLAM.cjs} +2 -2
- package/dist/{chunk-COM7RNZU.cjs.map → chunk-FYQZWLAM.cjs.map} +1 -1
- package/dist/{chunk-YVPC65ZJ.cjs → chunk-GF2BE4FB.cjs} +91 -32
- package/dist/chunk-GF2BE4FB.cjs.map +1 -0
- package/dist/{chunk-JEIW7BSV.cjs → chunk-GKDHMNUA.cjs} +2 -52
- package/dist/chunk-GKDHMNUA.cjs.map +1 -0
- package/dist/{chunk-N7C4OEP7.cjs → chunk-GM32IDVL.cjs} +6 -6
- package/dist/{chunk-N7C4OEP7.cjs.map → chunk-GM32IDVL.cjs.map} +1 -1
- package/dist/chunk-GY5SP4ST.js +3 -0
- package/dist/chunk-GY5SP4ST.js.map +1 -0
- package/dist/chunk-H2Y7HZV5.js +3 -0
- package/dist/chunk-H2Y7HZV5.js.map +1 -0
- package/dist/chunk-H3QPREIJ.js +195 -0
- package/dist/chunk-H3QPREIJ.js.map +1 -0
- package/dist/{chunk-QOVJ6Z6R.js → chunk-HDY7YQFX.js} +3 -3
- package/dist/{chunk-QOVJ6Z6R.js.map → chunk-HDY7YQFX.js.map} +1 -1
- package/dist/chunk-HNFFFFYH.cjs +114 -0
- package/dist/chunk-HNFFFFYH.cjs.map +1 -0
- package/dist/chunk-HNXLLDPN.js +25 -0
- package/dist/chunk-HNXLLDPN.js.map +1 -0
- package/dist/chunk-I2MMUFCN.cjs +154 -0
- package/dist/chunk-I2MMUFCN.cjs.map +1 -0
- package/dist/{chunk-GYXUS65N.cjs → chunk-IGDO62KR.cjs} +5 -5
- package/dist/{chunk-GYXUS65N.cjs.map → chunk-IGDO62KR.cjs.map} +1 -1
- package/dist/{chunk-HC3NAN55.cjs → chunk-IPL2O2OL.cjs} +19 -19
- package/dist/{chunk-HC3NAN55.cjs.map → chunk-IPL2O2OL.cjs.map} +1 -1
- package/dist/chunk-ISUIKUX7.cjs +337 -0
- package/dist/chunk-ISUIKUX7.cjs.map +1 -0
- package/dist/{chunk-N5O47VGS.cjs → chunk-IVGI353O.cjs} +2 -2
- package/dist/{chunk-N5O47VGS.cjs.map → chunk-IVGI353O.cjs.map} +1 -1
- package/dist/chunk-IWRBJHO3.cjs +51 -0
- package/dist/chunk-IWRBJHO3.cjs.map +1 -0
- package/dist/{chunk-BIQ7GSO2.js → chunk-JMAZ2GKT.js} +3 -3
- package/dist/{chunk-BIQ7GSO2.js.map → chunk-JMAZ2GKT.js.map} +1 -1
- package/dist/{chunk-KRU6IGV7.js → chunk-JUJGWUAN.js} +28 -6
- package/dist/chunk-JUJGWUAN.js.map +1 -0
- package/dist/{chunk-BUT6MF5K.cjs → chunk-KQ6GLYFZ.cjs} +4 -4
- package/dist/{chunk-BUT6MF5K.cjs.map → chunk-KQ6GLYFZ.cjs.map} +1 -1
- package/dist/chunk-L6K4PRZK.cjs +4 -0
- package/dist/chunk-L6K4PRZK.cjs.map +1 -0
- package/dist/{chunk-T4L7Q5FA.cjs → chunk-LC3JL2HB.cjs} +6 -2
- package/dist/chunk-LC3JL2HB.cjs.map +1 -0
- package/dist/{chunk-P7UMS4E6.cjs → chunk-LC7PVBXH.cjs} +16 -8
- package/dist/chunk-LC7PVBXH.cjs.map +1 -0
- package/dist/chunk-LRRSD7LR.js +248 -0
- package/dist/chunk-LRRSD7LR.js.map +1 -0
- package/dist/chunk-LSMS6DY7.cjs +331 -0
- package/dist/chunk-LSMS6DY7.cjs.map +1 -0
- package/dist/chunk-M3VPGJMV.js +283 -0
- package/dist/chunk-M3VPGJMV.js.map +1 -0
- package/dist/{chunk-QURJVPRH.cjs → chunk-MJJJDQ5P.cjs} +46 -2
- package/dist/chunk-MJJJDQ5P.cjs.map +1 -0
- package/dist/{chunk-2JICT4A2.js → chunk-N54FYWG6.js} +3 -3
- package/dist/{chunk-2JICT4A2.js.map → chunk-N54FYWG6.js.map} +1 -1
- package/dist/chunk-N5JDL4VE.js +3 -0
- package/dist/chunk-N5JDL4VE.js.map +1 -0
- package/dist/{chunk-KGKBZN3T.cjs → chunk-NAH65KPK.cjs} +8 -8
- package/dist/{chunk-KGKBZN3T.cjs.map → chunk-NAH65KPK.cjs.map} +1 -1
- package/dist/{chunk-NKV76R65.cjs → chunk-O6BJMVGT.cjs} +45 -45
- package/dist/{chunk-NKV76R65.cjs.map → chunk-O6BJMVGT.cjs.map} +1 -1
- package/dist/{chunk-SVSHA7XV.js → chunk-O6XDA3SI.js} +31 -33
- package/dist/chunk-O6XDA3SI.js.map +1 -0
- package/dist/chunk-OIF34LEN.cjs +425 -0
- package/dist/chunk-OIF34LEN.cjs.map +1 -0
- package/dist/chunk-ORCCJ5VY.cjs +218 -0
- package/dist/chunk-ORCCJ5VY.cjs.map +1 -0
- package/dist/{chunk-CRS2CQWM.js → chunk-OSTSZDQC.js} +3 -3
- package/dist/{chunk-CRS2CQWM.js.map → chunk-OSTSZDQC.js.map} +1 -1
- package/dist/chunk-P22YCUVM.cjs +4 -0
- package/dist/chunk-P22YCUVM.cjs.map +1 -0
- package/dist/chunk-P55LNEDH.cjs +306 -0
- package/dist/chunk-P55LNEDH.cjs.map +1 -0
- package/dist/{chunk-R6KPWIGO.js → chunk-P7D7BYFE.js} +4 -4
- package/dist/{chunk-R6KPWIGO.js.map → chunk-P7D7BYFE.js.map} +1 -1
- package/dist/{chunk-GU5OS7JJ.cjs → chunk-PYI2IWNX.cjs} +4 -4
- package/dist/{chunk-GU5OS7JJ.cjs.map → chunk-PYI2IWNX.cjs.map} +1 -1
- package/dist/chunk-Q3YVLO52.cjs +174 -0
- package/dist/chunk-Q3YVLO52.cjs.map +1 -0
- package/dist/{chunk-K34DXMLZ.js → chunk-QJ2L5RU6.js} +7 -7
- package/dist/{chunk-K34DXMLZ.js.map → chunk-QJ2L5RU6.js.map} +1 -1
- package/dist/{chunk-X4LBUPJO.cjs → chunk-QX6AAVDE.cjs} +31 -33
- package/dist/chunk-QX6AAVDE.cjs.map +1 -0
- package/dist/{chunk-LFPJ3OUM.cjs → chunk-RIUQP2QS.cjs} +5 -5
- package/dist/{chunk-LFPJ3OUM.cjs.map → chunk-RIUQP2QS.cjs.map} +1 -1
- package/dist/{chunk-JHG3ELS2.js → chunk-RPFATYUI.js} +2 -2
- package/dist/{chunk-JHG3ELS2.js.map → chunk-RPFATYUI.js.map} +1 -1
- package/dist/{chunk-FZURBQJ2.js → chunk-RSJGTWLM.js} +3 -3
- package/dist/{chunk-FZURBQJ2.js.map → chunk-RSJGTWLM.js.map} +1 -1
- package/dist/{chunk-XBTKZCZF.js → chunk-RZSSQ7AT.js} +3 -3
- package/dist/{chunk-XBTKZCZF.js.map → chunk-RZSSQ7AT.js.map} +1 -1
- package/dist/{chunk-SD7ONW6S.js → chunk-S2JZL4JC.js} +5 -5
- package/dist/{chunk-SD7ONW6S.js.map → chunk-S2JZL4JC.js.map} +1 -1
- package/dist/{chunk-VROIMIHB.cjs → chunk-SHBCUXFS.cjs} +28 -6
- package/dist/chunk-SHBCUXFS.cjs.map +1 -0
- package/dist/{chunk-JELTRRR5.cjs → chunk-SW2E7XKY.cjs} +9 -9
- package/dist/{chunk-JELTRRR5.cjs.map → chunk-SW2E7XKY.cjs.map} +1 -1
- package/dist/chunk-SZSRGUVO.js +402 -0
- package/dist/chunk-SZSRGUVO.js.map +1 -0
- package/dist/{chunk-HZ4MBUC3.js → chunk-TI3TQQ7F.js} +4 -53
- package/dist/chunk-TI3TQQ7F.js.map +1 -0
- package/dist/{chunk-MLAWXPRY.js → chunk-TKWNXAFI.js} +46 -2
- package/dist/chunk-TKWNXAFI.js.map +1 -0
- package/dist/{chunk-H2IAMSHK.js → chunk-TVEJKKIM.js} +3 -3
- package/dist/{chunk-H2IAMSHK.js.map → chunk-TVEJKKIM.js.map} +1 -1
- package/dist/{chunk-LHBWRMNC.cjs → chunk-TVU4KB27.cjs} +130 -12
- package/dist/chunk-TVU4KB27.cjs.map +1 -0
- package/dist/{chunk-ENMXHZNE.js → chunk-TWQSMUE6.js} +6 -2
- package/dist/chunk-TWQSMUE6.js.map +1 -0
- package/dist/{chunk-ZYL4SNOR.js → chunk-UJDWFDKE.js} +3 -3
- package/dist/{chunk-ZYL4SNOR.js.map → chunk-UJDWFDKE.js.map} +1 -1
- package/dist/{chunk-4HC2IBOX.js → chunk-UNFDIBKJ.js} +3 -3
- package/dist/{chunk-4HC2IBOX.js.map → chunk-UNFDIBKJ.js.map} +1 -1
- package/dist/chunk-UTIPENPW.cjs +286 -0
- package/dist/chunk-UTIPENPW.cjs.map +1 -0
- package/dist/{chunk-IYWG72DM.js → chunk-VEE46VTX.js} +4 -4
- package/dist/{chunk-IYWG72DM.js.map → chunk-VEE46VTX.js.map} +1 -1
- package/dist/{chunk-Y4E2WRUR.cjs → chunk-VFFV7EMT.cjs} +6 -6
- package/dist/{chunk-Y4E2WRUR.cjs.map → chunk-VFFV7EMT.cjs.map} +1 -1
- package/dist/chunk-VNEAQCY2.js +308 -0
- package/dist/chunk-VNEAQCY2.js.map +1 -0
- package/dist/chunk-VOYLX32A.cjs +271 -0
- package/dist/chunk-VOYLX32A.cjs.map +1 -0
- package/dist/{chunk-7ZV67VZE.js → chunk-VSRO4PAI.js} +21 -3
- package/dist/chunk-VSRO4PAI.js.map +1 -0
- package/dist/{chunk-L6MDULYB.js → chunk-VU3ZMJBN.js} +2 -2
- package/dist/{chunk-L6MDULYB.js.map → chunk-VU3ZMJBN.js.map} +1 -1
- package/dist/{chunk-CPPUT74P.cjs → chunk-VV2U36T6.cjs} +9 -9
- package/dist/{chunk-CPPUT74P.cjs.map → chunk-VV2U36T6.cjs.map} +1 -1
- package/dist/{chunk-35Y4ILCU.cjs → chunk-VXW7D5LR.cjs} +21 -3
- package/dist/chunk-VXW7D5LR.cjs.map +1 -0
- package/dist/{chunk-7YO7DNUV.js → chunk-WFBUBT54.js} +2 -2
- package/dist/{chunk-7YO7DNUV.js.map → chunk-WFBUBT54.js.map} +1 -1
- package/dist/chunk-WQHBMZSC.js +295 -0
- package/dist/chunk-WQHBMZSC.js.map +1 -0
- package/dist/chunk-X5JOEZVR.js +525 -0
- package/dist/chunk-X5JOEZVR.js.map +1 -0
- package/dist/chunk-XBAAHOCP.js +3 -0
- package/dist/chunk-XBAAHOCP.js.map +1 -0
- package/dist/chunk-XNPDZANN.cjs +238 -0
- package/dist/chunk-XNPDZANN.cjs.map +1 -0
- package/dist/chunk-XXA4NZUC.js +3 -0
- package/dist/chunk-XXA4NZUC.js.map +1 -0
- package/dist/chunk-Y424YL55.js +59 -0
- package/dist/chunk-Y424YL55.js.map +1 -0
- package/dist/chunk-YGS2TRMP.js +38 -0
- package/dist/chunk-YGS2TRMP.js.map +1 -0
- package/dist/{chunk-JBIGSP2T.js → chunk-YMILRSRO.js} +6 -5
- package/dist/chunk-YMILRSRO.js.map +1 -0
- package/dist/chunk-YUMOM3KE.js +167 -0
- package/dist/chunk-YUMOM3KE.js.map +1 -0
- package/dist/{chunk-3KPDQG5O.cjs → chunk-ZG6FXMDX.cjs} +5 -5
- package/dist/{chunk-3KPDQG5O.cjs.map → chunk-ZG6FXMDX.cjs.map} +1 -1
- package/dist/chunk-ZNUMOJOI.cjs +4 -0
- package/dist/chunk-ZNUMOJOI.cjs.map +1 -0
- package/dist/components/Accordion/index.cjs +2 -2
- package/dist/components/Accordion/index.d.cts +6 -0
- package/dist/components/Accordion/index.d.ts +6 -0
- package/dist/components/Accordion/index.js +1 -1
- package/dist/components/ActionPlan/index.cjs +34 -0
- package/dist/components/ActionPlan/index.cjs.map +1 -0
- package/dist/components/ActionPlan/index.d.cts +65 -0
- package/dist/components/ActionPlan/index.d.ts +65 -0
- package/dist/components/ActionPlan/index.js +21 -0
- package/dist/components/ActionPlan/index.js.map +1 -0
- package/dist/components/ActivityFeed/index.cjs +31 -0
- package/dist/components/ActivityFeed/index.cjs.map +1 -0
- package/dist/components/ActivityFeed/index.d.cts +99 -0
- package/dist/components/ActivityFeed/index.d.ts +99 -0
- package/dist/components/ActivityFeed/index.js +18 -0
- package/dist/components/ActivityFeed/index.js.map +1 -0
- package/dist/components/AlertDialog/index.cjs +17 -4
- package/dist/components/AlertDialog/index.d.cts +66 -13
- package/dist/components/AlertDialog/index.d.ts +66 -13
- package/dist/components/AlertDialog/index.js +4 -3
- package/dist/components/AssociationList/index.cjs +29 -0
- package/dist/components/AssociationList/index.cjs.map +1 -0
- package/dist/components/AssociationList/index.d.cts +50 -0
- package/dist/components/AssociationList/index.d.ts +50 -0
- package/dist/components/AssociationList/index.js +16 -0
- package/dist/components/AssociationList/index.js.map +1 -0
- package/dist/components/Avatar/index.cjs +9 -7
- package/dist/components/Avatar/index.d.cts +45 -14
- package/dist/components/Avatar/index.d.ts +45 -14
- package/dist/components/Avatar/index.js +3 -1
- package/dist/components/AvatarGroup/index.cjs +20 -0
- package/dist/components/AvatarGroup/index.cjs.map +1 -0
- package/dist/components/AvatarGroup/index.d.cts +57 -0
- package/dist/components/AvatarGroup/index.d.ts +57 -0
- package/dist/components/AvatarGroup/index.js +7 -0
- package/dist/components/AvatarGroup/index.js.map +1 -0
- package/dist/components/Button/index.cjs +3 -2
- package/dist/components/Button/index.js +2 -1
- package/dist/components/CalendarHeatmap/index.cjs +18 -0
- package/dist/components/CalendarHeatmap/index.cjs.map +1 -0
- package/dist/components/CalendarHeatmap/index.d.cts +47 -0
- package/dist/components/CalendarHeatmap/index.d.ts +47 -0
- package/dist/components/CalendarHeatmap/index.js +5 -0
- package/dist/components/CalendarHeatmap/index.js.map +1 -0
- package/dist/components/CalendarView/index.cjs +5 -4
- package/dist/components/CalendarView/index.js +3 -2
- package/dist/components/ClampedText/index.cjs +3 -2
- package/dist/components/ClampedText/index.js +2 -1
- package/dist/components/CollabStatus/index.cjs +6 -4
- package/dist/components/CollabStatus/index.d.cts +11 -0
- package/dist/components/CollabStatus/index.d.ts +11 -0
- package/dist/components/CollabStatus/index.js +3 -1
- package/dist/components/Collapsible/index.cjs +4 -4
- package/dist/components/Collapsible/index.d.cts +6 -0
- package/dist/components/Collapsible/index.d.ts +6 -0
- package/dist/components/Collapsible/index.js +1 -1
- package/dist/components/CompletenessMeter/index.cjs +22 -0
- package/dist/components/CompletenessMeter/index.cjs.map +1 -0
- package/dist/components/CompletenessMeter/index.d.cts +52 -0
- package/dist/components/CompletenessMeter/index.d.ts +52 -0
- package/dist/components/CompletenessMeter/index.js +5 -0
- package/dist/components/CompletenessMeter/index.js.map +1 -0
- package/dist/components/CustomizableDashboard/index.cjs +10 -9
- package/dist/components/CustomizableDashboard/index.js +3 -2
- package/dist/components/DateInput/index.d.cts +36 -4
- package/dist/components/DateInput/index.d.ts +36 -4
- package/dist/components/Dropdown/index.cjs +9 -8
- package/dist/components/Dropdown/index.js +2 -1
- package/dist/components/FieldHistory/index.cjs +34 -0
- package/dist/components/FieldHistory/index.cjs.map +1 -0
- package/dist/components/FieldHistory/index.d.cts +66 -0
- package/dist/components/FieldHistory/index.d.ts +66 -0
- package/dist/components/FieldHistory/index.js +21 -0
- package/dist/components/FieldHistory/index.js.map +1 -0
- package/dist/components/FloatingWindow/index.cjs +5 -4
- package/dist/components/FloatingWindow/index.js +3 -2
- package/dist/components/InlineEdit/index.cjs +20 -0
- package/dist/components/InlineEdit/index.cjs.map +1 -0
- package/dist/components/InlineEdit/index.d.cts +56 -0
- package/dist/components/InlineEdit/index.d.ts +56 -0
- package/dist/components/InlineEdit/index.js +7 -0
- package/dist/components/InlineEdit/index.js.map +1 -0
- package/dist/components/KeyboardShortcutsOverlay/index.cjs +4 -4
- package/dist/components/KeyboardShortcutsOverlay/index.js +2 -2
- package/dist/components/ListView/index.cjs +5 -4
- package/dist/components/ListView/index.js +3 -2
- package/dist/components/LogoUploader/index.cjs +18 -0
- package/dist/components/LogoUploader/index.cjs.map +1 -0
- package/dist/components/LogoUploader/index.d.cts +49 -0
- package/dist/components/LogoUploader/index.d.ts +49 -0
- package/dist/components/LogoUploader/index.js +5 -0
- package/dist/components/LogoUploader/index.js.map +1 -0
- package/dist/components/Markdown/index.cjs +17 -16
- package/dist/components/Markdown/index.js +8 -7
- package/dist/components/MediaEditor/index.cjs +10 -9
- package/dist/components/MediaEditor/index.js +5 -4
- package/dist/components/MediaFeed/index.cjs +9 -6
- package/dist/components/MediaFeed/index.js +8 -5
- package/dist/components/MediaPlayer/index.cjs +6 -5
- package/dist/components/MediaPlayer/index.js +3 -2
- package/dist/components/MegaMenu/index.cjs +2 -1
- package/dist/components/MegaMenu/index.js +2 -1
- package/dist/components/Modal/index.cjs +9 -9
- package/dist/components/Modal/index.js +1 -1
- package/dist/components/PhiMask/index.cjs +18 -0
- package/dist/components/PhiMask/index.cjs.map +1 -0
- package/dist/components/PhiMask/index.d.cts +45 -0
- package/dist/components/PhiMask/index.d.ts +45 -0
- package/dist/components/PhiMask/index.js +5 -0
- package/dist/components/PhiMask/index.js.map +1 -0
- package/dist/components/PhoneInput/index.d.cts +3 -36
- package/dist/components/PhoneInput/index.d.ts +3 -36
- package/dist/components/PropertyList/index.cjs +25 -0
- package/dist/components/PropertyList/index.cjs.map +1 -0
- package/dist/components/PropertyList/index.d.cts +71 -0
- package/dist/components/PropertyList/index.d.ts +71 -0
- package/dist/components/PropertyList/index.js +12 -0
- package/dist/components/PropertyList/index.js.map +1 -0
- package/dist/components/RadialExplorer/index.cjs +2 -1
- package/dist/components/RadialExplorer/index.js +2 -1
- package/dist/components/Rating/index.cjs +28 -0
- package/dist/components/Rating/index.cjs.map +1 -0
- package/dist/components/Rating/index.d.cts +85 -0
- package/dist/components/Rating/index.d.ts +85 -0
- package/dist/components/Rating/index.js +7 -0
- package/dist/components/Rating/index.js.map +1 -0
- package/dist/components/RecordHeader/index.cjs +29 -0
- package/dist/components/RecordHeader/index.cjs.map +1 -0
- package/dist/components/RecordHeader/index.d.cts +86 -0
- package/dist/components/RecordHeader/index.d.ts +86 -0
- package/dist/components/RecordHeader/index.js +16 -0
- package/dist/components/RecordHeader/index.js.map +1 -0
- package/dist/components/RecordLayout/index.cjs +21 -0
- package/dist/components/RecordLayout/index.cjs.map +1 -0
- package/dist/components/RecordLayout/index.d.cts +40 -0
- package/dist/components/RecordLayout/index.d.ts +40 -0
- package/dist/components/RecordLayout/index.js +8 -0
- package/dist/components/RecordLayout/index.js.map +1 -0
- package/dist/components/RichTextEditor/index.cjs +8 -6
- package/dist/components/RichTextEditor/index.js +5 -3
- package/dist/components/SectionSpyNav/index.cjs +2 -1
- package/dist/components/SectionSpyNav/index.js +2 -1
- package/dist/components/SuperChat/index.cjs +23 -19
- package/dist/components/SuperChat/index.cjs.map +1 -1
- package/dist/components/SuperChat/index.js +11 -7
- package/dist/components/SuperChat/index.js.map +1 -1
- package/dist/components/SuperChat/plugins/index.cjs +5 -4
- package/dist/components/SuperChat/plugins/index.cjs.map +1 -1
- package/dist/components/SuperChat/plugins/index.js +4 -3
- package/dist/components/SuperChat/plugins/index.js.map +1 -1
- package/dist/components/Tabs/index.cjs +9 -7
- package/dist/components/Tabs/index.d.cts +12 -1
- package/dist/components/Tabs/index.d.ts +12 -1
- package/dist/components/Tabs/index.js +3 -1
- package/dist/components/TagEditor/index.cjs +20 -0
- package/dist/components/TagEditor/index.cjs.map +1 -0
- package/dist/components/TagEditor/index.d.cts +46 -0
- package/dist/components/TagEditor/index.d.ts +46 -0
- package/dist/components/TagEditor/index.js +7 -0
- package/dist/components/TagEditor/index.js.map +1 -0
- package/dist/components/UserPicker/index.cjs +24 -0
- package/dist/components/UserPicker/index.cjs.map +1 -0
- package/dist/components/UserPicker/index.d.cts +60 -0
- package/dist/components/UserPicker/index.d.ts +60 -0
- package/dist/components/UserPicker/index.js +11 -0
- package/dist/components/UserPicker/index.js.map +1 -0
- package/dist/components/ViewSet/index.cjs +6 -5
- package/dist/components/ViewSet/index.d.cts +2 -1
- package/dist/components/ViewSet/index.d.ts +2 -1
- package/dist/components/ViewSet/index.js +5 -4
- package/dist/components/ViewSwitcher/index.d.cts +39 -4
- package/dist/components/ViewSwitcher/index.d.ts +39 -4
- package/dist/datavis.cjs +3 -2
- package/dist/datavis.cjs.map +1 -1
- package/dist/datavis.js +2 -1
- package/dist/datavis.js.map +1 -1
- package/dist/esheet.cjs +9 -7
- package/dist/esheet.cjs.map +1 -1
- package/dist/esheet.js +6 -4
- package/dist/esheet.js.map +1 -1
- package/dist/hooks/index.cjs +53 -27
- package/dist/hooks/index.d.cts +91 -6
- package/dist/hooks/index.d.ts +91 -6
- package/dist/hooks/index.js +5 -3
- package/dist/index.cjs +1391 -847
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1253 -168
- package/dist/index.d.ts +1253 -168
- package/dist/index.js +539 -171
- package/dist/index.js.map +1 -1
- package/dist/org-chart.cjs +1302 -0
- package/dist/org-chart.cjs.map +1 -0
- package/dist/org-chart.d.cts +164 -0
- package/dist/org-chart.d.ts +164 -0
- package/dist/org-chart.js +1277 -0
- package/dist/org-chart.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/tailwind-preset.cjs +4 -4
- package/dist/tailwind-preset.js +1 -1
- package/dist/{index-DoYYWsNc.d.cts → types-CDeBNZiE.d.cts} +1 -36
- package/dist/{index-DoYYWsNc.d.ts → types-CDeBNZiE.d.ts} +1 -36
- package/package.json +22 -2
- package/dist/CsvBlock-FX5YNGNE.cjs +0 -17
- package/dist/CsvBlock-VLMG7GUO.js +0 -8
- package/dist/HtmlPreviewBlock-5JE7L3GR.js +0 -8
- package/dist/HtmlPreviewBlock-UO37JQ3K.cjs +0 -17
- package/dist/MermaidBlock-3XHFBAMV.js +0 -8
- package/dist/MermaidBlock-RZ75RPZA.cjs +0 -17
- package/dist/SurveyBlock-MUVJ3JUI.js +0 -8
- package/dist/SurveyBlock-VH47YXZC.cjs +0 -17
- package/dist/chunk-35Y4ILCU.cjs.map +0 -1
- package/dist/chunk-6N6LIAUJ.cjs +0 -80
- package/dist/chunk-6N6LIAUJ.cjs.map +0 -1
- package/dist/chunk-7ZV67VZE.js.map +0 -1
- package/dist/chunk-7ZVTLTJF.js +0 -109
- package/dist/chunk-7ZVTLTJF.js.map +0 -1
- package/dist/chunk-DVOQ3JNO.js.map +0 -1
- package/dist/chunk-ENMXHZNE.js.map +0 -1
- package/dist/chunk-GBUVIGD5.js.map +0 -1
- package/dist/chunk-HZ4MBUC3.js.map +0 -1
- package/dist/chunk-JBIGSP2T.js.map +0 -1
- package/dist/chunk-JEIW7BSV.cjs.map +0 -1
- package/dist/chunk-KRU6IGV7.js.map +0 -1
- package/dist/chunk-LHBWRMNC.cjs.map +0 -1
- package/dist/chunk-MLAWXPRY.js.map +0 -1
- package/dist/chunk-P7UMS4E6.cjs.map +0 -1
- package/dist/chunk-QURJVPRH.cjs.map +0 -1
- package/dist/chunk-SVSHA7XV.js.map +0 -1
- package/dist/chunk-T4L7Q5FA.cjs.map +0 -1
- package/dist/chunk-UBSH27C2.js +0 -78
- package/dist/chunk-UBSH27C2.js.map +0 -1
- package/dist/chunk-VROIMIHB.cjs.map +0 -1
- package/dist/chunk-X4LBUPJO.cjs.map +0 -1
- package/dist/chunk-YVPC65ZJ.cjs.map +0 -1
- package/dist/chunk-ZTMYKAVU.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/CustomizableDashboard/DashboardCustomizePanel.tsx","../src/components/CustomizableDashboard/CustomizableDashboard.tsx"],"names":["React","jsx","jsxs","CustomizableDashboard"],"mappings":"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","file":"chunk-H2IAMSHK.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { RotateCcw } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport {\n Sheet,\n SheetHeader,\n SheetTitle,\n SheetDescription,\n SheetBody,\n SheetFooter,\n} from '../Sheet';\nimport { Switch } from '../Switch';\nimport { Button } from '../Button';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Catalog metadata for a widget a user can show or hide on a dashboard. */\nexport interface WidgetDefinition {\n /** Matches the portlet's `PortletItem.id`. */\n id: string;\n title: string;\n description?: string;\n /** Small leading icon, e.g. `<Activity className=\"h-4 w-4\" />`. */\n icon?: React.ReactNode;\n /** Widgets sharing a category are grouped under a heading. */\n category?: string;\n}\n\nexport interface DashboardCustomizePanelProps {\n /** Whether the panel is open. */\n open: boolean;\n /** Callback when the panel should open or close. */\n onOpenChange: (open: boolean) => void;\n /** The full widget catalog for this dashboard. */\n widgets: WidgetDefinition[];\n /** Ids of widgets currently hidden. */\n hiddenIds: string[];\n /** Called when a widget is shown (`visible: true`) or hidden. */\n onToggleWidget: (id: string, visible: boolean) => void;\n /** When provided, renders a \"Reset layout\" action in the footer. */\n onReset?: () => void;\n /** Panel heading (default \"Customize dashboard\"). */\n title?: string;\n /** Supporting copy under the heading. */\n description?: string;\n}\n\n// =============================================================================\n// DashboardCustomizePanel\n// =============================================================================\n\n/**\n * A slide-in panel listing a dashboard's widget catalog with show/hide\n * toggles, grouped by category, plus an optional layout reset.\n *\n * Used automatically by `CustomizableDashboard` when its `widgets` prop is\n * set, and exported standalone for hosts that render their own trigger or\n * persist visibility elsewhere.\n *\n * @example\n * ```tsx\n * <DashboardCustomizePanel\n * open={open}\n * onOpenChange={setOpen}\n * widgets={WIDGETS}\n * hiddenIds={hidden}\n * onToggleWidget={(id, visible) =>\n * setHidden((prev) =>\n * visible ? prev.filter((h) => h !== id) : [...prev, id]\n * )\n * }\n * />\n * ```\n */\nexport function DashboardCustomizePanel({\n open,\n onOpenChange,\n widgets,\n hiddenIds,\n onToggleWidget,\n onReset,\n title = 'Customize dashboard',\n description = 'Choose which widgets appear on this dashboard. Drag a widget by its handle to rearrange it.',\n}: DashboardCustomizePanelProps) {\n const hidden = React.useMemo(() => new Set(hiddenIds), [hiddenIds]);\n\n const groups = React.useMemo(() => {\n const map = new Map<string, WidgetDefinition[]>();\n for (const w of widgets) {\n const key = w.category ?? '';\n const list = map.get(key);\n if (list) list.push(w);\n else map.set(key, [w]);\n }\n return Array.from(map.entries());\n }, [widgets]);\n\n const visibleCount = widgets.length - hidden.size;\n\n return (\n <Sheet\n open={open}\n onOpenChange={onOpenChange}\n side=\"end\"\n aria-label={title}\n >\n <SheetHeader>\n <div className=\"flex flex-col gap-1.5\">\n <SheetTitle>{title}</SheetTitle>\n <SheetDescription>{description}</SheetDescription>\n </div>\n </SheetHeader>\n <SheetBody className=\"flex flex-col gap-5\">\n <p className=\"text-muted-foreground text-xs font-medium\">\n {visibleCount} of {widgets.length} widgets shown\n </p>\n {groups.map(([category, items]) => (\n <div key={category || 'general'} className=\"flex flex-col gap-1\">\n {category && (\n <h3 className=\"text-muted-foreground pb-1 text-xs font-semibold tracking-wide uppercase\">\n {category}\n </h3>\n )}\n <ul className=\"flex list-none flex-col gap-1 p-0\">\n {items.map((widget) => {\n const isVisible = !hidden.has(widget.id);\n return (\n <li\n key={widget.id}\n className={cn(\n 'border-border flex items-center gap-3 rounded-lg border p-3 transition-colors',\n isVisible ? 'bg-card' : 'bg-muted/50'\n )}\n >\n {widget.icon && (\n <span\n className={cn(\n 'shrink-0',\n isVisible\n ? 'text-primary-600 dark:text-primary-400'\n : 'text-muted-foreground'\n )}\n >\n {widget.icon}\n </span>\n )}\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span\n className={cn(\n 'truncate text-sm font-medium',\n isVisible\n ? 'text-foreground'\n : 'text-muted-foreground'\n )}\n >\n {widget.title}\n </span>\n {widget.description && (\n <span className=\"text-muted-foreground truncate text-xs\">\n {widget.description}\n </span>\n )}\n </span>\n <Switch\n checked={isVisible}\n onCheckedChange={(checked) =>\n onToggleWidget(widget.id, checked)\n }\n aria-label={`Show ${widget.title}`}\n />\n </li>\n );\n })}\n </ul>\n </div>\n ))}\n </SheetBody>\n {onReset && (\n <SheetFooter>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onReset}\n leftIcon={<RotateCcw aria-hidden=\"true\" className=\"h-4 w-4\" />}\n >\n Reset layout\n </Button>\n </SheetFooter>\n )}\n </Sheet>\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n DndContext,\n closestCenter,\n pointerWithin,\n rectIntersection,\n PointerSensor,\n KeyboardSensor,\n useSensor,\n useSensors,\n useDroppable,\n type DragStartEvent,\n type DragOverEvent,\n type DragEndEvent,\n type CollisionDetection,\n} from '@dnd-kit/core';\nimport {\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n useSortable,\n arrayMove,\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport {\n GripVertical,\n Columns2,\n Columns3,\n Square,\n SlidersHorizontal,\n} from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\nimport {\n DashboardCustomizePanel,\n type WidgetDefinition,\n} from './DashboardCustomizePanel';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** A dashboard item: a stable id plus the rendered content. */\nexport interface PortletItem {\n id: string;\n node: React.ReactNode;\n}\n\n/** Number of visible columns. */\nexport type DashboardLayout = 1 | 2 | 3;\n\n/** Portlet items grouped into three logical columns. */\nexport type DashboardColumns = [PortletItem[], PortletItem[], PortletItem[]];\n\n/** Portlet ids grouped into three logical columns. */\nexport type DashboardOrder = [string[], string[], string[]];\n\nexport interface CustomizableDashboardProps {\n /**\n * Portlets grouped into three columns. This is the default arrangement;\n * user reordering (persisted or controlled) takes precedence. Items later\n * removed from props disappear from saved layouts automatically, and new\n * items appear in their props column.\n */\n columns: DashboardColumns;\n /** Toolbar heading rendered before the layout toggle. */\n title?: string;\n /**\n * Base localStorage key used to persist column order and layout mode\n * (`{storageKey}-portlet-order` / `{storageKey}-dashboard-layout`).\n * Omit to disable built-in persistence (e.g. when using `order` /\n * `onOrderChange` with a server-side store). Distinct dashboards must\n * pass distinct keys.\n */\n storageKey?: string;\n /** Accessible label for the dashboard grid region. */\n ariaLabel?: string;\n /**\n * Optional DOM element to portal the toolbar (title + layout toggle)\n * into, e.g. a page header actions row. When omitted, the toolbar\n * renders inline above the grid.\n */\n toolbarSlot?: HTMLElement | null;\n /** Initial column order for uncontrolled usage with external persistence. */\n defaultOrder?: DashboardOrder;\n /** Controlled column order. Changes are reported via `onOrderChange`. */\n order?: DashboardOrder;\n /** Called with the full new order after a drop or layout normalization. */\n onOrderChange?: (order: DashboardOrder) => void;\n /** Initial layout mode for uncontrolled usage (default 3). */\n defaultLayout?: DashboardLayout;\n /** Controlled layout mode. Changes are reported via `onLayoutChange`. */\n layout?: DashboardLayout;\n /** Called when the user changes the column layout (or it auto-shrinks). */\n onLayoutChange?: (layout: DashboardLayout) => void;\n /**\n * CSS selector for the header element inside each portlet that receives\n * the drag handle. Defaults to the `DashboardWidget` header slot. When no\n * header matches, the handle floats over the portlet's top end corner.\n */\n dragHandleSelector?: string;\n /**\n * Widget catalog metadata. When provided, the toolbar gains a Customize\n * button opening a panel where users show/hide widgets and reset the\n * layout. Ids must match the portlet ids in `columns`.\n */\n widgets?: WidgetDefinition[];\n /** Initially hidden widget ids for uncontrolled usage. */\n defaultHiddenIds?: string[];\n /** Controlled hidden widget ids. Changes reported via `onHiddenChange`. */\n hiddenIds?: string[];\n /** Called with the full hidden-id list when visibility changes. */\n onHiddenChange?: (hiddenIds: string[]) => void;\n /** Label for the toolbar customize button (default \"Customize\"). */\n customizeLabel?: string;\n /** Additional class name for the grid element. */\n className?: string;\n}\n\n// =============================================================================\n// Internals\n// =============================================================================\n\nconst COL_IDS = ['column-0', 'column-1', 'column-2'] as const;\n\nconst DEFAULT_HANDLE_SELECTOR = '[data-slot=\"dashboard-widget-header\"]';\n\n// Applied to a discovered header so the appended handle lays out correctly:\n// an auto start margin on the 2nd child pushes trailing controls (and the\n// handle after them) to the end, even inside `justify-between` headers.\nconst HEADER_LAYOUT_CLASSES = [\n 'flex',\n 'flex-row',\n 'flex-nowrap',\n 'items-center',\n '[&>:nth-child(2)]:ms-auto',\n];\n\nfunction orderStorageKey(base: string): string {\n return `${base}-portlet-order`;\n}\n\nfunction layoutStorageKey(base: string): string {\n return `${base}-dashboard-layout`;\n}\n\nfunction hiddenStorageKey(base: string): string {\n return `${base}-dashboard-hidden`;\n}\n\nfunction loadHidden(base: string | undefined): string[] | null {\n if (!base) return null;\n try {\n const raw = localStorage.getItem(hiddenStorageKey(base));\n const parsed = raw ? (JSON.parse(raw) as unknown) : null;\n return Array.isArray(parsed)\n ? parsed.filter((v) => typeof v === 'string')\n : null;\n } catch {\n return null;\n }\n}\n\nfunction saveHidden(base: string | undefined, ids: string[]) {\n if (!base) return;\n try {\n localStorage.setItem(hiddenStorageKey(base), JSON.stringify(ids));\n } catch {\n /* storage unavailable */\n }\n}\n\nfunction loadLayout(base: string | undefined): DashboardLayout | null {\n if (!base) return null;\n try {\n const raw = localStorage.getItem(layoutStorageKey(base));\n const val = raw ? Number(raw) : null;\n return val === 1 || val === 2 || val === 3 ? val : null;\n } catch {\n return null;\n }\n}\n\nfunction saveLayout(base: string | undefined, mode: DashboardLayout) {\n if (!base) return;\n try {\n localStorage.setItem(layoutStorageKey(base), String(mode));\n } catch {\n /* storage unavailable */\n }\n}\n\nfunction sanitizeSlot(value: unknown): string[] {\n return Array.isArray(value)\n ? value.filter((v): v is string => typeof v === 'string')\n : [];\n}\n\nfunction loadOrder(base: string | undefined): DashboardOrder | null {\n if (!base) return null;\n try {\n const raw = localStorage.getItem(orderStorageKey(base));\n if (!raw) return null;\n const parsed = JSON.parse(raw) as Record<number, unknown>;\n return [\n sanitizeSlot(parsed[0]),\n sanitizeSlot(parsed[1]),\n sanitizeSlot(parsed[2]),\n ];\n } catch {\n return null;\n }\n}\n\nfunction saveOrder(base: string | undefined, order: DashboardOrder) {\n if (!base) return;\n try {\n const record: Record<number, string[]> = {};\n order.forEach((ids, i) => {\n record[i] = ids;\n });\n localStorage.setItem(orderStorageKey(base), JSON.stringify(record));\n } catch {\n /* storage unavailable */\n }\n}\n\n/**\n * Merge a saved/provided order with the current props columns: saved\n * positions win, unknown saved ids are dropped, and new items are appended\n * to their original props column.\n */\nexport function mergeColumnOrder(\n columns: DashboardColumns,\n saved: DashboardOrder | null\n): DashboardOrder {\n const allIds = new Set(\n [...columns[0], ...columns[1], ...columns[2]].map((p) => p.id)\n );\n const result: DashboardOrder = [[], [], []];\n const placed = new Set<string>();\n\n for (let i = 0; i < 3; i++) {\n for (const id of saved?.[i] ?? []) {\n if (allIds.has(id) && !placed.has(id)) {\n result[i].push(id);\n placed.add(id);\n }\n }\n }\n for (let i = 0; i < 3; i++) {\n for (const item of columns[i]) {\n if (!placed.has(item.id)) {\n result[i].push(item.id);\n placed.add(item.id);\n }\n }\n }\n return result;\n}\n\nfunction buildItemMap(columns: DashboardColumns): Map<string, PortletItem> {\n const map = new Map<string, PortletItem>();\n for (const col of columns) {\n for (const item of col) map.set(item.id, item);\n }\n return map;\n}\n\nfunction findColumn(colOrder: string[][], itemId: string): number {\n return colOrder.findIndex((ids) => ids.includes(itemId));\n}\n\n/**\n * Move `activeId` into the column named by `overId` (a column id or an item\n * id), inserted before the hovered item. Returns the same reference when no\n * cross-column move is needed.\n */\nexport function moveAcrossColumns(\n order: DashboardOrder,\n activeId: string,\n overId: string\n): DashboardOrder {\n const colIdx = COL_IDS.indexOf(overId as (typeof COL_IDS)[number]);\n const sourceCol = findColumn(order, activeId);\n if (sourceCol === -1) return order;\n\n const targetCol = colIdx !== -1 ? colIdx : findColumn(order, overId);\n if (targetCol === -1 || sourceCol === targetCol) return order;\n\n const next = order.map((col) => [...col]) as DashboardOrder;\n next[sourceCol] = next[sourceCol].filter((id) => id !== activeId);\n const overIdx = colIdx !== -1 ? -1 : next[targetCol].indexOf(overId);\n if (overIdx === -1) {\n next[targetCol].push(activeId);\n } else {\n next[targetCol].splice(overIdx, 0, activeId);\n }\n return next;\n}\n\n/**\n * Final order for a drop. Same-column drags reorder around the hovered\n * item. After a cross-column move, the one position `moveAcrossColumns`\n * already chose — active sitting immediately before the hovered item — is\n * kept (reordering would flip it to the other side of that item), but\n * hovering any other item in the destination column still reorders, so a\n * drag can keep moving after it crosses.\n */\nexport function reorderOnDrop(\n order: DashboardOrder,\n activeId: string,\n overId: string,\n crossedColumns: boolean\n): DashboardOrder {\n const isColumnTarget =\n COL_IDS.indexOf(overId as (typeof COL_IDS)[number]) !== -1;\n if (isColumnTarget || overId === activeId) return order;\n\n const col = findColumn(order, activeId);\n if (col === -1 || findColumn(order, overId) !== col) return order;\n\n const oldIdx = order[col].indexOf(activeId);\n const newIdx = order[col].indexOf(overId);\n if (oldIdx === -1 || newIdx === -1) return order;\n // Immediately-before adjacency after a cross is dragOver's insertion,\n // not a new reorder request.\n if (crossedColumns && newIdx === oldIdx + 1) return order;\n\n const next = order.map((c) => [...c]) as DashboardOrder;\n next[col] = arrayMove(next[col], oldIdx, newIdx);\n return next;\n}\n\n/**\n * Consolidate columns beyond the visible count into the last visible one.\n * Returns the same reference when nothing needs to move so callers can use\n * reference equality to skip persistence/notification.\n */\nexport function consolidateColumns(\n order: DashboardOrder,\n mode: DashboardLayout\n): DashboardOrder {\n if (mode >= 3 || requiredColumns(order) <= mode) return order;\n if (mode === 1) return [[...order[0], ...order[1], ...order[2]], [], []];\n return [[...order[0]], [...order[1], ...order[2]], []];\n}\n\n/**\n * Columns needed to show every item: the highest occupied index + 1, so a\n * gap like `[a], [], [c]` still requires three columns.\n */\nexport function requiredColumns(order: DashboardOrder): DashboardLayout {\n return Math.max(\n 1,\n ...order.map((ids, i) => (ids.length > 0 ? i + 1 : 0))\n ) as DashboardLayout;\n}\n\n/**\n * pointerWithin first (drops into empty columns), then closestCenter for\n * items, then rectIntersection for columns.\n */\nconst collisionDetection: CollisionDetection = (args) => {\n const pw = pointerWithin(args);\n if (pw.length > 0) return pw;\n const cc = closestCenter(args);\n if (cc.length > 0) return cc;\n return rectIntersection(args);\n};\n\n// =============================================================================\n// SortablePortlet\n// =============================================================================\n\nfunction SortablePortlet({\n id,\n handleSelector,\n children,\n}: {\n id: string;\n handleSelector: string;\n children: React.ReactNode;\n}) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id });\n\n const wrapperRef = React.useRef<HTMLDivElement>(null);\n const [headerEl, setHeaderEl] = React.useState<HTMLElement | null>(null);\n const [searched, setSearched] = React.useState(false);\n\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.4 : 1,\n };\n\n // Portlet content can render asynchronously, so watch for the header with\n // a MutationObserver (rAF-coalesced) and disconnect once found.\n React.useEffect(() => {\n const container = wrapperRef.current;\n if (!container) return;\n\n let rafId = 0;\n\n const findHeader = () => {\n const header = container.querySelector(handleSelector);\n if (header instanceof HTMLElement) {\n header.classList.add(...HEADER_LAYOUT_CLASSES);\n setHeaderEl(header);\n observer.disconnect();\n } else {\n setHeaderEl(null);\n }\n setSearched(true);\n };\n\n const observer = new MutationObserver(() => {\n cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(findHeader);\n });\n\n findHeader();\n observer.observe(container, { childList: true, subtree: true });\n\n return () => {\n cancelAnimationFrame(rafId);\n observer.disconnect();\n };\n }, [handleSelector]);\n\n const handle = (\n <button\n type=\"button\"\n className={cn(\n 'inline-flex h-7 w-6 shrink-0 cursor-grab touch-none items-center justify-center rounded border-none bg-transparent',\n 'text-muted-foreground hover:bg-muted hover:text-foreground active:cursor-grabbing',\n 'opacity-40 transition-opacity group-hover/portlet:opacity-100 focus-visible:opacity-100',\n '[@media(hover:none)]:opacity-100',\n !headerEl && 'bg-card/80 absolute end-2 top-2 z-10 shadow-sm'\n )}\n aria-label=\"Drag to reorder\"\n {...attributes}\n {...listeners}\n >\n <GripVertical aria-hidden=\"true\" className=\"h-4 w-4\" />\n </button>\n );\n\n return (\n <div\n ref={(node) => {\n setNodeRef(node);\n wrapperRef.current = node;\n }}\n style={style}\n className=\"group/portlet relative min-w-0\"\n >\n <div className=\"w-full min-w-0\">{children}</div>\n {headerEl ? createPortal(handle, headerEl) : searched ? handle : null}\n </div>\n );\n}\n\n// =============================================================================\n// DroppableColumn\n// =============================================================================\n\nfunction DroppableColumn({\n id,\n items,\n columnIndex,\n handleSelector,\n flatten,\n dragActive,\n}: {\n id: string;\n items: PortletItem[];\n columnIndex: number;\n handleSelector: string;\n flatten: boolean;\n dragActive: boolean;\n}) {\n const { setNodeRef, isOver } = useDroppable({ id });\n const ids = items.map((p) => p.id);\n\n return (\n <SortableContext items={ids} strategy={verticalListSortingStrategy}>\n <div\n ref={setNodeRef}\n className={cn(\n 'flex min-h-16 min-w-0 flex-col gap-3',\n flatten && 'max-lg:contents'\n )}\n role=\"group\"\n aria-label={`Dashboard column ${columnIndex + 1}`}\n >\n {items.map((item) => (\n <SortablePortlet\n key={item.id}\n id={item.id}\n handleSelector={handleSelector}\n >\n {item.node}\n </SortablePortlet>\n ))}\n {items.length === 0 && dragActive && (\n <div\n aria-hidden=\"true\"\n className={cn(\n 'border-border text-muted-foreground flex min-h-32 items-center justify-center rounded-lg border-2 border-dashed text-sm font-medium transition-colors',\n isOver && 'border-primary-500 bg-primary-500/10 text-primary-600'\n )}\n >\n Drop here\n </div>\n )}\n </div>\n </SortableContext>\n );\n}\n\n// =============================================================================\n// CustomizableDashboard\n// =============================================================================\n\n/**\n * A user-customizable portlet dashboard: a responsive 1–3 column grid whose\n * items can be dragged between and within columns, with a column-layout\n * toggle and optional persistence.\n *\n * Each portlet's drag handle is appended to the header element matched by\n * `dragHandleSelector` inside its content — `DashboardWidget` headers are\n * matched by default. Portlets without a matching header get a floating\n * handle in their top end corner.\n *\n * Order and layout are persisted to localStorage when `storageKey` is set,\n * or can be controlled via `order`/`onOrderChange` and\n * `layout`/`onLayoutChange` for server-side persistence.\n *\n * Passing a `widgets` catalog adds a toolbar Customize button opening a\n * `DashboardCustomizePanel` where users show/hide widgets and reset the\n * layout; visibility follows the same persistence rules via\n * `hiddenIds`/`onHiddenChange`.\n *\n * @example\n * ```tsx\n * <CustomizableDashboard\n * storageKey=\"home\"\n * columns={[\n * [{ id: 'stats', node: <StatsWidget /> }],\n * [{ id: 'tasks', node: <TasksWidget /> }],\n * [{ id: 'orders', node: <OrdersWidget /> }],\n * ]}\n * />\n * ```\n */\nexport const CustomizableDashboard = React.forwardRef<\n HTMLDivElement,\n CustomizableDashboardProps\n>(function CustomizableDashboard(\n {\n columns,\n title,\n storageKey,\n ariaLabel,\n toolbarSlot,\n defaultOrder,\n order: controlledOrder,\n onOrderChange,\n defaultLayout = 3,\n layout: controlledLayout,\n onLayoutChange,\n dragHandleSelector = DEFAULT_HANDLE_SELECTOR,\n widgets,\n defaultHiddenIds,\n hiddenIds: controlledHidden,\n onHiddenChange,\n customizeLabel = 'Customize',\n className,\n },\n ref\n) {\n const itemMap = React.useMemo(() => buildItemMap(columns), [columns]);\n\n // Initial state ignores persistence so the first client render matches SSR;\n // saved values are restored in a mount effect below.\n const [internalLayout, setInternalLayout] =\n React.useState<DashboardLayout>(defaultLayout);\n const layoutMode = controlledLayout ?? internalLayout;\n\n const [colOrder, setColOrder] = React.useState<DashboardOrder>(() =>\n consolidateColumns(\n mergeColumnOrder(columns, controlledOrder ?? defaultOrder ?? null),\n controlledLayout ?? defaultLayout\n )\n );\n const [activeId, setActiveId] = React.useState<string | null>(null);\n\n const [internalHidden, setInternalHidden] = React.useState<string[]>(\n () => defaultHiddenIds ?? []\n );\n const hiddenList = controlledHidden ?? internalHidden;\n const hiddenSet = React.useMemo(() => new Set(hiddenList), [hiddenList]);\n const [panelOpen, setPanelOpen] = React.useState(false);\n\n const prevColOrder = React.useRef(colOrder);\n const layoutModeRef = React.useRef(layoutMode);\n layoutModeRef.current = layoutMode;\n const colOrderRef = React.useRef(colOrder);\n colOrderRef.current = colOrder;\n const columnsRef = React.useRef(columns);\n columnsRef.current = columns;\n const draggingRef = React.useRef(false);\n\n // Restore persisted layout/order/visibility after mount (uncontrolled\n // concerns only) so the first client render matches SSR.\n React.useEffect(() => {\n if (!storageKey) return;\n if (controlledLayout === undefined) {\n const savedLayout = loadLayout(storageKey);\n if (savedLayout !== null) setInternalLayout(savedLayout);\n }\n if (controlledOrder === undefined) {\n const savedOrder = loadOrder(storageKey);\n if (savedOrder) {\n setColOrder(mergeColumnOrder(columnsRef.current, savedOrder));\n }\n }\n if (controlledHidden === undefined) {\n const savedHidden = loadHidden(storageKey);\n if (savedHidden) setInternalHidden(savedHidden);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- mount-only restore\n }, [storageKey]);\n\n // Sync controlled order and newly added/removed items while not dragging,\n // consolidating into the effective layout so portlets in columns beyond the\n // visible count (e.g. mounting with `defaultLayout` 1/2, or a restored or\n // controlled layout) are never sliced off the render.\n React.useEffect(() => {\n if (draggingRef.current) return;\n setColOrder((prev) => {\n const next = consolidateColumns(\n mergeColumnOrder(columns, controlledOrder ?? prev),\n layoutMode\n );\n return JSON.stringify(next) === JSON.stringify(prev) ? prev : next;\n });\n }, [columns, controlledOrder, layoutMode]);\n\n const setLayout = React.useCallback(\n (mode: DashboardLayout) => {\n if (controlledLayout === undefined) setInternalLayout(mode);\n saveLayout(storageKey, mode);\n onLayoutChange?.(mode);\n },\n [controlledLayout, storageKey, onLayoutChange]\n );\n\n const commitOrder = React.useCallback(\n (next: DashboardOrder) => {\n saveOrder(storageKey, next);\n onOrderChange?.(next);\n\n // Auto-shrink only when trailing columns are empty (gaps keep their\n // column so no item is hidden by a reduced layout)\n const occupied = requiredColumns(next);\n if (occupied < layoutModeRef.current) {\n setLayout(occupied);\n }\n },\n [storageKey, onOrderChange, setLayout]\n );\n\n const handleLayoutChange = React.useCallback(\n (mode: DashboardLayout) => {\n setLayout(mode);\n // Consolidate so droppable ids match visible columns; persist/notify\n // outside the state updater so replayed renders can't double-fire.\n const next = consolidateColumns(colOrderRef.current, mode);\n if (next !== colOrderRef.current) {\n setColOrder(next);\n saveOrder(storageKey, next);\n onOrderChange?.(next);\n }\n },\n [setLayout, storageKey, onOrderChange]\n );\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates })\n );\n\n const resolve = (ids: string[]): PortletItem[] =>\n ids\n .filter((id) => !hiddenSet.has(id))\n .map((id) => itemMap.get(id))\n .filter(Boolean) as PortletItem[];\n\n const handleDragStart = React.useCallback(\n (event: DragStartEvent) => {\n prevColOrder.current = colOrder;\n draggingRef.current = true;\n setActiveId(String(event.active.id));\n },\n [colOrder]\n );\n\n const handleDragOver = React.useCallback((event: DragOverEvent) => {\n const { active, over } = event;\n if (!over) return;\n const next = moveAcrossColumns(\n colOrderRef.current,\n String(active.id),\n String(over.id)\n );\n if (next !== colOrderRef.current) setColOrder(next);\n }, []);\n\n const handleDragEnd = React.useCallback(\n (event: DragEndEvent) => {\n const { active, over } = event;\n draggingRef.current = false;\n setActiveId(null);\n\n if (!over) {\n setColOrder(prevColOrder.current);\n return;\n }\n\n const activeItemId = String(active.id);\n // A drag that ends in a different column than it started already sits\n // where moveAcrossColumns placed it; reordering again would flip it\n // to the other side of the hovered item.\n const crossedColumns =\n findColumn(prevColOrder.current, activeItemId) !==\n findColumn(colOrderRef.current, activeItemId);\n const next = reorderOnDrop(\n colOrderRef.current,\n activeItemId,\n String(over.id),\n crossedColumns\n );\n if (next !== colOrderRef.current) setColOrder(next);\n // A drag that ends where it started is a no-op: skip the commit so it\n // can't write storage, notify hosts, or auto-shrink the layout.\n if (JSON.stringify(next) !== JSON.stringify(prevColOrder.current)) {\n commitOrder(next);\n }\n },\n [commitOrder]\n );\n\n const handleDragCancel = React.useCallback(() => {\n draggingRef.current = false;\n setActiveId(null);\n setColOrder(prevColOrder.current);\n }, []);\n\n const setHidden = React.useCallback(\n (ids: string[]) => {\n if (controlledHidden === undefined) setInternalHidden(ids);\n saveHidden(storageKey, ids);\n onHiddenChange?.(ids);\n },\n [controlledHidden, storageKey, onHiddenChange]\n );\n\n const handleToggleWidget = React.useCallback(\n (id: string, visible: boolean) => {\n setHidden(\n visible ? hiddenList.filter((h) => h !== id) : [...hiddenList, id]\n );\n },\n [hiddenList, setHidden]\n );\n\n const handleReset = React.useCallback(() => {\n if (storageKey) {\n try {\n localStorage.removeItem(orderStorageKey(storageKey));\n localStorage.removeItem(layoutStorageKey(storageKey));\n localStorage.removeItem(hiddenStorageKey(storageKey));\n } catch {\n /* storage unavailable */\n }\n }\n const next = mergeColumnOrder(columns, defaultOrder ?? null);\n setColOrder(next);\n onOrderChange?.(next);\n if (controlledLayout === undefined) setInternalLayout(defaultLayout);\n onLayoutChange?.(defaultLayout);\n const hidden = defaultHiddenIds ?? [];\n if (controlledHidden === undefined) setInternalHidden(hidden);\n onHiddenChange?.(hidden);\n }, [\n storageKey,\n columns,\n defaultOrder,\n onOrderChange,\n controlledLayout,\n defaultLayout,\n onLayoutChange,\n defaultHiddenIds,\n controlledHidden,\n onHiddenChange,\n ]);\n\n const cols: DashboardColumns = [\n resolve(colOrder[0]),\n resolve(colOrder[1]),\n resolve(colOrder[2]),\n ];\n\n const visibleCols =\n layoutMode === 1 ? [cols[0]] : layoutMode === 2 ? [cols[0], cols[1]] : cols;\n\n const toolbar = (\n <div className=\"flex items-center justify-end gap-3 pb-2\">\n {title && (\n <h2 className=\"text-foreground me-auto text-lg font-semibold\">\n {title}\n </h2>\n )}\n {widgets && widgets.length > 0 && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setPanelOpen(true)}\n aria-haspopup=\"dialog\"\n leftIcon={\n <SlidersHorizontal aria-hidden=\"true\" className=\"h-4 w-4\" />\n }\n >\n {customizeLabel}\n </Button>\n )}\n <div\n className=\"border-border bg-muted flex gap-0.5 rounded-md border p-0.5 max-md:hidden\"\n role=\"radiogroup\"\n aria-label=\"Column layout\"\n >\n {([3, 2, 1] as const).map((mode) => {\n const Icon = mode === 3 ? Columns3 : mode === 2 ? Columns2 : Square;\n return (\n <button\n key={mode}\n type=\"button\"\n className={cn(\n 'flex h-7 w-7 items-center justify-center rounded transition-colors',\n layoutMode === mode\n ? 'bg-background text-foreground shadow-sm'\n : 'text-muted-foreground hover:bg-background hover:text-foreground'\n )}\n onClick={() => handleLayoutChange(mode)}\n role=\"radio\"\n aria-checked={layoutMode === mode}\n aria-label={`${mode} column layout`}\n title={`${mode} column${mode > 1 ? 's' : ''}`}\n >\n <Icon aria-hidden=\"true\" className=\"h-4 w-4\" />\n </button>\n );\n })}\n </div>\n </div>\n );\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={collisionDetection}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n >\n {toolbarSlot ? createPortal(toolbar, toolbarSlot) : toolbar}\n <div\n ref={ref}\n className={cn(\n 'grid items-start gap-3',\n layoutMode === 3 && 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3',\n layoutMode === 2 && 'grid-cols-1 md:grid-cols-2',\n layoutMode === 1 && 'grid-cols-1',\n className\n )}\n role=\"region\"\n aria-label={ariaLabel ?? 'Dashboard'}\n >\n {visibleCols.map((col, i) => (\n <DroppableColumn\n key={COL_IDS[i]}\n id={COL_IDS[i]}\n items={col}\n columnIndex={i}\n handleSelector={dragHandleSelector}\n flatten={layoutMode === 3}\n dragActive={activeId !== null}\n />\n ))}\n </div>\n {widgets && widgets.length > 0 && (\n <DashboardCustomizePanel\n open={panelOpen}\n onOpenChange={setPanelOpen}\n widgets={widgets}\n hiddenIds={hiddenList}\n onToggleWidget={handleToggleWidget}\n onReset={handleReset}\n />\n )}\n </DndContext>\n );\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/CustomizableDashboard/DashboardCustomizePanel.tsx","../src/components/CustomizableDashboard/CustomizableDashboard.tsx"],"names":["React","jsx","jsxs","CustomizableDashboard"],"mappings":"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","file":"chunk-TVEJKKIM.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { RotateCcw } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport {\n Sheet,\n SheetHeader,\n SheetTitle,\n SheetDescription,\n SheetBody,\n SheetFooter,\n} from '../Sheet';\nimport { Switch } from '../Switch';\nimport { Button } from '../Button';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Catalog metadata for a widget a user can show or hide on a dashboard. */\nexport interface WidgetDefinition {\n /** Matches the portlet's `PortletItem.id`. */\n id: string;\n title: string;\n description?: string;\n /** Small leading icon, e.g. `<Activity className=\"h-4 w-4\" />`. */\n icon?: React.ReactNode;\n /** Widgets sharing a category are grouped under a heading. */\n category?: string;\n}\n\nexport interface DashboardCustomizePanelProps {\n /** Whether the panel is open. */\n open: boolean;\n /** Callback when the panel should open or close. */\n onOpenChange: (open: boolean) => void;\n /** The full widget catalog for this dashboard. */\n widgets: WidgetDefinition[];\n /** Ids of widgets currently hidden. */\n hiddenIds: string[];\n /** Called when a widget is shown (`visible: true`) or hidden. */\n onToggleWidget: (id: string, visible: boolean) => void;\n /** When provided, renders a \"Reset layout\" action in the footer. */\n onReset?: () => void;\n /** Panel heading (default \"Customize dashboard\"). */\n title?: string;\n /** Supporting copy under the heading. */\n description?: string;\n}\n\n// =============================================================================\n// DashboardCustomizePanel\n// =============================================================================\n\n/**\n * A slide-in panel listing a dashboard's widget catalog with show/hide\n * toggles, grouped by category, plus an optional layout reset.\n *\n * Used automatically by `CustomizableDashboard` when its `widgets` prop is\n * set, and exported standalone for hosts that render their own trigger or\n * persist visibility elsewhere.\n *\n * @example\n * ```tsx\n * <DashboardCustomizePanel\n * open={open}\n * onOpenChange={setOpen}\n * widgets={WIDGETS}\n * hiddenIds={hidden}\n * onToggleWidget={(id, visible) =>\n * setHidden((prev) =>\n * visible ? prev.filter((h) => h !== id) : [...prev, id]\n * )\n * }\n * />\n * ```\n */\nexport function DashboardCustomizePanel({\n open,\n onOpenChange,\n widgets,\n hiddenIds,\n onToggleWidget,\n onReset,\n title = 'Customize dashboard',\n description = 'Choose which widgets appear on this dashboard. Drag a widget by its handle to rearrange it.',\n}: DashboardCustomizePanelProps) {\n const hidden = React.useMemo(() => new Set(hiddenIds), [hiddenIds]);\n\n const groups = React.useMemo(() => {\n const map = new Map<string, WidgetDefinition[]>();\n for (const w of widgets) {\n const key = w.category ?? '';\n const list = map.get(key);\n if (list) list.push(w);\n else map.set(key, [w]);\n }\n return Array.from(map.entries());\n }, [widgets]);\n\n const visibleCount = widgets.length - hidden.size;\n\n return (\n <Sheet\n open={open}\n onOpenChange={onOpenChange}\n side=\"end\"\n aria-label={title}\n >\n <SheetHeader>\n <div className=\"flex flex-col gap-1.5\">\n <SheetTitle>{title}</SheetTitle>\n <SheetDescription>{description}</SheetDescription>\n </div>\n </SheetHeader>\n <SheetBody className=\"flex flex-col gap-5\">\n <p className=\"text-muted-foreground text-xs font-medium\">\n {visibleCount} of {widgets.length} widgets shown\n </p>\n {groups.map(([category, items]) => (\n <div key={category || 'general'} className=\"flex flex-col gap-1\">\n {category && (\n <h3 className=\"text-muted-foreground pb-1 text-xs font-semibold tracking-wide uppercase\">\n {category}\n </h3>\n )}\n <ul className=\"flex list-none flex-col gap-1 p-0\">\n {items.map((widget) => {\n const isVisible = !hidden.has(widget.id);\n return (\n <li\n key={widget.id}\n className={cn(\n 'border-border flex items-center gap-3 rounded-lg border p-3 transition-colors',\n isVisible ? 'bg-card' : 'bg-muted/50'\n )}\n >\n {widget.icon && (\n <span\n className={cn(\n 'shrink-0',\n isVisible\n ? 'text-primary-600 dark:text-primary-400'\n : 'text-muted-foreground'\n )}\n >\n {widget.icon}\n </span>\n )}\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span\n className={cn(\n 'truncate text-sm font-medium',\n isVisible\n ? 'text-foreground'\n : 'text-muted-foreground'\n )}\n >\n {widget.title}\n </span>\n {widget.description && (\n <span className=\"text-muted-foreground truncate text-xs\">\n {widget.description}\n </span>\n )}\n </span>\n <Switch\n checked={isVisible}\n onCheckedChange={(checked) =>\n onToggleWidget(widget.id, checked)\n }\n aria-label={`Show ${widget.title}`}\n />\n </li>\n );\n })}\n </ul>\n </div>\n ))}\n </SheetBody>\n {onReset && (\n <SheetFooter>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onReset}\n leftIcon={<RotateCcw aria-hidden=\"true\" className=\"h-4 w-4\" />}\n >\n Reset layout\n </Button>\n </SheetFooter>\n )}\n </Sheet>\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n DndContext,\n closestCenter,\n pointerWithin,\n rectIntersection,\n PointerSensor,\n KeyboardSensor,\n useSensor,\n useSensors,\n useDroppable,\n type DragStartEvent,\n type DragOverEvent,\n type DragEndEvent,\n type CollisionDetection,\n} from '@dnd-kit/core';\nimport {\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n useSortable,\n arrayMove,\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport {\n GripVertical,\n Columns2,\n Columns3,\n Square,\n SlidersHorizontal,\n} from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\nimport {\n DashboardCustomizePanel,\n type WidgetDefinition,\n} from './DashboardCustomizePanel';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** A dashboard item: a stable id plus the rendered content. */\nexport interface PortletItem {\n id: string;\n node: React.ReactNode;\n}\n\n/** Number of visible columns. */\nexport type DashboardLayout = 1 | 2 | 3;\n\n/** Portlet items grouped into three logical columns. */\nexport type DashboardColumns = [PortletItem[], PortletItem[], PortletItem[]];\n\n/** Portlet ids grouped into three logical columns. */\nexport type DashboardOrder = [string[], string[], string[]];\n\nexport interface CustomizableDashboardProps {\n /**\n * Portlets grouped into three columns. This is the default arrangement;\n * user reordering (persisted or controlled) takes precedence. Items later\n * removed from props disappear from saved layouts automatically, and new\n * items appear in their props column.\n */\n columns: DashboardColumns;\n /** Toolbar heading rendered before the layout toggle. */\n title?: string;\n /**\n * Base localStorage key used to persist column order and layout mode\n * (`{storageKey}-portlet-order` / `{storageKey}-dashboard-layout`).\n * Omit to disable built-in persistence (e.g. when using `order` /\n * `onOrderChange` with a server-side store). Distinct dashboards must\n * pass distinct keys.\n */\n storageKey?: string;\n /** Accessible label for the dashboard grid region. */\n ariaLabel?: string;\n /**\n * Optional DOM element to portal the toolbar (title + layout toggle)\n * into, e.g. a page header actions row. When omitted, the toolbar\n * renders inline above the grid.\n */\n toolbarSlot?: HTMLElement | null;\n /** Initial column order for uncontrolled usage with external persistence. */\n defaultOrder?: DashboardOrder;\n /** Controlled column order. Changes are reported via `onOrderChange`. */\n order?: DashboardOrder;\n /** Called with the full new order after a drop or layout normalization. */\n onOrderChange?: (order: DashboardOrder) => void;\n /** Initial layout mode for uncontrolled usage (default 3). */\n defaultLayout?: DashboardLayout;\n /** Controlled layout mode. Changes are reported via `onLayoutChange`. */\n layout?: DashboardLayout;\n /** Called when the user changes the column layout (or it auto-shrinks). */\n onLayoutChange?: (layout: DashboardLayout) => void;\n /**\n * CSS selector for the header element inside each portlet that receives\n * the drag handle. Defaults to the `DashboardWidget` header slot. When no\n * header matches, the handle floats over the portlet's top end corner.\n */\n dragHandleSelector?: string;\n /**\n * Widget catalog metadata. When provided, the toolbar gains a Customize\n * button opening a panel where users show/hide widgets and reset the\n * layout. Ids must match the portlet ids in `columns`.\n */\n widgets?: WidgetDefinition[];\n /** Initially hidden widget ids for uncontrolled usage. */\n defaultHiddenIds?: string[];\n /** Controlled hidden widget ids. Changes reported via `onHiddenChange`. */\n hiddenIds?: string[];\n /** Called with the full hidden-id list when visibility changes. */\n onHiddenChange?: (hiddenIds: string[]) => void;\n /** Label for the toolbar customize button (default \"Customize\"). */\n customizeLabel?: string;\n /** Additional class name for the grid element. */\n className?: string;\n}\n\n// =============================================================================\n// Internals\n// =============================================================================\n\nconst COL_IDS = ['column-0', 'column-1', 'column-2'] as const;\n\nconst DEFAULT_HANDLE_SELECTOR = '[data-slot=\"dashboard-widget-header\"]';\n\n// Applied to a discovered header so the appended handle lays out correctly:\n// an auto start margin on the 2nd child pushes trailing controls (and the\n// handle after them) to the end, even inside `justify-between` headers.\nconst HEADER_LAYOUT_CLASSES = [\n 'flex',\n 'flex-row',\n 'flex-nowrap',\n 'items-center',\n '[&>:nth-child(2)]:ms-auto',\n];\n\nfunction orderStorageKey(base: string): string {\n return `${base}-portlet-order`;\n}\n\nfunction layoutStorageKey(base: string): string {\n return `${base}-dashboard-layout`;\n}\n\nfunction hiddenStorageKey(base: string): string {\n return `${base}-dashboard-hidden`;\n}\n\nfunction loadHidden(base: string | undefined): string[] | null {\n if (!base) return null;\n try {\n const raw = localStorage.getItem(hiddenStorageKey(base));\n const parsed = raw ? (JSON.parse(raw) as unknown) : null;\n return Array.isArray(parsed)\n ? parsed.filter((v) => typeof v === 'string')\n : null;\n } catch {\n return null;\n }\n}\n\nfunction saveHidden(base: string | undefined, ids: string[]) {\n if (!base) return;\n try {\n localStorage.setItem(hiddenStorageKey(base), JSON.stringify(ids));\n } catch {\n /* storage unavailable */\n }\n}\n\nfunction loadLayout(base: string | undefined): DashboardLayout | null {\n if (!base) return null;\n try {\n const raw = localStorage.getItem(layoutStorageKey(base));\n const val = raw ? Number(raw) : null;\n return val === 1 || val === 2 || val === 3 ? val : null;\n } catch {\n return null;\n }\n}\n\nfunction saveLayout(base: string | undefined, mode: DashboardLayout) {\n if (!base) return;\n try {\n localStorage.setItem(layoutStorageKey(base), String(mode));\n } catch {\n /* storage unavailable */\n }\n}\n\nfunction sanitizeSlot(value: unknown): string[] {\n return Array.isArray(value)\n ? value.filter((v): v is string => typeof v === 'string')\n : [];\n}\n\nfunction loadOrder(base: string | undefined): DashboardOrder | null {\n if (!base) return null;\n try {\n const raw = localStorage.getItem(orderStorageKey(base));\n if (!raw) return null;\n const parsed = JSON.parse(raw) as Record<number, unknown>;\n return [\n sanitizeSlot(parsed[0]),\n sanitizeSlot(parsed[1]),\n sanitizeSlot(parsed[2]),\n ];\n } catch {\n return null;\n }\n}\n\nfunction saveOrder(base: string | undefined, order: DashboardOrder) {\n if (!base) return;\n try {\n const record: Record<number, string[]> = {};\n order.forEach((ids, i) => {\n record[i] = ids;\n });\n localStorage.setItem(orderStorageKey(base), JSON.stringify(record));\n } catch {\n /* storage unavailable */\n }\n}\n\n/**\n * Merge a saved/provided order with the current props columns: saved\n * positions win, unknown saved ids are dropped, and new items are appended\n * to their original props column.\n */\nexport function mergeColumnOrder(\n columns: DashboardColumns,\n saved: DashboardOrder | null\n): DashboardOrder {\n const allIds = new Set(\n [...columns[0], ...columns[1], ...columns[2]].map((p) => p.id)\n );\n const result: DashboardOrder = [[], [], []];\n const placed = new Set<string>();\n\n for (let i = 0; i < 3; i++) {\n for (const id of saved?.[i] ?? []) {\n if (allIds.has(id) && !placed.has(id)) {\n result[i].push(id);\n placed.add(id);\n }\n }\n }\n for (let i = 0; i < 3; i++) {\n for (const item of columns[i]) {\n if (!placed.has(item.id)) {\n result[i].push(item.id);\n placed.add(item.id);\n }\n }\n }\n return result;\n}\n\nfunction buildItemMap(columns: DashboardColumns): Map<string, PortletItem> {\n const map = new Map<string, PortletItem>();\n for (const col of columns) {\n for (const item of col) map.set(item.id, item);\n }\n return map;\n}\n\nfunction findColumn(colOrder: string[][], itemId: string): number {\n return colOrder.findIndex((ids) => ids.includes(itemId));\n}\n\n/**\n * Move `activeId` into the column named by `overId` (a column id or an item\n * id), inserted before the hovered item. Returns the same reference when no\n * cross-column move is needed.\n */\nexport function moveAcrossColumns(\n order: DashboardOrder,\n activeId: string,\n overId: string\n): DashboardOrder {\n const colIdx = COL_IDS.indexOf(overId as (typeof COL_IDS)[number]);\n const sourceCol = findColumn(order, activeId);\n if (sourceCol === -1) return order;\n\n const targetCol = colIdx !== -1 ? colIdx : findColumn(order, overId);\n if (targetCol === -1 || sourceCol === targetCol) return order;\n\n const next = order.map((col) => [...col]) as DashboardOrder;\n next[sourceCol] = next[sourceCol].filter((id) => id !== activeId);\n const overIdx = colIdx !== -1 ? -1 : next[targetCol].indexOf(overId);\n if (overIdx === -1) {\n next[targetCol].push(activeId);\n } else {\n next[targetCol].splice(overIdx, 0, activeId);\n }\n return next;\n}\n\n/**\n * Final order for a drop. Same-column drags reorder around the hovered\n * item. After a cross-column move, the one position `moveAcrossColumns`\n * already chose — active sitting immediately before the hovered item — is\n * kept (reordering would flip it to the other side of that item), but\n * hovering any other item in the destination column still reorders, so a\n * drag can keep moving after it crosses.\n */\nexport function reorderOnDrop(\n order: DashboardOrder,\n activeId: string,\n overId: string,\n crossedColumns: boolean\n): DashboardOrder {\n const isColumnTarget =\n COL_IDS.indexOf(overId as (typeof COL_IDS)[number]) !== -1;\n if (isColumnTarget || overId === activeId) return order;\n\n const col = findColumn(order, activeId);\n if (col === -1 || findColumn(order, overId) !== col) return order;\n\n const oldIdx = order[col].indexOf(activeId);\n const newIdx = order[col].indexOf(overId);\n if (oldIdx === -1 || newIdx === -1) return order;\n // Immediately-before adjacency after a cross is dragOver's insertion,\n // not a new reorder request.\n if (crossedColumns && newIdx === oldIdx + 1) return order;\n\n const next = order.map((c) => [...c]) as DashboardOrder;\n next[col] = arrayMove(next[col], oldIdx, newIdx);\n return next;\n}\n\n/**\n * Consolidate columns beyond the visible count into the last visible one.\n * Returns the same reference when nothing needs to move so callers can use\n * reference equality to skip persistence/notification.\n */\nexport function consolidateColumns(\n order: DashboardOrder,\n mode: DashboardLayout\n): DashboardOrder {\n if (mode >= 3 || requiredColumns(order) <= mode) return order;\n if (mode === 1) return [[...order[0], ...order[1], ...order[2]], [], []];\n return [[...order[0]], [...order[1], ...order[2]], []];\n}\n\n/**\n * Columns needed to show every item: the highest occupied index + 1, so a\n * gap like `[a], [], [c]` still requires three columns.\n */\nexport function requiredColumns(order: DashboardOrder): DashboardLayout {\n return Math.max(\n 1,\n ...order.map((ids, i) => (ids.length > 0 ? i + 1 : 0))\n ) as DashboardLayout;\n}\n\n/**\n * pointerWithin first (drops into empty columns), then closestCenter for\n * items, then rectIntersection for columns.\n */\nconst collisionDetection: CollisionDetection = (args) => {\n const pw = pointerWithin(args);\n if (pw.length > 0) return pw;\n const cc = closestCenter(args);\n if (cc.length > 0) return cc;\n return rectIntersection(args);\n};\n\n// =============================================================================\n// SortablePortlet\n// =============================================================================\n\nfunction SortablePortlet({\n id,\n handleSelector,\n children,\n}: {\n id: string;\n handleSelector: string;\n children: React.ReactNode;\n}) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id });\n\n const wrapperRef = React.useRef<HTMLDivElement>(null);\n const [headerEl, setHeaderEl] = React.useState<HTMLElement | null>(null);\n const [searched, setSearched] = React.useState(false);\n\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.4 : 1,\n };\n\n // Portlet content can render asynchronously, so watch for the header with\n // a MutationObserver (rAF-coalesced) and disconnect once found.\n React.useEffect(() => {\n const container = wrapperRef.current;\n if (!container) return;\n\n let rafId = 0;\n\n const findHeader = () => {\n const header = container.querySelector(handleSelector);\n if (header instanceof HTMLElement) {\n header.classList.add(...HEADER_LAYOUT_CLASSES);\n setHeaderEl(header);\n observer.disconnect();\n } else {\n setHeaderEl(null);\n }\n setSearched(true);\n };\n\n const observer = new MutationObserver(() => {\n cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(findHeader);\n });\n\n findHeader();\n observer.observe(container, { childList: true, subtree: true });\n\n return () => {\n cancelAnimationFrame(rafId);\n observer.disconnect();\n };\n }, [handleSelector]);\n\n const handle = (\n <button\n type=\"button\"\n className={cn(\n 'inline-flex h-7 w-6 shrink-0 cursor-grab touch-none items-center justify-center rounded border-none bg-transparent',\n 'text-muted-foreground hover:bg-muted hover:text-foreground active:cursor-grabbing',\n 'opacity-40 transition-opacity group-hover/portlet:opacity-100 focus-visible:opacity-100',\n '[@media(hover:none)]:opacity-100',\n !headerEl && 'bg-card/80 absolute end-2 top-2 z-10 shadow-sm'\n )}\n aria-label=\"Drag to reorder\"\n {...attributes}\n {...listeners}\n >\n <GripVertical aria-hidden=\"true\" className=\"h-4 w-4\" />\n </button>\n );\n\n return (\n <div\n ref={(node) => {\n setNodeRef(node);\n wrapperRef.current = node;\n }}\n style={style}\n className=\"group/portlet relative min-w-0\"\n >\n <div className=\"w-full min-w-0\">{children}</div>\n {headerEl ? createPortal(handle, headerEl) : searched ? handle : null}\n </div>\n );\n}\n\n// =============================================================================\n// DroppableColumn\n// =============================================================================\n\nfunction DroppableColumn({\n id,\n items,\n columnIndex,\n handleSelector,\n flatten,\n dragActive,\n}: {\n id: string;\n items: PortletItem[];\n columnIndex: number;\n handleSelector: string;\n flatten: boolean;\n dragActive: boolean;\n}) {\n const { setNodeRef, isOver } = useDroppable({ id });\n const ids = items.map((p) => p.id);\n\n return (\n <SortableContext items={ids} strategy={verticalListSortingStrategy}>\n <div\n ref={setNodeRef}\n className={cn(\n 'flex min-h-16 min-w-0 flex-col gap-3',\n flatten && 'max-lg:contents'\n )}\n role=\"group\"\n aria-label={`Dashboard column ${columnIndex + 1}`}\n >\n {items.map((item) => (\n <SortablePortlet\n key={item.id}\n id={item.id}\n handleSelector={handleSelector}\n >\n {item.node}\n </SortablePortlet>\n ))}\n {items.length === 0 && dragActive && (\n <div\n aria-hidden=\"true\"\n className={cn(\n 'border-border text-muted-foreground flex min-h-32 items-center justify-center rounded-lg border-2 border-dashed text-sm font-medium transition-colors',\n isOver && 'border-primary-500 bg-primary-500/10 text-primary-600'\n )}\n >\n Drop here\n </div>\n )}\n </div>\n </SortableContext>\n );\n}\n\n// =============================================================================\n// CustomizableDashboard\n// =============================================================================\n\n/**\n * A user-customizable portlet dashboard: a responsive 1–3 column grid whose\n * items can be dragged between and within columns, with a column-layout\n * toggle and optional persistence.\n *\n * Each portlet's drag handle is appended to the header element matched by\n * `dragHandleSelector` inside its content — `DashboardWidget` headers are\n * matched by default. Portlets without a matching header get a floating\n * handle in their top end corner.\n *\n * Order and layout are persisted to localStorage when `storageKey` is set,\n * or can be controlled via `order`/`onOrderChange` and\n * `layout`/`onLayoutChange` for server-side persistence.\n *\n * Passing a `widgets` catalog adds a toolbar Customize button opening a\n * `DashboardCustomizePanel` where users show/hide widgets and reset the\n * layout; visibility follows the same persistence rules via\n * `hiddenIds`/`onHiddenChange`.\n *\n * @example\n * ```tsx\n * <CustomizableDashboard\n * storageKey=\"home\"\n * columns={[\n * [{ id: 'stats', node: <StatsWidget /> }],\n * [{ id: 'tasks', node: <TasksWidget /> }],\n * [{ id: 'orders', node: <OrdersWidget /> }],\n * ]}\n * />\n * ```\n */\nexport const CustomizableDashboard = React.forwardRef<\n HTMLDivElement,\n CustomizableDashboardProps\n>(function CustomizableDashboard(\n {\n columns,\n title,\n storageKey,\n ariaLabel,\n toolbarSlot,\n defaultOrder,\n order: controlledOrder,\n onOrderChange,\n defaultLayout = 3,\n layout: controlledLayout,\n onLayoutChange,\n dragHandleSelector = DEFAULT_HANDLE_SELECTOR,\n widgets,\n defaultHiddenIds,\n hiddenIds: controlledHidden,\n onHiddenChange,\n customizeLabel = 'Customize',\n className,\n },\n ref\n) {\n const itemMap = React.useMemo(() => buildItemMap(columns), [columns]);\n\n // Initial state ignores persistence so the first client render matches SSR;\n // saved values are restored in a mount effect below.\n const [internalLayout, setInternalLayout] =\n React.useState<DashboardLayout>(defaultLayout);\n const layoutMode = controlledLayout ?? internalLayout;\n\n const [colOrder, setColOrder] = React.useState<DashboardOrder>(() =>\n consolidateColumns(\n mergeColumnOrder(columns, controlledOrder ?? defaultOrder ?? null),\n controlledLayout ?? defaultLayout\n )\n );\n const [activeId, setActiveId] = React.useState<string | null>(null);\n\n const [internalHidden, setInternalHidden] = React.useState<string[]>(\n () => defaultHiddenIds ?? []\n );\n const hiddenList = controlledHidden ?? internalHidden;\n const hiddenSet = React.useMemo(() => new Set(hiddenList), [hiddenList]);\n const [panelOpen, setPanelOpen] = React.useState(false);\n\n const prevColOrder = React.useRef(colOrder);\n const layoutModeRef = React.useRef(layoutMode);\n layoutModeRef.current = layoutMode;\n const colOrderRef = React.useRef(colOrder);\n colOrderRef.current = colOrder;\n const columnsRef = React.useRef(columns);\n columnsRef.current = columns;\n const draggingRef = React.useRef(false);\n\n // Restore persisted layout/order/visibility after mount (uncontrolled\n // concerns only) so the first client render matches SSR.\n React.useEffect(() => {\n if (!storageKey) return;\n if (controlledLayout === undefined) {\n const savedLayout = loadLayout(storageKey);\n if (savedLayout !== null) setInternalLayout(savedLayout);\n }\n if (controlledOrder === undefined) {\n const savedOrder = loadOrder(storageKey);\n if (savedOrder) {\n setColOrder(mergeColumnOrder(columnsRef.current, savedOrder));\n }\n }\n if (controlledHidden === undefined) {\n const savedHidden = loadHidden(storageKey);\n if (savedHidden) setInternalHidden(savedHidden);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- mount-only restore\n }, [storageKey]);\n\n // Sync controlled order and newly added/removed items while not dragging,\n // consolidating into the effective layout so portlets in columns beyond the\n // visible count (e.g. mounting with `defaultLayout` 1/2, or a restored or\n // controlled layout) are never sliced off the render.\n React.useEffect(() => {\n if (draggingRef.current) return;\n setColOrder((prev) => {\n const next = consolidateColumns(\n mergeColumnOrder(columns, controlledOrder ?? prev),\n layoutMode\n );\n return JSON.stringify(next) === JSON.stringify(prev) ? prev : next;\n });\n }, [columns, controlledOrder, layoutMode]);\n\n const setLayout = React.useCallback(\n (mode: DashboardLayout) => {\n if (controlledLayout === undefined) setInternalLayout(mode);\n saveLayout(storageKey, mode);\n onLayoutChange?.(mode);\n },\n [controlledLayout, storageKey, onLayoutChange]\n );\n\n const commitOrder = React.useCallback(\n (next: DashboardOrder) => {\n saveOrder(storageKey, next);\n onOrderChange?.(next);\n\n // Auto-shrink only when trailing columns are empty (gaps keep their\n // column so no item is hidden by a reduced layout)\n const occupied = requiredColumns(next);\n if (occupied < layoutModeRef.current) {\n setLayout(occupied);\n }\n },\n [storageKey, onOrderChange, setLayout]\n );\n\n const handleLayoutChange = React.useCallback(\n (mode: DashboardLayout) => {\n setLayout(mode);\n // Consolidate so droppable ids match visible columns; persist/notify\n // outside the state updater so replayed renders can't double-fire.\n const next = consolidateColumns(colOrderRef.current, mode);\n if (next !== colOrderRef.current) {\n setColOrder(next);\n saveOrder(storageKey, next);\n onOrderChange?.(next);\n }\n },\n [setLayout, storageKey, onOrderChange]\n );\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates })\n );\n\n const resolve = (ids: string[]): PortletItem[] =>\n ids\n .filter((id) => !hiddenSet.has(id))\n .map((id) => itemMap.get(id))\n .filter(Boolean) as PortletItem[];\n\n const handleDragStart = React.useCallback(\n (event: DragStartEvent) => {\n prevColOrder.current = colOrder;\n draggingRef.current = true;\n setActiveId(String(event.active.id));\n },\n [colOrder]\n );\n\n const handleDragOver = React.useCallback((event: DragOverEvent) => {\n const { active, over } = event;\n if (!over) return;\n const next = moveAcrossColumns(\n colOrderRef.current,\n String(active.id),\n String(over.id)\n );\n if (next !== colOrderRef.current) setColOrder(next);\n }, []);\n\n const handleDragEnd = React.useCallback(\n (event: DragEndEvent) => {\n const { active, over } = event;\n draggingRef.current = false;\n setActiveId(null);\n\n if (!over) {\n setColOrder(prevColOrder.current);\n return;\n }\n\n const activeItemId = String(active.id);\n // A drag that ends in a different column than it started already sits\n // where moveAcrossColumns placed it; reordering again would flip it\n // to the other side of the hovered item.\n const crossedColumns =\n findColumn(prevColOrder.current, activeItemId) !==\n findColumn(colOrderRef.current, activeItemId);\n const next = reorderOnDrop(\n colOrderRef.current,\n activeItemId,\n String(over.id),\n crossedColumns\n );\n if (next !== colOrderRef.current) setColOrder(next);\n // A drag that ends where it started is a no-op: skip the commit so it\n // can't write storage, notify hosts, or auto-shrink the layout.\n if (JSON.stringify(next) !== JSON.stringify(prevColOrder.current)) {\n commitOrder(next);\n }\n },\n [commitOrder]\n );\n\n const handleDragCancel = React.useCallback(() => {\n draggingRef.current = false;\n setActiveId(null);\n setColOrder(prevColOrder.current);\n }, []);\n\n const setHidden = React.useCallback(\n (ids: string[]) => {\n if (controlledHidden === undefined) setInternalHidden(ids);\n saveHidden(storageKey, ids);\n onHiddenChange?.(ids);\n },\n [controlledHidden, storageKey, onHiddenChange]\n );\n\n const handleToggleWidget = React.useCallback(\n (id: string, visible: boolean) => {\n setHidden(\n visible ? hiddenList.filter((h) => h !== id) : [...hiddenList, id]\n );\n },\n [hiddenList, setHidden]\n );\n\n const handleReset = React.useCallback(() => {\n if (storageKey) {\n try {\n localStorage.removeItem(orderStorageKey(storageKey));\n localStorage.removeItem(layoutStorageKey(storageKey));\n localStorage.removeItem(hiddenStorageKey(storageKey));\n } catch {\n /* storage unavailable */\n }\n }\n const next = mergeColumnOrder(columns, defaultOrder ?? null);\n setColOrder(next);\n onOrderChange?.(next);\n if (controlledLayout === undefined) setInternalLayout(defaultLayout);\n onLayoutChange?.(defaultLayout);\n const hidden = defaultHiddenIds ?? [];\n if (controlledHidden === undefined) setInternalHidden(hidden);\n onHiddenChange?.(hidden);\n }, [\n storageKey,\n columns,\n defaultOrder,\n onOrderChange,\n controlledLayout,\n defaultLayout,\n onLayoutChange,\n defaultHiddenIds,\n controlledHidden,\n onHiddenChange,\n ]);\n\n const cols: DashboardColumns = [\n resolve(colOrder[0]),\n resolve(colOrder[1]),\n resolve(colOrder[2]),\n ];\n\n const visibleCols =\n layoutMode === 1 ? [cols[0]] : layoutMode === 2 ? [cols[0], cols[1]] : cols;\n\n const toolbar = (\n <div className=\"flex items-center justify-end gap-3 pb-2\">\n {title && (\n <h2 className=\"text-foreground me-auto text-lg font-semibold\">\n {title}\n </h2>\n )}\n {widgets && widgets.length > 0 && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setPanelOpen(true)}\n aria-haspopup=\"dialog\"\n leftIcon={\n <SlidersHorizontal aria-hidden=\"true\" className=\"h-4 w-4\" />\n }\n >\n {customizeLabel}\n </Button>\n )}\n <div\n className=\"border-border bg-muted flex gap-0.5 rounded-md border p-0.5 max-md:hidden\"\n role=\"radiogroup\"\n aria-label=\"Column layout\"\n >\n {([3, 2, 1] as const).map((mode) => {\n const Icon = mode === 3 ? Columns3 : mode === 2 ? Columns2 : Square;\n return (\n <button\n key={mode}\n type=\"button\"\n className={cn(\n 'flex h-7 w-7 items-center justify-center rounded transition-colors',\n layoutMode === mode\n ? 'bg-background text-foreground shadow-sm'\n : 'text-muted-foreground hover:bg-background hover:text-foreground'\n )}\n onClick={() => handleLayoutChange(mode)}\n role=\"radio\"\n aria-checked={layoutMode === mode}\n aria-label={`${mode} column layout`}\n title={`${mode} column${mode > 1 ? 's' : ''}`}\n >\n <Icon aria-hidden=\"true\" className=\"h-4 w-4\" />\n </button>\n );\n })}\n </div>\n </div>\n );\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={collisionDetection}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n >\n {toolbarSlot ? createPortal(toolbar, toolbarSlot) : toolbar}\n <div\n ref={ref}\n className={cn(\n 'grid items-start gap-3',\n layoutMode === 3 && 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3',\n layoutMode === 2 && 'grid-cols-1 md:grid-cols-2',\n layoutMode === 1 && 'grid-cols-1',\n className\n )}\n role=\"region\"\n aria-label={ariaLabel ?? 'Dashboard'}\n >\n {visibleCols.map((col, i) => (\n <DroppableColumn\n key={COL_IDS[i]}\n id={COL_IDS[i]}\n items={col}\n columnIndex={i}\n handleSelector={dragHandleSelector}\n flatten={layoutMode === 3}\n dragActive={activeId !== null}\n />\n ))}\n </div>\n {widgets && widgets.length > 0 && (\n <DashboardCustomizePanel\n open={panelOpen}\n onOpenChange={setPanelOpen}\n widgets={widgets}\n hiddenIds={hiddenList}\n onToggleWidget={handleToggleWidget}\n onReset={handleReset}\n />\n )}\n </DndContext>\n );\n});\n"]}
|
|
@@ -1,6 +1,26 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var React = require('react');
|
|
4
|
+
|
|
5
|
+
function _interopNamespace(e) {
|
|
6
|
+
if (e && e.__esModule) return e;
|
|
7
|
+
var n = Object.create(null);
|
|
8
|
+
if (e) {
|
|
9
|
+
Object.keys(e).forEach(function (k) {
|
|
10
|
+
if (k !== 'default') {
|
|
11
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
12
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () { return e[k]; }
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
n.default = e;
|
|
20
|
+
return Object.freeze(n);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
4
24
|
|
|
5
25
|
// src/hooks/useDirection.ts
|
|
6
26
|
var RTL_LOCALES = ["ar", "he", "fa", "ur"];
|
|
@@ -14,10 +34,10 @@ function resolveDirection(element) {
|
|
|
14
34
|
return getComputedStyle(target).direction === "rtl" ? "rtl" : "ltr";
|
|
15
35
|
}
|
|
16
36
|
function useDirection(elementRef) {
|
|
17
|
-
const [direction, setDirection] =
|
|
37
|
+
const [direction, setDirection] = React.useState(
|
|
18
38
|
() => resolveDirection(elementRef?.current)
|
|
19
39
|
);
|
|
20
|
-
|
|
40
|
+
React.useEffect(() => {
|
|
21
41
|
const update = () => setDirection(resolveDirection(elementRef?.current));
|
|
22
42
|
update();
|
|
23
43
|
const observer = new MutationObserver(update);
|
|
@@ -29,7 +49,7 @@ function useDirection(elementRef) {
|
|
|
29
49
|
return () => observer.disconnect();
|
|
30
50
|
}, [elementRef]);
|
|
31
51
|
const currentElement = elementRef?.current ?? null;
|
|
32
|
-
|
|
52
|
+
React.useEffect(() => {
|
|
33
53
|
setDirection(resolveDirection(currentElement));
|
|
34
54
|
}, [currentElement]);
|
|
35
55
|
return direction;
|
|
@@ -42,8 +62,8 @@ var KEYBOARD_SOURCE_ATTRIBUTE = "data-keyboard-source";
|
|
|
42
62
|
var CLOSED = { keyboardInset: 0, isKeyboardOpen: false };
|
|
43
63
|
function useKeyboardInset(options = {}) {
|
|
44
64
|
const { enabled = true, source = "visual-viewport" } = options;
|
|
45
|
-
const [state, setState] =
|
|
46
|
-
|
|
65
|
+
const [state, setState] = React.useState(CLOSED);
|
|
66
|
+
React.useEffect(() => {
|
|
47
67
|
if (!enabled || typeof window === "undefined") return;
|
|
48
68
|
const root = document.documentElement;
|
|
49
69
|
const publish = (keyboardInset) => {
|
|
@@ -128,7 +148,7 @@ function useKeyboardShortcut(key, callback, options = {}) {
|
|
|
128
148
|
stopPropagation = false,
|
|
129
149
|
ignoreInputs = true
|
|
130
150
|
} = options;
|
|
131
|
-
const handleKeyDown =
|
|
151
|
+
const handleKeyDown = React.useCallback(
|
|
132
152
|
(event) => {
|
|
133
153
|
if (ignoreInputs) {
|
|
134
154
|
const target = event.target;
|
|
@@ -159,7 +179,7 @@ function useKeyboardShortcut(key, callback, options = {}) {
|
|
|
159
179
|
},
|
|
160
180
|
[key, callback, modifiers, preventDefault, stopPropagation, ignoreInputs]
|
|
161
181
|
);
|
|
162
|
-
|
|
182
|
+
React.useEffect(() => {
|
|
163
183
|
if (!enabled) return;
|
|
164
184
|
document.addEventListener("keydown", handleKeyDown);
|
|
165
185
|
return () => document.removeEventListener("keydown", handleKeyDown);
|
|
@@ -174,11 +194,11 @@ function useCommandK(callback, enabled = true) {
|
|
|
174
194
|
});
|
|
175
195
|
}
|
|
176
196
|
function useMediaQuery(query) {
|
|
177
|
-
const [matches, setMatches] =
|
|
197
|
+
const [matches, setMatches] = React.useState(() => {
|
|
178
198
|
if (typeof window === "undefined") return false;
|
|
179
199
|
return window.matchMedia(query).matches;
|
|
180
200
|
});
|
|
181
|
-
|
|
201
|
+
React.useEffect(() => {
|
|
182
202
|
if (typeof window === "undefined") return;
|
|
183
203
|
const mediaQuery = window.matchMedia(query);
|
|
184
204
|
setMatches(mediaQuery.matches);
|
|
@@ -212,6 +232,101 @@ function useIsLargeDesktop() {
|
|
|
212
232
|
function useIsMobileOrTablet() {
|
|
213
233
|
return useMediaQuery("(max-width: 1023px)");
|
|
214
234
|
}
|
|
235
|
+
function mergeOrder(saved, ids) {
|
|
236
|
+
if (!saved) return ids;
|
|
237
|
+
const known = new Set(ids);
|
|
238
|
+
const kept = [...new Set(saved)].filter((id) => known.has(id));
|
|
239
|
+
const keptSet = new Set(kept);
|
|
240
|
+
return [...kept, ...ids.filter((id) => !keptSet.has(id))];
|
|
241
|
+
}
|
|
242
|
+
function useOrderPersistence(ids, { load, save, debounceMs = 500, onError }) {
|
|
243
|
+
const [saved, setSaved] = React__namespace.useState(null);
|
|
244
|
+
const callbacks = React__namespace.useRef({ load, save, onError });
|
|
245
|
+
callbacks.current = { load, save, onError };
|
|
246
|
+
const pending = React__namespace.useRef(null);
|
|
247
|
+
const timer = React__namespace.useRef(
|
|
248
|
+
void 0
|
|
249
|
+
);
|
|
250
|
+
const touched = React__namespace.useRef(false);
|
|
251
|
+
const saving = React__namespace.useRef(0);
|
|
252
|
+
const lastStarted = React__namespace.useRef(null);
|
|
253
|
+
const overlapped = React__namespace.useRef(false);
|
|
254
|
+
const flush = React__namespace.useCallback(function flushPending(force = false) {
|
|
255
|
+
clearTimeout(timer.current);
|
|
256
|
+
const next = pending.current;
|
|
257
|
+
if (!next || saving.current > 0 && !force) return;
|
|
258
|
+
pending.current = null;
|
|
259
|
+
if (saving.current > 0) overlapped.current = true;
|
|
260
|
+
saving.current += 1;
|
|
261
|
+
lastStarted.current = next;
|
|
262
|
+
const { save: run, onError: fail } = callbacks.current;
|
|
263
|
+
let result;
|
|
264
|
+
try {
|
|
265
|
+
result = run(next);
|
|
266
|
+
} catch (e) {
|
|
267
|
+
result = Promise.reject(e);
|
|
268
|
+
}
|
|
269
|
+
void Promise.resolve(result).catch((e) => fail?.(e)).finally(() => {
|
|
270
|
+
saving.current -= 1;
|
|
271
|
+
if (saving.current > 0) return;
|
|
272
|
+
if (overlapped.current) {
|
|
273
|
+
overlapped.current = false;
|
|
274
|
+
pending.current ??= lastStarted.current;
|
|
275
|
+
}
|
|
276
|
+
flushPending();
|
|
277
|
+
});
|
|
278
|
+
}, []);
|
|
279
|
+
React__namespace.useEffect(() => {
|
|
280
|
+
let active = true;
|
|
281
|
+
const { load: read, onError: fail } = callbacks.current;
|
|
282
|
+
Promise.resolve().then(read).then((value) => {
|
|
283
|
+
if (active && value && !touched.current) setSaved(value);
|
|
284
|
+
}).catch((e) => fail?.(e));
|
|
285
|
+
return () => {
|
|
286
|
+
active = false;
|
|
287
|
+
flush();
|
|
288
|
+
};
|
|
289
|
+
}, [flush]);
|
|
290
|
+
React__namespace.useEffect(() => {
|
|
291
|
+
const onPageHide = () => flush(true);
|
|
292
|
+
window.addEventListener("pagehide", onPageHide);
|
|
293
|
+
return () => window.removeEventListener("pagehide", onPageHide);
|
|
294
|
+
}, [flush]);
|
|
295
|
+
const setOrder = React__namespace.useCallback(
|
|
296
|
+
(next) => {
|
|
297
|
+
touched.current = true;
|
|
298
|
+
setSaved(next);
|
|
299
|
+
pending.current = next;
|
|
300
|
+
clearTimeout(timer.current);
|
|
301
|
+
timer.current = setTimeout(flush, debounceMs);
|
|
302
|
+
},
|
|
303
|
+
[debounceMs, flush]
|
|
304
|
+
);
|
|
305
|
+
const order = React__namespace.useMemo(() => mergeOrder(saved, ids), [saved, ids]);
|
|
306
|
+
return { order, setOrder };
|
|
307
|
+
}
|
|
308
|
+
function localStorageOrderAdapter(key) {
|
|
309
|
+
return {
|
|
310
|
+
load: () => {
|
|
311
|
+
try {
|
|
312
|
+
if (typeof window === "undefined") return null;
|
|
313
|
+
const raw = JSON.parse(
|
|
314
|
+
window.localStorage.getItem(key) ?? "null"
|
|
315
|
+
);
|
|
316
|
+
return Array.isArray(raw) && raw.every((v) => typeof v === "string") ? raw : null;
|
|
317
|
+
} catch {
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
},
|
|
321
|
+
save: (order) => {
|
|
322
|
+
try {
|
|
323
|
+
if (typeof window !== "undefined")
|
|
324
|
+
window.localStorage.setItem(key, JSON.stringify(order));
|
|
325
|
+
} catch {
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
};
|
|
329
|
+
}
|
|
215
330
|
|
|
216
331
|
exports.KEYBOARD_INSET_VAR = KEYBOARD_INSET_VAR;
|
|
217
332
|
exports.KEYBOARD_OPEN_ATTRIBUTE = KEYBOARD_OPEN_ATTRIBUTE;
|
|
@@ -220,6 +335,8 @@ exports.RTL_LOCALES = RTL_LOCALES;
|
|
|
220
335
|
exports.VISUAL_VIEWPORT_HEIGHT_VAR = VISUAL_VIEWPORT_HEIGHT_VAR;
|
|
221
336
|
exports.VISUAL_VIEWPORT_OFFSET_TOP_VAR = VISUAL_VIEWPORT_OFFSET_TOP_VAR;
|
|
222
337
|
exports.isRtlLocale = isRtlLocale;
|
|
338
|
+
exports.localStorageOrderAdapter = localStorageOrderAdapter;
|
|
339
|
+
exports.mergeOrder = mergeOrder;
|
|
223
340
|
exports.useCommandK = useCommandK;
|
|
224
341
|
exports.useDirection = useDirection;
|
|
225
342
|
exports.useIsDesktop = useIsDesktop;
|
|
@@ -231,5 +348,6 @@ exports.useIsTablet = useIsTablet;
|
|
|
231
348
|
exports.useKeyboardInset = useKeyboardInset;
|
|
232
349
|
exports.useKeyboardShortcut = useKeyboardShortcut;
|
|
233
350
|
exports.useMediaQuery = useMediaQuery;
|
|
234
|
-
|
|
235
|
-
//# sourceMappingURL=chunk-
|
|
351
|
+
exports.useOrderPersistence = useOrderPersistence;
|
|
352
|
+
//# sourceMappingURL=chunk-TVU4KB27.cjs.map
|
|
353
|
+
//# sourceMappingURL=chunk-TVU4KB27.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useDirection.ts","../src/hooks/useKeyboardInset.ts","../src/hooks/useKeyboardShortcut.ts","../src/hooks/useMediaQuery.ts","../src/hooks/useOrderPersistence.ts"],"names":["useState","useEffect","useCallback","React"],"mappings":"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","file":"chunk-TVU4KB27.cjs","sourcesContent":["import { useState, useEffect } from 'react';\nimport type { RefObject } from 'react';\n\nexport type Direction = 'ltr' | 'rtl';\n\n/** Locales whose primary script reads right-to-left. */\nexport const RTL_LOCALES = ['ar', 'he', 'fa', 'ur'] as const;\n\n/**\n * Returns true when the given locale (e.g. `ar`, `ar-SA`, `he_IL`) uses a\n * right-to-left script.\n */\nexport function isRtlLocale(locale: string): boolean {\n const lang = locale.toLowerCase().split(/[-_]/)[0];\n return (RTL_LOCALES as readonly string[]).includes(lang);\n}\n\nfunction resolveDirection(element?: HTMLElement | null): Direction {\n if (typeof document === 'undefined') return 'ltr';\n const target = element ?? document.documentElement;\n return getComputedStyle(target).direction === 'rtl' ? 'rtl' : 'ltr';\n}\n\n/**\n * Hook returning the effective text direction (`ltr` | `rtl`) inherited from\n * the nearest `dir` attribute — zero setup for consumers who set\n * `<html dir=\"rtl\">`.\n *\n * Use for JS-level direction logic that CSS logical properties can't cover:\n * inverting ArrowLeft/ArrowRight keyboard handling, popover/toast placement,\n * drag math, etc.\n *\n * @param elementRef - Optional ref; when provided, direction is resolved from\n * that element (respecting any local `dir` override) instead of `<html>`.\n *\n * @example\n * ```tsx\n * const direction = useDirection();\n * const nextKey = direction === 'rtl' ? 'ArrowLeft' : 'ArrowRight';\n * ```\n */\nexport function useDirection(\n elementRef?: RefObject<HTMLElement | null>\n): Direction {\n const [direction, setDirection] = useState<Direction>(() =>\n resolveDirection(elementRef?.current)\n );\n\n useEffect(() => {\n const update = () => setDirection(resolveDirection(elementRef?.current));\n update();\n // dir changes are rare; observing the whole tree for just this attribute is cheap.\n const observer = new MutationObserver(update);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['dir'],\n subtree: true,\n });\n return () => observer.disconnect();\n }, [elementRef]);\n\n // Re-sync when a re-render points elementRef.current at a different node:\n // the MutationObserver only fires on `dir` attribute mutations, so a swapped\n // ref target with a different inherited direction would otherwise go stale.\n const currentElement = elementRef?.current ?? null;\n useEffect(() => {\n setDirection(resolveDirection(currentElement));\n }, [currentElement]);\n\n return direction;\n}\n","import { useEffect, useState } from 'react';\n\n/** CSS custom properties written to `<html>` while the hook is mounted. */\nexport const KEYBOARD_INSET_VAR = '--mieweb-keyboard-inset';\nexport const VISUAL_VIEWPORT_HEIGHT_VAR = '--mieweb-visual-viewport-height';\nexport const VISUAL_VIEWPORT_OFFSET_TOP_VAR =\n '--mieweb-visual-viewport-offset-top';\n/** Boolean attribute set on `<html>` while an on-screen keyboard is open. */\nexport const KEYBOARD_OPEN_ATTRIBUTE = 'data-keyboard-open';\n/** Attribute on `<html>` naming the active {@link KeyboardInsetSource}. */\nexport const KEYBOARD_SOURCE_ATTRIBUTE = 'data-keyboard-source';\n\n/**\n * Where keyboard metrics come from.\n *\n * - `'visual-viewport'` — the Visual Viewport API. Works in any browser, but\n * iOS only reports the keyboard once its slide-in animation has finished.\n * - `'native'` — `keyboardWillShow` / `keyboardWillHide` window events with a\n * `keyboardHeight` property, as fired by `cordova-plugin-ionic-keyboard` and\n * Capacitor's Keyboard plugin. They arrive *before* the keyboard animates,\n * so layout can move in step with it.\n */\nexport type KeyboardInsetSource = 'visual-viewport' | 'native';\n\nexport interface KeyboardInsetState {\n /** Pixels of the layout viewport covered by the on-screen keyboard. */\n keyboardInset: number;\n /** Whether an on-screen keyboard currently covers part of the page. */\n isKeyboardOpen: boolean;\n}\n\nexport interface UseKeyboardInsetOptions {\n /** Track the keyboard; `false` stops tracking and clears the CSS variables. @default true */\n enabled?: boolean;\n /** Where keyboard metrics come from. @default 'visual-viewport' */\n source?: KeyboardInsetSource;\n}\n\ninterface NativeKeyboardEvent extends Event {\n keyboardHeight?: number;\n}\n\nconst CLOSED: KeyboardInsetState = { keyboardInset: 0, isKeyboardOpen: false };\n\n/**\n * Tracks the on-screen keyboard and publishes it on `<html>`.\n *\n * ### `source: 'native'` (Cordova / Capacitor apps)\n *\n * Listens for the native keyboard plugin's `keyboardWillShow` /\n * `keyboardWillHide` window events. Configure the plugin so the WebView is\n * neither resized nor panned (for `cordova-plugin-ionic-keyboard`:\n * `KeyboardResize=false`), keep the app shell at full height, and move only\n * the composer dock by `--mieweb-keyboard-inset` with a short transition\n * (~250ms) so it rides up with the keyboard. Only `--mieweb-keyboard-inset`,\n * `data-keyboard-open` and `data-keyboard-source` are published; the\n * visual-viewport variables stay unset.\n *\n * ### `source: 'visual-viewport'` (browsers, default)\n *\n * Uses the Visual Viewport API.\n *\n * iOS Safari and WKWebView (Cordova) ignore\n * `interactive-widget=resizes-content`, and `dvh` does not shrink for the\n * keyboard: the page keeps its full height and iOS pans the visual viewport\n * to reveal the focused input, pushing headers off-screen. This hook\n * measures what is actually visible and publishes it on `<html>` so an app\n * shell can follow the visible area instead:\n *\n * - `--mieweb-keyboard-inset` — keyboard height in px (0 when closed)\n * - `--mieweb-visual-viewport-height` — visible height in px\n * - `--mieweb-visual-viewport-offset-top` — how far iOS panned the page\n * - `data-keyboard-open` — present while the keyboard is open\n *\n * On browsers that already resize the layout for the keyboard (Chrome on\n * Android with `interactive-widget=resizes-content`) the inset stays 0 and\n * the variables simply mirror the layout viewport.\n *\n * iOS reports the visual viewport only after the keyboard has finished\n * animating, so a shell sized this way snaps into place once the keyboard\n * lands. Prefer `source: 'native'` wherever a native keyboard plugin exists.\n *\n * Mount it once, near the app root.\n *\n * @example\n * ```tsx\n * function AppShell({ children }) {\n * useKeyboardInset();\n * return (\n * <div\n * style={{\n * height: 'var(--mieweb-visual-viewport-height, 100dvh)',\n * transform: 'translateY(var(--mieweb-visual-viewport-offset-top, 0px))',\n * }}\n * >\n * {children}\n * </div>\n * );\n * }\n * ```\n *\n * @example Native app (keyboard plugin with WebView resizing disabled)\n * ```tsx\n * function ComposerDock({ children }) {\n * useKeyboardInset({ source: 'native' });\n * return (\n * <div\n * style={{\n * paddingBottom: 'calc(var(--mieweb-keyboard-inset, 0px) + 0.5rem)',\n * transition: 'padding-bottom 250ms ease',\n * }}\n * >\n * {children}\n * </div>\n * );\n * }\n * ```\n */\nexport function useKeyboardInset(\n options: UseKeyboardInsetOptions = {}\n): KeyboardInsetState {\n const { enabled = true, source = 'visual-viewport' } = options;\n const [state, setState] = useState<KeyboardInsetState>(CLOSED);\n\n useEffect(() => {\n if (!enabled || typeof window === 'undefined') return;\n const root = document.documentElement;\n\n const publish = (keyboardInset: number) => {\n const isKeyboardOpen = keyboardInset > 0;\n root.style.setProperty(KEYBOARD_INSET_VAR, `${keyboardInset}px`);\n root.toggleAttribute(KEYBOARD_OPEN_ATTRIBUTE, isKeyboardOpen);\n setState((previous) =>\n previous.keyboardInset === keyboardInset\n ? previous\n : { keyboardInset, isKeyboardOpen }\n );\n };\n\n const clear = () => {\n root.style.removeProperty(KEYBOARD_INSET_VAR);\n root.style.removeProperty(VISUAL_VIEWPORT_HEIGHT_VAR);\n root.style.removeProperty(VISUAL_VIEWPORT_OFFSET_TOP_VAR);\n root.removeAttribute(KEYBOARD_OPEN_ATTRIBUTE);\n root.removeAttribute(KEYBOARD_SOURCE_ATTRIBUTE);\n setState(CLOSED);\n };\n\n if (source === 'native') {\n const handleWillShow = (event: Event) => {\n publish(\n Math.max(\n 0,\n Math.round((event as NativeKeyboardEvent).keyboardHeight ?? 0)\n )\n );\n };\n const handleWillHide = () => publish(0);\n\n root.setAttribute(KEYBOARD_SOURCE_ATTRIBUTE, source);\n publish(0);\n window.addEventListener('keyboardWillShow', handleWillShow);\n window.addEventListener('keyboardWillHide', handleWillHide);\n\n return () => {\n window.removeEventListener('keyboardWillShow', handleWillShow);\n window.removeEventListener('keyboardWillHide', handleWillHide);\n clear();\n };\n }\n\n const viewport = window.visualViewport;\n if (!viewport) return;\n\n let frame = 0;\n\n const measure = () => {\n frame = 0;\n // Pinch-zoom shrinks the visual viewport too; that is not a keyboard.\n const zoomed = Math.abs(viewport.scale - 1) > 0.01;\n const keyboardInset = zoomed\n ? 0\n : Math.max(\n 0,\n Math.round(\n window.innerHeight - viewport.height - viewport.offsetTop\n )\n );\n\n root.style.setProperty(\n VISUAL_VIEWPORT_HEIGHT_VAR,\n `${zoomed ? window.innerHeight : Math.round(viewport.height)}px`\n );\n root.style.setProperty(\n VISUAL_VIEWPORT_OFFSET_TOP_VAR,\n `${zoomed ? 0 : Math.round(viewport.offsetTop)}px`\n );\n publish(keyboardInset);\n };\n\n // Coalesce the resize + scroll bursts iOS fires while the keyboard\n // animates into one write per frame.\n const schedule = () => {\n if (frame === 0) frame = requestAnimationFrame(measure);\n };\n\n root.setAttribute(KEYBOARD_SOURCE_ATTRIBUTE, source);\n measure();\n viewport.addEventListener('resize', schedule);\n viewport.addEventListener('scroll', schedule);\n\n return () => {\n cancelAnimationFrame(frame);\n viewport.removeEventListener('resize', schedule);\n viewport.removeEventListener('scroll', schedule);\n clear();\n };\n }, [enabled, source]);\n\n return state;\n}\n","import { useEffect, useCallback } from 'react';\n\n/**\n * Options for keyboard shortcut hook\n */\nexport interface KeyboardShortcutOptions {\n /** Whether the shortcut is currently enabled (default: true) */\n enabled?: boolean;\n /** Modifier keys required (default: none) */\n modifiers?: {\n ctrl?: boolean;\n shift?: boolean;\n alt?: boolean;\n meta?: boolean;\n };\n /** Whether to prevent default browser behavior (default: true) */\n preventDefault?: boolean;\n /** Whether to stop event propagation (default: false) */\n stopPropagation?: boolean;\n /** Element types to ignore when the shortcut is pressed (default: ['INPUT', 'TEXTAREA', 'SELECT']) */\n ignoreInputs?: boolean;\n}\n\n/**\n * Hook that triggers a callback when a specific keyboard shortcut is pressed.\n * Supports modifier keys (Ctrl, Shift, Alt, Meta) and ignores input fields by default.\n *\n * @param key - The key to listen for (e.g., 'k', 'Enter', 'Escape', '/')\n * @param callback - Function to call when the shortcut is pressed\n * @param options - Configuration options\n *\n * @example\n * ```tsx\n * // Cmd/Ctrl+K to open search\n * useKeyboardShortcut('k', openSearch, { modifiers: { meta: true, ctrl: true } });\n *\n * // Forward slash to focus search (ignoring when typing)\n * useKeyboardShortcut('/', focusSearch);\n *\n * // Escape to close modal\n * useKeyboardShortcut('Escape', closeModal);\n * ```\n */\nexport function useKeyboardShortcut(\n key: string,\n callback: (event: KeyboardEvent) => void,\n options: KeyboardShortcutOptions = {}\n): void {\n const {\n enabled = true,\n modifiers = {},\n preventDefault = true,\n stopPropagation = false,\n ignoreInputs = true,\n } = options;\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n // Check if we should ignore input fields\n if (ignoreInputs) {\n const target = event.target as HTMLElement;\n const tagName = target.tagName.toUpperCase();\n if (\n tagName === 'INPUT' ||\n tagName === 'TEXTAREA' ||\n tagName === 'SELECT' ||\n target.isContentEditable\n ) {\n return;\n }\n }\n\n // Check modifiers\n const { ctrl, shift, alt, meta } = modifiers;\n\n // For Cmd+K style shortcuts, allow either meta (Mac) or ctrl (Windows/Linux)\n const metaOrCtrl = meta || ctrl;\n if (metaOrCtrl) {\n if (!(event.metaKey || event.ctrlKey)) return;\n } else {\n // If no meta/ctrl modifier specified, ensure neither is pressed\n if (event.metaKey || event.ctrlKey) return;\n }\n\n if (shift && !event.shiftKey) return;\n if (alt && !event.altKey) return;\n\n // Check key match (case-insensitive for letters)\n const eventKey =\n event.key.length === 1 ? event.key.toLowerCase() : event.key;\n const targetKey = key.length === 1 ? key.toLowerCase() : key;\n if (eventKey !== targetKey) return;\n\n if (preventDefault) {\n event.preventDefault();\n }\n if (stopPropagation) {\n event.stopPropagation();\n }\n\n callback(event);\n },\n [key, callback, modifiers, preventDefault, stopPropagation, ignoreInputs]\n );\n\n useEffect(() => {\n if (!enabled) return;\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown, enabled]);\n}\n\n/**\n * Hook for the common Cmd/Ctrl+K shortcut pattern (command palette, search, etc.)\n *\n * @param callback - Function to call when Cmd/Ctrl+K is pressed\n * @param enabled - Whether the shortcut is active (default: true)\n *\n * @example\n * ```tsx\n * useCommandK(() => setIsOpen(true));\n * ```\n */\nexport function useCommandK(callback: () => void, enabled = true): void {\n useKeyboardShortcut('k', callback, {\n enabled,\n modifiers: { meta: true, ctrl: true },\n ignoreInputs: false, // Cmd+K should work even in inputs\n });\n}\n","import { useState, useEffect } from 'react';\n\n/**\n * Hook that tracks whether a media query matches.\n * Uses the native `matchMedia` API for efficient media query tracking.\n *\n * @param query - CSS media query string (e.g., '(min-width: 768px)')\n * @returns Boolean indicating whether the media query matches\n *\n * @example\n * ```tsx\n * function ResponsiveComponent() {\n * const isMobile = useMediaQuery('(max-width: 767px)');\n * const isTablet = useMediaQuery('(min-width: 768px) and (max-width: 1023px)');\n * const isDesktop = useMediaQuery('(min-width: 1024px)');\n *\n * return (\n * <div>\n * {isMobile && <MobileLayout />}\n * {isTablet && <TabletLayout />}\n * {isDesktop && <DesktopLayout />}\n * </div>\n * );\n * }\n * ```\n */\nexport function useMediaQuery(query: string): boolean {\n // Initialize with null to indicate SSR/initial state\n const [matches, setMatches] = useState<boolean>(() => {\n // Check if we're in a browser environment\n if (typeof window === 'undefined') return false;\n return window.matchMedia(query).matches;\n });\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const mediaQuery = window.matchMedia(query);\n\n // Set initial value\n setMatches(mediaQuery.matches);\n\n // Handler for media query changes\n const handler = (event: MediaQueryListEvent) => {\n setMatches(event.matches);\n };\n\n // Modern browsers use addEventListener\n if (mediaQuery.addEventListener) {\n mediaQuery.addEventListener('change', handler);\n return () => mediaQuery.removeEventListener('change', handler);\n }\n\n // Fallback for older browsers\n mediaQuery.addListener(handler);\n return () => mediaQuery.removeListener(handler);\n }, [query]);\n\n return matches;\n}\n\n/**\n * Preset breakpoint hooks following common responsive design patterns\n */\n\n/** Returns true when viewport is smaller than 640px (mobile) */\nexport function useIsMobile(): boolean {\n return useMediaQuery('(max-width: 639px)');\n}\n\n/** Returns true when viewport is 640px-767px (large mobile / small tablet) */\nexport function useIsSmallTablet(): boolean {\n return useMediaQuery('(min-width: 640px) and (max-width: 767px)');\n}\n\n/** Returns true when viewport is 768px-1023px (tablet) */\nexport function useIsTablet(): boolean {\n return useMediaQuery('(min-width: 768px) and (max-width: 1023px)');\n}\n\n/** Returns true when viewport is 1024px or larger (desktop) */\nexport function useIsDesktop(): boolean {\n return useMediaQuery('(min-width: 1024px)');\n}\n\n/** Returns true when viewport is 1280px or larger (large desktop) */\nexport function useIsLargeDesktop(): boolean {\n return useMediaQuery('(min-width: 1280px)');\n}\n\n/** Returns true when viewport is smaller than 1024px (mobile/tablet) */\nexport function useIsMobileOrTablet(): boolean {\n return useMediaQuery('(max-width: 1023px)');\n}\n","'use client';\n\nimport * as React from 'react';\n\nexport interface OrderPersistenceAdapter {\n /** Previously saved order, or null when there is none */\n load: () => string[] | null | Promise<string[] | null>;\n save: (order: string[]) => void | Promise<void>;\n}\n\nexport interface UseOrderPersistenceOptions extends OrderPersistenceAdapter {\n /** Delay before `save` runs; rapid changes collapse into one save. */\n debounceMs?: number;\n /** Called when `load` or `save` throws or rejects */\n onError?: (error: unknown) => void;\n}\n\nexport interface UseOrderPersistenceReturn {\n /** Saved order merged with the current `ids` */\n order: string[];\n /** Update the order immediately and schedule a debounced save */\n setOrder: (order: string[]) => void;\n}\n\n/** Keep saved ids that still exist, then append new ids in their given order. */\nexport function mergeOrder(saved: string[] | null, ids: string[]): string[] {\n if (!saved) return ids;\n const known = new Set(ids);\n const kept = [...new Set(saved)].filter((id) => known.has(id));\n const keptSet = new Set(kept);\n return [...kept, ...ids.filter((id) => !keptSet.has(id))];\n}\n\n/**\n * Persist a user's item order (sections, widgets, list rows) through any\n * storage. Updates are optimistic, saves are debounced and a pending save is\n * flushed on unmount and on `pagehide` (navigation, refresh, tab close). On\n * `pagehide` only work `save` starts synchronously is guaranteed — use\n * localStorage or `navigator.sendBeacon` there; an async `fetch` may be cut\n * off. `load` runs once after mount, so server and first client render use\n * `ids` order.\n *\n * @example\n * ```tsx\n * const adapter = React.useMemo(() => localStorageOrderAdapter('clinic-sections'), []);\n * const { order, setOrder } = useOrderPersistence(sectionIds, adapter);\n * const drag = useDragReorder({ ids: order, onReorder: setOrder });\n * ```\n */\nexport function useOrderPersistence(\n ids: string[],\n { load, save, debounceMs = 500, onError }: UseOrderPersistenceOptions\n): UseOrderPersistenceReturn {\n const [saved, setSaved] = React.useState<string[] | null>(null);\n const callbacks = React.useRef({ load, save, onError });\n callbacks.current = { load, save, onError };\n const pending = React.useRef<string[] | null>(null);\n const timer = React.useRef<ReturnType<typeof setTimeout> | undefined>(\n undefined\n );\n const touched = React.useRef(false);\n // In-flight save count: `force` (pagehide) saves may overlap a normal one,\n // so queued flushes resume only after every save settles.\n const saving = React.useRef(0);\n // When saves overlap, their completion order is unknown and a stale write\n // could land last; the newest payload is saved once more after all settle.\n const lastStarted = React.useRef<string[] | null>(null);\n const overlapped = React.useRef(false);\n\n // One save at a time; changes made meanwhile coalesce into the next save.\n // `force` skips the queue for page unloads, where a queued save never runs.\n const flush = React.useCallback(function flushPending(force = false) {\n clearTimeout(timer.current);\n const next = pending.current;\n if (!next || (saving.current > 0 && !force)) return;\n pending.current = null;\n if (saving.current > 0) overlapped.current = true;\n saving.current += 1;\n lastStarted.current = next;\n const { save: run, onError: fail } = callbacks.current;\n let result: void | Promise<void>;\n try {\n result = run(next);\n } catch (e) {\n result = Promise.reject(e);\n }\n void Promise.resolve(result)\n .catch((e: unknown) => fail?.(e))\n .finally(() => {\n saving.current -= 1;\n if (saving.current > 0) return;\n if (overlapped.current) {\n overlapped.current = false;\n pending.current ??= lastStarted.current;\n }\n flushPending();\n });\n }, []);\n\n React.useEffect(() => {\n let active = true;\n const { load: read, onError: fail } = callbacks.current;\n Promise.resolve()\n .then(read)\n .then((value) => {\n // A change made while loading wins over the stored order\n if (active && value && !touched.current) setSaved(value);\n })\n .catch((e: unknown) => fail?.(e));\n return () => {\n active = false;\n flush();\n };\n }, [flush]);\n\n React.useEffect(() => {\n const onPageHide = () => flush(true);\n window.addEventListener('pagehide', onPageHide);\n return () => window.removeEventListener('pagehide', onPageHide);\n }, [flush]);\n\n const setOrder = React.useCallback(\n (next: string[]) => {\n touched.current = true;\n setSaved(next);\n pending.current = next;\n clearTimeout(timer.current);\n timer.current = setTimeout(flush, debounceMs);\n },\n [debounceMs, flush]\n );\n\n const order = React.useMemo(() => mergeOrder(saved, ids), [saved, ids]);\n return { order, setOrder };\n}\n\n/** `useOrderPersistence` adapter backed by `localStorage` (no-op on the server or when storage is blocked). */\nexport function localStorageOrderAdapter(key: string): OrderPersistenceAdapter {\n return {\n load: () => {\n try {\n if (typeof window === 'undefined') return null;\n const raw: unknown = JSON.parse(\n window.localStorage.getItem(key) ?? 'null'\n );\n return Array.isArray(raw) && raw.every((v) => typeof v === 'string')\n ? (raw as string[])\n : null;\n } catch {\n return null;\n }\n },\n save: (order) => {\n try {\n if (typeof window !== 'undefined')\n window.localStorage.setItem(key, JSON.stringify(order));\n } catch {\n // Quota exceeded or storage disabled: keep the in-memory order\n }\n },\n };\n}\n"]}
|
|
@@ -29,6 +29,10 @@ var modalContentVariants = cva(
|
|
|
29
29
|
// Full viewport height on mobile, constrained on larger screens
|
|
30
30
|
"max-h-dvh sm:max-h-[calc(100dvh-2rem)]",
|
|
31
31
|
"min-h-dvh sm:min-h-0",
|
|
32
|
+
// Full-screen on mobile covers the status bar and home indicator, so
|
|
33
|
+
// clear the safe areas there. Overridable for tests and native shells.
|
|
34
|
+
"pt-[var(--mieweb-safe-area-top,env(safe-area-inset-top))] sm:pt-0",
|
|
35
|
+
"pb-[var(--mieweb-safe-area-bottom,env(safe-area-inset-bottom))] sm:pb-0",
|
|
32
36
|
// If a <form> is used as a direct child (wrapping ModalBody + ModalFooter),
|
|
33
37
|
// make it participate in the flex column layout so overflow constraints work.
|
|
34
38
|
"[&>form]:flex [&>form]:flex-col [&>form]:flex-1 [&>form]:min-h-0",
|
|
@@ -294,5 +298,5 @@ function CloseIcon() {
|
|
|
294
298
|
}
|
|
295
299
|
|
|
296
300
|
export { Modal, ModalBody, ModalClose, ModalFooter, ModalHeader, ModalTitle, modalContentVariants, modalOverlayVariants };
|
|
297
|
-
//# sourceMappingURL=chunk-
|
|
298
|
-
//# sourceMappingURL=chunk-
|
|
301
|
+
//# sourceMappingURL=chunk-TWQSMUE6.js.map
|
|
302
|
+
//# sourceMappingURL=chunk-TWQSMUE6.js.map
|