@mieweb/ui 0.7.1 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CsvBlock-LVJARITD.cjs +15 -0
- package/dist/{CsvBlock-2A5VEDD3.cjs.map → CsvBlock-LVJARITD.cjs.map} +1 -1
- package/dist/CsvBlock-VTYNQ75L.js +6 -0
- package/dist/{CsvBlock-D6PWAJ5X.js.map → CsvBlock-VTYNQ75L.js.map} +1 -1
- package/dist/HtmlPreviewBlock-F33P37UD.cjs +15 -0
- package/dist/{HtmlPreviewBlock-SYXCV5RH.cjs.map → HtmlPreviewBlock-F33P37UD.cjs.map} +1 -1
- package/dist/HtmlPreviewBlock-N4PPVJLJ.js +6 -0
- package/dist/{HtmlPreviewBlock-PEHTJ6C3.js.map → HtmlPreviewBlock-N4PPVJLJ.js.map} +1 -1
- package/dist/MermaidBlock-G5X4FPUN.cjs +15 -0
- package/dist/{MermaidBlock-AFXNP5NK.cjs.map → MermaidBlock-G5X4FPUN.cjs.map} +1 -1
- package/dist/MermaidBlock-HUT53CRG.js +6 -0
- package/dist/{MermaidBlock-7NK3AVK2.js.map → MermaidBlock-HUT53CRG.js.map} +1 -1
- package/dist/SurveyBlock-ORTPGA5T.cjs +15 -0
- package/dist/{SurveyBlock-6KRNKFH5.cjs.map → SurveyBlock-ORTPGA5T.cjs.map} +1 -1
- package/dist/SurveyBlock-PM3ZMWWR.js +6 -0
- package/dist/{SurveyBlock-NNDGXGG4.js.map → SurveyBlock-PM3ZMWWR.js.map} +1 -1
- package/dist/ag-grid.cjs +13 -13
- package/dist/ag-grid.js +2 -2
- package/dist/brands/index.cjs +7 -7
- package/dist/brands/index.js +2 -2
- package/dist/{chunk-4DMZAVB2.js → chunk-23AYDOCH.js} +3 -3
- package/dist/{chunk-4DMZAVB2.js.map → chunk-23AYDOCH.js.map} +1 -1
- package/dist/{chunk-MAMY5HTT.cjs → chunk-26DPQUSB.cjs} +22 -22
- package/dist/{chunk-MAMY5HTT.cjs.map → chunk-26DPQUSB.cjs.map} +1 -1
- package/dist/{chunk-TRZXK57D.js → chunk-2DW4PUJD.js} +3 -3
- package/dist/{chunk-TRZXK57D.js.map → chunk-2DW4PUJD.js.map} +1 -1
- package/dist/{chunk-OX2RIVN7.js → chunk-3D4ITDLO.js} +4 -4
- package/dist/{chunk-OX2RIVN7.js.map → chunk-3D4ITDLO.js.map} +1 -1
- package/dist/{chunk-PJAQDAMZ.cjs → chunk-3IAA3KCE.cjs} +15 -6
- package/dist/chunk-3IAA3KCE.cjs.map +1 -0
- package/dist/chunk-3PXOIAF6.js +3 -0
- package/dist/{chunk-DHKYGVP7.js.map → chunk-3PXOIAF6.js.map} +1 -1
- package/dist/{chunk-6D5F7EDM.js → chunk-3SRBIXQX.js} +18 -17
- package/dist/chunk-3SRBIXQX.js.map +1 -0
- package/dist/{chunk-Q2EWNXIB.cjs → chunk-3SZQRMHM.cjs} +9 -9
- package/dist/{chunk-Q2EWNXIB.cjs.map → chunk-3SZQRMHM.cjs.map} +1 -1
- package/dist/{chunk-JLBT76WH.js → chunk-3YSIZ2CK.js} +14 -5
- package/dist/chunk-3YSIZ2CK.js.map +1 -0
- package/dist/{chunk-NIEIRA5A.cjs → chunk-4AE2L6AO.cjs} +13 -13
- package/dist/{chunk-NIEIRA5A.cjs.map → chunk-4AE2L6AO.cjs.map} +1 -1
- package/dist/{chunk-PFWHWIXS.cjs → chunk-54OW6ZPL.cjs} +124 -3
- package/dist/chunk-54OW6ZPL.cjs.map +1 -0
- package/dist/{chunk-FJH7P5WG.js → chunk-5BDCQBYW.js} +6 -6
- package/dist/{chunk-FJH7P5WG.js.map → chunk-5BDCQBYW.js.map} +1 -1
- package/dist/{chunk-XP6HELVG.cjs → chunk-5IDYOJHO.cjs} +13 -13
- package/dist/{chunk-XP6HELVG.cjs.map → chunk-5IDYOJHO.cjs.map} +1 -1
- package/dist/{chunk-3CJBUAJ4.js → chunk-5U6GETAW.js} +3 -3
- package/dist/{chunk-3CJBUAJ4.js.map → chunk-5U6GETAW.js.map} +1 -1
- package/dist/{chunk-HEH3QXOQ.js → chunk-5Y5FSR4N.js} +3 -3
- package/dist/{chunk-HEH3QXOQ.js.map → chunk-5Y5FSR4N.js.map} +1 -1
- package/dist/{chunk-MSRU3XBH.cjs → chunk-6ECKH4DJ.cjs} +7 -7
- package/dist/{chunk-MSRU3XBH.cjs.map → chunk-6ECKH4DJ.cjs.map} +1 -1
- package/dist/{chunk-MV3MTHWQ.js → chunk-6EWJGRC3.js} +3 -3
- package/dist/{chunk-MV3MTHWQ.js.map → chunk-6EWJGRC3.js.map} +1 -1
- package/dist/{chunk-AES2BKEW.cjs → chunk-6J7UGYT5.cjs} +10 -10
- package/dist/{chunk-AES2BKEW.cjs.map → chunk-6J7UGYT5.cjs.map} +1 -1
- package/dist/{chunk-7WMSUXOQ.js → chunk-6OCYG6J2.js} +4 -4
- package/dist/{chunk-7WMSUXOQ.js.map → chunk-6OCYG6J2.js.map} +1 -1
- package/dist/{chunk-JCNPVK74.cjs → chunk-6OQE4ZMG.cjs} +8 -8
- package/dist/{chunk-JCNPVK74.cjs.map → chunk-6OQE4ZMG.cjs.map} +1 -1
- package/dist/{chunk-KBEKQMVY.cjs → chunk-6QVI6DAO.cjs} +5 -5
- package/dist/{chunk-KBEKQMVY.cjs.map → chunk-6QVI6DAO.cjs.map} +1 -1
- package/dist/{chunk-CVC4NWFA.cjs → chunk-7AMOKHTW.cjs} +4 -4
- package/dist/{chunk-CVC4NWFA.cjs.map → chunk-7AMOKHTW.cjs.map} +1 -1
- package/dist/{chunk-44CK4CT2.cjs → chunk-7EB7665B.cjs} +13 -13
- package/dist/{chunk-44CK4CT2.cjs.map → chunk-7EB7665B.cjs.map} +1 -1
- package/dist/{chunk-BB4WQ4LV.cjs → chunk-ABAOZASX.cjs} +8 -8
- package/dist/{chunk-BB4WQ4LV.cjs.map → chunk-ABAOZASX.cjs.map} +1 -1
- package/dist/{chunk-6LFG4JFF.js → chunk-AFGADE3B.js} +3 -3
- package/dist/{chunk-6LFG4JFF.js.map → chunk-AFGADE3B.js.map} +1 -1
- package/dist/{chunk-UOOH356R.cjs → chunk-AIJAFPGJ.cjs} +5 -5
- package/dist/{chunk-UOOH356R.cjs.map → chunk-AIJAFPGJ.cjs.map} +1 -1
- package/dist/{chunk-43GBCUSQ.js → chunk-AQ564XO7.js} +6 -6
- package/dist/chunk-AQ564XO7.js.map +1 -0
- package/dist/{chunk-CYMZ2QS5.js → chunk-BCJFOSZX.js} +2 -2
- package/dist/{chunk-CYMZ2QS5.js.map → chunk-BCJFOSZX.js.map} +1 -1
- package/dist/{chunk-T3C4RNJ4.js → chunk-BJKAVWED.js} +3 -3
- package/dist/{chunk-T3C4RNJ4.js.map → chunk-BJKAVWED.js.map} +1 -1
- package/dist/{chunk-MKWGKASO.js → chunk-BMRQ4VME.js} +4 -4
- package/dist/{chunk-MKWGKASO.js.map → chunk-BMRQ4VME.js.map} +1 -1
- package/dist/{chunk-T42BCIUA.js → chunk-BMSG4NBH.js} +4 -4
- package/dist/{chunk-T42BCIUA.js.map → chunk-BMSG4NBH.js.map} +1 -1
- package/dist/{chunk-QA6ZDHFP.js → chunk-BOOJDRJO.js} +35 -11
- package/dist/chunk-BOOJDRJO.js.map +1 -0
- package/dist/{chunk-C2544GKZ.js → chunk-BX5ZODPF.js} +4 -4
- package/dist/{chunk-C2544GKZ.js.map → chunk-BX5ZODPF.js.map} +1 -1
- package/dist/{chunk-IYIYL2SQ.js → chunk-CEQJGUAS.js} +3 -3
- package/dist/{chunk-IYIYL2SQ.js.map → chunk-CEQJGUAS.js.map} +1 -1
- package/dist/{chunk-6ZYE6JUK.cjs → chunk-CKRRJO7T.cjs} +11 -11
- package/dist/{chunk-6ZYE6JUK.cjs.map → chunk-CKRRJO7T.cjs.map} +1 -1
- package/dist/{chunk-WO5CAOAN.js → chunk-DCBMTFLE.js} +3 -3
- package/dist/{chunk-WO5CAOAN.js.map → chunk-DCBMTFLE.js.map} +1 -1
- package/dist/{chunk-J7Z7467B.js → chunk-DLBV42JD.js} +4 -4
- package/dist/{chunk-J7Z7467B.js.map → chunk-DLBV42JD.js.map} +1 -1
- package/dist/{chunk-MUYTGWGE.js → chunk-DVOQ3JNO.js} +3 -3
- package/dist/{chunk-MUYTGWGE.js.map → chunk-DVOQ3JNO.js.map} +1 -1
- package/dist/{chunk-LJ2ZWIX6.js → chunk-DWIF6VXZ.js} +124 -3
- package/dist/chunk-DWIF6VXZ.js.map +1 -0
- package/dist/{chunk-IHTRKWBG.js → chunk-EGWWTIWS.js} +119 -75
- package/dist/chunk-EGWWTIWS.js.map +1 -0
- package/dist/{chunk-UM6NA7HL.js → chunk-EKRT7K2K.js} +4 -4
- package/dist/{chunk-UM6NA7HL.js.map → chunk-EKRT7K2K.js.map} +1 -1
- package/dist/{chunk-WGPMTW36.cjs → chunk-EPQPUFS6.cjs} +7 -7
- package/dist/{chunk-WGPMTW36.cjs.map → chunk-EPQPUFS6.cjs.map} +1 -1
- package/dist/{chunk-J3BU3JBX.js → chunk-FDUA6OGN.js} +3 -3
- package/dist/{chunk-J3BU3JBX.js.map → chunk-FDUA6OGN.js.map} +1 -1
- package/dist/{chunk-JHYFHEHS.js → chunk-FDV7EQWH.js} +4 -4
- package/dist/{chunk-JHYFHEHS.js.map → chunk-FDV7EQWH.js.map} +1 -1
- package/dist/{chunk-KQAXXJ4G.cjs → chunk-FF235PKY.cjs} +7 -7
- package/dist/{chunk-KQAXXJ4G.cjs.map → chunk-FF235PKY.cjs.map} +1 -1
- package/dist/{chunk-FZJBFJJR.js → chunk-FJ7YPVKV.js} +3 -3
- package/dist/{chunk-FZJBFJJR.js.map → chunk-FJ7YPVKV.js.map} +1 -1
- package/dist/{chunk-5MAGWW5X.cjs → chunk-FKLUSYFP.cjs} +11 -11
- package/dist/{chunk-5MAGWW5X.cjs.map → chunk-FKLUSYFP.cjs.map} +1 -1
- package/dist/{chunk-ZGSC2CB2.js → chunk-GTHNWP4P.js} +36 -5
- package/dist/chunk-GTHNWP4P.js.map +1 -0
- package/dist/{chunk-6AHYYWVB.js → chunk-H3HF36ZL.js} +5 -5
- package/dist/{chunk-6AHYYWVB.js.map → chunk-H3HF36ZL.js.map} +1 -1
- package/dist/{chunk-YZT62IMX.js → chunk-HIDV32ZX.js} +5 -5
- package/dist/{chunk-YZT62IMX.js.map → chunk-HIDV32ZX.js.map} +1 -1
- package/dist/{chunk-BIT27PPD.js → chunk-HS25RPDW.js} +3 -3
- package/dist/{chunk-BIT27PPD.js.map → chunk-HS25RPDW.js.map} +1 -1
- package/dist/{chunk-BWYYA3LQ.cjs → chunk-I2ECTLON.cjs} +5 -5
- package/dist/{chunk-BWYYA3LQ.cjs.map → chunk-I2ECTLON.cjs.map} +1 -1
- package/dist/{chunk-DUPR6FEL.js → chunk-I3WGZPI6.js} +4 -4
- package/dist/{chunk-DUPR6FEL.js.map → chunk-I3WGZPI6.js.map} +1 -1
- package/dist/{chunk-TN33E2VN.cjs → chunk-IJYTASQQ.cjs} +15 -15
- package/dist/{chunk-TN33E2VN.cjs.map → chunk-IJYTASQQ.cjs.map} +1 -1
- package/dist/{chunk-BT3ZQJGT.cjs → chunk-IUDY6S7I.cjs} +6 -6
- package/dist/{chunk-BT3ZQJGT.cjs.map → chunk-IUDY6S7I.cjs.map} +1 -1
- package/dist/{chunk-TR2OJKQ4.cjs → chunk-JTSKPDPH.cjs} +8 -8
- package/dist/{chunk-TR2OJKQ4.cjs.map → chunk-JTSKPDPH.cjs.map} +1 -1
- package/dist/{chunk-XCLQZ4FV.js → chunk-KFLDXJEE.js} +3 -3
- package/dist/{chunk-XCLQZ4FV.js.map → chunk-KFLDXJEE.js.map} +1 -1
- package/dist/{chunk-4LVPQ44A.js → chunk-LMBXJZLG.js} +9 -5
- package/dist/chunk-LMBXJZLG.js.map +1 -0
- package/dist/{chunk-A2QVQF54.cjs → chunk-M26KJKZG.cjs} +4 -4
- package/dist/{chunk-A2QVQF54.cjs.map → chunk-M26KJKZG.cjs.map} +1 -1
- package/dist/{chunk-ZHBANUBI.cjs → chunk-MJWFNV3L.cjs} +31 -27
- package/dist/chunk-MJWFNV3L.cjs.map +1 -0
- package/dist/{chunk-UFYXU7KV.js → chunk-MWPPOX6F.js} +4 -4
- package/dist/{chunk-UFYXU7KV.js.map → chunk-MWPPOX6F.js.map} +1 -1
- package/dist/{chunk-ZDEYV373.cjs → chunk-MYFZYUPR.cjs} +35 -11
- package/dist/chunk-MYFZYUPR.cjs.map +1 -0
- package/dist/{chunk-MCCO4A23.js → chunk-NGLI2MSM.js} +256 -45
- package/dist/chunk-NGLI2MSM.js.map +1 -0
- package/dist/{chunk-FCBQP2U4.cjs → chunk-NPKPCYAT.cjs} +142 -16
- package/dist/chunk-NPKPCYAT.cjs.map +1 -0
- package/dist/{chunk-T3RWXOCM.js → chunk-NU6QKULE.js} +3 -3
- package/dist/{chunk-T3RWXOCM.js.map → chunk-NU6QKULE.js.map} +1 -1
- package/dist/{chunk-QUUFKGDF.cjs → chunk-OAHORW4N.cjs} +130 -86
- package/dist/chunk-OAHORW4N.cjs.map +1 -0
- package/dist/{chunk-BYUV3IZV.cjs → chunk-OGPJ3LRF.cjs} +4 -4
- package/dist/{chunk-BYUV3IZV.cjs.map → chunk-OGPJ3LRF.cjs.map} +1 -1
- package/dist/{chunk-XL7TTKHP.js → chunk-OLFTGCGD.js} +7 -7
- package/dist/{chunk-XL7TTKHP.js.map → chunk-OLFTGCGD.js.map} +1 -1
- package/dist/{chunk-BX6BTDTR.js → chunk-OQWZYKJM.js} +3 -3
- package/dist/{chunk-BX6BTDTR.js.map → chunk-OQWZYKJM.js.map} +1 -1
- package/dist/{chunk-JBB25LFB.js → chunk-OTQ72WX3.js} +3 -3
- package/dist/{chunk-JBB25LFB.js.map → chunk-OTQ72WX3.js.map} +1 -1
- package/dist/{chunk-AFKKJEV5.cjs → chunk-OZOSWBSI.cjs} +4 -4
- package/dist/{chunk-AFKKJEV5.cjs.map → chunk-OZOSWBSI.cjs.map} +1 -1
- package/dist/{chunk-KJPOFUF5.cjs → chunk-P2VTQ5AR.cjs} +10 -10
- package/dist/{chunk-KJPOFUF5.cjs.map → chunk-P2VTQ5AR.cjs.map} +1 -1
- package/dist/{chunk-ZAIEQWRA.js → chunk-P6L74SKG.js} +5 -5
- package/dist/{chunk-ZAIEQWRA.js.map → chunk-P6L74SKG.js.map} +1 -1
- package/dist/{chunk-QASIWBXU.cjs → chunk-P7UMS4E6.cjs} +7 -7
- package/dist/{chunk-QASIWBXU.cjs.map → chunk-P7UMS4E6.cjs.map} +1 -1
- package/dist/chunk-PAM5UUBL.cjs +740 -0
- package/dist/{chunk-UTYUT5YY.cjs.map → chunk-PAM5UUBL.cjs.map} +1 -1
- package/dist/{chunk-NVHAQOHH.cjs → chunk-PLMXN23Q.cjs} +10 -10
- package/dist/chunk-PLMXN23Q.cjs.map +1 -0
- package/dist/{chunk-KOCTIB6U.js → chunk-PS5INHGC.js} +3 -3
- package/dist/{chunk-KOCTIB6U.js.map → chunk-PS5INHGC.js.map} +1 -1
- package/dist/{chunk-Y2S6QMKU.js → chunk-PTZB2GKL.js} +3 -3
- package/dist/{chunk-Y2S6QMKU.js.map → chunk-PTZB2GKL.js.map} +1 -1
- package/dist/{chunk-7VF6WO7H.cjs → chunk-Q5VBO3I5.cjs} +310 -99
- package/dist/chunk-Q5VBO3I5.cjs.map +1 -0
- package/dist/{chunk-BLPCYP4D.cjs → chunk-QI2SB6U3.cjs} +29 -29
- package/dist/{chunk-BLPCYP4D.cjs.map → chunk-QI2SB6U3.cjs.map} +1 -1
- package/dist/{chunk-EZKRAW2X.js → chunk-QUUBTNMH.js} +3 -3
- package/dist/{chunk-EZKRAW2X.js.map → chunk-QUUBTNMH.js.map} +1 -1
- package/dist/{chunk-5BQE6BEL.js → chunk-QYSUYB3S.js} +13 -9
- package/dist/chunk-QYSUYB3S.js.map +1 -0
- package/dist/{chunk-MZPF2QGM.cjs → chunk-RBS3GHDZ.cjs} +15 -15
- package/dist/{chunk-MZPF2QGM.cjs.map → chunk-RBS3GHDZ.cjs.map} +1 -1
- package/dist/{chunk-KJ5BSGEO.cjs → chunk-RS5VA6QU.cjs} +17 -13
- package/dist/chunk-RS5VA6QU.cjs.map +1 -0
- package/dist/{chunk-CKD554XR.cjs → chunk-RUEEDOE3.cjs} +5 -5
- package/dist/{chunk-CKD554XR.cjs.map → chunk-RUEEDOE3.cjs.map} +1 -1
- package/dist/{chunk-372IIHUA.cjs → chunk-RYQ3S3KO.cjs} +53 -53
- package/dist/{chunk-372IIHUA.cjs.map → chunk-RYQ3S3KO.cjs.map} +1 -1
- package/dist/{chunk-RHYIFIT5.js → chunk-RZFSJD67.js} +3 -3
- package/dist/{chunk-RHYIFIT5.js.map → chunk-RZFSJD67.js.map} +1 -1
- package/dist/{chunk-NQME7MCK.js → chunk-RZJXCI53.js} +191 -204
- package/dist/chunk-RZJXCI53.js.map +1 -0
- package/dist/{chunk-DFCZPVG4.cjs → chunk-S3MKIDYG.cjs} +8 -8
- package/dist/{chunk-DFCZPVG4.cjs.map → chunk-S3MKIDYG.cjs.map} +1 -1
- package/dist/chunk-S5RVSXDV.cjs +45 -0
- package/dist/chunk-S5RVSXDV.cjs.map +1 -0
- package/dist/{chunk-XDFDVF2O.js → chunk-SH6B4MG5.js} +4 -4
- package/dist/{chunk-XDFDVF2O.js.map → chunk-SH6B4MG5.js.map} +1 -1
- package/dist/chunk-SVSHA7XV.js +487 -0
- package/dist/chunk-SVSHA7XV.js.map +1 -0
- package/dist/{chunk-KL2S36FM.js → chunk-TNUL4LGG.js} +6 -6
- package/dist/{chunk-KL2S36FM.js.map → chunk-TNUL4LGG.js.map} +1 -1
- package/dist/chunk-TQONQSJO.js +42 -0
- package/dist/chunk-TQONQSJO.js.map +1 -0
- package/dist/{chunk-V25Z5GR6.cjs → chunk-TU36DBH2.cjs} +9 -9
- package/dist/{chunk-V25Z5GR6.cjs.map → chunk-TU36DBH2.cjs.map} +1 -1
- package/dist/{chunk-FQ3UCZUX.cjs → chunk-U3JU6BI5.cjs} +7 -7
- package/dist/{chunk-FQ3UCZUX.cjs.map → chunk-U3JU6BI5.cjs.map} +1 -1
- package/dist/{chunk-VCO2IZOG.js → chunk-UA7E7PDS.js} +3 -3
- package/dist/{chunk-VCO2IZOG.js.map → chunk-UA7E7PDS.js.map} +1 -1
- package/dist/{chunk-OOYEHBYJ.js → chunk-UUI7WXI5.js} +142 -16
- package/dist/chunk-UUI7WXI5.js.map +1 -0
- package/dist/{chunk-SNEQXSC5.cjs → chunk-VA7QN4DX.cjs} +2 -2
- package/dist/{chunk-SNEQXSC5.cjs.map → chunk-VA7QN4DX.cjs.map} +1 -1
- package/dist/{chunk-I2W24RHW.js → chunk-VE6OUO7X.js} +3 -3
- package/dist/{chunk-I2W24RHW.js.map → chunk-VE6OUO7X.js.map} +1 -1
- package/dist/{chunk-STPK44AU.js → chunk-VNWJTCBQ.js} +3 -3
- package/dist/{chunk-STPK44AU.js.map → chunk-VNWJTCBQ.js.map} +1 -1
- package/dist/{chunk-ZNZZCB2M.cjs → chunk-VPIYTQCV.cjs} +9 -9
- package/dist/{chunk-ZNZZCB2M.cjs.map → chunk-VPIYTQCV.cjs.map} +1 -1
- package/dist/{chunk-DLNJLCNO.cjs → chunk-VTKXM7IE.cjs} +4 -4
- package/dist/{chunk-DLNJLCNO.cjs.map → chunk-VTKXM7IE.cjs.map} +1 -1
- package/dist/{chunk-VPNURIAY.cjs → chunk-VVI32P7L.cjs} +10 -10
- package/dist/{chunk-VPNURIAY.cjs.map → chunk-VVI32P7L.cjs.map} +1 -1
- package/dist/{chunk-PWHK7SWN.cjs → chunk-VWCMOWGH.cjs} +150 -149
- package/dist/chunk-VWCMOWGH.cjs.map +1 -0
- package/dist/{chunk-EUUQVDXX.cjs → chunk-W4Q4UEXA.cjs} +14 -14
- package/dist/{chunk-EUUQVDXX.cjs.map → chunk-W4Q4UEXA.cjs.map} +1 -1
- package/dist/{chunk-ZVSW2KS6.js → chunk-WRYZ2752.js} +3 -3
- package/dist/{chunk-ZVSW2KS6.js.map → chunk-WRYZ2752.js.map} +1 -1
- package/dist/{chunk-U3ABLVYH.cjs → chunk-WUNWHOLA.cjs} +6 -6
- package/dist/{chunk-U3ABLVYH.cjs.map → chunk-WUNWHOLA.cjs.map} +1 -1
- package/dist/{chunk-RH43XBNV.cjs → chunk-WWJIW2IH.cjs} +4 -4
- package/dist/{chunk-RH43XBNV.cjs.map → chunk-WWJIW2IH.cjs.map} +1 -1
- package/dist/chunk-X4LBUPJO.cjs +511 -0
- package/dist/chunk-X4LBUPJO.cjs.map +1 -0
- package/dist/{chunk-4GXECTPS.cjs → chunk-XB54G7WS.cjs} +37 -3
- package/dist/chunk-XB54G7WS.cjs.map +1 -0
- package/dist/{chunk-IUFDGB5O.js → chunk-XMCIXHGH.js} +3 -3
- package/dist/{chunk-IUFDGB5O.js.map → chunk-XMCIXHGH.js.map} +1 -1
- package/dist/{chunk-KAKH2UZA.js → chunk-XO3WLK65.js} +3 -3
- package/dist/{chunk-KAKH2UZA.js.map → chunk-XO3WLK65.js.map} +1 -1
- package/dist/{chunk-IWDQPSJN.cjs → chunk-XS35KPBZ.cjs} +211 -223
- package/dist/chunk-XS35KPBZ.cjs.map +1 -0
- package/dist/{chunk-DEZ7XSTG.cjs → chunk-XXVUHLQN.cjs} +7 -7
- package/dist/{chunk-DEZ7XSTG.cjs.map → chunk-XXVUHLQN.cjs.map} +1 -1
- package/dist/{chunk-3GGET5LK.cjs → chunk-YGA35Z2P.cjs} +7 -7
- package/dist/{chunk-3GGET5LK.cjs.map → chunk-YGA35Z2P.cjs.map} +1 -1
- package/dist/{chunk-GOKC4CCZ.cjs → chunk-YMHOF6WA.cjs} +8 -8
- package/dist/{chunk-GOKC4CCZ.cjs.map → chunk-YMHOF6WA.cjs.map} +1 -1
- package/dist/{chunk-OXYFTCRW.cjs → chunk-YP5T6NZD.cjs} +4 -4
- package/dist/{chunk-OXYFTCRW.cjs.map → chunk-YP5T6NZD.cjs.map} +1 -1
- package/dist/{chunk-EL2RSQTJ.cjs → chunk-YVL3XATO.cjs} +5 -5
- package/dist/{chunk-EL2RSQTJ.cjs.map → chunk-YVL3XATO.cjs.map} +1 -1
- package/dist/{chunk-PVUDXJAI.js → chunk-YXCE2HSK.js} +4 -4
- package/dist/{chunk-PVUDXJAI.js.map → chunk-YXCE2HSK.js.map} +1 -1
- package/dist/{chunk-ST2RE5UB.cjs → chunk-Z5KFXHDP.cjs} +6 -6
- package/dist/{chunk-ST2RE5UB.cjs.map → chunk-Z5KFXHDP.cjs.map} +1 -1
- package/dist/{chunk-DAPZPT5N.cjs → chunk-ZBI52NP2.cjs} +13 -13
- package/dist/{chunk-DAPZPT5N.cjs.map → chunk-ZBI52NP2.cjs.map} +1 -1
- package/dist/{chunk-4Z6ZZKIY.js → chunk-ZIUADGAR.js} +3 -3
- package/dist/{chunk-4Z6ZZKIY.js.map → chunk-ZIUADGAR.js.map} +1 -1
- package/dist/{chunk-LOTMAKUG.cjs → chunk-ZZJ4ZVYR.cjs} +11 -11
- package/dist/{chunk-LOTMAKUG.cjs.map → chunk-ZZJ4ZVYR.cjs.map} +1 -1
- package/dist/collabKit-QZL4P5T5.js +48 -0
- package/dist/collabKit-QZL4P5T5.js.map +1 -0
- package/dist/collabKit-UF7E6V3N.cjs +72 -0
- package/dist/collabKit-UF7E6V3N.cjs.map +1 -0
- package/dist/components/Alert/index.cjs +6 -6
- package/dist/components/Alert/index.js +2 -2
- package/dist/components/AlertDialog/index.cjs +5 -5
- package/dist/components/AlertDialog/index.js +4 -4
- package/dist/components/AudioPlayer/index.cjs +7 -7
- package/dist/components/AudioPlayer/index.js +2 -2
- package/dist/components/AudioRecorder/index.cjs +7 -7
- package/dist/components/AudioRecorder/index.js +2 -2
- package/dist/components/Autocomplete/index.cjs +5 -5
- package/dist/components/Autocomplete/index.js +4 -4
- package/dist/components/Avatar/index.cjs +6 -6
- package/dist/components/Avatar/index.js +2 -2
- package/dist/components/Badge/index.cjs +4 -4
- package/dist/components/Badge/index.js +2 -2
- package/dist/components/Breadcrumb/index.cjs +4 -4
- package/dist/components/Breadcrumb/index.js +2 -2
- package/dist/components/Button/index.cjs +4 -4
- package/dist/components/Button/index.js +2 -2
- package/dist/components/Card/index.cjs +16 -16
- package/dist/components/Card/index.d.cts +8 -3
- package/dist/components/Card/index.d.ts +8 -3
- package/dist/components/Card/index.js +2 -2
- package/dist/components/Checkbox/index.cjs +5 -5
- package/dist/components/Checkbox/index.js +2 -2
- package/dist/components/CollabStatus/index.cjs +21 -0
- package/dist/components/CollabStatus/index.cjs.map +1 -0
- package/dist/components/CollabStatus/index.d.cts +222 -0
- package/dist/components/CollabStatus/index.d.ts +222 -0
- package/dist/components/CollabStatus/index.js +4 -0
- package/dist/components/CollabStatus/index.js.map +1 -0
- package/dist/components/Collapsible/index.cjs +5 -5
- package/dist/components/Collapsible/index.js +2 -2
- package/dist/components/CountryCodeDropdown/index.cjs +6 -6
- package/dist/components/CountryCodeDropdown/index.js +3 -3
- package/dist/components/DateInput/index.cjs +5 -5
- package/dist/components/DateInput/index.d.cts +3 -1
- package/dist/components/DateInput/index.d.ts +3 -1
- package/dist/components/DateInput/index.js +4 -4
- package/dist/components/Dropdown/index.cjs +10 -10
- package/dist/components/Dropdown/index.d.cts +1 -1
- package/dist/components/Dropdown/index.d.ts +1 -1
- package/dist/components/Dropdown/index.js +4 -4
- package/dist/components/FloatingWindow/index.cjs +5 -5
- package/dist/components/FloatingWindow/index.js +3 -3
- package/dist/components/Input/index.cjs +4 -4
- package/dist/components/Input/index.js +2 -2
- package/dist/components/Label/index.cjs +4 -4
- package/dist/components/Label/index.js +2 -2
- package/dist/components/Markdown/index.cjs +17 -17
- package/dist/components/Markdown/index.js +8 -8
- package/dist/components/MediaEditor/index.cjs +16 -16
- package/dist/components/MediaEditor/index.d.cts +34 -1
- package/dist/components/MediaEditor/index.d.ts +34 -1
- package/dist/components/MediaEditor/index.js +11 -11
- package/dist/components/MediaPlayer/index.cjs +6 -6
- package/dist/components/MediaPlayer/index.js +3 -3
- package/dist/components/Modal/index.cjs +10 -10
- package/dist/components/Modal/index.js +2 -2
- package/dist/components/Pagination/index.cjs +5 -5
- package/dist/components/Pagination/index.js +2 -2
- package/dist/components/PhoneInput/index.cjs +5 -5
- package/dist/components/PhoneInput/index.js +3 -3
- package/dist/components/Progress/index.cjs +7 -7
- package/dist/components/Progress/index.js +2 -2
- package/dist/components/QuickAction/index.cjs +7 -7
- package/dist/components/QuickAction/index.js +2 -2
- package/dist/components/Radio/index.cjs +5 -5
- package/dist/components/Radio/index.js +2 -2
- package/dist/components/RecordButton/index.cjs +5 -5
- package/dist/components/RecordButton/index.js +2 -2
- package/dist/components/RichTextEditor/index.cjs +10 -10
- package/dist/components/RichTextEditor/index.js +7 -7
- package/dist/components/SchedulePicker/index.cjs +11 -11
- package/dist/components/SchedulePicker/index.js +2 -2
- package/dist/components/ScrollArea/index.cjs +4 -4
- package/dist/components/ScrollArea/index.js +2 -2
- package/dist/components/Select/index.cjs +5 -5
- package/dist/components/Select/index.js +3 -3
- package/dist/components/Separator/index.cjs +4 -4
- package/dist/components/Separator/index.js +2 -2
- package/dist/components/Sheet/index.cjs +11 -11
- package/dist/components/Sheet/index.d.cts +1 -1
- package/dist/components/Sheet/index.d.ts +1 -1
- package/dist/components/Sheet/index.js +2 -2
- package/dist/components/Skeleton/index.cjs +7 -7
- package/dist/components/Skeleton/index.js +2 -2
- package/dist/components/Slider/index.cjs +6 -6
- package/dist/components/Slider/index.js +2 -2
- package/dist/components/Spinner/index.cjs +6 -6
- package/dist/components/Spinner/index.js +2 -2
- package/dist/components/SuperChat/index.cjs +46 -46
- package/dist/components/SuperChat/index.d.cts +4 -4
- package/dist/components/SuperChat/index.d.ts +4 -4
- package/dist/components/SuperChat/index.js +9 -9
- package/dist/components/SuperChat/plugins/index.cjs +10 -10
- package/dist/components/SuperChat/plugins/index.d.cts +3 -3
- package/dist/components/SuperChat/plugins/index.d.ts +3 -3
- package/dist/components/SuperChat/plugins/index.js +4 -4
- package/dist/components/Switch/index.cjs +5 -5
- package/dist/components/Switch/index.js +2 -2
- package/dist/components/Table/index.cjs +10 -10
- package/dist/components/Table/index.js +2 -2
- package/dist/components/Tabs/index.cjs +8 -8
- package/dist/components/Tabs/index.js +2 -2
- package/dist/components/Text/index.cjs +5 -5
- package/dist/components/Text/index.d.cts +1 -1
- package/dist/components/Text/index.d.ts +1 -1
- package/dist/components/Text/index.js +2 -2
- package/dist/components/Textarea/index.cjs +4 -4
- package/dist/components/Textarea/index.js +2 -2
- package/dist/components/ThemeProvider/index.cjs +9 -9
- package/dist/components/ThemeProvider/index.js +3 -3
- package/dist/components/Toggle/index.cjs +4 -4
- package/dist/components/Toggle/index.js +2 -2
- package/dist/components/Tooltip/index.cjs +3 -3
- package/dist/components/Tooltip/index.js +2 -2
- package/dist/datavis.cjs +7 -7
- package/dist/datavis.js +3 -3
- package/dist/esheet.cjs +18 -18
- package/dist/esheet.js +15 -15
- package/dist/hooks/index.cjs +34 -22
- package/dist/hooks/index.d.cts +31 -3
- package/dist/hooks/index.d.ts +31 -3
- package/dist/hooks/index.js +3 -3
- package/dist/index.cjs +3422 -1875
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +212 -22
- package/dist/index.d.ts +212 -22
- package/dist/index.js +918 -124
- package/dist/index.js.map +1 -1
- package/dist/kerebron.cjs +60 -17
- package/dist/kerebron.cjs.map +1 -1
- package/dist/kerebron.d.cts +39 -1
- package/dist/kerebron.d.ts +39 -1
- package/dist/kerebron.js +60 -17
- package/dist/kerebron.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/tailwind-preset.cjs +4 -4
- package/dist/tailwind-preset.js +1 -1
- package/dist/{types-BYnLjEFg.d.ts → types-B2RLmdVd.d.cts} +3 -1
- package/dist/{types-BYnLjEFg.d.cts → types-B2RLmdVd.d.ts} +3 -1
- package/dist/{types-CyCwYBlr.d.ts → types-BoTeTPdH.d.ts} +1 -1
- package/dist/{types-CBh8Zlje.d.cts → types-DyIB9HYT.d.cts} +1 -1
- package/dist/{useAnchoredPosition-nXdSFKHf.d.cts → useAnchoredPosition-C7PNglzD.d.cts} +6 -2
- package/dist/{useAnchoredPosition-nXdSFKHf.d.ts → useAnchoredPosition-C7PNglzD.d.ts} +6 -2
- package/dist/{useTranscriptEdits-Hy0Vm-H8.d.cts → useTranscriptEdits-CGzlemHT.d.cts} +16 -3
- package/dist/{useTranscriptEdits-C2BbMU37.d.ts → useTranscriptEdits-D32bLs0l.d.ts} +16 -3
- package/dist/utils/index.cjs +15 -11
- package/dist/utils/index.d.cts +6 -1
- package/dist/utils/index.d.ts +6 -1
- package/dist/utils/index.js +2 -2
- package/package.json +30 -12
- package/dist/CsvBlock-2A5VEDD3.cjs +0 -15
- package/dist/CsvBlock-D6PWAJ5X.js +0 -6
- package/dist/HtmlPreviewBlock-PEHTJ6C3.js +0 -6
- package/dist/HtmlPreviewBlock-SYXCV5RH.cjs +0 -15
- package/dist/MermaidBlock-7NK3AVK2.js +0 -6
- package/dist/MermaidBlock-AFXNP5NK.cjs +0 -15
- package/dist/SurveyBlock-6KRNKFH5.cjs +0 -15
- package/dist/SurveyBlock-NNDGXGG4.js +0 -6
- package/dist/chunk-43GBCUSQ.js.map +0 -1
- package/dist/chunk-4GXECTPS.cjs.map +0 -1
- package/dist/chunk-4LVPQ44A.js.map +0 -1
- package/dist/chunk-5BQE6BEL.js.map +0 -1
- package/dist/chunk-6D5F7EDM.js.map +0 -1
- package/dist/chunk-7VF6WO7H.cjs.map +0 -1
- package/dist/chunk-DHKYGVP7.js +0 -3
- package/dist/chunk-F3SOEIN2.js +0 -11
- package/dist/chunk-F3SOEIN2.js.map +0 -1
- package/dist/chunk-FCBQP2U4.cjs.map +0 -1
- package/dist/chunk-IHTRKWBG.js.map +0 -1
- package/dist/chunk-IWDQPSJN.cjs.map +0 -1
- package/dist/chunk-JLBT76WH.js.map +0 -1
- package/dist/chunk-KJ5BSGEO.cjs.map +0 -1
- package/dist/chunk-LJ2ZWIX6.js.map +0 -1
- package/dist/chunk-MCCO4A23.js.map +0 -1
- package/dist/chunk-NQME7MCK.js.map +0 -1
- package/dist/chunk-NVHAQOHH.cjs.map +0 -1
- package/dist/chunk-OOYEHBYJ.js.map +0 -1
- package/dist/chunk-OR5DRJCW.cjs +0 -13
- package/dist/chunk-OR5DRJCW.cjs.map +0 -1
- package/dist/chunk-PFWHWIXS.cjs.map +0 -1
- package/dist/chunk-PJAQDAMZ.cjs.map +0 -1
- package/dist/chunk-PWHK7SWN.cjs.map +0 -1
- package/dist/chunk-QA6ZDHFP.js.map +0 -1
- package/dist/chunk-QUUFKGDF.cjs.map +0 -1
- package/dist/chunk-UTYUT5YY.cjs +0 -240
- package/dist/chunk-ZDEYV373.cjs.map +0 -1
- package/dist/chunk-ZGSC2CB2.js.map +0 -1
- package/dist/chunk-ZHBANUBI.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/DateInput/DateInput.tsx"],"names":["year","month","day"],"mappings":"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","file":"chunk-EGWWTIWS.js","sourcesContent":["import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\nimport {\n formatDateValue,\n isValidDate,\n parseDateValue,\n isDateInPast,\n isDateInFuture,\n calculateAge,\n} from '../../utils/date';\nimport { Input, type InputProps } from '../Input';\nimport { Calendar, Clock } from 'lucide-react';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\n\nexport type DateInputMode =\n | 'default'\n | 'dob'\n | 'expiration'\n | 'past'\n | 'future';\n\nexport type DateInputType =\n | 'date'\n | 'datetime-local'\n | 'time'\n | 'month'\n | 'year';\n\nexport type DateInputWidth = 'full' | 'fit' | 'fixed';\n\nexport type DateInputTimeFormat = '12-hour' | '24-hour';\n\nconst widthClasses: Record<DateInputWidth, string> = {\n full: 'w-full',\n fit: 'w-fit',\n fixed: 'w-44', // ~176px - enough for MM/DD/YYYY + calendar icon\n};\n\nconst sizeClasses = {\n sm: 'h-8 text-sm',\n md: 'h-10 text-base',\n lg: 'h-12 text-lg',\n} as const;\n\nconst MONTH_NAMES = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\n\ninterface PickerDate {\n month: number;\n year: number;\n day: number | null;\n}\n\nfunction isValidPickerDate(year: number, month: number, day: number): boolean {\n return (\n Number.isFinite(year) &&\n month >= 1 &&\n month <= 12 &&\n day >= 1 &&\n day <= new Date(year, month, 0).getDate()\n );\n}\n\nfunction parsePickerDate(\n value: string,\n inputType: DateInputType\n): PickerDate | undefined {\n if (inputType === 'datetime-local') {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})T\\d{2}:\\d{2}$/.exec(value);\n if (!match) return undefined;\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n const [hour, minute] = value.slice(-5).split(':').map(Number);\n if (!isValidPickerDate(year, month, day) || hour > 23 || minute > 59) {\n return undefined;\n }\n return {\n year,\n month: month - 1,\n day,\n };\n }\n\n if (inputType === 'month') {\n const match = /^(\\d{4})-(\\d{2})$/.exec(value);\n if (!match) return undefined;\n const year = Number(match[1]);\n const month = Number(match[2]);\n if (!Number.isFinite(year) || month < 1 || month > 12) return undefined;\n return { year, month: month - 1, day: null };\n }\n\n if (!isValidDate(value)) return undefined;\n const [month, day, year] = value.split('/').map(Number);\n return { month: month - 1, year, day };\n}\n\nfunction formatTimeDisplay(\n time: string,\n timeFormat: DateInputTimeFormat\n): string {\n const [hour, minute] = time.split(':').map(Number);\n if (timeFormat === '12-hour') {\n const displayHour = hour % 12 || 12;\n const meridiem = hour >= 12 ? 'PM' : 'AM';\n return `${displayHour}:${String(minute).padStart(2, '0')} ${meridiem}`;\n }\n return time;\n}\n\nfunction formatPickerValue(\n value: string,\n inputType: DateInputType,\n timeFormat: DateInputTimeFormat\n): string {\n if (inputType === 'datetime-local') {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}:\\d{2})$/.exec(value);\n if (!match) return '';\n return `${match[2]}/${match[3]}/${match[1]} ${formatTimeDisplay(match[4], timeFormat)}`;\n }\n\n if (inputType === 'time') {\n return /^\\d{2}:\\d{2}$/.test(value)\n ? formatTimeDisplay(value, timeFormat)\n : '';\n }\n\n if (inputType === 'month') {\n const date = parsePickerDate(value, inputType);\n return date ? `${MONTH_NAMES[date.month]} ${date.year}` : '';\n }\n\n return value;\n}\n\nexport interface DateInputProps extends Omit<\n InputProps,\n 'type' | 'onChange' | 'value'\n> {\n /** The value for the selected input type. Dates use MM/DD/YYYY format. */\n value?: string;\n /** Callback fired when the value changes */\n onChange?: (value: string) => void;\n /** Date value format and picker control. */\n inputType?: DateInputType;\n /** Minute increment for the time picker (e.g. 15 shows :00, :15, :30, :45). */\n minuteStep?: number;\n /** Time picker display format for datetime values. */\n timeFormat?: DateInputTimeFormat;\n /** Validation mode for the date input */\n mode?: DateInputMode;\n /** Minimum age for DOB validation (default: 0) */\n minAge?: number;\n /** Maximum age for DOB validation */\n maxAge?: number;\n /** Earliest allowed date in MM/DD/YYYY format. */\n minDate?: string;\n /** Latest allowed date in MM/DD/YYYY format. */\n maxDate?: string;\n /** Whether to validate on blur */\n validateOnBlur?: boolean;\n /** Whether to show a calendar picker button */\n showCalendar?: boolean;\n /** Width behavior of the input */\n width?: DateInputWidth;\n}\n\nfunction getValidationError(\n value: string,\n mode: DateInputMode,\n minAge?: number,\n maxAge?: number,\n minDate?: string,\n maxDate?: string\n): string | undefined {\n if (!value || value.replace(/\\D/g, '').length === 0) {\n return undefined;\n }\n\n if (!isValidDate(value)) {\n return 'Please enter a valid date (MM/DD/YYYY)';\n }\n\n const selectedDate = parseDateValue(value);\n const minimumDate = minDate ? parseDateValue(minDate) : null;\n const maximumDate = maxDate ? parseDateValue(maxDate) : null;\n const minimumDateLabel = minDate ? formatDateValue(minDate) : '';\n const maximumDateLabel = maxDate ? formatDateValue(maxDate) : '';\n\n if (selectedDate && minimumDate && selectedDate < minimumDate) {\n return `Date must be on or after ${minimumDateLabel}`;\n }\n\n if (selectedDate && maximumDate && selectedDate > maximumDate) {\n return `Date must be on or before ${maximumDateLabel}`;\n }\n\n switch (mode) {\n case 'dob': {\n if (!isDateInPast(value)) {\n return 'Date of birth must be in the past';\n }\n const age = calculateAge(value);\n if (age !== null) {\n if (minAge !== undefined && age < minAge) {\n return `Must be at least ${minAge} years old`;\n }\n if (maxAge !== undefined && age > maxAge) {\n return `Must be no more than ${maxAge} years old`;\n }\n }\n break;\n }\n case 'expiration':\n if (!isDateInFuture(value)) {\n return 'Expiration date must be in the future';\n }\n break;\n case 'past':\n if (!isDateInPast(value)) {\n return 'Date must be in the past';\n }\n break;\n case 'future':\n if (!isDateInFuture(value)) {\n return 'Date must be in the future';\n }\n break;\n }\n\n return undefined;\n}\n\n/**\n * A date input that automatically formats to MM/DD/YYYY with validation modes.\n *\n * @example\n * ```tsx\n * // Date of birth with age validation\n * <DateInput\n * label=\"Date of Birth\"\n * mode=\"dob\"\n * minAge={18}\n * validateOnBlur\n * />\n *\n * // With calendar picker\n * <DateInput\n * label=\"Select Date\"\n * showCalendar\n * />\n *\n * // Expiration date\n * <DateInput\n * label=\"License Expiration\"\n * mode=\"expiration\"\n * validateOnBlur\n * />\n * ```\n */\nconst DateInput = React.forwardRef<HTMLInputElement, DateInputProps>(\n (\n {\n value = '',\n onChange,\n inputType = 'date',\n minuteStep = 1,\n timeFormat = '24-hour',\n mode = 'default',\n minAge,\n maxAge,\n minDate,\n maxDate,\n validateOnBlur,\n showCalendar = false,\n width = 'full',\n className,\n onBlur,\n onClick,\n hasError,\n error,\n ...props\n },\n ref\n ) => {\n const isFormattedDate = inputType === 'date';\n const [displayValue, setDisplayValue] = React.useState(() =>\n isFormattedDate ? formatDateValue(value) : value\n );\n const [localError, setLocalError] = React.useState<string | undefined>();\n\n // Sync external value changes\n React.useEffect(() => {\n setDisplayValue(isFormattedDate ? formatDateValue(value) : value);\n }, [isFormattedDate, value]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const formatted = formatDateValue(e.target.value);\n setDisplayValue(formatted);\n onChange?.(formatted);\n\n // Clear error when user starts typing again\n if (localError) {\n setLocalError(undefined);\n }\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n onBlur?.(e);\n\n if (validateOnBlur) {\n const validationError = getValidationError(\n displayValue,\n mode,\n minAge,\n maxAge,\n minDate,\n maxDate\n );\n setLocalError(validationError);\n }\n };\n\n const placeholder = mode === 'expiration' ? 'MM/DD/YYYY' : 'MM/DD/YYYY';\n const autoComplete =\n mode === 'dob' ? 'bday' : mode === 'expiration' ? 'cc-exp' : undefined;\n\n // Generate stable ID for accessibility\n const generatedId = React.useId();\n\n // Calendar picker state\n const [isCalendarOpen, setIsCalendarOpen] = React.useState(false);\n\n // Portal + fixed positioning so the calendar escapes overflow-hidden\n // ancestors, flips vertically, and clamps to the viewport.\n const {\n anchorRef: buttonRef,\n floatingRef: calendarRef,\n style: calendarStyle,\n } = useAnchoredPosition<HTMLButtonElement, HTMLDivElement>({\n open: isCalendarOpen,\n placement: 'bottom-end',\n });\n\n // Parse current value into date parts for calendar\n const parsedDate = React.useMemo(() => {\n const fallback = new Date();\n return (\n parsePickerDate(displayValue, inputType) ?? {\n month: fallback.getMonth(),\n year: fallback.getFullYear(),\n day: null,\n }\n );\n }, [displayValue, inputType]);\n\n const [calendarMonth, setCalendarMonth] = React.useState(parsedDate.month);\n const [calendarYear, setCalendarYear] = React.useState(parsedDate.year);\n const [selectedTime, setSelectedTime] = React.useState(() => {\n if (inputType === 'time' && /^\\d{2}:\\d{2}$/.test(value)) {\n return value;\n }\n return inputType === 'datetime-local' &&\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$/.test(value)\n ? value.slice(-5)\n : '00:00';\n });\n\n // Minute choices honor minuteStep; an off-step current value is kept\n // selectable so it still displays correctly.\n const minuteOptions = React.useMemo(() => {\n const step = Math.min(Math.max(Math.floor(minuteStep), 1), 60);\n const minutes = Array.from(\n { length: Math.ceil(60 / step) },\n (_, index) => index * step\n );\n const currentMinute = Number(selectedTime.slice(3));\n if (!minutes.includes(currentMinute)) {\n minutes.push(currentMinute);\n minutes.sort((a, b) => a - b);\n }\n return minutes.map((minute) => String(minute).padStart(2, '0'));\n }, [minuteStep, selectedTime]);\n const minimumDate = React.useMemo(\n () => (minDate ? parseDateValue(minDate) : null),\n [minDate]\n );\n const maximumDate = React.useMemo(\n () => (maxDate ? parseDateValue(maxDate) : null),\n [maxDate]\n );\n\n const isDateInRange = React.useCallback(\n (date: Date) => {\n const candidate = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate()\n );\n return (\n (!minimumDate || candidate >= minimumDate) &&\n (!maximumDate || candidate <= maximumDate)\n );\n },\n [maximumDate, minimumDate]\n );\n\n const isCalendarDateInRange = React.useCallback(\n (day: number) => {\n return isDateInRange(new Date(calendarYear, calendarMonth, day));\n },\n [calendarMonth, calendarYear, isDateInRange]\n );\n\n const isCalendarMonthInRange = React.useCallback(\n (month: number, year: number) => {\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n return (\n (!minimumDate || lastDay >= minimumDate) &&\n (!maximumDate || firstDay <= maximumDate)\n );\n },\n [maximumDate, minimumDate]\n );\n\n const firstCalendarYear = minimumDate\n ? minimumDate.getFullYear()\n : new Date().getFullYear() - 100;\n const lastCalendarYear = maximumDate\n ? maximumDate.getFullYear()\n : new Date().getFullYear() + 49;\n const calendarYears = Array.from(\n { length: Math.max(0, lastCalendarYear - firstCalendarYear + 1) },\n (_, index) => firstCalendarYear + index\n );\n const previousCalendarMonth = calendarMonth === 0 ? 11 : calendarMonth - 1;\n const previousCalendarYear =\n calendarMonth === 0 ? calendarYear - 1 : calendarYear;\n const nextCalendarMonth = calendarMonth === 11 ? 0 : calendarMonth + 1;\n const nextCalendarYear =\n calendarMonth === 11 ? calendarYear + 1 : calendarYear;\n const canGoToPreviousCalendar =\n inputType === 'month'\n ? !minimumDate || calendarYear > minimumDate.getFullYear()\n : isCalendarMonthInRange(previousCalendarMonth, previousCalendarYear);\n const canGoToNextCalendar =\n inputType === 'month'\n ? !maximumDate || calendarYear < maximumDate.getFullYear()\n : isCalendarMonthInRange(nextCalendarMonth, nextCalendarYear);\n\n // Update calendar view when value changes\n React.useEffect(() => {\n if (inputType === 'time') {\n if (/^\\d{2}:\\d{2}$/.test(displayValue)) {\n setSelectedTime(displayValue);\n }\n return;\n }\n const date = parsePickerDate(displayValue, inputType);\n if (!date) return;\n setCalendarMonth(date.month);\n setCalendarYear(date.year);\n if (inputType === 'datetime-local') {\n setSelectedTime(displayValue.slice(-5));\n }\n }, [displayValue, inputType]);\n\n React.useEffect(() => {\n if (isCalendarMonthInRange(calendarMonth, calendarYear)) return;\n\n const closestAllowedDate = minimumDate ?? maximumDate;\n if (!closestAllowedDate) return;\n\n setCalendarMonth(closestAllowedDate.getMonth());\n setCalendarYear(closestAllowedDate.getFullYear());\n }, [\n calendarMonth,\n calendarYear,\n isCalendarMonthInRange,\n maximumDate,\n minimumDate,\n ]);\n\n // Close calendar on click outside\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n calendarRef.current &&\n !calendarRef.current.contains(event.target as HTMLElement) &&\n buttonRef.current &&\n !buttonRef.current.contains(event.target as HTMLElement)\n ) {\n setIsCalendarOpen(false);\n }\n };\n\n if (isCalendarOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () =>\n document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isCalendarOpen, buttonRef, calendarRef]);\n\n // Close on Escape key\n React.useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setIsCalendarOpen(false);\n buttonRef.current?.focus();\n }\n };\n\n if (isCalendarOpen) {\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }\n }, [isCalendarOpen, buttonRef]);\n\n const handleDateSelect = (day: number) => {\n if (!isCalendarDateInRange(day)) return;\n\n const month = String(calendarMonth + 1).padStart(2, '0');\n const dayStr = String(day).padStart(2, '0');\n const year = String(calendarYear);\n const formatted =\n inputType === 'datetime-local'\n ? `${year}-${month}-${dayStr}T${selectedTime}`\n : `${month}/${dayStr}/${year}`;\n setDisplayValue(formatted);\n onChange?.(formatted);\n if (inputType === 'date') {\n setIsCalendarOpen(false);\n }\n\n // Validate if needed\n if (inputType === 'date' && validateOnBlur) {\n const validationError = getValidationError(\n formatted,\n mode,\n minAge,\n maxAge,\n minDate,\n maxDate\n );\n setLocalError(validationError);\n }\n };\n\n const handleMonthSelect = (month: number) => {\n if (!isCalendarMonthInRange(month, calendarYear)) return;\n\n const formatted = `${calendarYear}-${String(month + 1).padStart(2, '0')}`;\n setDisplayValue(formatted);\n onChange?.(formatted);\n setIsCalendarOpen(false);\n };\n\n const handleCalendarYearChange = (year: number) => {\n setCalendarYear(year);\n if (isCalendarMonthInRange(calendarMonth, year)) return;\n\n const firstAvailableMonth = MONTH_NAMES.findIndex((_, month) =>\n isCalendarMonthInRange(month, year)\n );\n if (firstAvailableMonth !== -1) {\n setCalendarMonth(firstAvailableMonth);\n }\n };\n\n const handleTimeChange = (part: 'hour' | 'minute', nextValue: string) => {\n const [hour, minute] = selectedTime.split(':');\n const nextTime =\n part === 'hour' ? `${nextValue}:${minute}` : `${hour}:${nextValue}`;\n setSelectedTime(nextTime);\n\n if (inputType === 'time') {\n setDisplayValue(nextTime);\n onChange?.(nextTime);\n return;\n }\n\n if (parsedDate.day === null) return;\n const month = String(parsedDate.month + 1).padStart(2, '0');\n const day = String(parsedDate.day).padStart(2, '0');\n const formatted = `${parsedDate.year}-${month}-${day}T${nextTime}`;\n setDisplayValue(formatted);\n onChange?.(formatted);\n };\n\n const handleMeridiemChange = (meridiem: 'AM' | 'PM') => {\n const [hour] = selectedTime.split(':').map(Number);\n const nextHour = (hour % 12) + (meridiem === 'PM' ? 12 : 0);\n handleTimeChange('hour', String(nextHour).padStart(2, '0'));\n };\n\n const getDaysInMonth = (month: number, year: number) => {\n return new Date(year, month + 1, 0).getDate();\n };\n\n const getFirstDayOfMonth = (month: number, year: number) => {\n return new Date(year, month, 1).getDay();\n };\n\n const renderCalendar = () => {\n const daysInMonth = getDaysInMonth(calendarMonth, calendarYear);\n const firstDay = getFirstDayOfMonth(calendarMonth, calendarYear);\n const days: (number | null)[] = [];\n\n // Add empty cells for days before the first day of the month\n for (let i = 0; i < firstDay; i++) {\n days.push(null);\n }\n\n // Add the days of the month\n for (let i = 1; i <= daysInMonth; i++) {\n days.push(i);\n }\n\n const isSelectedDay = (day: number) => {\n return (\n parsedDate.day === day &&\n parsedDate.month === calendarMonth &&\n parsedDate.year === calendarYear\n );\n };\n\n const isToday = (day: number) => {\n const today = new Date();\n return (\n day === today.getDate() &&\n calendarMonth === today.getMonth() &&\n calendarYear === today.getFullYear()\n );\n };\n\n return (\n <div\n ref={calendarRef}\n className={cn(\n 'bg-background border-border rounded-lg border shadow-lg',\n 'overflow-auto p-3',\n inputType === 'time' ? 'w-fit' : 'w-72'\n )}\n style={calendarStyle}\n role=\"dialog\"\n aria-label={\n inputType === 'month'\n ? 'Choose month'\n : inputType === 'time'\n ? 'Choose time'\n : inputType === 'datetime-local'\n ? 'Choose date and time'\n : 'Choose date'\n }\n >\n {/* Header with month/year navigation */}\n {inputType !== 'time' && (\n <div className=\"mb-3 flex items-center justify-between\">\n <button\n type=\"button\"\n onClick={() => {\n if (inputType === 'month') {\n setCalendarYear(calendarYear - 1);\n } else if (calendarMonth === 0) {\n setCalendarMonth(11);\n setCalendarYear(calendarYear - 1);\n } else {\n setCalendarMonth(calendarMonth - 1);\n }\n }}\n disabled={!canGoToPreviousCalendar}\n className=\"enabled:hover:bg-muted rounded-md p-1 transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n aria-label={\n inputType === 'month' ? 'Previous year' : 'Previous month'\n }\n >\n <ChevronLeftIcon />\n </button>\n <div className=\"flex items-center gap-2\">\n {inputType !== 'month' && (\n <select\n value={calendarMonth}\n onChange={(e) => setCalendarMonth(Number(e.target.value))}\n className=\"bg-background border-border rounded border px-2 py-1 text-sm\"\n aria-label=\"Select month\"\n >\n {MONTH_NAMES.map((name, month) =>\n isCalendarMonthInRange(month, calendarYear) ? (\n <option key={name} value={month}>\n {name}\n </option>\n ) : null\n )}\n </select>\n )}\n <select\n value={calendarYear}\n onChange={(e) =>\n handleCalendarYearChange(Number(e.target.value))\n }\n className=\"bg-background border-border rounded border px-2 py-1 text-sm\"\n aria-label=\"Select year\"\n >\n {calendarYears.map((year) => (\n <option key={year} value={year}>\n {year}\n </option>\n ))}\n </select>\n </div>\n <button\n type=\"button\"\n onClick={() => {\n if (inputType === 'month') {\n setCalendarYear(calendarYear + 1);\n } else if (calendarMonth === 11) {\n setCalendarMonth(0);\n setCalendarYear(calendarYear + 1);\n } else {\n setCalendarMonth(calendarMonth + 1);\n }\n }}\n disabled={!canGoToNextCalendar}\n className=\"hover:bg-muted rounded-md p-1 transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n aria-label={inputType === 'month' ? 'Next year' : 'Next month'}\n >\n <ChevronRightIcon />\n </button>\n </div>\n )}\n\n {inputType === 'time' ? null : inputType === 'month' ? (\n <div className=\"grid grid-cols-3 gap-1\">\n {MONTH_NAMES.map((name, month) => (\n <button\n key={name}\n type=\"button\"\n onClick={() => handleMonthSelect(month)}\n className={cn(\n 'rounded-md px-2 py-2 text-sm transition-colors',\n 'focus:ring-ring focus:ring-2 focus:outline-none',\n 'hover:bg-muted',\n parsedDate.month === month &&\n parsedDate.year === calendarYear &&\n 'bg-primary-800 hover:bg-primary-900 text-white'\n )}\n >\n {name.slice(0, 3)}\n </button>\n ))}\n </div>\n ) : (\n <>\n <div className=\"mb-1 grid grid-cols-7 gap-1\">\n {['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'].map((day) => (\n <div\n key={day}\n className=\"text-muted-foreground py-1 text-center text-xs font-medium\"\n >\n {day}\n </div>\n ))}\n </div>\n <div className=\"grid grid-cols-7 gap-1\">\n {days.map((day, index) => (\n <button\n key={index}\n type=\"button\"\n disabled={day === null || !isCalendarDateInRange(day)}\n onClick={() => day && handleDateSelect(day)}\n className={cn(\n 'h-8 w-8 rounded-md text-sm transition-colors',\n 'focus:ring-ring focus:ring-2 focus:outline-none',\n day === null && 'invisible',\n day !== null && 'hover:bg-muted',\n day !== null &&\n !isCalendarDateInRange(day) &&\n 'cursor-not-allowed opacity-50',\n isSelectedDay(day!) &&\n 'bg-primary-800 hover:bg-primary-900 text-white',\n isToday(day!) &&\n !isSelectedDay(day!) &&\n 'border-primary-800 text-primary-800 border'\n )}\n >\n {day}\n </button>\n ))}\n </div>\n </>\n )}\n\n {(inputType === 'datetime-local' || inputType === 'time') && (\n <div\n className={cn(\n 'flex items-center gap-2',\n inputType === 'datetime-local' &&\n 'border-border mt-3 border-t pt-3'\n )}\n >\n <select\n value={\n timeFormat === '12-hour'\n ? String(\n Number(selectedTime.slice(0, 2)) % 12 || 12\n ).padStart(2, '0')\n : selectedTime.slice(0, 2)\n }\n onChange={(event) => {\n const hour = Number(event.target.value);\n const isPm = Number(selectedTime.slice(0, 2)) >= 12;\n handleTimeChange(\n 'hour',\n String(\n timeFormat === '12-hour'\n ? (hour % 12) + (isPm ? 12 : 0)\n : hour\n ).padStart(2, '0')\n );\n }}\n className=\"bg-background border-border rounded border px-2 py-1 text-sm\"\n aria-label=\"Select hour\"\n >\n {Array.from(\n { length: timeFormat === '12-hour' ? 12 : 24 },\n (_, index) => (timeFormat === '12-hour' ? index + 1 : index)\n ).map((hour) => (\n <option key={hour} value={String(hour).padStart(2, '0')}>\n {String(hour).padStart(2, '0')}\n </option>\n ))}\n </select>\n <span aria-hidden=\"true\">:</span>\n <select\n value={selectedTime.slice(3)}\n onChange={(event) =>\n handleTimeChange('minute', event.target.value)\n }\n className=\"bg-background border-border rounded border px-2 py-1 text-sm\"\n aria-label=\"Select minute\"\n >\n {minuteOptions.map((minute) => (\n <option key={minute} value={minute}>\n {minute}\n </option>\n ))}\n </select>\n {timeFormat === '12-hour' && (\n <select\n value={Number(selectedTime.slice(0, 2)) >= 12 ? 'PM' : 'AM'}\n onChange={(event) =>\n handleMeridiemChange(event.target.value as 'AM' | 'PM')\n }\n className=\"bg-background border-border rounded border px-2 py-1 text-sm\"\n aria-label=\"Select AM or PM\"\n >\n <option value=\"AM\">AM</option>\n <option value=\"PM\">PM</option>\n </select>\n )}\n </div>\n )}\n\n <div className=\"border-border mt-3 flex gap-2 border-t pt-3\">\n {inputType !== 'time' && (\n <button\n type=\"button\"\n onClick={() => {\n const today = new Date();\n setCalendarMonth(today.getMonth());\n setCalendarYear(today.getFullYear());\n if (inputType === 'month') {\n handleMonthSelect(today.getMonth());\n } else {\n handleDateSelect(today.getDate());\n }\n }}\n disabled={\n inputType === 'month'\n ? !isCalendarMonthInRange(\n new Date().getMonth(),\n new Date().getFullYear()\n )\n : !isDateInRange(new Date())\n }\n className=\"text-primary-800 flex-1 text-sm hover:underline disabled:cursor-not-allowed disabled:opacity-50\"\n >\n Today\n </button>\n )}\n {(inputType === 'datetime-local' || inputType === 'time') && (\n <button\n type=\"button\"\n onClick={() => setIsCalendarOpen(false)}\n className=\"text-primary-800 flex-1 text-sm hover:underline\"\n >\n Done\n </button>\n )}\n </div>\n </div>\n );\n };\n\n if (inputType === 'year') {\n return (\n <Input\n ref={ref}\n type={inputType === 'year' ? 'text' : inputType}\n inputMode={inputType === 'year' ? 'numeric' : undefined}\n pattern={inputType === 'year' ? '[0-9]{4}' : undefined}\n maxLength={inputType === 'year' ? 4 : undefined}\n placeholder={inputType === 'year' ? 'YYYY' : undefined}\n value={value.replace(/\\D/g, '').slice(0, 4)}\n onChange={(event) =>\n onChange?.(event.target.value.replace(/\\D/g, '').slice(0, 4))\n }\n onBlur={onBlur}\n onClick={onClick}\n hasError={hasError}\n error={error}\n className={cn(widthClasses[width], className)}\n {...props}\n />\n );\n }\n\n if (showCalendar || inputType !== 'date') {\n // Extract label/error/helper and component-specific props to handle positioning correctly\n // Filter out Input component props that aren't valid HTML input attributes\n const { label, helperText, hideLabel, required, size, ...inputProps } =\n props;\n // Ensure size has a valid value (fallback to 'md' if null/undefined)\n const resolvedSize = size ?? 'md';\n const inputId = inputProps.id || generatedId;\n const errorId = `${inputId}-error`;\n const helperId = `${inputId}-helper`;\n const showError = hasError || !!localError;\n const errorMessage = error || localError;\n\n return (\n <div className={cn('flex flex-col gap-1.5', widthClasses[width])}>\n {label && (\n <label\n htmlFor={inputId}\n className={cn(\n 'text-foreground text-sm font-medium',\n hideLabel && 'sr-only'\n )}\n >\n {label}\n {required && (\n <span\n className=\"ml-1\"\n style={{ color: '#ef4444' }}\n aria-hidden=\"true\"\n >\n *\n </span>\n )}\n </label>\n )}\n <div className=\"relative\">\n <input\n ref={ref}\n id={inputId}\n type=\"text\"\n inputMode={inputType === 'date' ? 'numeric' : undefined}\n autoComplete={autoComplete}\n placeholder={\n inputType === 'month'\n ? 'Select month'\n : inputType === 'time'\n ? 'Select time'\n : inputType === 'datetime-local'\n ? 'Select date and time'\n : placeholder\n }\n value={formatPickerValue(displayValue, inputType, timeFormat)}\n onChange={handleChange}\n onBlur={inputType === 'date' ? handleBlur : onBlur}\n onClick={(event) => {\n onClick?.(event);\n setIsCalendarOpen(true);\n }}\n readOnly={!isFormattedDate}\n aria-invalid={showError}\n aria-describedby={\n [errorMessage ? errorId : null, helperText ? helperId : null]\n .filter(Boolean)\n .join(' ') || undefined\n }\n className={cn(\n 'w-full px-3 py-2',\n 'rounded-lg border',\n 'bg-background text-foreground',\n 'placeholder:text-muted-foreground',\n 'transition-colors duration-200',\n 'focus:ring-ring focus:border-transparent focus:ring-2 focus:outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n sizeClasses[resolvedSize],\n showError\n ? 'border-destructive focus:ring-destructive'\n : 'border-input',\n 'pr-10',\n className\n )}\n {...inputProps}\n />\n <button\n ref={buttonRef}\n type=\"button\"\n onClick={() => setIsCalendarOpen(!isCalendarOpen)}\n className={cn(\n 'absolute top-1/2 right-3 -translate-y-1/2',\n 'text-muted-foreground hover:text-foreground',\n 'focus:text-foreground focus:outline-none',\n 'transition-colors'\n )}\n aria-label={\n inputType === 'time' ? 'Open time picker' : 'Open calendar'\n }\n aria-expanded={isCalendarOpen}\n aria-haspopup=\"dialog\"\n >\n {inputType === 'time' ? (\n <Clock size={18} />\n ) : (\n <Calendar size={18} />\n )}\n </button>\n </div>\n {isCalendarOpen && createPortal(renderCalendar(), document.body)}\n {errorMessage && (\n <p\n id={errorId}\n className=\"text-sm\"\n style={{ color: '#ef4444' }}\n role=\"alert\"\n >\n {errorMessage}\n </p>\n )}\n {helperText && !errorMessage && (\n <p id={helperId} className=\"text-muted-foreground text-sm\">\n {helperText}\n </p>\n )}\n </div>\n );\n }\n\n return (\n <Input\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n autoComplete={autoComplete}\n placeholder={placeholder}\n value={displayValue}\n onChange={handleChange}\n onBlur={handleBlur}\n hasError={hasError || !!localError}\n error={error || localError}\n className={cn(widthClasses[width], className)}\n {...props}\n />\n );\n }\n);\n\nDateInput.displayName = 'DateInput';\n\n// Simple icon components\nfunction ChevronLeftIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n );\n}\n\nfunction ChevronRightIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n );\n}\n\nexport { DateInput };\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { useAnchoredPosition } from './chunk-
|
|
2
|
-
import { cn } from './chunk-
|
|
1
|
+
import { useAnchoredPosition } from './chunk-BOOJDRJO.js';
|
|
2
|
+
import { cn } from './chunk-TQONQSJO.js';
|
|
3
3
|
import * as React2 from 'react';
|
|
4
4
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
5
5
|
import { createPortal } from 'react-dom';
|
|
@@ -1141,5 +1141,5 @@ var MessageComposer = React2.forwardRef(
|
|
|
1141
1141
|
MessageComposer.displayName = "MessageComposer";
|
|
1142
1142
|
|
|
1143
1143
|
export { AttachmentPicker, AttachmentPreviewItem, CameraButton, CharacterCounter, DragDropZone, MessageComposer, SendButton, generateAttachmentId, getFileType, sendButtonVariants, validateFile };
|
|
1144
|
-
//# sourceMappingURL=chunk-
|
|
1145
|
-
//# sourceMappingURL=chunk-
|
|
1144
|
+
//# sourceMappingURL=chunk-EKRT7K2K.js.map
|
|
1145
|
+
//# sourceMappingURL=chunk-EKRT7K2K.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Messaging/AttachmentPicker.tsx","../src/components/Messaging/MessageComposer.tsx"],"names":["React","jsxs","jsx"],"mappings":"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","file":"chunk-UM6NA7HL.js","sourcesContent":["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// 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 className?: string;\n}\n\n/**\n * Preview item for a pending attachment.\n */\nfunction AttachmentPreviewItem({\n attachment,\n onRemove,\n onRetry,\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 <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 {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-500\">\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 className=\"mt-1 text-xs text-white underline hover:no-underline\"\n >\n Retry\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Remove button */}\n <button\n type=\"button\"\n onClick={onRemove}\n className={cn(\n 'absolute -top-1 -right-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 )}\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 right-0 bottom-0 left-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 = ['image/*', 'video/*', '.pdf', '.doc', '.docx'],\n maxFileSize = 25 * 1024 * 1024, // 25MB\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 /** 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 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 Drop files here\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 getFileType,\n formatFileSize,\n validateFile,\n generateAttachmentId,\n};\n","import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\nimport type { AttachmentType, NewMessage } from './types';\nimport {\n AttachmentPicker,\n AttachmentPreviewItem,\n CameraButton,\n DragDropZone,\n getFileType,\n generateAttachmentId,\n} from './AttachmentPicker';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface PendingAttachment {\n id: string;\n file: File;\n previewUrl?: string;\n type: AttachmentType;\n state: 'pending' | 'uploading' | 'uploaded' | 'failed';\n progress?: number;\n error?: string;\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 id (returned to the host so it can map a selection back). */\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 */\nfunction 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\n/**\n * Whether a file satisfies one of the accepted `<input accept>` tokens.\n * Supports `type/*` wildcards, exact `type/subtype` tokens, and `.ext`\n * extension tokens (matched against the file name, mirroring the native\n * `<input accept>` behavior used by the picker and drag-and-drop).\n */\nfunction isFileAccepted(file: File, accepted: string[]): boolean {\n if (!accepted || accepted.length === 0) return true;\n const mime = file.type;\n const name = file.name.toLowerCase();\n return accepted.some((token) => {\n if (token.startsWith('.')) return name.endsWith(token.toLowerCase());\n if (token.endsWith('/*')) return mime.startsWith(token.slice(0, -1));\n if (token.includes('/')) return mime === token;\n return false;\n });\n}\n\n// ============================================================================\n// Character Counter Component\n// ============================================================================\n\nexport interface CharacterCounterProps {\n current: number;\n max: number;\n showWarningAt?: number;\n className?: string;\n}\n\n/**\n * Displays character count with warning colors.\n */\nfunction CharacterCounter({\n current,\n max,\n showWarningAt = 0.9,\n className,\n}: CharacterCounterProps) {\n const percentage = current / max;\n const isWarning = percentage >= showWarningAt && percentage < 1;\n const isOver = current > max;\n\n return (\n <span\n className={cn(\n 'text-xs tabular-nums',\n isOver\n ? 'font-medium text-red-700 dark:text-red-400'\n : isWarning\n ? 'text-amber-700 dark:text-amber-400'\n : 'text-neutral-600 dark:text-neutral-400',\n className\n )}\n aria-live=\"polite\"\n aria-label={`${current} of ${max} characters`}\n >\n {current}/{max}\n </span>\n );\n}\n\nCharacterCounter.displayName = 'CharacterCounter';\n\n// ============================================================================\n// Send Button Component\n// ============================================================================\n\nconst sendButtonVariants = cva(\n [\n 'inline-flex items-center justify-center',\n 'rounded-full p-3 self-start',\n 'transition-all duration-200',\n 'focus:outline-none focus:ring-2 focus:ring-primary-500',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n ],\n {\n variants: {\n variant: {\n primary: [\n 'bg-primary-800 text-white',\n 'hover:bg-primary-900',\n 'active:scale-95',\n ],\n subtle: [\n 'bg-transparent text-primary-800',\n 'hover:bg-primary-50 dark:hover:bg-primary-900/20',\n ],\n },\n canSend: {\n true: '',\n false: 'opacity-50 cursor-not-allowed',\n },\n },\n defaultVariants: {\n variant: 'primary',\n canSend: false,\n },\n }\n);\n\nexport interface SendButtonProps\n extends\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof sendButtonVariants> {\n isLoading?: boolean;\n}\n\n/**\n * Send button with loading state.\n */\nconst SendButton = React.forwardRef<HTMLButtonElement, SendButtonProps>(\n ({ className, variant, canSend, isLoading, disabled, ...props }, ref) => {\n return (\n <button\n ref={ref}\n type=\"submit\"\n disabled={disabled || !canSend || isLoading}\n data-slot=\"composer-send-button\"\n className={cn(sendButtonVariants({ variant, canSend }), className)}\n aria-label={isLoading ? 'Sending message' : 'Send message'}\n {...props}\n >\n {isLoading ? (\n <svg\n aria-hidden=\"true\"\n className=\"h-5 w-5 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 ) : (\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=\"M12 19l9 2-9-18-9 18 9-2zm0 0v-8\"\n />\n </svg>\n )}\n </button>\n );\n }\n);\n\nSendButton.displayName = 'SendButton';\n\n// ============================================================================\n// Message Composer Component\n// ============================================================================\n\nexport interface MessageComposerProps {\n /** Called when a message is sent */\n onSend: (message: NewMessage) => void | Promise<void>;\n /** Called when the user starts typing */\n onTypingStart?: () => void;\n /** Called when the user stops typing */\n onTypingStop?: () => void;\n /** Controlled value for the textarea */\n value?: string;\n /** Callback when value changes (for controlled mode) */\n onValueChange?: (value: string) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Maximum message length */\n maxLength?: number;\n /** Show character count */\n showCharacterCount?: boolean;\n /** Whether the composer is disabled */\n disabled?: boolean;\n /** Whether a message is currently being sent */\n isSending?: boolean;\n /** Show attachment picker */\n showAttachmentPicker?: boolean;\n /** Show camera button (mobile) */\n showCameraButton?: boolean;\n /** Accepted file types */\n acceptedFileTypes?: string[];\n /** Maximum file size */\n maxFileSize?: number;\n /** Maximum number of attachments */\n maxAttachments?: number;\n /** Called when an error occurs */\n onError?: (error: string) => void;\n /** Auto-focus the input */\n autoFocus?: boolean;\n /** Reply-to message reference */\n replyTo?: {\n id: string;\n content: string;\n senderName: string;\n } | null;\n /** Called when reply is cancelled */\n onCancelReply?: () => void;\n /** Visual variant - 'default' shows border-t, 'minimal' has no border */\n variant?: 'default' | 'minimal';\n /** Content to render inside the input wrapper (e.g. a mic button) */\n inputTrailing?: React.ReactNode;\n /**\n * Candidates for `@mention` autocomplete. When provided (non-empty), typing\n * `@` opens a picker. Omit to disable mentions entirely (default).\n */\n mentionOptions?: MentionOption[];\n /** Additional class name */\n className?: string;\n}\n\n/**\n * A message input component with attachment support and send button.\n *\n * @example\n * ```tsx\n * <MessageComposer\n * onSend={handleSend}\n * placeholder=\"Type a message...\"\n * showAttachmentPicker\n * maxLength={1600}\n * />\n * ```\n */\nconst MessageComposer = React.forwardRef<\n HTMLTextAreaElement,\n MessageComposerProps\n>(\n (\n {\n onSend,\n onTypingStart,\n onTypingStop,\n value: controlledValue,\n onValueChange,\n placeholder = 'Type a message...',\n maxLength = 1600,\n showCharacterCount = false,\n disabled = false,\n isSending = false,\n showAttachmentPicker = true,\n showCameraButton = false,\n acceptedFileTypes = ['image/*', 'video/*', '.pdf', '.doc', '.docx'],\n maxFileSize = 25 * 1024 * 1024,\n maxAttachments = 10,\n onError,\n autoFocus = false,\n replyTo = null,\n onCancelReply,\n variant = 'default',\n inputTrailing,\n mentionOptions,\n className,\n },\n ref\n ) => {\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const [internalContent, setInternalContent] = React.useState('');\n const isControlled = controlledValue !== undefined;\n const content = isControlled ? controlledValue : internalContent;\n const setContent = React.useCallback(\n (val: string | ((prev: string) => string)) => {\n if (isControlled) {\n const newVal = typeof val === 'function' ? val(controlledValue) : val;\n onValueChange?.(newVal);\n } else {\n setInternalContent(val);\n }\n },\n [isControlled, controlledValue, onValueChange]\n );\n const [attachments, setAttachments] = React.useState<PendingAttachment[]>(\n []\n );\n const [isTyping, setIsTyping] = React.useState(false);\n const typingTimeoutRef = React.useRef<NodeJS.Timeout | null>(null);\n\n // Combine refs\n React.useImperativeHandle(ref, () => textareaRef.current!);\n\n // Auto-resize textarea\n React.useEffect(() => {\n const textarea = textareaRef.current;\n if (textarea) {\n textarea.style.height = 'auto';\n textarea.style.height = `${Math.min(textarea.scrollHeight, 150)}px`;\n }\n }, [content]);\n\n // Handle typing indicators\n React.useEffect(() => {\n if (content.length > 0 && !isTyping) {\n setIsTyping(true);\n onTypingStart?.();\n }\n\n // Clear previous timeout\n if (typingTimeoutRef.current) {\n clearTimeout(typingTimeoutRef.current);\n }\n\n // Set timeout to stop typing indicator\n typingTimeoutRef.current = setTimeout(() => {\n if (isTyping) {\n setIsTyping(false);\n onTypingStop?.();\n }\n }, 2000);\n\n return () => {\n if (typingTimeoutRef.current) {\n clearTimeout(typingTimeoutRef.current);\n }\n };\n }, [content, isTyping, onTypingStart, onTypingStop]);\n\n // Focus on mount if autoFocus\n React.useEffect(() => {\n if (autoFocus) {\n textareaRef.current?.focus();\n }\n }, [autoFocus]);\n\n // Focus when reply is set\n React.useEffect(() => {\n if (replyTo) {\n textareaRef.current?.focus();\n }\n }, [replyTo]);\n\n // --- @mention autocomplete (opt-in via `mentionOptions`) ---\n const mentionsEnabled = !!mentionOptions && mentionOptions.length > 0;\n const [mention, setMention] = React.useState<{\n query: string;\n start: number;\n } | null>(null);\n const [mentionHighlight, setMentionHighlight] = React.useState(0);\n const mentionListId = React.useId();\n const mentionOptionId = (i: number) => `${mentionListId}-option-${i}`;\n\n const mentionSuggestions = React.useMemo(() => {\n if (!mention || !mentionOptions) return [];\n const q = mention.query.toLowerCase();\n return mentionOptions.filter((o) => o.label.toLowerCase().includes(q));\n }, [mention, mentionOptions]);\n\n const mentionMenuOpen =\n mentionsEnabled && mention !== null && mentionSuggestions.length > 0;\n\n // Portal + fixed positioning so the mention menu escapes overflow-hidden\n // ancestors.\n const {\n anchorRef: mentionAnchorRef,\n floatingRef: mentionFloatingRef,\n style: mentionStyle,\n } = useAnchoredPosition<HTMLDivElement, HTMLUListElement>({\n open: mentionMenuOpen,\n placement: 'top-start',\n maxHeight: 224,\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 clampedMentionHighlight = mentionMenuOpen\n ? Math.min(mentionHighlight, mentionSuggestions.length - 1)\n : -1;\n const activeMentionOptionId = mentionMenuOpen\n ? mentionOptionId(clampedMentionHighlight)\n : undefined;\n\n const syncMention = React.useCallback(\n (value: string, caret: number) => {\n if (!mentionsEnabled) return;\n setMention(activeMentionQuery(value, caret));\n setMentionHighlight(0);\n },\n [mentionsEnabled]\n );\n\n const insertMention = (option: MentionOption) => {\n if (!mention) return;\n const insertValue = option.value ?? option.label.split(' ')[0];\n const before = content.slice(0, mention.start);\n const after = content.slice(mention.start + 1 + mention.query.length);\n const insert = `@${insertValue} `;\n setContent(before + insert + after);\n setMention(null);\n // Restore caret just after the inserted mention.\n const caret = before.length + insert.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 canSend =\n (content.trim().length > 0 || attachments.length > 0) &&\n content.length <= maxLength &&\n !disabled &&\n !isSending;\n\n const handleSubmit = async (event: React.FormEvent) => {\n event.preventDefault();\n if (!canSend) return;\n\n const message: NewMessage = {\n content: content.trim(),\n attachments: attachments.map((a) => a.file),\n replyToId: replyTo?.id,\n };\n\n // Clear state before sending for optimistic UI\n setContent('');\n setAttachments([]);\n setIsTyping(false);\n onTypingStop?.();\n\n try {\n await onSend(message);\n } catch {\n // Restore content on failure\n setContent(message.content);\n // Note: attachments would need to be re-added manually\n onError?.('Failed to send message');\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // @mention menu navigation takes priority over send.\n if (mentionMenuOpen) {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setMentionHighlight((h) => (h + 1) % mentionSuggestions.length);\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setMentionHighlight(\n (h) =>\n (h - 1 + mentionSuggestions.length) % mentionSuggestions.length\n );\n return;\n }\n if (event.key === 'Enter' || event.key === 'Tab') {\n event.preventDefault();\n // `mentionHighlight` can fall out of range if the list shrank while\n // the menu was open; fall back to the first suggestion.\n const chosen =\n mentionSuggestions[mentionHighlight] ?? mentionSuggestions[0];\n if (chosen) insertMention(chosen);\n return;\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n setMention(null);\n return;\n }\n }\n // Send on Enter (without Shift)\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n if (canSend) {\n handleSubmit(event);\n }\n }\n };\n\n const handleFilesSelected = (files: File[]) => {\n const remainingSlots = maxAttachments - attachments.length;\n const filesToAdd = files.slice(0, remainingSlots);\n\n if (files.length > remainingSlots) {\n onError?.(`Maximum ${maxAttachments} attachments allowed`);\n }\n\n const newAttachments: PendingAttachment[] = filesToAdd.map((file) => {\n const type = getFileType(file.type);\n let previewUrl: string | undefined;\n\n if (type === 'image' || type === 'video') {\n previewUrl = URL.createObjectURL(file);\n }\n\n return {\n id: generateAttachmentId(),\n file,\n previewUrl,\n type,\n state: 'pending' as const,\n };\n });\n\n setAttachments((prev) => [...prev, ...newAttachments]);\n };\n\n // Paste-to-attach: route pasted files through the same path as the picker.\n const handlePaste = (event: React.ClipboardEvent<HTMLTextAreaElement>) => {\n if (!showAttachmentPicker || disabled) return;\n const pasted = Array.from(event.clipboardData.items)\n .filter((item) => item.kind === 'file')\n .map((item) => item.getAsFile())\n .filter((f): f is File => f !== null)\n .filter((f) => isFileAccepted(f, acceptedFileTypes));\n if (pasted.length === 0) return;\n // We're attaching the file ourselves; don't also paste a blob/path.\n event.preventDefault();\n handleFilesSelected(pasted);\n };\n\n const handleRemoveAttachment = (attachmentId: string) => {\n setAttachments((prev) => {\n const attachment = prev.find((a) => a.id === attachmentId);\n if (attachment?.previewUrl) {\n URL.revokeObjectURL(attachment.previewUrl);\n }\n return prev.filter((a) => a.id !== attachmentId);\n });\n };\n\n // Cleanup preview URLs on unmount\n React.useEffect(() => {\n // Capture current attachments for cleanup\n const currentAttachments = attachments;\n return () => {\n currentAttachments.forEach((a) => {\n if (a.previewUrl) {\n URL.revokeObjectURL(a.previewUrl);\n }\n });\n };\n }, [attachments]);\n\n return (\n <DragDropZone\n onFilesDropped={handleFilesSelected}\n acceptedTypes={acceptedFileTypes}\n maxFileSize={maxFileSize}\n maxFiles={maxAttachments - attachments.length}\n disabled={disabled || attachments.length >= maxAttachments}\n onError={onError}\n className={cn('w-full', className)}\n >\n <form\n onSubmit={handleSubmit}\n data-slot=\"message-composer\"\n className=\"w-full\"\n >\n {/* Reply preview */}\n {replyTo && (\n <div\n data-slot=\"composer-reply-preview\"\n className={cn(\n 'flex items-center gap-2 px-4 py-2',\n 'bg-neutral-50 dark:bg-neutral-800/50',\n 'border-primary-500 border-l-4'\n )}\n >\n <div className=\"min-w-0 flex-1\">\n <span className=\"text-primary-800 dark:text-primary-400 text-xs font-medium\">\n Replying to {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 onClick={onCancelReply}\n className={cn(\n 'shrink-0 rounded p-1',\n 'text-neutral-500 hover:text-neutral-700',\n 'dark:text-neutral-400 dark:hover:text-neutral-200',\n 'focus:ring-primary-500 focus:ring-2 focus:outline-none'\n )}\n aria-label=\"Cancel reply\"\n >\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\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 </div>\n )}\n\n {/* Attachment previews */}\n {attachments.length > 0 && (\n <div\n data-slot=\"composer-attachments\"\n className={cn(\n 'flex flex-wrap gap-2 p-3',\n 'border-t border-neutral-200 dark:border-neutral-700'\n )}\n >\n {attachments.map((attachment) => (\n <AttachmentPreviewItem\n key={attachment.id}\n attachment={attachment}\n onRemove={() => handleRemoveAttachment(attachment.id)}\n />\n ))}\n </div>\n )}\n\n {/* Input area */}\n <div\n data-slot=\"composer-input-area\"\n className={cn(\n 'flex items-center gap-2 p-3',\n 'bg-white dark:bg-neutral-900',\n variant === 'default' &&\n 'border-t border-neutral-200 dark:border-neutral-700'\n )}\n >\n {/* Attachment buttons */}\n {showAttachmentPicker && (\n <AttachmentPicker\n onFilesSelected={handleFilesSelected}\n acceptedTypes={acceptedFileTypes}\n maxFileSize={maxFileSize}\n maxFiles={maxAttachments - attachments.length}\n disabled={disabled || attachments.length >= maxAttachments}\n onError={onError}\n />\n )}\n\n {showCameraButton && (\n <CameraButton\n onCapture={(file) => handleFilesSelected([file])}\n disabled={disabled || attachments.length >= maxAttachments}\n />\n )}\n\n {/* Text input */}\n <div\n data-slot=\"composer-input-wrapper\"\n className=\"relative flex-1\"\n ref={mentionAnchorRef}\n >\n {mentionMenuOpen &&\n createPortal(\n <ul\n ref={mentionFloatingRef}\n style={mentionStyle}\n id={mentionListId}\n role=\"listbox\"\n aria-label=\"Mention\"\n data-slot=\"composer-mention-list\"\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 {mentionSuggestions.map((option, i) => (\n <li key={option.id}>\n <button\n type=\"button\"\n id={mentionOptionId(i)}\n role=\"option\"\n aria-selected={i === clampedMentionHighlight}\n // onMouseDown (not onClick) so the textarea keeps focus.\n onMouseDown={(e) => {\n e.preventDefault();\n insertMention(option);\n }}\n onMouseEnter={() => setMentionHighlight(i)}\n className={cn(\n 'flex w-full items-center gap-2 px-3 py-1.5 text-left text-sm',\n i === clampedMentionHighlight\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=\"ml-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 <textarea\n ref={textareaRef}\n data-slot=\"composer-input\"\n value={content}\n onChange={(e) => {\n setContent(e.target.value);\n syncMention(\n e.target.value,\n e.target.selectionStart ?? e.target.value.length\n );\n }}\n onClick={(e) => {\n const el = e.currentTarget;\n syncMention(el.value, el.selectionStart ?? el.value.length);\n }}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n placeholder={placeholder}\n disabled={disabled || isSending}\n rows={1}\n className={cn(\n 'w-full resize-none rounded-2xl py-2.5',\n inputTrailing ? 'pr-10 pl-4' : 'px-4',\n 'bg-neutral-100 dark:bg-neutral-800',\n 'text-neutral-900 dark:text-neutral-100',\n 'placeholder:text-neutral-400 dark:placeholder:text-neutral-500',\n 'focus:ring-primary-500 focus:ring-2 focus:outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'transition-colors',\n 'max-h-[150px]'\n )}\n aria-label=\"Message\"\n aria-describedby={showCharacterCount ? 'char-count' : undefined}\n {...(mentionsEnabled\n ? {\n 'aria-controls': mentionMenuOpen\n ? mentionListId\n : undefined,\n 'aria-activedescendant': activeMentionOptionId,\n 'aria-autocomplete': 'list' as const,\n }\n : {})}\n />\n\n {/* Trailing content (e.g. record button) */}\n {inputTrailing && (\n <div\n data-slot=\"composer-input-trailing\"\n className=\"pointer-events-none absolute top-0 right-1 flex h-[44px] items-center [&>*]:pointer-events-auto\"\n >\n {inputTrailing}\n </div>\n )}\n\n {/* Character count */}\n {showCharacterCount && (\n <div\n data-slot=\"composer-char-count\"\n id=\"char-count\"\n className=\"absolute right-3 bottom-1.5\"\n >\n <CharacterCounter current={content.length} max={maxLength} />\n </div>\n )}\n </div>\n\n {/* Send button */}\n <SendButton\n canSend={canSend}\n isLoading={isSending}\n disabled={disabled}\n />\n </div>\n </form>\n </DragDropZone>\n );\n }\n);\n\nMessageComposer.displayName = 'MessageComposer';\n\nexport { MessageComposer, CharacterCounter, SendButton, sendButtonVariants };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Messaging/AttachmentPicker.tsx","../src/components/Messaging/MessageComposer.tsx"],"names":["React","jsxs","jsx"],"mappings":"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","file":"chunk-EKRT7K2K.js","sourcesContent":["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// 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 className?: string;\n}\n\n/**\n * Preview item for a pending attachment.\n */\nfunction AttachmentPreviewItem({\n attachment,\n onRemove,\n onRetry,\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 <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 {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-500\">\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 className=\"mt-1 text-xs text-white underline hover:no-underline\"\n >\n Retry\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Remove button */}\n <button\n type=\"button\"\n onClick={onRemove}\n className={cn(\n 'absolute -top-1 -right-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 )}\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 right-0 bottom-0 left-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 = ['image/*', 'video/*', '.pdf', '.doc', '.docx'],\n maxFileSize = 25 * 1024 * 1024, // 25MB\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 /** 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 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 Drop files here\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 getFileType,\n formatFileSize,\n validateFile,\n generateAttachmentId,\n};\n","import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\nimport type { AttachmentType, NewMessage } from './types';\nimport {\n AttachmentPicker,\n AttachmentPreviewItem,\n CameraButton,\n DragDropZone,\n getFileType,\n generateAttachmentId,\n} from './AttachmentPicker';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface PendingAttachment {\n id: string;\n file: File;\n previewUrl?: string;\n type: AttachmentType;\n state: 'pending' | 'uploading' | 'uploaded' | 'failed';\n progress?: number;\n error?: string;\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 id (returned to the host so it can map a selection back). */\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 */\nfunction 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\n/**\n * Whether a file satisfies one of the accepted `<input accept>` tokens.\n * Supports `type/*` wildcards, exact `type/subtype` tokens, and `.ext`\n * extension tokens (matched against the file name, mirroring the native\n * `<input accept>` behavior used by the picker and drag-and-drop).\n */\nfunction isFileAccepted(file: File, accepted: string[]): boolean {\n if (!accepted || accepted.length === 0) return true;\n const mime = file.type;\n const name = file.name.toLowerCase();\n return accepted.some((token) => {\n if (token.startsWith('.')) return name.endsWith(token.toLowerCase());\n if (token.endsWith('/*')) return mime.startsWith(token.slice(0, -1));\n if (token.includes('/')) return mime === token;\n return false;\n });\n}\n\n// ============================================================================\n// Character Counter Component\n// ============================================================================\n\nexport interface CharacterCounterProps {\n current: number;\n max: number;\n showWarningAt?: number;\n className?: string;\n}\n\n/**\n * Displays character count with warning colors.\n */\nfunction CharacterCounter({\n current,\n max,\n showWarningAt = 0.9,\n className,\n}: CharacterCounterProps) {\n const percentage = current / max;\n const isWarning = percentage >= showWarningAt && percentage < 1;\n const isOver = current > max;\n\n return (\n <span\n className={cn(\n 'text-xs tabular-nums',\n isOver\n ? 'font-medium text-red-700 dark:text-red-400'\n : isWarning\n ? 'text-amber-700 dark:text-amber-400'\n : 'text-neutral-600 dark:text-neutral-400',\n className\n )}\n aria-live=\"polite\"\n aria-label={`${current} of ${max} characters`}\n >\n {current}/{max}\n </span>\n );\n}\n\nCharacterCounter.displayName = 'CharacterCounter';\n\n// ============================================================================\n// Send Button Component\n// ============================================================================\n\nconst sendButtonVariants = cva(\n [\n 'inline-flex items-center justify-center',\n 'rounded-full p-3 self-start',\n 'transition-all duration-200',\n 'focus:outline-none focus:ring-2 focus:ring-primary-500',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n ],\n {\n variants: {\n variant: {\n primary: [\n 'bg-primary-800 text-white',\n 'hover:bg-primary-900',\n 'active:scale-95',\n ],\n subtle: [\n 'bg-transparent text-primary-800',\n 'hover:bg-primary-50 dark:hover:bg-primary-900/20',\n ],\n },\n canSend: {\n true: '',\n false: 'opacity-50 cursor-not-allowed',\n },\n },\n defaultVariants: {\n variant: 'primary',\n canSend: false,\n },\n }\n);\n\nexport interface SendButtonProps\n extends\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof sendButtonVariants> {\n isLoading?: boolean;\n}\n\n/**\n * Send button with loading state.\n */\nconst SendButton = React.forwardRef<HTMLButtonElement, SendButtonProps>(\n ({ className, variant, canSend, isLoading, disabled, ...props }, ref) => {\n return (\n <button\n ref={ref}\n type=\"submit\"\n disabled={disabled || !canSend || isLoading}\n data-slot=\"composer-send-button\"\n className={cn(sendButtonVariants({ variant, canSend }), className)}\n aria-label={isLoading ? 'Sending message' : 'Send message'}\n {...props}\n >\n {isLoading ? (\n <svg\n aria-hidden=\"true\"\n className=\"h-5 w-5 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 ) : (\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=\"M12 19l9 2-9-18-9 18 9-2zm0 0v-8\"\n />\n </svg>\n )}\n </button>\n );\n }\n);\n\nSendButton.displayName = 'SendButton';\n\n// ============================================================================\n// Message Composer Component\n// ============================================================================\n\nexport interface MessageComposerProps {\n /** Called when a message is sent */\n onSend: (message: NewMessage) => void | Promise<void>;\n /** Called when the user starts typing */\n onTypingStart?: () => void;\n /** Called when the user stops typing */\n onTypingStop?: () => void;\n /** Controlled value for the textarea */\n value?: string;\n /** Callback when value changes (for controlled mode) */\n onValueChange?: (value: string) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Maximum message length */\n maxLength?: number;\n /** Show character count */\n showCharacterCount?: boolean;\n /** Whether the composer is disabled */\n disabled?: boolean;\n /** Whether a message is currently being sent */\n isSending?: boolean;\n /** Show attachment picker */\n showAttachmentPicker?: boolean;\n /** Show camera button (mobile) */\n showCameraButton?: boolean;\n /** Accepted file types */\n acceptedFileTypes?: string[];\n /** Maximum file size */\n maxFileSize?: number;\n /** Maximum number of attachments */\n maxAttachments?: number;\n /** Called when an error occurs */\n onError?: (error: string) => void;\n /** Auto-focus the input */\n autoFocus?: boolean;\n /** Reply-to message reference */\n replyTo?: {\n id: string;\n content: string;\n senderName: string;\n } | null;\n /** Called when reply is cancelled */\n onCancelReply?: () => void;\n /** Visual variant - 'default' shows border-t, 'minimal' has no border */\n variant?: 'default' | 'minimal';\n /** Content to render inside the input wrapper (e.g. a mic button) */\n inputTrailing?: React.ReactNode;\n /**\n * Candidates for `@mention` autocomplete. When provided (non-empty), typing\n * `@` opens a picker. Omit to disable mentions entirely (default).\n */\n mentionOptions?: MentionOption[];\n /** Additional class name */\n className?: string;\n}\n\n/**\n * A message input component with attachment support and send button.\n *\n * @example\n * ```tsx\n * <MessageComposer\n * onSend={handleSend}\n * placeholder=\"Type a message...\"\n * showAttachmentPicker\n * maxLength={1600}\n * />\n * ```\n */\nconst MessageComposer = React.forwardRef<\n HTMLTextAreaElement,\n MessageComposerProps\n>(\n (\n {\n onSend,\n onTypingStart,\n onTypingStop,\n value: controlledValue,\n onValueChange,\n placeholder = 'Type a message...',\n maxLength = 1600,\n showCharacterCount = false,\n disabled = false,\n isSending = false,\n showAttachmentPicker = true,\n showCameraButton = false,\n acceptedFileTypes = ['image/*', 'video/*', '.pdf', '.doc', '.docx'],\n maxFileSize = 25 * 1024 * 1024,\n maxAttachments = 10,\n onError,\n autoFocus = false,\n replyTo = null,\n onCancelReply,\n variant = 'default',\n inputTrailing,\n mentionOptions,\n className,\n },\n ref\n ) => {\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const [internalContent, setInternalContent] = React.useState('');\n const isControlled = controlledValue !== undefined;\n const content = isControlled ? controlledValue : internalContent;\n const setContent = React.useCallback(\n (val: string | ((prev: string) => string)) => {\n if (isControlled) {\n const newVal = typeof val === 'function' ? val(controlledValue) : val;\n onValueChange?.(newVal);\n } else {\n setInternalContent(val);\n }\n },\n [isControlled, controlledValue, onValueChange]\n );\n const [attachments, setAttachments] = React.useState<PendingAttachment[]>(\n []\n );\n const [isTyping, setIsTyping] = React.useState(false);\n const typingTimeoutRef = React.useRef<NodeJS.Timeout | null>(null);\n\n // Combine refs\n React.useImperativeHandle(ref, () => textareaRef.current!);\n\n // Auto-resize textarea\n React.useEffect(() => {\n const textarea = textareaRef.current;\n if (textarea) {\n textarea.style.height = 'auto';\n textarea.style.height = `${Math.min(textarea.scrollHeight, 150)}px`;\n }\n }, [content]);\n\n // Handle typing indicators\n React.useEffect(() => {\n if (content.length > 0 && !isTyping) {\n setIsTyping(true);\n onTypingStart?.();\n }\n\n // Clear previous timeout\n if (typingTimeoutRef.current) {\n clearTimeout(typingTimeoutRef.current);\n }\n\n // Set timeout to stop typing indicator\n typingTimeoutRef.current = setTimeout(() => {\n if (isTyping) {\n setIsTyping(false);\n onTypingStop?.();\n }\n }, 2000);\n\n return () => {\n if (typingTimeoutRef.current) {\n clearTimeout(typingTimeoutRef.current);\n }\n };\n }, [content, isTyping, onTypingStart, onTypingStop]);\n\n // Focus on mount if autoFocus\n React.useEffect(() => {\n if (autoFocus) {\n textareaRef.current?.focus();\n }\n }, [autoFocus]);\n\n // Focus when reply is set\n React.useEffect(() => {\n if (replyTo) {\n textareaRef.current?.focus();\n }\n }, [replyTo]);\n\n // --- @mention autocomplete (opt-in via `mentionOptions`) ---\n const mentionsEnabled = !!mentionOptions && mentionOptions.length > 0;\n const [mention, setMention] = React.useState<{\n query: string;\n start: number;\n } | null>(null);\n const [mentionHighlight, setMentionHighlight] = React.useState(0);\n const mentionListId = React.useId();\n const mentionOptionId = (i: number) => `${mentionListId}-option-${i}`;\n\n const mentionSuggestions = React.useMemo(() => {\n if (!mention || !mentionOptions) return [];\n const q = mention.query.toLowerCase();\n return mentionOptions.filter((o) => o.label.toLowerCase().includes(q));\n }, [mention, mentionOptions]);\n\n const mentionMenuOpen =\n mentionsEnabled && mention !== null && mentionSuggestions.length > 0;\n\n // Portal + fixed positioning so the mention menu escapes overflow-hidden\n // ancestors.\n const {\n anchorRef: mentionAnchorRef,\n floatingRef: mentionFloatingRef,\n style: mentionStyle,\n } = useAnchoredPosition<HTMLDivElement, HTMLUListElement>({\n open: mentionMenuOpen,\n placement: 'top-start',\n maxHeight: 224,\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 clampedMentionHighlight = mentionMenuOpen\n ? Math.min(mentionHighlight, mentionSuggestions.length - 1)\n : -1;\n const activeMentionOptionId = mentionMenuOpen\n ? mentionOptionId(clampedMentionHighlight)\n : undefined;\n\n const syncMention = React.useCallback(\n (value: string, caret: number) => {\n if (!mentionsEnabled) return;\n setMention(activeMentionQuery(value, caret));\n setMentionHighlight(0);\n },\n [mentionsEnabled]\n );\n\n const insertMention = (option: MentionOption) => {\n if (!mention) return;\n const insertValue = option.value ?? option.label.split(' ')[0];\n const before = content.slice(0, mention.start);\n const after = content.slice(mention.start + 1 + mention.query.length);\n const insert = `@${insertValue} `;\n setContent(before + insert + after);\n setMention(null);\n // Restore caret just after the inserted mention.\n const caret = before.length + insert.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 canSend =\n (content.trim().length > 0 || attachments.length > 0) &&\n content.length <= maxLength &&\n !disabled &&\n !isSending;\n\n const handleSubmit = async (event: React.FormEvent) => {\n event.preventDefault();\n if (!canSend) return;\n\n const message: NewMessage = {\n content: content.trim(),\n attachments: attachments.map((a) => a.file),\n replyToId: replyTo?.id,\n };\n\n // Clear state before sending for optimistic UI\n setContent('');\n setAttachments([]);\n setIsTyping(false);\n onTypingStop?.();\n\n try {\n await onSend(message);\n } catch {\n // Restore content on failure\n setContent(message.content);\n // Note: attachments would need to be re-added manually\n onError?.('Failed to send message');\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // @mention menu navigation takes priority over send.\n if (mentionMenuOpen) {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setMentionHighlight((h) => (h + 1) % mentionSuggestions.length);\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setMentionHighlight(\n (h) =>\n (h - 1 + mentionSuggestions.length) % mentionSuggestions.length\n );\n return;\n }\n if (event.key === 'Enter' || event.key === 'Tab') {\n event.preventDefault();\n // `mentionHighlight` can fall out of range if the list shrank while\n // the menu was open; fall back to the first suggestion.\n const chosen =\n mentionSuggestions[mentionHighlight] ?? mentionSuggestions[0];\n if (chosen) insertMention(chosen);\n return;\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n setMention(null);\n return;\n }\n }\n // Send on Enter (without Shift)\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n if (canSend) {\n handleSubmit(event);\n }\n }\n };\n\n const handleFilesSelected = (files: File[]) => {\n const remainingSlots = maxAttachments - attachments.length;\n const filesToAdd = files.slice(0, remainingSlots);\n\n if (files.length > remainingSlots) {\n onError?.(`Maximum ${maxAttachments} attachments allowed`);\n }\n\n const newAttachments: PendingAttachment[] = filesToAdd.map((file) => {\n const type = getFileType(file.type);\n let previewUrl: string | undefined;\n\n if (type === 'image' || type === 'video') {\n previewUrl = URL.createObjectURL(file);\n }\n\n return {\n id: generateAttachmentId(),\n file,\n previewUrl,\n type,\n state: 'pending' as const,\n };\n });\n\n setAttachments((prev) => [...prev, ...newAttachments]);\n };\n\n // Paste-to-attach: route pasted files through the same path as the picker.\n const handlePaste = (event: React.ClipboardEvent<HTMLTextAreaElement>) => {\n if (!showAttachmentPicker || disabled) return;\n const pasted = Array.from(event.clipboardData.items)\n .filter((item) => item.kind === 'file')\n .map((item) => item.getAsFile())\n .filter((f): f is File => f !== null)\n .filter((f) => isFileAccepted(f, acceptedFileTypes));\n if (pasted.length === 0) return;\n // We're attaching the file ourselves; don't also paste a blob/path.\n event.preventDefault();\n handleFilesSelected(pasted);\n };\n\n const handleRemoveAttachment = (attachmentId: string) => {\n setAttachments((prev) => {\n const attachment = prev.find((a) => a.id === attachmentId);\n if (attachment?.previewUrl) {\n URL.revokeObjectURL(attachment.previewUrl);\n }\n return prev.filter((a) => a.id !== attachmentId);\n });\n };\n\n // Cleanup preview URLs on unmount\n React.useEffect(() => {\n // Capture current attachments for cleanup\n const currentAttachments = attachments;\n return () => {\n currentAttachments.forEach((a) => {\n if (a.previewUrl) {\n URL.revokeObjectURL(a.previewUrl);\n }\n });\n };\n }, [attachments]);\n\n return (\n <DragDropZone\n onFilesDropped={handleFilesSelected}\n acceptedTypes={acceptedFileTypes}\n maxFileSize={maxFileSize}\n maxFiles={maxAttachments - attachments.length}\n disabled={disabled || attachments.length >= maxAttachments}\n onError={onError}\n className={cn('w-full', className)}\n >\n <form\n onSubmit={handleSubmit}\n data-slot=\"message-composer\"\n className=\"w-full\"\n >\n {/* Reply preview */}\n {replyTo && (\n <div\n data-slot=\"composer-reply-preview\"\n className={cn(\n 'flex items-center gap-2 px-4 py-2',\n 'bg-neutral-50 dark:bg-neutral-800/50',\n 'border-primary-500 border-l-4'\n )}\n >\n <div className=\"min-w-0 flex-1\">\n <span className=\"text-primary-800 dark:text-primary-400 text-xs font-medium\">\n Replying to {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 onClick={onCancelReply}\n className={cn(\n 'shrink-0 rounded p-1',\n 'text-neutral-500 hover:text-neutral-700',\n 'dark:text-neutral-400 dark:hover:text-neutral-200',\n 'focus:ring-primary-500 focus:ring-2 focus:outline-none'\n )}\n aria-label=\"Cancel reply\"\n >\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\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 </div>\n )}\n\n {/* Attachment previews */}\n {attachments.length > 0 && (\n <div\n data-slot=\"composer-attachments\"\n className={cn(\n 'flex flex-wrap gap-2 p-3',\n 'border-t border-neutral-200 dark:border-neutral-700'\n )}\n >\n {attachments.map((attachment) => (\n <AttachmentPreviewItem\n key={attachment.id}\n attachment={attachment}\n onRemove={() => handleRemoveAttachment(attachment.id)}\n />\n ))}\n </div>\n )}\n\n {/* Input area */}\n <div\n data-slot=\"composer-input-area\"\n className={cn(\n 'flex items-center gap-2 p-3',\n 'bg-white dark:bg-neutral-900',\n variant === 'default' &&\n 'border-t border-neutral-200 dark:border-neutral-700'\n )}\n >\n {/* Attachment buttons */}\n {showAttachmentPicker && (\n <AttachmentPicker\n onFilesSelected={handleFilesSelected}\n acceptedTypes={acceptedFileTypes}\n maxFileSize={maxFileSize}\n maxFiles={maxAttachments - attachments.length}\n disabled={disabled || attachments.length >= maxAttachments}\n onError={onError}\n />\n )}\n\n {showCameraButton && (\n <CameraButton\n onCapture={(file) => handleFilesSelected([file])}\n disabled={disabled || attachments.length >= maxAttachments}\n />\n )}\n\n {/* Text input */}\n <div\n data-slot=\"composer-input-wrapper\"\n className=\"relative flex-1\"\n ref={mentionAnchorRef}\n >\n {mentionMenuOpen &&\n createPortal(\n <ul\n ref={mentionFloatingRef}\n style={mentionStyle}\n id={mentionListId}\n role=\"listbox\"\n aria-label=\"Mention\"\n data-slot=\"composer-mention-list\"\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 {mentionSuggestions.map((option, i) => (\n <li key={option.id}>\n <button\n type=\"button\"\n id={mentionOptionId(i)}\n role=\"option\"\n aria-selected={i === clampedMentionHighlight}\n // onMouseDown (not onClick) so the textarea keeps focus.\n onMouseDown={(e) => {\n e.preventDefault();\n insertMention(option);\n }}\n onMouseEnter={() => setMentionHighlight(i)}\n className={cn(\n 'flex w-full items-center gap-2 px-3 py-1.5 text-left text-sm',\n i === clampedMentionHighlight\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=\"ml-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 <textarea\n ref={textareaRef}\n data-slot=\"composer-input\"\n value={content}\n onChange={(e) => {\n setContent(e.target.value);\n syncMention(\n e.target.value,\n e.target.selectionStart ?? e.target.value.length\n );\n }}\n onClick={(e) => {\n const el = e.currentTarget;\n syncMention(el.value, el.selectionStart ?? el.value.length);\n }}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n placeholder={placeholder}\n disabled={disabled || isSending}\n rows={1}\n className={cn(\n 'w-full resize-none rounded-2xl py-2.5',\n inputTrailing ? 'pr-10 pl-4' : 'px-4',\n 'bg-neutral-100 dark:bg-neutral-800',\n 'text-neutral-900 dark:text-neutral-100',\n 'placeholder:text-neutral-400 dark:placeholder:text-neutral-500',\n 'focus:ring-primary-500 focus:ring-2 focus:outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'transition-colors',\n 'max-h-[150px]'\n )}\n aria-label=\"Message\"\n aria-describedby={showCharacterCount ? 'char-count' : undefined}\n {...(mentionsEnabled\n ? {\n 'aria-controls': mentionMenuOpen\n ? mentionListId\n : undefined,\n 'aria-activedescendant': activeMentionOptionId,\n 'aria-autocomplete': 'list' as const,\n }\n : {})}\n />\n\n {/* Trailing content (e.g. record button) */}\n {inputTrailing && (\n <div\n data-slot=\"composer-input-trailing\"\n className=\"pointer-events-none absolute top-0 right-1 flex h-[44px] items-center [&>*]:pointer-events-auto\"\n >\n {inputTrailing}\n </div>\n )}\n\n {/* Character count */}\n {showCharacterCount && (\n <div\n data-slot=\"composer-char-count\"\n id=\"char-count\"\n className=\"absolute right-3 bottom-1.5\"\n >\n <CharacterCounter current={content.length} max={maxLength} />\n </div>\n )}\n </div>\n\n {/* Send button */}\n <SendButton\n canSend={canSend}\n isLoading={isSending}\n disabled={disabled}\n />\n </div>\n </form>\n </DragDropZone>\n );\n }\n);\n\nMessageComposer.displayName = 'MessageComposer';\n\nexport { MessageComposer, CharacterCounter, SendButton, sendButtonVariants };\n"]}
|