@mieweb/ui 0.11.0-dev.30 → 0.11.0-dev.31

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.
Files changed (268) hide show
  1. package/dist/CsvBlock-AV4VM7JT.cjs +18 -0
  2. package/dist/{CsvBlock-RGO7JXHJ.cjs.map → CsvBlock-AV4VM7JT.cjs.map} +1 -1
  3. package/dist/CsvBlock-XBNYCEMP.js +9 -0
  4. package/dist/{CsvBlock-CFXSDPBI.js.map → CsvBlock-XBNYCEMP.js.map} +1 -1
  5. package/dist/HtmlPreviewBlock-DQAVD6IO.cjs +18 -0
  6. package/dist/{HtmlPreviewBlock-VBYXCXVT.cjs.map → HtmlPreviewBlock-DQAVD6IO.cjs.map} +1 -1
  7. package/dist/HtmlPreviewBlock-QQHRNLIY.js +9 -0
  8. package/dist/{HtmlPreviewBlock-Z2GCK325.js.map → HtmlPreviewBlock-QQHRNLIY.js.map} +1 -1
  9. package/dist/MermaidBlock-LHGYKC23.cjs +18 -0
  10. package/dist/{MermaidBlock-I2R2BQOX.cjs.map → MermaidBlock-LHGYKC23.cjs.map} +1 -1
  11. package/dist/MermaidBlock-QPKMIP3B.js +9 -0
  12. package/dist/{MermaidBlock-XCAK7IA5.js.map → MermaidBlock-QPKMIP3B.js.map} +1 -1
  13. package/dist/SurveyBlock-6DPTWHKI.js +9 -0
  14. package/dist/{SurveyBlock-KI5JOWCL.js.map → SurveyBlock-6DPTWHKI.js.map} +1 -1
  15. package/dist/SurveyBlock-6IXNVHS5.cjs +18 -0
  16. package/dist/{SurveyBlock-UKSGISRT.cjs.map → SurveyBlock-6IXNVHS5.cjs.map} +1 -1
  17. package/dist/{chunk-7XKM6V2K.cjs → chunk-2OXNJJHJ.cjs} +8 -8
  18. package/dist/{chunk-7XKM6V2K.cjs.map → chunk-2OXNJJHJ.cjs.map} +1 -1
  19. package/dist/{chunk-AJPFQF3H.cjs → chunk-2R3ILG4Y.cjs} +11 -11
  20. package/dist/{chunk-AJPFQF3H.cjs.map → chunk-2R3ILG4Y.cjs.map} +1 -1
  21. package/dist/{chunk-XQHDQ64G.cjs → chunk-2Z2GFDRS.cjs} +4 -4
  22. package/dist/{chunk-XQHDQ64G.cjs.map → chunk-2Z2GFDRS.cjs.map} +1 -1
  23. package/dist/{chunk-GM32IDVL.cjs → chunk-32ZILZ2T.cjs} +6 -6
  24. package/dist/{chunk-GM32IDVL.cjs.map → chunk-32ZILZ2T.cjs.map} +1 -1
  25. package/dist/{chunk-VOEXGDL5.js → chunk-33Y3KQWL.js} +3 -3
  26. package/dist/{chunk-VOEXGDL5.js.map → chunk-33Y3KQWL.js.map} +1 -1
  27. package/dist/{chunk-GYXSF6BJ.cjs → chunk-3IKIRGHI.cjs} +6 -6
  28. package/dist/{chunk-GYXSF6BJ.cjs.map → chunk-3IKIRGHI.cjs.map} +1 -1
  29. package/dist/{chunk-5HKZR6UG.js → chunk-43L4KGLU.js} +4 -4
  30. package/dist/{chunk-5HKZR6UG.js.map → chunk-43L4KGLU.js.map} +1 -1
  31. package/dist/{chunk-6BNZLN4B.cjs → chunk-4I5V6SXP.cjs} +10 -10
  32. package/dist/{chunk-6BNZLN4B.cjs.map → chunk-4I5V6SXP.cjs.map} +1 -1
  33. package/dist/{chunk-NUFUV43P.cjs → chunk-4UDEMJE4.cjs} +2 -2
  34. package/dist/chunk-4UDEMJE4.cjs.map +1 -0
  35. package/dist/{chunk-L5Y52F2E.cjs → chunk-4VSK3EE5.cjs} +4 -4
  36. package/dist/{chunk-L5Y52F2E.cjs.map → chunk-4VSK3EE5.cjs.map} +1 -1
  37. package/dist/{chunk-Y7ZJZLJY.js → chunk-566FIEPE.js} +4 -4
  38. package/dist/{chunk-Y7ZJZLJY.js.map → chunk-566FIEPE.js.map} +1 -1
  39. package/dist/{chunk-UTIPENPW.cjs → chunk-67SD6VPF.cjs} +5 -5
  40. package/dist/{chunk-UTIPENPW.cjs.map → chunk-67SD6VPF.cjs.map} +1 -1
  41. package/dist/{chunk-6CGM5H4J.js → chunk-6LIC3DKE.js} +2 -2
  42. package/dist/chunk-6LIC3DKE.js.map +1 -0
  43. package/dist/{chunk-6N7NMOSV.js → chunk-76ECYE5G.js} +3 -3
  44. package/dist/{chunk-6N7NMOSV.js.map → chunk-76ECYE5G.js.map} +1 -1
  45. package/dist/{chunk-56VTM4OX.js → chunk-7LKTIZLR.js} +3 -3
  46. package/dist/{chunk-56VTM4OX.js.map → chunk-7LKTIZLR.js.map} +1 -1
  47. package/dist/{chunk-7C5W744U.cjs → chunk-ARRJRFPD.cjs} +8 -8
  48. package/dist/{chunk-7C5W744U.cjs.map → chunk-ARRJRFPD.cjs.map} +1 -1
  49. package/dist/{chunk-5KGYTNOA.cjs → chunk-BP4LXRC6.cjs} +9 -9
  50. package/dist/{chunk-5KGYTNOA.cjs.map → chunk-BP4LXRC6.cjs.map} +1 -1
  51. package/dist/{chunk-UNFDIBKJ.js → chunk-CLNTWFEB.js} +3 -3
  52. package/dist/{chunk-UNFDIBKJ.js.map → chunk-CLNTWFEB.js.map} +1 -1
  53. package/dist/{chunk-X5JOEZVR.js → chunk-CRSJRWN2.js} +4 -4
  54. package/dist/{chunk-X5JOEZVR.js.map → chunk-CRSJRWN2.js.map} +1 -1
  55. package/dist/{chunk-FIKO4WR6.js → chunk-CVMD2A3J.js} +3 -3
  56. package/dist/{chunk-FIKO4WR6.js.map → chunk-CVMD2A3J.js.map} +1 -1
  57. package/dist/{chunk-SMPLM6K3.js → chunk-DG3CXR24.js} +5 -5
  58. package/dist/{chunk-SMPLM6K3.js.map → chunk-DG3CXR24.js.map} +1 -1
  59. package/dist/{chunk-LRAAJRE7.cjs → chunk-DO7EED3B.cjs} +154 -154
  60. package/dist/{chunk-LRAAJRE7.cjs.map → chunk-DO7EED3B.cjs.map} +1 -1
  61. package/dist/{chunk-UJDWFDKE.js → chunk-DXKE4YZT.js} +3 -3
  62. package/dist/{chunk-UJDWFDKE.js.map → chunk-DXKE4YZT.js.map} +1 -1
  63. package/dist/{chunk-KQ6GLYFZ.cjs → chunk-ECKIFQSD.cjs} +6 -6
  64. package/dist/{chunk-KQ6GLYFZ.cjs.map → chunk-ECKIFQSD.cjs.map} +1 -1
  65. package/dist/{chunk-4P27Y52M.js → chunk-EPKPHWIL.js} +4 -4
  66. package/dist/{chunk-4P27Y52M.js.map → chunk-EPKPHWIL.js.map} +1 -1
  67. package/dist/{chunk-RIUQP2QS.cjs → chunk-FNSFMM4F.cjs} +5 -5
  68. package/dist/{chunk-RIUQP2QS.cjs.map → chunk-FNSFMM4F.cjs.map} +1 -1
  69. package/dist/{chunk-3Y3ZCDNF.cjs → chunk-FQUSSPXX.cjs} +19 -19
  70. package/dist/{chunk-3Y3ZCDNF.cjs.map → chunk-FQUSSPXX.cjs.map} +1 -1
  71. package/dist/{chunk-ANMX7YDL.cjs → chunk-FSARTLUE.cjs} +4 -4
  72. package/dist/{chunk-ANMX7YDL.cjs.map → chunk-FSARTLUE.cjs.map} +1 -1
  73. package/dist/{chunk-ERACGSDY.cjs → chunk-G42V64UW.cjs} +8 -8
  74. package/dist/{chunk-ERACGSDY.cjs.map → chunk-G42V64UW.cjs.map} +1 -1
  75. package/dist/{chunk-UUI7WXI5.js → chunk-GAI6SRJ3.js} +3 -3
  76. package/dist/{chunk-UUI7WXI5.js.map → chunk-GAI6SRJ3.js.map} +1 -1
  77. package/dist/{chunk-4I6BW3FB.js → chunk-GLRKXJCR.js} +3 -3
  78. package/dist/{chunk-4I6BW3FB.js.map → chunk-GLRKXJCR.js.map} +1 -1
  79. package/dist/{chunk-NPKPCYAT.cjs → chunk-GM376OD6.cjs} +17 -17
  80. package/dist/{chunk-NPKPCYAT.cjs.map → chunk-GM376OD6.cjs.map} +1 -1
  81. package/dist/{chunk-DXEPYK3I.cjs → chunk-HGJHWI7W.cjs} +5 -3
  82. package/dist/chunk-HGJHWI7W.cjs.map +1 -0
  83. package/dist/{chunk-6ZA574PU.cjs → chunk-IIV5GNSK.cjs} +5 -5
  84. package/dist/{chunk-6ZA574PU.cjs.map → chunk-IIV5GNSK.cjs.map} +1 -1
  85. package/dist/{chunk-XPVQI3MM.cjs → chunk-INMDLVUB.cjs} +17 -2
  86. package/dist/chunk-INMDLVUB.cjs.map +1 -0
  87. package/dist/{chunk-RZSSQ7AT.js → chunk-JATLYCS4.js} +3 -3
  88. package/dist/{chunk-RZSSQ7AT.js.map → chunk-JATLYCS4.js.map} +1 -1
  89. package/dist/{chunk-4NB4WOGU.cjs → chunk-JCO62XMU.cjs} +6 -6
  90. package/dist/{chunk-4NB4WOGU.cjs.map → chunk-JCO62XMU.cjs.map} +1 -1
  91. package/dist/{chunk-QR7B6UPR.js → chunk-JN2CL7MK.js} +3 -3
  92. package/dist/{chunk-QR7B6UPR.js.map → chunk-JN2CL7MK.js.map} +1 -1
  93. package/dist/{chunk-FBCDYTWM.js → chunk-JNSSA4YN.js} +3 -3
  94. package/dist/{chunk-FBCDYTWM.js.map → chunk-JNSSA4YN.js.map} +1 -1
  95. package/dist/{chunk-BIQIE3VW.js → chunk-JQAGNAY2.js} +5 -5
  96. package/dist/{chunk-BIQIE3VW.js.map → chunk-JQAGNAY2.js.map} +1 -1
  97. package/dist/{chunk-TOJ56HKQ.cjs → chunk-KD7YD6US.cjs} +8 -8
  98. package/dist/{chunk-TOJ56HKQ.cjs.map → chunk-KD7YD6US.cjs.map} +1 -1
  99. package/dist/{chunk-5LNLB2XT.js → chunk-KSQQBFDQ.js} +3 -3
  100. package/dist/{chunk-5LNLB2XT.js.map → chunk-KSQQBFDQ.js.map} +1 -1
  101. package/dist/{chunk-3NOVISM6.js → chunk-L52HKEUD.js} +3 -3
  102. package/dist/{chunk-3NOVISM6.js.map → chunk-L52HKEUD.js.map} +1 -1
  103. package/dist/{chunk-IXUIOR4K.cjs → chunk-M42FTWY2.cjs} +6 -6
  104. package/dist/{chunk-IXUIOR4K.cjs.map → chunk-M42FTWY2.cjs.map} +1 -1
  105. package/dist/{chunk-32ZCJOSR.cjs → chunk-N7AIZWQS.cjs} +4 -4
  106. package/dist/{chunk-32ZCJOSR.cjs.map → chunk-N7AIZWQS.cjs.map} +1 -1
  107. package/dist/{chunk-P7D7BYFE.js → chunk-NA3NRLX2.js} +4 -4
  108. package/dist/{chunk-P7D7BYFE.js.map → chunk-NA3NRLX2.js.map} +1 -1
  109. package/dist/{chunk-Y424YL55.js → chunk-OLA7OYAS.js} +3 -3
  110. package/dist/{chunk-Y424YL55.js.map → chunk-OLA7OYAS.js.map} +1 -1
  111. package/dist/{chunk-F6W62K4J.js → chunk-OWYWRBED.js} +3 -3
  112. package/dist/{chunk-F6W62K4J.js.map → chunk-OWYWRBED.js.map} +1 -1
  113. package/dist/{chunk-RSJGTWLM.js → chunk-OYLZ5PF2.js} +3 -3
  114. package/dist/{chunk-RSJGTWLM.js.map → chunk-OYLZ5PF2.js.map} +1 -1
  115. package/dist/{chunk-7XC6E4BT.cjs → chunk-PJN4HM2X.cjs} +37 -37
  116. package/dist/{chunk-7XC6E4BT.cjs.map → chunk-PJN4HM2X.cjs.map} +1 -1
  117. package/dist/{chunk-NIO3XVUV.js → chunk-PLBWZW4F.js} +4 -4
  118. package/dist/{chunk-NIO3XVUV.js.map → chunk-PLBWZW4F.js.map} +1 -1
  119. package/dist/{chunk-XI74P5F2.cjs → chunk-PW2E7YBD.cjs} +5 -5
  120. package/dist/{chunk-XI74P5F2.cjs.map → chunk-PW2E7YBD.cjs.map} +1 -1
  121. package/dist/{chunk-HDY7YQFX.js → chunk-Q5APDRMO.js} +3 -3
  122. package/dist/{chunk-HDY7YQFX.js.map → chunk-Q5APDRMO.js.map} +1 -1
  123. package/dist/{chunk-FGLIP6YR.js → chunk-QATEO4KC.js} +4 -4
  124. package/dist/{chunk-FGLIP6YR.js.map → chunk-QATEO4KC.js.map} +1 -1
  125. package/dist/{chunk-254QK722.cjs → chunk-QHCAWDMG.cjs} +18 -7
  126. package/dist/chunk-QHCAWDMG.cjs.map +1 -0
  127. package/dist/{chunk-7HFZL5V5.js → chunk-QNJEDBIN.js} +4 -4
  128. package/dist/{chunk-7HFZL5V5.js.map → chunk-QNJEDBIN.js.map} +1 -1
  129. package/dist/{chunk-AIJYZP7M.js → chunk-R3MJKY63.js} +6 -6
  130. package/dist/{chunk-AIJYZP7M.js.map → chunk-R3MJKY63.js.map} +1 -1
  131. package/dist/{chunk-N54FYWG6.js → chunk-R5P7NAJQ.js} +4 -4
  132. package/dist/{chunk-N54FYWG6.js.map → chunk-R5P7NAJQ.js.map} +1 -1
  133. package/dist/{chunk-BWSZ2BHJ.cjs → chunk-S6457ZNC.cjs} +5 -5
  134. package/dist/{chunk-BWSZ2BHJ.cjs.map → chunk-S6457ZNC.cjs.map} +1 -1
  135. package/dist/{chunk-Z2OOJGHL.cjs → chunk-SCYLVQWA.cjs} +53 -53
  136. package/dist/{chunk-Z2OOJGHL.cjs.map → chunk-SCYLVQWA.cjs.map} +1 -1
  137. package/dist/{chunk-7IRTD4JT.cjs → chunk-SGDNEIJM.cjs} +4 -4
  138. package/dist/{chunk-7IRTD4JT.cjs.map → chunk-SGDNEIJM.cjs.map} +1 -1
  139. package/dist/{chunk-4JXO5JTE.js → chunk-SNAMNKFH.js} +17 -2
  140. package/dist/chunk-SNAMNKFH.js.map +1 -0
  141. package/dist/{chunk-GW4RFJZ5.js → chunk-TUYWCUKH.js} +18 -7
  142. package/dist/chunk-TUYWCUKH.js.map +1 -0
  143. package/dist/{chunk-CLQW724U.cjs → chunk-TXB3UHIO.cjs} +9 -9
  144. package/dist/{chunk-CLQW724U.cjs.map → chunk-TXB3UHIO.cjs.map} +1 -1
  145. package/dist/{chunk-4RI3CQGE.js → chunk-ULEX7OOJ.js} +4 -4
  146. package/dist/{chunk-4RI3CQGE.js.map → chunk-ULEX7OOJ.js.map} +1 -1
  147. package/dist/{chunk-KDW6BD4O.cjs → chunk-UVVZD3AS.cjs} +4 -4
  148. package/dist/{chunk-KDW6BD4O.cjs.map → chunk-UVVZD3AS.cjs.map} +1 -1
  149. package/dist/{chunk-MA3Y6AYA.cjs → chunk-V2KSJLUL.cjs} +8 -8
  150. package/dist/{chunk-MA3Y6AYA.cjs.map → chunk-V2KSJLUL.cjs.map} +1 -1
  151. package/dist/{chunk-SW2E7XKY.cjs → chunk-VIVS44IG.cjs} +9 -9
  152. package/dist/{chunk-SW2E7XKY.cjs.map → chunk-VIVS44IG.cjs.map} +1 -1
  153. package/dist/{chunk-GVM6DTR5.js → chunk-VP3XNLUL.js} +5 -3
  154. package/dist/chunk-VP3XNLUL.js.map +1 -0
  155. package/dist/{chunk-IGDO62KR.cjs → chunk-VVKUYQER.cjs} +5 -5
  156. package/dist/{chunk-IGDO62KR.cjs.map → chunk-VVKUYQER.cjs.map} +1 -1
  157. package/dist/{chunk-BJ6ABRSQ.cjs → chunk-WG2ANSDG.cjs} +6 -6
  158. package/dist/{chunk-BJ6ABRSQ.cjs.map → chunk-WG2ANSDG.cjs.map} +1 -1
  159. package/dist/{chunk-WFBUBT54.js → chunk-WX2XB6FP.js} +3 -3
  160. package/dist/{chunk-WFBUBT54.js.map → chunk-WX2XB6FP.js.map} +1 -1
  161. package/dist/{chunk-7QW6TU4X.js → chunk-YCPWQWQQ.js} +3 -3
  162. package/dist/{chunk-7QW6TU4X.js.map → chunk-YCPWQWQQ.js.map} +1 -1
  163. package/dist/{chunk-DSQCYX7L.js → chunk-YSIFPHLX.js} +7 -7
  164. package/dist/{chunk-DSQCYX7L.js.map → chunk-YSIFPHLX.js.map} +1 -1
  165. package/dist/{chunk-2X54ZLT6.js → chunk-ZFJJMDV3.js} +4 -4
  166. package/dist/{chunk-2X54ZLT6.js.map → chunk-ZFJJMDV3.js.map} +1 -1
  167. package/dist/{chunk-PYI2IWNX.cjs → chunk-ZOSM6D7F.cjs} +4 -4
  168. package/dist/{chunk-PYI2IWNX.cjs.map → chunk-ZOSM6D7F.cjs.map} +1 -1
  169. package/dist/components/ActionPlan/index.cjs +6 -6
  170. package/dist/components/ActionPlan/index.js +4 -4
  171. package/dist/components/ActivityFeed/index.cjs +6 -6
  172. package/dist/components/ActivityFeed/index.js +4 -4
  173. package/dist/components/AlertDialog/index.cjs +7 -7
  174. package/dist/components/AlertDialog/index.js +3 -3
  175. package/dist/components/AssociationList/index.cjs +6 -6
  176. package/dist/components/AssociationList/index.js +4 -4
  177. package/dist/components/Button/index.cjs +4 -4
  178. package/dist/components/Button/index.d.cts +1 -1
  179. package/dist/components/Button/index.d.ts +1 -1
  180. package/dist/components/Button/index.js +2 -2
  181. package/dist/components/CalendarView/index.cjs +5 -5
  182. package/dist/components/CalendarView/index.js +3 -3
  183. package/dist/components/CustomizableDashboard/index.cjs +10 -10
  184. package/dist/components/CustomizableDashboard/index.js +3 -3
  185. package/dist/components/EmailEditor/index.cjs +14 -14
  186. package/dist/components/EmailEditor/index.js +5 -5
  187. package/dist/components/FieldHistory/index.cjs +6 -6
  188. package/dist/components/FieldHistory/index.js +4 -4
  189. package/dist/components/FloatingWindow/index.cjs +5 -5
  190. package/dist/components/FloatingWindow/index.js +3 -3
  191. package/dist/components/ListView/index.cjs +5 -5
  192. package/dist/components/ListView/index.js +3 -3
  193. package/dist/components/Markdown/index.cjs +17 -17
  194. package/dist/components/Markdown/index.js +8 -8
  195. package/dist/components/MediaEditor/index.cjs +12 -12
  196. package/dist/components/MediaEditor/index.d.cts +13 -0
  197. package/dist/components/MediaEditor/index.d.ts +13 -0
  198. package/dist/components/MediaEditor/index.js +7 -7
  199. package/dist/components/MediaFeed/index.cjs +6 -6
  200. package/dist/components/MediaFeed/index.js +5 -5
  201. package/dist/components/MediaPlayer/index.cjs +7 -7
  202. package/dist/components/MediaPlayer/index.js +4 -4
  203. package/dist/components/MegaMenu/index.cjs +6 -6
  204. package/dist/components/MegaMenu/index.js +3 -3
  205. package/dist/components/RadialExplorer/index.cjs +4 -4
  206. package/dist/components/RadialExplorer/index.js +3 -3
  207. package/dist/components/RecordHeader/index.cjs +5 -5
  208. package/dist/components/RecordHeader/index.d.cts +1 -1
  209. package/dist/components/RecordHeader/index.d.ts +1 -1
  210. package/dist/components/RecordHeader/index.js +3 -3
  211. package/dist/components/RichTextEditor/index.cjs +6 -6
  212. package/dist/components/RichTextEditor/index.js +3 -3
  213. package/dist/components/SectionSpyNav/index.cjs +4 -4
  214. package/dist/components/SectionSpyNav/index.js +3 -3
  215. package/dist/components/SuperChat/index.cjs +9 -9
  216. package/dist/components/SuperChat/index.js +5 -5
  217. package/dist/components/Textarea/index.cjs +7 -7
  218. package/dist/components/Textarea/index.js +4 -4
  219. package/dist/components/TranscriptView/index.cjs +2 -2
  220. package/dist/components/TranscriptView/index.d.cts +14 -1
  221. package/dist/components/TranscriptView/index.d.ts +14 -1
  222. package/dist/components/TranscriptView/index.js +1 -1
  223. package/dist/components/ViewSet/index.cjs +6 -6
  224. package/dist/components/ViewSet/index.js +5 -5
  225. package/dist/datavis.cjs +3 -3
  226. package/dist/datavis.js +2 -2
  227. package/dist/deck.cjs +15 -15
  228. package/dist/deck.js +2 -2
  229. package/dist/esheet.cjs +130 -130
  230. package/dist/esheet.js +8 -8
  231. package/dist/hooks/index.cjs +12 -12
  232. package/dist/hooks/index.d.cts +15 -2
  233. package/dist/hooks/index.d.ts +15 -2
  234. package/dist/hooks/index.js +3 -3
  235. package/dist/index.cjs +2056 -418
  236. package/dist/index.cjs.map +1 -1
  237. package/dist/index.d.cts +178 -87
  238. package/dist/index.d.ts +178 -87
  239. package/dist/index.js +1693 -55
  240. package/dist/index.js.map +1 -1
  241. package/dist/{model-Y7WRIGGA.cjs → model-NPW2JMHZ.cjs} +20 -20
  242. package/dist/{model-Y7WRIGGA.cjs.map → model-NPW2JMHZ.cjs.map} +1 -1
  243. package/dist/{model-WFFZRQMY.js → model-SG5H3TCJ.js} +6 -6
  244. package/dist/{model-WFFZRQMY.js.map → model-SG5H3TCJ.js.map} +1 -1
  245. package/dist/org-chart.cjs +4 -4
  246. package/dist/org-chart.js +2 -2
  247. package/dist/styles.css +1 -1
  248. package/dist/tailwind-preset.cjs +4 -4
  249. package/dist/tailwind-preset.js +1 -1
  250. package/dist/templates.cjs +38 -38
  251. package/dist/templates.js +3 -3
  252. package/package.json +1 -1
  253. package/dist/CsvBlock-CFXSDPBI.js +0 -9
  254. package/dist/CsvBlock-RGO7JXHJ.cjs +0 -18
  255. package/dist/HtmlPreviewBlock-VBYXCXVT.cjs +0 -18
  256. package/dist/HtmlPreviewBlock-Z2GCK325.js +0 -9
  257. package/dist/MermaidBlock-I2R2BQOX.cjs +0 -18
  258. package/dist/MermaidBlock-XCAK7IA5.js +0 -9
  259. package/dist/SurveyBlock-KI5JOWCL.js +0 -9
  260. package/dist/SurveyBlock-UKSGISRT.cjs +0 -18
  261. package/dist/chunk-254QK722.cjs.map +0 -1
  262. package/dist/chunk-4JXO5JTE.js.map +0 -1
  263. package/dist/chunk-6CGM5H4J.js.map +0 -1
  264. package/dist/chunk-DXEPYK3I.cjs.map +0 -1
  265. package/dist/chunk-GVM6DTR5.js.map +0 -1
  266. package/dist/chunk-GW4RFJZ5.js.map +0 -1
  267. package/dist/chunk-NUFUV43P.cjs.map +0 -1
  268. package/dist/chunk-XPVQI3MM.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/MegaMenu/MegaMenu.tsx"],"names":[],"mappings":"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","file":"chunk-4I6BW3FB.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { ArrowRight, ChevronDown, ChevronRight } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { useDirection } from '../../hooks/useDirection';\nimport { buttonVariants } from '../Button';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type MegaMenuTone = 'primary' | 'accent' | 'neutral';\n\n/** The right-column feature panel. */\nexport interface MegaMenuFeatured {\n /** Small caps label, e.g. \"Whitepaper\". */\n eyebrow: string;\n title: string;\n description?: string;\n ctaLabel: string;\n ctaHref: string;\n /** Icon tile above the title. Ignored when `media` is given. */\n icon?: React.ReactNode;\n /** Rich media in place of the icon tile — a `VideoCard variant=\"plate\"`, an image. */\n media?: React.ReactNode;\n /** Panel colour. Default `primary`. */\n tone?: MegaMenuTone;\n}\n\nexport interface MegaMenuItem {\n label: string;\n href: string;\n description?: string;\n icon?: React.ReactNode;\n /**\n * Feature panel to show while this item is hovered/focused. Falls back to\n * the menu-level `featured` when unset — this is what makes the right\n * column contextual instead of static.\n */\n featured?: MegaMenuFeatured;\n external?: boolean;\n}\n\nexport interface MegaMenuGroup {\n label: string;\n /** Makes the group heading a link. */\n href?: string;\n items: MegaMenuItem[];\n}\n\nexport interface MegaMenuConfig {\n /** Stable id — used by `MegaMenuBar` to track the open menu. */\n key: string;\n /** Trigger label. */\n label: string;\n /** Trigger destination. Omit for a pure toggle. */\n href?: string;\n /** Heading inside the panel, e.g. \"Resources & insight\". */\n heading?: string;\n /** Flat 2-column grid of items (icon + label + description). */\n items?: MegaMenuItem[];\n /** Grouped columns of compact items. Takes precedence over `items`. */\n groups?: MegaMenuGroup[];\n /** \"Browse all …\" footer link. */\n allLabel?: string;\n allHref?: string;\n /** Footer CTA button. */\n ctaLabel?: string;\n ctaHref?: string;\n /** Default right-column feature panel. */\n featured?: MegaMenuFeatured;\n}\n\nexport interface MegaMenuProps {\n menu: MegaMenuConfig;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Current pathname — marks the matching item/group with `aria-current`. */\n currentPath?: string;\n /** Trigger colours for light (on dark header) or dark (on light header) chrome. */\n variant?: 'light' | 'dark';\n /**\n * Override how the feature panel is chosen. Receives the hovered item (or\n * `null` when none) and the menu; return `undefined` to hide the column.\n * Default: `item?.featured ?? menu.featured`.\n */\n resolveFeatured?: (\n item: MegaMenuItem | null,\n menu: MegaMenuConfig\n ) => MegaMenuFeatured | undefined;\n /** Called after any in-panel navigation (close mobile drawers, etc.). */\n onNavigate?: () => void;\n /** Viewport width below which hover-open is disabled (touch/mobile). Default 900. */\n hoverMinWidth?: number;\n className?: string;\n}\n\nconst OPEN_DELAY_MS = 70;\nconst CLOSE_DELAY_MS = 150;\n\n/**\n * Normalize an href for `currentPath` comparison (strips hash, query and\n * trailing slashes). Shared with `SiteHeader`'s mobile drawer so desktop and\n * mobile menu links agree on `aria-current`.\n */\nexport function normalizePath(href: string): string {\n const path = href.split('#')[0].split('?')[0];\n // Trim trailing slashes with a scan: an anchored `\\/+$` is CodeQL's canonical\n // polynomial-backtracking pattern on caller-supplied hrefs full of slashes.\n let end = path.length;\n while (end > 0 && path[end - 1] === '/') end--;\n return path.slice(0, end) || '/';\n}\n\n// =============================================================================\n// MegaMenu\n// =============================================================================\n\n/**\n * A hover/click mega-menu: trigger link + chevron toggle, a panel with a\n * heading, a 2-column item grid (or grouped columns), a footer with\n * \"Browse all\" + CTA, and a right-column feature panel that **follows the\n * hovered item** (`item.featured`) before falling back to the menu default.\n * Marks the current route with `aria-current`. Ported from the Enterprise\n * Health frontdoor nav.\n *\n * Controlled — pair with `MegaMenuBar` to keep one menu open at a time.\n */\nexport function MegaMenu({\n menu,\n open,\n onOpenChange,\n currentPath,\n variant = 'dark',\n resolveFeatured = (item, m) => item?.featured ?? m.featured,\n onNavigate,\n hoverMinWidth = 900,\n className,\n}: MegaMenuProps) {\n const rootRef = React.useRef<HTMLDivElement>(null);\n const panelRef = React.useRef<HTMLDivElement>(null);\n const triggerRef = React.useRef<HTMLElement>(null);\n const openTimer = React.useRef<number | null>(null);\n const closeTimer = React.useRef<number | null>(null);\n const [left, setLeft] = React.useState<number | undefined>();\n const [hovered, setHovered] = React.useState<MegaMenuItem | null>(null);\n const panelId = React.useId();\n\n const isHoverViewport = () =>\n typeof window !== 'undefined' && window.innerWidth >= hoverMinWidth;\n\n const clearTimers = React.useCallback(() => {\n if (openTimer.current !== null) window.clearTimeout(openTimer.current);\n if (closeTimer.current !== null) window.clearTimeout(closeTimer.current);\n openTimer.current = closeTimer.current = null;\n }, []);\n\n const requestOpen = React.useCallback(() => {\n clearTimers();\n openTimer.current = window.setTimeout(\n () => onOpenChange(true),\n OPEN_DELAY_MS\n );\n }, [clearTimers, onOpenChange]);\n\n const requestClose = React.useCallback(() => {\n clearTimers();\n closeTimer.current = window.setTimeout(\n () => onOpenChange(false),\n CLOSE_DELAY_MS\n );\n }, [clearTimers, onOpenChange]);\n\n // Clamp the panel inside the viewport (it's absolutely positioned under the\n // trigger). Anchoring is logical: the panel's inline-start edge aligns with\n // the trigger's — left edge in LTR, right edge in RTL — before clamping.\n // `useDirection` is reactive, so an open panel re-clamps when `dir` changes.\n const direction = useDirection(rootRef);\n const position = React.useCallback(() => {\n const root = rootRef.current;\n const panel = panelRef.current;\n if (!root || !panel || !isHoverViewport()) {\n setLeft(undefined);\n return;\n }\n const rect = root.getBoundingClientRect();\n const pad = 16;\n const vw = document.documentElement.clientWidth;\n const desired =\n direction === 'rtl' ? rect.right - panel.offsetWidth : rect.left;\n const clamped = Math.min(\n Math.max(desired, pad),\n Math.max(pad, vw - pad - panel.offsetWidth)\n );\n setLeft(clamped - rect.left);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [hoverMinWidth, direction]);\n\n const curPath = currentPath ? normalizePath(currentPath) : null;\n const isCurrent = (href: string) =>\n curPath !== null && normalizePath(href) === curPath;\n const featured = resolveFeatured(hovered, menu);\n\n React.useEffect(() => {\n if (open) position();\n else setHovered(null);\n // `featured` is a dep because the feature column swaps the 600px layout\n // for the 880px one after open — the wider panel must be re-clamped or a\n // menu opened near the viewport edge overflows it.\n }, [open, position, featured]);\n\n React.useEffect(() => {\n window.addEventListener('resize', position);\n return () => window.removeEventListener('resize', position);\n }, [position]);\n\n React.useEffect(() => clearTimers, [clearTimers]);\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Escape' && open) {\n e.stopPropagation();\n clearTimers();\n onOpenChange(false);\n triggerRef.current?.focus();\n }\n };\n\n const triggerClass = cn(\n 'inline-flex items-center rounded-lg px-3 py-2 text-sm font-medium transition-colors',\n variant === 'light'\n ? 'text-white/90 hover:bg-white/10 hover:text-white'\n : 'text-foreground/80 hover:bg-muted hover:text-foreground',\n open &&\n (variant === 'light'\n ? 'bg-white/10 text-white'\n : 'bg-muted text-foreground')\n );\n\n const navigate = () => {\n onOpenChange(false);\n onNavigate?.();\n };\n\n return (\n // Hover/focus delegation region only — the trigger, toggle and links inside are the interactive elements.\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n ref={rootRef}\n data-slot=\"mega-menu\"\n data-state={open ? 'open' : 'closed'}\n className={cn('relative', className)}\n onMouseEnter={() => isHoverViewport() && requestOpen()}\n onMouseLeave={() => isHoverViewport() && requestClose()}\n onFocusCapture={() => {\n if (!isHoverViewport()) return;\n clearTimers();\n onOpenChange(true);\n }}\n onBlurCapture={(e) => {\n if (!isHoverViewport()) return;\n if (!rootRef.current?.contains(e.relatedTarget as Node | null))\n requestClose();\n }}\n onKeyDown={onKeyDown}\n >\n <div className=\"flex items-center\">\n {menu.href ? (\n <a\n ref={triggerRef as React.RefObject<HTMLAnchorElement>}\n href={menu.href}\n className={triggerClass}\n aria-haspopup=\"true\"\n aria-expanded={open}\n aria-controls={panelId}\n aria-current={isCurrent(menu.href) ? 'page' : undefined}\n onClick={navigate}\n >\n {menu.label}\n </a>\n ) : (\n <button\n ref={triggerRef as React.RefObject<HTMLButtonElement>}\n type=\"button\"\n className={triggerClass}\n aria-haspopup=\"true\"\n aria-expanded={open}\n aria-controls={panelId}\n onClick={() => {\n clearTimers();\n onOpenChange(!open);\n }}\n >\n {menu.label}\n </button>\n )}\n <button\n type=\"button\"\n aria-label={`Toggle ${menu.label} menu`}\n aria-expanded={open}\n aria-controls={panelId}\n onClick={() => {\n clearTimers();\n onOpenChange(!open);\n }}\n className={cn(\n '-ms-1 rounded-md p-1 transition-transform',\n variant === 'light'\n ? 'text-white/70 hover:text-white'\n : 'text-muted-foreground hover:text-foreground',\n open && 'rotate-180'\n )}\n >\n <ChevronDown size={16} aria-hidden=\"true\" />\n </button>\n </div>\n\n <div\n id={panelId}\n ref={panelRef}\n role=\"region\"\n aria-label={menu.label}\n data-slot=\"mega-menu-panel\"\n // rtl-ignore -- viewport-clamp coordinate; math above is direction-aware\n style={{ left }}\n className={cn(\n 'border-border bg-card text-card-foreground absolute top-full z-50 mt-3 origin-top-left rounded-2xl border shadow-xl rtl:origin-top-right',\n 'transition-[opacity,transform] duration-200',\n open\n ? 'visible translate-y-0 opacity-100'\n : 'pointer-events-none invisible -translate-y-1 opacity-0',\n featured\n ? 'grid w-[min(880px,calc(100vw-2rem))] grid-cols-[1fr_280px]'\n : 'w-[min(600px,calc(100vw-2rem))]'\n )}\n >\n <div className=\"p-6\">\n {menu.heading && (\n <p className=\"text-muted-foreground mb-4 text-[11px] font-bold tracking-[0.14em] uppercase\">\n {menu.heading}\n </p>\n )}\n\n {menu.groups ? (\n <div className=\"grid gap-6 sm:grid-cols-2 lg:grid-cols-3\">\n {menu.groups.map((g) => (\n <div key={g.label}>\n {g.href ? (\n <a\n href={g.href}\n aria-current={isCurrent(g.href) ? 'page' : undefined}\n onClick={navigate}\n className=\"text-foreground hover:text-primary-700 dark:hover:text-primary-300 mb-2 inline-flex items-center gap-1 text-sm font-semibold\"\n >\n {g.label}\n <ChevronRight\n size={14}\n aria-hidden=\"true\"\n className=\"rtl:-scale-x-100\"\n />\n </a>\n ) : (\n <p className=\"text-foreground mb-2 text-sm font-semibold\">\n {g.label}\n </p>\n )}\n <ul className=\"space-y-0.5\">\n {g.items.map((it) => (\n <li key={it.href}>\n <ItemLink\n item={it}\n compact\n current={isCurrent(it.href)}\n onHover={setHovered}\n onNavigate={navigate}\n />\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"grid gap-1 sm:grid-cols-2\">\n {menu.items?.map((it) => (\n <ItemLink\n key={it.href}\n item={it}\n current={isCurrent(it.href)}\n onHover={setHovered}\n onNavigate={navigate}\n />\n ))}\n </div>\n )}\n\n {(menu.allHref || menu.ctaHref) && (\n <div className=\"border-border mt-5 flex items-center justify-between gap-4 border-t pt-4\">\n {menu.allHref ? (\n <a\n href={menu.allHref}\n onClick={navigate}\n className=\"text-foreground hover:text-primary-700 dark:hover:text-primary-300 inline-flex items-center gap-1.5 text-sm font-semibold\"\n >\n {menu.allLabel ?? 'Browse all'}\n <ArrowRight\n size={16}\n aria-hidden=\"true\"\n className=\"rtl:-scale-x-100\"\n />\n </a>\n ) : (\n <span />\n )}\n {menu.ctaHref && (\n <a\n href={menu.ctaHref}\n onClick={navigate}\n className={buttonVariants({ size: 'sm', effect: 'sheen' })}\n >\n {menu.ctaLabel ?? 'Get started'}\n </a>\n )}\n </div>\n )}\n </div>\n\n {featured && (\n <FeaturedPanel featured={featured} onNavigate={navigate} />\n )}\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// Pieces\n// =============================================================================\n\nfunction ItemLink({\n item,\n compact,\n current,\n onHover,\n onNavigate,\n}: {\n item: MegaMenuItem;\n compact?: boolean;\n current: boolean;\n onHover: (item: MegaMenuItem | null) => void;\n onNavigate: () => void;\n}) {\n return (\n <a\n href={item.href}\n target={item.external ? '_blank' : undefined}\n rel={item.external ? 'noopener noreferrer' : undefined}\n aria-current={current ? 'page' : undefined}\n data-slot=\"mega-menu-item\"\n onClick={onNavigate}\n onMouseEnter={() => onHover(item)}\n onFocus={() => onHover(item)}\n className={cn(\n 'group flex items-start gap-3 rounded-xl text-start transition-colors',\n compact ? 'px-2 py-1.5' : 'p-3',\n 'hover:bg-primary-500/10 focus-visible:bg-primary-500/10 focus-visible:outline-none',\n current && 'bg-primary-500/10'\n )}\n >\n {item.icon && (\n <span\n className={cn(\n 'inline-flex shrink-0 items-center justify-center rounded-lg transition-colors',\n compact\n ? 'h-7 w-7 [&_svg]:h-4 [&_svg]:w-4'\n : 'h-10 w-10 [&_svg]:h-5 [&_svg]:w-5',\n 'bg-muted text-foreground/70 group-hover:bg-primary-800 group-hover:text-white',\n current && 'bg-primary-800 text-white'\n )}\n >\n {item.icon}\n </span>\n )}\n <span className=\"min-w-0\">\n <span\n className={cn(\n 'text-foreground group-hover:text-primary-800 dark:group-hover:text-primary-200 block font-semibold',\n compact ? 'text-sm' : 'text-base'\n )}\n >\n {item.label}\n </span>\n {!compact && item.description && (\n <span className=\"text-muted-foreground mt-0.5 block text-sm leading-snug\">\n {item.description}\n </span>\n )}\n </span>\n </a>\n );\n}\n\nconst TONE: Record<MegaMenuTone, string> = {\n primary: 'bg-gradient-to-br from-primary-800 to-primary-950 text-white',\n accent:\n 'text-white [background:linear-gradient(160deg,color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-700))_70%,#000)_0%,var(--mieweb-primary-950)_100%)]',\n neutral: 'bg-muted text-foreground',\n};\n\nfunction FeaturedPanel({\n featured,\n onNavigate,\n}: {\n featured: MegaMenuFeatured;\n onNavigate: () => void;\n}) {\n const tone = featured.tone ?? 'primary';\n const onDark = tone !== 'neutral';\n // `key` re-mounts the panel so swapping between items replays the fade-in.\n // A `div`, not `aside`: a complementary landmark nested inside the menu\n // region violates axe landmark-complementary-is-top-level.\n return (\n <div\n data-slot=\"mega-menu-featured\"\n key={featured.title}\n className={cn(\n 'flex flex-col rounded-e-2xl p-6 motion-safe:animate-[mie-fade-in_0.2s_ease-out]',\n TONE[tone]\n )}\n >\n <p\n className={cn(\n 'text-[11px] font-bold tracking-[0.14em] uppercase',\n onDark ? 'text-white/70' : 'text-muted-foreground'\n )}\n >\n {featured.eyebrow}\n </p>\n <div className=\"mt-4\">\n {featured.media ??\n (featured.icon && (\n <span\n className={cn(\n 'inline-flex h-14 w-14 items-center justify-center rounded-xl [&_svg]:h-7 [&_svg]:w-7',\n onDark ? 'bg-white/15 text-white' : 'bg-card text-foreground'\n )}\n >\n {featured.icon}\n </span>\n ))}\n </div>\n <p className=\"mt-4 text-xl leading-tight font-semibold\">\n {featured.title}\n </p>\n {featured.description && (\n <p\n className={cn(\n 'mt-2 text-sm leading-snug',\n onDark ? 'text-white/80' : 'text-muted-foreground'\n )}\n >\n {featured.description}\n </p>\n )}\n <div className=\"mt-auto pt-5\">\n <a\n href={featured.ctaHref}\n onClick={onNavigate}\n className={cn(\n buttonVariants({ variant: 'outline', effect: 'sheen' }),\n onDark &&\n 'border-white/40 text-white hover:border-white hover:bg-white/10 hover:text-white dark:border-white/40 dark:text-white dark:hover:border-white dark:hover:bg-white/10'\n )}\n >\n {featured.ctaLabel}\n <ArrowRight\n size={16}\n aria-hidden=\"true\"\n className=\"rtl:-scale-x-100\"\n />\n </a>\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// MegaMenuBar — keeps one menu open at a time\n// =============================================================================\n\nexport interface MegaMenuBarProps extends Pick<\n MegaMenuProps,\n 'currentPath' | 'variant' | 'resolveFeatured' | 'onNavigate' | 'hoverMinWidth'\n> {\n menus: MegaMenuConfig[];\n className?: string;\n 'aria-label'?: string;\n}\n\n/** A row of `MegaMenu` triggers sharing one open-state so only one panel shows. */\nexport function MegaMenuBar({\n menus,\n className,\n 'aria-label': ariaLabel = 'Main navigation',\n ...rest\n}: MegaMenuBarProps) {\n const [openKey, setOpenKey] = React.useState<string | null>(null);\n return (\n <nav\n data-slot=\"mega-menu-bar\"\n aria-label={ariaLabel}\n className={cn('flex items-center gap-1', className)}\n >\n {menus.map((m) => (\n <MegaMenu\n key={m.key}\n menu={m}\n open={openKey === m.key}\n onOpenChange={(o) =>\n setOpenKey(o ? m.key : openKey === m.key ? null : openKey)\n }\n {...rest}\n />\n ))}\n </nav>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/MegaMenu/MegaMenu.tsx"],"names":[],"mappings":"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","file":"chunk-GLRKXJCR.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { ArrowRight, ChevronDown, ChevronRight } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { useDirection } from '../../hooks/useDirection';\nimport { buttonVariants } from '../Button';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type MegaMenuTone = 'primary' | 'accent' | 'neutral';\n\n/** The right-column feature panel. */\nexport interface MegaMenuFeatured {\n /** Small caps label, e.g. \"Whitepaper\". */\n eyebrow: string;\n title: string;\n description?: string;\n ctaLabel: string;\n ctaHref: string;\n /** Icon tile above the title. Ignored when `media` is given. */\n icon?: React.ReactNode;\n /** Rich media in place of the icon tile — a `VideoCard variant=\"plate\"`, an image. */\n media?: React.ReactNode;\n /** Panel colour. Default `primary`. */\n tone?: MegaMenuTone;\n}\n\nexport interface MegaMenuItem {\n label: string;\n href: string;\n description?: string;\n icon?: React.ReactNode;\n /**\n * Feature panel to show while this item is hovered/focused. Falls back to\n * the menu-level `featured` when unset — this is what makes the right\n * column contextual instead of static.\n */\n featured?: MegaMenuFeatured;\n external?: boolean;\n}\n\nexport interface MegaMenuGroup {\n label: string;\n /** Makes the group heading a link. */\n href?: string;\n items: MegaMenuItem[];\n}\n\nexport interface MegaMenuConfig {\n /** Stable id — used by `MegaMenuBar` to track the open menu. */\n key: string;\n /** Trigger label. */\n label: string;\n /** Trigger destination. Omit for a pure toggle. */\n href?: string;\n /** Heading inside the panel, e.g. \"Resources & insight\". */\n heading?: string;\n /** Flat 2-column grid of items (icon + label + description). */\n items?: MegaMenuItem[];\n /** Grouped columns of compact items. Takes precedence over `items`. */\n groups?: MegaMenuGroup[];\n /** \"Browse all …\" footer link. */\n allLabel?: string;\n allHref?: string;\n /** Footer CTA button. */\n ctaLabel?: string;\n ctaHref?: string;\n /** Default right-column feature panel. */\n featured?: MegaMenuFeatured;\n}\n\nexport interface MegaMenuProps {\n menu: MegaMenuConfig;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Current pathname — marks the matching item/group with `aria-current`. */\n currentPath?: string;\n /** Trigger colours for light (on dark header) or dark (on light header) chrome. */\n variant?: 'light' | 'dark';\n /**\n * Override how the feature panel is chosen. Receives the hovered item (or\n * `null` when none) and the menu; return `undefined` to hide the column.\n * Default: `item?.featured ?? menu.featured`.\n */\n resolveFeatured?: (\n item: MegaMenuItem | null,\n menu: MegaMenuConfig\n ) => MegaMenuFeatured | undefined;\n /** Called after any in-panel navigation (close mobile drawers, etc.). */\n onNavigate?: () => void;\n /** Viewport width below which hover-open is disabled (touch/mobile). Default 900. */\n hoverMinWidth?: number;\n className?: string;\n}\n\nconst OPEN_DELAY_MS = 70;\nconst CLOSE_DELAY_MS = 150;\n\n/**\n * Normalize an href for `currentPath` comparison (strips hash, query and\n * trailing slashes). Shared with `SiteHeader`'s mobile drawer so desktop and\n * mobile menu links agree on `aria-current`.\n */\nexport function normalizePath(href: string): string {\n const path = href.split('#')[0].split('?')[0];\n // Trim trailing slashes with a scan: an anchored `\\/+$` is CodeQL's canonical\n // polynomial-backtracking pattern on caller-supplied hrefs full of slashes.\n let end = path.length;\n while (end > 0 && path[end - 1] === '/') end--;\n return path.slice(0, end) || '/';\n}\n\n// =============================================================================\n// MegaMenu\n// =============================================================================\n\n/**\n * A hover/click mega-menu: trigger link + chevron toggle, a panel with a\n * heading, a 2-column item grid (or grouped columns), a footer with\n * \"Browse all\" + CTA, and a right-column feature panel that **follows the\n * hovered item** (`item.featured`) before falling back to the menu default.\n * Marks the current route with `aria-current`. Ported from the Enterprise\n * Health frontdoor nav.\n *\n * Controlled — pair with `MegaMenuBar` to keep one menu open at a time.\n */\nexport function MegaMenu({\n menu,\n open,\n onOpenChange,\n currentPath,\n variant = 'dark',\n resolveFeatured = (item, m) => item?.featured ?? m.featured,\n onNavigate,\n hoverMinWidth = 900,\n className,\n}: MegaMenuProps) {\n const rootRef = React.useRef<HTMLDivElement>(null);\n const panelRef = React.useRef<HTMLDivElement>(null);\n const triggerRef = React.useRef<HTMLElement>(null);\n const openTimer = React.useRef<number | null>(null);\n const closeTimer = React.useRef<number | null>(null);\n const [left, setLeft] = React.useState<number | undefined>();\n const [hovered, setHovered] = React.useState<MegaMenuItem | null>(null);\n const panelId = React.useId();\n\n const isHoverViewport = () =>\n typeof window !== 'undefined' && window.innerWidth >= hoverMinWidth;\n\n const clearTimers = React.useCallback(() => {\n if (openTimer.current !== null) window.clearTimeout(openTimer.current);\n if (closeTimer.current !== null) window.clearTimeout(closeTimer.current);\n openTimer.current = closeTimer.current = null;\n }, []);\n\n const requestOpen = React.useCallback(() => {\n clearTimers();\n openTimer.current = window.setTimeout(\n () => onOpenChange(true),\n OPEN_DELAY_MS\n );\n }, [clearTimers, onOpenChange]);\n\n const requestClose = React.useCallback(() => {\n clearTimers();\n closeTimer.current = window.setTimeout(\n () => onOpenChange(false),\n CLOSE_DELAY_MS\n );\n }, [clearTimers, onOpenChange]);\n\n // Clamp the panel inside the viewport (it's absolutely positioned under the\n // trigger). Anchoring is logical: the panel's inline-start edge aligns with\n // the trigger's — left edge in LTR, right edge in RTL — before clamping.\n // `useDirection` is reactive, so an open panel re-clamps when `dir` changes.\n const direction = useDirection(rootRef);\n const position = React.useCallback(() => {\n const root = rootRef.current;\n const panel = panelRef.current;\n if (!root || !panel || !isHoverViewport()) {\n setLeft(undefined);\n return;\n }\n const rect = root.getBoundingClientRect();\n const pad = 16;\n const vw = document.documentElement.clientWidth;\n const desired =\n direction === 'rtl' ? rect.right - panel.offsetWidth : rect.left;\n const clamped = Math.min(\n Math.max(desired, pad),\n Math.max(pad, vw - pad - panel.offsetWidth)\n );\n setLeft(clamped - rect.left);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [hoverMinWidth, direction]);\n\n const curPath = currentPath ? normalizePath(currentPath) : null;\n const isCurrent = (href: string) =>\n curPath !== null && normalizePath(href) === curPath;\n const featured = resolveFeatured(hovered, menu);\n\n React.useEffect(() => {\n if (open) position();\n else setHovered(null);\n // `featured` is a dep because the feature column swaps the 600px layout\n // for the 880px one after open — the wider panel must be re-clamped or a\n // menu opened near the viewport edge overflows it.\n }, [open, position, featured]);\n\n React.useEffect(() => {\n window.addEventListener('resize', position);\n return () => window.removeEventListener('resize', position);\n }, [position]);\n\n React.useEffect(() => clearTimers, [clearTimers]);\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Escape' && open) {\n e.stopPropagation();\n clearTimers();\n onOpenChange(false);\n triggerRef.current?.focus();\n }\n };\n\n const triggerClass = cn(\n 'inline-flex items-center rounded-lg px-3 py-2 text-sm font-medium transition-colors',\n variant === 'light'\n ? 'text-white/90 hover:bg-white/10 hover:text-white'\n : 'text-foreground/80 hover:bg-muted hover:text-foreground',\n open &&\n (variant === 'light'\n ? 'bg-white/10 text-white'\n : 'bg-muted text-foreground')\n );\n\n const navigate = () => {\n onOpenChange(false);\n onNavigate?.();\n };\n\n return (\n // Hover/focus delegation region only — the trigger, toggle and links inside are the interactive elements.\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n ref={rootRef}\n data-slot=\"mega-menu\"\n data-state={open ? 'open' : 'closed'}\n className={cn('relative', className)}\n onMouseEnter={() => isHoverViewport() && requestOpen()}\n onMouseLeave={() => isHoverViewport() && requestClose()}\n onFocusCapture={() => {\n if (!isHoverViewport()) return;\n clearTimers();\n onOpenChange(true);\n }}\n onBlurCapture={(e) => {\n if (!isHoverViewport()) return;\n if (!rootRef.current?.contains(e.relatedTarget as Node | null))\n requestClose();\n }}\n onKeyDown={onKeyDown}\n >\n <div className=\"flex items-center\">\n {menu.href ? (\n <a\n ref={triggerRef as React.RefObject<HTMLAnchorElement>}\n href={menu.href}\n className={triggerClass}\n aria-haspopup=\"true\"\n aria-expanded={open}\n aria-controls={panelId}\n aria-current={isCurrent(menu.href) ? 'page' : undefined}\n onClick={navigate}\n >\n {menu.label}\n </a>\n ) : (\n <button\n ref={triggerRef as React.RefObject<HTMLButtonElement>}\n type=\"button\"\n className={triggerClass}\n aria-haspopup=\"true\"\n aria-expanded={open}\n aria-controls={panelId}\n onClick={() => {\n clearTimers();\n onOpenChange(!open);\n }}\n >\n {menu.label}\n </button>\n )}\n <button\n type=\"button\"\n aria-label={`Toggle ${menu.label} menu`}\n aria-expanded={open}\n aria-controls={panelId}\n onClick={() => {\n clearTimers();\n onOpenChange(!open);\n }}\n className={cn(\n '-ms-1 rounded-md p-1 transition-transform',\n variant === 'light'\n ? 'text-white/70 hover:text-white'\n : 'text-muted-foreground hover:text-foreground',\n open && 'rotate-180'\n )}\n >\n <ChevronDown size={16} aria-hidden=\"true\" />\n </button>\n </div>\n\n <div\n id={panelId}\n ref={panelRef}\n role=\"region\"\n aria-label={menu.label}\n data-slot=\"mega-menu-panel\"\n // rtl-ignore -- viewport-clamp coordinate; math above is direction-aware\n style={{ left }}\n className={cn(\n 'border-border bg-card text-card-foreground absolute top-full z-50 mt-3 origin-top-left rounded-2xl border shadow-xl rtl:origin-top-right',\n 'transition-[opacity,transform] duration-200',\n open\n ? 'visible translate-y-0 opacity-100'\n : 'pointer-events-none invisible -translate-y-1 opacity-0',\n featured\n ? 'grid w-[min(880px,calc(100vw-2rem))] grid-cols-[1fr_280px]'\n : 'w-[min(600px,calc(100vw-2rem))]'\n )}\n >\n <div className=\"p-6\">\n {menu.heading && (\n <p className=\"text-muted-foreground mb-4 text-[11px] font-bold tracking-[0.14em] uppercase\">\n {menu.heading}\n </p>\n )}\n\n {menu.groups ? (\n <div className=\"grid gap-6 sm:grid-cols-2 lg:grid-cols-3\">\n {menu.groups.map((g) => (\n <div key={g.label}>\n {g.href ? (\n <a\n href={g.href}\n aria-current={isCurrent(g.href) ? 'page' : undefined}\n onClick={navigate}\n className=\"text-foreground hover:text-primary-700 dark:hover:text-primary-300 mb-2 inline-flex items-center gap-1 text-sm font-semibold\"\n >\n {g.label}\n <ChevronRight\n size={14}\n aria-hidden=\"true\"\n className=\"rtl:-scale-x-100\"\n />\n </a>\n ) : (\n <p className=\"text-foreground mb-2 text-sm font-semibold\">\n {g.label}\n </p>\n )}\n <ul className=\"space-y-0.5\">\n {g.items.map((it) => (\n <li key={it.href}>\n <ItemLink\n item={it}\n compact\n current={isCurrent(it.href)}\n onHover={setHovered}\n onNavigate={navigate}\n />\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"grid gap-1 sm:grid-cols-2\">\n {menu.items?.map((it) => (\n <ItemLink\n key={it.href}\n item={it}\n current={isCurrent(it.href)}\n onHover={setHovered}\n onNavigate={navigate}\n />\n ))}\n </div>\n )}\n\n {(menu.allHref || menu.ctaHref) && (\n <div className=\"border-border mt-5 flex items-center justify-between gap-4 border-t pt-4\">\n {menu.allHref ? (\n <a\n href={menu.allHref}\n onClick={navigate}\n className=\"text-foreground hover:text-primary-700 dark:hover:text-primary-300 inline-flex items-center gap-1.5 text-sm font-semibold\"\n >\n {menu.allLabel ?? 'Browse all'}\n <ArrowRight\n size={16}\n aria-hidden=\"true\"\n className=\"rtl:-scale-x-100\"\n />\n </a>\n ) : (\n <span />\n )}\n {menu.ctaHref && (\n <a\n href={menu.ctaHref}\n onClick={navigate}\n className={buttonVariants({ size: 'sm', effect: 'sheen' })}\n >\n {menu.ctaLabel ?? 'Get started'}\n </a>\n )}\n </div>\n )}\n </div>\n\n {featured && (\n <FeaturedPanel featured={featured} onNavigate={navigate} />\n )}\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// Pieces\n// =============================================================================\n\nfunction ItemLink({\n item,\n compact,\n current,\n onHover,\n onNavigate,\n}: {\n item: MegaMenuItem;\n compact?: boolean;\n current: boolean;\n onHover: (item: MegaMenuItem | null) => void;\n onNavigate: () => void;\n}) {\n return (\n <a\n href={item.href}\n target={item.external ? '_blank' : undefined}\n rel={item.external ? 'noopener noreferrer' : undefined}\n aria-current={current ? 'page' : undefined}\n data-slot=\"mega-menu-item\"\n onClick={onNavigate}\n onMouseEnter={() => onHover(item)}\n onFocus={() => onHover(item)}\n className={cn(\n 'group flex items-start gap-3 rounded-xl text-start transition-colors',\n compact ? 'px-2 py-1.5' : 'p-3',\n 'hover:bg-primary-500/10 focus-visible:bg-primary-500/10 focus-visible:outline-none',\n current && 'bg-primary-500/10'\n )}\n >\n {item.icon && (\n <span\n className={cn(\n 'inline-flex shrink-0 items-center justify-center rounded-lg transition-colors',\n compact\n ? 'h-7 w-7 [&_svg]:h-4 [&_svg]:w-4'\n : 'h-10 w-10 [&_svg]:h-5 [&_svg]:w-5',\n 'bg-muted text-foreground/70 group-hover:bg-primary-800 group-hover:text-white',\n current && 'bg-primary-800 text-white'\n )}\n >\n {item.icon}\n </span>\n )}\n <span className=\"min-w-0\">\n <span\n className={cn(\n 'text-foreground group-hover:text-primary-800 dark:group-hover:text-primary-200 block font-semibold',\n compact ? 'text-sm' : 'text-base'\n )}\n >\n {item.label}\n </span>\n {!compact && item.description && (\n <span className=\"text-muted-foreground mt-0.5 block text-sm leading-snug\">\n {item.description}\n </span>\n )}\n </span>\n </a>\n );\n}\n\nconst TONE: Record<MegaMenuTone, string> = {\n primary: 'bg-gradient-to-br from-primary-800 to-primary-950 text-white',\n accent:\n 'text-white [background:linear-gradient(160deg,color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-700))_70%,#000)_0%,var(--mieweb-primary-950)_100%)]',\n neutral: 'bg-muted text-foreground',\n};\n\nfunction FeaturedPanel({\n featured,\n onNavigate,\n}: {\n featured: MegaMenuFeatured;\n onNavigate: () => void;\n}) {\n const tone = featured.tone ?? 'primary';\n const onDark = tone !== 'neutral';\n // `key` re-mounts the panel so swapping between items replays the fade-in.\n // A `div`, not `aside`: a complementary landmark nested inside the menu\n // region violates axe landmark-complementary-is-top-level.\n return (\n <div\n data-slot=\"mega-menu-featured\"\n key={featured.title}\n className={cn(\n 'flex flex-col rounded-e-2xl p-6 motion-safe:animate-[mie-fade-in_0.2s_ease-out]',\n TONE[tone]\n )}\n >\n <p\n className={cn(\n 'text-[11px] font-bold tracking-[0.14em] uppercase',\n onDark ? 'text-white/70' : 'text-muted-foreground'\n )}\n >\n {featured.eyebrow}\n </p>\n <div className=\"mt-4\">\n {featured.media ??\n (featured.icon && (\n <span\n className={cn(\n 'inline-flex h-14 w-14 items-center justify-center rounded-xl [&_svg]:h-7 [&_svg]:w-7',\n onDark ? 'bg-white/15 text-white' : 'bg-card text-foreground'\n )}\n >\n {featured.icon}\n </span>\n ))}\n </div>\n <p className=\"mt-4 text-xl leading-tight font-semibold\">\n {featured.title}\n </p>\n {featured.description && (\n <p\n className={cn(\n 'mt-2 text-sm leading-snug',\n onDark ? 'text-white/80' : 'text-muted-foreground'\n )}\n >\n {featured.description}\n </p>\n )}\n <div className=\"mt-auto pt-5\">\n <a\n href={featured.ctaHref}\n onClick={onNavigate}\n className={cn(\n buttonVariants({ variant: 'outline', effect: 'sheen' }),\n onDark &&\n 'border-white/40 text-white hover:border-white hover:bg-white/10 hover:text-white dark:border-white/40 dark:text-white dark:hover:border-white dark:hover:bg-white/10'\n )}\n >\n {featured.ctaLabel}\n <ArrowRight\n size={16}\n aria-hidden=\"true\"\n className=\"rtl:-scale-x-100\"\n />\n </a>\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// MegaMenuBar — keeps one menu open at a time\n// =============================================================================\n\nexport interface MegaMenuBarProps extends Pick<\n MegaMenuProps,\n 'currentPath' | 'variant' | 'resolveFeatured' | 'onNavigate' | 'hoverMinWidth'\n> {\n menus: MegaMenuConfig[];\n className?: string;\n 'aria-label'?: string;\n}\n\n/** A row of `MegaMenu` triggers sharing one open-state so only one panel shows. */\nexport function MegaMenuBar({\n menus,\n className,\n 'aria-label': ariaLabel = 'Main navigation',\n ...rest\n}: MegaMenuBarProps) {\n const [openKey, setOpenKey] = React.useState<string | null>(null);\n return (\n <nav\n data-slot=\"mega-menu-bar\"\n aria-label={ariaLabel}\n className={cn('flex items-center gap-1', className)}\n >\n {menus.map((m) => (\n <MegaMenu\n key={m.key}\n menu={m}\n open={openKey === m.key}\n onOpenChange={(o) =>\n setOpenKey(o ? m.key : openKey === m.key ? null : openKey)\n }\n {...rest}\n />\n ))}\n </nav>\n );\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkNUFUV43P_cjs = require('./chunk-NUFUV43P.cjs');
3
+ var chunk4UDEMJE4_cjs = require('./chunk-4UDEMJE4.cjs');
4
4
  var react = require('react');
5
5
 
6
6
  var DEFAULT_FILLER_WORDS = [
@@ -349,7 +349,7 @@ function useTranscriptEdits(options) {
349
349
  const splitSilence = react.useCallback(
350
350
  (index, durationsSec) => {
351
351
  const ew = editedWords[index];
352
- if (!ew || !chunkNUFUV43P_cjs.isSilenceType(ew.word.wordType)) return;
352
+ if (!ew || !chunk4UDEMJE4_cjs.isSilenceType(ew.word.wordType)) return;
353
353
  pushUndo();
354
354
  const silenceStart = ew.word.startMs;
355
355
  const newSilences = [];
@@ -398,14 +398,14 @@ function useTranscriptEdits(options) {
398
398
  const silenceThresholdMs = removeSilenceAboveSec !== null ? removeSilenceAboveSec * 1e3 : null;
399
399
  const newEditedWords = editedWords.map((ew) => {
400
400
  if (ew.deleted) return ew;
401
- if (chunkNUFUV43P_cjs.isSilenceType(ew.word.wordType) && silenceThresholdMs !== null) {
401
+ if (chunk4UDEMJE4_cjs.isSilenceType(ew.word.wordType) && silenceThresholdMs !== null) {
402
402
  const durationMs = ew.word.endMs - ew.word.startMs;
403
403
  if (durationMs > silenceThresholdMs) {
404
404
  return { ...ew, deleted: true };
405
405
  }
406
406
  return ew;
407
407
  }
408
- if (!chunkNUFUV43P_cjs.isSilenceType(ew.word.wordType)) {
408
+ if (!chunk4UDEMJE4_cjs.isSilenceType(ew.word.wordType)) {
409
409
  const wordText = normalizeWordText(ew.word.text);
410
410
  if (fillerSet.has(wordText)) {
411
411
  return { ...ew, deleted: true };
@@ -431,7 +431,7 @@ function useTranscriptEdits(options) {
431
431
  const wordDeletedStatus = /* @__PURE__ */ new Map();
432
432
  let saveIdx = 0;
433
433
  editedWords.forEach((ew) => {
434
- if (!chunkNUFUV43P_cjs.isSilenceType(ew.word.wordType) && ew.originalIndex >= 0 && !ew.inserted) {
434
+ if (!chunk4UDEMJE4_cjs.isSilenceType(ew.word.wordType) && ew.originalIndex >= 0 && !ew.inserted) {
435
435
  wordDeletedStatus.set(saveIdx, ew.deleted);
436
436
  saveIdx++;
437
437
  }
@@ -443,7 +443,7 @@ function useTranscriptEdits(options) {
443
443
  );
444
444
  let wordIdx = 0;
445
445
  const restoredWords = newEditedWords.map((ew) => {
446
- if (!chunkNUFUV43P_cjs.isSilenceType(ew.word.wordType)) {
446
+ if (!chunk4UDEMJE4_cjs.isSilenceType(ew.word.wordType)) {
447
447
  const wasDeleted = wordDeletedStatus.get(wordIdx) ?? false;
448
448
  wordIdx++;
449
449
  return { ...ew, deleted: wasDeleted };
@@ -456,14 +456,14 @@ function useTranscriptEdits(options) {
456
456
  let survivors = 0;
457
457
  editedWords.forEach((ew) => {
458
458
  survivorPrefix.push(survivors);
459
- if (!chunkNUFUV43P_cjs.isSilenceType(ew.word.wordType) && ew.originalIndex >= 0 && !ew.inserted) {
459
+ if (!chunk4UDEMJE4_cjs.isSilenceType(ew.word.wordType) && ew.originalIndex >= 0 && !ew.inserted) {
460
460
  survivors++;
461
461
  }
462
462
  });
463
463
  survivorPrefix.push(survivors);
464
464
  const newIndexByOrdinal = [];
465
465
  restoredWords.forEach((ew, i) => {
466
- if (!chunkNUFUV43P_cjs.isSilenceType(ew.word.wordType)) newIndexByOrdinal.push(i);
466
+ if (!chunk4UDEMJE4_cjs.isSilenceType(ew.word.wordType)) newIndexByOrdinal.push(i);
467
467
  });
468
468
  const remapped = [];
469
469
  speedMarkers.forEach((m) => {
@@ -568,16 +568,16 @@ function useTranscriptEdits(options) {
568
568
  );
569
569
  const stats = react.useMemo(() => {
570
570
  const activeWordCount = editedWords.filter(
571
- (ew) => !ew.deleted && !chunkNUFUV43P_cjs.isSilenceType(ew.word.wordType)
571
+ (ew) => !ew.deleted && !chunk4UDEMJE4_cjs.isSilenceType(ew.word.wordType)
572
572
  ).length;
573
573
  const activeSilenceCount = editedWords.filter(
574
- (ew) => !ew.deleted && chunkNUFUV43P_cjs.isSilenceType(ew.word.wordType)
574
+ (ew) => !ew.deleted && chunk4UDEMJE4_cjs.isSilenceType(ew.word.wordType)
575
575
  ).length;
576
576
  const deletedWordCount = editedWords.filter(
577
- (ew) => ew.deleted && !chunkNUFUV43P_cjs.isSilenceType(ew.word.wordType)
577
+ (ew) => ew.deleted && !chunk4UDEMJE4_cjs.isSilenceType(ew.word.wordType)
578
578
  ).length;
579
579
  const deletedSilenceCount = editedWords.filter(
580
- (ew) => ew.deleted && chunkNUFUV43P_cjs.isSilenceType(ew.word.wordType)
580
+ (ew) => ew.deleted && chunk4UDEMJE4_cjs.isSilenceType(ew.word.wordType)
581
581
  ).length;
582
582
  const editedDurationMs = editedWords.reduce((sum, ew, index) => {
583
583
  if (ew.deleted) return sum;
@@ -596,13 +596,13 @@ function useTranscriptEdits(options) {
596
596
  const fillerAnalysis = react.useMemo(() => {
597
597
  const matchCounts = /* @__PURE__ */ new Map();
598
598
  for (const ew of editedWords) {
599
- if (ew.deleted || chunkNUFUV43P_cjs.isSilenceType(ew.word.wordType)) continue;
599
+ if (ew.deleted || chunk4UDEMJE4_cjs.isSilenceType(ew.word.wordType)) continue;
600
600
  const wordText = normalizeWordText(ew.word.text);
601
601
  matchCounts.set(wordText, (matchCounts.get(wordText) || 0) + 1);
602
602
  }
603
603
  const durations = /* @__PURE__ */ new Map();
604
604
  for (const ew of editedWords) {
605
- if (ew.deleted || chunkNUFUV43P_cjs.isSilenceType(ew.word.wordType)) continue;
605
+ if (ew.deleted || chunk4UDEMJE4_cjs.isSilenceType(ew.word.wordType)) continue;
606
606
  const wordText = normalizeWordText(ew.word.text);
607
607
  const wordDuration = ew.word.endMs - ew.word.startMs;
608
608
  durations.set(wordText, (durations.get(wordText) || 0) + wordDuration);
@@ -613,7 +613,7 @@ function useTranscriptEdits(options) {
613
613
  let durationMs = 0;
614
614
  for (const ew of editedWords) {
615
615
  if (ew.deleted) continue;
616
- if (!chunkNUFUV43P_cjs.isSilenceType(ew.word.wordType)) continue;
616
+ if (!chunk4UDEMJE4_cjs.isSilenceType(ew.word.wordType)) continue;
617
617
  const silenceDuration = ew.word.endMs - ew.word.startMs;
618
618
  if (silenceDuration > thresholdMs) {
619
619
  count++;
@@ -672,5 +672,5 @@ exports.getSpeedAtIndex = getSpeedAtIndex;
672
672
  exports.initEditableWords = initEditableWords;
673
673
  exports.insertSilences = insertSilences;
674
674
  exports.useTranscriptEdits = useTranscriptEdits;
675
- //# sourceMappingURL=chunk-NPKPCYAT.cjs.map
676
- //# sourceMappingURL=chunk-NPKPCYAT.cjs.map
675
+ //# sourceMappingURL=chunk-GM376OD6.cjs.map
676
+ //# sourceMappingURL=chunk-GM376OD6.cjs.map
@@ -1 +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"]}
1
+ {"version":3,"sources":["../src/hooks/useTranscriptEdits.ts"],"names":["useRef","useState","useCallback","useEffect","isSilenceType","useMemo"],"mappings":"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","file":"chunk-GM376OD6.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"]}