@mieweb/ui 0.10.0-dev.9 → 0.11.0-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/agent/mieweb-ui.instructions.md +77 -0
- package/dist/CsvBlock-CFXSDPBI.js +9 -0
- package/dist/{CsvBlock-UWPMTLE2.js.map → CsvBlock-CFXSDPBI.js.map} +1 -1
- package/dist/CsvBlock-RGO7JXHJ.cjs +18 -0
- package/dist/{CsvBlock-ROJCKJDP.cjs.map → CsvBlock-RGO7JXHJ.cjs.map} +1 -1
- package/dist/HtmlPreviewBlock-VBYXCXVT.cjs +18 -0
- package/dist/{HtmlPreviewBlock-DWFN6EUB.cjs.map → HtmlPreviewBlock-VBYXCXVT.cjs.map} +1 -1
- package/dist/HtmlPreviewBlock-Z2GCK325.js +9 -0
- package/dist/{HtmlPreviewBlock-ME5U3XNS.js.map → HtmlPreviewBlock-Z2GCK325.js.map} +1 -1
- package/dist/MermaidBlock-I2R2BQOX.cjs +18 -0
- package/dist/{MermaidBlock-D2UC5M55.cjs.map → MermaidBlock-I2R2BQOX.cjs.map} +1 -1
- package/dist/MermaidBlock-XCAK7IA5.js +9 -0
- package/dist/{MermaidBlock-2B6CPD6Y.js.map → MermaidBlock-XCAK7IA5.js.map} +1 -1
- package/dist/SurveyBlock-KI5JOWCL.js +9 -0
- package/dist/{SurveyBlock-4DO62RBT.js.map → SurveyBlock-KI5JOWCL.js.map} +1 -1
- package/dist/SurveyBlock-UKSGISRT.cjs +18 -0
- package/dist/{SurveyBlock-4CD4AYMJ.cjs.map → SurveyBlock-UKSGISRT.cjs.map} +1 -1
- package/dist/ag-grid.d.cts +142 -1
- package/dist/ag-grid.d.ts +142 -1
- package/dist/brands/bluehive.cjs +3 -3
- package/dist/brands/bluehive.css +3 -0
- package/dist/brands/bluehive.js +1 -1
- package/dist/brands/index.cjs +17 -17
- package/dist/brands/index.js +4 -4
- package/dist/{chunk-JYZW2PZS.cjs → chunk-254QK722.cjs} +7 -7
- package/dist/chunk-254QK722.cjs.map +1 -0
- package/dist/{chunk-4IS3QCOQ.cjs → chunk-2FZYZ4HT.cjs} +4 -3
- package/dist/chunk-2FZYZ4HT.cjs.map +1 -0
- package/dist/{chunk-VPIYTQCV.cjs → chunk-2I4IRQQG.cjs} +12 -5
- package/dist/chunk-2I4IRQQG.cjs.map +1 -0
- package/dist/{chunk-IT775BYG.js → chunk-2W73UQ3T.js} +4 -3
- package/dist/chunk-2W73UQ3T.js.map +1 -0
- package/dist/chunk-2X54ZLT6.js +874 -0
- package/dist/chunk-2X54ZLT6.js.map +1 -0
- package/dist/{chunk-5MCBWTIF.cjs → chunk-32ZCJOSR.cjs} +4 -4
- package/dist/{chunk-5MCBWTIF.cjs.map → chunk-32ZCJOSR.cjs.map} +1 -1
- package/dist/{chunk-WNJRS7Y7.cjs → chunk-3ZWCIPFT.cjs} +4 -2
- package/dist/chunk-3ZWCIPFT.cjs.map +1 -0
- package/dist/chunk-434L5RYF.js +314 -0
- package/dist/chunk-434L5RYF.js.map +1 -0
- package/dist/{chunk-TPWKM7JH.js → chunk-43K7OQ3E.js} +3 -3
- package/dist/{chunk-TPWKM7JH.js.map → chunk-43K7OQ3E.js.map} +1 -1
- package/dist/chunk-47P5QLX4.cjs +42 -0
- package/dist/chunk-47P5QLX4.cjs.map +1 -0
- package/dist/{chunk-CR2SDI23.cjs → chunk-4QYYWYFD.cjs} +8 -7
- package/dist/chunk-4QYYWYFD.cjs.map +1 -0
- package/dist/{chunk-76TBQDED.js → chunk-4RI3CQGE.js} +6 -6
- package/dist/{chunk-76TBQDED.js.map → chunk-4RI3CQGE.js.map} +1 -1
- package/dist/chunk-4ZB7RSMY.cjs +306 -0
- package/dist/chunk-4ZB7RSMY.cjs.map +1 -0
- package/dist/chunk-522WJIVI.js +99 -0
- package/dist/chunk-522WJIVI.js.map +1 -0
- package/dist/chunk-56VTM4OX.js +261 -0
- package/dist/chunk-56VTM4OX.js.map +1 -0
- package/dist/chunk-5HKZR6UG.js +248 -0
- package/dist/chunk-5HKZR6UG.js.map +1 -0
- package/dist/chunk-6BNZLN4B.cjs +548 -0
- package/dist/chunk-6BNZLN4B.cjs.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-YQDA366U.js → chunk-753ENNB6.js} +2 -2
- package/dist/{chunk-YQDA366U.js.map → chunk-753ENNB6.js.map} +1 -1
- package/dist/{chunk-N6IY47YA.cjs → chunk-7C5W744U.cjs} +8 -8
- package/dist/{chunk-N6IY47YA.cjs.map → chunk-7C5W744U.cjs.map} +1 -1
- package/dist/chunk-7E46YDOT.cjs +122 -0
- package/dist/chunk-7E46YDOT.cjs.map +1 -0
- 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-KZFBQ7GY.js → chunk-7QW6TU4X.js} +3 -3
- package/dist/{chunk-KZFBQ7GY.js.map → chunk-7QW6TU4X.js.map} +1 -1
- package/dist/{chunk-MWVW4APN.cjs → chunk-7UTBDFFL.cjs} +4 -4
- package/dist/{chunk-MWVW4APN.cjs.map → chunk-7UTBDFFL.cjs.map} +1 -1
- package/dist/chunk-7WJ6MBF5.cjs +47 -0
- package/dist/chunk-7WJ6MBF5.cjs.map +1 -0
- package/dist/{chunk-FJ7YPVKV.js → chunk-7X6R3JIA.js} +3 -3
- package/dist/{chunk-FJ7YPVKV.js.map → chunk-7X6R3JIA.js.map} +1 -1
- package/dist/chunk-A4W5CSK7.cjs +216 -0
- package/dist/chunk-A4W5CSK7.cjs.map +1 -0
- package/dist/{chunk-2G75X6TS.cjs → chunk-AHHFFXJR.cjs} +3 -3
- package/dist/{chunk-2G75X6TS.cjs.map → chunk-AHHFFXJR.cjs.map} +1 -1
- package/dist/chunk-AJPFQF3H.cjs +896 -0
- package/dist/chunk-AJPFQF3H.cjs.map +1 -0
- package/dist/chunk-AMYFRY7K.js +3 -0
- package/dist/chunk-AMYFRY7K.js.map +1 -0
- package/dist/{chunk-VNYW4C4J.cjs → chunk-ANMX7YDL.cjs} +4 -84
- package/dist/chunk-ANMX7YDL.cjs.map +1 -0
- package/dist/chunk-ARIJ5OHW.cjs +139 -0
- package/dist/chunk-ARIJ5OHW.cjs.map +1 -0
- package/dist/{chunk-GD7EBGC4.cjs → chunk-ATRW3J5Z.cjs} +49 -19
- package/dist/chunk-ATRW3J5Z.cjs.map +1 -0
- package/dist/chunk-BJ6ABRSQ.cjs +256 -0
- package/dist/chunk-BJ6ABRSQ.cjs.map +1 -0
- package/dist/{chunk-G3JX3UAU.cjs → chunk-BWSZ2BHJ.cjs} +6 -6
- package/dist/{chunk-G3JX3UAU.cjs.map → chunk-BWSZ2BHJ.cjs.map} +1 -1
- package/dist/chunk-BXRQ6HEP.cjs +4 -0
- package/dist/chunk-BXRQ6HEP.cjs.map +1 -0
- package/dist/chunk-CBBKWRLG.js +213 -0
- package/dist/chunk-CBBKWRLG.js.map +1 -0
- package/dist/{chunk-UAMXCMST.cjs → chunk-CFI3TQMA.cjs} +3 -3
- package/dist/{chunk-UAMXCMST.cjs.map → chunk-CFI3TQMA.cjs.map} +1 -1
- package/dist/chunk-CLQW724U.cjs +271 -0
- package/dist/chunk-CLQW724U.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-DGHS5IVD.js +305 -0
- package/dist/chunk-DGHS5IVD.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-DXEPYK3I.cjs +92 -0
- package/dist/chunk-DXEPYK3I.cjs.map +1 -0
- package/dist/chunk-DXFP53KF.js +283 -0
- package/dist/chunk-DXFP53KF.js.map +1 -0
- package/dist/chunk-EACNRR3C.cjs +4 -0
- package/dist/chunk-EACNRR3C.cjs.map +1 -0
- package/dist/{chunk-TVTIGV7Q.js → chunk-EBKE4DLU.js} +18 -11
- package/dist/chunk-EBKE4DLU.js.map +1 -0
- package/dist/{chunk-ASSDGS4F.cjs → chunk-ECYIDXG6.cjs} +254 -4
- package/dist/chunk-ECYIDXG6.cjs.map +1 -0
- package/dist/chunk-EGPDT7SM.js +195 -0
- package/dist/chunk-EGPDT7SM.js.map +1 -0
- package/dist/chunk-EPCUPHEO.js +193 -0
- package/dist/chunk-EPCUPHEO.js.map +1 -0
- package/dist/{chunk-7ZXAQTV4.cjs → chunk-ERACGSDY.cjs} +8 -8
- package/dist/{chunk-7ZXAQTV4.cjs.map → chunk-ERACGSDY.cjs.map} +1 -1
- package/dist/{chunk-XCP454Q6.js → chunk-F4N67NAF.js} +12 -3
- package/dist/chunk-F4N67NAF.js.map +1 -0
- package/dist/{chunk-WGPLUCBD.js → chunk-F6W62K4J.js} +4 -4
- package/dist/{chunk-WGPLUCBD.js.map → chunk-F6W62K4J.js.map} +1 -1
- package/dist/{chunk-XVW5DPPP.js → chunk-F7SZSOB3.js} +4 -3
- package/dist/chunk-F7SZSOB3.js.map +1 -0
- package/dist/chunk-FBCDYTWM.js +385 -0
- package/dist/chunk-FBCDYTWM.js.map +1 -0
- package/dist/{chunk-KQUI4BGS.cjs → chunk-FBN2VHUV.cjs} +68 -61
- package/dist/chunk-FBN2VHUV.cjs.map +1 -0
- package/dist/{chunk-V7D3YGUV.js → chunk-FGLIP6YR.js} +4 -4
- package/dist/{chunk-V7D3YGUV.js.map → chunk-FGLIP6YR.js.map} +1 -1
- package/dist/{chunk-VU6UTJRM.js → chunk-FIKO4WR6.js} +3 -3
- package/dist/{chunk-VU6UTJRM.js.map → chunk-FIKO4WR6.js.map} +1 -1
- package/dist/{chunk-OD47TTAW.cjs → chunk-FMEA6WAY.cjs} +9 -9
- package/dist/{chunk-OD47TTAW.cjs.map → chunk-FMEA6WAY.cjs.map} +1 -1
- package/dist/chunk-FSGJXCBG.cjs +318 -0
- package/dist/chunk-FSGJXCBG.cjs.map +1 -0
- package/dist/chunk-FSWHZY3T.cjs +328 -0
- package/dist/chunk-FSWHZY3T.cjs.map +1 -0
- package/dist/chunk-FTEZNCRI.js +29 -0
- package/dist/chunk-FTEZNCRI.js.map +1 -0
- 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-URAQIF67.cjs → chunk-GM32IDVL.cjs} +6 -6
- package/dist/{chunk-URAQIF67.cjs.map → chunk-GM32IDVL.cjs.map} +1 -1
- package/dist/chunk-GVM6DTR5.js +90 -0
- package/dist/chunk-GVM6DTR5.js.map +1 -0
- package/dist/{chunk-SQHMGT4W.js → chunk-GW4RFJZ5.js} +7 -7
- package/dist/chunk-GW4RFJZ5.js.map +1 -0
- package/dist/chunk-GY5SP4ST.js +3 -0
- package/dist/chunk-GY5SP4ST.js.map +1 -0
- package/dist/{chunk-OCSCBB52.cjs → chunk-GYXSF6BJ.cjs} +10 -10
- package/dist/{chunk-OCSCBB52.cjs.map → chunk-GYXSF6BJ.cjs.map} +1 -1
- package/dist/chunk-H2Y7HZV5.js +3 -0
- package/dist/chunk-H2Y7HZV5.js.map +1 -0
- package/dist/chunk-H3P7POFC.cjs +337 -0
- package/dist/chunk-H3P7POFC.cjs.map +1 -0
- package/dist/{chunk-JID7AZTO.cjs → chunk-H3ROMJYI.cjs} +4 -4
- package/dist/{chunk-JID7AZTO.cjs.map → chunk-H3ROMJYI.cjs.map} +1 -1
- package/dist/{chunk-462XSCP3.cjs → chunk-HCIXGFWR.cjs} +4 -4
- package/dist/{chunk-462XSCP3.cjs.map → chunk-HCIXGFWR.cjs.map} +1 -1
- package/dist/{chunk-H4ZXMQQW.js → chunk-HDY7YQFX.js} +3 -3
- package/dist/{chunk-H4ZXMQQW.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-NV2CWBI2.cjs → chunk-IEY3ZJIT.cjs} +12 -3
- package/dist/chunk-IEY3ZJIT.cjs.map +1 -0
- package/dist/chunk-IEZXJWHJ.cjs +306 -0
- package/dist/chunk-IEZXJWHJ.cjs.map +1 -0
- package/dist/{chunk-3QEVGSFG.cjs → chunk-IGDO62KR.cjs} +5 -5
- package/dist/{chunk-3QEVGSFG.cjs.map → chunk-IGDO62KR.cjs.map} +1 -1
- 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-2IZLKPUW.js → chunk-J2CKXXOW.js} +27 -6
- package/dist/chunk-J2CKXXOW.js.map +1 -0
- package/dist/{chunk-VILW53UZ.js → chunk-JMAZ2GKT.js} +3 -3
- package/dist/{chunk-VILW53UZ.js.map → chunk-JMAZ2GKT.js.map} +1 -1
- package/dist/{chunk-WWJIW2IH.cjs → chunk-JSXIB6EJ.cjs} +4 -4
- package/dist/{chunk-WWJIW2IH.cjs.map → chunk-JSXIB6EJ.cjs.map} +1 -1
- package/dist/{chunk-KRU6IGV7.js → chunk-JUJGWUAN.js} +28 -6
- package/dist/chunk-JUJGWUAN.js.map +1 -0
- package/dist/{chunk-FXO5ARBB.cjs → chunk-KDW6BD4O.cjs} +4 -4
- package/dist/{chunk-FXO5ARBB.cjs.map → chunk-KDW6BD4O.cjs.map} +1 -1
- package/dist/{chunk-Z5V7SAZ4.js → chunk-KFEN2SRZ.js} +3 -3
- package/dist/{chunk-Z5V7SAZ4.js.map → chunk-KFEN2SRZ.js.map} +1 -1
- package/dist/chunk-KIVEYQGA.cjs +319 -0
- package/dist/chunk-KIVEYQGA.cjs.map +1 -0
- package/dist/{chunk-XEAT7XJG.cjs → chunk-KQ6GLYFZ.cjs} +29 -13
- package/dist/chunk-KQ6GLYFZ.cjs.map +1 -0
- package/dist/{chunk-4A3W4TQF.js → chunk-KVTKSPX5.js} +254 -4
- package/dist/chunk-KVTKSPX5.js.map +1 -0
- package/dist/{chunk-6EN3IQQI.cjs → chunk-L5Y52F2E.cjs} +9 -9
- package/dist/chunk-L5Y52F2E.cjs.map +1 -0
- package/dist/chunk-L6K4PRZK.cjs +4 -0
- package/dist/chunk-L6K4PRZK.cjs.map +1 -0
- package/dist/chunk-LAN5VWGC.js +2540 -0
- package/dist/chunk-LAN5VWGC.js.map +1 -0
- package/dist/{chunk-7ZDPD5ZX.cjs → chunk-LC3JL2HB.cjs} +11 -7
- package/dist/chunk-LC3JL2HB.cjs.map +1 -0
- package/dist/chunk-LRAAJRE7.cjs +2707 -0
- package/dist/chunk-LRAAJRE7.cjs.map +1 -0
- package/dist/{chunk-OE5CKRUC.js → chunk-LX323IMT.js} +34 -4
- package/dist/chunk-LX323IMT.js.map +1 -0
- package/dist/chunk-M3VPGJMV.js +283 -0
- package/dist/chunk-M3VPGJMV.js.map +1 -0
- package/dist/{chunk-DVOQ3JNO.js → chunk-ME7EVT6F.js} +23 -9
- package/dist/chunk-ME7EVT6F.js.map +1 -0
- package/dist/{chunk-SQJFBZ42.js → chunk-MUYUFOGL.js} +8 -7
- package/dist/chunk-MUYUFOGL.js.map +1 -0
- package/dist/{chunk-VKELAMAZ.js → chunk-N54FYWG6.js} +27 -11
- package/dist/chunk-N54FYWG6.js.map +1 -0
- package/dist/chunk-N5JDL4VE.js +3 -0
- package/dist/chunk-N5JDL4VE.js.map +1 -0
- package/dist/{chunk-ZPSJ2UV6.cjs → chunk-NAH65KPK.cjs} +8 -8
- package/dist/{chunk-ZPSJ2UV6.cjs.map → chunk-NAH65KPK.cjs.map} +1 -1
- package/dist/{chunk-PYJDVWXM.js → chunk-NUB5HRKS.js} +3 -3
- package/dist/{chunk-PYJDVWXM.js.map → chunk-NUB5HRKS.js.map} +1 -1
- package/dist/{chunk-WNZAYBVB.cjs → chunk-O6BJMVGT.cjs} +48 -48
- package/dist/{chunk-WNZAYBVB.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-J5CSLNCN.cjs → chunk-OODVC2UD.cjs} +2 -2
- package/dist/{chunk-J5CSLNCN.cjs.map → chunk-OODVC2UD.cjs.map} +1 -1
- package/dist/{chunk-LL6IWKI3.js → chunk-OW3SQJ7P.js} +3 -3
- package/dist/{chunk-LL6IWKI3.js.map → chunk-OW3SQJ7P.js.map} +1 -1
- package/dist/{chunk-ZGRCSNPK.js → chunk-OYUIEJPN.js} +17 -8
- package/dist/chunk-OYUIEJPN.js.map +1 -0
- package/dist/chunk-P22YCUVM.cjs +4 -0
- package/dist/chunk-P22YCUVM.cjs.map +1 -0
- package/dist/{chunk-CEQJGUAS.js → chunk-P4E3K3ND.js} +12 -5
- package/dist/chunk-P4E3K3ND.js.map +1 -0
- package/dist/{chunk-TMMVIUUN.js → chunk-P7D7BYFE.js} +4 -4
- package/dist/{chunk-TMMVIUUN.js.map → chunk-P7D7BYFE.js.map} +1 -1
- package/dist/{chunk-SGFYA22I.cjs → chunk-PINIBEIU.cjs} +21 -12
- package/dist/chunk-PINIBEIU.cjs.map +1 -0
- package/dist/{chunk-3T7QGLNB.js → chunk-PJEL5ZZV.js} +4 -2
- package/dist/chunk-PJEL5ZZV.js.map +1 -0
- package/dist/chunk-PWXDRFJL.cjs +218 -0
- package/dist/chunk-PWXDRFJL.cjs.map +1 -0
- package/dist/{chunk-XZNN3S3S.cjs → chunk-PYI2IWNX.cjs} +4 -4
- package/dist/{chunk-XZNN3S3S.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-MNILXWVY.js → chunk-QJ2L5RU6.js} +7 -7
- package/dist/{chunk-MNILXWVY.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-UV2FVNWT.cjs → chunk-RIUQP2QS.cjs} +5 -5
- package/dist/{chunk-UV2FVNWT.cjs.map → chunk-RIUQP2QS.cjs.map} +1 -1
- package/dist/chunk-RLVYWUXG.js +115 -0
- package/dist/chunk-RLVYWUXG.js.map +1 -0
- package/dist/{chunk-HACNIFO3.js → chunk-RM2HPQIC.js} +77 -14
- package/dist/chunk-RM2HPQIC.js.map +1 -0
- package/dist/{chunk-DEDN5HAG.js → chunk-RSJGTWLM.js} +3 -3
- package/dist/{chunk-DEDN5HAG.js.map → chunk-RSJGTWLM.js.map} +1 -1
- package/dist/{chunk-G4D6CLBT.js → chunk-RZSSQ7AT.js} +3 -3
- package/dist/{chunk-G4D6CLBT.js.map → chunk-RZSSQ7AT.js.map} +1 -1
- package/dist/{chunk-ENKFJJZX.js → chunk-S2JZL4JC.js} +6 -6
- package/dist/{chunk-ENKFJJZX.js.map → chunk-S2JZL4JC.js.map} +1 -1
- package/dist/{chunk-P7UMS4E6.cjs → chunk-S7AMZ4RD.cjs} +23 -9
- package/dist/chunk-S7AMZ4RD.cjs.map +1 -0
- package/dist/{chunk-VROIMIHB.cjs → chunk-SHBCUXFS.cjs} +28 -6
- package/dist/chunk-SHBCUXFS.cjs.map +1 -0
- package/dist/{chunk-RJ6NTJHC.js → chunk-SRMTRD7F.js} +3 -3
- package/dist/{chunk-RJ6NTJHC.js.map → chunk-SRMTRD7F.js.map} +1 -1
- package/dist/{chunk-IX6KFB3K.cjs → chunk-SW2E7XKY.cjs} +9 -9
- package/dist/{chunk-IX6KFB3K.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-NJ6MY6V5.js → chunk-T5BBZQ66.js} +3 -3
- package/dist/{chunk-NJ6MY6V5.js.map → chunk-T5BBZQ66.js.map} +1 -1
- package/dist/{chunk-HZ4MBUC3.js → chunk-TI3TQQ7F.js} +4 -53
- package/dist/chunk-TI3TQQ7F.js.map +1 -0
- package/dist/{chunk-ACCAXVOG.js → chunk-TJ4GWQPM.js} +137 -57
- package/dist/chunk-TJ4GWQPM.js.map +1 -0
- package/dist/{chunk-5JJ2DAE4.js → chunk-TWQSMUE6.js} +7 -3
- package/dist/chunk-TWQSMUE6.js.map +1 -0
- package/dist/{chunk-X4XPNTCZ.cjs → chunk-U2RS574O.cjs} +139 -59
- package/dist/chunk-U2RS574O.cjs.map +1 -0
- package/dist/{chunk-TAXD5ADA.cjs → chunk-UEDTZYGI.cjs} +3 -3
- package/dist/{chunk-TAXD5ADA.cjs.map → chunk-UEDTZYGI.cjs.map} +1 -1
- package/dist/{chunk-3QGS6CXD.js → chunk-UJDWFDKE.js} +3 -3
- package/dist/{chunk-3QGS6CXD.js.map → chunk-UJDWFDKE.js.map} +1 -1
- package/dist/{chunk-DZ5HFLRC.js → chunk-UNFDIBKJ.js} +3 -3
- package/dist/{chunk-DZ5HFLRC.js.map → chunk-UNFDIBKJ.js.map} +1 -1
- package/dist/{chunk-UQ3VVR6A.cjs → chunk-UPWIJC6I.cjs} +3 -3
- package/dist/{chunk-UQ3VVR6A.cjs.map → chunk-UPWIJC6I.cjs.map} +1 -1
- package/dist/chunk-UTIPENPW.cjs +286 -0
- package/dist/chunk-UTIPENPW.cjs.map +1 -0
- package/dist/{chunk-S7WCHDBO.js → chunk-VCI2Y7ST.js} +3 -3
- package/dist/{chunk-S7WCHDBO.js.map → chunk-VCI2Y7ST.js.map} +1 -1
- package/dist/{chunk-Y5HFM7LO.js → chunk-VOEXGDL5.js} +6 -6
- package/dist/chunk-VOEXGDL5.js.map +1 -0
- package/dist/{chunk-P2CA3XGI.js → chunk-VSRO4PAI.js} +23 -5
- 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-XI34EGK5.cjs → chunk-VV2U36T6.cjs} +9 -9
- package/dist/{chunk-XI34EGK5.cjs.map → chunk-VV2U36T6.cjs.map} +1 -1
- package/dist/{chunk-VPWJCJCX.cjs → chunk-VXW7D5LR.cjs} +26 -8
- package/dist/chunk-VXW7D5LR.cjs.map +1 -0
- package/dist/{chunk-GOALNQZ2.js → chunk-WFBUBT54.js} +4 -83
- package/dist/chunk-WFBUBT54.js.map +1 -0
- package/dist/chunk-WQHBMZSC.js +295 -0
- package/dist/chunk-WQHBMZSC.js.map +1 -0
- package/dist/chunk-WSMBIXPU.cjs +2573 -0
- package/dist/chunk-WSMBIXPU.cjs.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-XDU65GLW.js +21 -0
- package/dist/chunk-XDU65GLW.js.map +1 -0
- package/dist/{chunk-5GUOOLPR.cjs → chunk-XHK5VZ4L.cjs} +29 -8
- package/dist/chunk-XHK5VZ4L.cjs.map +1 -0
- package/dist/chunk-XI74P5F2.cjs +424 -0
- package/dist/chunk-XI74P5F2.cjs.map +1 -0
- package/dist/chunk-XNPDZANN.cjs +238 -0
- package/dist/chunk-XNPDZANN.cjs.map +1 -0
- package/dist/{chunk-XDIMTPZU.cjs → chunk-XPWFIDZM.cjs} +4 -3
- package/dist/chunk-XPWFIDZM.cjs.map +1 -0
- package/dist/{chunk-FS4VZUFV.cjs → chunk-XRVMYT5G.cjs} +77 -13
- package/dist/chunk-XRVMYT5G.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-Y7ZJZLJY.js +2657 -0
- package/dist/chunk-Y7ZJZLJY.js.map +1 -0
- package/dist/chunk-YG7BR76Y.js +281 -0
- package/dist/chunk-YG7BR76Y.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-YVKBXNPK.js +41 -0
- package/dist/chunk-YVKBXNPK.js.map +1 -0
- package/dist/chunk-YW2AKBLS.cjs +23 -0
- package/dist/chunk-YW2AKBLS.cjs.map +1 -0
- package/dist/{chunk-3M7TAXNR.js → chunk-YZCM7CXK.js} +3 -3
- package/dist/{chunk-3M7TAXNR.js.map → chunk-YZCM7CXK.js.map} +1 -1
- package/dist/chunk-Z3WMDVMR.cjs +46 -0
- package/dist/chunk-Z3WMDVMR.cjs.map +1 -0
- 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/Alert/index.d.cts +1 -1
- package/dist/components/Alert/index.d.ts +1 -1
- package/dist/components/AlertDialog/index.cjs +19 -5
- package/dist/components/AlertDialog/index.d.cts +94 -16
- package/dist/components/AlertDialog/index.d.ts +94 -16
- package/dist/components/AlertDialog/index.js +6 -4
- 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/AudioRecorder/index.d.cts +2 -2
- package/dist/components/AudioRecorder/index.d.ts +2 -2
- package/dist/components/Autocomplete/index.d.cts +8 -2
- package/dist/components/Autocomplete/index.d.ts +8 -2
- package/dist/components/Avatar/index.cjs +9 -7
- package/dist/components/Avatar/index.d.cts +46 -15
- package/dist/components/Avatar/index.d.ts +46 -15
- 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/Badge/index.cjs +3 -3
- package/dist/components/Badge/index.d.cts +16 -2
- package/dist/components/Badge/index.d.ts +16 -2
- package/dist/components/Badge/index.js +1 -1
- package/dist/components/BoardView/index.cjs +5 -4
- package/dist/components/BoardView/index.d.cts +2 -3
- package/dist/components/BoardView/index.d.ts +2 -3
- package/dist/components/BoardView/index.js +2 -1
- package/dist/components/Button/index.cjs +5 -3
- package/dist/components/Button/index.d.cts +2 -1
- package/dist/components/Button/index.d.ts +2 -1
- package/dist/components/Button/index.js +3 -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 +6 -4
- package/dist/components/CalendarView/index.d.cts +1 -2
- package/dist/components/CalendarView/index.d.ts +1 -2
- package/dist/components/CalendarView/index.js +4 -2
- package/dist/components/Card/index.d.cts +3 -3
- package/dist/components/Card/index.d.ts +3 -3
- 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 +6 -6
- package/dist/components/Collapsible/index.d.cts +6 -0
- package/dist/components/Collapsible/index.d.ts +6 -0
- package/dist/components/Collapsible/index.js +3 -3
- package/dist/components/CompletenessMeter/index.cjs +23 -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 +6 -0
- package/dist/components/CompletenessMeter/index.js.map +1 -0
- package/dist/components/CountryCodeDropdown/index.cjs +5 -5
- package/dist/components/CountryCodeDropdown/index.js +2 -2
- package/dist/components/CustomizableDashboard/index.cjs +12 -10
- package/dist/components/CustomizableDashboard/index.js +5 -3
- package/dist/components/DateInput/index.d.cts +36 -4
- package/dist/components/DateInput/index.d.ts +36 -4
- package/dist/components/Dropdown/index.cjs +12 -10
- package/dist/components/Dropdown/index.d.cts +6 -4
- package/dist/components/Dropdown/index.d.ts +6 -4
- package/dist/components/Dropdown/index.js +5 -3
- package/dist/components/EmailEditor/index.cjs +68 -0
- package/dist/components/EmailEditor/index.cjs.map +1 -0
- package/dist/components/EmailEditor/index.d.cts +347 -0
- package/dist/components/EmailEditor/index.d.ts +347 -0
- package/dist/components/EmailEditor/index.js +27 -0
- package/dist/components/EmailEditor/index.js.map +1 -0
- 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 +6 -4
- package/dist/components/FloatingWindow/index.js +4 -2
- package/dist/components/GanttView/index.d.cts +1 -2
- package/dist/components/GanttView/index.d.ts +1 -2
- package/dist/components/GlossaryTooltip/index.cjs +3 -3
- package/dist/components/GlossaryTooltip/index.js +2 -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 +5 -5
- package/dist/components/KeyboardShortcutsOverlay/index.js +3 -3
- package/dist/components/ListView/index.cjs +6 -4
- package/dist/components/ListView/index.d.cts +91 -4
- package/dist/components/ListView/index.d.ts +91 -4
- package/dist/components/ListView/index.js +4 -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 +21 -19
- package/dist/components/Markdown/index.js +9 -7
- package/dist/components/MediaEditor/index.cjs +16 -14
- package/dist/components/MediaEditor/index.d.cts +91 -2
- package/dist/components/MediaEditor/index.d.ts +91 -2
- package/dist/components/MediaEditor/index.js +11 -9
- package/dist/components/MediaFeed/index.cjs +29 -0
- package/dist/components/MediaFeed/index.cjs.map +1 -0
- package/dist/components/MediaFeed/index.d.cts +104 -0
- package/dist/components/MediaFeed/index.d.ts +104 -0
- package/dist/components/MediaFeed/index.js +20 -0
- package/dist/components/MediaFeed/index.js.map +1 -0
- package/dist/components/MediaPlayer/index.cjs +8 -6
- package/dist/components/MediaPlayer/index.d.cts +19 -1
- package/dist/components/MediaPlayer/index.d.ts +19 -1
- package/dist/components/MediaPlayer/index.js +5 -3
- package/dist/components/MegaMenu/index.cjs +7 -5
- package/dist/components/MegaMenu/index.js +4 -2
- package/dist/components/Modal/index.cjs +10 -10
- package/dist/components/Modal/index.js +2 -2
- package/dist/components/Pagination/index.d.cts +1 -1
- package/dist/components/Pagination/index.d.ts +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/Progress/index.cjs +6 -6
- package/dist/components/Progress/index.d.cts +8 -2
- package/dist/components/Progress/index.d.ts +8 -2
- package/dist/components/Progress/index.js +1 -1
- package/dist/components/PropertyList/index.cjs +25 -0
- package/dist/components/PropertyList/index.cjs.map +1 -0
- package/dist/components/PropertyList/index.d.cts +87 -0
- package/dist/components/PropertyList/index.d.ts +87 -0
- package/dist/components/PropertyList/index.js +12 -0
- package/dist/components/PropertyList/index.js.map +1 -0
- package/dist/components/Q/index.d.cts +2 -2
- package/dist/components/Q/index.d.ts +2 -2
- package/dist/components/QuickAction/index.d.cts +1 -1
- package/dist/components/QuickAction/index.d.ts +1 -1
- package/dist/components/RadialExplorer/index.cjs +7 -5
- package/dist/components/RadialExplorer/index.js +6 -4
- 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/RecordButton/index.d.cts +1 -1
- package/dist/components/RecordButton/index.d.ts +1 -1
- package/dist/components/RecordHeader/index.cjs +30 -0
- package/dist/components/RecordHeader/index.cjs.map +1 -0
- package/dist/components/RecordHeader/index.d.cts +96 -0
- package/dist/components/RecordHeader/index.d.ts +96 -0
- package/dist/components/RecordHeader/index.js +17 -0
- package/dist/components/RecordHeader/index.js.map +1 -0
- package/dist/components/RecordLayout/index.cjs +22 -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 +9 -0
- package/dist/components/RecordLayout/index.js.map +1 -0
- package/dist/components/RichTextEditor/index.cjs +12 -8
- package/dist/components/RichTextEditor/index.d.cts +12 -2
- package/dist/components/RichTextEditor/index.d.ts +12 -2
- package/dist/components/RichTextEditor/index.js +9 -5
- package/dist/components/ScrollArea/index.d.cts +1 -1
- package/dist/components/ScrollArea/index.d.ts +1 -1
- package/dist/components/SectionSpyNav/index.cjs +5 -3
- package/dist/components/SectionSpyNav/index.js +4 -2
- package/dist/components/Select/index.cjs +4 -4
- package/dist/components/Select/index.d.cts +2 -2
- package/dist/components/Select/index.d.ts +2 -2
- package/dist/components/Select/index.js +2 -2
- package/dist/components/Skeleton/index.d.cts +1 -1
- package/dist/components/Skeleton/index.d.ts +1 -1
- package/dist/components/Slider/index.d.cts +2 -2
- package/dist/components/Slider/index.d.ts +2 -2
- package/dist/components/SliderCalculator/index.cjs +4 -4
- package/dist/components/SliderCalculator/index.js +2 -2
- package/dist/components/SourceTip/index.cjs +3 -3
- package/dist/components/SourceTip/index.js +2 -2
- package/dist/components/Spinner/index.d.cts +2 -2
- package/dist/components/Spinner/index.d.ts +2 -2
- package/dist/components/SuperChat/index.cjs +735 -322
- package/dist/components/SuperChat/index.cjs.map +1 -1
- package/dist/components/SuperChat/index.d.cts +126 -8
- package/dist/components/SuperChat/index.d.ts +126 -8
- package/dist/components/SuperChat/index.js +721 -308
- package/dist/components/SuperChat/index.js.map +1 -1
- package/dist/components/SuperChat/plugins/index.cjs +8 -6
- package/dist/components/SuperChat/plugins/index.cjs.map +1 -1
- package/dist/components/SuperChat/plugins/index.d.cts +2 -3
- package/dist/components/SuperChat/plugins/index.d.ts +2 -3
- package/dist/components/SuperChat/plugins/index.js +7 -5
- package/dist/components/SuperChat/plugins/index.js.map +1 -1
- package/dist/components/Tabs/index.cjs +10 -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 +4 -1
- package/dist/components/TagEditor/index.cjs +22 -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 +9 -0
- package/dist/components/TagEditor/index.js.map +1 -0
- package/dist/components/Text/index.d.cts +3 -3
- package/dist/components/Text/index.d.ts +3 -3
- package/dist/components/Textarea/index.d.cts +2 -2
- package/dist/components/Textarea/index.d.ts +2 -2
- package/dist/components/ThemeProvider/index.cjs +9 -9
- package/dist/components/ThemeProvider/index.d.cts +3 -1
- package/dist/components/ThemeProvider/index.d.ts +3 -1
- package/dist/components/ThemeProvider/index.js +3 -3
- package/dist/components/Tooltip/index.cjs +3 -3
- package/dist/components/Tooltip/index.js +2 -2
- package/dist/components/TranscriptView/index.d.cts +85 -4
- package/dist/components/TranscriptView/index.d.ts +85 -4
- 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/VideoCard/index.cjs +4 -4
- package/dist/components/VideoCard/index.js +2 -2
- package/dist/components/ViewSet/index.cjs +10 -7
- package/dist/components/ViewSet/index.d.cts +120 -8
- package/dist/components/ViewSet/index.d.ts +120 -8
- package/dist/components/ViewSet/index.js +9 -6
- package/dist/components/ViewSwitcher/index.cjs +4 -3
- package/dist/components/ViewSwitcher/index.d.cts +1 -2
- package/dist/components/ViewSwitcher/index.d.ts +1 -2
- package/dist/components/ViewSwitcher/index.js +2 -1
- package/dist/components/YearTimeline/index.cjs +5 -5
- package/dist/components/YearTimeline/index.js +1 -1
- package/dist/datavis.cjs +6 -4
- package/dist/datavis.cjs.map +1 -1
- package/dist/datavis.d.cts +167 -13
- package/dist/datavis.d.ts +167 -13
- package/dist/datavis.js +4 -2
- package/dist/datavis.js.map +1 -1
- package/dist/deck.cjs +3374 -0
- package/dist/deck.cjs.map +1 -0
- package/dist/deck.d.cts +712 -0
- package/dist/deck.d.ts +712 -0
- package/dist/deck.js +3330 -0
- package/dist/deck.js.map +1 -0
- package/dist/esheet.cjs +20 -16
- package/dist/esheet.cjs.map +1 -1
- package/dist/esheet.d.cts +183 -1
- package/dist/esheet.d.ts +183 -1
- package/dist/esheet.js +17 -13
- package/dist/esheet.js.map +1 -1
- package/dist/globe.cjs +2 -2
- package/dist/globe.js +1 -1
- package/dist/{hey-buddy-INNUFFJJ.cjs → hey-buddy-5WOBYZRJ.cjs} +22 -11
- package/dist/hey-buddy-5WOBYZRJ.cjs.map +1 -0
- package/dist/{hey-buddy-V6FC5UKB.js → hey-buddy-AHUHCDBC.js} +22 -11
- package/dist/hey-buddy-AHUHCDBC.js.map +1 -0
- package/dist/hooks/index.cjs +88 -33
- package/dist/hooks/index.d.cts +592 -36
- package/dist/hooks/index.d.ts +592 -36
- package/dist/hooks/index.js +9 -6
- package/dist/icons-wBacj6BW.d.cts +142 -0
- package/dist/icons-wBacj6BW.d.ts +142 -0
- package/dist/index.cjs +2056 -1349
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10401 -637
- package/dist/index.d.ts +10401 -637
- package/dist/index.js +674 -352
- package/dist/index.js.map +1 -1
- package/dist/kerebron.css +115 -0
- package/dist/maps.cjs +160 -0
- package/dist/maps.cjs.map +1 -0
- package/dist/maps.d.cts +42 -0
- package/dist/maps.d.ts +42 -0
- package/dist/maps.js +138 -0
- package/dist/maps.js.map +1 -0
- package/dist/motion.cjs +7 -7
- package/dist/motion.d.cts +186 -2
- package/dist/motion.d.ts +186 -2
- package/dist/motion.js +2 -2
- package/dist/org-chart.cjs +1303 -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 +1278 -0
- package/dist/org-chart.js.map +1 -0
- package/dist/q.d.cts +25 -3
- package/dist/q.d.ts +25 -3
- package/dist/styles/effects.css +133 -0
- package/dist/styles/init.css +22 -3
- package/dist/styles.css +1 -1
- package/dist/tailwind-preset.cjs +4 -4
- package/dist/tailwind-preset.js +1 -1
- package/dist/templates.cjs +156 -0
- package/dist/templates.cjs.map +1 -0
- package/dist/templates.d.cts +734 -0
- package/dist/templates.d.ts +734 -0
- package/dist/templates.js +11 -0
- package/dist/templates.js.map +1 -0
- package/dist/{types-CbWXIKbe.d.cts → types-CDeBNZiE.d.cts} +1 -28
- package/dist/{types-CbWXIKbe.d.ts → types-CDeBNZiE.d.ts} +1 -28
- package/dist/types-Cx1FHLq2.d.cts +548 -0
- package/dist/types-Cx1FHLq2.d.ts +548 -0
- package/dist/types-DsdZvEI1.d.cts +92 -0
- package/dist/types-DsdZvEI1.d.ts +92 -0
- package/dist/utils/index.cjs +9 -9
- package/dist/utils/index.d.cts +13 -2
- package/dist/utils/index.d.ts +13 -2
- package/dist/utils/index.js +1 -1
- package/package.json +79 -15
- package/dist/Animated-XmH6k8pZ.d.cts +0 -188
- package/dist/Animated-XmH6k8pZ.d.ts +0 -188
- package/dist/CsvBlock-ROJCKJDP.cjs +0 -16
- package/dist/CsvBlock-UWPMTLE2.js +0 -7
- package/dist/HtmlPreviewBlock-DWFN6EUB.cjs +0 -16
- package/dist/HtmlPreviewBlock-ME5U3XNS.js +0 -7
- package/dist/MedicationEditor-Bp4NLy7y.d.cts +0 -352
- package/dist/MedicationEditor-Bp4NLy7y.d.ts +0 -352
- package/dist/MermaidBlock-2B6CPD6Y.js +0 -7
- package/dist/MermaidBlock-D2UC5M55.cjs +0 -16
- package/dist/SurveyBlock-4CD4AYMJ.cjs +0 -16
- package/dist/SurveyBlock-4DO62RBT.js +0 -7
- package/dist/chunk-2IZLKPUW.js.map +0 -1
- package/dist/chunk-3T7QGLNB.js.map +0 -1
- package/dist/chunk-4A3W4TQF.js.map +0 -1
- package/dist/chunk-4IS3QCOQ.cjs.map +0 -1
- package/dist/chunk-5GUOOLPR.cjs.map +0 -1
- package/dist/chunk-5JJ2DAE4.js.map +0 -1
- package/dist/chunk-6EN3IQQI.cjs.map +0 -1
- package/dist/chunk-6HFFWEM3.cjs +0 -22
- package/dist/chunk-6HFFWEM3.cjs.map +0 -1
- package/dist/chunk-7ZDPD5ZX.cjs.map +0 -1
- package/dist/chunk-7ZVTLTJF.js +0 -109
- package/dist/chunk-7ZVTLTJF.js.map +0 -1
- package/dist/chunk-ACCAXVOG.js.map +0 -1
- package/dist/chunk-AR7AKDM2.cjs +0 -143
- package/dist/chunk-AR7AKDM2.cjs.map +0 -1
- package/dist/chunk-ASSDGS4F.cjs.map +0 -1
- package/dist/chunk-AWJBOND5.js +0 -130
- package/dist/chunk-AWJBOND5.js.map +0 -1
- package/dist/chunk-BMSG4NBH.js +0 -56
- package/dist/chunk-BMSG4NBH.js.map +0 -1
- package/dist/chunk-CEQJGUAS.js.map +0 -1
- package/dist/chunk-CR2SDI23.cjs.map +0 -1
- package/dist/chunk-DVOQ3JNO.js.map +0 -1
- package/dist/chunk-E4IBHYJ7.cjs +0 -80
- package/dist/chunk-E4IBHYJ7.cjs.map +0 -1
- package/dist/chunk-FS4VZUFV.cjs.map +0 -1
- package/dist/chunk-GD7EBGC4.cjs.map +0 -1
- package/dist/chunk-GOALNQZ2.js.map +0 -1
- package/dist/chunk-HACNIFO3.js.map +0 -1
- package/dist/chunk-HB7C7NB5.js +0 -20
- package/dist/chunk-HB7C7NB5.js.map +0 -1
- package/dist/chunk-HZ4MBUC3.js.map +0 -1
- package/dist/chunk-IT775BYG.js.map +0 -1
- package/dist/chunk-JEIW7BSV.cjs.map +0 -1
- package/dist/chunk-JYZW2PZS.cjs.map +0 -1
- package/dist/chunk-KQUI4BGS.cjs.map +0 -1
- package/dist/chunk-KRU6IGV7.js.map +0 -1
- package/dist/chunk-NV2CWBI2.cjs.map +0 -1
- package/dist/chunk-OE5CKRUC.js.map +0 -1
- package/dist/chunk-P2CA3XGI.js.map +0 -1
- package/dist/chunk-P7UMS4E6.cjs.map +0 -1
- package/dist/chunk-SGFYA22I.cjs.map +0 -1
- package/dist/chunk-SQHMGT4W.js.map +0 -1
- package/dist/chunk-SQJFBZ42.js.map +0 -1
- package/dist/chunk-SVSHA7XV.js.map +0 -1
- package/dist/chunk-TVTIGV7Q.js.map +0 -1
- package/dist/chunk-VKELAMAZ.js.map +0 -1
- package/dist/chunk-VNYW4C4J.cjs.map +0 -1
- package/dist/chunk-VOKVG3ER.js +0 -78
- package/dist/chunk-VOKVG3ER.js.map +0 -1
- package/dist/chunk-VPIYTQCV.cjs.map +0 -1
- package/dist/chunk-VPWJCJCX.cjs.map +0 -1
- package/dist/chunk-VROIMIHB.cjs.map +0 -1
- package/dist/chunk-WNJRS7Y7.cjs.map +0 -1
- package/dist/chunk-X4LBUPJO.cjs.map +0 -1
- package/dist/chunk-X4XPNTCZ.cjs.map +0 -1
- package/dist/chunk-XCP454Q6.js.map +0 -1
- package/dist/chunk-XDIMTPZU.cjs.map +0 -1
- package/dist/chunk-XEAT7XJG.cjs.map +0 -1
- package/dist/chunk-XVW5DPPP.js.map +0 -1
- package/dist/chunk-Y5HFM7LO.js.map +0 -1
- package/dist/chunk-YVL3XATO.cjs +0 -79
- package/dist/chunk-YVL3XATO.cjs.map +0 -1
- package/dist/chunk-YVPC65ZJ.cjs.map +0 -1
- package/dist/chunk-ZGRCSNPK.js.map +0 -1
- package/dist/hey-buddy-INNUFFJJ.cjs.map +0 -1
- package/dist/hey-buddy-V6FC5UKB.js.map +0 -1
- package/dist/html-MdxqSzjD.d.cts +0 -13
- package/dist/html-MdxqSzjD.d.ts +0 -13
- package/dist/orderRows-BUJYgSc7.d.cts +0 -221
- package/dist/orderRows-BUJYgSc7.d.ts +0 -221
- package/dist/transcript-Cg7uSW-C.d.cts +0 -84
- package/dist/transcript-Cg7uSW-C.d.ts +0 -84
- package/dist/types-B97JNRNQ.d.cts +0 -251
- package/dist/types-CnPEwzlp.d.cts +0 -254
- package/dist/types-CnPEwzlp.d.ts +0 -254
- package/dist/types-gZXrfLj6.d.ts +0 -251
- package/dist/useAnchoredPosition-CKwLSQW8.d.cts +0 -76
- package/dist/useAnchoredPosition-CKwLSQW8.d.ts +0 -76
- package/dist/useTheme-B9SWu6ui.d.cts +0 -24
- package/dist/useTheme-B9SWu6ui.d.ts +0 -24
- package/dist/useTranscriptEdits-CGzlemHT.d.cts +0 -182
- package/dist/useTranscriptEdits-D32bLs0l.d.ts +0 -182
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Collapsible/Collapsible.tsx"],"names":["React","jsx","cn","usePrefersReducedMotion","AnimatedPresence","Animated"],"mappings":"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","file":"chunk-VPWJCJCX.cjs","sourcesContent":["import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Animated, AnimatedPresence } from '../../motion';\nimport { usePrefersReducedMotion } from '../../hooks/usePrefersReducedMotion';\n\ninterface CollapsibleContextValue {\n open: boolean;\n toggle: () => void;\n disabled?: boolean;\n contentId: string;\n triggerId: string;\n}\n\nconst CollapsibleContext = React.createContext<CollapsibleContextValue | null>(\n null\n);\n\nfunction useCollapsibleContext(component: string): CollapsibleContextValue {\n const ctx = React.useContext(CollapsibleContext);\n if (!ctx) {\n throw new Error(`${component} must be used within a <Collapsible>`);\n }\n return ctx;\n}\n\nexport interface CollapsibleProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Controlled open state */\n open?: boolean;\n /** Default open state (uncontrolled) */\n defaultOpen?: boolean;\n /** Callback fired when the open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Disables toggling */\n disabled?: boolean;\n}\n\n/**\n * An interactive component that expands and collapses its content.\n *\n * @example\n * ```tsx\n * <Collapsible>\n * <CollapsibleTrigger>Toggle</CollapsibleTrigger>\n * <CollapsibleContent>Hidden content</CollapsibleContent>\n * </Collapsible>\n * ```\n */\nconst Collapsible = React.forwardRef<HTMLDivElement, CollapsibleProps>(\n (\n {\n className,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n disabled,\n children,\n ...props\n },\n ref\n ) => {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);\n const generatedId = React.useId();\n\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : uncontrolledOpen;\n\n const toggle = React.useCallback(() => {\n if (disabled) return;\n const next = !open;\n if (!isControlled) setUncontrolledOpen(next);\n onOpenChange?.(next);\n }, [disabled, open, isControlled, onOpenChange]);\n\n const value = React.useMemo<CollapsibleContextValue>(\n () => ({\n open,\n toggle,\n disabled,\n contentId: `${generatedId}-content`,\n triggerId: `${generatedId}-trigger`,\n }),\n [open, toggle, disabled, generatedId]\n );\n\n return (\n <CollapsibleContext.Provider value={value}>\n <div\n ref={ref}\n data-slot=\"collapsible\"\n data-state={open ? 'open' : 'closed'}\n className={cn(className)}\n {...props}\n >\n {children}\n </div>\n </CollapsibleContext.Provider>\n );\n }\n);\n\nCollapsible.displayName = 'Collapsible';\n\nexport type CollapsibleTriggerProps =\n React.ButtonHTMLAttributes<HTMLButtonElement>;\n\nconst CollapsibleTrigger = React.forwardRef<\n HTMLButtonElement,\n CollapsibleTriggerProps\n>(({ className, onClick, children, ...props }, ref) => {\n const { open, toggle, disabled, contentId, triggerId } =\n useCollapsibleContext('CollapsibleTrigger');\n\n return (\n <button\n ref={ref}\n type=\"button\"\n id={triggerId}\n data-slot=\"collapsible-trigger\"\n aria-expanded={open}\n aria-controls={contentId}\n data-state={open ? 'open' : 'closed'}\n disabled={disabled}\n onClick={(e) => {\n toggle();\n onClick?.(e);\n }}\n className={cn(className)}\n {...props}\n >\n {children}\n </button>\n );\n});\n\nCollapsibleTrigger.displayName = 'CollapsibleTrigger';\n\nexport interface CollapsibleContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Keep content mounted when collapsed (hidden via CSS) */\n forceMount?: boolean;\n}\n\nconst CollapsibleContent = React.forwardRef<\n HTMLDivElement,\n CollapsibleContentProps\n>(({ className, forceMount, children, ...props }, ref) => {\n const { open, contentId, triggerId } =\n useCollapsibleContext('CollapsibleContent');\n const prefersReducedMotion = usePrefersReducedMotion();\n\n const sharedProps = {\n id: contentId,\n role: 'region' as const,\n 'aria-labelledby': triggerId,\n 'data-slot': 'collapsible-content',\n 'data-state': open ? ('open' as const) : ('closed' as const),\n };\n\n /*\n * `forceMount` keeps the old instant behaviour, deliberately.\n *\n * It exists so consumers can keep collapsed content in the DOM, and it relies\n * on `hidden` to keep that content out of the tab order and the accessibility\n * tree. `hidden` is `display: none`, which an animated height cannot run\n * through — and dropping it for the duration would leave keyboard users able\n * to tab into content that is visually collapsed. Sequencing `hidden` around\n * the animation is the real fix; until then, not animating is the safe\n * answer, and the default (unmounting) path below covers the common case.\n */\n if (forceMount) {\n return (\n <div\n ref={ref}\n {...sharedProps}\n hidden={!open}\n className={cn(className)}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n return (\n <AnimatedPresence initial={false}>\n {open && (\n <Animated\n key=\"collapsible-content\"\n ref={ref as React.Ref<HTMLElement>}\n preset=\"collapse\"\n mode=\"presence\"\n // `collapse` animates height, which `MotionConfig reducedMotion=\"user\"`\n // does not treat as a transform or layout animation and so leaves\n // running. Honouring the preference is the component's job here.\n enabled={!prefersReducedMotion}\n {...sharedProps}\n // Content must be clipped or it spills past the box while the height\n // is still travelling.\n className={cn('overflow-hidden', className)}\n {...props}\n >\n {children}\n </Animated>\n )}\n </AnimatedPresence>\n );\n});\n\nCollapsibleContent.displayName = 'CollapsibleContent';\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Accordion/Accordion.tsx"],"names":["cva","React","Accordion","jsx","cn","jsxs","ChevronDown"],"mappings":"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","file":"chunk-VROIMIHB.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { ChevronDown } from 'lucide-react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\n// =============================================================================\n// Variants\n// =============================================================================\n\nconst accordionVariants = cva('', {\n variants: {\n variant: {\n // Each item is its own card with spacing between\n separated: 'flex flex-col gap-3',\n // One bordered list with dividers\n joined: 'border-border divide-border divide-y rounded-lg border',\n },\n },\n defaultVariants: {\n variant: 'separated',\n },\n});\n\nconst itemVariants = cva('overflow-hidden', {\n variants: {\n variant: {\n separated: 'border-border bg-card rounded-lg border',\n joined: 'bg-card first:rounded-t-lg last:rounded-b-lg',\n },\n },\n defaultVariants: {\n variant: 'separated',\n },\n});\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface AccordionItem {\n /** Stable id used for open state and aria wiring. */\n id: string;\n /** Header label (e.g. an FAQ question). */\n title: React.ReactNode;\n /** Panel content (e.g. the answer). */\n content: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface AccordionProps\n extends\n Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'>,\n VariantProps<typeof accordionVariants> {\n items: AccordionItem[];\n /** `single` keeps at most one panel open; `multiple` allows any number. */\n type?: 'single' | 'multiple';\n /** Ids open initially (uncontrolled). */\n defaultOpenIds?: string[];\n /** Controlled open ids. Changes reported via `onOpenChange`. */\n openIds?: string[];\n onOpenChange?: (openIds: string[]) => void;\n /** In `single` mode, allow closing the open panel (default true). */\n collapsible?: boolean;\n /** Heading level wrapping each trigger for document outline (default h3). */\n headingLevel?: 'h2' | 'h3' | 'h4';\n}\n\n// =============================================================================\n// Accordion\n// =============================================================================\n\n/**\n * A vertically stacked set of expandable panels — FAQ lists, settings\n * groups, progressive disclosure. Panels animate open to their natural\n * height (CSS grid rows, no max-height clipping), and headers are real\n * buttons inside headings with full `aria-expanded`/`aria-controls` wiring.\n *\n * @example\n * ```tsx\n * <Accordion\n * type=\"single\"\n * items={[\n * { id: 'pricing', title: 'How is pricing calculated?', content: <p>…</p> },\n * { id: 'billing', title: 'When am I billed?', content: <p>…</p> },\n * ]}\n * />\n * ```\n */\nexport const Accordion = React.forwardRef<HTMLDivElement, AccordionProps>(\n function Accordion(\n {\n items,\n type = 'single',\n defaultOpenIds,\n openIds: controlledOpen,\n onOpenChange,\n collapsible = true,\n headingLevel: Heading = 'h3',\n variant,\n className,\n ...props\n },\n ref\n ) {\n const baseId = React.useId();\n const [internalOpen, setInternalOpen] = React.useState<string[]>(\n () => defaultOpenIds ?? []\n );\n const rawOpen = controlledOpen ?? internalOpen;\n // Single mode keeps at most one panel open, even if defaultOpenIds or a\n // controlled openIds array hands us several.\n const open = React.useMemo(\n () => (type === 'single' ? rawOpen.slice(0, 1) : rawOpen),\n [type, rawOpen]\n );\n const openSet = React.useMemo(() => new Set(open), [open]);\n\n const toggle = (id: string) => {\n let next: string[];\n if (openSet.has(id)) {\n if (type === 'single' && !collapsible) return;\n next = open.filter((o) => o !== id);\n } else {\n next = type === 'single' ? [id] : [...open, id];\n }\n if (controlledOpen === undefined) setInternalOpen(next);\n onOpenChange?.(next);\n };\n\n return (\n <div\n ref={ref}\n className={cn(accordionVariants({ variant }), className)}\n {...props}\n >\n {items.map((item) => {\n const isOpen = openSet.has(item.id);\n const triggerId = `${baseId}-${item.id}-trigger`;\n const panelId = `${baseId}-${item.id}-panel`;\n return (\n <div key={item.id} className={cn(itemVariants({ variant }))}>\n <Heading className=\"m-0\">\n <button\n type=\"button\"\n id={triggerId}\n data-slot=\"accordion-trigger\"\n aria-expanded={isOpen}\n aria-controls={panelId}\n disabled={item.disabled}\n onClick={() => toggle(item.id)}\n className={cn(\n 'hover:bg-muted/60 flex w-full items-center justify-between gap-4 px-5 py-4 text-start transition-colors',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none focus-visible:ring-inset',\n 'disabled:pointer-events-none disabled:opacity-50'\n )}\n >\n <span className=\"text-foreground min-w-0 text-sm font-semibold\">\n {item.title}\n </span>\n <ChevronDown\n aria-hidden=\"true\"\n className={cn(\n 'text-muted-foreground h-5 w-5 shrink-0 transition-transform duration-200',\n isOpen && 'rotate-180'\n )}\n />\n </button>\n </Heading>\n {/* grid-rows 0fr→1fr animates to natural height without a max-height clip;\n collapsed panels are hidden from AT and unfocusable via aria-hidden + inert */}\n <div\n id={panelId}\n role=\"region\"\n aria-labelledby={triggerId}\n aria-hidden={!isOpen}\n inert={!isOpen || undefined}\n className={cn(\n 'grid transition-[grid-template-rows] duration-200 ease-out',\n isOpen ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'\n )}\n >\n <div className=\"overflow-hidden\">\n <div\n data-slot=\"accordion-content\"\n className=\"text-muted-foreground px-5 pb-4 text-sm leading-relaxed\"\n >\n {item.content}\n </div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n }\n);\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/brands/bluehive.ts"],"names":[],"mappings":";;;AAaO,IAAM,aAAA,GAA6B;AAAA,EACxC,IAAA,EAAM,UAAA;AAAA,EACN,WAAA,EAAa,iBAAA;AAAA,EACb,WAAA,EAAa,4DAAA;AAAA,EAEb,MAAA,EAAQ;AAAA;AAAA,IAEN,OAAA,EAAS;AAAA,MACP,EAAA,EAAI,SAAA;AAAA,MACJ,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK;AAAA,KACP;AAAA;AAAA,IAGA,KAAA,EAAO;AAAA,MACL,UAAA,EAAY,SAAA;AAAA,MACZ,UAAA,EAAY,SAAA;AAAA,MACZ,IAAA,EAAM,SAAA;AAAA,MACN,cAAA,EAAgB,SAAA;AAAA,MAChB,KAAA,EAAO,SAAA;AAAA,MACP,eAAA,EAAiB,SAAA;AAAA,MACjB,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO,SAAA;AAAA,MACP,IAAA,EAAM,SAAA;AAAA,MACN,WAAA,EAAa,SAAA;AAAA,MACb,qBAAA,EAAuB,SAAA;AAAA,MACvB,OAAA,EAAS,SAAA;AAAA,MACT,iBAAA,EAAmB,SAAA;AAAA,MACnB,OAAA,EAAS,SAAA;AAAA,MACT,iBAAA,EAAmB;AAAA,KACrB;AAAA;AAAA,IAGA,IAAA,EAAM;AAAA,MACJ,UAAA,EAAY,SAAA;AAAA,MACZ,UAAA,EAAY,SAAA;AAAA,MACZ,IAAA,EAAM,SAAA;AAAA,MACN,cAAA,EAAgB,SAAA;AAAA,MAChB,KAAA,EAAO,SAAA;AAAA,MACP,eAAA,EAAiB,SAAA;AAAA,MACjB,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO,SAAA;AAAA,MACP,IAAA,EAAM,SAAA;AAAA,MACN,WAAA,EAAa,SAAA;AAAA,MACb,qBAAA,EAAuB,SAAA;AAAA,MACvB,OAAA,EAAS,SAAA;AAAA,MACT,iBAAA,EAAmB,SAAA;AAAA,MACnB,OAAA,EAAS,SAAA;AAAA,MACT,iBAAA,EAAmB;AAAA;AACrB,GACF;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,CAAC,QAAA,EAAU,eAAA,EAAiB,aAAa,YAAY,CAAA;AAAA,MAC3D,IAAA,EAAM,CAAC,cAAA,EAAgB,gBAAA,EAAkB,SAAS,WAAW;AAAA;AAC/D,GACF;AAAA,EAEA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,GAAA;AAAA,IACN,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,QAAA;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,KAAA,EAAO,QAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AAAA,EAEA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,+DAAA;AAAA,IACN,QAAA,EACE,kEAAA;AAAA,IACF,KAAA,EAAO;AAAA;AAEX","file":"chunk-WNJRS7Y7.cjs","sourcesContent":["/**\n * BlueHive Brand Configuration\n *\n * The official brand theme for BlueHive Health.\n * Primary color: #27aae1 (BlueHive Blue)\n */\n\nimport type { BrandConfig } from './types';\n\n/**\n * BlueHive brand configuration.\n * This defines all the design tokens used in BlueHive Health applications.\n */\nexport const bluehiveBrand: BrandConfig = {\n name: 'bluehive',\n displayName: 'BlueHive Health',\n description: 'DOT Physical scheduling and healthcare compliance platform',\n\n colors: {\n // Primary color scale - BlueHive Blue (#27aae1)\n primary: {\n 50: '#e6f7fc',\n 100: '#b3e6f6',\n 200: '#80d5f0',\n 300: '#4dc4ea',\n 400: '#27aae1',\n 500: '#27aae1',\n 600: '#1f98ca',\n 700: '#1786b3',\n 800: '#0f749c',\n 900: '#086285',\n 950: '#00506e',\n },\n\n // Light mode semantic colors\n light: {\n background: '#ffffff',\n foreground: '#171717',\n card: '#ffffff',\n cardForeground: '#171717',\n muted: '#f5f5f5',\n mutedForeground: '#494949',\n border: '#e5e7eb',\n input: '#e5e7eb',\n ring: '#27aae1',\n destructive: '#dc2626',\n destructiveForeground: '#ffffff',\n success: '#22c55e',\n successForeground: '#ffffff',\n warning: '#f59e0b',\n warningForeground: '#ffffff',\n },\n\n // Dark mode semantic colors\n dark: {\n background: '#171717',\n foreground: '#fafafa',\n card: '#262626',\n cardForeground: '#fafafa',\n muted: '#404040',\n mutedForeground: '#a1a1aa',\n border: '#404040',\n input: '#404040',\n ring: '#27aae1',\n destructive: '#dc2626',\n destructiveForeground: '#fafafa',\n success: '#16a34a',\n successForeground: '#fafafa',\n warning: '#d97706',\n warningForeground: '#fafafa',\n },\n },\n\n typography: {\n fontFamily: {\n sans: ['Nunito', 'ui-sans-serif', 'system-ui', 'sans-serif'],\n mono: ['ui-monospace', 'SFMono-Regular', 'Menlo', 'monospace'],\n },\n },\n\n borderRadius: {\n none: '0',\n sm: '0.25rem',\n md: '0.5rem',\n lg: '0.75rem',\n xl: '1rem',\n '2xl': '1.5rem',\n full: '9999px',\n },\n\n boxShadow: {\n card: '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)',\n dropdown:\n '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)',\n modal: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)',\n },\n};\n\n/**\n * BlueHive Tailwind preset.\n * Use this in your tailwind.config.js:\n *\n * ```js\n * import { bluehivePreset } from '@mieweb/ui/brands/bluehive';\n *\n * export default {\n * presets: [bluehivePreset],\n * // ... rest of config\n * }\n * ```\n */\nexport { bluehiveBrand as default };\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/CollabStatus/CollabStatus.tsx","../src/components/CollabStatus/useYjsCollabStatus.ts"],"names":["React","jsxs","cn","jsx","createPortal","WrapText","X","Fragment","React2"],"mappings":"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","file":"chunk-X4LBUPJO.cjs","sourcesContent":["import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { WrapText, X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Another participant currently present in the room. */\nexport interface CollabPeer {\n /** Display name published through presence. */\n name: string;\n /** Optional presence color (cursor/avatar tint). */\n color?: string;\n}\n\n/** Static identity of the open collaboration room, shown in the debug panel. */\nexport interface CollabRoomInfo {\n /** Room name on the sync server (e.g. `case/4`). */\n name: string;\n /** Transport URL the client connected to. */\n url?: string;\n /** This window's client id (stable per document), or null before connect. */\n clientId?: number | null;\n /** The acting application user id passed to the sync server. */\n userId?: string;\n}\n\n/** Category of a collaboration event in the debug log. */\nexport type CollabLogKind = 'doc' | 'awareness' | 'sync' | 'patch';\n\n/** A single entry in the collaboration debug log. */\nexport interface CollabLogEntry {\n /** Stable key for rendering. */\n id: number | string;\n /** Wall-clock time of the event (epoch ms). */\n at: number;\n /** Event category. */\n kind: CollabLogKind;\n /** Whether this window or a peer originated it. */\n origin?: 'local' | 'remote';\n /** Human-readable detail line. */\n detail: string;\n}\n\n/** Every user-facing string, so apps can translate the widget. */\nexport interface CollabStatusLabels {\n /** Trigger text once the initial sync completed. */\n live: string;\n /** Trigger text before the initial sync completes. */\n connecting: string;\n /** Summary of who else is editing, e.g. `Ann, Bo are editing`. */\n editing: (names: string[]) => string;\n /** Accessible name / tooltip of the trigger button. */\n triggerLabel: string;\n /** Heading of the room-occupants section. */\n peersTitle: (count: number) => string;\n /** Shown in the occupants section when nobody else is in the room. */\n alone: React.ReactNode;\n /** Heading of the debug panel. */\n logTitle: (count: number) => string;\n /** Accessible name of the panel close button. */\n close: string;\n /** Accessible name of the toggle that unclips long values. */\n wrap: string;\n /** Shown when the log is empty. */\n empty: React.ReactNode;\n roomTerm: string;\n urlTerm: string;\n clientTerm: string;\n userTerm: string;\n /** Suffix appended to the client id once synced / while connecting. */\n clientSynced: string;\n clientConnecting: string;\n}\n\nexport const defaultCollabStatusLabels: CollabStatusLabels = {\n live: 'Live',\n connecting: 'Connecting…',\n editing: (names) =>\n `${names.join(', ')} ${names.length === 1 ? 'is' : 'are'} editing`,\n triggerLabel: 'Live-sync status — open the update log',\n peersTitle: (count) => `In the room (${count})`,\n alone: 'You are the only one here.',\n logTitle: (count) => `Update log (${count})`,\n close: 'Close update log',\n wrap: 'Wrap long values',\n empty: 'No updates yet.',\n roomTerm: 'Room',\n urlTerm: 'Socket',\n clientTerm: 'Client',\n userTerm: 'User',\n clientSynced: 'synced',\n clientConnecting: 'connecting',\n};\n\nexport interface CollabStatusProps {\n /** True once the room has completed its initial sync with the server. */\n connected: boolean;\n /** Other people in the room right now. */\n peers?: CollabPeer[];\n /** Recent collaboration events, newest first. */\n log?: CollabLogEntry[];\n /** Identity of the open room, shown at the top of the panel. */\n room?: CollabRoomInfo | null;\n /** Set false to render a status-only chip with no debug panel. */\n showLog?: boolean;\n /**\n * Render the trigger as the bare connection dot, moving the status text into\n * its accessible name. For headers with no room for a full chip.\n */\n compact?: boolean;\n /**\n * An app-level condition worth the same glance as the connection state, e.g.\n * `\"Unsaved changes\"`. While set, the dot turns amber and the text joins the\n * trigger's accessible name and heads the panel.\n */\n attention?: React.ReactNode;\n /** Overrides for any user-facing string. */\n labels?: Partial<CollabStatusLabels>;\n /** Additional className for the trigger wrapper. */\n className?: string;\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/** One row of the occupants list: a display label and its presence color. */\ninterface PeerLabel {\n label: string;\n color?: string;\n}\n\n/** Collapse multiple windows of the same person into `Name (N)`. */\nfunction peerLabels(peers: CollabPeer[]): PeerLabel[] {\n const seen = new Map<string, { count: number; color?: string }>();\n for (const p of peers) {\n const entry = seen.get(p.name);\n if (entry) entry.count += 1;\n else seen.set(p.name, { count: 1, color: p.color });\n }\n return [...seen].map(([name, { count, color }]) => ({\n label: count > 1 ? `${name} (${count})` : name,\n color,\n }));\n}\n\nconst PANEL_OFFSET = 6;\nconst VIEWPORT_PADDING = 8;\n\n/**\n * Position the panel under the trigger, right-aligned to it but clamped to the\n * viewport on both axes (it flips above the trigger when it would overflow the\n * bottom). Returns null until the panel has been measured.\n */\nfunction useAnchoredPanel(\n open: boolean,\n anchorRef: React.RefObject<HTMLElement | null>,\n panelRef: React.RefObject<HTMLElement | null>\n) {\n const [pos, setPos] = React.useState<{ top: number; left: number } | null>(\n null\n );\n\n React.useLayoutEffect(() => {\n if (!open) {\n setPos(null);\n return;\n }\n const update = () => {\n const anchor = anchorRef.current;\n const panel = panelRef.current;\n if (!anchor || !panel) return;\n const a = anchor.getBoundingClientRect();\n const { offsetWidth: width, offsetHeight: height } = panel;\n\n const maxLeft = window.innerWidth - width - VIEWPORT_PADDING;\n const left = Math.max(\n VIEWPORT_PADDING,\n Math.min(a.right - width, Math.max(VIEWPORT_PADDING, maxLeft))\n );\n\n let top = a.bottom + PANEL_OFFSET;\n if (top + height > window.innerHeight - VIEWPORT_PADDING) {\n top = Math.max(VIEWPORT_PADDING, a.top - height - PANEL_OFFSET);\n }\n\n setPos({ top, left });\n };\n\n // Measured after the (hidden) panel has been laid out.\n const raf = window.requestAnimationFrame(update);\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.cancelAnimationFrame(raf);\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [open, anchorRef, panelRef]);\n\n return pos;\n}\n\nconst KIND_TONE: Record<CollabLogKind, string> = {\n doc: 'text-muted-foreground',\n awareness: 'text-primary-600 dark:text-primary-400',\n sync: 'text-success-700 dark:text-success-400',\n patch: 'text-muted-foreground',\n};\n\n// =============================================================================\n// Component\n// =============================================================================\n\n/**\n * Live-collaboration status chip: a connection dot, a `Live` / `Connecting…`\n * label, a summary of who else is editing, and a click-to-open panel with the\n * room identity, who is in the room, and a rolling log of collaboration\n * events. Pass `compact` to shrink the trigger down to the dot alone, and\n * `attention` to let an app condition (\"Unsaved changes\") share that dot.\n *\n * Transport-agnostic — it renders whatever presence state you hand it. For a\n * Yjs (`y-websocket`) room, {@link useYjsCollabStatus} produces these props\n * directly:\n *\n * @example\n * ```tsx\n * const doc = React.useMemo(() => new Y.Doc(), []);\n * const provider = React.useMemo(\n * () => new WebsocketProvider('ws://localhost:1234', 'case/4', doc),\n * [doc]\n * );\n * const status = useYjsCollabStatus({ doc, provider, user: { name: 'Ann' } });\n *\n * return <CollabStatus {...status} />;\n * ```\n */\nexport function CollabStatus({\n connected,\n peers = [],\n log = [],\n room = null,\n showLog = true,\n compact = false,\n attention = null,\n labels: labelOverrides,\n className,\n}: CollabStatusProps) {\n const labels = { ...defaultCollabStatusLabels, ...labelOverrides };\n const [open, setOpen] = React.useState(false);\n const [wrapped, setWrapped] = React.useState(false);\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const panelRef = React.useRef<HTMLDivElement>(null);\n const pos = useAnchoredPanel(open && showLog, triggerRef, panelRef);\n const titleId = React.useId();\n\n // Escape closes and returns focus; a pointer outside dismisses.\n React.useEffect(() => {\n if (!open) return;\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return;\n setOpen(false);\n triggerRef.current?.focus();\n };\n const onPointerDown = (e: Event) => {\n const target = e.target as Node;\n if (panelRef.current?.contains(target)) return;\n if (triggerRef.current?.contains(target)) return;\n setOpen(false);\n };\n document.addEventListener('keydown', onKeyDown);\n document.addEventListener('pointerdown', onPointerDown);\n return () => {\n document.removeEventListener('keydown', onKeyDown);\n document.removeEventListener('pointerdown', onPointerDown);\n };\n }, [open]);\n\n const occupants = peerLabels(peers);\n const names = occupants.map((p) => p.label);\n // Long values are clipped to one line; the panel's wrap toggle unclips them.\n const clip = wrapped ? 'break-all whitespace-pre-wrap' : 'truncate';\n const statusText = connected ? labels.live : labels.connecting;\n const clientLine = `${room?.clientId ?? '—'} · ${\n connected ? labels.clientSynced : labels.clientConnecting\n }`;\n // Compact triggers have no visible text, so the status and who is editing\n // have to reach assistive tech (and the tooltip) through the label.\n const triggerLabel = compact\n ? [\n labels.triggerLabel,\n statusText,\n attention,\n names.length > 0 && labels.editing(names),\n ]\n .filter(Boolean)\n .join(' — ')\n : labels.triggerLabel;\n\n const trigger = (\n <button\n type=\"button\"\n ref={triggerRef}\n className={cn(\n 'text-muted-foreground inline-flex items-center gap-1.5 rounded-md px-1.5 py-0.5 text-xs',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:outline-none',\n showLog && 'hover:bg-muted cursor-pointer',\n className\n )}\n onClick={showLog ? () => setOpen((v) => !v) : undefined}\n disabled={!showLog}\n title={showLog ? triggerLabel : undefined}\n aria-expanded={showLog ? open : undefined}\n aria-label={showLog ? triggerLabel : undefined}\n data-slot=\"collab-status-trigger\"\n >\n <span\n aria-hidden=\"true\"\n data-slot=\"collab-status-dot\"\n className={cn(\n 'h-2 w-2 shrink-0 rounded-full',\n !connected && 'bg-warning-500 animate-pulse',\n connected && attention && 'bg-warning-500',\n connected && !attention && 'bg-success-500'\n )}\n />\n {!compact && <span>{statusText}</span>}\n {!compact && attention && (\n <span className=\"text-warning-700 dark:text-warning-400 truncate\">\n · {attention}\n </span>\n )}\n {!compact && names.length > 0 && (\n <span className=\"truncate\">{`· ${labels.editing(names)}`}</span>\n )}\n </button>\n );\n\n if (!showLog) return trigger;\n\n return (\n <span\n className=\"relative inline-flex items-center\"\n data-slot=\"collab-status\"\n >\n {trigger}\n {open &&\n typeof document !== 'undefined' &&\n createPortal(\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-labelledby={titleId}\n data-slot=\"collab-status-panel\"\n className={cn(\n 'bg-card text-card-foreground border-border fixed z-50 w-[26rem] max-w-[calc(100vw-1rem)]',\n 'rounded-lg border p-3 text-xs shadow-xl'\n )}\n style={{\n top: pos?.top ?? 0,\n left: pos?.left ?? 0,\n visibility: pos ? undefined : 'hidden',\n }}\n >\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <strong id={titleId} className=\"text-foreground text-sm\">\n {labels.logTitle(log.length)}\n </strong>\n <span className=\"flex items-center gap-0.5\">\n <button\n type=\"button\"\n className={cn(\n 'hover:text-foreground focus-visible:ring-ring rounded p-0.5 focus-visible:ring-2 focus-visible:outline-none',\n wrapped\n ? 'text-foreground bg-muted'\n : 'text-muted-foreground'\n )}\n onClick={() => setWrapped((v) => !v)}\n aria-pressed={wrapped}\n aria-label={labels.wrap}\n title={labels.wrap}\n data-slot=\"collab-status-wrap\"\n >\n <WrapText className=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground focus-visible:ring-ring rounded p-0.5 focus-visible:ring-2 focus-visible:outline-none\"\n onClick={() => {\n setOpen(false);\n triggerRef.current?.focus();\n }}\n aria-label={labels.close}\n >\n <X className=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n </span>\n </div>\n\n {attention && (\n <p\n data-slot=\"collab-status-attention\"\n className=\"text-warning-700 dark:text-warning-400 mb-2\"\n >\n {attention}\n </p>\n )}\n\n {room && (\n <dl className=\"border-border text-muted-foreground mb-2 grid grid-cols-[auto_1fr] gap-x-3 gap-y-0.5 border-b pb-2\">\n <dt className=\"opacity-70\">{labels.roomTerm}</dt>\n {/* The values are clipped, so hovering must reveal the rest. */}\n <dd className={clip} title={room.name}>\n {room.name}\n </dd>\n {room.url && (\n <>\n <dt className=\"opacity-70\">{labels.urlTerm}</dt>\n <dd className={clip} title={room.url}>\n {room.url}\n </dd>\n </>\n )}\n <dt className=\"opacity-70\">{labels.clientTerm}</dt>\n <dd className={clip} title={clientLine}>\n {clientLine}\n </dd>\n {room.userId && (\n <>\n <dt className=\"opacity-70\">{labels.userTerm}</dt>\n <dd className={clip} title={room.userId}>\n {room.userId}\n </dd>\n </>\n )}\n </dl>\n )}\n\n <section className=\"border-border mb-2 border-b pb-2\">\n <strong className=\"text-foreground mb-1 block\">\n {labels.peersTitle(peers.length)}\n </strong>\n {peers.length === 0 ? (\n <p className=\"text-muted-foreground\">{labels.alone}</p>\n ) : (\n <ul\n className=\"flex flex-wrap gap-x-3 gap-y-1\"\n data-slot=\"collab-status-peers\"\n >\n {occupants.map((peer) => (\n <li key={peer.label} className=\"flex items-center gap-1.5\">\n <span\n aria-hidden=\"true\"\n className=\"h-2 w-2 shrink-0 rounded-full\"\n style={{\n backgroundColor: peer.color ?? 'currentColor',\n }}\n />\n <span\n className={cn('text-foreground', clip)}\n title={peer.label}\n >\n {peer.label}\n </span>\n </li>\n ))}\n </ul>\n )}\n </section>\n\n {log.length === 0 ? (\n <p className=\"text-muted-foreground\">{labels.empty}</p>\n ) : (\n <ul className=\"max-h-72 space-y-0.5 overflow-y-auto font-mono\">\n {log.map((e) => (\n <li\n key={e.id}\n className=\"grid grid-cols-[auto_auto_1fr] gap-2\"\n >\n <span className=\"text-muted-foreground opacity-70\">\n {new Date(e.at).toLocaleTimeString()}\n </span>\n <span\n className={cn(\n 'whitespace-nowrap',\n e.origin === 'remote'\n ? 'text-primary-600 dark:text-primary-400'\n : KIND_TONE[e.kind]\n )}\n >\n {e.kind}\n {e.origin ? `/${e.origin}` : ''}\n </span>\n <span\n className={cn('text-foreground', clip)}\n title={e.detail}\n >\n {e.detail}\n </span>\n </li>\n ))}\n </ul>\n )}\n </div>,\n document.body\n )}\n </span>\n );\n}\n","import * as React from 'react';\nimport type {\n CollabLogEntry,\n CollabPeer,\n CollabRoomInfo,\n} from './CollabStatus';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n// =============================================================================\n// Structural Yjs types\n// =============================================================================\n//\n// Declared structurally (as methods, so parameter bivariance applies) rather\n// than imported from `yjs` / `y-protocols`, so `@mieweb/ui` needs no Yjs\n// dependency at all. A real `Y.Doc`, `Awareness` and `WebsocketProvider`\n// satisfy these as-is.\n\n/** The subset of `Y.Doc` this hook observes. */\nexport interface YjsDocLike {\n clientID: number;\n on(event: string, handler: (...args: any[]) => void): void;\n off(event: string, handler: (...args: any[]) => void): void;\n}\n\n/** The subset of `y-protocols/awareness`.`Awareness` this hook uses. */\nexport interface YjsAwarenessLike {\n clientID: number;\n getStates(): Map<number, Record<string, any>>;\n setLocalStateField(field: string, value: unknown): void;\n on(event: string, handler: (...args: any[]) => void): void;\n off(event: string, handler: (...args: any[]) => void): void;\n}\n\n/** The subset of `y-websocket`.`WebsocketProvider` this hook uses. */\nexport interface YjsProviderLike {\n awareness: YjsAwarenessLike;\n /** True once the initial sync completed (y-websocket exposes this). */\n synced?: boolean;\n /** Room name, used as the default label in the debug panel. */\n roomname?: string;\n /** Server URL, used as the default label in the debug panel. */\n url?: string;\n on(event: string, handler: (...args: any[]) => void): void;\n off(event: string, handler: (...args: any[]) => void): void;\n}\n\n/** Awareness payload published whenever this window makes a local edit. */\ninterface EditActivity {\n at: number;\n fields: string[];\n}\n\n/** A remote collaborator's edit that just changed the open document. */\nexport interface CollabRemoteEdit {\n /** Human-readable labels of the fields that changed. */\n fields: string[];\n /** Who made the change, when attributable from presence. */\n by?: string;\n /** Timestamp; a new value signals a fresh growl/toast. */\n at: number;\n}\n\nexport interface UseYjsCollabStatusOptions {\n /** The shared document. Pass null to keep the hook inert. */\n doc: YjsDocLike | null | undefined;\n /** The sync provider (e.g. `y-websocket`). Pass null to keep it inert. */\n provider: YjsProviderLike | null | undefined;\n /**\n * Presence identity published for this window. Defaults to\n * `User <clientID>` so windows are distinguishable without a login.\n */\n user?: { name?: string; color?: string };\n /** Room label for the debug panel. Defaults to `provider.roomname`. */\n roomName?: string;\n /** URL label for the debug panel. Defaults to `provider.url`. */\n url?: string;\n /** Application user id shown in the debug panel. */\n userId?: string;\n /** Maximum log entries kept in memory. Default 100. */\n logCap?: number;\n}\n\nexport interface YjsCollabStatus {\n /** True once the initial server sync completed. */\n connected: boolean;\n /** Other windows currently present in the room. */\n peers: CollabPeer[];\n /** Recent collaboration events, newest first. */\n log: CollabLogEntry[];\n /** Room identity for the debug panel. */\n room: CollabRoomInfo | null;\n /** The most recent remote edit, or null. */\n lastRemoteEdit: CollabRemoteEdit | null;\n /**\n * Announce a local edit and the fields it touched, so other windows can\n * attribute it. Also records a `patch` log entry.\n */\n publishActivity: (fields: string[]) => void;\n}\n\n// =============================================================================\n// Hook\n// =============================================================================\n\n/**\n * Bind {@link CollabStatus} to a Yjs room: tracks initial-sync state, publishes\n * this window's presence, tracks peers joining/leaving, attributes remote edits,\n * and keeps a capped log of document/awareness/sync events.\n *\n * The return value is spreadable straight into the component.\n *\n * @example\n * ```tsx\n * import * as Y from 'yjs';\n * import { WebsocketProvider } from 'y-websocket';\n * import { CollabStatus, useYjsCollabStatus } from '@mieweb/ui';\n *\n * function Header({ caseId }: { caseId: string }) {\n * const doc = React.useMemo(() => new Y.Doc(), []);\n * const provider = React.useMemo(\n * () => new WebsocketProvider('ws://localhost:1234', `case/${caseId}`, doc),\n * [doc, caseId]\n * );\n * React.useEffect(() => () => provider.destroy(), [provider]);\n *\n * const status = useYjsCollabStatus({ doc, provider, user: { name: 'Ann' } });\n * return <CollabStatus {...status} />;\n * }\n * ```\n */\nexport function useYjsCollabStatus({\n doc,\n provider,\n user,\n roomName,\n url,\n userId,\n logCap = 100,\n}: UseYjsCollabStatusOptions): YjsCollabStatus {\n const [connected, setConnected] = React.useState(false);\n const [peers, setPeers] = React.useState<CollabPeer[]>([]);\n const [lastRemoteEdit, setLastRemoteEdit] =\n React.useState<CollabRemoteEdit | null>(null);\n const [log, setLog] = React.useState<CollabLogEntry[]>([]);\n\n const logIdRef = React.useRef(0);\n const awarenessRef = React.useRef<YjsAwarenessLike | null>(null);\n /** Effective display name published to presence. */\n const selfNameRef = React.useRef('');\n /** Last activity timestamp seen per remote client, to detect new edits. */\n const activitySeen = React.useRef(new Map<number, number>());\n /** Names present, keyed by clientID, to detect join/leave. */\n const peerNames = React.useRef(new Map<number, string>());\n\n const pushLog = React.useCallback(\n (entry: Omit<CollabLogEntry, 'id' | 'at'>) => {\n const full: CollabLogEntry = {\n id: ++logIdRef.current,\n at: Date.now(),\n ...entry,\n };\n setLog((prev) => [full, ...prev].slice(0, logCap));\n },\n [logCap]\n );\n\n const selfName = user?.name?.trim();\n const selfColor = user?.color;\n\n React.useEffect(() => {\n if (!doc || !provider) {\n setConnected(false);\n setPeers([]);\n setLastRemoteEdit(null);\n return;\n }\n\n const awareness = provider.awareness;\n awarenessRef.current = awareness;\n activitySeen.current = new Map();\n peerNames.current = new Map();\n setConnected(provider.synced ?? false);\n\n // Remote updates arrive with `origin === provider`; local transactions have\n // a null origin — that is what labels the log entry.\n const onDocUpdate = (update: Uint8Array, origin: unknown) => {\n pushLog({\n kind: 'doc',\n origin: origin === provider ? 'remote' : 'local',\n detail: `doc update · ${update.byteLength} bytes`,\n });\n };\n doc.on('update', onDocUpdate);\n\n const onSync = (isSynced: boolean) => {\n setConnected(isSynced);\n pushLog({\n kind: 'sync',\n detail: isSynced ? 'synced with server' : 'disconnected',\n });\n };\n provider.on('sync', onSync);\n\n const onStatus = (event: { status?: string }) => {\n if (event?.status === 'disconnected') setConnected(false);\n };\n provider.on('status', onStatus);\n\n const onAwareness = () => {\n const others: CollabPeer[] = [];\n const present = new Map<number, string>();\n let freshest: CollabRemoteEdit | null = null;\n\n awareness.getStates().forEach((state, clientId) => {\n if (clientId === awareness.clientID) return; // skip this window\n const peer = state.user as CollabPeer | undefined;\n if (peer?.name) {\n others.push({ name: peer.name, color: peer.color });\n present.set(clientId, peer.name);\n }\n const activity = state.activity as EditActivity | undefined;\n if (\n activity &&\n activity.at > (activitySeen.current.get(clientId) ?? 0)\n ) {\n activitySeen.current.set(clientId, activity.at);\n if (!freshest || activity.at > freshest.at) {\n const sameUser = !!peer?.name && peer.name === selfNameRef.current;\n freshest = {\n fields: activity.fields,\n by: sameUser ? 'You (another window)' : peer?.name,\n at: activity.at,\n };\n }\n }\n });\n\n for (const [clientId, name] of present) {\n if (!peerNames.current.has(clientId)) {\n pushLog({\n kind: 'awareness',\n origin: 'remote',\n detail: `${name} joined the room`,\n });\n }\n }\n for (const [clientId, name] of peerNames.current) {\n if (!present.has(clientId)) {\n pushLog({\n kind: 'awareness',\n origin: 'remote',\n detail: `${name} left the room`,\n });\n }\n }\n peerNames.current = present;\n setPeers(others);\n\n if (freshest) {\n const edit = freshest as CollabRemoteEdit;\n setLastRemoteEdit(edit);\n pushLog({\n kind: 'awareness',\n origin: 'remote',\n detail: `${edit.by ?? 'peer'} edited ${edit.fields.join(', ')}`,\n });\n }\n };\n awareness.on('change', onAwareness);\n\n return () => {\n doc.off('update', onDocUpdate);\n provider.off('sync', onSync);\n provider.off('status', onStatus);\n awareness.off('change', onAwareness);\n awarenessRef.current = null;\n activitySeen.current = new Map();\n peerNames.current = new Map();\n setConnected(false);\n setPeers([]);\n setLastRemoteEdit(null);\n setLog([]);\n };\n }, [doc, provider, pushLog]);\n\n // Publish (and re-publish) this window's presence without tearing the room\n // down when the display name changes. Runs after the room effect above, which\n // is what populates `awarenessRef`.\n React.useEffect(() => {\n const awareness = awarenessRef.current;\n if (!awareness) return;\n const name = selfName || `User ${awareness.clientID}`;\n selfNameRef.current = name;\n awareness.setLocalStateField('user', { name, color: selfColor });\n }, [provider, selfName, selfColor]);\n\n const publishActivity = React.useCallback(\n (fields: string[]) => {\n awarenessRef.current?.setLocalStateField('activity', {\n at: Date.now(),\n fields,\n } satisfies EditActivity);\n pushLog({\n kind: 'patch',\n origin: 'local',\n detail: `edited ${fields.join(', ')}`,\n });\n },\n [pushLog]\n );\n\n const room: CollabRoomInfo | null =\n doc && provider\n ? {\n name: roomName ?? provider.roomname ?? 'room',\n url: url ?? provider.url,\n clientId: doc.clientID,\n userId,\n }\n : null;\n\n return { connected, peers, log, room, lastRemoteEdit, publishActivity };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/AI/ComposerModelSelector.tsx","../src/components/Messaging/AttachmentPicker.tsx","../src/components/Messaging/useMentionAutocomplete.tsx","../src/components/ChatComposer/ChatComposer.tsx","../src/components/ChatComposer/migration-notice.ts"],"names":["React","useAnchoredPosition","value","useClickOutside","useEscapeKey","jsxs","Fragment","cn","jsx","ChevronUp","createPortal","Check","ChevronRight","ChevronLeft","React2","React3","React4","ChatComposer","AlertTriangle","X","Dropdown","Plus","DropdownItem","Paperclip","DropdownSeparator","Mic","Square","Loader2","ArrowUp","Bot"],"mappings":"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","file":"chunk-X4XPNTCZ.cjs","sourcesContent":["import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { Check, ChevronLeft, ChevronRight, ChevronUp } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\nimport { useClickOutside } from '../../hooks/useClickOutside';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\n\nexport type ProviderModelValue = {\n provider: string;\n model: string;\n};\n\nexport type ProviderModelOption = ProviderModelValue & {\n label?: string;\n providerLabel?: string;\n id?: string;\n};\n\n/** A reasoning-effort level offered alongside the model. */\nexport type ComposerEffortOption = {\n value: string;\n label: string;\n /** Optional secondary line, e.g. a caveat about cost or latency. */\n description?: string;\n};\n\ntype ComposerModelSelectorBaseProps = {\n models: ProviderModelOption[];\n value: ProviderModelValue | null;\n onChange: (value: ProviderModelValue) => void;\n disabled?: boolean;\n /**\n * Trigger appearance: 'default' is the bordered pill; 'ghost' is a quiet\n * text trigger that matches ChatComposer's selector-row controls.\n */\n variant?: 'default' | 'ghost';\n className?: string;\n boundaryRef?: React.RefObject<HTMLElement | null>;\n placeholder?: string;\n anyLabel?: string;\n emptyLabel?: string;\n ariaLabel?: string;\n /**\n * Reasoning-effort levels for the selected model. Omit or pass an empty\n * array to hide the effort row entirely, which is what a model that cannot\n * reason should resolve to — the levels are provider-specific, so the caller\n * owns deciding which apply.\n */\n effortOptions?: ComposerEffortOption[];\n /** Currently selected effort. */\n effort?: string | null;\n /** Effort marked with a \"default\" badge in the list. */\n defaultEffort?: string;\n onEffortChange?: (value: string) => void;\n effortLabel?: string;\n effortHint?: string;\n defaultBadgeLabel?: string;\n backLabel?: string;\n};\n\ntype ControlledProviderFilterProps = {\n providerFilter: string | null;\n onProviderFilterChange: (provider: string | null) => void;\n};\n\ntype UncontrolledProviderFilterProps = {\n providerFilter?: undefined;\n onProviderFilterChange?: (provider: string | null) => void;\n};\n\nexport type ComposerModelSelectorProps = ComposerModelSelectorBaseProps &\n (ControlledProviderFilterProps | UncontrolledProviderFilterProps);\n\nconst MENU_OFFSET_PX = 6;\nconst MENU_MAX_HEIGHT_PX = 320;\n\nfunction optionKey(option: ProviderModelValue) {\n return `${option.provider}\\u0000${option.model}`;\n}\n\nfunction renderedOptionKey(option: ProviderModelOption, index: number) {\n return `${option.id ?? optionKey(option)}\\u0000${index}`;\n}\n\ntype RenderedModelOption = {\n option: ProviderModelOption;\n index: number;\n key: string;\n};\n\nfunction groupByProvider(models: ProviderModelOption[]) {\n const groups = new Map<string, ProviderModelOption[]>();\n\n for (const model of models) {\n const group = groups.get(model.provider);\n if (group) {\n group.push(model);\n } else {\n groups.set(model.provider, [model]);\n }\n }\n\n return Array.from(groups, ([provider, options]) => ({ provider, options }));\n}\n\nfunction getProviderLabel(models: ProviderModelOption[], provider: string) {\n return (\n models.find((model) => model.provider === provider && model.providerLabel)\n ?.providerLabel ?? provider\n );\n}\n\nexport function ComposerModelSelector({\n models,\n value,\n providerFilter,\n onProviderFilterChange,\n onChange,\n disabled = false,\n variant = 'default',\n className,\n boundaryRef,\n placeholder = 'Model',\n anyLabel = 'Any',\n emptyLabel = 'No models',\n ariaLabel = 'Model',\n effortOptions,\n effort = null,\n defaultEffort,\n onEffortChange,\n effortLabel = 'Effort',\n effortHint,\n defaultBadgeLabel = 'Default',\n backLabel = 'Back',\n}: ComposerModelSelectorProps) {\n const [open, setOpen] = React.useState(false);\n // The menu drills down rather than opening a side panel: one anchored\n // surface is far less fragile near the viewport edge, which is exactly where\n // a composer sits.\n const [view, setView] = React.useState<'models' | 'effort'>('models');\n const [effortHighlight, setEffortHighlight] = React.useState(0);\n const [internalProviderFilter, setInternalProviderFilter] = React.useState<\n string | null\n >(null);\n const [highlightedIndex, setHighlightedIndex] = React.useState(0);\n const listRef = React.useRef<HTMLDivElement>(null);\n const effortListRef = React.useRef<HTMLDivElement>(null);\n const menuId = React.useId();\n const {\n anchorRef: triggerRef,\n floatingRef: menuRef,\n style: menuStyle,\n } = useAnchoredPosition<HTMLButtonElement, HTMLDivElement>({\n open,\n placement: 'top-start',\n offset: MENU_OFFSET_PX,\n matchMinWidth: true,\n maxHeight: MENU_MAX_HEIGHT_PX,\n allowFlip: false,\n boundaryRef,\n });\n\n const activeProviderFilter =\n providerFilter === undefined ? internalProviderFilter : providerFilter;\n const selectedKey = value ? optionKey(value) : null;\n const selectedOption = models.find(\n (model) => optionKey(model) === selectedKey\n );\n const providers = React.useMemo(\n () => Array.from(new Set(models.map((model) => model.provider))),\n [models]\n );\n const providerLabels = React.useMemo(\n () =>\n new Map(\n providers.map((provider) => [\n provider,\n getProviderLabel(models, provider),\n ])\n ),\n [models, providers]\n );\n const filteredModels = React.useMemo(\n () =>\n activeProviderFilter === null\n ? models\n : models.filter((model) => model.provider === activeProviderFilter),\n [activeProviderFilter, models]\n );\n const groupedModels = React.useMemo(\n () => groupByProvider(filteredModels),\n [filteredModels]\n );\n const groupedRenderedModels = React.useMemo(() => {\n let index = 0;\n return groupedModels.map((group) => ({\n provider: group.provider,\n options: group.options.map((option) => {\n const rendered: RenderedModelOption = {\n option,\n index,\n key: renderedOptionKey(option, index),\n };\n index += 1;\n return rendered;\n }),\n }));\n }, [groupedModels]);\n const renderedModels = React.useMemo(\n () => groupedRenderedModels.flatMap((group) => group.options),\n [groupedRenderedModels]\n );\n const getOptionId = React.useCallback(\n (index: number) => `${menuId}-option-${index}`,\n [menuId]\n );\n // The two views are mutually exclusive, so both listboxes carry `menuId` and\n // the trigger's `aria-controls` stays pointed at whichever one is rendered.\n // Option ids are namespaced per view so they cannot collide.\n const getEffortOptionId = React.useCallback(\n (index: number) => `${menuId}-effort-option-${index}`,\n [menuId]\n );\n const activeOptionId =\n open && renderedModels[highlightedIndex]\n ? getOptionId(highlightedIndex)\n : undefined;\n const selectedRenderedIndex = React.useMemo(\n () =>\n selectedKey\n ? renderedModels.findIndex(\n (renderedModel) => optionKey(renderedModel.option) === selectedKey\n )\n : -1,\n [renderedModels, selectedKey]\n );\n\n const setProvider = React.useCallback(\n (provider: string | null) => {\n if (providerFilter === undefined) {\n setInternalProviderFilter(provider);\n }\n onProviderFilterChange?.(provider);\n },\n [onProviderFilterChange, providerFilter]\n );\n\n const close = React.useCallback(\n (restoreFocus = true) => {\n setOpen(false);\n if (restoreFocus) {\n triggerRef.current?.focus({ preventScroll: true });\n }\n },\n [triggerRef]\n );\n\n const selectModel = React.useCallback(\n (model: ProviderModelOption) => {\n onChange({ provider: model.provider, model: model.model });\n close();\n },\n [close, onChange]\n );\n\n const efforts = React.useMemo(() => effortOptions ?? [], [effortOptions]);\n const activeEffortOptionId =\n open && efforts[effortHighlight]\n ? getEffortOptionId(effortHighlight)\n : undefined;\n const selectedEffortOption = efforts.find(\n (option) => option.value === effort\n );\n\n const selectEffort = React.useCallback(\n (value: string) => {\n onEffortChange?.(value);\n close();\n },\n [close, onEffortChange]\n );\n\n const handleEffortKeyDown = (event: React.KeyboardEvent) => {\n if (efforts.length === 0) return;\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setEffortHighlight((current) => (current + 1) % efforts.length);\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setEffortHighlight(\n (current) => (current - 1 + efforts.length) % efforts.length\n );\n }\n if (event.key === 'Home') {\n event.preventDefault();\n setEffortHighlight(0);\n }\n if (event.key === 'End') {\n event.preventDefault();\n setEffortHighlight(efforts.length - 1);\n }\n // Left/Backspace mirrors the drill-down affordance so keyboard users can\n // get back to the model list without reaching for the mouse.\n if (event.key === 'ArrowLeft' || event.key === 'Backspace') {\n event.preventDefault();\n setView('models');\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n const highlighted = efforts[effortHighlight];\n if (highlighted) selectEffort(highlighted.value);\n }\n };\n\n const outsideRefs = React.useMemo(\n () => [triggerRef, menuRef],\n [triggerRef, menuRef]\n );\n\n useClickOutside(outsideRefs, () => close(false), open);\n\n useEscapeKey(close, open);\n\n React.useEffect(() => {\n if (!open) return;\n setHighlightedIndex(selectedRenderedIndex >= 0 ? selectedRenderedIndex : 0);\n }, [activeProviderFilter, open, selectedRenderedIndex]);\n\n // Every open starts on the model list. Deliberately keyed on `open` alone:\n // callers commonly derive `effortOptions` from the selected model, so the\n // array identity changes on every parent render, and folding that into this\n // effect would drop the user back to the model list mid-interaction.\n React.useEffect(() => {\n if (!open) return;\n setView('models');\n }, [open]);\n\n // The effort list starts on the current value so Enter is a no-op rather\n // than a surprise change.\n React.useEffect(() => {\n if (!open) return;\n const current = efforts.findIndex((option) => option.value === effort);\n setEffortHighlight(current >= 0 ? current : 0);\n }, [effort, efforts, open]);\n\n React.useEffect(() => {\n if (!open) return;\n setHighlightedIndex((current) =>\n Math.min(current, Math.max(renderedModels.length - 1, 0))\n );\n }, [open, renderedModels.length]);\n\n React.useEffect(() => {\n if (!open) return;\n requestAnimationFrame(() => {\n const target =\n view === 'effort' ? effortListRef.current : listRef.current;\n target?.focus({ preventScroll: true });\n });\n }, [open, view]);\n\n const handleTriggerKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n setOpen(true);\n }\n };\n\n const handleMenuKeyDown = (event: React.KeyboardEvent) => {\n if (renderedModels.length === 0) return;\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setHighlightedIndex((current) => (current + 1) % renderedModels.length);\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setHighlightedIndex(\n (current) =>\n (current - 1 + renderedModels.length) % renderedModels.length\n );\n }\n if (event.key === 'Home') {\n event.preventDefault();\n setHighlightedIndex(0);\n }\n if (event.key === 'End') {\n event.preventDefault();\n setHighlightedIndex(renderedModels.length - 1);\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n const highlightedModel = renderedModels[highlightedIndex]?.option;\n if (highlightedModel) {\n selectModel(highlightedModel);\n }\n }\n };\n\n return (\n <>\n <button\n ref={triggerRef}\n type=\"button\"\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? menuId : undefined}\n onClick={() => setOpen((current) => !current)}\n onKeyDown={handleTriggerKeyDown}\n data-slot=\"composer-model-selector-trigger\"\n className={cn(\n variant === 'ghost'\n ? [\n 'inline-flex max-w-full min-w-0 items-center gap-1 rounded-md px-2 py-1 text-xs',\n 'text-neutral-600 dark:text-neutral-400',\n 'transition-colors duration-150',\n 'hover:bg-neutral-100 hover:text-neutral-900 dark:hover:bg-neutral-700 dark:hover:text-white',\n 'focus-visible:ring-primary-500 focus-visible:ring-2 focus-visible:outline-none',\n 'disabled:pointer-events-none disabled:opacity-40',\n ]\n : [\n 'inline-flex h-8 max-w-full items-center gap-1.5 rounded-full border px-2.5 text-sm font-medium',\n 'border-border bg-background text-foreground shadow-sm',\n 'hover:bg-muted/50',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n ],\n className\n )}\n >\n <span className=\"min-w-0 truncate\">\n {selectedOption?.label ?? selectedOption?.model ?? placeholder}\n </span>\n {selectedEffortOption && (\n <span\n data-slot=\"composer-model-selector-trigger-effort\"\n className=\"text-muted-foreground min-w-0 truncate font-normal\"\n >\n {selectedEffortOption.label}\n </span>\n )}\n <ChevronUp\n aria-hidden=\"true\"\n className={cn(\n 'shrink-0',\n variant === 'ghost' ? 'h-3 w-3' : 'h-3.5 w-3.5'\n )}\n />\n </button>\n\n {open &&\n createPortal(\n <div\n ref={menuRef}\n style={menuStyle}\n data-slot=\"composer-model-selector-menu\"\n className={cn(\n 'border-border bg-card text-card-foreground flex w-80 max-w-full flex-col rounded-lg border shadow-lg',\n 'animate-in fade-in overflow-hidden duration-100'\n )}\n >\n {view === 'models' && (\n <>\n <div\n data-slot=\"composer-model-selector-provider-filter\"\n className=\"border-border flex min-h-9 items-center gap-1 overflow-x-auto overflow-y-hidden border-b p-2\"\n >\n {[null, ...providers].map((provider) => {\n const selected = activeProviderFilter === provider;\n return (\n <button\n key={provider ?? 'all-providers'}\n type=\"button\"\n aria-pressed={selected}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setProvider(provider)}\n className={cn(\n 'inline-flex h-6 shrink-0 items-center justify-center rounded-full px-2.5 text-xs font-medium whitespace-nowrap transition-colors',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n selected\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n >\n {provider === null\n ? anyLabel\n : (providerLabels.get(provider) ?? provider)}\n </button>\n );\n })}\n </div>\n\n <div\n ref={listRef}\n id={menuId}\n role=\"listbox\"\n aria-label={ariaLabel}\n aria-activedescendant={activeOptionId}\n tabIndex={-1}\n onKeyDown={handleMenuKeyDown}\n className=\"min-h-0 flex-1 overflow-y-auto p-1\"\n >\n {groupedModels.length === 0 ? (\n <div className=\"text-muted-foreground px-3 py-4 text-center text-sm\">\n {emptyLabel}\n </div>\n ) : (\n groupedRenderedModels.map((group) => (\n <div\n key={group.provider}\n role=\"group\"\n aria-label={\n providerLabels.get(group.provider) ?? group.provider\n }\n >\n <div className=\"text-muted-foreground px-3 py-1.5 text-xs font-semibold uppercase\">\n {providerLabels.get(group.provider) ?? group.provider}\n </div>\n {group.options.map((renderedModel) => {\n const { index, key, option: model } = renderedModel;\n\n const selected = optionKey(model) === selectedKey;\n const highlighted = index === highlightedIndex;\n\n return (\n <button\n key={key}\n id={getOptionId(index)}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => selectModel(model)}\n onMouseEnter={() => setHighlightedIndex(index)}\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-3 py-2 text-start text-sm',\n 'focus-visible:ring-ring transition-colors focus-visible:ring-2 focus-visible:outline-none',\n highlighted && 'bg-muted',\n selected && 'bg-primary/10 text-primary'\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {model.label ?? model.model}\n </span>\n {selected && (\n <Check\n aria-hidden=\"true\"\n className=\"text-primary h-4 w-4 shrink-0\"\n />\n )}\n </button>\n );\n })}\n </div>\n ))\n )}\n </div>\n\n {efforts.length > 0 && (\n <div className=\"border-border border-t p-1\">\n <button\n type=\"button\"\n data-slot=\"composer-model-selector-effort-row\"\n aria-haspopup=\"listbox\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setView('effort')}\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-3 py-2 text-start text-sm',\n 'hover:bg-muted transition-colors',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none'\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {effortLabel}\n </span>\n {selectedEffortOption && (\n <span className=\"text-muted-foreground min-w-0 truncate\">\n {selectedEffortOption.label}\n </span>\n )}\n <ChevronRight\n aria-hidden=\"true\"\n className=\"text-muted-foreground h-4 w-4 shrink-0 rtl:-scale-x-100\"\n />\n </button>\n </div>\n )}\n </>\n )}\n\n {view === 'effort' && (\n <>\n <div className=\"border-border flex items-center gap-1 border-b p-2\">\n <button\n type=\"button\"\n data-slot=\"composer-model-selector-effort-back\"\n aria-label={backLabel}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setView('models')}\n className={cn(\n 'inline-flex h-6 shrink-0 items-center gap-1 rounded-full px-2 text-xs font-medium',\n 'text-muted-foreground hover:bg-muted hover:text-foreground transition-colors',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none'\n )}\n >\n <ChevronLeft\n aria-hidden=\"true\"\n className=\"h-3.5 w-3.5 rtl:-scale-x-100\"\n />\n {effortLabel}\n </button>\n </div>\n\n {effortHint && (\n <p className=\"text-muted-foreground px-3 pt-2 text-xs\">\n {effortHint}\n </p>\n )}\n\n <div\n ref={effortListRef}\n id={menuId}\n role=\"listbox\"\n aria-label={effortLabel}\n aria-activedescendant={activeEffortOptionId}\n tabIndex={-1}\n onKeyDown={handleEffortKeyDown}\n className=\"min-h-0 flex-1 overflow-y-auto p-1\"\n >\n {efforts.map((option, index) => {\n const selected = option.value === effort;\n const highlighted = index === effortHighlight;\n\n return (\n <button\n key={option.value}\n id={getEffortOptionId(index)}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => selectEffort(option.value)}\n onMouseEnter={() => setEffortHighlight(index)}\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-3 py-2 text-start text-sm',\n 'focus-visible:ring-ring transition-colors focus-visible:ring-2 focus-visible:outline-none',\n highlighted && 'bg-muted',\n selected && 'bg-primary/10 text-primary'\n )}\n >\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">{option.label}</span>\n {option.description && (\n <span className=\"text-muted-foreground block truncate text-xs\">\n {option.description}\n </span>\n )}\n </span>\n {option.value === defaultEffort && (\n <span className=\"bg-muted text-muted-foreground shrink-0 rounded px-1.5 py-0.5 text-xs\">\n {defaultBadgeLabel}\n </span>\n )}\n {selected && (\n <Check\n aria-hidden=\"true\"\n className=\"text-primary h-4 w-4 shrink-0\"\n />\n )}\n </button>\n );\n })}\n </div>\n </>\n )}\n </div>,\n document.body\n )}\n </>\n );\n}\n\nComposerModelSelector.displayName = 'ComposerModelSelector';\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport type { AttachmentType, AttachmentState } from './types';\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Get file type from MIME type.\n */\nfunction getFileType(mimeType: string): AttachmentType {\n if (mimeType.startsWith('image/')) return 'image';\n if (mimeType.startsWith('video/')) return 'video';\n if (mimeType.startsWith('audio/')) return 'audio';\n if (\n mimeType.includes('pdf') ||\n mimeType.includes('document') ||\n mimeType.includes('text')\n ) {\n return 'document';\n }\n return 'file';\n}\n\n/**\n * Format file size in human-readable format.\n */\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/**\n * Validate file type and size.\n */\nfunction validateFile(\n file: File,\n acceptedTypes?: string[],\n maxSize?: number\n): { valid: boolean; error?: string } {\n if (acceptedTypes && acceptedTypes.length > 0) {\n const isAccepted = acceptedTypes.some((type) => {\n if (type.startsWith('.')) {\n return file.name.toLowerCase().endsWith(type.toLowerCase());\n }\n if (type.endsWith('/*')) {\n return file.type.startsWith(type.replace('/*', '/'));\n }\n return file.type === type;\n });\n if (!isAccepted) {\n return { valid: false, error: 'File type not supported' };\n }\n }\n\n if (maxSize && file.size > maxSize) {\n return {\n valid: false,\n error: `File too large (max ${formatFileSize(maxSize)})`,\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Generate a unique ID for attachments.\n */\nfunction generateAttachmentId(): string {\n return `attachment-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * MessageComposer's historical attachment validation defaults. Shared so\n * hosts that mount `ChatComposer` (which leaves file types and size\n * unrestricted) can apply the same limits — `MessageThread` does, and\n * `AIChat` does for legacy `composerProps` consumers.\n */\nconst DEFAULT_ACCEPTED_FILE_TYPES = [\n 'image/*',\n 'video/*',\n '.pdf',\n '.doc',\n '.docx',\n];\nconst DEFAULT_MAX_FILE_SIZE = 25 * 1024 * 1024;\n\n// ============================================================================\n// Attachment Preview Item Component\n// ============================================================================\n\nexport interface AttachmentPreviewItemProps {\n /** The attachment to preview */\n attachment: {\n id: string;\n file: File;\n previewUrl?: string;\n type: AttachmentType;\n state: AttachmentState;\n progress?: number;\n error?: string;\n };\n /** Called when remove is clicked */\n onRemove: () => void;\n /** Called when retry is clicked */\n onRetry?: () => void;\n /** Disables the remove/retry actions. */\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * Preview item for a pending attachment.\n */\nfunction AttachmentPreviewItem({\n attachment,\n onRemove,\n onRetry,\n disabled = false,\n className,\n}: AttachmentPreviewItemProps) {\n const { file, previewUrl, type, state, progress } = attachment;\n const isImage = type === 'image';\n const isVideo = type === 'video';\n const isUploading = state === 'uploading';\n const isFailed = state === 'failed';\n\n return (\n <div\n className={cn(\n 'group relative overflow-hidden rounded-lg',\n 'bg-neutral-100 dark:bg-neutral-800',\n 'border border-neutral-200 dark:border-neutral-700',\n isFailed && 'border-red-500',\n className\n )}\n >\n {/* Image/Video preview */}\n {(isImage || isVideo) && previewUrl ? (\n <div className=\"relative h-20 w-20\">\n {isVideo ? (\n <video\n src={previewUrl}\n aria-label={file.name}\n muted\n playsInline\n preload=\"metadata\"\n className={cn(\n 'h-full w-full object-cover',\n (isUploading || isFailed) && 'opacity-50'\n )}\n />\n ) : (\n <img\n src={previewUrl}\n alt={file.name}\n className={cn(\n 'h-full w-full object-cover',\n (isUploading || isFailed) && 'opacity-50'\n )}\n />\n )}\n {isVideo && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <svg\n aria-hidden=\"true\"\n className=\"h-6 w-6 text-white drop-shadow\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n </div>\n )}\n </div>\n ) : (\n /* File preview */\n <div className=\"flex h-20 w-20 flex-col items-center justify-center p-2\">\n <svg\n aria-hidden=\"true\"\n className=\"h-8 w-8 text-neutral-500\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n <span className=\"mt-1 max-w-full truncate px-1 text-xs text-neutral-600 dark:text-neutral-400\">\n {file.name.split('.').pop()?.toUpperCase()}\n </span>\n </div>\n )}\n\n {/* Upload progress overlay */}\n {isUploading && progress !== undefined && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/50\">\n <div className=\"text-center text-white\">\n <svg\n aria-hidden=\"true\"\n className=\"mx-auto h-6 w-6 animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\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 12h4z\"\n />\n </svg>\n <span className=\"mt-1 text-xs\">{progress}%</span>\n </div>\n </div>\n )}\n\n {/* Error overlay */}\n {isFailed && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/50\">\n <div className=\"text-center\">\n <svg\n aria-hidden=\"true\"\n className=\"mx-auto h-6 w-6 text-red-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n {onRetry && (\n <button\n type=\"button\"\n onClick={onRetry}\n disabled={disabled}\n className=\"mt-1 text-xs text-white underline hover:no-underline disabled:no-underline disabled:opacity-50\"\n >\n Retry\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Remove button */}\n <button\n type=\"button\"\n onClick={onRemove}\n disabled={disabled}\n className={cn(\n 'absolute -end-1 -top-1 z-10',\n 'rounded-full p-1',\n 'bg-neutral-900 text-white',\n 'opacity-0 group-hover:opacity-100',\n 'focus:ring-primary-500 focus:opacity-100 focus:ring-2 focus:outline-none',\n 'transition-opacity',\n 'disabled:cursor-not-allowed disabled:group-hover:opacity-0'\n )}\n aria-label={`Remove ${file.name}`}\n >\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n\n {/* File name tooltip on hover */}\n <div\n className={cn(\n 'absolute start-0 end-0 bottom-0',\n 'bg-black/70 px-1 py-0.5',\n 'opacity-0 group-hover:opacity-100',\n 'transition-opacity'\n )}\n >\n <p className=\"truncate text-xs text-white\">{file.name}</p>\n </div>\n </div>\n );\n}\n\nAttachmentPreviewItem.displayName = 'AttachmentPreviewItem';\n\n// ============================================================================\n// Attachment Picker Component\n// ============================================================================\n\nexport interface AttachmentPickerProps {\n /** Called when files are selected */\n onFilesSelected: (files: File[]) => void;\n /** Accepted file types (MIME types or extensions) */\n acceptedTypes?: string[];\n /** Maximum file size in bytes */\n maxFileSize?: number;\n /** Maximum number of files */\n maxFiles?: number;\n /** Whether multiple files can be selected */\n multiple?: boolean;\n /** Whether the picker is disabled */\n disabled?: boolean;\n /** Called when an error occurs */\n onError?: (error: string) => void;\n className?: string;\n children?: React.ReactNode;\n}\n\n/**\n * A button/trigger component for selecting attachments.\n */\nconst AttachmentPicker = React.forwardRef<\n HTMLInputElement,\n AttachmentPickerProps\n>(\n (\n {\n onFilesSelected,\n acceptedTypes = DEFAULT_ACCEPTED_FILE_TYPES,\n maxFileSize = DEFAULT_MAX_FILE_SIZE,\n maxFiles = 10,\n multiple = true,\n disabled = false,\n onError,\n className,\n children,\n },\n ref\n ) => {\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // Combine refs\n React.useImperativeHandle(ref, () => inputRef.current!);\n\n const handleClick = () => {\n inputRef.current?.click();\n };\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(event.target.files || []);\n if (files.length === 0) return;\n\n // Validate files\n const validFiles: File[] = [];\n for (const file of files.slice(0, maxFiles)) {\n const validation = validateFile(file, acceptedTypes, maxFileSize);\n if (validation.valid) {\n validFiles.push(file);\n } else if (onError) {\n onError(`${file.name}: ${validation.error}`);\n }\n }\n\n if (files.length > maxFiles && onError) {\n onError(`Maximum ${maxFiles} files allowed`);\n }\n\n if (validFiles.length > 0) {\n onFilesSelected(validFiles);\n }\n\n // Reset input\n event.target.value = '';\n };\n\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n accept={acceptedTypes.join(',')}\n multiple={multiple}\n onChange={handleChange}\n disabled={disabled}\n className=\"sr-only\"\n aria-label=\"Select files to attach\"\n />\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n data-slot=\"attachment-picker-button\"\n className={cn(\n 'inline-flex items-center justify-center',\n 'rounded-full p-2',\n 'text-neutral-500 hover:text-neutral-700',\n 'dark:text-neutral-400 dark:hover:text-neutral-200',\n 'hover:bg-neutral-100 dark:hover:bg-neutral-800',\n 'focus:ring-primary-500 focus:ring-2 focus:outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'transition-colors',\n className\n )}\n aria-label=\"Attach files\"\n >\n {children || (\n <svg\n aria-hidden=\"true\"\n className=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15.172 7l-6.586 6.586a2 2 0 102.828 2.828l6.414-6.586a4 4 0 00-5.656-5.656l-6.415 6.585a6 6 0 108.486 8.486L20.5 13\"\n />\n </svg>\n )}\n </button>\n </>\n );\n }\n);\n\nAttachmentPicker.displayName = 'AttachmentPicker';\n\n// ============================================================================\n// Drag Drop Zone Component\n// ============================================================================\n\nexport interface DragDropZoneProps {\n /** Called when files are dropped */\n onFilesDropped: (files: File[]) => void;\n /** Accepted file types */\n acceptedTypes?: string[];\n /** Maximum file size */\n maxFileSize?: number;\n /** Maximum number of files */\n maxFiles?: number;\n /** Whether the zone is disabled */\n disabled?: boolean;\n /** Called when an error occurs */\n onError?: (error: string) => void;\n /** Overlay text shown while dragging files over the zone. @default 'Drop files here' */\n overlayLabel?: string;\n /** Children to render inside the zone */\n children: React.ReactNode;\n className?: string;\n}\n\n/**\n * A wrapper component that accepts drag-and-drop files.\n */\nfunction DragDropZone({\n onFilesDropped,\n acceptedTypes,\n maxFileSize,\n maxFiles = 10,\n disabled = false,\n onError,\n overlayLabel = 'Drop files here',\n children,\n className,\n}: DragDropZoneProps) {\n const [isDragging, setIsDragging] = React.useState(false);\n const dragCounterRef = React.useRef(0);\n\n const handleDragEnter = (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n if (disabled) return;\n\n dragCounterRef.current++;\n if (event.dataTransfer.items && event.dataTransfer.items.length > 0) {\n setIsDragging(true);\n }\n };\n\n const handleDragLeave = (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n if (disabled) return;\n\n dragCounterRef.current--;\n if (dragCounterRef.current === 0) {\n setIsDragging(false);\n }\n };\n\n const handleDragOver = (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n const handleDrop = (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n if (disabled) return;\n\n setIsDragging(false);\n dragCounterRef.current = 0;\n\n const files = Array.from(event.dataTransfer.files);\n if (files.length === 0) return;\n\n // Validate files\n const validFiles: File[] = [];\n for (const file of files.slice(0, maxFiles)) {\n const validation = validateFile(file, acceptedTypes, maxFileSize);\n if (validation.valid) {\n validFiles.push(file);\n } else if (onError) {\n onError(`${file.name}: ${validation.error}`);\n }\n }\n\n if (files.length > maxFiles && onError) {\n onError(`Maximum ${maxFiles} files allowed`);\n }\n\n if (validFiles.length > 0) {\n onFilesDropped(validFiles);\n }\n };\n\n return (\n <div\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n className={cn('relative', className)}\n >\n {children}\n\n {/* Drag overlay */}\n {isDragging && (\n <div\n className={cn(\n 'absolute inset-0 z-50',\n 'flex items-center justify-center',\n 'bg-primary-50/90 dark:bg-primary-900/90',\n 'border-primary-500 border-2 border-dashed',\n 'rounded-lg'\n )}\n >\n <div className=\"text-center\">\n <svg\n aria-hidden=\"true\"\n className=\"text-primary-800 mx-auto h-12 w-12\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\"\n />\n </svg>\n <p className=\"text-primary-700 dark:text-primary-300 mt-2 text-sm font-medium\">\n {overlayLabel}\n </p>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nDragDropZone.displayName = 'DragDropZone';\n\n// ============================================================================\n// Camera Button Component (Mobile)\n// ============================================================================\n\nexport interface CameraButtonProps {\n /** Called when a photo is captured */\n onCapture: (file: File) => void;\n /** Whether to use front camera */\n useFrontCamera?: boolean;\n /** Whether the button is disabled */\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * Button to capture photos from camera (mobile).\n */\nfunction CameraButton({\n onCapture,\n useFrontCamera = false,\n disabled = false,\n className,\n}: CameraButtonProps) {\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const handleClick = () => {\n inputRef.current?.click();\n };\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (file) {\n onCapture(file);\n }\n event.target.value = '';\n };\n\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"image/*\"\n capture={useFrontCamera ? 'user' : 'environment'}\n onChange={handleChange}\n disabled={disabled}\n className=\"sr-only\"\n aria-label=\"Take a photo\"\n />\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n className={cn(\n 'inline-flex items-center justify-center',\n 'rounded-full p-2',\n 'text-neutral-500 hover:text-neutral-700',\n 'dark:text-neutral-400 dark:hover:text-neutral-200',\n 'hover:bg-neutral-100 dark:hover:bg-neutral-800',\n 'focus:ring-primary-500 focus:ring-2 focus:outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'transition-colors',\n className\n )}\n aria-label=\"Take a photo\"\n >\n <svg\n aria-hidden=\"true\"\n className=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 13a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n </svg>\n </button>\n </>\n );\n}\n\nCameraButton.displayName = 'CameraButton';\n\nexport {\n AttachmentPicker,\n AttachmentPreviewItem,\n DragDropZone,\n CameraButton,\n DEFAULT_ACCEPTED_FILE_TYPES,\n DEFAULT_MAX_FILE_SIZE,\n getFileType,\n formatFileSize,\n validateFile,\n generateAttachmentId,\n};\n","import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\n\n// ============================================================================\n// @mention autocomplete — consumed by ChatComposer (and, before its\n// retirement in 0.10.0, MessageComposer — it was extracted verbatim from it:\n// query detection, keyboard navigation, insertion, ARIA combobox wiring,\n// listbox rendering). Do not change semantics here without running\n// ChatComposer's test suite plus the SuperChat/AIChat consumer suites.\n// ============================================================================\n\n/**\n * A candidate for the composer's `@mention` autocomplete. Generic so any\n * surface (multi-party chat, agent picker, …) can supply its own list.\n */\nexport interface MentionOption {\n /** Stable unique key for the suggestion list. */\n id: string;\n /** Display name shown in the suggestion list. */\n label: string;\n /** Text inserted after `@` on selection. Defaults to the first word of `label`. */\n value?: string;\n /** Optional secondary text shown after the label. */\n description?: string;\n /** Optional leading node (e.g. an avatar). */\n icon?: React.ReactNode;\n /** Optional trailing meta text (e.g. a kind tag). */\n meta?: string;\n}\n\n/**\n * Find the active `@query` immediately before the caret, if any. The `@` must\n * start the string or follow whitespace, and the token must contain no spaces\n * or further `@`.\n */\nexport function activeMentionQuery(\n value: string,\n caret: number\n): { query: string; start: number } | null {\n const upToCaret = value.slice(0, caret);\n const match = /(^|\\s)@([^\\s@]*)$/.exec(upToCaret);\n if (!match) return null;\n const query = match[2];\n return { query, start: caret - query.length - 1 };\n}\n\nexport interface UseMentionAutocompleteOptions {\n /** Mention candidates. Mentions are disabled when undefined or empty. */\n options?: MentionOption[];\n /** Current composer text. */\n value: string;\n /** Write the composer text (host handles controlled/uncontrolled). */\n setValue: (next: string) => void;\n /** The composer textarea, for caret restore after insertion. */\n textareaRef: React.RefObject<HTMLTextAreaElement | null>;\n}\n\nexport interface MentionAutocomplete {\n /** Whether mention support is active (options provided and non-empty). */\n enabled: boolean;\n /** Whether the suggestion menu is currently open. */\n menuOpen: boolean;\n /** Suggestions matching the active query. */\n suggestions: MentionOption[];\n /** Clamped highlight index (`-1` while the menu is closed). */\n highlight: number;\n /** id of the listbox element. */\n listId: string;\n /** id for the option at `index`. */\n optionId: (index: number) => string;\n /** Ref for the element the menu anchors to (the input wrapper). */\n anchorRef: React.RefObject<HTMLDivElement | null>;\n /** Ref for the floating listbox. */\n floatingRef: React.RefObject<HTMLUListElement | null>;\n /** Fixed-position style for the floating listbox. */\n menuStyle: React.CSSProperties;\n /** Re-derive the active query from the value and caret position. */\n sync: (value: string, caret: number) => void;\n /** Insert the given option at the active query and restore the caret. */\n insert: (option: MentionOption) => void;\n /** Move the highlight (mouse hover). */\n setHighlight: (index: number) => void;\n /**\n * Menu keyboard navigation. Returns `true` when the event was consumed\n * (callers must skip their own key handling, e.g. Enter-to-send).\n */\n handleKeyDown: (event: React.KeyboardEvent<HTMLTextAreaElement>) => boolean;\n /** ARIA combobox attributes to spread onto the textarea. */\n inputProps: React.TextareaHTMLAttributes<HTMLTextAreaElement>;\n}\n\n/**\n * State machine for `@mention` autocomplete in a composer textarea. Pair with\n * {@link MentionMenu} for the floating listbox.\n */\nexport function useMentionAutocomplete({\n options,\n value,\n setValue,\n textareaRef,\n}: UseMentionAutocompleteOptions): MentionAutocomplete {\n const enabled = !!options && options.length > 0;\n const [mention, setMention] = React.useState<{\n query: string;\n start: number;\n } | null>(null);\n const [highlight, setHighlight] = React.useState(0);\n const listId = React.useId();\n const optionId = React.useCallback(\n (index: number) => `${listId}-option-${index}`,\n [listId]\n );\n\n const suggestions = React.useMemo(() => {\n if (!mention || !options) return [];\n const q = mention.query.toLowerCase();\n return options.filter((o) => o.label.toLowerCase().includes(q));\n }, [mention, options]);\n\n const menuOpen = enabled && mention !== null && suggestions.length > 0;\n\n // Portal + fixed positioning so the mention menu escapes overflow-hidden\n // ancestors.\n const {\n anchorRef,\n floatingRef,\n style: menuStyle,\n } = useAnchoredPosition<HTMLDivElement, HTMLUListElement>({\n open: menuOpen,\n placement: 'top-start',\n maxHeight: 224,\n });\n\n // Clamp the highlight to the current suggestion range so the active option\n // never points at a stale/out-of-range index (the list can shrink while the\n // menu is open as the query narrows). The same clamped index drives\n // `aria-activedescendant`, `aria-selected`, and the visual highlight so they\n // can never disagree.\n const clampedHighlight = menuOpen\n ? Math.min(highlight, suggestions.length - 1)\n : -1;\n const activeOptionId = menuOpen ? optionId(clampedHighlight) : undefined;\n\n const sync = React.useCallback(\n (nextValue: string, caret: number) => {\n if (!enabled) return;\n setMention(activeMentionQuery(nextValue, caret));\n setHighlight(0);\n },\n [enabled]\n );\n\n const insert = (option: MentionOption) => {\n if (!mention) return;\n const insertValue = option.value ?? option.label.split(' ')[0];\n const before = value.slice(0, mention.start);\n const after = value.slice(mention.start + 1 + mention.query.length);\n const insertText = `@${insertValue} `;\n setValue(before + insertText + after);\n setMention(null);\n // Restore caret just after the inserted mention.\n const caret = before.length + insertText.length;\n requestAnimationFrame(() => {\n const el = textareaRef.current;\n if (el) {\n el.focus();\n el.setSelectionRange(caret, caret);\n }\n });\n };\n\n const handleKeyDown = (\n event: React.KeyboardEvent<HTMLTextAreaElement>\n ): boolean => {\n if (!menuOpen) return false;\n // All keyboard branches index with the clamped highlight so keyboard\n // behavior always agrees with the visible/ARIA selection, even when the\n // list shrank while the menu was open (e.g. the host swapped `options`\n // asynchronously).\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setHighlight(\n (h) => (Math.min(h, suggestions.length - 1) + 1) % suggestions.length\n );\n return true;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setHighlight(\n (h) =>\n (Math.min(h, suggestions.length - 1) - 1 + suggestions.length) %\n suggestions.length\n );\n return true;\n }\n if (event.key === 'Enter' || event.key === 'Tab') {\n event.preventDefault();\n const chosen = suggestions[clampedHighlight];\n if (chosen) insert(chosen);\n return true;\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n setMention(null);\n return true;\n }\n return false;\n };\n\n const inputProps: React.TextareaHTMLAttributes<HTMLTextAreaElement> = enabled\n ? {\n 'aria-controls': menuOpen ? listId : undefined,\n 'aria-activedescendant': activeOptionId,\n 'aria-autocomplete': 'list' as const,\n }\n : {};\n\n return {\n enabled,\n menuOpen,\n suggestions,\n highlight: clampedHighlight,\n listId,\n optionId,\n anchorRef,\n floatingRef,\n menuStyle,\n sync,\n insert,\n setHighlight,\n handleKeyDown,\n inputProps,\n };\n}\n\nexport interface MentionMenuProps {\n /** State returned by {@link useMentionAutocomplete}. */\n mention: MentionAutocomplete;\n /** Accessible label for the listbox. @default 'Mention' */\n label?: string;\n /** `data-slot` for the listbox. @default 'composer-mention-list' */\n dataSlot?: string;\n}\n\n/**\n * The floating `@mention` suggestion listbox. Rendered in a portal so it\n * escapes overflow-hidden ancestors; renders nothing while closed.\n */\nexport function MentionMenu({\n mention,\n label = 'Mention',\n dataSlot = 'composer-mention-list',\n}: MentionMenuProps) {\n if (!mention.menuOpen) return null;\n return createPortal(\n <ul\n ref={mention.floatingRef}\n style={mention.menuStyle}\n id={mention.listId}\n role=\"listbox\"\n aria-label={label}\n data-slot={dataSlot}\n className=\"w-64 overflow-y-auto rounded-lg border border-neutral-200 bg-white py-1 shadow-lg dark:border-neutral-700 dark:bg-neutral-800\"\n >\n {mention.suggestions.map((option, i) => (\n <li key={option.id}>\n <button\n type=\"button\"\n id={mention.optionId(i)}\n role=\"option\"\n aria-selected={i === mention.highlight}\n // onMouseDown (not onClick) so the textarea keeps focus.\n onMouseDown={(e) => {\n e.preventDefault();\n mention.insert(option);\n }}\n onMouseEnter={() => mention.setHighlight(i)}\n className={cn(\n 'flex w-full items-center gap-2 px-3 py-1.5 text-start text-sm',\n i === mention.highlight\n ? 'bg-primary-100 text-primary-900 dark:bg-primary-900/40 dark:text-primary-100'\n : 'text-neutral-700 dark:text-neutral-200'\n )}\n >\n {option.icon}\n <span className=\"min-w-0 flex-1 truncate\">\n <span className=\"font-medium\">{option.label}</span>\n {option.description && (\n <span className=\"ms-1 text-xs text-neutral-400\">\n {option.description}\n </span>\n )}\n </span>\n {option.meta && (\n <span className=\"text-[10px] text-neutral-400\">\n {option.meta}\n </span>\n )}\n </button>\n </li>\n ))}\n </ul>,\n document.body\n );\n}\n\nMentionMenu.displayName = 'MentionMenu';\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Dropdown, DropdownItem, DropdownSeparator } from '../Dropdown';\nimport {\n ComposerModelSelector,\n type ComposerModelSelectorProps,\n} from '../AI/ComposerModelSelector';\nimport {\n AttachmentPreviewItem,\n DragDropZone,\n getFileType,\n validateFile,\n generateAttachmentId,\n} from '../Messaging/AttachmentPicker';\nimport {\n MentionMenu,\n useMentionAutocomplete,\n type MentionOption,\n} from '../Messaging/useMentionAutocomplete';\nimport type { AttachmentType, NewMessage } from '../Messaging/types';\nimport {\n AlertTriangleIcon,\n ArrowUpIcon,\n BotIcon,\n CheckIcon,\n ChevronUpIcon,\n LoaderIcon,\n MicIcon,\n PaperclipIcon,\n PlusIcon,\n StopIcon,\n XIcon,\n} from '../Icons';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** A file staged for sending, with preview metadata. */\ninterface StagedAttachment {\n id: string;\n file: File;\n previewUrl?: string;\n type: AttachmentType;\n}\n\n/** An entry in the composer's `+` menu. */\nexport interface ChatComposerMenuItem {\n /** Stable id (used as the React key). */\n id: string;\n /** Display label. */\n label: React.ReactNode;\n /** Optional leading icon. */\n icon?: React.ReactNode;\n /** Whether the item is disabled. */\n disabled?: boolean;\n /**\n * Toggle state. When set (true or false) the item renders as a\n * `menuitemcheckbox` with `aria-checked` and a leading checkbox.\n */\n checked?: boolean;\n /** Danger styling for destructive actions. */\n variant?: 'default' | 'danger';\n /** Called when the item is selected. */\n onSelect?: () => void;\n}\n\n/** An agent shown in the composer's agent selector. */\nexport interface ChatComposerAgentOption {\n /** Stable id (returned via `onAgentChange`). */\n id: string;\n /** Display label. */\n label: string;\n /** Optional leading icon (defaults to a bot glyph in the trigger). */\n icon?: React.ReactNode;\n /** Optional secondary text shown in the menu. */\n description?: string;\n}\n\n/** Imperative handle exposed via `ref` for host-level integrations. */\nexport interface ChatComposerHandle {\n /**\n * Stage files programmatically (e.g. from a page-level drop zone or a\n * camera capture in `micSlot`). Deliberately NOT gated by\n * `allowAttachments` — that prop only hides the composer's own attach\n * affordances (the + button, paste, internal drop zone). Imperative calls\n * are explicit host actions; validation and `onError` still apply.\n */\n addFiles: (files: File[]) => void;\n /** Focus the text input. */\n focus: () => void;\n /**\n * The underlying textarea element, for host integrations that need caret\n * access (e.g. mention insertion via `setSelectionRange`).\n */\n getTextarea: () => HTMLTextAreaElement | null;\n}\n\n/** Structured context passed to `onError` so hosts can localize by reason. */\nexport interface ChatComposerError {\n reason: 'file-type' | 'file-size' | 'attachment-limit' | 'send-failed';\n /** The rejected file, when the error concerns a single file. */\n file?: File;\n}\n\nexport interface ChatComposerProps {\n /** Called when the user sends a message. */\n onSend?: (message: NewMessage) => void | Promise<void>;\n /** Controlled input value. Leave undefined for uncontrolled usage. */\n value?: string;\n /** Called when the input value changes. */\n onValueChange?: (value: string) => void;\n /** Placeholder text for the input. */\n placeholder?: string;\n /**\n * Disables all built-in interaction. Custom content (`micSlot`,\n * `addMenuItems` icons) is rendered as-is — hosts must disable their own\n * controls when they disable the composer.\n */\n disabled?: boolean;\n /** Shows the send button in a busy state and prevents duplicate sends. */\n isSending?: boolean;\n /** Autofocus the input on mount. */\n autoFocus?: boolean;\n /** Maximum message length. Sends are blocked while over the limit. */\n maxLength?: number;\n /** Show a character counter (requires `maxLength`). */\n showCharacterCount?: boolean;\n /**\n * Allow sending while the composer itself is empty (e.g. when the host\n * stages attachments outside the composer). The host receives a message\n * with empty `content` and no attachments and owns any further guarding.\n * @default false\n */\n canSendWhenEmpty?: boolean;\n /**\n * Maximum height of the auto-growing input: a pixel number or any CSS\n * length (e.g. `'40vh'`).\n * @default 160\n */\n maxHeight?: number | string;\n /**\n * Extra props spread onto the underlying textarea. Event handlers run\n * before the composer's built-in handlers; call `event.preventDefault()`\n * in `onKeyDown` / `onPaste` to claim that event (e.g. for a mention\n * menu's arrow/Enter navigation). `className` and `style` are merged\n * with the composer's own.\n */\n textareaProps?: Omit<\n React.TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'value' | 'defaultValue'\n >;\n\n /** Extra entries for the `+` menu, rendered after the built-in items. */\n addMenuItems?: ChatComposerMenuItem[];\n /** Enable file attachments (built-in \"Attach files\" menu item, paste-to-attach, drag-and-drop, chips). @default true */\n allowAttachments?: boolean;\n /** Accepted file types for the picker/paste validation (native `accept` tokens). */\n acceptedFileTypes?: string[];\n /** Maximum file size in bytes. */\n maxFileSize?: number;\n /** Maximum number of staged attachments. @default 10 */\n maxAttachments?: number;\n\n /**\n * Candidates for `@mention` autocomplete. When provided (non-empty), typing\n * `@` opens a suggestion listbox (same behavior as `MessageComposer`).\n * Omit to disable mentions entirely (default).\n */\n mentionOptions?: MentionOption[];\n\n /**\n * Message being replied to. When set, a dismissible preview row renders at\n * the top of the card, the input is focused, and the sent `NewMessage`\n * carries `replyToId`. The host owns the state: sending does not clear it\n * (clear it in `onSend`), and the preview's close button only calls\n * `onCancelReply`. Same contract as `MessageComposer`.\n */\n replyTo?: {\n id: string;\n content: string;\n senderName: string;\n } | null;\n /** Called when the reply preview's cancel button is clicked. */\n onCancelReply?: () => void;\n\n /** Show the built-in mic button. @default false */\n showMic?: boolean;\n /** Called when the built-in mic button is clicked. */\n onMicClick?: () => void;\n /**\n * Custom node rendered in place of the built-in mic button (e.g.\n * `RecordButton`). The slot is wrapped in a 32px-tall (`h-8`) flex row so it\n * aligns with the other composer controls; taller content overflows and\n * stays vertically centered without inflating the row. Interaction state is\n * not managed: pass your own disabled state when the composer is `disabled`.\n */\n micSlot?: React.ReactNode;\n /** When to show the mic: always, or only while the composer is empty. @default 'always' */\n micBehavior?: 'always' | 'whenEmpty';\n\n /** While true, the send button becomes a stop button (requires `onStop`). */\n isStreaming?: boolean;\n /** Called when the stop button is clicked during streaming. */\n onStop?: () => void;\n\n /** Show the agent selector in the bottom row. @default false */\n showAgentSelector?: boolean;\n /** Agents available in the agent selector. */\n agents?: ChatComposerAgentOption[];\n /** Selected agent id (controlled). */\n selectedAgent?: string | null;\n /** Called when an agent is selected. */\n onAgentChange?: (agentId: string) => void;\n\n /** Show the model selector in the bottom row. @default false */\n showModelSelector?: boolean;\n /** Props passed through to the embedded `ComposerModelSelector`. */\n modelSelectorProps?: ComposerModelSelectorProps;\n\n /** Replaces the composer with a read-only notice. */\n readOnly?: boolean;\n /** Notice text shown when `readOnly` is set. */\n readOnlyMessage?: string;\n\n /**\n * Called when a file is rejected or a send fails. `message` is a default\n * English string; `context.reason` lets hosts substitute localized copy.\n */\n onError?: (message: string, context?: ChatComposerError) => void;\n\n /** Message reported when the attachment limit is hit. Overrides the English default. */\n attachmentLimitLabel?: string;\n /** Message reported when an async `onSend` rejects. @default 'Failed to send message' */\n sendFailedLabel?: string;\n /** Accessible label for the send button while `isSending`. @default 'Sending message…' */\n sendingLabel?: string;\n\n /** Accessible label for the text input. @default 'Message input' */\n inputLabel?: string;\n /** Accessible label for the `+` menu trigger. @default 'Add to message' */\n addMenuLabel?: string;\n /** Label for the built-in attach menu item. @default 'Attach files' */\n attachFilesLabel?: string;\n /** Accessible label for the built-in mic button. @default 'Start voice input' */\n micLabel?: string;\n /** Accessible label for the send button. @default 'Send message' */\n sendLabel?: string;\n /** Accessible label for the stop button. @default 'Stop generating' */\n stopLabel?: string;\n /** Accessible label / empty-state text for the agent selector. @default 'Select agent' */\n agentSelectorLabel?: string;\n /** Accessible label for the `@mention` suggestion listbox. @default 'Mention' */\n mentionListLabel?: string;\n /** Overlay text shown while dragging files over the composer. @default 'Drop files here' */\n dropFilesLabel?: string;\n /** Prefix shown before the sender name in the reply preview. @default 'Replying to' */\n replyingToLabel?: string;\n /** Accessible label for the reply preview's cancel button. @default 'Cancel reply' */\n cancelReplyLabel?: string;\n\n className?: string;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst iconButtonClasses = cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-lg',\n 'text-neutral-500 dark:text-neutral-400',\n 'transition-colors duration-150',\n 'hover:bg-neutral-100 hover:text-neutral-900 dark:hover:bg-neutral-700 dark:hover:text-white',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500',\n 'disabled:pointer-events-none disabled:opacity-40'\n);\n\nconst selectorTriggerClasses = cn(\n 'flex min-w-0 items-center gap-1 rounded-md px-2 py-1 text-xs',\n 'text-neutral-600 dark:text-neutral-400',\n 'transition-colors duration-150',\n 'hover:bg-neutral-100 hover:text-neutral-900 dark:hover:bg-neutral-700 dark:hover:text-white',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500',\n 'disabled:pointer-events-none disabled:opacity-40'\n);\n\nconst MAX_INPUT_HEIGHT = 160;\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Standardized chat input. At `md+` it renders as a single-row pill — `+`\n * menu, text input and actions (mic, send/stop) side by side; below `md` the\n * input stacks above the icon row. The optional agent/model selector row\n * hangs below the card on the page background.\n */\nexport const ChatComposer = React.forwardRef<\n ChatComposerHandle,\n ChatComposerProps\n>(function ChatComposer(\n {\n onSend,\n value: controlledValue,\n onValueChange,\n placeholder = 'Type a message…',\n disabled = false,\n isSending = false,\n autoFocus = false,\n maxLength,\n showCharacterCount = false,\n canSendWhenEmpty = false,\n maxHeight = MAX_INPUT_HEIGHT,\n textareaProps,\n addMenuItems,\n allowAttachments = true,\n acceptedFileTypes,\n maxFileSize,\n maxAttachments = 10,\n mentionOptions,\n replyTo = null,\n onCancelReply,\n showMic = false,\n onMicClick,\n micSlot,\n micBehavior = 'always',\n isStreaming = false,\n onStop,\n showAgentSelector = false,\n agents = [],\n selectedAgent = null,\n onAgentChange,\n showModelSelector = false,\n modelSelectorProps,\n readOnly = false,\n readOnlyMessage = 'You have read-only access and cannot send messages.',\n onError,\n attachmentLimitLabel,\n sendFailedLabel = 'Failed to send message',\n sendingLabel = 'Sending message…',\n inputLabel = 'Message input',\n addMenuLabel = 'Add to message',\n attachFilesLabel = 'Attach files',\n micLabel = 'Start voice input',\n sendLabel = 'Send message',\n stopLabel = 'Stop generating',\n agentSelectorLabel = 'Select agent',\n mentionListLabel = 'Mention',\n dropFilesLabel = 'Drop files here',\n replyingToLabel = 'Replying to',\n cancelReplyLabel = 'Cancel reply',\n className,\n },\n ref\n) {\n const [internalValue, setInternalValue] = React.useState('');\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : internalValue;\n\n const [attachments, setAttachments] = React.useState<StagedAttachment[]>([]);\n const attachmentsRef = React.useRef(attachments);\n attachmentsRef.current = attachments;\n\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const fileInputRef = React.useRef<HTMLInputElement>(null);\n\n const [addMenuOpen, setAddMenuOpen] = React.useState(false);\n const [agentMenuOpen, setAgentMenuOpen] = React.useState(false);\n\n // Focus the input when a reply target is set (MessageComposer parity).\n // Keyed on the id, not the object: hosts often build `replyTo` inline, so\n // an object dependency would re-steal focus (and reset the caret) on every\n // parent render while the user is typing.\n const replyToId = replyTo?.id;\n React.useEffect(() => {\n if (replyToId !== undefined) {\n textareaRef.current?.focus();\n }\n }, [replyToId]);\n\n const hasText = value.trim().length > 0;\n const hasContent = hasText || attachments.length > 0;\n const isOverLimit = maxLength !== undefined && value.length > maxLength;\n // Without an onSend handler, sending would silently discard the draft.\n const canSend =\n (hasContent || canSendWhenEmpty) &&\n onSend !== undefined &&\n !disabled &&\n !isSending &&\n !isStreaming &&\n !isOverLimit;\n\n // --------------------------------------------------------------------\n // Input handling\n // --------------------------------------------------------------------\n\n const setValue = React.useCallback(\n (next: string) => {\n if (!isControlled) setInternalValue(next);\n onValueChange?.(next);\n },\n [isControlled, onValueChange]\n );\n\n // @mention autocomplete (opt-in via `mentionOptions`) — shared with\n // MessageComposer so both composers behave identically.\n const mention = useMentionAutocomplete({\n options: mentionOptions,\n value,\n setValue,\n textareaRef,\n });\n\n // Auto-grow the textarea. The cap is enforced with CSS max-height so it\n // can be any CSS length (e.g. '40vh'), not just a pixel number.\n const resizeTextarea = React.useCallback(() => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n textarea.style.height = 'auto';\n // While the textarea is not laid out (hidden container, e.g. a\n // just-mounted Storybook story or a closed panel) scrollHeight is 0 —\n // keep height auto and let the ResizeObserver below re-measure once\n // the element becomes visible.\n if (textarea.scrollHeight === 0) return;\n textarea.style.height = `${textarea.scrollHeight}px`;\n }, []);\n\n React.useLayoutEffect(resizeTextarea, [resizeTextarea, value]);\n\n // Re-measure when the textarea's box changes for reasons other than\n // typing: the container becoming visible, width changes, font loading,\n // or crossing the md breakpoint (different paddings).\n React.useEffect(() => {\n const textarea = textareaRef.current;\n if (!textarea || typeof ResizeObserver === 'undefined') return;\n // Defer the re-measure to the next frame: mutating the observed\n // element's height synchronously inside the observer callback triggers\n // the browser's \"ResizeObserver loop completed with undelivered\n // notifications\" error, which dev overlays surface as a runtime error.\n let frame = 0;\n const observer = new ResizeObserver(() => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(resizeTextarea);\n });\n observer.observe(textarea);\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n };\n }, [resizeTextarea]);\n\n // --------------------------------------------------------------------\n // Attachments\n // --------------------------------------------------------------------\n\n const addFiles = React.useCallback(\n (files: File[]) => {\n // No `allowAttachments` gate here: every user-facing entry point\n // (paste handler, + button, internal drop zone) is gated separately,\n // so this only opens the imperative `ref.addFiles()` path for hosts\n // (e.g. MessageThread's camera capture with the picker disabled).\n if (files.length === 0) return;\n // Staging happens outside the state updater so object-URL creation,\n // id generation and onError stay out of a function React may re-invoke.\n const limitMessage =\n attachmentLimitLabel ??\n `Attachment limit reached (max ${maxAttachments})`;\n const room = maxAttachments - attachmentsRef.current.length;\n if (files.length > room) {\n onError?.(limitMessage, { reason: 'attachment-limit' });\n if (room <= 0) return;\n }\n const staged: StagedAttachment[] = [];\n for (const file of files.slice(0, Math.max(room, 0))) {\n const typeCheck = validateFile(file, acceptedFileTypes, undefined);\n if (!typeCheck.valid) {\n onError?.(`${file.name}: ${typeCheck.error}`, {\n reason: 'file-type',\n file,\n });\n continue;\n }\n const sizeCheck = validateFile(file, undefined, maxFileSize);\n if (!sizeCheck.valid) {\n onError?.(`${file.name}: ${sizeCheck.error}`, {\n reason: 'file-size',\n file,\n });\n continue;\n }\n const type = getFileType(file.type);\n staged.push({\n id: generateAttachmentId(),\n file,\n type,\n previewUrl:\n type === 'image' || type === 'video'\n ? URL.createObjectURL(file)\n : undefined,\n });\n }\n if (staged.length > 0) {\n // Reserve slots synchronously: a second addFiles call in the same\n // React batch reads attachmentsRef before re-render, so without this\n // both calls could see the same free room and overshoot the cap.\n attachmentsRef.current = [...attachmentsRef.current, ...staged];\n setAttachments((current) => [...current, ...staged]);\n }\n },\n [\n maxAttachments,\n acceptedFileTypes,\n maxFileSize,\n onError,\n attachmentLimitLabel,\n ]\n );\n\n const removeAttachment = React.useCallback((id: string) => {\n // Same discipline as addFiles: revoke and update the ref synchronously,\n // keep the state updater pure (StrictMode may re-invoke it).\n const target = attachmentsRef.current.find(\n (attachment) => attachment.id === id\n );\n if (target?.previewUrl) URL.revokeObjectURL(target.previewUrl);\n attachmentsRef.current = attachmentsRef.current.filter(\n (attachment) => attachment.id !== id\n );\n setAttachments((current) =>\n current.filter((attachment) => attachment.id !== id)\n );\n }, []);\n\n // Revoke any outstanding preview URLs on unmount.\n React.useEffect(() => {\n return () => {\n for (const attachment of attachmentsRef.current) {\n if (attachment.previewUrl) URL.revokeObjectURL(attachment.previewUrl);\n }\n };\n }, []);\n\n const handleFileInputChange = (\n event: React.ChangeEvent<HTMLInputElement>\n ) => {\n const files = Array.from(event.target.files ?? []);\n addFiles(files);\n event.target.value = '';\n };\n\n const handlePaste = (event: React.ClipboardEvent<HTMLTextAreaElement>) => {\n if (!allowAttachments) return;\n const files = Array.from(event.clipboardData.files);\n if (files.length > 0) {\n event.preventDefault();\n addFiles(files);\n }\n };\n\n React.useImperativeHandle(\n ref,\n () => ({\n addFiles,\n focus: () => textareaRef.current?.focus(),\n getTextarea: () => textareaRef.current,\n }),\n [addFiles]\n );\n\n // --------------------------------------------------------------------\n // Sending\n // --------------------------------------------------------------------\n\n const handleSend = () => {\n if (!canSend || !onSend) return;\n const message: NewMessage = {\n content: value.trim(),\n attachments: attachments.map((attachment) => attachment.file),\n // Only add the key when replying — hosts may key-check the payload.\n ...(replyTo ? { replyToId: replyTo.id } : {}),\n };\n for (const attachment of attachments) {\n if (attachment.previewUrl) URL.revokeObjectURL(attachment.previewUrl);\n }\n // Clear the ref alongside the state: the unmount cleanup reads the ref,\n // so if onSend unmounts the composer synchronously it must not see (and\n // re-revoke) the already-revoked preview URLs.\n attachmentsRef.current = [];\n setAttachments([]);\n setValue('');\n // The draft is cleared optimistically; hosts own retry/restore. Both a\n // synchronous throw and a rejected promise surface through onError\n // instead of being swallowed.\n try {\n Promise.resolve(onSend(message)).catch(() => {\n onError?.(sendFailedLabel, { reason: 'send-failed' });\n });\n } catch {\n onError?.(sendFailedLabel, { reason: 'send-failed' });\n }\n textareaRef.current?.focus();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // @mention menu navigation takes priority over send.\n if (mention.handleKeyDown(event)) return;\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n handleSend();\n }\n };\n\n // --------------------------------------------------------------------\n // Render\n // --------------------------------------------------------------------\n\n if (readOnly) {\n return (\n <div\n data-slot=\"chat-composer\"\n // A live status region (implicit aria-live=\"polite\"): readOnly can\n // flip at runtime (e.g. after permissions resolve), and screen-reader\n // users must be told the input became read-only.\n role=\"status\"\n className={cn(\n 'flex items-center gap-2 rounded-xl border px-4 py-3 text-sm',\n 'border-amber-300 bg-amber-50 text-amber-900',\n 'dark:border-amber-700 dark:bg-amber-950 dark:text-amber-200',\n className\n )}\n >\n <AlertTriangleIcon className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />\n <span data-slot=\"chat-composer-readonly\">{readOnlyMessage}</span>\n </div>\n );\n }\n\n const showAddMenu =\n allowAttachments || (addMenuItems && addMenuItems.length > 0);\n const micVisible =\n (showMic || onMicClick !== undefined || micSlot !== undefined) &&\n (micBehavior === 'always' || !hasContent);\n const showSelectorRow = showAgentSelector || showModelSelector;\n const selectedAgentOption =\n agents.find((agent) => agent.id === selectedAgent) ?? null;\n\n // One responsive grid: below `md` the input sits on row 1 spanning all\n // columns with the `+`/actions on row 2; at `md+` the `+`, input and\n // actions sit side by side on row 1 as a single pill (actions pin to the\n // bottom via self-end as the input grows).\n const cells = {\n input:\n 'col-span-3 col-start-1 row-start-1 px-1 pt-1 md:col-span-1 md:col-start-2 md:self-end md:px-0 md:py-1.5',\n textarea: 'px-2 pt-2 pb-1 md:py-1.5',\n add: 'col-start-1 row-start-2 pb-2 ps-2 md:row-start-1 md:self-end md:p-1.5 md:pe-0.5',\n actions:\n 'col-start-3 row-start-2 flex items-center gap-1 pb-2 pe-2 md:row-start-1 md:self-end md:gap-0.5 md:p-1.5 md:ps-0.5',\n };\n\n const composerCard = (\n <>\n {replyTo && (\n <div\n data-slot=\"chat-composer-reply-preview\"\n className={cn(\n 'flex items-center gap-2 rounded-t-2xl px-4 py-2',\n 'bg-neutral-50 dark:bg-neutral-800/50',\n 'border-b border-neutral-200 dark:border-neutral-700',\n 'border-s-primary-500 border-s-4'\n )}\n >\n {/* role=\"status\" politely announces the reply target to screen readers\n when the row is inserted (focus jumps to the textarea, so the text\n would otherwise be skipped). The cancel button stays outside it. */}\n <div role=\"status\" className=\"min-w-0 flex-1\">\n <span className=\"text-primary-800 dark:text-primary-400 block text-xs font-medium\">\n {replyingToLabel} {replyTo.senderName}\n </span>\n <p className=\"truncate text-sm text-neutral-600 dark:text-neutral-300\">\n {replyTo.content}\n </p>\n </div>\n <button\n type=\"button\"\n data-slot=\"chat-composer-cancel-reply\"\n aria-label={cancelReplyLabel}\n disabled={disabled}\n onClick={onCancelReply}\n className={iconButtonClasses}\n >\n <XIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n </div>\n )}\n\n {attachments.length > 0 && (\n <div\n data-slot=\"chat-composer-attachments\"\n className=\"flex flex-wrap gap-2 px-3 pt-3\"\n >\n {attachments.map((attachment) => (\n <AttachmentPreviewItem\n key={attachment.id}\n attachment={{ ...attachment, state: 'pending' }}\n onRemove={() => removeAttachment(attachment.id)}\n disabled={disabled}\n />\n ))}\n </div>\n )}\n\n <div className=\"grid grid-cols-[auto_minmax(0,1fr)_auto]\">\n {/* Inset cell: the textarea sits inside the card with a matching\n inner radius so focus outlines / a11y highlights render as a\n clean nested rounded rect instead of stacking on the card's\n border. The padding split (cell + textarea) keeps the text in\n place using only standard utilities. */}\n <div className={cells.input} ref={mention.anchorRef}>\n <MentionMenu\n mention={mention}\n label={mentionListLabel}\n dataSlot=\"chat-composer-mention-list\"\n />\n <textarea\n {...textareaProps}\n ref={textareaRef}\n data-slot=\"chat-composer-input\"\n value={value}\n onChange={(event) => {\n textareaProps?.onChange?.(event);\n setValue(event.target.value);\n mention.sync(\n event.target.value,\n event.target.selectionStart ?? event.target.value.length\n );\n }}\n // Host handlers run first; preventDefault() opts out of the\n // built-in behavior (mention menu, Enter-to-send,\n // paste-to-attach).\n onKeyDown={(event) => {\n textareaProps?.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n handleKeyDown(event);\n }}\n onClick={(event) => {\n textareaProps?.onClick?.(event);\n if (event.defaultPrevented) return;\n const el = event.currentTarget;\n mention.sync(el.value, el.selectionStart ?? el.value.length);\n }}\n onPaste={(event) => {\n textareaProps?.onPaste?.(event);\n if (event.defaultPrevented) return;\n handlePaste(event);\n }}\n placeholder={placeholder}\n disabled={disabled}\n // Host-opt-in only; off by default.\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus={autoFocus}\n rows={1}\n aria-label={inputLabel}\n {...mention.inputProps}\n style={{\n ...textareaProps?.style,\n maxHeight:\n typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight,\n }}\n className={cn(\n 'block w-full resize-none bg-transparent',\n 'rounded-lg text-sm',\n cells.textarea,\n 'text-neutral-900 placeholder:text-neutral-400 dark:text-white dark:placeholder:text-neutral-500',\n // Ring the input itself on focus rather than the whole shell.\n 'focus:ring-primary-500 focus:ring-1 focus:outline-none',\n 'disabled:cursor-not-allowed',\n textareaProps?.className\n )}\n />\n </div>\n\n {showAddMenu && (\n <div className={cells.add}>\n <Dropdown\n placement=\"top-start\"\n open={addMenuOpen}\n onOpenChange={setAddMenuOpen}\n trigger={\n <button\n type=\"button\"\n data-slot=\"chat-composer-add-button\"\n aria-label={addMenuLabel}\n disabled={disabled}\n className={iconButtonClasses}\n >\n <PlusIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n }\n >\n {allowAttachments && (\n <DropdownItem\n icon={\n <PaperclipIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n }\n onClick={() => {\n setAddMenuOpen(false);\n fileInputRef.current?.click();\n }}\n >\n {attachFilesLabel}\n </DropdownItem>\n )}\n {allowAttachments && addMenuItems && addMenuItems.length > 0 && (\n <DropdownSeparator />\n )}\n {addMenuItems?.map((item) => (\n <DropdownItem\n key={item.id}\n icon={item.icon}\n disabled={item.disabled}\n variant={item.variant}\n checked={item.checked}\n onClick={() => {\n setAddMenuOpen(false);\n item.onSelect?.();\n }}\n >\n <span className=\"min-w-0 truncate\">{item.label}</span>\n </DropdownItem>\n ))}\n </Dropdown>\n </div>\n )}\n\n {allowAttachments && (\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={acceptedFileTypes?.join(',')}\n onChange={handleFileInputChange}\n className=\"hidden\"\n aria-hidden=\"true\"\n tabIndex={-1}\n />\n )}\n\n <div className={cells.actions}>\n {showCharacterCount && maxLength !== undefined && (\n <span\n data-slot=\"chat-composer-char-count\"\n aria-live=\"polite\"\n className={cn(\n 'pe-1 text-xs tabular-nums',\n isOverLimit\n ? 'font-medium text-red-700 dark:text-red-400'\n : 'text-neutral-500 dark:text-neutral-400'\n )}\n >\n {value.length}/{maxLength}\n </span>\n )}\n\n {micVisible &&\n (micSlot != null ? (\n // Normalize slot content (e.g. a RecordButton) to the 32px\n // control row: taller content overflow-centers instead of\n // inflating the pill and pushing the other cells apart. A div\n // so block-level slot content stays valid HTML.\n <div\n data-slot=\"chat-composer-mic-slot\"\n className=\"flex h-8 shrink-0 items-center\"\n >\n {micSlot}\n </div>\n ) : (\n <button\n type=\"button\"\n data-slot=\"chat-composer-mic-button\"\n aria-label={micLabel}\n disabled={disabled}\n onClick={onMicClick}\n className={iconButtonClasses}\n >\n <MicIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n ))}\n\n {isStreaming && onStop ? (\n <button\n type=\"button\"\n data-slot=\"chat-composer-stop-button\"\n aria-label={stopLabel}\n disabled={disabled}\n onClick={onStop}\n className={cn(\n iconButtonClasses,\n 'text-neutral-700 dark:text-neutral-200'\n )}\n >\n <StopIcon\n className=\"h-3.5 w-3.5 fill-current\"\n aria-hidden=\"true\"\n />\n </button>\n ) : (\n <button\n type=\"button\"\n data-slot=\"chat-composer-send-button\"\n aria-label={isSending ? sendingLabel : sendLabel}\n aria-busy={isSending || undefined}\n disabled={!canSend}\n onClick={handleSend}\n className={cn(\n iconButtonClasses,\n canSend &&\n 'bg-primary-800 hover:bg-primary-700 dark:bg-primary-600 dark:hover:bg-primary-500 text-white hover:text-white dark:hover:text-white'\n )}\n >\n {isSending ? (\n <LoaderIcon\n className=\"h-4 w-4 animate-spin\"\n aria-hidden=\"true\"\n />\n ) : (\n <ArrowUpIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n )}\n </button>\n )}\n </div>\n </div>\n </>\n );\n\n const selectorsRow = showSelectorRow && (\n <div\n data-slot=\"chat-composer-selectors\"\n className=\"flex items-center justify-between gap-2 px-2 pt-1\"\n >\n {showAgentSelector ? (\n <Dropdown\n placement=\"top-start\"\n open={agentMenuOpen}\n onOpenChange={setAgentMenuOpen}\n trigger={\n <button\n type=\"button\"\n data-slot=\"chat-composer-agent-trigger\"\n aria-label={\n selectedAgentOption\n ? `${agentSelectorLabel}: ${selectedAgentOption.label}`\n : agentSelectorLabel\n }\n disabled={disabled}\n className={selectorTriggerClasses}\n >\n {selectedAgentOption?.icon ?? (\n <BotIcon className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n )}\n <span className=\"min-w-0 truncate\">\n {selectedAgentOption?.label ?? agentSelectorLabel}\n </span>\n <ChevronUpIcon className=\"h-3 w-3 shrink-0\" aria-hidden=\"true\" />\n </button>\n }\n >\n {agents.map((agent) => (\n <DropdownItem\n key={agent.id}\n icon={agent.icon}\n role=\"menuitemradio\"\n aria-checked={agent.id === selectedAgent}\n onClick={() => {\n setAgentMenuOpen(false);\n onAgentChange?.(agent.id);\n }}\n >\n <span className=\"flex w-full items-center justify-between gap-2\">\n <span className=\"min-w-0\">\n <span className=\"block truncate\">{agent.label}</span>\n {agent.description && (\n <span className=\"block truncate text-xs text-neutral-500 dark:text-neutral-400\">\n {agent.description}\n </span>\n )}\n </span>\n {agent.id === selectedAgent && (\n <CheckIcon\n className=\"text-primary-600 dark:text-primary-400 h-4 w-4 shrink-0\"\n aria-hidden=\"true\"\n />\n )}\n </span>\n </DropdownItem>\n ))}\n </Dropdown>\n ) : (\n <span aria-hidden=\"true\" />\n )}\n\n {showModelSelector && modelSelectorProps && (\n <ComposerModelSelector\n variant=\"ghost\"\n {...modelSelectorProps}\n disabled={disabled || modelSelectorProps.disabled}\n />\n )}\n </div>\n );\n\n // The bordered card holds only the input row(s); the selector row hangs\n // below it on the page background. When attachments are enabled the card\n // doubles as a drop target; all dropped files run through `addFiles` so\n // validation and structured `onError` reporting stay in one place (the\n // zone itself does not validate).\n const card = (\n <div\n data-slot=\"chat-composer-card\"\n className={cn(\n 'rounded-2xl border border-neutral-200 bg-white shadow-sm',\n 'dark:border-[#2e2e30] dark:bg-[#1c1c1e]'\n )}\n >\n {composerCard}\n </div>\n );\n\n return (\n <div\n data-slot=\"chat-composer\"\n className={cn(\n 'flex w-full flex-col',\n disabled && 'opacity-60',\n className\n )}\n >\n {allowAttachments ? (\n <DragDropZone\n onFilesDropped={addFiles}\n maxFiles={Number.MAX_SAFE_INTEGER}\n disabled={disabled}\n overlayLabel={dropFilesLabel}\n >\n {card}\n </DragDropZone>\n ) : (\n card\n )}\n {selectorsRow}\n </div>\n );\n});\n\nChatComposer.displayName = 'ChatComposer';\n","// Dev-only, one-time notice that the chat surfaces now mount ChatComposer in\n// place of the retired MessageComposer (mieweb/ui#465, 0.10.0). Bundlers\n// replace `process.env.NODE_ENV` at build time, so the whole branch is\n// dead-code-eliminated from production bundles.\n// TODO(0.11.0): remove this notice one release after the retirement ships.\nlet didNotify = false;\n\n/** Log a one-time dev pointer to the ChatComposer migration guide. */\nexport function notifyComposerMigrationOnce(surface: string): void {\n if (process.env.NODE_ENV === 'production' || didNotify) return;\n didNotify = true;\n console.warn(\n `[@mieweb/ui] ${surface} renders the shared ChatComposer — the standalone ` +\n 'MessageComposer was retired in 0.10.0. If your CSS or tests reach into ' +\n 'composer internals, see MIGRATION.md#chat-composer ' +\n '(https://github.com/mieweb/ui/blob/main/MIGRATION.md#chat-composer). ' +\n 'This dev-only notice will be removed in 0.11.0.'\n );\n}\n"]}
|