@mieweb/ui 0.10.0-dev.31 → 0.10.0-dev.32
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-TYE5K5WV.cjs → chunk-32ZCJOSR.cjs} +4 -4
- package/dist/{chunk-TYE5K5WV.cjs.map → chunk-32ZCJOSR.cjs.map} +1 -1
- package/dist/{chunk-SD7ONW6S.js → chunk-3DLLTITK.js} +4 -4
- package/dist/{chunk-SD7ONW6S.js.map → chunk-3DLLTITK.js.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-WXFGHDTV.cjs → chunk-57G3O552.cjs} +13 -13
- package/dist/{chunk-WXFGHDTV.cjs.map → chunk-57G3O552.cjs.map} +1 -1
- 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-NKV76R65.cjs → chunk-6M63CM7X.cjs} +26 -26
- package/dist/{chunk-NKV76R65.cjs.map → chunk-6M63CM7X.cjs.map} +1 -1
- 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-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-BNH4SXJB.js → chunk-CMF7VCGP.js} +5 -5
- package/dist/{chunk-BNH4SXJB.js.map → chunk-CMF7VCGP.js.map} +1 -1
- 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-QURJVPRH.cjs → chunk-EMRWTCCN.cjs} +41 -2
- package/dist/chunk-EMRWTCCN.cjs.map +1 -0
- 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-ZTMYKAVU.cjs → chunk-FCV7GBNQ.cjs} +24 -23
- package/dist/chunk-FCV7GBNQ.cjs.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-GNOQFTLL.cjs +286 -0
- package/dist/chunk-GNOQFTLL.cjs.map +1 -0
- 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-JBIGSP2T.js → chunk-ILDLYRTP.js} +5 -4
- package/dist/chunk-ILDLYRTP.js.map +1 -0
- 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-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-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-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-O4WGSOJI.js +261 -0
- package/dist/chunk-O4WGSOJI.js.map +1 -0
- 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-MLAWXPRY.js → chunk-OZ5CKVQN.js} +41 -2
- package/dist/chunk-OZ5CKVQN.js.map +1 -0
- 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-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-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-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-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-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-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 +16 -3
- package/dist/components/AlertDialog/index.d.cts +66 -13
- package/dist/components/AlertDialog/index.d.ts +66 -13
- package/dist/components/AlertDialog/index.js +3 -2
- 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/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 +9 -8
- package/dist/components/MediaEditor/index.js +4 -3
- package/dist/components/MediaFeed/index.cjs +8 -5
- package/dist/components/MediaFeed/index.js +7 -4
- 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/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 +22 -18
- package/dist/components/SuperChat/index.cjs.map +1 -1
- package/dist/components/SuperChat/index.js +10 -6
- 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 +8 -6
- package/dist/esheet.cjs.map +1 -1
- package/dist/esheet.js +5 -3
- 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 +1258 -714
- 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 +536 -168
- 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-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-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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/PropertyList/PropertyList.tsx"],"names":["PropertyList"],"mappings":"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","file":"chunk-7HUTR6RX.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { ChevronDown } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from '../Collapsible';\nimport { CopyButton } from '../CopyButton';\nimport {\n InlineEdit,\n type InlineEditLabels,\n type InlineEditOption,\n type InlineEditType,\n} from '../InlineEdit';\n\nexport interface PropertyListItem {\n key: string;\n label: string;\n value: string | number | null | undefined;\n /** Control used when editing; also drives display formatting. */\n type?: InlineEditType;\n options?: InlineEditOption[];\n /** Edit in place with `InlineEdit` (requires `onSave`). */\n editable?: boolean;\n /** Helper text under the value. */\n hint?: string;\n /** Show a copy-to-clipboard button for non-empty values. */\n copyable?: boolean;\n /** Custom display of a non-empty value. */\n render?: (value: string) => React.ReactNode;\n validate?: (value: string) => string | undefined;\n /** Shown for an empty editable value instead of `labels.empty`. */\n placeholder?: string;\n}\n\nexport interface PropertyListGroup {\n id: string;\n title: string;\n items: PropertyListItem[];\n /** Defaults to true. */\n defaultOpen?: boolean;\n}\n\nexport interface PropertyListLabels {\n /** Shown for empty values. */\n empty: string;\n copy: (label: string) => string;\n copied: string;\n showEmpty: (count: number) => string;\n hideEmpty: (count: number) => string;\n}\n\nexport const defaultPropertyListLabels: PropertyListLabels = {\n empty: '—',\n copy: (label) => `Copy ${label}`,\n copied: 'Copied',\n showEmpty: (count) => `Show ${count} empty field${count === 1 ? '' : 's'}`,\n hideEmpty: (count) => `Hide ${count} empty field${count === 1 ? '' : 's'}`,\n};\n\nconst listVariants = cva('m-0', {\n variants: {\n density: { comfortable: 'space-y-3', compact: 'space-y-1' },\n },\n defaultVariants: { density: 'comfortable' },\n});\n\nconst rowVariants = cva('min-w-0', {\n variants: {\n layout: {\n stacked: 'flex flex-col gap-0.5',\n inline:\n 'grid gap-0.5 sm:grid-cols-[minmax(7rem,40%)_minmax(0,1fr)] sm:items-baseline sm:gap-3',\n },\n },\n defaultVariants: { layout: 'stacked' },\n});\n\ntype Layout = NonNullable<VariantProps<typeof rowVariants>['layout']>;\ntype Density = NonNullable<VariantProps<typeof listVariants>['density']>;\n\nexport interface PropertyListProps\n extends\n Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'>,\n VariantProps<typeof listVariants>,\n VariantProps<typeof rowVariants> {\n /** Flat list of properties. Ignored when `groups` is set. */\n items?: PropertyListItem[];\n /** Collapsible sections of properties. */\n groups?: PropertyListGroup[];\n /** Persist an edited value. Rejecting restores the previous value. */\n onSave?: (key: string, value: string) => void | Promise<void>;\n /** Hide empty values behind a \"Show N empty fields\" toggle. */\n hideEmpty?: boolean;\n /** Heading level for group titles. */\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n /** Remember each group's open state in localStorage under `${storageKey}:${group.id}`. */\n storageKey?: string;\n /** Translatable strings. */\n labels?: Partial<PropertyListLabels>;\n /** Strings forwarded to each `InlineEdit`. */\n inlineEditLabels?: Partial<InlineEditLabels>;\n}\n\nconst toText = (value: PropertyListItem['value']) =>\n value == null ? '' : String(value);\n\ninterface RowsProps {\n items: PropertyListItem[];\n layout: Layout;\n density: Density;\n hideEmpty?: boolean;\n onSave?: PropertyListProps['onSave'];\n labels: PropertyListLabels;\n inlineEditLabels?: Partial<InlineEditLabels>;\n}\n\nfunction PropertyRows({\n items,\n layout,\n density,\n hideEmpty,\n onSave,\n labels,\n inlineEditLabels,\n}: RowsProps) {\n const [showEmpty, setShowEmpty] = React.useState(false);\n const id = React.useId();\n const isEmpty = (item: PropertyListItem) => toText(item.value).trim() === '';\n const emptyCount = hideEmpty ? items.filter(isEmpty).length : 0;\n const visible =\n hideEmpty && !showEmpty ? items.filter((i) => !isEmpty(i)) : items;\n\n return (\n <>\n <dl data-slot=\"property-list-items\" className={listVariants({ density })}>\n {visible.map((item, index) => {\n const text = toText(item.value);\n const editable = item.editable && !!onSave;\n const hintId = `${id}-hint-${index}`;\n return (\n <div\n key={item.key}\n data-slot=\"property-list-row\"\n className={rowVariants({ layout })}\n >\n <dt className=\"text-muted-foreground px-2 text-xs font-medium sm:text-sm\">\n {item.label}\n </dt>\n <dd className=\"m-0 min-w-0\">\n <div className=\"flex min-w-0 items-center gap-1\">\n <InlineEdit\n className=\"min-w-0 flex-1\"\n size=\"sm\"\n label={item.label}\n value={text}\n type={item.type}\n options={item.options}\n validate={item.validate}\n formatDisplay={item.render}\n placeholder={\n editable\n ? (item.placeholder ?? labels.empty)\n : labels.empty\n }\n readOnly={!editable}\n labels={inlineEditLabels}\n aria-describedby={item.hint ? hintId : undefined}\n onSave={(next) => onSave?.(item.key, next)}\n />\n {item.copyable && text && (\n <CopyButton\n value={text}\n label={labels.copy(item.label)}\n copiedLabel={labels.copied}\n />\n )}\n </div>\n {item.hint && (\n <p\n id={hintId}\n className=\"text-muted-foreground mt-0.5 px-2 text-xs\"\n >\n {item.hint}\n </p>\n )}\n </dd>\n </div>\n );\n })}\n </dl>\n {emptyCount > 0 && (\n <button\n type=\"button\"\n data-slot=\"property-list-empty-toggle\"\n aria-expanded={showEmpty}\n onClick={() => setShowEmpty((v) => !v)}\n className=\"text-muted-foreground hover:text-foreground focus-visible:ring-ring mt-1 rounded px-2 py-1 text-xs focus-visible:ring-2 focus-visible:outline-none\"\n >\n {showEmpty\n ? labels.hideEmpty(emptyCount)\n : labels.showEmpty(emptyCount)}\n </button>\n )}\n </>\n );\n}\n\n/**\n * Label/value pairs as a description list, with optional in-place editing,\n * copy buttons and collapsible groups.\n */\nexport const PropertyList = React.forwardRef<HTMLDivElement, PropertyListProps>(\n function PropertyList(\n {\n items,\n groups,\n onSave,\n hideEmpty,\n layout,\n density,\n headingLevel = 3,\n storageKey,\n labels: labelOverrides,\n inlineEditLabels,\n className,\n ...props\n },\n ref\n ) {\n const labels = { ...defaultPropertyListLabels, ...labelOverrides };\n const rowProps = {\n layout: layout ?? 'stacked',\n density: density ?? 'comfortable',\n hideEmpty,\n onSave,\n labels,\n inlineEditLabels,\n };\n const Heading = `h${headingLevel}` as 'h3';\n\n return (\n <div\n ref={ref}\n data-slot=\"property-list\"\n className={cn('min-w-0', className)}\n {...props}\n >\n {groups ? (\n groups.map((group) => (\n <Collapsible\n key={group.id}\n defaultOpen={group.defaultOpen ?? true}\n storageKey={storageKey && `${storageKey}:${group.id}`}\n data-slot=\"property-list-group\"\n className=\"border-border border-b py-1 last:border-b-0\"\n >\n <Heading className=\"m-0\">\n <CollapsibleTrigger className=\"group text-foreground hover:bg-muted focus-visible:ring-ring flex w-full items-center gap-2 rounded-md px-2 py-2 text-start text-sm font-semibold focus-visible:ring-2 focus-visible:outline-none\">\n <ChevronDown\n aria-hidden=\"true\"\n className=\"text-muted-foreground h-4 w-4 shrink-0 transition-transform group-data-[state=closed]:-rotate-90 motion-reduce:transition-none rtl:group-data-[state=closed]:rotate-90\"\n />\n {group.title}\n </CollapsibleTrigger>\n </Heading>\n <CollapsibleContent>\n <div className=\"pb-2\">\n <PropertyRows items={group.items} {...rowProps} />\n </div>\n </CollapsibleContent>\n </Collapsible>\n ))\n ) : (\n <PropertyRows items={items ?? []} {...rowProps} />\n )}\n </div>\n );\n }\n);\n\nPropertyList.displayName = 'PropertyList';\n"]}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkYGA35Z2P_cjs = require('./chunk-YGA35Z2P.cjs');
|
|
4
|
+
var chunkANMX7YDL_cjs = require('./chunk-ANMX7YDL.cjs');
|
|
5
|
+
var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
|
|
6
|
+
var lucideReact = require('lucide-react');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
function RecordState({
|
|
10
|
+
kind,
|
|
11
|
+
slot,
|
|
12
|
+
message,
|
|
13
|
+
retryLabel,
|
|
14
|
+
onRetry,
|
|
15
|
+
rows = 3,
|
|
16
|
+
className,
|
|
17
|
+
children
|
|
18
|
+
}) {
|
|
19
|
+
if (kind === "loading") {
|
|
20
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
21
|
+
"div",
|
|
22
|
+
{
|
|
23
|
+
role: "status",
|
|
24
|
+
"data-slot": slot,
|
|
25
|
+
className: chunkS5RVSXDV_cjs.cn("space-y-4 p-4", className),
|
|
26
|
+
children: [
|
|
27
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: message }),
|
|
28
|
+
Array.from({ length: rows }, (_, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
|
|
29
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkYGA35Z2P_cjs.Skeleton, { circle: true, width: 28, height: 28, className: "shrink-0" }),
|
|
30
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 space-y-2", children: [
|
|
31
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkYGA35Z2P_cjs.Skeleton, { variant: "text", width: "60%" }),
|
|
32
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkYGA35Z2P_cjs.Skeleton, { variant: "text", width: "35%" })
|
|
33
|
+
] })
|
|
34
|
+
] }, i))
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
40
|
+
"div",
|
|
41
|
+
{
|
|
42
|
+
"data-slot": slot,
|
|
43
|
+
className: chunkS5RVSXDV_cjs.cn(
|
|
44
|
+
"text-muted-foreground flex flex-col items-center justify-center gap-2 px-4 py-10 text-center text-sm",
|
|
45
|
+
className
|
|
46
|
+
),
|
|
47
|
+
children: [
|
|
48
|
+
kind === "error" ? /* @__PURE__ */ jsxRuntime.jsxs("p", { role: "alert", className: "text-foreground flex items-center gap-2", children: [
|
|
49
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.TriangleAlert, { className: "text-destructive size-4", "aria-hidden": true }),
|
|
50
|
+
message
|
|
51
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsx("p", { children: message }),
|
|
52
|
+
onRetry && retryLabel && /* @__PURE__ */ jsxRuntime.jsx(chunkANMX7YDL_cjs.Button, { variant: "ghost", size: "sm", onClick: onRetry, children: retryLabel }),
|
|
53
|
+
children
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
exports.RecordState = RecordState;
|
|
60
|
+
//# sourceMappingURL=chunk-7IRTD4JT.cjs.map
|
|
61
|
+
//# sourceMappingURL=chunk-7IRTD4JT.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ActivityFeed/RecordState.tsx"],"names":["jsxs","cn","jsx","Skeleton","TriangleAlert","Button"],"mappings":";;;;;;;;AAuBO,SAAS,WAAA,CAAY;AAAA,EAC1B,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA,GAAO,CAAA;AAAA,EACP,SAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,uBACEA,eAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,WAAA,EAAW,IAAA;AAAA,QACX,SAAA,EAAWC,oBAAA,CAAG,eAAA,EAAiB,SAAS,CAAA;AAAA,QAExC,QAAA,EAAA;AAAA,0BAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,UAClC,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,EAAK,EAAG,CAAC,CAAA,EAAG,CAAA,qBAChCF,eAAA,CAAC,KAAA,EAAA,EAAY,SAAA,EAAU,yBAAA,EACrB,QAAA,EAAA;AAAA,4BAAAE,cAAA,CAACC,0BAAA,EAAA,EAAS,QAAM,IAAA,EAAC,KAAA,EAAO,IAAI,MAAA,EAAQ,EAAA,EAAI,WAAU,UAAA,EAAW,CAAA;AAAA,4BAC7DH,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,8BAAAE,cAAA,CAACC,0BAAA,EAAA,EAAS,OAAA,EAAQ,MAAA,EAAO,KAAA,EAAM,KAAA,EAAM,CAAA;AAAA,8BACrCD,cAAA,CAACC,0BAAA,EAAA,EAAS,OAAA,EAAQ,MAAA,EAAO,OAAM,KAAA,EAAM;AAAA,aAAA,EACvC;AAAA,WAAA,EAAA,EALQ,CAMV,CACD;AAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AACA,EAAA,uBACEH,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAWC,oBAAA;AAAA,QACT,sGAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,IAAA,KAAS,0BACRD,eAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAK,OAAA,EAAQ,WAAU,yCAAA,EACxB,QAAA,EAAA;AAAA,0BAAAE,cAAA,CAACE,yBAAA,EAAA,EAAc,SAAA,EAAU,yBAAA,EAA0B,aAAA,EAAW,IAAA,EAAC,CAAA;AAAA,UAC9D;AAAA,SAAA,EACH,CAAA,mBAEAF,cAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,QAEb,OAAA,IAAW,UAAA,oBACVA,cAAA,CAACG,wBAAA,EAAA,EAAO,OAAA,EAAQ,SAAQ,IAAA,EAAK,IAAA,EAAK,OAAA,EAAS,OAAA,EACxC,QAAA,EAAA,UAAA,EACH,CAAA;AAAA,QAED;AAAA;AAAA;AAAA,GACH;AAEJ","file":"chunk-7IRTD4JT.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { TriangleAlert } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\nimport { Skeleton } from '../Skeleton';\n\nexport interface RecordStateProps {\n kind: 'loading' | 'error' | 'empty';\n /** `data-slot` value, so each module keeps its own slot name. */\n slot: string;\n message: string;\n retryLabel?: string;\n onRetry?: () => void;\n /** Skeleton rows while loading. */\n rows?: number;\n className?: string;\n /** Extra actions under an empty or error message. */\n children?: React.ReactNode;\n}\n\n/** The loading, error and empty states shared by the Records modules. */\nexport function RecordState({\n kind,\n slot,\n message,\n retryLabel,\n onRetry,\n rows = 3,\n className,\n children,\n}: RecordStateProps) {\n if (kind === 'loading') {\n return (\n <div\n role=\"status\"\n data-slot={slot}\n className={cn('space-y-4 p-4', className)}\n >\n <span className=\"sr-only\">{message}</span>\n {Array.from({ length: rows }, (_, i) => (\n <div key={i} className=\"flex items-center gap-3\">\n <Skeleton circle width={28} height={28} className=\"shrink-0\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton variant=\"text\" width=\"60%\" />\n <Skeleton variant=\"text\" width=\"35%\" />\n </div>\n </div>\n ))}\n </div>\n );\n }\n return (\n <div\n data-slot={slot}\n className={cn(\n 'text-muted-foreground flex flex-col items-center justify-center gap-2 px-4 py-10 text-center text-sm',\n className\n )}\n >\n {kind === 'error' ? (\n <p role=\"alert\" className=\"text-foreground flex items-center gap-2\">\n <TriangleAlert className=\"text-destructive size-4\" aria-hidden />\n {message}\n </p>\n ) : (\n <p>{message}</p>\n )}\n {onRetry && retryLabel && (\n <Button variant=\"ghost\" size=\"sm\" onClick={onRetry}>\n {retryLabel}\n </Button>\n )}\n {children}\n </div>\n );\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FenceBlock } from './chunk-
|
|
1
|
+
import { FenceBlock } from './chunk-HDY7YQFX.js';
|
|
2
2
|
import DOMPurify from 'dompurify';
|
|
3
3
|
import { useState, useMemo, useCallback, useEffect } from 'react';
|
|
4
4
|
import { jsx } from 'react/jsx-runtime';
|
|
@@ -144,5 +144,5 @@ var MermaidBlock = ({ code, id }) => {
|
|
|
144
144
|
};
|
|
145
145
|
|
|
146
146
|
export { MermaidBlock };
|
|
147
|
-
//# sourceMappingURL=chunk-
|
|
148
|
-
//# sourceMappingURL=chunk-
|
|
147
|
+
//# sourceMappingURL=chunk-7QW6TU4X.js.map
|
|
148
|
+
//# sourceMappingURL=chunk-7QW6TU4X.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Markdown/MermaidBlock.tsx"],"names":[],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/Markdown/MermaidBlock.tsx"],"names":[],"mappings":"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","file":"chunk-7QW6TU4X.js","sourcesContent":["/**\n * MermaidBlock — Renders Mermaid diagrams.\n * Requires `mermaid` to be installed by the consumer (optional peer dependency).\n */\nimport DOMPurify from 'dompurify';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { FenceBlock } from './FenceBlock';\n\ninterface MermaidBlockProps {\n code: string;\n id: string;\n}\n\ntype MermaidApi = {\n initialize: (config: Record<string, unknown>) => void;\n parse: (text: string) => Promise<unknown>;\n render: (id: string, text: string) => Promise<{ svg: string }>;\n};\n\nlet mermaidInstance: MermaidApi | null = null;\nlet mermaidReady: Promise<MermaidApi> | null = null;\nlet mermaidTheme: 'dark' | 'default' = 'default';\n\nfunction currentTheme(): 'dark' | 'default' {\n return document.documentElement.classList.contains('dark') ||\n document.documentElement.getAttribute('data-theme') === 'dark'\n ? 'dark'\n : 'default';\n}\n\nfunction buildConfig(theme: 'dark' | 'default'): Record<string, unknown> {\n const base: Record<string, unknown> = {\n startOnLoad: false,\n theme,\n securityLevel: 'strict',\n };\n if (theme === 'dark') {\n base.themeVariables = {\n nodeBorder: '#6b7280',\n mainBkg: '#4a4a4a',\n nodeTextColor: '#ffffff',\n clusterBkg: '#374151',\n titleColor: '#ffffff',\n edgeLabelBackground: '#374151',\n lineColor: '#9ca3af',\n };\n }\n return base;\n}\n\nasync function getMermaid(): Promise<MermaidApi> {\n const theme = currentTheme();\n if (mermaidInstance) {\n if (theme !== mermaidTheme) {\n mermaidTheme = theme;\n mermaidInstance.initialize(buildConfig(theme));\n }\n return mermaidInstance;\n }\n if (!mermaidReady) {\n mermaidReady = import(/* @vite-ignore */ 'mermaid').then((mod) => {\n const m = (mod as { default: MermaidApi }).default;\n mermaidTheme = currentTheme();\n m.initialize(buildConfig(mermaidTheme));\n mermaidInstance = m;\n return m;\n });\n }\n return mermaidReady;\n}\n\nfunction sanitiseSvg(svg: string): string {\n return DOMPurify.sanitize(svg, {\n USE_PROFILES: { svg: true, svgFilters: true },\n // Allow <style> so mermaid's embedded CSS applies, and <foreignObject>\n // so node label text renders (mermaid escapes its content in strict mode).\n ADD_TAGS: ['style', 'foreignObject'],\n ADD_ATTR: [\n 'style',\n 'class',\n 'dominant-baseline',\n 'text-anchor',\n 'font-size',\n 'font-family',\n 'marker-end',\n 'marker-start',\n 'marker-mid',\n 'stroke-dasharray',\n 'stroke-width',\n ],\n FORBID_TAGS: ['script'],\n FORBID_ATTR: ['onload', 'onerror', 'onclick', 'onmouseover'],\n }) as string;\n}\n\nexport const MermaidBlock: React.FC<MermaidBlockProps> = ({ code, id }) => {\n const [svg, setSvg] = useState<string>('');\n const [error, setError] = useState<string>('');\n const [loading, setLoading] = useState(true);\n\n // Derive an accessible label from the diagram's declared type (first keyword).\n const diagramLabel = useMemo(() => {\n const firstWord =\n code\n .trim()\n .split(/[\\s\\n]/)[0]\n ?.toLowerCase() ?? '';\n const typeMap: Record<string, string> = {\n graph: 'Flowchart',\n flowchart: 'Flowchart',\n sequencediagram: 'Sequence diagram',\n classdiagram: 'Class diagram',\n statediagram: 'State diagram',\n 'statediagram-v2': 'State diagram',\n erdiagram: 'Entity relationship diagram',\n gantt: 'Gantt chart',\n pie: 'Pie chart',\n journey: 'User journey diagram',\n gitgraph: 'Git graph',\n mindmap: 'Mind map',\n timeline: 'Timeline',\n quadrantchart: 'Quadrant chart',\n };\n return `${typeMap[firstWord] ?? 'Mermaid'} diagram`;\n }, [code]);\n\n const render = useCallback(async () => {\n setLoading(true);\n setError('');\n try {\n const mermaid = await getMermaid();\n await mermaid.parse(code);\n const { svg: rendered } = await mermaid.render(`mermaid-${id}`, code);\n setSvg(sanitiseSvg(rendered));\n } catch (err) {\n setError((err as Error).message ?? 'Failed to render diagram');\n } finally {\n setLoading(false);\n }\n }, [code, id]);\n\n useEffect(() => {\n void render();\n }, [render]);\n\n // Re-render when the page theme changes (dark ↔ light)\n useEffect(() => {\n const observer = new MutationObserver(() => void render());\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class', 'data-theme'],\n });\n return () => observer.disconnect();\n }, [render]);\n\n return (\n <FenceBlock\n code={code}\n language=\"mermaid\"\n supportsRawView\n error={error || undefined}\n >\n {loading ? (\n <div className=\"flex items-center justify-center p-8\">\n <div className=\"border-primary-500 h-6 w-6 animate-spin rounded-full border-2 border-t-transparent\" />\n </div>\n ) : (\n <div\n className=\"mermaid-svg flex justify-center p-4\"\n role=\"img\"\n aria-label={diagramLabel}\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n )}\n </FenceBlock>\n );\n};\n"]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
|
|
5
|
+
// src/hooks/useUrlTab.ts
|
|
6
|
+
var URL_PARAM_EVENT = "mieweb:urlparamchange";
|
|
7
|
+
function subscribe(onChange) {
|
|
8
|
+
window.addEventListener("popstate", onChange);
|
|
9
|
+
window.addEventListener(URL_PARAM_EVENT, onChange);
|
|
10
|
+
return () => {
|
|
11
|
+
window.removeEventListener("popstate", onChange);
|
|
12
|
+
window.removeEventListener(URL_PARAM_EVENT, onChange);
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function useUrlSearchParam(param, defaultValue, isAllowed) {
|
|
16
|
+
const raw = react.useSyncExternalStore(
|
|
17
|
+
subscribe,
|
|
18
|
+
() => param ? new globalThis.URLSearchParams(window.location.search).get(param) : null,
|
|
19
|
+
() => null
|
|
20
|
+
);
|
|
21
|
+
const value = raw !== null && isAllowed(raw) ? raw : defaultValue;
|
|
22
|
+
const setValue = react.useCallback(
|
|
23
|
+
(next) => {
|
|
24
|
+
if (!param || typeof window === "undefined") return;
|
|
25
|
+
const url = new URL(window.location.href);
|
|
26
|
+
if (next === defaultValue) url.searchParams.delete(param);
|
|
27
|
+
else url.searchParams.set(param, next);
|
|
28
|
+
window.history.replaceState(window.history.state, "", url);
|
|
29
|
+
window.dispatchEvent(new Event(URL_PARAM_EVENT));
|
|
30
|
+
},
|
|
31
|
+
[param, defaultValue]
|
|
32
|
+
);
|
|
33
|
+
return [value, setValue];
|
|
34
|
+
}
|
|
35
|
+
function useUrlTab(param, defaultValue, allowed) {
|
|
36
|
+
const [value, setValue] = useUrlSearchParam(
|
|
37
|
+
param,
|
|
38
|
+
defaultValue,
|
|
39
|
+
(v) => allowed.includes(v)
|
|
40
|
+
);
|
|
41
|
+
return [value, setValue];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
exports.useUrlSearchParam = useUrlSearchParam;
|
|
45
|
+
exports.useUrlTab = useUrlTab;
|
|
46
|
+
//# sourceMappingURL=chunk-7WJ6MBF5.cjs.map
|
|
47
|
+
//# sourceMappingURL=chunk-7WJ6MBF5.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useUrlTab.ts"],"names":["useSyncExternalStore","useCallback"],"mappings":";;;;;AAGA,IAAM,eAAA,GAAkB,uBAAA;AAExB,SAAS,UAAU,QAAA,EAAsB;AACvC,EAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,QAAQ,CAAA;AAC5C,EAAA,MAAA,CAAO,gBAAA,CAAiB,iBAAiB,QAAQ,CAAA;AACjD,EAAA,OAAO,MAAM;AACX,IAAA,MAAA,CAAO,mBAAA,CAAoB,YAAY,QAAQ,CAAA;AAC/C,IAAA,MAAA,CAAO,mBAAA,CAAoB,iBAAiB,QAAQ,CAAA;AAAA,EACtD,CAAA;AACF;AAOO,SAAS,iBAAA,CACd,KAAA,EACA,YAAA,EACA,SAAA,EACmC;AACnC,EAAA,MAAM,GAAA,GAAMA,0BAAA;AAAA,IACV,SAAA;AAAA,IACA,MACE,KAAA,GACI,IAAI,UAAA,CAAW,eAAA,CAAgB,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,CAAE,GAAA,CAAI,KAAK,CAAA,GAChE,IAAA;AAAA,IACN,MAAM;AAAA,GACR;AACA,EAAA,MAAM,QAAQ,GAAA,KAAQ,IAAA,IAAQ,SAAA,CAAU,GAAG,IAAI,GAAA,GAAM,YAAA;AAErD,EAAA,MAAM,QAAA,GAAWC,iBAAA;AAAA,IACf,CAAC,IAAA,KAAiB;AAChB,MAAA,IAAI,CAAC,KAAA,IAAS,OAAO,MAAA,KAAW,WAAA,EAAa;AAC7C,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,MAAA,CAAO,SAAS,IAAI,CAAA;AACxC,MAAA,IAAI,IAAA,KAAS,YAAA,EAAc,GAAA,CAAI,YAAA,CAAa,OAAO,KAAK,CAAA;AAAA,WACnD,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,KAAA,EAAO,IAAI,CAAA;AACrC,MAAA,MAAA,CAAO,QAAQ,YAAA,CAAa,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,IAAI,GAAG,CAAA;AACzD,MAAA,MAAA,CAAO,aAAA,CAAc,IAAI,KAAA,CAAM,eAAe,CAAC,CAAA;AAAA,IACjD,CAAA;AAAA,IACA,CAAC,OAAO,YAAY;AAAA,GACtB;AAEA,EAAA,OAAO,CAAC,OAAO,QAAQ,CAAA;AACzB;AAgBO,SAAS,SAAA,CACd,KAAA,EACA,YAAA,EACA,OAAA,EACyB;AACzB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,iBAAA;AAAA,IAAkB,KAAA;AAAA,IAAO,YAAA;AAAA,IAAc,CAAC,CAAA,KAC/D,OAAA,CAA8B,QAAA,CAAS,CAAC;AAAA,GAC3C;AACA,EAAA,OAAO,CAAC,OAAY,QAA8B,CAAA;AACpD","file":"chunk-7WJ6MBF5.cjs","sourcesContent":["import { useCallback, useSyncExternalStore } from 'react';\n\n// history.replaceState fires no event, so writers announce changes themselves.\nconst URL_PARAM_EVENT = 'mieweb:urlparamchange';\n\nfunction subscribe(onChange: () => void) {\n window.addEventListener('popstate', onChange);\n window.addEventListener(URL_PARAM_EVENT, onChange);\n return () => {\n window.removeEventListener('popstate', onChange);\n window.removeEventListener(URL_PARAM_EVENT, onChange);\n };\n}\n\n/**\n * Syncs one URL query parameter with a string value. `param: undefined`\n * disables the sync, so callers can toggle it without breaking hook order.\n * Not exported from the package; use {@link useUrlTab}.\n */\nexport function useUrlSearchParam(\n param: string | undefined,\n defaultValue: string,\n isAllowed: (value: string) => boolean\n): [string, (value: string) => void] {\n const raw = useSyncExternalStore(\n subscribe,\n () =>\n param\n ? new globalThis.URLSearchParams(window.location.search).get(param)\n : null,\n () => null\n );\n const value = raw !== null && isAllowed(raw) ? raw : defaultValue;\n\n const setValue = useCallback(\n (next: string) => {\n if (!param || typeof window === 'undefined') return;\n const url = new URL(window.location.href);\n if (next === defaultValue) url.searchParams.delete(param);\n else url.searchParams.set(param, next);\n window.history.replaceState(window.history.state, '', url);\n window.dispatchEvent(new Event(URL_PARAM_EVENT));\n },\n [param, defaultValue]\n );\n\n return [value, setValue];\n}\n\n/**\n * Keeps a tab (or any one-of-N view) selection in a URL query parameter so it\n * survives reloads and can be shared. Writes with `history.replaceState` (no\n * router, no history entry), drops the parameter when the value equals\n * `defaultValue`, follows back/forward via `popstate`, and ignores values not\n * in `allowed`. SSR-safe: renders `defaultValue` on the server and during\n * hydration.\n *\n * @example\n * ```tsx\n * const [tab, setTab] = useUrlTab('tab', 'summary', ['summary', 'history'] as const);\n * <Tabs value={tab} onValueChange={(v) => setTab(v as typeof tab)}>…</Tabs>\n * ```\n */\nexport function useUrlTab<T extends string>(\n param: string,\n defaultValue: T,\n allowed: readonly T[]\n): [T, (value: T) => void] {\n const [value, setValue] = useUrlSearchParam(param, defaultValue, (v) =>\n (allowed as readonly string[]).includes(v)\n );\n return [value as T, setValue as (value: T) => void];\n}\n"]}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var luxon = require('luxon');
|
|
6
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
7
|
+
|
|
8
|
+
function _interopNamespace(e) {
|
|
9
|
+
if (e && e.__esModule) return e;
|
|
10
|
+
var n = Object.create(null);
|
|
11
|
+
if (e) {
|
|
12
|
+
Object.keys(e).forEach(function (k) {
|
|
13
|
+
if (k !== 'default') {
|
|
14
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
15
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
get: function () { return e[k]; }
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
n.default = e;
|
|
23
|
+
return Object.freeze(n);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
27
|
+
|
|
28
|
+
var defaultCalendarHeatmapLabels = {
|
|
29
|
+
title: "Activity calendar",
|
|
30
|
+
cellLabel: (date, value) => `${date}: ${value}`,
|
|
31
|
+
summary: (total, activeDays) => `${total} total across ${activeDays} active ${activeDays === 1 ? "day" : "days"}`,
|
|
32
|
+
less: "Less",
|
|
33
|
+
more: "More"
|
|
34
|
+
};
|
|
35
|
+
var LEVELS = [
|
|
36
|
+
"bg-muted ring-1 ring-inset ring-border",
|
|
37
|
+
"bg-primary-500/25",
|
|
38
|
+
"bg-primary-500/50",
|
|
39
|
+
"bg-primary-500/75",
|
|
40
|
+
"bg-primary-500"
|
|
41
|
+
];
|
|
42
|
+
function level(value, max) {
|
|
43
|
+
if (value <= 0 || max <= 0) return 0;
|
|
44
|
+
return Math.min(4, Math.max(1, Math.ceil(value / max * 4)));
|
|
45
|
+
}
|
|
46
|
+
var CELL = "block h-3 w-3 rounded-sm";
|
|
47
|
+
var CalendarHeatmap = React__namespace.forwardRef(function CalendarHeatmap2({
|
|
48
|
+
data,
|
|
49
|
+
start,
|
|
50
|
+
end,
|
|
51
|
+
weekStartsOn = 0,
|
|
52
|
+
locale,
|
|
53
|
+
onDayClick,
|
|
54
|
+
labels: labelOverrides,
|
|
55
|
+
className,
|
|
56
|
+
...props
|
|
57
|
+
}, ref) {
|
|
58
|
+
const labels = { ...defaultCalendarHeatmapLabels, ...labelOverrides };
|
|
59
|
+
const loc = (d) => locale ? d.setLocale(locale) : d;
|
|
60
|
+
const cells = React__namespace.useRef(/* @__PURE__ */ new Map());
|
|
61
|
+
const [active, setActive] = React__namespace.useState(null);
|
|
62
|
+
const grid = React__namespace.useMemo(() => {
|
|
63
|
+
const parse = (iso) => {
|
|
64
|
+
const d = iso ? luxon.DateTime.fromISO(iso) : null;
|
|
65
|
+
return d?.isValid ? d.startOf("day") : null;
|
|
66
|
+
};
|
|
67
|
+
const end_ = parse(end) ?? luxon.DateTime.now().startOf("day");
|
|
68
|
+
const start_ = parse(start) ?? end_.minus({ weeks: 12 }).plus({ days: 1 });
|
|
69
|
+
const [first, last] = start_ <= end_ ? [start_, end_] : [end_, start_];
|
|
70
|
+
const origin = first.minus({
|
|
71
|
+
days: (first.weekday % 7 - weekStartsOn + 7) % 7
|
|
72
|
+
});
|
|
73
|
+
const weeks = Math.ceil(
|
|
74
|
+
(Math.round(last.diff(origin, "days").days) + 1) / 7
|
|
75
|
+
);
|
|
76
|
+
const values = /* @__PURE__ */ new Map();
|
|
77
|
+
for (const d of data) {
|
|
78
|
+
const key = luxon.DateTime.fromISO(d.date).toISODate();
|
|
79
|
+
if (key) values.set(key, (values.get(key) ?? 0) + d.value);
|
|
80
|
+
}
|
|
81
|
+
const days = Array.from(
|
|
82
|
+
{ length: weeks },
|
|
83
|
+
(_, w) => Array.from({ length: 7 }, (_2, r) => {
|
|
84
|
+
const date = origin.plus({ days: w * 7 + r });
|
|
85
|
+
const iso = date.toISODate();
|
|
86
|
+
const inRange2 = date >= first && date <= last;
|
|
87
|
+
return {
|
|
88
|
+
date,
|
|
89
|
+
iso,
|
|
90
|
+
inRange: inRange2,
|
|
91
|
+
value: inRange2 ? values.get(iso) ?? 0 : 0
|
|
92
|
+
};
|
|
93
|
+
})
|
|
94
|
+
);
|
|
95
|
+
const inRange = days.flat().filter((d) => d.inRange);
|
|
96
|
+
const max = Math.max(0, ...inRange.map((d) => d.value));
|
|
97
|
+
const total = inRange.reduce((sum, d) => sum + d.value, 0);
|
|
98
|
+
const activeDays = inRange.filter((d) => d.value > 0).length;
|
|
99
|
+
const months = [];
|
|
100
|
+
for (const week of days) {
|
|
101
|
+
const date = (week.find((d) => d.inRange) ?? week[0]).date;
|
|
102
|
+
const key = date.toFormat("yyyy-MM");
|
|
103
|
+
const prev = months[months.length - 1];
|
|
104
|
+
if (prev?.key === key) prev.span += 1;
|
|
105
|
+
else months.push({ key, date, span: 1 });
|
|
106
|
+
}
|
|
107
|
+
return { days, first, last, max, total, activeDays, months };
|
|
108
|
+
}, [data, start, end, weekStartsOn]);
|
|
109
|
+
const activeDate = active ? luxon.DateTime.fromISO(active) : null;
|
|
110
|
+
const focusable = activeDate && activeDate >= grid.first && activeDate <= grid.last ? active : grid.last.toISODate();
|
|
111
|
+
const onKeyDown = (e) => {
|
|
112
|
+
if (!focusable) return;
|
|
113
|
+
const rtl = getComputedStyle(e.currentTarget).direction === "rtl";
|
|
114
|
+
const delta = {
|
|
115
|
+
ArrowUp: -1,
|
|
116
|
+
ArrowDown: 1,
|
|
117
|
+
ArrowLeft: rtl ? 7 : -7,
|
|
118
|
+
ArrowRight: rtl ? -7 : 7
|
|
119
|
+
};
|
|
120
|
+
if (!delta[e.key]) return;
|
|
121
|
+
e.preventDefault();
|
|
122
|
+
const next = luxon.DateTime.fromISO(focusable).plus({ days: delta[e.key] });
|
|
123
|
+
if (next < grid.first || next > grid.last) return;
|
|
124
|
+
const iso = next.toISODate();
|
|
125
|
+
setActive(iso);
|
|
126
|
+
cells.current.get(iso)?.focus();
|
|
127
|
+
};
|
|
128
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
129
|
+
"div",
|
|
130
|
+
{
|
|
131
|
+
ref,
|
|
132
|
+
"data-slot": "calendar-heatmap",
|
|
133
|
+
className: chunkS5RVSXDV_cjs.cn("inline-flex max-w-full flex-col gap-2", className),
|
|
134
|
+
...props,
|
|
135
|
+
children: [
|
|
136
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
137
|
+
"table",
|
|
138
|
+
{
|
|
139
|
+
role: onDayClick ? "grid" : void 0,
|
|
140
|
+
"aria-label": labels.title,
|
|
141
|
+
className: "text-muted-foreground border-separate border-spacing-[3px] text-[10px] leading-none",
|
|
142
|
+
children: [
|
|
143
|
+
/* @__PURE__ */ jsxRuntime.jsx("caption", { className: "sr-only", children: labels.summary(grid.total, grid.activeDays) }),
|
|
144
|
+
/* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
|
|
145
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", {}),
|
|
146
|
+
grid.months.map((m) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
147
|
+
"th",
|
|
148
|
+
{
|
|
149
|
+
scope: "colgroup",
|
|
150
|
+
colSpan: m.span,
|
|
151
|
+
className: "pb-1 text-start font-normal whitespace-nowrap",
|
|
152
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: m.span < 2 ? "sr-only" : void 0, children: loc(m.date).toFormat("LLL") })
|
|
153
|
+
},
|
|
154
|
+
m.key
|
|
155
|
+
))
|
|
156
|
+
] }) }),
|
|
157
|
+
/* @__PURE__ */ jsxRuntime.jsx("tbody", { children: Array.from({ length: 7 }, (_, r) => /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
|
|
158
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { scope: "row", className: "pe-1 text-start font-normal", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: r % 2 === 1 ? void 0 : "sr-only", children: loc(grid.days[0][r].date).toFormat("ccc") }) }),
|
|
159
|
+
grid.days.map((week) => {
|
|
160
|
+
const day = week[r];
|
|
161
|
+
if (!day.inRange) return /* @__PURE__ */ jsxRuntime.jsx("td", {}, day.iso);
|
|
162
|
+
const label = labels.cellLabel(
|
|
163
|
+
loc(day.date).toLocaleString(
|
|
164
|
+
luxon.DateTime.DATE_MED_WITH_WEEKDAY
|
|
165
|
+
),
|
|
166
|
+
day.value,
|
|
167
|
+
day.iso
|
|
168
|
+
);
|
|
169
|
+
const swatch = chunkS5RVSXDV_cjs.cn(CELL, LEVELS[level(day.value, grid.max)]);
|
|
170
|
+
return /* @__PURE__ */ jsxRuntime.jsx("td", { className: "p-0", children: onDayClick ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
171
|
+
"button",
|
|
172
|
+
{
|
|
173
|
+
type: "button",
|
|
174
|
+
ref: (el) => {
|
|
175
|
+
if (el) cells.current.set(day.iso, el);
|
|
176
|
+
else cells.current.delete(day.iso);
|
|
177
|
+
},
|
|
178
|
+
title: label,
|
|
179
|
+
tabIndex: day.iso === focusable ? 0 : -1,
|
|
180
|
+
onFocus: () => setActive(day.iso),
|
|
181
|
+
onClick: () => onDayClick(day.iso),
|
|
182
|
+
onKeyDown,
|
|
183
|
+
className: chunkS5RVSXDV_cjs.cn(
|
|
184
|
+
swatch,
|
|
185
|
+
"focus-visible:outline-ring focus-visible:outline-2 focus-visible:outline-offset-1"
|
|
186
|
+
),
|
|
187
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: label })
|
|
188
|
+
}
|
|
189
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: swatch, title: label, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: label }) }) }, day.iso);
|
|
190
|
+
})
|
|
191
|
+
] }, r)) })
|
|
192
|
+
]
|
|
193
|
+
}
|
|
194
|
+
) }),
|
|
195
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
196
|
+
"div",
|
|
197
|
+
{
|
|
198
|
+
"aria-hidden": "true",
|
|
199
|
+
"data-slot": "calendar-heatmap-legend",
|
|
200
|
+
className: "text-muted-foreground flex items-center gap-1 self-end text-[10px]",
|
|
201
|
+
children: [
|
|
202
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "me-1", children: labels.less }),
|
|
203
|
+
LEVELS.map((cls) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkS5RVSXDV_cjs.cn(CELL, cls) }, cls)),
|
|
204
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ms-1", children: labels.more })
|
|
205
|
+
]
|
|
206
|
+
}
|
|
207
|
+
)
|
|
208
|
+
]
|
|
209
|
+
}
|
|
210
|
+
);
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
exports.CalendarHeatmap = CalendarHeatmap;
|
|
214
|
+
exports.defaultCalendarHeatmapLabels = defaultCalendarHeatmapLabels;
|
|
215
|
+
//# sourceMappingURL=chunk-A4W5CSK7.cjs.map
|
|
216
|
+
//# sourceMappingURL=chunk-A4W5CSK7.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/CalendarHeatmap/CalendarHeatmap.tsx"],"names":["React","CalendarHeatmap","DateTime","_","inRange","jsxs","cn","jsx"],"mappings":"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","file":"chunk-A4W5CSK7.cjs","sourcesContent":["import * as React from 'react';\nimport { DateTime } from 'luxon';\nimport { cn } from '../../utils/cn';\n\nexport interface CalendarHeatmapDatum {\n /** ISO date (or date-time) the value belongs to; same-day values are summed. */\n date: string;\n value: number;\n}\n\nexport interface CalendarHeatmapLabels {\n /** Accessible name of the table. */\n title: string;\n /** Accessible name and tooltip of a day cell. */\n cellLabel: (formattedDate: string, value: number, isoDate: string) => string;\n /** Visually hidden summary of the whole range. */\n summary: (total: number, activeDays: number) => string;\n /** Legend ends. */\n less: string;\n more: string;\n}\n\nexport const defaultCalendarHeatmapLabels: CalendarHeatmapLabels = {\n title: 'Activity calendar',\n cellLabel: (date, value) => `${date}: ${value}`,\n summary: (total, activeDays) =>\n `${total} total across ${activeDays} active ${activeDays === 1 ? 'day' : 'days'}`,\n less: 'Less',\n more: 'More',\n};\n\nexport interface CalendarHeatmapProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Values per day. */\n data: CalendarHeatmapDatum[];\n /** First day shown (ISO date). Defaults to 12 weeks before `end`. */\n start?: string;\n /** Last day shown (ISO date). Defaults to today. */\n end?: string;\n /** First day of each column: 0 = Sunday … 6 = Saturday. */\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n /** BCP 47 locale for month, weekday and date names. */\n locale?: string;\n /** Makes days focusable buttons (arrow-key navigable) reporting their ISO date. */\n onDayClick?: (date: string) => void;\n /** Overrides for any user-facing string. */\n labels?: Partial<CalendarHeatmapLabels>;\n}\n\nconst LEVELS = [\n 'bg-muted ring-1 ring-inset ring-border',\n 'bg-primary-500/25',\n 'bg-primary-500/50',\n 'bg-primary-500/75',\n 'bg-primary-500',\n];\n\nfunction level(value: number, max: number) {\n if (value <= 0 || max <= 0) return 0;\n return Math.min(4, Math.max(1, Math.ceil((value / max) * 4)));\n}\n\nconst CELL = 'block h-3 w-3 rounded-sm';\n\n/**\n * Contribution-style calendar: one column per week, one row per weekday, each\n * day tinted on a five-step primary scale.\n *\n * @example\n * ```tsx\n * <CalendarHeatmap data={activity} onDayClick={(date) => openDay(date)} />\n * ```\n */\nexport const CalendarHeatmap = React.forwardRef<\n HTMLDivElement,\n CalendarHeatmapProps\n>(function CalendarHeatmap(\n {\n data,\n start,\n end,\n weekStartsOn = 0,\n locale,\n onDayClick,\n labels: labelOverrides,\n className,\n ...props\n },\n ref\n) {\n const labels = { ...defaultCalendarHeatmapLabels, ...labelOverrides };\n const loc = (d: DateTime) => (locale ? d.setLocale(locale) : d);\n const cells = React.useRef(new Map<string, HTMLButtonElement>());\n const [active, setActive] = React.useState<string | null>(null);\n\n const grid = React.useMemo(() => {\n const parse = (iso?: string) => {\n const d = iso ? DateTime.fromISO(iso) : null;\n return d?.isValid ? d.startOf('day') : null;\n };\n const end_ = parse(end) ?? DateTime.now().startOf('day');\n const start_ = parse(start) ?? end_.minus({ weeks: 12 }).plus({ days: 1 });\n // A reversed range is swapped so there is always at least one day.\n const [first, last] = start_ <= end_ ? [start_, end_] : [end_, start_];\n const origin = first.minus({\n days: ((first.weekday % 7) - weekStartsOn + 7) % 7,\n });\n const weeks = Math.ceil(\n (Math.round(last.diff(origin, 'days').days) + 1) / 7\n );\n\n const values = new Map<string, number>();\n for (const d of data) {\n const key = DateTime.fromISO(d.date).toISODate();\n if (key) values.set(key, (values.get(key) ?? 0) + d.value);\n }\n\n const days = Array.from({ length: weeks }, (_, w) =>\n Array.from({ length: 7 }, (_, r) => {\n const date = origin.plus({ days: w * 7 + r });\n const iso = date.toISODate()!;\n const inRange = date >= first && date <= last;\n return {\n date,\n iso,\n inRange,\n value: inRange ? (values.get(iso) ?? 0) : 0,\n };\n })\n );\n const inRange = days.flat().filter((d) => d.inRange);\n const max = Math.max(0, ...inRange.map((d) => d.value));\n const total = inRange.reduce((sum, d) => sum + d.value, 0);\n const activeDays = inRange.filter((d) => d.value > 0).length;\n\n // Consecutive weeks grouped by the month of their first in-range day.\n const months: { key: string; date: DateTime; span: number }[] = [];\n for (const week of days) {\n const date = (week.find((d) => d.inRange) ?? week[0]).date;\n const key = date.toFormat('yyyy-MM');\n const prev = months[months.length - 1];\n if (prev?.key === key) prev.span += 1;\n else months.push({ key, date, span: 1 });\n }\n\n return { days, first, last, max, total, activeDays, months };\n }, [data, start, end, weekStartsOn]);\n\n const activeDate = active ? DateTime.fromISO(active) : null;\n // Keep one tab stop even when the range changes and drops the active day.\n const focusable =\n activeDate && activeDate >= grid.first && activeDate <= grid.last\n ? active\n : grid.last.toISODate();\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (!focusable) return;\n const rtl = getComputedStyle(e.currentTarget).direction === 'rtl';\n const delta: Record<string, number> = {\n ArrowUp: -1,\n ArrowDown: 1,\n ArrowLeft: rtl ? 7 : -7,\n ArrowRight: rtl ? -7 : 7,\n };\n if (!delta[e.key]) return;\n e.preventDefault();\n const next = DateTime.fromISO(focusable).plus({ days: delta[e.key] });\n if (next < grid.first || next > grid.last) return;\n const iso = next.toISODate()!;\n setActive(iso);\n cells.current.get(iso)?.focus();\n };\n\n return (\n <div\n ref={ref}\n data-slot=\"calendar-heatmap\"\n className={cn('inline-flex max-w-full flex-col gap-2', className)}\n {...props}\n >\n <div className=\"overflow-x-auto\">\n <table\n role={onDayClick ? 'grid' : undefined}\n aria-label={labels.title}\n className=\"text-muted-foreground border-separate border-spacing-[3px] text-[10px] leading-none\"\n >\n <caption className=\"sr-only\">\n {labels.summary(grid.total, grid.activeDays)}\n </caption>\n <thead>\n <tr>\n <td />\n {grid.months.map((m) => (\n <th\n key={m.key}\n scope=\"colgroup\"\n colSpan={m.span}\n className=\"pb-1 text-start font-normal whitespace-nowrap\"\n >\n <span className={m.span < 2 ? 'sr-only' : undefined}>\n {loc(m.date).toFormat('LLL')}\n </span>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {Array.from({ length: 7 }, (_, r) => (\n <tr key={r}>\n <th scope=\"row\" className=\"pe-1 text-start font-normal\">\n <span className={r % 2 === 1 ? undefined : 'sr-only'}>\n {loc(grid.days[0][r].date).toFormat('ccc')}\n </span>\n </th>\n {grid.days.map((week) => {\n const day = week[r];\n if (!day.inRange) return <td key={day.iso} />;\n const label = labels.cellLabel(\n loc(day.date).toLocaleString(\n DateTime.DATE_MED_WITH_WEEKDAY\n ),\n day.value,\n day.iso\n );\n const swatch = cn(CELL, LEVELS[level(day.value, grid.max)]);\n return (\n <td key={day.iso} className=\"p-0\">\n {onDayClick ? (\n <button\n type=\"button\"\n ref={(el) => {\n if (el) cells.current.set(day.iso, el);\n else cells.current.delete(day.iso);\n }}\n title={label}\n tabIndex={day.iso === focusable ? 0 : -1}\n onFocus={() => setActive(day.iso)}\n onClick={() => onDayClick(day.iso)}\n onKeyDown={onKeyDown}\n className={cn(\n swatch,\n 'focus-visible:outline-ring focus-visible:outline-2 focus-visible:outline-offset-1'\n )}\n >\n <span className=\"sr-only\">{label}</span>\n </button>\n ) : (\n <span className={swatch} title={label}>\n <span className=\"sr-only\">{label}</span>\n </span>\n )}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n <div\n aria-hidden=\"true\"\n data-slot=\"calendar-heatmap-legend\"\n className=\"text-muted-foreground flex items-center gap-1 self-end text-[10px]\"\n >\n <span className=\"me-1\">{labels.less}</span>\n {LEVELS.map((cls) => (\n <span key={cls} className={cn(CELL, cls)} />\n ))}\n <span className=\"ms-1\">{labels.more}</span>\n </div>\n </div>\n );\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-AMYFRY7K.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Button/button-critical.ts","../src/components/Button/Button.tsx"],"names":["React","jsx","cn","buttonVariants","jsxs","Fragment"],"mappings":"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","file":"chunk-X6A27RGO.cjs","sourcesContent":["/**\n * Self-healing structural CSS for Button.\n *\n * Button layout relies on Tailwind utilities (`inline-flex`,\n * `whitespace-nowrap`, ...). Consumer apps with a stale safelist copy or a\n * missing `@source` line never generate those classes, so the button falls\n * back to `inline-block` and the icon stacks above the label.\n *\n * Injecting these rules from the component guarantees every consumer gets\n * correct button structure just by upgrading the library — no app-side\n * changes required.\n *\n * Override safety, by consumer setup:\n * - Tailwind 4: utilities live in `@layer utilities`. The structural rules\n * below join that same layer, so conflicts resolve by specificity — and\n * every selector is wrapped in `:where()` (zero specificity), so real\n * utilities (`hidden`, `gap-0`, ...) always win. (A new layer name can't\n * be used: layers declared later outrank `utilities`.)\n * - Tailwind 3 / no Tailwind: consumer CSS is unlayered, and unlayered\n * always beats layered, so the structural rules stay a pure fallback.\n */\n\nconst STYLE_ID = 'mieweb-ui-button-critical';\n\nconst CRITICAL_CSS = [\n '@layer utilities{',\n // Structure: keep icon + label on one line (matches the base utilities\n // inline-flex items-center justify-center gap-2 min-w-0 whitespace-nowrap).\n `:where(button[data-slot='button']){display:inline-flex;flex-wrap:nowrap;align-items:center;justify-content:center;gap:0.5rem;min-width:0;white-space:nowrap;}`,\n // Icons and the loading spinner never shrink (matches shrink-0).\n `:where(button[data-slot='button']) > :where([data-slot='button-icon'],svg){flex-shrink:0;}`,\n // Label truncates instead of wrapping/overflowing (matches truncate).\n `:where(button[data-slot='button']) > :where([data-slot='button-label']){min-width:0;overflow:hidden;text-overflow:ellipsis;}`,\n '}',\n // Icons passed as children land inside the label span; Tailwind preflight\n // makes SVGs display:block, which forces line breaks inside the inline\n // label. Restore inline flow. This rule is deliberately UNLAYERED at\n // specificity (0,2,2): it must beat Tailwind 3's unlayered preflight\n // `svg{display:block}` (0,0,1) — layering it would neuter the fix for\n // exactly the broken-TW3 apps it exists for. It also outranks the\n // (0,1,1) [&_svg]:inline-block utility on the label, but both declare\n // the same values, so they never conflict. Known tradeoff:\n // display utilities on an SVG inside the label slot won't win; consumers\n // should conditionally render icons instead.\n `button[data-slot='button'] [data-slot='button-label'] svg{display:inline-block;vertical-align:middle;}`,\n].join('');\n\n/** Injects the critical Button styles once per document. SSR-safe. */\nexport function injectButtonCriticalStyles(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById(STYLE_ID)) return;\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = CRITICAL_CSS;\n document.head.appendChild(style);\n}\n","import * as React from 'react';\nimport type { VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { injectButtonCriticalStyles } from './button-critical';\nimport { buttonVariants } from './button-variants';\n\n/**\n * Label wrapper classes. Icons passed as `children` (rather than\n * leftIcon/rightIcon) land inside this span; preflight makes SVGs\n * display:block which would force line breaks inside the inline span,\n * so restore inline flow for them.\n */\nconst labelClasses = 'truncate [&_svg]:inline-block [&_svg]:align-middle';\n\nexport interface ButtonProps\n extends\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n /** Optional icon element to render before the button text */\n leftIcon?: React.ReactElement | null;\n /** Optional icon element to render after the button text */\n rightIcon?: React.ReactElement | null;\n /** Shows a loading spinner and disables the button */\n isLoading?: boolean;\n /** Accessible label for the loading state */\n loadingText?: string;\n}\n\n/**\n * A versatile button component with multiple variants and sizes.\n *\n * @example\n * ```tsx\n * <Button variant=\"primary\" size=\"md\">Click me</Button>\n * <Button variant=\"danger\" leftIcon={<TrashIcon />}>Delete</Button>\n * <Button variant=\"ghost\" isLoading loadingText=\"Saving...\">Save</Button>\n * <Button effect=\"sheen\">Request a demo</Button>\n * <Button variant=\"outline\" effect=\"orbit\">Watch the film</Button>\n * ```\n */\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant,\n size,\n fullWidth,\n effect,\n leftIcon,\n rightIcon,\n isLoading,\n loadingText,\n disabled,\n children,\n title,\n ...props\n },\n ref\n ) => {\n const resolvedSize = size ?? 'md';\n const labelRef = React.useRef<HTMLSpanElement>(null);\n const innerRef = React.useRef<HTMLButtonElement>(null);\n React.useImperativeHandle(ref, () => innerRef.current as HTMLButtonElement);\n\n // Guarantees correct icon/label layout even when the consumer's Tailwind\n // build is missing our utility classes. See button-critical.ts.\n React.useInsertionEffect(() => {\n injectButtonCriticalStyles();\n }, []);\n\n // When the label truncates, expose the full text as a native tooltip.\n // A consumer-provided `title` always takes precedence.\n React.useLayoutEffect(() => {\n const label = labelRef.current;\n const button = innerRef.current;\n if (!label || !button || title !== undefined) return;\n\n const update = () => {\n if (label.scrollWidth > label.clientWidth) {\n button.title = label.textContent ?? '';\n } else {\n button.removeAttribute('title');\n }\n };\n\n update();\n if (typeof globalThis.ResizeObserver === 'undefined') return;\n const observer = new globalThis.ResizeObserver(update);\n observer.observe(label);\n return () => observer.disconnect();\n }, [title, children, isLoading, loadingText]);\n\n return (\n <button\n data-slot=\"button\"\n data-size={resolvedSize}\n data-variant={variant ?? 'primary'}\n className={cn(\n buttonVariants({ variant, size: resolvedSize, fullWidth, effect }),\n className\n )}\n ref={innerRef}\n disabled={disabled || isLoading}\n aria-busy={isLoading}\n title={title}\n {...props}\n >\n {isLoading ? (\n <>\n <LoadingSpinner />\n <span\n ref={labelRef}\n data-slot=\"button-label\"\n className={labelClasses}\n >\n {loadingText || children}\n </span>\n </>\n ) : (\n <>\n {React.isValidElement(leftIcon) && (\n <span data-slot=\"button-icon\" className=\"shrink-0\">\n {leftIcon}\n </span>\n )}\n <span\n ref={labelRef}\n data-slot=\"button-label\"\n className={labelClasses}\n >\n {children}\n </span>\n {React.isValidElement(rightIcon) && (\n <span data-slot=\"button-icon\" className=\"shrink-0\">\n {rightIcon}\n </span>\n )}\n </>\n )}\n </button>\n );\n }\n);\n\nButton.displayName = 'Button';\n\n/**\n * Simple loading spinner for the button\n */\nfunction LoadingSpinner() {\n return (\n <svg\n className=\"h-4 w-4 shrink-0 animate-spin\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n );\n}\n\nexport { Button, buttonVariants };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Button/button-critical.ts","../src/components/Button/Button.tsx"],"names":["React","jsx","cn","buttonVariants","jsxs","Fragment"],"mappings":"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","file":"chunk-ANMX7YDL.cjs","sourcesContent":["/**\n * Self-healing structural CSS for Button.\n *\n * Button layout relies on Tailwind utilities (`inline-flex`,\n * `whitespace-nowrap`, ...). Consumer apps with a stale safelist copy or a\n * missing `@source` line never generate those classes, so the button falls\n * back to `inline-block` and the icon stacks above the label.\n *\n * Injecting these rules from the component guarantees every consumer gets\n * correct button structure just by upgrading the library — no app-side\n * changes required.\n *\n * Override safety, by consumer setup:\n * - Tailwind 4: utilities live in `@layer utilities`. The structural rules\n * below join that same layer, so conflicts resolve by specificity — and\n * every selector is wrapped in `:where()` (zero specificity), so real\n * utilities (`hidden`, `gap-0`, ...) always win. (A new layer name can't\n * be used: layers declared later outrank `utilities`.)\n * - Tailwind 3 / no Tailwind: consumer CSS is unlayered, and unlayered\n * always beats layered, so the structural rules stay a pure fallback.\n */\n\nconst STYLE_ID = 'mieweb-ui-button-critical';\n\nconst CRITICAL_CSS = [\n '@layer utilities{',\n // Structure: keep icon + label on one line (matches the base utilities\n // inline-flex items-center justify-center gap-2 min-w-0 whitespace-nowrap).\n `:where(button[data-slot='button']){display:inline-flex;flex-wrap:nowrap;align-items:center;justify-content:center;gap:0.5rem;min-width:0;white-space:nowrap;}`,\n // Icons and the loading spinner never shrink (matches shrink-0).\n `:where(button[data-slot='button']) > :where([data-slot='button-icon'],svg){flex-shrink:0;}`,\n // Label truncates instead of wrapping/overflowing (matches truncate).\n `:where(button[data-slot='button']) > :where([data-slot='button-label']){min-width:0;overflow:hidden;text-overflow:ellipsis;}`,\n '}',\n // Icons passed as children land inside the label span; Tailwind preflight\n // makes SVGs display:block, which forces line breaks inside the inline\n // label. Restore inline flow. This rule is deliberately UNLAYERED at\n // specificity (0,2,2): it must beat Tailwind 3's unlayered preflight\n // `svg{display:block}` (0,0,1) — layering it would neuter the fix for\n // exactly the broken-TW3 apps it exists for. It also outranks the\n // (0,1,1) [&_svg]:inline-block utility on the label, but both declare\n // the same values, so they never conflict. Known tradeoff:\n // display utilities on an SVG inside the label slot won't win; consumers\n // should conditionally render icons instead.\n `button[data-slot='button'] [data-slot='button-label'] svg{display:inline-block;vertical-align:middle;}`,\n].join('');\n\n/** Injects the critical Button styles once per document. SSR-safe. */\nexport function injectButtonCriticalStyles(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById(STYLE_ID)) return;\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = CRITICAL_CSS;\n document.head.appendChild(style);\n}\n","import * as React from 'react';\nimport type { VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { injectButtonCriticalStyles } from './button-critical';\nimport { buttonVariants } from './button-variants';\n\n/**\n * Label wrapper classes. Icons passed as `children` (rather than\n * leftIcon/rightIcon) land inside this span; preflight makes SVGs\n * display:block which would force line breaks inside the inline span,\n * so restore inline flow for them.\n */\nconst labelClasses = 'truncate [&_svg]:inline-block [&_svg]:align-middle';\n\nexport interface ButtonProps\n extends\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n /** Optional icon element to render before the button text */\n leftIcon?: React.ReactElement | null;\n /** Optional icon element to render after the button text */\n rightIcon?: React.ReactElement | null;\n /** Shows a loading spinner and disables the button */\n isLoading?: boolean;\n /** Accessible label for the loading state */\n loadingText?: string;\n}\n\n/**\n * A versatile button component with multiple variants and sizes.\n *\n * @example\n * ```tsx\n * <Button variant=\"primary\" size=\"md\">Click me</Button>\n * <Button variant=\"danger\" leftIcon={<TrashIcon />}>Delete</Button>\n * <Button variant=\"ghost\" isLoading loadingText=\"Saving...\">Save</Button>\n * <Button effect=\"sheen\">Request a demo</Button>\n * <Button variant=\"outline\" effect=\"orbit\">Watch the film</Button>\n * ```\n */\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant,\n size,\n fullWidth,\n effect,\n leftIcon,\n rightIcon,\n isLoading,\n loadingText,\n disabled,\n children,\n title,\n ...props\n },\n ref\n ) => {\n const resolvedSize = size ?? 'md';\n const labelRef = React.useRef<HTMLSpanElement>(null);\n const innerRef = React.useRef<HTMLButtonElement>(null);\n React.useImperativeHandle(ref, () => innerRef.current as HTMLButtonElement);\n\n // Guarantees correct icon/label layout even when the consumer's Tailwind\n // build is missing our utility classes. See button-critical.ts.\n React.useInsertionEffect(() => {\n injectButtonCriticalStyles();\n }, []);\n\n // When the label truncates, expose the full text as a native tooltip.\n // A consumer-provided `title` always takes precedence.\n React.useLayoutEffect(() => {\n const label = labelRef.current;\n const button = innerRef.current;\n if (!label || !button || title !== undefined) return;\n\n const update = () => {\n if (label.scrollWidth > label.clientWidth) {\n button.title = label.textContent ?? '';\n } else {\n button.removeAttribute('title');\n }\n };\n\n update();\n if (typeof globalThis.ResizeObserver === 'undefined') return;\n const observer = new globalThis.ResizeObserver(update);\n observer.observe(label);\n return () => observer.disconnect();\n }, [title, children, isLoading, loadingText]);\n\n return (\n <button\n data-slot=\"button\"\n data-size={resolvedSize}\n data-variant={variant ?? 'primary'}\n className={cn(\n buttonVariants({ variant, size: resolvedSize, fullWidth, effect }),\n className\n )}\n ref={innerRef}\n disabled={disabled || isLoading}\n aria-busy={isLoading}\n title={title}\n {...props}\n >\n {isLoading ? (\n <>\n <LoadingSpinner />\n <span\n ref={labelRef}\n data-slot=\"button-label\"\n className={labelClasses}\n >\n {loadingText || children}\n </span>\n </>\n ) : (\n <>\n {React.isValidElement(leftIcon) && (\n <span data-slot=\"button-icon\" className=\"shrink-0\">\n {leftIcon}\n </span>\n )}\n <span\n ref={labelRef}\n data-slot=\"button-label\"\n className={labelClasses}\n >\n {children}\n </span>\n {React.isValidElement(rightIcon) && (\n <span data-slot=\"button-icon\" className=\"shrink-0\">\n {rightIcon}\n </span>\n )}\n </>\n )}\n </button>\n );\n }\n);\n\nButton.displayName = 'Button';\n\n/**\n * Simple loading spinner for the button\n */\nfunction LoadingSpinner() {\n return (\n <svg\n className=\"h-4 w-4 shrink-0 animate-spin\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n );\n}\n\nexport { Button, buttonVariants };\n"]}
|