@mieweb/ui 0.7.1 → 0.7.2-dev.1
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-OTFG3PYZ.cjs +15 -0
- package/dist/{CsvBlock-2A5VEDD3.cjs.map → CsvBlock-OTFG3PYZ.cjs.map} +1 -1
- package/dist/CsvBlock-PUSTBQ5B.js +6 -0
- package/dist/{CsvBlock-D6PWAJ5X.js.map → CsvBlock-PUSTBQ5B.js.map} +1 -1
- package/dist/HtmlPreviewBlock-QHLSIMWJ.cjs +15 -0
- package/dist/{HtmlPreviewBlock-SYXCV5RH.cjs.map → HtmlPreviewBlock-QHLSIMWJ.cjs.map} +1 -1
- package/dist/HtmlPreviewBlock-YF2YVKKX.js +6 -0
- package/dist/{HtmlPreviewBlock-PEHTJ6C3.js.map → HtmlPreviewBlock-YF2YVKKX.js.map} +1 -1
- package/dist/MermaidBlock-H3TWNC4D.js +6 -0
- package/dist/{MermaidBlock-7NK3AVK2.js.map → MermaidBlock-H3TWNC4D.js.map} +1 -1
- package/dist/MermaidBlock-ZLLBO3VY.cjs +15 -0
- package/dist/{MermaidBlock-AFXNP5NK.cjs.map → MermaidBlock-ZLLBO3VY.cjs.map} +1 -1
- package/dist/SurveyBlock-JLHS3YQD.js +6 -0
- package/dist/{SurveyBlock-NNDGXGG4.js.map → SurveyBlock-JLHS3YQD.js.map} +1 -1
- package/dist/SurveyBlock-M2ZRTGVJ.cjs +15 -0
- package/dist/{SurveyBlock-6KRNKFH5.cjs.map → SurveyBlock-M2ZRTGVJ.cjs.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-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-KBEKQMVY.cjs → chunk-4CUFXCC5.cjs} +5 -5
- package/dist/{chunk-KBEKQMVY.cjs.map → chunk-4CUFXCC5.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-XP6HELVG.cjs → chunk-5IDYOJHO.cjs} +13 -13
- package/dist/{chunk-XP6HELVG.cjs.map → chunk-5IDYOJHO.cjs.map} +1 -1
- package/dist/{chunk-7WMSUXOQ.js → chunk-5J5PEUUA.js} +4 -4
- package/dist/{chunk-7WMSUXOQ.js.map → chunk-5J5PEUUA.js.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-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-IYIYL2SQ.js → chunk-CEQJGUAS.js} +3 -3
- package/dist/{chunk-IYIYL2SQ.js.map → chunk-CEQJGUAS.js.map} +1 -1
- package/dist/{chunk-ZVSW2KS6.js → chunk-D2GID3YK.js} +30 -7
- package/dist/chunk-D2GID3YK.js.map +1 -0
- 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-I2W24RHW.js → chunk-DWCYEPTT.js} +3 -3
- package/dist/{chunk-I2W24RHW.js.map → chunk-DWCYEPTT.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-T3RWXOCM.js → chunk-EHQ77LL5.js} +3 -3
- package/dist/{chunk-T3RWXOCM.js.map → chunk-EHQ77LL5.js.map} +1 -1
- 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-KOCTIB6U.js → chunk-EMMYFHOT.js} +3 -3
- package/dist/{chunk-KOCTIB6U.js.map → chunk-EMMYFHOT.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-BB4WQ4LV.cjs → chunk-FN6VHMLM.cjs} +8 -8
- package/dist/{chunk-BB4WQ4LV.cjs.map → chunk-FN6VHMLM.cjs.map} +1 -1
- package/dist/{chunk-6AHYYWVB.js → chunk-FPVRQCCL.js} +5 -5
- package/dist/{chunk-6AHYYWVB.js.map → chunk-FPVRQCCL.js.map} +1 -1
- package/dist/{chunk-FJH7P5WG.js → chunk-FTRGZOVJ.js} +6 -6
- package/dist/{chunk-FJH7P5WG.js.map → chunk-FTRGZOVJ.js.map} +1 -1
- package/dist/{chunk-ZGSC2CB2.js → chunk-GTHNWP4P.js} +36 -5
- package/dist/chunk-GTHNWP4P.js.map +1 -0
- package/dist/{chunk-44CK4CT2.cjs → chunk-H7QSGFMZ.cjs} +13 -13
- package/dist/{chunk-44CK4CT2.cjs.map → chunk-H7QSGFMZ.cjs.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-BYUV3IZV.cjs → chunk-JP5SGIXA.cjs} +4 -4
- package/dist/{chunk-BYUV3IZV.cjs.map → chunk-JP5SGIXA.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-V25Z5GR6.cjs → chunk-K4S4FAYX.cjs} +9 -9
- package/dist/{chunk-V25Z5GR6.cjs.map → chunk-K4S4FAYX.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-6D5F7EDM.js → chunk-KRGKPUJH.js} +18 -17
- package/dist/chunk-KRGKPUJH.js.map +1 -0
- package/dist/{chunk-MCCO4A23.js → chunk-LC7YHZXM.js} +256 -45
- package/dist/chunk-LC7YHZXM.js.map +1 -0
- package/dist/{chunk-JCNPVK74.cjs → chunk-LJBWCUKP.cjs} +8 -8
- package/dist/{chunk-JCNPVK74.cjs.map → chunk-LJBWCUKP.cjs.map} +1 -1
- package/dist/{chunk-4LVPQ44A.js → chunk-LMBXJZLG.js} +9 -5
- package/dist/chunk-LMBXJZLG.js.map +1 -0
- package/dist/{chunk-ZHBANUBI.cjs → chunk-MJWFNV3L.cjs} +31 -27
- package/dist/chunk-MJWFNV3L.cjs.map +1 -0
- package/dist/{chunk-ZDEYV373.cjs → chunk-MYFZYUPR.cjs} +35 -11
- package/dist/chunk-MYFZYUPR.cjs.map +1 -0
- package/dist/{chunk-C2544GKZ.js → chunk-N3Y43KOB.js} +4 -4
- package/dist/{chunk-C2544GKZ.js.map → chunk-N3Y43KOB.js.map} +1 -1
- package/dist/{chunk-RHYIFIT5.js → chunk-NLBT5O2X.js} +3 -3
- package/dist/{chunk-RHYIFIT5.js.map → chunk-NLBT5O2X.js.map} +1 -1
- package/dist/{chunk-FCBQP2U4.cjs → chunk-NPKPCYAT.cjs} +142 -16
- package/dist/chunk-NPKPCYAT.cjs.map +1 -0
- package/dist/{chunk-PWHK7SWN.cjs → chunk-NQ2D2V6O.cjs} +150 -149
- package/dist/chunk-NQ2D2V6O.cjs.map +1 -0
- package/dist/{chunk-QUUFKGDF.cjs → chunk-OAHORW4N.cjs} +130 -86
- package/dist/chunk-OAHORW4N.cjs.map +1 -0
- 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-CVC4NWFA.cjs → chunk-P3JEMF6E.cjs} +4 -4
- package/dist/{chunk-CVC4NWFA.cjs.map → chunk-P3JEMF6E.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-Y2S6QMKU.js → chunk-PTZB2GKL.js} +3 -3
- package/dist/{chunk-Y2S6QMKU.js.map → chunk-PTZB2GKL.js.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-A2QVQF54.cjs → chunk-RDGRKYQ5.cjs} +31 -8
- package/dist/chunk-RDGRKYQ5.cjs.map +1 -0
- package/dist/{chunk-KJ5BSGEO.cjs → chunk-RS5VA6QU.cjs} +17 -13
- package/dist/chunk-RS5VA6QU.cjs.map +1 -0
- 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-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-7VF6WO7H.cjs → chunk-SYIFEJSF.cjs} +310 -99
- package/dist/chunk-SYIFEJSF.cjs.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-6ZYE6JUK.cjs → chunk-TVLZZI5Q.cjs} +11 -11
- package/dist/{chunk-6ZYE6JUK.cjs.map → chunk-TVLZZI5Q.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-BLPCYP4D.cjs → chunk-URHXR5SC.cjs} +29 -29
- package/dist/{chunk-BLPCYP4D.cjs.map → chunk-URHXR5SC.cjs.map} +1 -1
- package/dist/{chunk-OOYEHBYJ.js → chunk-UUI7WXI5.js} +142 -16
- package/dist/chunk-UUI7WXI5.js.map +1 -0
- package/dist/{chunk-UFYXU7KV.js → chunk-UZ5NGGMI.js} +4 -4
- package/dist/{chunk-UFYXU7KV.js.map → chunk-UZ5NGGMI.js.map} +1 -1
- 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-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-EUUQVDXX.cjs → chunk-W4Q4UEXA.cjs} +14 -14
- package/dist/{chunk-EUUQVDXX.cjs.map → chunk-W4Q4UEXA.cjs.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-CKD554XR.cjs → chunk-YIXTGWT4.cjs} +5 -5
- package/dist/{chunk-CKD554XR.cjs.map → chunk-YIXTGWT4.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-XL7TTKHP.js → chunk-Z4PECE5S.js} +7 -7
- package/dist/{chunk-XL7TTKHP.js.map → chunk-Z4PECE5S.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 +3481 -1875
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +245 -22
- package/dist/index.d.ts +245 -22
- package/dist/index.js +976 -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-A2QVQF54.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
- package/dist/chunk-ZVSW2KS6.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Button } from './chunk-
|
|
2
|
-
import { cn } from './chunk-
|
|
1
|
+
import { Button } from './chunk-D2GID3YK.js';
|
|
2
|
+
import { cn } from './chunk-TQONQSJO.js';
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import { Minus, ExternalLink, X, Square } from 'lucide-react';
|
|
5
5
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
@@ -309,5 +309,5 @@ var MinimizedWindow = React.forwardRef(
|
|
|
309
309
|
MinimizedWindow.displayName = "MinimizedWindow";
|
|
310
310
|
|
|
311
311
|
export { FloatingWindow, MinimizedWindow };
|
|
312
|
-
//# sourceMappingURL=chunk-
|
|
313
|
-
//# sourceMappingURL=chunk-
|
|
312
|
+
//# sourceMappingURL=chunk-N3Y43KOB.js.map
|
|
313
|
+
//# sourceMappingURL=chunk-N3Y43KOB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/FloatingWindow/FloatingWindow.tsx"],"names":[],"mappings":"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","file":"chunk-C2544GKZ.js","sourcesContent":["import * as React from 'react';\nimport { Minus, Square, ExternalLink, X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\n\ntype ResizeDirection = 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw';\n\nexport interface FloatingWindowProps {\n /** Whether the window is rendered. */\n open: boolean;\n /** Whether the window is collapsed to a minimized bar (renders nothing). */\n minimized?: boolean;\n /** Window title shown in the header. */\n title: React.ReactNode;\n /** Window body content. */\n children: React.ReactNode;\n /** Footer content, typically action buttons. */\n footer?: React.ReactNode;\n /** Called when the close control is activated. */\n onClose: () => void;\n /** Called when the minimize control is activated. Hidden when omitted. */\n onMinimize?: () => void;\n /** Called when the pop-out control is activated. Hidden when omitted. */\n onPopOut?: () => void;\n /**\n * When `true` the window floats at a draggable position. When `false`\n * (default) it is centered over a dimmed overlay like a modal.\n */\n draggable?: boolean;\n /** Whether the window can be resized from its edges/corners. Default true. */\n resizable?: boolean;\n /** Initial width in pixels. Default 1024. */\n defaultWidth?: number;\n /** Initial height in pixels. Default 600. */\n defaultHeight?: number;\n /** Minimum width in pixels. Default 600. */\n minWidth?: number;\n /** Minimum height in pixels. Default 400. */\n minHeight?: number;\n /** Class applied to the window container. */\n className?: string;\n /** Accessible label for the dialog when the title is not text. */\n 'aria-label'?: string;\n}\n\nconst RESIZE_HANDLES: { dir: ResizeDirection; className: string }[] = [\n { dir: 'nw', className: 'top-0 left-0 h-2 w-2 cursor-nw-resize' },\n { dir: 'ne', className: 'top-0 right-0 h-2 w-2 cursor-ne-resize' },\n { dir: 'sw', className: 'bottom-0 left-0 h-2 w-2 cursor-sw-resize' },\n { dir: 'n', className: 'top-0 left-2 right-2 h-1 cursor-n-resize' },\n { dir: 's', className: 'bottom-0 left-2 right-2 h-1 cursor-s-resize' },\n { dir: 'w', className: 'left-0 top-2 bottom-2 w-1 cursor-w-resize' },\n { dir: 'e', className: 'right-0 top-2 bottom-2 w-1 cursor-e-resize' },\n];\n\n/**\n * A presentational floating window shell used for pop-out editors (notes,\n * letters, etc.). It can render as a centered modal-style window or as a\n * draggable, freely-positioned window, and supports edge/corner resizing.\n * Open/minimize/close state and footer actions are controlled via props so it\n * can be wired to any store.\n */\nconst FloatingWindow = React.forwardRef<HTMLDivElement, FloatingWindowProps>(\n (\n {\n open,\n minimized = false,\n title,\n children,\n footer,\n onClose,\n onMinimize,\n onPopOut,\n draggable = false,\n resizable = true,\n defaultWidth = 1024,\n defaultHeight = 600,\n minWidth = 600,\n minHeight = 400,\n className,\n 'aria-label': ariaLabel,\n },\n ref\n ) => {\n const [size, setSize] = React.useState({\n width: defaultWidth,\n height: defaultHeight,\n });\n const [position, setPosition] = React.useState({ x: 50, y: 50 });\n\n const dragRef = React.useRef<{ x: number; y: number } | null>(null);\n const resizeRef = React.useRef<{\n dir: ResizeDirection;\n startX: number;\n startY: number;\n startW: number;\n startH: number;\n startPosX: number;\n startPosY: number;\n } | null>(null);\n\n const titleId = React.useId();\n\n const handleResizeStart = (e: React.MouseEvent, dir: ResizeDirection) => {\n e.preventDefault();\n e.stopPropagation();\n resizeRef.current = {\n dir,\n startX: e.clientX,\n startY: e.clientY,\n startW: size.width,\n startH: size.height,\n startPosX: position.x,\n startPosY: position.y,\n };\n };\n\n const handleDragStart = (e: React.MouseEvent) => {\n if (!draggable) return;\n if ((e.target as HTMLElement).closest('[data-window-controls]')) return;\n const rect = (e.currentTarget as HTMLElement)\n .closest('[data-slot=\"floating-window\"]')!\n .getBoundingClientRect();\n dragRef.current = { x: e.clientX - rect.left, y: e.clientY - rect.top };\n };\n\n React.useEffect(() => {\n if (!open || minimized) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (dragRef.current) {\n setPosition({\n x: e.clientX - dragRef.current.x,\n y: e.clientY - dragRef.current.y,\n });\n return;\n }\n const r = resizeRef.current;\n if (!r) return;\n const deltaX = e.clientX - r.startX;\n const deltaY = e.clientY - r.startY;\n let newWidth = r.startW;\n let newHeight = r.startH;\n let newX = r.startPosX;\n let newY = r.startPosY;\n\n if (r.dir.includes('e')) {\n newWidth = Math.max(\n minWidth,\n Math.min(window.innerWidth - 40, r.startW + deltaX)\n );\n }\n if (r.dir.includes('w')) {\n newWidth = Math.max(minWidth, r.startW - deltaX);\n if (draggable) newX = r.startPosX + (r.startW - newWidth);\n }\n if (r.dir.includes('s')) {\n newHeight = Math.max(\n minHeight,\n Math.min(window.innerHeight - 40, r.startH + deltaY)\n );\n }\n if (r.dir.includes('n')) {\n newHeight = Math.max(minHeight, r.startH - deltaY);\n if (draggable) newY = r.startPosY + (r.startH - newHeight);\n }\n\n setSize({ width: newWidth, height: newHeight });\n if (draggable && (r.dir.includes('w') || r.dir.includes('n'))) {\n setPosition({ x: newX, y: newY });\n }\n };\n\n const handleMouseUp = () => {\n dragRef.current = null;\n resizeRef.current = null;\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [open, minimized, draggable, minWidth, minHeight]);\n\n if (!open || minimized) return null;\n\n const windowEl = (\n <div\n ref={ref}\n data-slot=\"floating-window\"\n role=\"dialog\"\n aria-modal={draggable ? undefined : true}\n aria-labelledby={typeof title === 'string' ? titleId : undefined}\n aria-label={typeof title === 'string' ? undefined : ariaLabel}\n className={cn(\n 'bg-card text-card-foreground relative flex flex-col overflow-hidden rounded-lg shadow-2xl',\n draggable && 'border-primary-800 fixed border-2',\n className\n )}\n style={\n draggable\n ? {\n left: position.x,\n top: position.y,\n width: size.width,\n height: size.height,\n maxWidth: 'calc(100vw - 40px)',\n maxHeight: 'calc(100vh - 40px)',\n zIndex: 50,\n }\n : {\n width: size.width,\n height: size.height,\n maxWidth: 'calc(100vw - 40px)',\n maxHeight: 'calc(100vh - 40px)',\n }\n }\n >\n {resizable &&\n RESIZE_HANDLES.map((handle) => (\n <div\n key={handle.dir}\n aria-hidden=\"true\"\n className={cn('absolute z-10', handle.className)}\n onMouseDown={(e) => handleResizeStart(e, handle.dir)}\n />\n ))}\n {resizable && (\n <div\n aria-hidden=\"true\"\n className=\"hover:bg-muted/50 absolute right-0 bottom-0 z-10 h-4 w-4 cursor-se-resize rounded-tl\"\n onMouseDown={(e) => handleResizeStart(e, 'se')}\n >\n <svg\n className=\"text-muted-foreground/50 h-4 w-4\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M22 22H20V20H22V22ZM22 18H20V16H22V18ZM18 22H16V20H18V22ZM22 14H20V12H22V14ZM18 18H16V16H18V18ZM14 22H12V20H14V22Z\" />\n </svg>\n </div>\n )}\n\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions -- header acts as an optional drag handle; the controls inside remain keyboard accessible */}\n <div\n data-slot=\"floating-window-header\"\n className={cn(\n 'bg-primary-800 text-primary-foreground flex items-center justify-between rounded-t-lg px-4 py-3',\n draggable && 'cursor-move'\n )}\n onMouseDown={handleDragStart}\n >\n <h2\n id={typeof title === 'string' ? titleId : undefined}\n className=\"text-lg font-semibold\"\n >\n {title}\n </h2>\n <div data-window-controls className=\"flex items-center gap-1\">\n {onMinimize && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-primary-foreground hover:bg-primary-foreground/20 h-8 w-8 p-0\"\n onClick={onMinimize}\n aria-label=\"Minimize\"\n title=\"Minimize\"\n >\n <Minus className=\"h-4 w-4\" />\n </Button>\n )}\n {onPopOut && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-primary-foreground hover:bg-primary-foreground/20 h-8 w-8 p-0\"\n onClick={onPopOut}\n aria-label=\"Open in new window\"\n title=\"Open in new window\"\n >\n <ExternalLink className=\"h-4 w-4\" />\n </Button>\n )}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-primary-foreground hover:bg-primary-foreground/20 h-8 w-8 p-0\"\n onClick={onClose}\n aria-label=\"Close\"\n title=\"Close\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n {/* eslint-disable jsx-a11y/no-noninteractive-tabindex */}\n <div\n data-slot=\"floating-window-content\"\n role=\"region\"\n className=\"flex-1 overflow-y-auto\"\n tabIndex={0}\n >\n {children}\n </div>\n {/* eslint-enable jsx-a11y/no-noninteractive-tabindex */}\n\n {footer && (\n <div\n data-slot=\"floating-window-footer\"\n className=\"border-border bg-card flex items-center justify-end gap-3 rounded-b-lg border-t px-6 py-4\"\n >\n {footer}\n </div>\n )}\n </div>\n );\n\n if (draggable) return windowEl;\n\n return (\n <div\n data-slot=\"floating-window-overlay\"\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\"\n >\n {windowEl}\n </div>\n );\n }\n);\n\nFloatingWindow.displayName = 'FloatingWindow';\n\nexport interface MinimizedWindowProps {\n /** Title shown on the minimized bar. */\n title: React.ReactNode;\n /** Called when the bar is activated to restore the window. */\n onRestore: () => void;\n /** Called when the close control is activated. */\n onClose: () => void;\n /** Additional class for the minimized bar. */\n className?: string;\n}\n\n/**\n * A compact bar representing a minimized {@link FloatingWindow}. Render this\n * (typically in a docked tray) while the corresponding window is minimized.\n */\nconst MinimizedWindow = React.forwardRef<HTMLDivElement, MinimizedWindowProps>(\n ({ title, onRestore, onClose, className }, ref) => (\n <div\n ref={ref}\n data-slot=\"minimized-window\"\n className={cn(\n 'border-border bg-card flex min-w-[200px] items-center gap-2 rounded-lg border px-3 py-2 shadow-md',\n className\n )}\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-2\"\n onClick={onRestore}\n >\n <Square className=\"mr-1 h-3 w-3\" />\n <span className=\"truncate text-sm\">{title}</span>\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto h-6 w-6 p-0\"\n onClick={onClose}\n aria-label=\"Close\"\n title=\"Close\"\n >\n <X className=\"h-3 w-3\" />\n </Button>\n </div>\n )\n);\n\nMinimizedWindow.displayName = 'MinimizedWindow';\n\nexport { FloatingWindow, MinimizedWindow };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/FloatingWindow/FloatingWindow.tsx"],"names":[],"mappings":"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","file":"chunk-N3Y43KOB.js","sourcesContent":["import * as React from 'react';\nimport { Minus, Square, ExternalLink, X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\n\ntype ResizeDirection = 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw';\n\nexport interface FloatingWindowProps {\n /** Whether the window is rendered. */\n open: boolean;\n /** Whether the window is collapsed to a minimized bar (renders nothing). */\n minimized?: boolean;\n /** Window title shown in the header. */\n title: React.ReactNode;\n /** Window body content. */\n children: React.ReactNode;\n /** Footer content, typically action buttons. */\n footer?: React.ReactNode;\n /** Called when the close control is activated. */\n onClose: () => void;\n /** Called when the minimize control is activated. Hidden when omitted. */\n onMinimize?: () => void;\n /** Called when the pop-out control is activated. Hidden when omitted. */\n onPopOut?: () => void;\n /**\n * When `true` the window floats at a draggable position. When `false`\n * (default) it is centered over a dimmed overlay like a modal.\n */\n draggable?: boolean;\n /** Whether the window can be resized from its edges/corners. Default true. */\n resizable?: boolean;\n /** Initial width in pixels. Default 1024. */\n defaultWidth?: number;\n /** Initial height in pixels. Default 600. */\n defaultHeight?: number;\n /** Minimum width in pixels. Default 600. */\n minWidth?: number;\n /** Minimum height in pixels. Default 400. */\n minHeight?: number;\n /** Class applied to the window container. */\n className?: string;\n /** Accessible label for the dialog when the title is not text. */\n 'aria-label'?: string;\n}\n\nconst RESIZE_HANDLES: { dir: ResizeDirection; className: string }[] = [\n { dir: 'nw', className: 'top-0 left-0 h-2 w-2 cursor-nw-resize' },\n { dir: 'ne', className: 'top-0 right-0 h-2 w-2 cursor-ne-resize' },\n { dir: 'sw', className: 'bottom-0 left-0 h-2 w-2 cursor-sw-resize' },\n { dir: 'n', className: 'top-0 left-2 right-2 h-1 cursor-n-resize' },\n { dir: 's', className: 'bottom-0 left-2 right-2 h-1 cursor-s-resize' },\n { dir: 'w', className: 'left-0 top-2 bottom-2 w-1 cursor-w-resize' },\n { dir: 'e', className: 'right-0 top-2 bottom-2 w-1 cursor-e-resize' },\n];\n\n/**\n * A presentational floating window shell used for pop-out editors (notes,\n * letters, etc.). It can render as a centered modal-style window or as a\n * draggable, freely-positioned window, and supports edge/corner resizing.\n * Open/minimize/close state and footer actions are controlled via props so it\n * can be wired to any store.\n */\nconst FloatingWindow = React.forwardRef<HTMLDivElement, FloatingWindowProps>(\n (\n {\n open,\n minimized = false,\n title,\n children,\n footer,\n onClose,\n onMinimize,\n onPopOut,\n draggable = false,\n resizable = true,\n defaultWidth = 1024,\n defaultHeight = 600,\n minWidth = 600,\n minHeight = 400,\n className,\n 'aria-label': ariaLabel,\n },\n ref\n ) => {\n const [size, setSize] = React.useState({\n width: defaultWidth,\n height: defaultHeight,\n });\n const [position, setPosition] = React.useState({ x: 50, y: 50 });\n\n const dragRef = React.useRef<{ x: number; y: number } | null>(null);\n const resizeRef = React.useRef<{\n dir: ResizeDirection;\n startX: number;\n startY: number;\n startW: number;\n startH: number;\n startPosX: number;\n startPosY: number;\n } | null>(null);\n\n const titleId = React.useId();\n\n const handleResizeStart = (e: React.MouseEvent, dir: ResizeDirection) => {\n e.preventDefault();\n e.stopPropagation();\n resizeRef.current = {\n dir,\n startX: e.clientX,\n startY: e.clientY,\n startW: size.width,\n startH: size.height,\n startPosX: position.x,\n startPosY: position.y,\n };\n };\n\n const handleDragStart = (e: React.MouseEvent) => {\n if (!draggable) return;\n if ((e.target as HTMLElement).closest('[data-window-controls]')) return;\n const rect = (e.currentTarget as HTMLElement)\n .closest('[data-slot=\"floating-window\"]')!\n .getBoundingClientRect();\n dragRef.current = { x: e.clientX - rect.left, y: e.clientY - rect.top };\n };\n\n React.useEffect(() => {\n if (!open || minimized) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (dragRef.current) {\n setPosition({\n x: e.clientX - dragRef.current.x,\n y: e.clientY - dragRef.current.y,\n });\n return;\n }\n const r = resizeRef.current;\n if (!r) return;\n const deltaX = e.clientX - r.startX;\n const deltaY = e.clientY - r.startY;\n let newWidth = r.startW;\n let newHeight = r.startH;\n let newX = r.startPosX;\n let newY = r.startPosY;\n\n if (r.dir.includes('e')) {\n newWidth = Math.max(\n minWidth,\n Math.min(window.innerWidth - 40, r.startW + deltaX)\n );\n }\n if (r.dir.includes('w')) {\n newWidth = Math.max(minWidth, r.startW - deltaX);\n if (draggable) newX = r.startPosX + (r.startW - newWidth);\n }\n if (r.dir.includes('s')) {\n newHeight = Math.max(\n minHeight,\n Math.min(window.innerHeight - 40, r.startH + deltaY)\n );\n }\n if (r.dir.includes('n')) {\n newHeight = Math.max(minHeight, r.startH - deltaY);\n if (draggable) newY = r.startPosY + (r.startH - newHeight);\n }\n\n setSize({ width: newWidth, height: newHeight });\n if (draggable && (r.dir.includes('w') || r.dir.includes('n'))) {\n setPosition({ x: newX, y: newY });\n }\n };\n\n const handleMouseUp = () => {\n dragRef.current = null;\n resizeRef.current = null;\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [open, minimized, draggable, minWidth, minHeight]);\n\n if (!open || minimized) return null;\n\n const windowEl = (\n <div\n ref={ref}\n data-slot=\"floating-window\"\n role=\"dialog\"\n aria-modal={draggable ? undefined : true}\n aria-labelledby={typeof title === 'string' ? titleId : undefined}\n aria-label={typeof title === 'string' ? undefined : ariaLabel}\n className={cn(\n 'bg-card text-card-foreground relative flex flex-col overflow-hidden rounded-lg shadow-2xl',\n draggable && 'border-primary-800 fixed border-2',\n className\n )}\n style={\n draggable\n ? {\n left: position.x,\n top: position.y,\n width: size.width,\n height: size.height,\n maxWidth: 'calc(100vw - 40px)',\n maxHeight: 'calc(100vh - 40px)',\n zIndex: 50,\n }\n : {\n width: size.width,\n height: size.height,\n maxWidth: 'calc(100vw - 40px)',\n maxHeight: 'calc(100vh - 40px)',\n }\n }\n >\n {resizable &&\n RESIZE_HANDLES.map((handle) => (\n <div\n key={handle.dir}\n aria-hidden=\"true\"\n className={cn('absolute z-10', handle.className)}\n onMouseDown={(e) => handleResizeStart(e, handle.dir)}\n />\n ))}\n {resizable && (\n <div\n aria-hidden=\"true\"\n className=\"hover:bg-muted/50 absolute right-0 bottom-0 z-10 h-4 w-4 cursor-se-resize rounded-tl\"\n onMouseDown={(e) => handleResizeStart(e, 'se')}\n >\n <svg\n className=\"text-muted-foreground/50 h-4 w-4\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M22 22H20V20H22V22ZM22 18H20V16H22V18ZM18 22H16V20H18V22ZM22 14H20V12H22V14ZM18 18H16V16H18V18ZM14 22H12V20H14V22Z\" />\n </svg>\n </div>\n )}\n\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions -- header acts as an optional drag handle; the controls inside remain keyboard accessible */}\n <div\n data-slot=\"floating-window-header\"\n className={cn(\n 'bg-primary-800 text-primary-foreground flex items-center justify-between rounded-t-lg px-4 py-3',\n draggable && 'cursor-move'\n )}\n onMouseDown={handleDragStart}\n >\n <h2\n id={typeof title === 'string' ? titleId : undefined}\n className=\"text-lg font-semibold\"\n >\n {title}\n </h2>\n <div data-window-controls className=\"flex items-center gap-1\">\n {onMinimize && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-primary-foreground hover:bg-primary-foreground/20 h-8 w-8 p-0\"\n onClick={onMinimize}\n aria-label=\"Minimize\"\n title=\"Minimize\"\n >\n <Minus className=\"h-4 w-4\" />\n </Button>\n )}\n {onPopOut && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-primary-foreground hover:bg-primary-foreground/20 h-8 w-8 p-0\"\n onClick={onPopOut}\n aria-label=\"Open in new window\"\n title=\"Open in new window\"\n >\n <ExternalLink className=\"h-4 w-4\" />\n </Button>\n )}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-primary-foreground hover:bg-primary-foreground/20 h-8 w-8 p-0\"\n onClick={onClose}\n aria-label=\"Close\"\n title=\"Close\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n {/* eslint-disable jsx-a11y/no-noninteractive-tabindex */}\n <div\n data-slot=\"floating-window-content\"\n role=\"region\"\n className=\"flex-1 overflow-y-auto\"\n tabIndex={0}\n >\n {children}\n </div>\n {/* eslint-enable jsx-a11y/no-noninteractive-tabindex */}\n\n {footer && (\n <div\n data-slot=\"floating-window-footer\"\n className=\"border-border bg-card flex items-center justify-end gap-3 rounded-b-lg border-t px-6 py-4\"\n >\n {footer}\n </div>\n )}\n </div>\n );\n\n if (draggable) return windowEl;\n\n return (\n <div\n data-slot=\"floating-window-overlay\"\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\"\n >\n {windowEl}\n </div>\n );\n }\n);\n\nFloatingWindow.displayName = 'FloatingWindow';\n\nexport interface MinimizedWindowProps {\n /** Title shown on the minimized bar. */\n title: React.ReactNode;\n /** Called when the bar is activated to restore the window. */\n onRestore: () => void;\n /** Called when the close control is activated. */\n onClose: () => void;\n /** Additional class for the minimized bar. */\n className?: string;\n}\n\n/**\n * A compact bar representing a minimized {@link FloatingWindow}. Render this\n * (typically in a docked tray) while the corresponding window is minimized.\n */\nconst MinimizedWindow = React.forwardRef<HTMLDivElement, MinimizedWindowProps>(\n ({ title, onRestore, onClose, className }, ref) => (\n <div\n ref={ref}\n data-slot=\"minimized-window\"\n className={cn(\n 'border-border bg-card flex min-w-[200px] items-center gap-2 rounded-lg border px-3 py-2 shadow-md',\n className\n )}\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-2\"\n onClick={onRestore}\n >\n <Square className=\"mr-1 h-3 w-3\" />\n <span className=\"truncate text-sm\">{title}</span>\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto h-6 w-6 p-0\"\n onClick={onClose}\n aria-label=\"Close\"\n title=\"Close\"\n >\n <X className=\"h-3 w-3\" />\n </Button>\n </div>\n )\n);\n\nMinimizedWindow.displayName = 'MinimizedWindow';\n\nexport { FloatingWindow, MinimizedWindow };\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Button } from './chunk-
|
|
1
|
+
import { Button } from './chunk-D2GID3YK.js';
|
|
2
2
|
import { Eye, Code, Check, ClipboardCopy } from 'lucide-react';
|
|
3
3
|
import { useState, useRef, useEffect, useCallback } from 'react';
|
|
4
4
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
@@ -94,5 +94,5 @@ var FenceBlock = ({
|
|
|
94
94
|
};
|
|
95
95
|
|
|
96
96
|
export { FenceBlock };
|
|
97
|
-
//# sourceMappingURL=chunk-
|
|
98
|
-
//# sourceMappingURL=chunk-
|
|
97
|
+
//# sourceMappingURL=chunk-NLBT5O2X.js.map
|
|
98
|
+
//# sourceMappingURL=chunk-NLBT5O2X.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Markdown/FenceBlock.tsx"],"names":[],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/Markdown/FenceBlock.tsx"],"names":[],"mappings":"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","file":"chunk-NLBT5O2X.js","sourcesContent":["/**\n * FenceBlock — Base wrapper for code blocks with copy, raw view toggle, and errors.\n */\nimport { Check, ClipboardCopy, Code, Eye } from 'lucide-react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Button } from '../Button';\n\nexport interface FenceBlockProps {\n code: string;\n language?: string;\n supportsRawView?: boolean;\n error?: string;\n children: React.ReactNode;\n /** Extra buttons rendered in the header before the copy button */\n headerActions?: React.ReactNode;\n}\n\ntype CopyState = 'idle' | 'copying' | 'success' | 'error';\n\nexport const FenceBlock: React.FC<FenceBlockProps> = ({\n code,\n language,\n supportsRawView = false,\n error,\n children,\n headerActions,\n}) => {\n const [copyState, setCopyState] = useState<CopyState>('idle');\n const [showRaw, setShowRaw] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n },\n []\n );\n\n const scheduleReset = useCallback(() => {\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setCopyState('idle'), 2000);\n }, []);\n\n const handleCopy = useCallback(async () => {\n if (copyState === 'copying') return;\n setCopyState('copying');\n try {\n await navigator.clipboard.writeText(code);\n setCopyState('success');\n scheduleReset();\n } catch {\n try {\n const textarea = document.createElement('textarea');\n textarea.value = code;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n document.body.removeChild(textarea);\n setCopyState('success');\n } catch {\n setCopyState('error');\n }\n scheduleReset();\n }\n }, [code, copyState, scheduleReset]);\n\n return (\n <div className=\"group relative my-3 overflow-hidden rounded-lg border border-neutral-200 bg-neutral-50 dark:border-neutral-700 dark:bg-[#1a1d24]\">\n <div className=\"flex items-center justify-between border-b border-neutral-200 px-3 py-1.5 dark:border-white/[0.08]\">\n <span className=\"text-xs font-medium text-neutral-500 dark:text-neutral-400\">\n {language\n ? language.charAt(0).toUpperCase() + language.slice(1)\n : 'Text'}\n </span>\n <div className=\"flex items-center gap-1\">\n {headerActions}\n {supportsRawView && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowRaw((v) => !v)}\n aria-label={showRaw ? 'Show rendered view' : 'Show raw code'}\n className=\"h-7 w-7 p-0\"\n >\n {showRaw ? (\n <Eye className=\"h-3.5 w-3.5\" />\n ) : (\n <Code className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleCopy}\n aria-label=\"Copy code\"\n className=\"h-7 w-7 p-0\"\n >\n {copyState === 'success' ? (\n <Check className=\"h-3.5 w-3.5 text-green-500\" />\n ) : (\n <ClipboardCopy className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n </div>\n </div>\n\n {error ? (\n <div className=\"p-3\">\n <div className=\"rounded-md bg-red-50 p-3 text-sm text-red-800 dark:bg-red-900/20 dark:text-red-300\">\n {error}\n </div>\n <pre className=\"mt-2 overflow-x-auto text-xs whitespace-pre-wrap text-neutral-600 dark:text-neutral-400\">\n <code>{code}</code>\n </pre>\n </div>\n ) : showRaw ? (\n <pre\n className=\"overflow-x-auto p-3 text-sm\"\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- scrollable code needs keyboard focus (axe: scrollable-region-focusable)\n tabIndex={0}\n role=\"region\"\n aria-label=\"Raw code\"\n >\n <code>{code}</code>\n </pre>\n ) : (\n <div className=\"overflow-x-auto\">{children}</div>\n )}\n </div>\n );\n};\n"]}
|
|
@@ -130,7 +130,9 @@ function useTranscriptEdits(options) {
|
|
|
130
130
|
initialUndoStack,
|
|
131
131
|
onChange,
|
|
132
132
|
minSilenceMs: initialMinSilenceMs = DEFAULT_MIN_SILENCE_MS,
|
|
133
|
-
nlSilenceMs: initialNlSilenceMs = DEFAULT_NL_SILENCE_MS
|
|
133
|
+
nlSilenceMs: initialNlSilenceMs = DEFAULT_NL_SILENCE_MS,
|
|
134
|
+
initialSpeedMarkers,
|
|
135
|
+
initialDefaultSpeed
|
|
134
136
|
} = options;
|
|
135
137
|
const initializedFromSaved = react.useRef(false);
|
|
136
138
|
const [editedWords, setEditedWords] = react.useState(
|
|
@@ -141,6 +143,9 @@ function useTranscriptEdits(options) {
|
|
|
141
143
|
);
|
|
142
144
|
const [clipboard, setClipboard] = react.useState(null);
|
|
143
145
|
const [hasEdits, setHasEdits] = react.useState(() => {
|
|
146
|
+
if (initialSpeedMarkers && initialSpeedMarkers.length > 0 || initialDefaultSpeed !== void 0 && initialDefaultSpeed !== 1) {
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
144
149
|
if (initialEditedWords) {
|
|
145
150
|
const baseline = initEditableWords(
|
|
146
151
|
transcript,
|
|
@@ -155,11 +160,26 @@ function useTranscriptEdits(options) {
|
|
|
155
160
|
});
|
|
156
161
|
const [minSilenceMs, setMinSilenceMs] = react.useState(initialMinSilenceMs);
|
|
157
162
|
const [nlSilenceMs, setNlSilenceMs] = react.useState(initialNlSilenceMs);
|
|
158
|
-
const [defaultSpeed, setDefaultSpeed] = react.useState(
|
|
159
|
-
|
|
163
|
+
const [defaultSpeed, setDefaultSpeed] = react.useState(
|
|
164
|
+
initialDefaultSpeed ?? 1
|
|
165
|
+
);
|
|
166
|
+
const [speedMarkers, setSpeedMarkers] = react.useState(
|
|
167
|
+
initialSpeedMarkers ?? []
|
|
168
|
+
);
|
|
169
|
+
const [speedUndoStack, setSpeedUndoStack] = react.useState(
|
|
170
|
+
() => (initialUndoStack ?? []).map(() => ({
|
|
171
|
+
speedMarkers: initialSpeedMarkers ?? [],
|
|
172
|
+
defaultSpeed: initialDefaultSpeed ?? 1
|
|
173
|
+
}))
|
|
174
|
+
);
|
|
175
|
+
const [redoStack, setRedoStack] = react.useState([]);
|
|
176
|
+
const [speedRedoStack, setSpeedRedoStack] = react.useState([]);
|
|
160
177
|
const pushUndo = react.useCallback(() => {
|
|
161
178
|
setUndoStack((prev) => [...prev, editedWords]);
|
|
162
|
-
|
|
179
|
+
setSpeedUndoStack((prev) => [...prev, { speedMarkers, defaultSpeed }]);
|
|
180
|
+
setRedoStack([]);
|
|
181
|
+
setSpeedRedoStack([]);
|
|
182
|
+
}, [editedWords, speedMarkers, defaultSpeed]);
|
|
163
183
|
const prevTranscriptRef = react.useRef(transcript);
|
|
164
184
|
react.useEffect(() => {
|
|
165
185
|
if (prevTranscriptRef.current === transcript) {
|
|
@@ -170,6 +190,11 @@ function useTranscriptEdits(options) {
|
|
|
170
190
|
setUndoStack([]);
|
|
171
191
|
setHasEdits(false);
|
|
172
192
|
setClipboard(null);
|
|
193
|
+
setSpeedMarkers([]);
|
|
194
|
+
setDefaultSpeed(1);
|
|
195
|
+
setSpeedUndoStack([]);
|
|
196
|
+
setRedoStack([]);
|
|
197
|
+
setSpeedRedoStack([]);
|
|
173
198
|
initializedFromSaved.current = false;
|
|
174
199
|
}, [transcript, minSilenceMs, nlSilenceMs]);
|
|
175
200
|
react.useEffect(() => {
|
|
@@ -186,13 +211,46 @@ function useTranscriptEdits(options) {
|
|
|
186
211
|
if (undoStack.length === 0) return;
|
|
187
212
|
const previousState = undoStack[undoStack.length - 1];
|
|
188
213
|
setUndoStack((prev) => prev.slice(0, -1));
|
|
214
|
+
setRedoStack((prev) => [...prev, editedWords]);
|
|
215
|
+
setSpeedRedoStack((prev) => [...prev, { speedMarkers, defaultSpeed }]);
|
|
189
216
|
setEditedWords(previousState);
|
|
217
|
+
const speedSnapshot = speedUndoStack[speedUndoStack.length - 1];
|
|
218
|
+
if (speedSnapshot) {
|
|
219
|
+
setSpeedUndoStack((prev) => prev.slice(0, -1));
|
|
220
|
+
setSpeedMarkers(speedSnapshot.speedMarkers);
|
|
221
|
+
setDefaultSpeed(speedSnapshot.defaultSpeed);
|
|
222
|
+
}
|
|
190
223
|
const baseline = initEditableWords(transcript, minSilenceMs, nlSilenceMs);
|
|
191
224
|
const isOriginal = previousState.length === baseline.length && previousState.every(
|
|
192
225
|
(ew, i) => ew.originalIndex === i && !ew.deleted && !ew.inserted && ew.word.text === baseline[i].word.text
|
|
193
226
|
);
|
|
194
|
-
|
|
195
|
-
|
|
227
|
+
const speedIsOriginal = !speedSnapshot || speedSnapshot.speedMarkers.length === 0 && speedSnapshot.defaultSpeed === 1;
|
|
228
|
+
setHasEdits(!isOriginal || !speedIsOriginal);
|
|
229
|
+
}, [
|
|
230
|
+
undoStack,
|
|
231
|
+
speedUndoStack,
|
|
232
|
+
editedWords,
|
|
233
|
+
speedMarkers,
|
|
234
|
+
defaultSpeed,
|
|
235
|
+
transcript,
|
|
236
|
+
minSilenceMs,
|
|
237
|
+
nlSilenceMs
|
|
238
|
+
]);
|
|
239
|
+
const redo = react.useCallback(() => {
|
|
240
|
+
if (redoStack.length === 0) return;
|
|
241
|
+
const nextState = redoStack[redoStack.length - 1];
|
|
242
|
+
setRedoStack((prev) => prev.slice(0, -1));
|
|
243
|
+
setUndoStack((prev) => [...prev, editedWords]);
|
|
244
|
+
setSpeedUndoStack((prev) => [...prev, { speedMarkers, defaultSpeed }]);
|
|
245
|
+
setEditedWords(nextState);
|
|
246
|
+
const speedSnapshot = speedRedoStack[speedRedoStack.length - 1];
|
|
247
|
+
if (speedSnapshot) {
|
|
248
|
+
setSpeedRedoStack((prev) => prev.slice(0, -1));
|
|
249
|
+
setSpeedMarkers(speedSnapshot.speedMarkers);
|
|
250
|
+
setDefaultSpeed(speedSnapshot.defaultSpeed);
|
|
251
|
+
}
|
|
252
|
+
setHasEdits(true);
|
|
253
|
+
}, [redoStack, speedRedoStack, editedWords, speedMarkers, defaultSpeed]);
|
|
196
254
|
const toggleWordDeleted = react.useCallback(
|
|
197
255
|
(index) => {
|
|
198
256
|
const ew = editedWords[index];
|
|
@@ -393,9 +451,41 @@ function useTranscriptEdits(options) {
|
|
|
393
451
|
return ew;
|
|
394
452
|
});
|
|
395
453
|
setEditedWords(restoredWords);
|
|
454
|
+
if (speedMarkers.length > 0) {
|
|
455
|
+
const survivorPrefix = [];
|
|
456
|
+
let survivors = 0;
|
|
457
|
+
editedWords.forEach((ew) => {
|
|
458
|
+
survivorPrefix.push(survivors);
|
|
459
|
+
if (!chunkNUFUV43P_cjs.isSilenceType(ew.word.wordType) && ew.originalIndex >= 0 && !ew.inserted) {
|
|
460
|
+
survivors++;
|
|
461
|
+
}
|
|
462
|
+
});
|
|
463
|
+
survivorPrefix.push(survivors);
|
|
464
|
+
const newIndexByOrdinal = [];
|
|
465
|
+
restoredWords.forEach((ew, i) => {
|
|
466
|
+
if (!chunkNUFUV43P_cjs.isSilenceType(ew.word.wordType)) newIndexByOrdinal.push(i);
|
|
467
|
+
});
|
|
468
|
+
const remapped = [];
|
|
469
|
+
speedMarkers.forEach((m) => {
|
|
470
|
+
const ordinal = survivorPrefix[Math.min(m.wordIndex, editedWords.length)];
|
|
471
|
+
const newIndex = newIndexByOrdinal[ordinal];
|
|
472
|
+
if (newIndex === void 0) return;
|
|
473
|
+
const last = remapped[remapped.length - 1];
|
|
474
|
+
if (last && last.wordIndex === newIndex) {
|
|
475
|
+
remapped[remapped.length - 1] = {
|
|
476
|
+
wordIndex: newIndex,
|
|
477
|
+
speed: m.speed
|
|
478
|
+
};
|
|
479
|
+
} else {
|
|
480
|
+
remapped.push({ wordIndex: newIndex, speed: m.speed });
|
|
481
|
+
}
|
|
482
|
+
});
|
|
483
|
+
setSpeedMarkers(remapped);
|
|
484
|
+
}
|
|
396
485
|
setUndoStack([]);
|
|
486
|
+
setSpeedUndoStack([]);
|
|
397
487
|
},
|
|
398
|
-
[editedWords, transcript]
|
|
488
|
+
[editedWords, transcript, speedMarkers]
|
|
399
489
|
);
|
|
400
490
|
const getSpeedMarkerAtIndex = react.useCallback(
|
|
401
491
|
(wordIndex) => {
|
|
@@ -405,6 +495,7 @@ function useTranscriptEdits(options) {
|
|
|
405
495
|
);
|
|
406
496
|
const toggleSpeedMarker = react.useCallback(
|
|
407
497
|
(wordIndex, speed) => {
|
|
498
|
+
pushUndo();
|
|
408
499
|
setSpeedMarkers((prev) => {
|
|
409
500
|
const existingIdx = prev.findIndex((m) => m.wordIndex === wordIndex);
|
|
410
501
|
if (existingIdx >= 0) {
|
|
@@ -421,17 +512,49 @@ function useTranscriptEdits(options) {
|
|
|
421
512
|
});
|
|
422
513
|
setHasEdits(true);
|
|
423
514
|
},
|
|
424
|
-
[]
|
|
515
|
+
[pushUndo]
|
|
425
516
|
);
|
|
426
517
|
const removeSpeedMarker = react.useCallback(
|
|
427
518
|
(wordIndex) => {
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
519
|
+
if (!speedMarkers.some((m) => m.wordIndex === wordIndex)) return;
|
|
520
|
+
pushUndo();
|
|
521
|
+
setSpeedMarkers(speedMarkers.filter((m) => m.wordIndex !== wordIndex));
|
|
522
|
+
setHasEdits(true);
|
|
523
|
+
},
|
|
524
|
+
[speedMarkers, pushUndo]
|
|
525
|
+
);
|
|
526
|
+
const setDefaultSpeedUndoable = react.useCallback(
|
|
527
|
+
(speed) => {
|
|
528
|
+
if (speed === defaultSpeed) return;
|
|
529
|
+
pushUndo();
|
|
530
|
+
setDefaultSpeed(speed);
|
|
531
|
+
setHasEdits(true);
|
|
532
|
+
},
|
|
533
|
+
[defaultSpeed, pushUndo]
|
|
534
|
+
);
|
|
535
|
+
const setSpeedForRange = react.useCallback(
|
|
536
|
+
(startIndex, endIndex, speed) => {
|
|
537
|
+
if (startIndex > endIndex) return;
|
|
538
|
+
pushUndo();
|
|
539
|
+
const afterIndex = endIndex + 1;
|
|
540
|
+
const speedAfter = getSpeedAtIndex(
|
|
541
|
+
afterIndex,
|
|
542
|
+
speedMarkers,
|
|
543
|
+
defaultSpeed
|
|
544
|
+
);
|
|
545
|
+
const kept = speedMarkers.filter(
|
|
546
|
+
(m) => m.wordIndex < startIndex || m.wordIndex > endIndex
|
|
547
|
+
);
|
|
548
|
+
const speedAtStart = getSpeedAtIndex(startIndex, kept, defaultSpeed);
|
|
549
|
+
const next = speedAtStart === speed ? [...kept] : [...kept, { wordIndex: startIndex, speed }];
|
|
550
|
+
if (afterIndex < editedWords.length && speedAfter !== speed && !kept.some((m) => m.wordIndex === afterIndex)) {
|
|
551
|
+
next.push({ wordIndex: afterIndex, speed: speedAfter });
|
|
432
552
|
}
|
|
553
|
+
next.sort((a, b) => a.wordIndex - b.wordIndex);
|
|
554
|
+
setSpeedMarkers(next);
|
|
555
|
+
setHasEdits(true);
|
|
433
556
|
},
|
|
434
|
-
[speedMarkers]
|
|
557
|
+
[pushUndo, speedMarkers, defaultSpeed, editedWords.length]
|
|
435
558
|
);
|
|
436
559
|
const getSpeedAtIndexBound = react.useCallback(
|
|
437
560
|
(index) => {
|
|
@@ -513,6 +636,8 @@ function useTranscriptEdits(options) {
|
|
|
513
636
|
hasEdits,
|
|
514
637
|
pushUndo,
|
|
515
638
|
undo,
|
|
639
|
+
redo,
|
|
640
|
+
canRedo: redoStack.length > 0,
|
|
516
641
|
toggleWordDeleted,
|
|
517
642
|
deleteRange,
|
|
518
643
|
cut,
|
|
@@ -527,7 +652,8 @@ function useTranscriptEdits(options) {
|
|
|
527
652
|
silenceThresholds: { minSilenceMs, nlSilenceMs },
|
|
528
653
|
speedMarkers,
|
|
529
654
|
defaultSpeed,
|
|
530
|
-
setDefaultSpeed,
|
|
655
|
+
setDefaultSpeed: setDefaultSpeedUndoable,
|
|
656
|
+
setSpeedForRange,
|
|
531
657
|
toggleSpeedMarker,
|
|
532
658
|
removeSpeedMarker,
|
|
533
659
|
getSpeedAtIndex: getSpeedAtIndexBound,
|
|
@@ -546,5 +672,5 @@ exports.getSpeedAtIndex = getSpeedAtIndex;
|
|
|
546
672
|
exports.initEditableWords = initEditableWords;
|
|
547
673
|
exports.insertSilences = insertSilences;
|
|
548
674
|
exports.useTranscriptEdits = useTranscriptEdits;
|
|
549
|
-
//# sourceMappingURL=chunk-
|
|
550
|
-
//# sourceMappingURL=chunk-
|
|
675
|
+
//# sourceMappingURL=chunk-NPKPCYAT.cjs.map
|
|
676
|
+
//# sourceMappingURL=chunk-NPKPCYAT.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useTranscriptEdits.ts"],"names":["useRef","useState","useCallback","useEffect","isSilenceType","useMemo"],"mappings":"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","file":"chunk-NPKPCYAT.cjs","sourcesContent":["/**\n * useTranscriptEdits — headless transcript-editing state hook.\n *\n * Extracted from pulseclip's TranscriptViewer for @mieweb/ui. Holds the\n * edited word timeline (deletions, insertions, text edits, silence\n * splitting), a single-level undo stack, an internal clipboard, speed\n * markers, and derived playback/statistics data.\n *\n * Controlled + persistence-agnostic: no DOM, no fetches. Selection lives in\n * the UI layer — mutations take explicit indices. State flows out via\n * `onChange` and back in via `initialEditedWords` / `initialUndoStack`.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type {\n Transcript,\n TranscriptWord,\n EditableWord,\n PlaybackSegment,\n PlaybackSpeed,\n SpeedMarker,\n} from '../components/TranscriptView/transcript';\nimport { isSilenceType } from '../components/TranscriptView/transcript';\n\n/** Default filler words offered for removal */\nexport const DEFAULT_FILLER_WORDS = [\n 'um',\n 'uh',\n 'umm',\n 'uhh',\n 'uh-huh',\n 'mm-hmm',\n 'hmm',\n 'hm',\n 'er',\n 'err',\n 'ah',\n 'ahh',\n 'eh',\n 'oh',\n 'ooh',\n 'like',\n 'you know',\n 'i mean',\n 'so',\n 'well',\n 'actually',\n 'basically',\n 'literally',\n 'right',\n 'okay',\n 'ok',\n];\n\n/** Default minimum silence duration in milliseconds to detect and insert */\nexport const DEFAULT_MIN_SILENCE_MS = 400;\n\n/** Default threshold for \"newline\" silences - longer pauses that indicate paragraph breaks */\nexport const DEFAULT_NL_SILENCE_MS = 1500;\n\n/** Silence thresholds (seconds) reported by the filler analysis */\nconst SILENCE_ANALYSIS_THRESHOLDS = [0.3, 0.4, 0.5, 0.75, 1.0, 1.5, 2.0];\n\n/** Clipboard data for cut/copy/paste operations */\nexport interface TranscriptClipboard {\n words: EditableWord[];\n operation: 'cut' | 'copy';\n}\n\n/** Count and total duration of silences above a given threshold (seconds) */\nexport interface SilenceThresholdCount {\n threshold: number;\n count: number;\n durationMs: number;\n}\n\n/**\n * Builds playback segments from the edited word list.\n * Consecutive words in original order are merged into single segments.\n * Inserted (pasted) words each get their own segment since they may be duplicates.\n */\nexport function buildPlaybackSegments(\n editedWords: EditableWord[]\n): PlaybackSegment[] {\n const activeWords = editedWords.filter((w) => !w.deleted);\n if (activeWords.length === 0) return [];\n\n const segments: PlaybackSegment[] = [];\n let currentSegment: PlaybackSegment | null = null;\n let lastOriginalIndex = -2; // Use -2 so first word always starts new segment\n let lastWasInserted = false;\n\n for (let i = 0; i < editedWords.length; i++) {\n const ew = editedWords[i];\n if (ew.deleted) continue;\n\n // Check if this word is consecutive to the previous in the original\n // Inserted words always start a new segment (they might be duplicates)\n const isConsecutive =\n !ew.inserted &&\n !lastWasInserted &&\n ew.originalIndex === lastOriginalIndex + 1;\n\n if (currentSegment && isConsecutive) {\n // Extend current segment\n currentSegment.endMs = ew.word.endMs;\n currentSegment.editedIndices.push(i);\n } else {\n // Start new segment\n if (currentSegment) {\n segments.push(currentSegment);\n }\n currentSegment = {\n startMs: ew.word.startMs,\n endMs: ew.word.endMs,\n editedIndices: [i],\n };\n }\n\n lastOriginalIndex = ew.originalIndex;\n lastWasInserted = ew.inserted ?? false;\n }\n\n if (currentSegment) {\n segments.push(currentSegment);\n }\n\n return segments;\n}\n\n/**\n * Get the effective playback speed at a given word index.\n * Finds the most recent speed marker at or before the word index,\n * or returns the default speed if no marker applies.\n */\nexport function getSpeedAtIndex(\n wordIndex: number,\n speedMarkers: SpeedMarker[],\n defaultSpeed: PlaybackSpeed\n): PlaybackSpeed {\n // Single O(n) pass that takes the marker with the greatest wordIndex at or\n // before the target. This avoids the per-call copy+sort (stats calls this\n // once per word) without assuming callers pass sorted markers — it is a\n // public helper, so arbitrary order must still yield the right answer.\n let effectiveSpeed = defaultSpeed;\n let nearest = -1;\n for (const marker of speedMarkers) {\n if (marker.wordIndex <= wordIndex && marker.wordIndex > nearest) {\n nearest = marker.wordIndex;\n effectiveSpeed = marker.speed;\n }\n }\n return effectiveSpeed;\n}\n\n/**\n * Detect silences between words and return a new array with silence pseudo-words inserted.\n * Silences are detected as gaps between the endMs of one word and startMs of the next.\n * Silences >= nlSilenceMs are marked as 'silence-newline' for visual line breaks.\n */\nexport function insertSilences(\n words: TranscriptWord[],\n minSilenceMs: number = DEFAULT_MIN_SILENCE_MS,\n nlSilenceMs: number = DEFAULT_NL_SILENCE_MS\n): TranscriptWord[] {\n if (words.length === 0) return [];\n\n const result: TranscriptWord[] = [];\n\n for (let i = 0; i < words.length; i++) {\n const word = words[i];\n\n // Check for silence before the first word (from 0ms)\n if (i === 0 && word.startMs > minSilenceMs) {\n const isNewline = word.startMs >= nlSilenceMs;\n result.push({\n text: `[${(word.startMs / 1000).toFixed(1)}s]`,\n startMs: 0,\n endMs: word.startMs,\n wordType: isNewline ? 'silence-newline' : 'silence',\n });\n }\n\n // Add the word (with default wordType)\n result.push({ ...word, wordType: word.wordType ?? 'word' });\n\n // Check for silence after this word (gap before next word)\n if (i < words.length - 1) {\n const nextWord = words[i + 1];\n const gapMs = nextWord.startMs - word.endMs;\n\n if (gapMs >= minSilenceMs) {\n const isNewline = gapMs >= nlSilenceMs;\n result.push({\n text: `[${(gapMs / 1000).toFixed(1)}s]`,\n startMs: word.endMs,\n endMs: nextWord.startMs,\n wordType: isNewline ? 'silence-newline' : 'silence',\n });\n }\n }\n }\n\n return result;\n}\n\n/** Initialize editable words from transcript, inserting detected silences */\nexport function initEditableWords(\n transcript: Transcript,\n minSilenceMs: number = DEFAULT_MIN_SILENCE_MS,\n nlSilenceMs: number = DEFAULT_NL_SILENCE_MS\n): EditableWord[] {\n // First insert silences between the original words\n const wordsWithSilences = insertSilences(\n transcript.words,\n minSilenceMs,\n nlSilenceMs\n );\n\n return wordsWithSilences.map((word, index) => ({\n originalIndex: index,\n word,\n deleted: false,\n }));\n}\n\n/** Strip trailing punctuation and lowercase for filler-word matching */\nfunction normalizeWordText(text: string): string {\n return text.toLowerCase().replace(/[.,!?;:]/g, '');\n}\n\nexport interface UseTranscriptEditsOptions {\n /** The source transcript (canonical, immutable) */\n transcript: Transcript;\n /** Initial edited words (from saved edits) */\n initialEditedWords?: EditableWord[];\n /** Initial undo stack (from saved edits) */\n initialUndoStack?: EditableWord[][];\n /** Fired after every mutation (for persistence) */\n onChange?: (editedWords: EditableWord[], undoStack: EditableWord[][]) => void;\n /** Minimum silence duration (ms) to detect and insert. Default 400 */\n minSilenceMs?: number;\n /** Threshold (ms) for \"newline\" silences (paragraph breaks). Default 1500 */\n nlSilenceMs?: number;\n /** Initial speed markers (from saved edits) */\n initialSpeedMarkers?: SpeedMarker[];\n /** Initial default playback speed (from saved edits). Default 1 */\n initialDefaultSpeed?: PlaybackSpeed;\n}\n\nexport interface TranscriptEditStats {\n /** Non-deleted spoken words (silences excluded) */\n activeWordCount: number;\n /** Non-deleted silence entries */\n activeSilenceCount: number;\n /** Deleted spoken words */\n deletedWordCount: number;\n /** Deleted silence entries */\n deletedSilenceCount: number;\n /** Total duration of non-deleted entries, adjusted for speed markers */\n editedDurationMs: number;\n}\n\nexport interface FillerAnalysis {\n /** Occurrence count per normalized word (fillers and every active word) */\n matchCounts: Map<string, number>;\n /** Total duration (ms) per normalized word */\n durations: Map<string, number>;\n /** Count + total duration of active silences above each analysis threshold */\n silenceCounts: SilenceThresholdCount[];\n /** The built-in filler word list */\n defaultFillerWords: string[];\n}\n\nexport interface UseTranscriptEditsResult {\n // -- State --\n /** The edited timeline (words + silence pseudo-words) */\n editedWords: EditableWord[];\n /** Undo snapshots, oldest first */\n undoStack: EditableWord[][];\n /** Internal clipboard from the last cut/copy, or null */\n clipboard: TranscriptClipboard | null;\n /** Whether any edit has been made (deletions, insertions, text edits, speed markers) */\n hasEdits: boolean;\n\n // -- Undo --\n /** Push the current editedWords onto the undo stack (call before external batch mutations) */\n pushUndo: () => void;\n /** Restore the most recent undo snapshot */\n undo: () => void;\n /** Step forward again after an undo. Cleared by any new edit. */\n redo: () => void;\n /** Whether there is anything to redo */\n canRedo: boolean;\n\n // -- Word mutations (selection-agnostic: pass explicit indices) --\n /** Toggle the deleted flag on a single word */\n toggleWordDeleted: (index: number) => void;\n /**\n * Toggle the deleted state of a contiguous range. The first index acts as\n * the anchor: all words are set to the opposite of the anchor's state\n * (delete all if anchor active, restore all if anchor deleted).\n */\n deleteRange: (indices: number[]) => void;\n /** Cut words at the given indices into the clipboard (marks them deleted) */\n cut: (indices: number[]) => void;\n /** Copy non-deleted words at the given indices into the clipboard */\n copy: (indices: number[]) => void;\n /**\n * Paste the clipboard at a word index. `before` (default true) inserts\n * before the word at `atIndex`; false inserts after it. Returns the index\n * where the first pasted word landed, or null if the clipboard was empty.\n */\n paste: (atIndex: number, before?: boolean) => number | null;\n /** Replace a word's text (no-op if unchanged) */\n setWordText: (index: number, text: string) => void;\n /** Split a silence at the given index into segments with the given durations (seconds) */\n splitSilence: (index: number, durationsSec: number[]) => void;\n /** Toggle the word at the index deleted (editor \"delete\" action) */\n deleteWord: (index: number) => void;\n /** Replace the entire edit state from an external source (e.g. an editable script view); undo-safe */\n replaceEditedWords: (next: EditableWord[]) => void;\n /** Mark matching filler words (and silences above the given seconds threshold) deleted */\n removeFillers: (\n fillerWords: string[],\n removeSilenceAboveSec: number | null\n ) => void;\n\n // -- Silence thresholds --\n /** Rebuild silence detection with new thresholds, preserving word deletions.\n * Not undoable — clears the undo stack (prior snapshots reference the old silence layout). */\n setSilenceThresholds: (minMs: number, nlMs: number) => void;\n /** Current silence detection thresholds (ms) */\n silenceThresholds: { minSilenceMs: number; nlSilenceMs: number };\n\n // -- Playback speed --\n /** Speed markers, sorted by word index */\n speedMarkers: SpeedMarker[];\n /** Default playback speed when no marker applies */\n defaultSpeed: PlaybackSpeed;\n /** Set the default playback speed (undoable) */\n setDefaultSpeed: (speed: PlaybackSpeed) => void;\n /** Add/update/remove a speed marker (re-selecting the same speed removes it; undoable) */\n toggleSpeedMarker: (index: number, speed: PlaybackSpeed) => void;\n /** Remove the speed marker at a word index, if any (undoable) */\n removeSpeedMarker: (index: number) => void;\n /**\n * Apply one speed across an index range (typically the selection): marks the\n * start, restores the prior effective speed after the end. One undo step.\n */\n setSpeedForRange: (\n startIndex: number,\n endIndex: number,\n speed: PlaybackSpeed\n ) => void;\n /** Effective playback speed at a word index */\n getSpeedAtIndex: (index: number) => PlaybackSpeed;\n /** The speed marker at a word index, if any */\n getSpeedMarkerAtIndex: (index: number) => SpeedMarker | undefined;\n\n // -- Derived --\n /** Contiguous playback segments built from the edited timeline */\n playbackSegments: PlaybackSegment[];\n /** Word/silence counts and speed-adjusted edited duration */\n stats: TranscriptEditStats;\n /** Filler word and silence analysis for removal UIs */\n fillerAnalysis: FillerAnalysis;\n}\n\n/**\n * Headless transcript-editing hook. See module docs for scope.\n *\n * Undo semantics: each mutation snapshots the full `editedWords` array onto\n * a single-level stack before applying; `undo` pops one snapshot. Speed\n * markers and silence-threshold changes are NOT part of the undo stack\n * (matching the source component).\n */\nexport function useTranscriptEdits(\n options: UseTranscriptEditsOptions\n): UseTranscriptEditsResult {\n const {\n transcript,\n initialEditedWords,\n initialUndoStack,\n onChange,\n minSilenceMs: initialMinSilenceMs = DEFAULT_MIN_SILENCE_MS,\n nlSilenceMs: initialNlSilenceMs = DEFAULT_NL_SILENCE_MS,\n initialSpeedMarkers,\n initialDefaultSpeed,\n } = options;\n\n // Track if we've initialized from saved state (skip first onChange notification)\n const initializedFromSaved = useRef(false);\n\n const [editedWords, setEditedWords] = useState<EditableWord[]>(\n () =>\n initialEditedWords ||\n initEditableWords(transcript, initialMinSilenceMs, initialNlSilenceMs)\n );\n const [undoStack, setUndoStack] = useState<EditableWord[][]>(\n initialUndoStack || []\n );\n const [clipboard, setClipboard] = useState<TranscriptClipboard | null>(null);\n const [hasEdits, setHasEdits] = useState(() => {\n // Rehydrated speed state counts as an edit, matching the live setters\n // (toggleSpeedMarker sets hasEdits) and this flag's documented contract\n if (\n (initialSpeedMarkers && initialSpeedMarkers.length > 0) ||\n (initialDefaultSpeed !== undefined && initialDefaultSpeed !== 1)\n ) {\n return true;\n }\n // Compare saved state against the derived baseline: deletions, insertions,\n // length changes, AND text edits (text-only edits previously initialized\n // hasEdits=false, which also suppressed onChange persistence).\n if (initialEditedWords) {\n const baseline = initEditableWords(\n transcript,\n initialMinSilenceMs,\n initialNlSilenceMs\n );\n return (\n initialEditedWords.length !== baseline.length ||\n initialEditedWords.some(\n (ew, i) =>\n ew.deleted ||\n ew.inserted ||\n ew.originalIndex !== i ||\n ew.word.text !== baseline[i].word.text\n )\n );\n }\n return false;\n });\n const [minSilenceMs, setMinSilenceMs] = useState(initialMinSilenceMs);\n const [nlSilenceMs, setNlSilenceMs] = useState(initialNlSilenceMs);\n const [defaultSpeed, setDefaultSpeed] = useState<PlaybackSpeed>(\n initialDefaultSpeed ?? 1\n );\n const [speedMarkers, setSpeedMarkers] = useState<SpeedMarker[]>(\n initialSpeedMarkers ?? []\n );\n\n // Speed snapshots aligned with undoStack so undo restores speed too. Not\n // persisted: entries synthesized for a rehydrated undoStack carry the\n // initial speed, so undoing past them simply leaves speed at its saved\n // state instead of guessing history we never had.\n const [speedUndoStack, setSpeedUndoStack] = useState<\n { speedMarkers: SpeedMarker[]; defaultSpeed: PlaybackSpeed }[]\n >(() =>\n (initialUndoStack ?? []).map(() => ({\n speedMarkers: initialSpeedMarkers ?? [],\n defaultSpeed: initialDefaultSpeed ?? 1,\n }))\n );\n\n // Redo mirrors undo. Undo used to pop and discard, which meant a mis-click\n // was unrecoverable and any Redo control a host offered could not service\n // word-level steps — the pair looked symmetric and was not. Not persisted, for\n // the same reason the speed snapshots are not: a rehydrated stack describes a\n // sequence of states this session never performed.\n const [redoStack, setRedoStack] = useState<EditableWord[][]>([]);\n const [speedRedoStack, setSpeedRedoStack] = useState<\n { speedMarkers: SpeedMarker[]; defaultSpeed: PlaybackSpeed }[]\n >([]);\n\n // Helper to save current state to undo stack before making changes\n const pushUndo = useCallback(() => {\n setUndoStack((prev) => [...prev, editedWords]);\n setSpeedUndoStack((prev) => [...prev, { speedMarkers, defaultSpeed }]);\n // A fresh edit abandons the redo branch, as it does in every editor.\n setRedoStack([]);\n setSpeedRedoStack([]);\n }, [editedWords, speedMarkers, defaultSpeed]);\n\n // Track previous transcript to detect changes\n const prevTranscriptRef = useRef(transcript);\n\n // Reset edited words when transcript changes (but not on initial load with saved edits)\n useEffect(() => {\n if (prevTranscriptRef.current === transcript) {\n return;\n }\n prevTranscriptRef.current = transcript;\n\n // Transcript changed - reset to fresh state (use current silence thresholds)\n setEditedWords(initEditableWords(transcript, minSilenceMs, nlSilenceMs));\n setUndoStack([]);\n setHasEdits(false);\n setClipboard(null);\n // Speed markers index into the old transcript's word list; keeping them\n // would apply stale rates to arbitrary words of the new transcript\n setSpeedMarkers([]);\n setDefaultSpeed(1);\n setSpeedUndoStack([]);\n setRedoStack([]);\n setSpeedRedoStack([]);\n initializedFromSaved.current = false;\n }, [transcript, minSilenceMs, nlSilenceMs]);\n\n // Notify consumer when editor state changes (for persistence)\n useEffect(() => {\n // Skip the initial render if we initialized from saved state\n if (!initializedFromSaved.current && initialEditedWords) {\n initializedFromSaved.current = true;\n return;\n }\n initializedFromSaved.current = true;\n\n // Only notify if there are edits to persist\n if (hasEdits || undoStack.length > 0) {\n onChange?.(editedWords, undoStack);\n }\n }, [editedWords, undoStack, hasEdits, onChange, initialEditedWords]);\n\n // Undo last edit\n const undo = useCallback(() => {\n if (undoStack.length === 0) return;\n const previousState = undoStack[undoStack.length - 1];\n setUndoStack((prev) => prev.slice(0, -1));\n // Bank what we are leaving before leaving it.\n setRedoStack((prev) => [...prev, editedWords]);\n setSpeedRedoStack((prev) => [...prev, { speedMarkers, defaultSpeed }]);\n setEditedWords(previousState);\n // Speed snapshots ride along with word snapshots\n const speedSnapshot = speedUndoStack[speedUndoStack.length - 1];\n if (speedSnapshot) {\n setSpeedUndoStack((prev) => prev.slice(0, -1));\n setSpeedMarkers(speedSnapshot.speedMarkers);\n setDefaultSpeed(speedSnapshot.defaultSpeed);\n }\n // Compare against the silence-inserted baseline (what the editor actually\n // starts from), not raw transcript.words — with any detected silence the\n // lengths never matched and hasEdits stayed true after undoing everything.\n const baseline = initEditableWords(transcript, minSilenceMs, nlSilenceMs);\n const isOriginal =\n previousState.length === baseline.length &&\n previousState.every(\n (ew, i) =>\n ew.originalIndex === i &&\n !ew.deleted &&\n !ew.inserted &&\n ew.word.text === baseline[i].word.text\n );\n const speedIsOriginal =\n !speedSnapshot ||\n (speedSnapshot.speedMarkers.length === 0 &&\n speedSnapshot.defaultSpeed === 1);\n setHasEdits(!isOriginal || !speedIsOriginal);\n }, [\n undoStack,\n speedUndoStack,\n editedWords,\n speedMarkers,\n defaultSpeed,\n transcript,\n minSilenceMs,\n nlSilenceMs,\n ]);\n\n /** Step forward again after an undo. Cleared by any new edit. */\n const redo = useCallback(() => {\n if (redoStack.length === 0) return;\n const nextState = redoStack[redoStack.length - 1];\n setRedoStack((prev) => prev.slice(0, -1));\n setUndoStack((prev) => [...prev, editedWords]);\n setSpeedUndoStack((prev) => [...prev, { speedMarkers, defaultSpeed }]);\n setEditedWords(nextState);\n const speedSnapshot = speedRedoStack[speedRedoStack.length - 1];\n if (speedSnapshot) {\n setSpeedRedoStack((prev) => prev.slice(0, -1));\n setSpeedMarkers(speedSnapshot.speedMarkers);\n setDefaultSpeed(speedSnapshot.defaultSpeed);\n }\n // Redoing always lands on a state that was reached by editing, so it is by\n // definition not the untouched original.\n setHasEdits(true);\n }, [redoStack, speedRedoStack, editedWords, speedMarkers, defaultSpeed]);\n\n // Toggle deleted state on a single word\n const toggleWordDeleted = useCallback(\n (index: number) => {\n const ew = editedWords[index];\n if (!ew) return;\n\n pushUndo();\n const newEditedWords = [...editedWords];\n newEditedWords[index] = { ...ew, deleted: !ew.deleted };\n setEditedWords(newEditedWords);\n setHasEdits(true);\n },\n [editedWords, pushUndo]\n );\n\n // Toggle deleted state for a range; the first index acts as the anchor\n const deleteRange = useCallback(\n (indices: number[]) => {\n if (indices.length === 0) return;\n const anchor = editedWords[indices[0]];\n if (!anchor) return;\n\n pushUndo();\n // The anchor word's state determines the action for all words:\n // if anchor is not deleted, delete all; if anchor is deleted, restore all\n const targetDeletedState = !anchor.deleted;\n setEditedWords((prev) => {\n const updated = [...prev];\n for (const i of indices) {\n if (updated[i]) {\n updated[i] = { ...updated[i], deleted: targetDeletedState };\n }\n }\n return updated;\n });\n setHasEdits(true);\n },\n [editedWords, pushUndo]\n );\n\n // Cut words at the given indices into the clipboard\n const cut = useCallback(\n (indices: number[]) => {\n if (indices.length === 0) return;\n const cutWords = indices\n .map((i) => editedWords[i])\n .filter((ew): ew is EditableWord => ew !== undefined);\n if (cutWords.length === 0) return;\n\n pushUndo();\n setClipboard({ words: cutWords, operation: 'cut' });\n setEditedWords((prev) => {\n const updated = [...prev];\n for (const i of indices) {\n if (updated[i]) {\n updated[i] = { ...updated[i], deleted: true };\n }\n }\n return updated;\n });\n setHasEdits(true);\n },\n [editedWords, pushUndo]\n );\n\n // Copy non-deleted words at the given indices into the clipboard (no mutation)\n const copy = useCallback(\n (indices: number[]) => {\n const selectedWords = indices\n .map((i) => editedWords[i])\n .filter((ew): ew is EditableWord => ew !== undefined && !ew.deleted);\n if (selectedWords.length === 0) return;\n setClipboard({ words: selectedWords, operation: 'copy' });\n },\n [editedWords]\n );\n\n // Paste from clipboard at a word index\n const paste = useCallback(\n (atIndex: number, before: boolean = true): number | null => {\n if (!clipboard) return null;\n pushUndo();\n const insertIndex = before ? atIndex : atIndex + 1;\n setEditedWords((prev) => {\n const updated = [...prev];\n const wordsToInsert = clipboard.words.map((w) => ({\n ...w,\n deleted: false,\n inserted: true,\n }));\n updated.splice(insertIndex, 0, ...wordsToInsert);\n return updated;\n });\n setHasEdits(true);\n return insertIndex;\n },\n [clipboard, pushUndo]\n );\n\n // Replace a word's text\n const setWordText = useCallback(\n (index: number, text: string) => {\n const ew = editedWords[index];\n if (!ew || text === ew.word.text) return;\n\n pushUndo();\n const newEditedWords = [...editedWords];\n newEditedWords[index] = {\n ...ew,\n word: { ...ew.word, text },\n };\n setEditedWords(newEditedWords);\n setHasEdits(true);\n },\n [editedWords, pushUndo]\n );\n\n // Split a silence into multiple segments\n const splitSilence = useCallback(\n (index: number, durationsSec: number[]) => {\n const ew = editedWords[index];\n if (!ew || !isSilenceType(ew.word.wordType)) return;\n\n pushUndo();\n\n // Create new silence segments from the durations\n const silenceStart = ew.word.startMs;\n const newSilences: EditableWord[] = [];\n let currentMs = silenceStart;\n\n for (let i = 0; i < durationsSec.length; i++) {\n const durationMs = Math.round(durationsSec[i] * 1000);\n const endMs = currentMs + durationMs;\n\n newSilences.push({\n originalIndex: -1, // Negative indicates a split/inserted silence\n word: {\n text: `[${durationsSec[i].toFixed(1)}s]`,\n startMs: currentMs,\n endMs: endMs,\n wordType: 'silence',\n },\n deleted: false,\n inserted: true,\n });\n\n currentMs = endMs;\n }\n\n // Replace the original silence with the new segments\n const newEditedWords = [...editedWords];\n newEditedWords.splice(index, 1, ...newSilences);\n setEditedWords(newEditedWords);\n setHasEdits(true);\n },\n [editedWords, pushUndo]\n );\n\n // Editor \"delete\" action: toggles the word's deleted state\n const deleteWord = useCallback(\n (index: number) => {\n toggleWordDeleted(index);\n },\n [toggleWordDeleted]\n );\n\n // Replace the entire edit state from an external source (e.g. the editable\n // script/YAML panel). Undo-safe: the previous state is pushed first.\n const replaceEditedWords = useCallback(\n (next: EditableWord[]) => {\n pushUndo();\n setEditedWords(next);\n setHasEdits(true);\n },\n [pushUndo]\n );\n\n // Mark filler words (and optionally silences above threshold) deleted\n const removeFillers = useCallback(\n (fillerWords: string[], removeSilenceAboveSec: number | null) => {\n const fillerSet = new Set(fillerWords.map((f) => f.toLowerCase()));\n const silenceThresholdMs =\n removeSilenceAboveSec !== null ? removeSilenceAboveSec * 1000 : null;\n\n const newEditedWords = editedWords.map((ew) => {\n if (ew.deleted) return ew;\n\n // Check if it's a silence that should be removed\n if (isSilenceType(ew.word.wordType) && silenceThresholdMs !== null) {\n const durationMs = ew.word.endMs - ew.word.startMs;\n if (durationMs > silenceThresholdMs) {\n return { ...ew, deleted: true };\n }\n return ew;\n }\n\n // Check if it's a filler word that should be removed\n if (!isSilenceType(ew.word.wordType)) {\n const wordText = normalizeWordText(ew.word.text);\n if (fillerSet.has(wordText)) {\n return { ...ew, deleted: true };\n }\n }\n\n return ew;\n });\n\n const deletedCount = newEditedWords.filter(\n (ew, i) => ew.deleted && !editedWords[i].deleted\n ).length;\n\n if (deletedCount > 0) {\n pushUndo();\n setEditedWords(newEditedWords);\n setHasEdits(true);\n }\n },\n [editedWords, pushUndo]\n );\n\n // Apply new silence thresholds, rebuilding silences while preserving word deletions\n const setSilenceThresholds = useCallback(\n (newMinSilenceMs: number, newNlSilenceMs: number) => {\n setMinSilenceMs(newMinSilenceMs);\n setNlSilenceMs(newNlSilenceMs);\n // Rebuild the editable words with new silence detection.\n // Preserve deleted status for actual words (not silences), keyed by the\n // word's ORDINAL among non-silence words — the same key the restore loop\n // below uses. (Keying by originalIndex — a position in the old\n // silence-inserted array — mismatched the restore counter and applied\n // deletions to the wrong words after a threshold change.)\n // Pasted words keep their source originalIndex but are dropped by the\n // rebuild, so they must not occupy a slot in this keyspace either.\n const wordDeletedStatus = new Map<number, boolean>();\n let saveIdx = 0;\n editedWords.forEach((ew) => {\n if (\n !isSilenceType(ew.word.wordType) &&\n ew.originalIndex >= 0 &&\n !ew.inserted\n ) {\n wordDeletedStatus.set(saveIdx, ew.deleted);\n saveIdx++;\n }\n });\n\n // Re-initialize with new thresholds\n const newEditedWords = initEditableWords(\n transcript,\n newMinSilenceMs,\n newNlSilenceMs\n );\n\n // Restore deleted status for words (same ordinal keyspace as the save)\n let wordIdx = 0;\n const restoredWords = newEditedWords.map((ew) => {\n if (!isSilenceType(ew.word.wordType)) {\n const wasDeleted = wordDeletedStatus.get(wordIdx) ?? false;\n wordIdx++;\n return { ...ew, deleted: wasDeleted };\n }\n return ew;\n });\n\n setEditedWords(restoredWords);\n\n // Speed markers index into the silence-inserted array, so the rebuild\n // shifts them too. Re-anchor each marker to the first rebuild-surviving\n // word at or after it — the same ordinal keyspace as the deletion\n // restore above. Markers with no surviving word left are dropped;\n // markers that collapse onto the same word keep the later speed (it\n // governed the words from that point on).\n if (speedMarkers.length > 0) {\n const survivorPrefix: number[] = [];\n let survivors = 0;\n editedWords.forEach((ew) => {\n survivorPrefix.push(survivors);\n if (\n !isSilenceType(ew.word.wordType) &&\n ew.originalIndex >= 0 &&\n !ew.inserted\n ) {\n survivors++;\n }\n });\n survivorPrefix.push(survivors);\n const newIndexByOrdinal: number[] = [];\n restoredWords.forEach((ew, i) => {\n if (!isSilenceType(ew.word.wordType)) newIndexByOrdinal.push(i);\n });\n const remapped: SpeedMarker[] = [];\n speedMarkers.forEach((m) => {\n const ordinal =\n survivorPrefix[Math.min(m.wordIndex, editedWords.length)];\n const newIndex = newIndexByOrdinal[ordinal];\n if (newIndex === undefined) return;\n const last = remapped[remapped.length - 1];\n if (last && last.wordIndex === newIndex) {\n remapped[remapped.length - 1] = {\n wordIndex: newIndex,\n speed: m.speed,\n };\n } else {\n remapped.push({ wordIndex: newIndex, speed: m.speed });\n }\n });\n setSpeedMarkers(remapped);\n }\n\n // Undo snapshots were captured against the previous silence layout;\n // restoring one after a rebuild would resurrect silence chips that no\n // longer match the current thresholds. Threshold changes are not\n // undoable, so drop the stale history rather than restore it — the\n // speed stack rides along or the two stacks drift out of alignment.\n setUndoStack([]);\n setSpeedUndoStack([]);\n },\n [editedWords, transcript, speedMarkers]\n );\n\n // Get the speed marker at a specific word index (if any)\n const getSpeedMarkerAtIndex = useCallback(\n (wordIndex: number): SpeedMarker | undefined => {\n return speedMarkers.find((m) => m.wordIndex === wordIndex);\n },\n [speedMarkers]\n );\n\n // Toggle a speed marker at a word index\n const toggleSpeedMarker = useCallback(\n (wordIndex: number, speed: PlaybackSpeed) => {\n pushUndo();\n setSpeedMarkers((prev) => {\n const existingIdx = prev.findIndex((m) => m.wordIndex === wordIndex);\n if (existingIdx >= 0) {\n // If marker exists with same speed, remove it\n if (prev[existingIdx].speed === speed) {\n return prev.filter((_, i) => i !== existingIdx);\n }\n // If marker exists with different speed, update it\n const updated = [...prev];\n updated[existingIdx] = { wordIndex, speed };\n return updated;\n }\n // Add new marker\n return [...prev, { wordIndex, speed }].sort(\n (a, b) => a.wordIndex - b.wordIndex\n );\n });\n setHasEdits(true);\n },\n [pushUndo]\n );\n\n // Remove a speed marker at a word index\n const removeSpeedMarker = useCallback(\n (wordIndex: number) => {\n if (!speedMarkers.some((m) => m.wordIndex === wordIndex)) return;\n pushUndo();\n setSpeedMarkers(speedMarkers.filter((m) => m.wordIndex !== wordIndex));\n setHasEdits(true);\n },\n [speedMarkers, pushUndo]\n );\n\n // Undoable default-speed setter (the raw setter stays internal for undo/reset)\n const setDefaultSpeedUndoable = useCallback(\n (speed: PlaybackSpeed) => {\n if (speed === defaultSpeed) return;\n pushUndo();\n setDefaultSpeed(speed);\n setHasEdits(true);\n },\n [defaultSpeed, pushUndo]\n );\n\n /**\n * Apply one speed across an index range (typically the current selection):\n * clears markers inside the range, marks the start with the new speed, and\n * restores the previous effective speed just after the end so only the\n * range is affected. One undo step.\n */\n const setSpeedForRange = useCallback(\n (startIndex: number, endIndex: number, speed: PlaybackSpeed) => {\n if (startIndex > endIndex) return;\n pushUndo();\n const afterIndex = endIndex + 1;\n const speedAfter = getSpeedAtIndex(\n afterIndex,\n speedMarkers,\n defaultSpeed\n );\n const kept = speedMarkers.filter(\n (m) => m.wordIndex < startIndex || m.wordIndex > endIndex\n );\n // Only pin the range start when it changes the effective speed there.\n // Applying the speed already in effect (e.g. 1x under a 1x default, or a\n // preceding marker's speed) would persist a no-op marker into saves/exports.\n const speedAtStart = getSpeedAtIndex(startIndex, kept, defaultSpeed);\n const next =\n speedAtStart === speed\n ? [...kept]\n : [...kept, { wordIndex: startIndex, speed }];\n if (\n afterIndex < editedWords.length &&\n speedAfter !== speed &&\n !kept.some((m) => m.wordIndex === afterIndex)\n ) {\n next.push({ wordIndex: afterIndex, speed: speedAfter });\n }\n next.sort((a, b) => a.wordIndex - b.wordIndex);\n setSpeedMarkers(next);\n setHasEdits(true);\n },\n [pushUndo, speedMarkers, defaultSpeed, editedWords.length]\n );\n\n // Effective playback speed at a word index (bound to current markers + default)\n const getSpeedAtIndexBound = useCallback(\n (index: number): PlaybackSpeed => {\n return getSpeedAtIndex(index, speedMarkers, defaultSpeed);\n },\n [speedMarkers, defaultSpeed]\n );\n\n // -- Derived data --\n\n const playbackSegments = useMemo(\n () => buildPlaybackSegments(editedWords),\n [editedWords]\n );\n\n const stats = useMemo<TranscriptEditStats>(() => {\n // Count active (non-deleted) words (excluding silences for word count)\n const activeWordCount = editedWords.filter(\n (ew) => !ew.deleted && !isSilenceType(ew.word.wordType)\n ).length;\n const activeSilenceCount = editedWords.filter(\n (ew) => !ew.deleted && isSilenceType(ew.word.wordType)\n ).length;\n const deletedWordCount = editedWords.filter(\n (ew) => ew.deleted && !isSilenceType(ew.word.wordType)\n ).length;\n const deletedSilenceCount = editedWords.filter(\n (ew) => ew.deleted && isSilenceType(ew.word.wordType)\n ).length;\n\n // Calculate edited duration (sum of non-deleted words/silences, adjusted for speed markers)\n const editedDurationMs = editedWords.reduce((sum, ew, index) => {\n if (ew.deleted) return sum;\n const wordDuration = ew.word.endMs - ew.word.startMs;\n const speed = getSpeedAtIndex(index, speedMarkers, defaultSpeed);\n // Duration is divided by speed (2x speed = half the time)\n return sum + wordDuration / speed;\n }, 0);\n\n return {\n activeWordCount,\n activeSilenceCount,\n deletedWordCount,\n deletedSilenceCount,\n editedDurationMs,\n };\n }, [editedWords, speedMarkers, defaultSpeed]);\n\n const fillerAnalysis = useMemo<FillerAnalysis>(() => {\n // Occurrence counts per filler (and every active word, for custom fillers)\n const matchCounts = new Map<string, number>();\n for (const ew of editedWords) {\n if (ew.deleted || isSilenceType(ew.word.wordType)) continue;\n const wordText = normalizeWordText(ew.word.text);\n // One increment per occurrence — DEFAULT_FILLER_WORDS entries were\n // previously counted twice (once in a defaults loop, once here).\n matchCounts.set(wordText, (matchCounts.get(wordText) || 0) + 1);\n }\n\n // Total duration per filler word type\n const durations = new Map<string, number>();\n for (const ew of editedWords) {\n if (ew.deleted || isSilenceType(ew.word.wordType)) continue;\n const wordText = normalizeWordText(ew.word.text);\n const wordDuration = ew.word.endMs - ew.word.startMs;\n // One accumulation per occurrence — DEFAULT_FILLER_WORDS entries were\n // previously accumulated twice, inflating time-saved estimates 2x.\n durations.set(wordText, (durations.get(wordText) || 0) + wordDuration);\n }\n\n // Silence counts and durations at various thresholds\n const silenceCounts = SILENCE_ANALYSIS_THRESHOLDS.map((threshold) => {\n const thresholdMs = threshold * 1000;\n let count = 0;\n let durationMs = 0;\n for (const ew of editedWords) {\n if (ew.deleted) continue;\n if (!isSilenceType(ew.word.wordType)) continue;\n const silenceDuration = ew.word.endMs - ew.word.startMs;\n if (silenceDuration > thresholdMs) {\n count++;\n durationMs += silenceDuration;\n }\n }\n return { threshold, count, durationMs };\n });\n\n return {\n matchCounts,\n durations,\n silenceCounts,\n defaultFillerWords: DEFAULT_FILLER_WORDS,\n };\n }, [editedWords]);\n\n return {\n editedWords,\n undoStack,\n clipboard,\n hasEdits,\n pushUndo,\n undo,\n redo,\n canRedo: redoStack.length > 0,\n toggleWordDeleted,\n deleteRange,\n cut,\n copy,\n paste,\n setWordText,\n splitSilence,\n deleteWord,\n replaceEditedWords,\n removeFillers,\n setSilenceThresholds,\n silenceThresholds: { minSilenceMs, nlSilenceMs },\n speedMarkers,\n defaultSpeed,\n setDefaultSpeed: setDefaultSpeedUndoable,\n setSpeedForRange,\n toggleSpeedMarker,\n removeSpeedMarker,\n getSpeedAtIndex: getSpeedAtIndexBound,\n getSpeedMarkerAtIndex,\n playbackSegments,\n stats,\n fillerAnalysis,\n };\n}\n"]}
|