@pierre/diffs 1.3.0-beta.5 → 1.3.0-beta.7

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 (643) hide show
  1. package/README.md +9 -9
  2. package/dist/components/CodeView.d.ts +13 -11
  3. package/dist/components/CodeView.d.ts.map +1 -1
  4. package/dist/components/CodeView.js +53 -14
  5. package/dist/components/CodeView.js.map +1 -1
  6. package/dist/components/File.d.ts +4 -5
  7. package/dist/components/File.d.ts.map +1 -1
  8. package/dist/components/File.js +37 -19
  9. package/dist/components/File.js.map +1 -1
  10. package/dist/components/FileDiff.d.ts +49 -36
  11. package/dist/components/FileDiff.d.ts.map +1 -1
  12. package/dist/components/FileDiff.js +173 -75
  13. package/dist/components/FileDiff.js.map +1 -1
  14. package/dist/components/FileStream.d.ts +0 -1
  15. package/dist/components/FileStream.d.ts.map +1 -1
  16. package/dist/components/FileStream.js +4 -4
  17. package/dist/components/FileStream.js.map +1 -1
  18. package/dist/components/UnresolvedFile.d.ts +3 -3
  19. package/dist/components/UnresolvedFile.d.ts.map +1 -1
  20. package/dist/components/UnresolvedFile.js +7 -5
  21. package/dist/components/UnresolvedFile.js.map +1 -1
  22. package/dist/components/VirtualizedFile.d.ts +0 -1
  23. package/dist/components/VirtualizedFile.d.ts.map +1 -1
  24. package/dist/components/VirtualizedFile.js +22 -25
  25. package/dist/components/VirtualizedFile.js.map +1 -1
  26. package/dist/components/VirtualizedFileDiff.d.ts +12 -7
  27. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
  28. package/dist/components/VirtualizedFileDiff.js +192 -64
  29. package/dist/components/VirtualizedFileDiff.js.map +1 -1
  30. package/dist/components/Virtualizer.d.ts +1 -1
  31. package/dist/components/Virtualizer.d.ts.map +1 -1
  32. package/dist/components/Virtualizer.js +23 -24
  33. package/dist/components/Virtualizer.js.map +1 -1
  34. package/dist/components/VirtulizerDevelopment.d.ts.map +1 -1
  35. package/dist/components/web-components.d.ts.map +1 -1
  36. package/dist/components/web-components.js +2 -3
  37. package/dist/components/web-components.js.map +1 -1
  38. package/dist/constants.d.ts +3 -2
  39. package/dist/constants.d.ts.map +1 -1
  40. package/dist/constants.js +3 -2
  41. package/dist/constants.js.map +1 -1
  42. package/dist/editor/command.d.ts +2 -1
  43. package/dist/editor/command.d.ts.map +1 -1
  44. package/dist/editor/command.js +7 -3
  45. package/dist/editor/command.js.map +1 -1
  46. package/dist/editor/editStack.d.ts +7 -1
  47. package/dist/editor/editStack.d.ts.map +1 -1
  48. package/dist/editor/editStack.js +3 -3
  49. package/dist/editor/editStack.js.map +1 -1
  50. package/dist/editor/editor.d.ts +28 -4
  51. package/dist/editor/editor.d.ts.map +1 -1
  52. package/dist/editor/editor.js +669 -313
  53. package/dist/editor/editor.js.map +1 -1
  54. package/dist/editor/editor2.js +3 -3
  55. package/dist/editor/editor2.js.map +1 -1
  56. package/dist/editor/index.js +1 -2
  57. package/dist/editor/lineAnnotations.d.ts.map +1 -1
  58. package/dist/editor/lineAnnotations.js +2 -3
  59. package/dist/editor/lineAnnotations.js.map +1 -1
  60. package/dist/editor/marker.d.ts +2 -1
  61. package/dist/editor/marker.d.ts.map +1 -1
  62. package/dist/editor/marker.js +28 -11
  63. package/dist/editor/marker.js.map +1 -1
  64. package/dist/editor/pieceTable.d.ts +4 -2
  65. package/dist/editor/pieceTable.d.ts.map +1 -1
  66. package/dist/editor/pieceTable.js +138 -128
  67. package/dist/editor/pieceTable.js.map +1 -1
  68. package/dist/editor/platform.d.ts +8 -1
  69. package/dist/editor/platform.d.ts.map +1 -1
  70. package/dist/editor/platform.js +16 -5
  71. package/dist/editor/platform.js.map +1 -1
  72. package/dist/editor/searchPanel.d.ts +1 -0
  73. package/dist/editor/searchPanel.d.ts.map +1 -1
  74. package/dist/editor/searchPanel.js +75 -62
  75. package/dist/editor/searchPanel.js.map +1 -1
  76. package/dist/editor/selection.d.ts +42 -5
  77. package/dist/editor/selection.d.ts.map +1 -1
  78. package/dist/editor/selection.js +504 -114
  79. package/dist/editor/selection.js.map +1 -1
  80. package/dist/editor/selectionAction.d.ts +4 -5
  81. package/dist/editor/selectionAction.d.ts.map +1 -1
  82. package/dist/editor/selectionAction.js +14 -64
  83. package/dist/editor/selectionAction.js.map +1 -1
  84. package/dist/editor/sprite.d.ts +2 -2
  85. package/dist/editor/sprite.d.ts.map +1 -1
  86. package/dist/editor/sprite.js +7 -14
  87. package/dist/editor/sprite.js.map +1 -1
  88. package/dist/editor/textDocument.d.ts +5 -4
  89. package/dist/editor/textDocument.d.ts.map +1 -1
  90. package/dist/editor/textDocument.js +26 -15
  91. package/dist/editor/textDocument.js.map +1 -1
  92. package/dist/editor/textMeasure.d.ts +36 -3
  93. package/dist/editor/textMeasure.d.ts.map +1 -1
  94. package/dist/editor/textMeasure.js +104 -17
  95. package/dist/editor/textMeasure.js.map +1 -1
  96. package/dist/editor/tokenzier.d.ts +3 -0
  97. package/dist/editor/tokenzier.d.ts.map +1 -1
  98. package/dist/editor/tokenzier.js +27 -16
  99. package/dist/editor/tokenzier.js.map +1 -1
  100. package/dist/editor/utils.d.ts +4 -1
  101. package/dist/editor/utils.d.ts.map +1 -1
  102. package/dist/editor/utils.js +19 -3
  103. package/dist/editor/utils.js.map +1 -1
  104. package/dist/highlighter/languages/areLanguagesAttached.d.ts.map +1 -1
  105. package/dist/highlighter/languages/areLanguagesAttached.js +1 -2
  106. package/dist/highlighter/languages/areLanguagesAttached.js.map +1 -1
  107. package/dist/highlighter/languages/attachResolvedLanguages.d.ts +0 -2
  108. package/dist/highlighter/languages/attachResolvedLanguages.d.ts.map +1 -1
  109. package/dist/highlighter/languages/attachResolvedLanguages.js +1 -2
  110. package/dist/highlighter/languages/attachResolvedLanguages.js.map +1 -1
  111. package/dist/highlighter/languages/cleanUpResolvedLanguages.d.ts.map +1 -1
  112. package/dist/highlighter/languages/cleanUpResolvedLanguages.js +1 -2
  113. package/dist/highlighter/languages/cleanUpResolvedLanguages.js.map +1 -1
  114. package/dist/highlighter/languages/constants.d.ts +0 -1
  115. package/dist/highlighter/languages/constants.d.ts.map +1 -1
  116. package/dist/highlighter/languages/constants.js +1 -1
  117. package/dist/highlighter/languages/constants.js.map +1 -1
  118. package/dist/highlighter/languages/getResolvedLanguages.d.ts +0 -2
  119. package/dist/highlighter/languages/getResolvedLanguages.d.ts.map +1 -1
  120. package/dist/highlighter/languages/getResolvedLanguages.js +1 -2
  121. package/dist/highlighter/languages/getResolvedLanguages.js.map +1 -1
  122. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +0 -2
  123. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts.map +1 -1
  124. package/dist/highlighter/languages/getResolvedOrResolveLanguage.js +1 -2
  125. package/dist/highlighter/languages/getResolvedOrResolveLanguage.js.map +1 -1
  126. package/dist/highlighter/languages/hasResolvedLanguages.d.ts.map +1 -1
  127. package/dist/highlighter/languages/hasResolvedLanguages.js +1 -2
  128. package/dist/highlighter/languages/hasResolvedLanguages.js.map +1 -1
  129. package/dist/highlighter/languages/registerCustomLanguage.d.ts +0 -1
  130. package/dist/highlighter/languages/registerCustomLanguage.d.ts.map +1 -1
  131. package/dist/highlighter/languages/registerCustomLanguage.js +1 -2
  132. package/dist/highlighter/languages/registerCustomLanguage.js.map +1 -1
  133. package/dist/highlighter/languages/resolveLanguage.d.ts +0 -2
  134. package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
  135. package/dist/highlighter/languages/resolveLanguage.js +4 -5
  136. package/dist/highlighter/languages/resolveLanguage.js.map +1 -1
  137. package/dist/highlighter/languages/resolveLanguages.d.ts +0 -2
  138. package/dist/highlighter/languages/resolveLanguages.d.ts.map +1 -1
  139. package/dist/highlighter/languages/resolveLanguages.js +1 -2
  140. package/dist/highlighter/languages/resolveLanguages.js.map +1 -1
  141. package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
  142. package/dist/highlighter/shared_highlighter.js +3 -4
  143. package/dist/highlighter/shared_highlighter.js.map +1 -1
  144. package/dist/highlighter/themes/areThemesAttached.d.ts.map +1 -1
  145. package/dist/highlighter/themes/areThemesAttached.js +1 -2
  146. package/dist/highlighter/themes/areThemesAttached.js.map +1 -1
  147. package/dist/highlighter/themes/attachResolvedThemes.d.ts.map +1 -1
  148. package/dist/highlighter/themes/attachResolvedThemes.js +1 -2
  149. package/dist/highlighter/themes/attachResolvedThemes.js.map +1 -1
  150. package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts.map +1 -1
  151. package/dist/highlighter/themes/cleanUpResolvedThemes.js +1 -2
  152. package/dist/highlighter/themes/cleanUpResolvedThemes.js.map +1 -1
  153. package/dist/highlighter/themes/constants.d.ts.map +1 -1
  154. package/dist/highlighter/themes/constants.js +1 -1
  155. package/dist/highlighter/themes/constants.js.map +1 -1
  156. package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts.map +1 -1
  157. package/dist/highlighter/themes/getResolvedOrResolveTheme.js +1 -2
  158. package/dist/highlighter/themes/getResolvedOrResolveTheme.js.map +1 -1
  159. package/dist/highlighter/themes/getResolvedThemes.d.ts.map +1 -1
  160. package/dist/highlighter/themes/getResolvedThemes.js +1 -2
  161. package/dist/highlighter/themes/getResolvedThemes.js.map +1 -1
  162. package/dist/highlighter/themes/hasResolvedThemes.d.ts.map +1 -1
  163. package/dist/highlighter/themes/hasResolvedThemes.js +1 -2
  164. package/dist/highlighter/themes/hasResolvedThemes.js.map +1 -1
  165. package/dist/highlighter/themes/registerCustomCSSVariableTheme.d.ts.map +1 -1
  166. package/dist/highlighter/themes/registerCustomCSSVariableTheme.js +1 -2
  167. package/dist/highlighter/themes/registerCustomCSSVariableTheme.js.map +1 -1
  168. package/dist/highlighter/themes/registerCustomTheme.d.ts.map +1 -1
  169. package/dist/highlighter/themes/registerCustomTheme.js +1 -2
  170. package/dist/highlighter/themes/registerCustomTheme.js.map +1 -1
  171. package/dist/highlighter/themes/resolveTheme.d.ts.map +1 -1
  172. package/dist/highlighter/themes/resolveTheme.js +1 -2
  173. package/dist/highlighter/themes/resolveTheme.js.map +1 -1
  174. package/dist/highlighter/themes/resolveThemes.d.ts.map +1 -1
  175. package/dist/highlighter/themes/resolveThemes.js +1 -2
  176. package/dist/highlighter/themes/resolveThemes.js.map +1 -1
  177. package/dist/highlighter/themes/themeResolution.d.ts.map +1 -1
  178. package/dist/highlighter/themes/themeResolution.js +1 -2
  179. package/dist/highlighter/themes/themeResolution.js.map +1 -1
  180. package/dist/highlighter/themes/themeResolver.d.ts +2 -2
  181. package/dist/highlighter/themes/themeResolver.d.ts.map +1 -1
  182. package/dist/highlighter/themes/themeResolver.js +1 -2
  183. package/dist/highlighter/themes/themeResolver.js.map +1 -1
  184. package/dist/index.d.ts +12 -10
  185. package/dist/index.js +4 -3
  186. package/dist/managers/InteractionManager.d.ts +7 -0
  187. package/dist/managers/InteractionManager.d.ts.map +1 -1
  188. package/dist/managers/InteractionManager.js +25 -4
  189. package/dist/managers/InteractionManager.js.map +1 -1
  190. package/dist/managers/ResizeManager.d.ts.map +1 -1
  191. package/dist/managers/ResizeManager.js +1 -1
  192. package/dist/managers/ResizeManager.js.map +1 -1
  193. package/dist/managers/ScrollSyncManager.d.ts.map +1 -1
  194. package/dist/managers/ScrollSyncManager.js +1 -1
  195. package/dist/managers/ScrollSyncManager.js.map +1 -1
  196. package/dist/managers/UniversalRenderingManager.d.ts.map +1 -1
  197. package/dist/managers/UniversalRenderingManager.js +2 -2
  198. package/dist/managers/UniversalRenderingManager.js.map +1 -1
  199. package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts +228 -0
  200. package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts.map +1 -0
  201. package/dist/node_modules/.pnpm/@types_unist@3.0.3/node_modules/@types/unist/index.d.ts +84 -0
  202. package/dist/node_modules/.pnpm/@types_unist@3.0.3/node_modules/@types/unist/index.d.ts.map +1 -0
  203. package/dist/react/CodeView.d.ts +1 -1
  204. package/dist/react/CodeView.d.ts.map +1 -1
  205. package/dist/react/CodeView.js +17 -16
  206. package/dist/react/CodeView.js.map +1 -1
  207. package/dist/react/EditorContext.d.ts +0 -1
  208. package/dist/react/EditorContext.d.ts.map +1 -1
  209. package/dist/react/EditorContext.js +2 -5
  210. package/dist/react/EditorContext.js.map +1 -1
  211. package/dist/react/File.d.ts +1 -0
  212. package/dist/react/File.d.ts.map +1 -1
  213. package/dist/react/File.js +4 -6
  214. package/dist/react/File.js.map +1 -1
  215. package/dist/react/FileDiff.d.ts +1 -0
  216. package/dist/react/FileDiff.d.ts.map +1 -1
  217. package/dist/react/FileDiff.js +4 -6
  218. package/dist/react/FileDiff.js.map +1 -1
  219. package/dist/react/MultiFileDiff.d.ts +4 -4
  220. package/dist/react/MultiFileDiff.d.ts.map +1 -1
  221. package/dist/react/MultiFileDiff.js +4 -6
  222. package/dist/react/MultiFileDiff.js.map +1 -1
  223. package/dist/react/PatchDiff.d.ts +1 -0
  224. package/dist/react/PatchDiff.d.ts.map +1 -1
  225. package/dist/react/PatchDiff.js +4 -6
  226. package/dist/react/PatchDiff.js.map +1 -1
  227. package/dist/react/UnresolvedFile.d.ts +2 -1
  228. package/dist/react/UnresolvedFile.d.ts.map +1 -1
  229. package/dist/react/UnresolvedFile.js +4 -6
  230. package/dist/react/UnresolvedFile.js.map +1 -1
  231. package/dist/react/Virtualizer.d.ts.map +1 -1
  232. package/dist/react/Virtualizer.js +2 -5
  233. package/dist/react/Virtualizer.js.map +1 -1
  234. package/dist/react/WorkerPoolContext.d.ts +0 -1
  235. package/dist/react/WorkerPoolContext.d.ts.map +1 -1
  236. package/dist/react/WorkerPoolContext.js +2 -5
  237. package/dist/react/WorkerPoolContext.js.map +1 -1
  238. package/dist/react/constants.d.ts.map +1 -1
  239. package/dist/react/constants.js +1 -1
  240. package/dist/react/constants.js.map +1 -1
  241. package/dist/react/index.d.ts +2 -2
  242. package/dist/react/index.js +1 -2
  243. package/dist/react/jsx.d.ts +0 -2
  244. package/dist/react/jsx.d.ts.map +1 -1
  245. package/dist/react/types.d.ts +2 -0
  246. package/dist/react/types.d.ts.map +1 -1
  247. package/dist/react/utils/renderDiffChildren.d.ts +2 -0
  248. package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
  249. package/dist/react/utils/renderDiffChildren.js +18 -11
  250. package/dist/react/utils/renderDiffChildren.js.map +1 -1
  251. package/dist/react/utils/renderFileChildren.d.ts +2 -0
  252. package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
  253. package/dist/react/utils/renderFileChildren.js +18 -11
  254. package/dist/react/utils/renderFileChildren.js.map +1 -1
  255. package/dist/react/utils/templateRender.d.ts.map +1 -1
  256. package/dist/react/utils/templateRender.js +1 -2
  257. package/dist/react/utils/templateRender.js.map +1 -1
  258. package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
  259. package/dist/react/utils/useFileDiffInstance.js +15 -18
  260. package/dist/react/utils/useFileDiffInstance.js.map +1 -1
  261. package/dist/react/utils/useFileInstance.d.ts.map +1 -1
  262. package/dist/react/utils/useFileInstance.js +1 -2
  263. package/dist/react/utils/useFileInstance.js.map +1 -1
  264. package/dist/react/utils/useStableCallback.d.ts.map +1 -1
  265. package/dist/react/utils/useStableCallback.js +1 -2
  266. package/dist/react/utils/useStableCallback.js.map +1 -1
  267. package/dist/react/utils/useUnresolvedFileInstance.d.ts.map +1 -1
  268. package/dist/react/utils/useUnresolvedFileInstance.js +10 -11
  269. package/dist/react/utils/useUnresolvedFileInstance.js.map +1 -1
  270. package/dist/renderers/DiffHunksRenderer.d.ts +2 -3
  271. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  272. package/dist/renderers/DiffHunksRenderer.js +52 -33
  273. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  274. package/dist/renderers/FileRenderer.d.ts +1 -3
  275. package/dist/renderers/FileRenderer.d.ts.map +1 -1
  276. package/dist/renderers/FileRenderer.js +14 -11
  277. package/dist/renderers/FileRenderer.js.map +1 -1
  278. package/dist/renderers/UnresolvedFileHunksRenderer.d.ts +1 -2
  279. package/dist/renderers/UnresolvedFileHunksRenderer.d.ts.map +1 -1
  280. package/dist/renderers/UnresolvedFileHunksRenderer.js +1 -2
  281. package/dist/renderers/UnresolvedFileHunksRenderer.js.map +1 -1
  282. package/dist/shiki-stream/index.js +1 -2
  283. package/dist/shiki-stream/stream.d.ts +0 -1
  284. package/dist/shiki-stream/stream.d.ts.map +1 -1
  285. package/dist/shiki-stream/stream.js +1 -2
  286. package/dist/shiki-stream/stream.js.map +1 -1
  287. package/dist/shiki-stream/tokenizer.d.ts.map +1 -1
  288. package/dist/shiki-stream/tokenizer.js +1 -1
  289. package/dist/shiki-stream/tokenizer.js.map +1 -1
  290. package/dist/shiki-stream/types.d.ts +0 -1
  291. package/dist/shiki-stream/types.d.ts.map +1 -1
  292. package/dist/sprite.d.ts.map +1 -1
  293. package/dist/sprite.js +1 -1
  294. package/dist/ssr/FileDiffReact.d.ts.map +1 -1
  295. package/dist/ssr/FileDiffReact.js +5 -8
  296. package/dist/ssr/FileDiffReact.js.map +1 -1
  297. package/dist/ssr/index.d.ts +2 -2
  298. package/dist/ssr/index.js +1 -2
  299. package/dist/ssr/preloadDiffs.d.ts +12 -11
  300. package/dist/ssr/preloadDiffs.d.ts.map +1 -1
  301. package/dist/ssr/preloadDiffs.js +15 -8
  302. package/dist/ssr/preloadDiffs.js.map +1 -1
  303. package/dist/ssr/preloadFile.d.ts.map +1 -1
  304. package/dist/ssr/preloadFile.js +1 -2
  305. package/dist/ssr/preloadFile.js.map +1 -1
  306. package/dist/ssr/preloadPatchFile.d.ts.map +1 -1
  307. package/dist/ssr/preloadPatchFile.js +2 -3
  308. package/dist/ssr/preloadPatchFile.js.map +1 -1
  309. package/dist/ssr/renderHTML.d.ts +1 -1
  310. package/dist/ssr/renderHTML.d.ts.map +1 -1
  311. package/dist/ssr/renderHTML.js +1 -2
  312. package/dist/ssr/renderHTML.js.map +1 -1
  313. package/dist/string-import.d.ts +4 -0
  314. package/dist/string-import.d.ts.map +1 -1
  315. package/dist/style.js +3 -3
  316. package/dist/style.js.map +1 -1
  317. package/dist/types.d.ts +67 -7
  318. package/dist/types.d.ts.map +1 -1
  319. package/dist/utils/areDiffLineAnnotationsEqual.d.ts.map +1 -1
  320. package/dist/utils/areDiffLineAnnotationsEqual.js +1 -1
  321. package/dist/utils/areDiffLineAnnotationsEqual.js.map +1 -1
  322. package/dist/utils/areDiffRenderOptionsEqual.d.ts.map +1 -1
  323. package/dist/utils/areDiffRenderOptionsEqual.js +1 -2
  324. package/dist/utils/areDiffRenderOptionsEqual.js.map +1 -1
  325. package/dist/utils/areDiffTargetsEqual.d.ts.map +1 -1
  326. package/dist/utils/areDiffTargetsEqual.js +1 -1
  327. package/dist/utils/areDiffTargetsEqual.js.map +1 -1
  328. package/dist/utils/areFileRenderOptionsEqual.d.ts.map +1 -1
  329. package/dist/utils/areFileRenderOptionsEqual.js +1 -2
  330. package/dist/utils/areFileRenderOptionsEqual.js.map +1 -1
  331. package/dist/utils/areFilesEqual.d.ts.map +1 -1
  332. package/dist/utils/areFilesEqual.js +1 -1
  333. package/dist/utils/areFilesEqual.js.map +1 -1
  334. package/dist/utils/areHunkDataEqual.d.ts.map +1 -1
  335. package/dist/utils/areHunkDataEqual.js +2 -2
  336. package/dist/utils/areHunkDataEqual.js.map +1 -1
  337. package/dist/utils/areLineAnnotationsEqual.d.ts.map +1 -1
  338. package/dist/utils/areLineAnnotationsEqual.js +1 -1
  339. package/dist/utils/areLineAnnotationsEqual.js.map +1 -1
  340. package/dist/utils/areManagedSnapshotsEqual.d.ts.map +1 -1
  341. package/dist/utils/areManagedSnapshotsEqual.js +1 -1
  342. package/dist/utils/areManagedSnapshotsEqual.js.map +1 -1
  343. package/dist/utils/areMergeConflictActionsEqual.d.ts.map +1 -1
  344. package/dist/utils/areMergeConflictActionsEqual.js +1 -1
  345. package/dist/utils/areMergeConflictActionsEqual.js.map +1 -1
  346. package/dist/utils/areObjectsEqual.d.ts.map +1 -1
  347. package/dist/utils/areObjectsEqual.js +1 -1
  348. package/dist/utils/areObjectsEqual.js.map +1 -1
  349. package/dist/utils/areOptionsEqual.d.ts +0 -2
  350. package/dist/utils/areOptionsEqual.d.ts.map +1 -1
  351. package/dist/utils/areOptionsEqual.js +1 -2
  352. package/dist/utils/areOptionsEqual.js.map +1 -1
  353. package/dist/utils/arePrePropertiesEqual.d.ts.map +1 -1
  354. package/dist/utils/arePrePropertiesEqual.js +1 -1
  355. package/dist/utils/arePrePropertiesEqual.js.map +1 -1
  356. package/dist/utils/areRenderRangesEqual.d.ts.map +1 -1
  357. package/dist/utils/areRenderRangesEqual.js +1 -1
  358. package/dist/utils/areRenderRangesEqual.js.map +1 -1
  359. package/dist/utils/areSelectionPointsEqual.d.ts.map +1 -1
  360. package/dist/utils/areSelectionPointsEqual.js +1 -1
  361. package/dist/utils/areSelectionPointsEqual.js.map +1 -1
  362. package/dist/utils/areSelectionsEqual.d.ts.map +1 -1
  363. package/dist/utils/areSelectionsEqual.js +1 -1
  364. package/dist/utils/areSelectionsEqual.js.map +1 -1
  365. package/dist/utils/areThemesEqual.d.ts.map +1 -1
  366. package/dist/utils/areThemesEqual.js +1 -1
  367. package/dist/utils/areThemesEqual.js.map +1 -1
  368. package/dist/utils/areVirtualWindowSpecsEqual.d.ts.map +1 -1
  369. package/dist/utils/areVirtualWindowSpecsEqual.js +1 -1
  370. package/dist/utils/areVirtualWindowSpecsEqual.js.map +1 -1
  371. package/dist/utils/areWorkerStatsEqual.d.ts +0 -2
  372. package/dist/utils/areWorkerStatsEqual.d.ts.map +1 -1
  373. package/dist/utils/areWorkerStatsEqual.js +1 -1
  374. package/dist/utils/areWorkerStatsEqual.js.map +1 -1
  375. package/dist/utils/awaitWithTimeout.d.ts +5 -0
  376. package/dist/utils/awaitWithTimeout.d.ts.map +1 -0
  377. package/dist/utils/awaitWithTimeout.js +15 -0
  378. package/dist/utils/awaitWithTimeout.js.map +1 -0
  379. package/dist/utils/cleanLastNewline.d.ts.map +1 -1
  380. package/dist/utils/cleanLastNewline.js +1 -1
  381. package/dist/utils/cleanLastNewline.js.map +1 -1
  382. package/dist/utils/cloneFileDiffMetadata.d.ts +7 -0
  383. package/dist/utils/cloneFileDiffMetadata.d.ts.map +1 -0
  384. package/dist/utils/cloneFileDiffMetadata.js +16 -0
  385. package/dist/utils/cloneFileDiffMetadata.js.map +1 -0
  386. package/dist/utils/computeEstimatedDiffHeights.d.ts +3 -1
  387. package/dist/utils/computeEstimatedDiffHeights.d.ts.map +1 -1
  388. package/dist/utils/computeEstimatedDiffHeights.js +9 -3
  389. package/dist/utils/computeEstimatedDiffHeights.js.map +1 -1
  390. package/dist/utils/computeFileOffsets.d.ts +9 -1
  391. package/dist/utils/computeFileOffsets.d.ts.map +1 -1
  392. package/dist/utils/computeFileOffsets.js +20 -2
  393. package/dist/utils/computeFileOffsets.js.map +1 -1
  394. package/dist/utils/computeVirtualFileMetrics.d.ts.map +1 -1
  395. package/dist/utils/computeVirtualFileMetrics.js +1 -2
  396. package/dist/utils/computeVirtualFileMetrics.js.map +1 -1
  397. package/dist/utils/createAnnotationElement.d.ts +1 -1
  398. package/dist/utils/createAnnotationElement.d.ts.map +1 -1
  399. package/dist/utils/createAnnotationElement.js +1 -2
  400. package/dist/utils/createAnnotationElement.js.map +1 -1
  401. package/dist/utils/createAnnotationWrapperNode.d.ts.map +1 -1
  402. package/dist/utils/createAnnotationWrapperNode.js +1 -1
  403. package/dist/utils/createAnnotationWrapperNode.js.map +1 -1
  404. package/dist/utils/createContentColumn.d.ts +1 -1
  405. package/dist/utils/createContentColumn.d.ts.map +1 -1
  406. package/dist/utils/createContentColumn.js +1 -2
  407. package/dist/utils/createContentColumn.js.map +1 -1
  408. package/dist/utils/createEmptyRowBuffer.d.ts +1 -1
  409. package/dist/utils/createEmptyRowBuffer.d.ts.map +1 -1
  410. package/dist/utils/createEmptyRowBuffer.js +1 -2
  411. package/dist/utils/createEmptyRowBuffer.js.map +1 -1
  412. package/dist/utils/createFileHeaderElement.d.ts +1 -1
  413. package/dist/utils/createFileHeaderElement.d.ts.map +1 -1
  414. package/dist/utils/createFileHeaderElement.js +6 -3
  415. package/dist/utils/createFileHeaderElement.js.map +1 -1
  416. package/dist/utils/createGutterUtilityContentNode.d.ts.map +1 -1
  417. package/dist/utils/createGutterUtilityContentNode.js +1 -1
  418. package/dist/utils/createGutterUtilityContentNode.js.map +1 -1
  419. package/dist/utils/createGutterUtilityElement.d.ts +1 -1
  420. package/dist/utils/createGutterUtilityElement.d.ts.map +1 -1
  421. package/dist/utils/createGutterUtilityElement.js +1 -2
  422. package/dist/utils/createGutterUtilityElement.js.map +1 -1
  423. package/dist/utils/createNoNewlineElement.d.ts +1 -1
  424. package/dist/utils/createNoNewlineElement.d.ts.map +1 -1
  425. package/dist/utils/createNoNewlineElement.js +1 -2
  426. package/dist/utils/createNoNewlineElement.js.map +1 -1
  427. package/dist/utils/createPreElement.d.ts +1 -1
  428. package/dist/utils/createPreElement.d.ts.map +1 -1
  429. package/dist/utils/createPreElement.js +1 -3
  430. package/dist/utils/createPreElement.js.map +1 -1
  431. package/dist/utils/createRowNodes.d.ts.map +1 -1
  432. package/dist/utils/createRowNodes.js +1 -1
  433. package/dist/utils/createRowNodes.js.map +1 -1
  434. package/dist/utils/createSeparator.d.ts +1 -1
  435. package/dist/utils/createSeparator.d.ts.map +1 -1
  436. package/dist/utils/createSeparator.js +1 -2
  437. package/dist/utils/createSeparator.js.map +1 -1
  438. package/dist/utils/createSpanNodeFromToken.d.ts.map +1 -1
  439. package/dist/utils/createSpanNodeFromToken.js +1 -2
  440. package/dist/utils/createSpanNodeFromToken.js.map +1 -1
  441. package/dist/utils/createStyleElement.d.ts +1 -1
  442. package/dist/utils/createStyleElement.d.ts.map +1 -1
  443. package/dist/utils/createStyleElement.js +1 -2
  444. package/dist/utils/createStyleElement.js.map +1 -1
  445. package/dist/utils/createTransformerWithState.d.ts.map +1 -1
  446. package/dist/utils/createTransformerWithState.js +1 -2
  447. package/dist/utils/createTransformerWithState.js.map +1 -1
  448. package/dist/utils/createUnsafeCSSStyleNode.d.ts.map +1 -1
  449. package/dist/utils/createUnsafeCSSStyleNode.js +1 -2
  450. package/dist/utils/createUnsafeCSSStyleNode.js.map +1 -1
  451. package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -1
  452. package/dist/utils/createWindowFromScrollPosition.js +5 -5
  453. package/dist/utils/createWindowFromScrollPosition.js.map +1 -1
  454. package/dist/utils/cssWrappers.d.ts.map +1 -1
  455. package/dist/utils/cssWrappers.js +2 -3
  456. package/dist/utils/cssWrappers.js.map +1 -1
  457. package/dist/utils/detachString.d.ts.map +1 -1
  458. package/dist/utils/detachString.js +1 -1
  459. package/dist/utils/detachString.js.map +1 -1
  460. package/dist/utils/diffAcceptRejectHunk.d.ts.map +1 -1
  461. package/dist/utils/diffAcceptRejectHunk.js +1 -2
  462. package/dist/utils/diffAcceptRejectHunk.js.map +1 -1
  463. package/dist/utils/formatCSSVariablePrefix.d.ts.map +1 -1
  464. package/dist/utils/formatCSSVariablePrefix.js +1 -1
  465. package/dist/utils/formatCSSVariablePrefix.js.map +1 -1
  466. package/dist/utils/getDiffFileInput.d.ts +14 -0
  467. package/dist/utils/getDiffFileInput.d.ts.map +1 -0
  468. package/dist/utils/getDiffFileInput.js +24 -0
  469. package/dist/utils/getDiffFileInput.js.map +1 -0
  470. package/dist/utils/getDiffHunksRendererOptions.d.ts.map +1 -1
  471. package/dist/utils/getDiffHunksRendererOptions.js +2 -1
  472. package/dist/utils/getDiffHunksRendererOptions.js.map +1 -1
  473. package/dist/utils/getFileRendererOptions.d.ts.map +1 -1
  474. package/dist/utils/getFileRendererOptions.js +1 -1
  475. package/dist/utils/getFileRendererOptions.js.map +1 -1
  476. package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
  477. package/dist/utils/getFiletypeFromFileName.js +3 -1
  478. package/dist/utils/getFiletypeFromFileName.js.map +1 -1
  479. package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
  480. package/dist/utils/getHighlighterOptions.js +1 -2
  481. package/dist/utils/getHighlighterOptions.js.map +1 -1
  482. package/dist/utils/getHighlighterThemeStyles.d.ts.map +1 -1
  483. package/dist/utils/getHighlighterThemeStyles.js +1 -2
  484. package/dist/utils/getHighlighterThemeStyles.js.map +1 -1
  485. package/dist/utils/getHunkSeparatorSlotName.d.ts.map +1 -1
  486. package/dist/utils/getHunkSeparatorSlotName.js +1 -1
  487. package/dist/utils/getHunkSeparatorSlotName.js.map +1 -1
  488. package/dist/utils/getIconForType.d.ts.map +1 -1
  489. package/dist/utils/getIconForType.js +1 -1
  490. package/dist/utils/getIconForType.js.map +1 -1
  491. package/dist/utils/getLineAnnotationName.d.ts.map +1 -1
  492. package/dist/utils/getLineAnnotationName.js +1 -1
  493. package/dist/utils/getLineAnnotationName.js.map +1 -1
  494. package/dist/utils/getLineEndingType.d.ts.map +1 -1
  495. package/dist/utils/getLineEndingType.js +1 -1
  496. package/dist/utils/getLineEndingType.js.map +1 -1
  497. package/dist/utils/getLineNodes.d.ts +1 -1
  498. package/dist/utils/getLineNodes.d.ts.map +1 -1
  499. package/dist/utils/getLineNodes.js +1 -1
  500. package/dist/utils/getLineNodes.js.map +1 -1
  501. package/dist/utils/getMergeConflictActionSlotName.d.ts.map +1 -1
  502. package/dist/utils/getMergeConflictActionSlotName.js +1 -1
  503. package/dist/utils/getMergeConflictActionSlotName.js.map +1 -1
  504. package/dist/utils/getMergeConflictLineTypes.d.ts.map +1 -1
  505. package/dist/utils/getMergeConflictLineTypes.js +1 -2
  506. package/dist/utils/getMergeConflictLineTypes.js.map +1 -1
  507. package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -1
  508. package/dist/utils/getOrCreateCodeNode.js +1 -1
  509. package/dist/utils/getOrCreateCodeNode.js.map +1 -1
  510. package/dist/utils/getSingularPatch.d.ts.map +1 -1
  511. package/dist/utils/getSingularPatch.js +1 -2
  512. package/dist/utils/getSingularPatch.js.map +1 -1
  513. package/dist/utils/getThemes.d.ts.map +1 -1
  514. package/dist/utils/getThemes.js +1 -2
  515. package/dist/utils/getThemes.js.map +1 -1
  516. package/dist/utils/getTotalLineCountFromHunks.d.ts.map +1 -1
  517. package/dist/utils/getTotalLineCountFromHunks.js +1 -1
  518. package/dist/utils/getTotalLineCountFromHunks.js.map +1 -1
  519. package/dist/utils/hast_utils.d.ts +1 -1
  520. package/dist/utils/hast_utils.d.ts.map +1 -1
  521. package/dist/utils/hast_utils.js +1 -1
  522. package/dist/utils/hast_utils.js.map +1 -1
  523. package/dist/utils/hostTheme.d.ts.map +1 -1
  524. package/dist/utils/hostTheme.js +1 -2
  525. package/dist/utils/hostTheme.js.map +1 -1
  526. package/dist/utils/hydratePartialDiff.d.ts +10 -0
  527. package/dist/utils/hydratePartialDiff.d.ts.map +1 -0
  528. package/dist/utils/hydratePartialDiff.js +140 -0
  529. package/dist/utils/hydratePartialDiff.js.map +1 -0
  530. package/dist/utils/includesFileAnnotations.d.ts.map +1 -1
  531. package/dist/utils/includesFileAnnotations.js +5 -5
  532. package/dist/utils/includesFileAnnotations.js.map +1 -1
  533. package/dist/utils/isDefaultRenderRange.d.ts.map +1 -1
  534. package/dist/utils/isDefaultRenderRange.js +1 -1
  535. package/dist/utils/isDefaultRenderRange.js.map +1 -1
  536. package/dist/utils/isDiffPlainText.d.ts.map +1 -1
  537. package/dist/utils/isDiffPlainText.js +1 -2
  538. package/dist/utils/isDiffPlainText.js.map +1 -1
  539. package/dist/utils/isFilePlainText.d.ts.map +1 -1
  540. package/dist/utils/isFilePlainText.js +1 -2
  541. package/dist/utils/isFilePlainText.js.map +1 -1
  542. package/dist/utils/isStyleNode.d.ts.map +1 -1
  543. package/dist/utils/isStyleNode.js +1 -1
  544. package/dist/utils/isStyleNode.js.map +1 -1
  545. package/dist/utils/isWorkerContext.d.ts.map +1 -1
  546. package/dist/utils/isWorkerContext.js +1 -1
  547. package/dist/utils/isWorkerContext.js.map +1 -1
  548. package/dist/utils/iterateOverDiff.d.ts.map +1 -1
  549. package/dist/utils/iterateOverDiff.js +47 -48
  550. package/dist/utils/iterateOverDiff.js.map +1 -1
  551. package/dist/utils/normalizeDiffResolution.d.ts.map +1 -1
  552. package/dist/utils/normalizeDiffResolution.js +1 -1
  553. package/dist/utils/normalizeDiffResolution.js.map +1 -1
  554. package/dist/utils/parseDiffDecorations.d.ts.map +1 -1
  555. package/dist/utils/parseDiffDecorations.js +1 -2
  556. package/dist/utils/parseDiffDecorations.js.map +1 -1
  557. package/dist/utils/parseDiffFromFile.d.ts +1 -2
  558. package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
  559. package/dist/utils/parseDiffFromFile.js +27 -7
  560. package/dist/utils/parseDiffFromFile.js.map +1 -1
  561. package/dist/utils/parseLineType.d.ts.map +1 -1
  562. package/dist/utils/parseLineType.js +1 -1
  563. package/dist/utils/parseLineType.js.map +1 -1
  564. package/dist/utils/parseMergeConflictDiffFromFile.d.ts.map +1 -1
  565. package/dist/utils/parseMergeConflictDiffFromFile.js +5 -5
  566. package/dist/utils/parseMergeConflictDiffFromFile.js.map +1 -1
  567. package/dist/utils/parsePatchFiles.d.ts.map +1 -1
  568. package/dist/utils/parsePatchFiles.js +6 -7
  569. package/dist/utils/parsePatchFiles.js.map +1 -1
  570. package/dist/utils/prefersReducedMotion.d.ts.map +1 -1
  571. package/dist/utils/prefersReducedMotion.js +1 -1
  572. package/dist/utils/prefersReducedMotion.js.map +1 -1
  573. package/dist/utils/prerenderHTMLIfNecessary.d.ts.map +1 -1
  574. package/dist/utils/prerenderHTMLIfNecessary.js +1 -1
  575. package/dist/utils/prerenderHTMLIfNecessary.js.map +1 -1
  576. package/dist/utils/processLine.d.ts +1 -1
  577. package/dist/utils/processLine.d.ts.map +1 -1
  578. package/dist/utils/processLine.js +1 -2
  579. package/dist/utils/processLine.js.map +1 -1
  580. package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
  581. package/dist/utils/renderDiffWithHighlighter.js +4 -5
  582. package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
  583. package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
  584. package/dist/utils/renderFileWithHighlighter.js +1 -2
  585. package/dist/utils/renderFileWithHighlighter.js.map +1 -1
  586. package/dist/utils/resolveConflict.d.ts.map +1 -1
  587. package/dist/utils/resolveConflict.js +1 -2
  588. package/dist/utils/resolveConflict.js.map +1 -1
  589. package/dist/utils/resolveRegion.d.ts.map +1 -1
  590. package/dist/utils/resolveRegion.js +1 -1
  591. package/dist/utils/resolveRegion.js.map +1 -1
  592. package/dist/utils/roundToDevicePixel.d.ts.map +1 -1
  593. package/dist/utils/roundToDevicePixel.js +1 -1
  594. package/dist/utils/roundToDevicePixel.js.map +1 -1
  595. package/dist/utils/scrollbarGutter.d.ts.map +1 -1
  596. package/dist/utils/scrollbarGutter.js +1 -2
  597. package/dist/utils/scrollbarGutter.js.map +1 -1
  598. package/dist/utils/setLanguageOverride.d.ts.map +1 -1
  599. package/dist/utils/setLanguageOverride.js +1 -1
  600. package/dist/utils/setLanguageOverride.js.map +1 -1
  601. package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
  602. package/dist/utils/setWrapperNodeProps.js +1 -2
  603. package/dist/utils/setWrapperNodeProps.js.map +1 -1
  604. package/dist/utils/shouldUseTokenTransformer.d.ts.map +1 -1
  605. package/dist/utils/shouldUseTokenTransformer.js +1 -1
  606. package/dist/utils/shouldUseTokenTransformer.js.map +1 -1
  607. package/dist/utils/splitFileContents.d.ts.map +1 -1
  608. package/dist/utils/splitFileContents.js +1 -2
  609. package/dist/utils/splitFileContents.js.map +1 -1
  610. package/dist/utils/trimPatchContext.d.ts.map +1 -1
  611. package/dist/utils/trimPatchContext.js +1 -2
  612. package/dist/utils/trimPatchContext.js.map +1 -1
  613. package/dist/utils/updateDiffHunks.d.ts +6 -1
  614. package/dist/utils/updateDiffHunks.d.ts.map +1 -1
  615. package/dist/utils/updateDiffHunks.js +44 -3
  616. package/dist/utils/updateDiffHunks.js.map +1 -1
  617. package/dist/utils/virtualDiffLayout.d.ts.map +1 -1
  618. package/dist/utils/virtualDiffLayout.js +1 -2
  619. package/dist/utils/virtualDiffLayout.js.map +1 -1
  620. package/dist/utils/wrapTokenFragments.d.ts +1 -1
  621. package/dist/utils/wrapTokenFragments.d.ts.map +1 -1
  622. package/dist/utils/wrapTokenFragments.js +1 -2
  623. package/dist/utils/wrapTokenFragments.js.map +1 -1
  624. package/dist/worker/WorkerPoolManager.d.ts +7 -2
  625. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  626. package/dist/worker/WorkerPoolManager.js +83 -20
  627. package/dist/worker/WorkerPoolManager.js.map +1 -1
  628. package/dist/worker/getOrCreateWorkerPoolSingleton.d.ts.map +1 -1
  629. package/dist/worker/getOrCreateWorkerPoolSingleton.js +1 -2
  630. package/dist/worker/getOrCreateWorkerPoolSingleton.js.map +1 -1
  631. package/dist/worker/index.d.ts +2 -2
  632. package/dist/worker/index.js +1 -2
  633. package/dist/worker/types.d.ts +7 -1
  634. package/dist/worker/types.d.ts.map +1 -1
  635. package/dist/worker/wasm-B9ZqxnKj.js +8 -0
  636. package/dist/worker/wasm-B9ZqxnKj.js.map +1 -0
  637. package/dist/worker/worker-portable.js +2784 -6406
  638. package/dist/worker/worker-portable.js.map +1 -1
  639. package/dist/worker/worker.js +94 -126
  640. package/dist/worker/worker.js.map +1 -1
  641. package/package.json +13 -14
  642. package/dist/worker/wasm-qE0LgnY3.js +0 -10
  643. package/dist/worker/wasm-qE0LgnY3.js.map +0 -1
@@ -1,11 +1,12 @@
1
+ import { queueRender } from "../managers/UniversalRenderingManager.js";
1
2
  import { getFiletypeFromFileName } from "../utils/getFiletypeFromFileName.js";
2
3
  import { isMoveCursorShortcut, isPrimaryModifier, isSafari } from "./platform.js";
3
- import { resolveEditorCommandFromKeyboardEvent } from "./command.js";
4
+ import { resolveEditorCommandFromKeyboardEvent, resolveFindAgainShortcut } from "./command.js";
4
5
  import { EditStack } from "./editStack.js";
5
6
  import editor_default from "./editor2.js";
6
7
  import { addEventListener, clampDomOffset, extend, getLineNumberAttr, h, round } from "./utils.js";
7
8
  import { applyDocumentChangeToLineAnnotations, renderLineAnnotations } from "./lineAnnotations.js";
8
- import { DirectionBackward, DirectionForward, DirectionNone, applyDeleteHardLineForwardToSelections, applyDeleteSoftLineBackwardToSelections, applyDeleteWordBackwardToSelections, applyTextChangeToSelections, applyTextReplaceToSelections, applyTransposeToSelections, comparePosition, convertSelection, createSelectionFrom, createSelectionFromAnchorAndFocusOffsets, expandCollapsedSelectionToWord, extendSelection, extendSelections, findNexMatch, getCaretPosition, getDocumentBoundarySelection, getDocumentFullSelection, getSelectionAnchor, getSelectionText, isCollapsedSelection, isLineEditable, mapCursorMove, mapSelectionShift, mergeOverlappingSelections, resolveIndentEdits, selectionIntersects } from "./selection.js";
9
+ import { applyDeleteCharacterToSelections, applyDeleteHardLineForwardToSelections, applyDeleteSoftLineBackwardToSelections, applyDeleteWordBackwardToSelections, applyTextChangeToSelections, applyTextReplaceToSelections, applyTransposeToSelections, comparePosition, convertSelection, createSelectionFrom, createSelectionFromAnchorAndFocusOffsets, expandCollapsedSelectionToWord, extendSelection, extendSelections, findNexMatch, getAutoSurroundReplacementTexts, getCaretPosition, getDocumentBoundarySelection, getDocumentFullSelection, getSelectionAnchor, getSelectionText, isCollapsedSelection, isLineEditable, mapCursorMove, mapSelectionShift, mergeOverlappingSelections, remapSelectionsAfterEdits, resolveIndentEdits, resolveSelectionCut, selectionIntersects } from "./selection.js";
9
10
  import { MarkerRenderer, markerSeverityDatasetKey } from "./marker.js";
10
11
  import { createSpriteElement } from "./sprite.js";
11
12
  import { SearchPanelWidget } from "./searchPanel.js";
@@ -13,22 +14,22 @@ import { SelectionActionWidget } from "./selectionAction.js";
13
14
  import { TextDocument } from "./textDocument.js";
14
15
  import { Metrics, getExpandedAsciiTextColumns, getUnicodeMeasurementOffsets, snapTextOffsetToUnicodeBoundary } from "./textMeasure.js";
15
16
  import { EditorTokenizer, renderLineTokens } from "./tokenzier.js";
16
-
17
17
  //#region src/editor/editor.ts
18
+ const MAX_EDIT_WIDEN_WINDOW_MULTIPLE = 2;
18
19
  var Editor = class {
19
20
  #options;
20
- #wrap = false;
21
21
  #metrics = new Metrics();
22
22
  #tokenizer;
23
23
  #editorEventDisposes;
24
24
  #globalEventDisposes;
25
25
  #selectEventDisposes;
26
26
  #detach;
27
+ #contentOffset;
27
28
  #gutterWidthCache;
28
29
  #contentWidthCache;
29
30
  #lineYCache = /* @__PURE__ */ new Map();
30
31
  #wrapLineOffsetsCache = /* @__PURE__ */ new Map();
31
- #lastAccessedLineElement;
32
+ #lineElementsCache = /* @__PURE__ */ new Map();
32
33
  #lastAccessedCharX;
33
34
  #globalStyleElement;
34
35
  #editorStyleElement;
@@ -42,28 +43,36 @@ var Editor = class {
42
43
  #primaryCaretElement;
43
44
  #resizeObserver;
44
45
  #fileInstance;
45
- #fileContents;
46
+ #fileInfo;
46
47
  #lineAnnotations;
47
48
  #textDocument;
48
49
  #renderRange;
50
+ #viewportWindowLines;
49
51
  #markerRenderer;
50
52
  #searchPanel;
51
53
  #selectionAction;
52
54
  #shouldIgnoreSelectionChange = false;
55
+ #suppressNativeSelectionSync = false;
56
+ #contentHasFocus = false;
57
+ #isComposing = false;
53
58
  #isGutterMouseDown = false;
54
59
  #isContentMouseDown = false;
55
60
  #shiftKeyPressed = false;
56
61
  #selectionStart;
62
+ #deletedSelectionText = "";
57
63
  #reservedSelections;
58
64
  #initSelections;
59
65
  #selections;
60
66
  #matches;
61
67
  #scrollingToLine;
62
68
  #scrollingToLineChar;
69
+ #scrollingToLineFixed = false;
63
70
  #scrollingToLineNoFocus = false;
64
71
  #retainSearchPanelFocus = false;
72
+ #fontRemeasureScheduled = false;
73
+ #themeSelectionRefreshFrame;
65
74
  #onDeferTokenize = (lines, themeType) => {
66
- this.#fileInstance?.updateRenderCache(lines, themeType);
75
+ this.#fileInstance?.updateRenderCache(lines, themeType, false);
67
76
  if (this.#renderRange !== void 0 && this.#renderRange.totalLines !== Infinity) {
68
77
  const { startingLine, totalLines } = this.#renderRange;
69
78
  const endLine = Math.min(startingLine + totalLines, this.#textDocument?.lineCount ?? 0);
@@ -76,24 +85,22 @@ var Editor = class {
76
85
  constructor(options = {}) {
77
86
  this.#options = options;
78
87
  }
79
- edit(component) {
80
- const { useTokenTransformer, enableGutterUtility, enableLineSelection, expandUnchanged, diffStyle, lineHoverHighlight,...rest } = component.options;
81
- const isDiff = component.type === "file-diff";
82
- if (useTokenTransformer !== true || enableGutterUtility === true || enableLineSelection === true || lineHoverHighlight !== "disabled" || expandUnchanged !== true && isDiff || diffStyle === "unified" && isDiff) {
83
- component.setOptions({
88
+ edit(fileInstance) {
89
+ const { useTokenTransformer, enableGutterUtility, enableLineSelection, expandUnchanged, lineHoverHighlight = "disabled", ...rest } = fileInstance.options;
90
+ if (useTokenTransformer !== true || enableGutterUtility === true || enableLineSelection === true || expandUnchanged !== true && fileInstance.type === "file-diff" || lineHoverHighlight !== "disabled") {
91
+ fileInstance.setOptions({
84
92
  ...rest,
85
93
  useTokenTransformer: true,
86
94
  enableGutterUtility: false,
87
95
  enableLineSelection: false,
88
- lineHoverHighlight: "disabled",
89
96
  expandUnchanged: true,
90
- diffStyle: "split"
97
+ lineHoverHighlight: "disabled"
91
98
  });
92
- component.rerender();
99
+ fileInstance.rerender();
93
100
  }
94
- this.#fileInstance = component;
101
+ this.#fileInstance = fileInstance;
95
102
  this.#initialize();
96
- this.#detach = component.attachEditor(this);
103
+ this.#detach = fileInstance.attachEditor(this);
97
104
  return () => this.cleanUp();
98
105
  }
99
106
  /**
@@ -102,8 +109,42 @@ var Editor = class {
102
109
  applyEdits(edits, updateHistory = false) {
103
110
  const textDocument = this.#textDocument;
104
111
  if (textDocument == null) throw new Error("Editor is not attached");
105
- const change = textDocument.applyEdits(edits, updateHistory, this.#selections);
106
- if (change !== void 0) this.#applyChange(change, void 0, this.#applyChangeToLineAnnotations(change));
112
+ const wasFocused = this.#contentHasFocus;
113
+ const selectionsBefore = this.#selections;
114
+ const selectionOffsetsBefore = selectionsBefore?.map((selection) => [textDocument.offsetAt(selection.start), textDocument.offsetAt(selection.end)]);
115
+ const resolvedEditOffsets = selectionsBefore === void 0 ? void 0 : edits.map((edit) => {
116
+ const a = textDocument.offsetAt(edit.range.start);
117
+ const b = textDocument.offsetAt(edit.range.end);
118
+ return {
119
+ start: Math.min(a, b),
120
+ end: Math.max(a, b),
121
+ text: edit.newText
122
+ };
123
+ }).sort((a, b) => a.start - b.start);
124
+ const change = textDocument.applyEdits(edits, updateHistory, selectionsBefore);
125
+ if (change === void 0) return;
126
+ let nextSelections;
127
+ if (selectionsBefore !== void 0 && selectionOffsetsBefore !== void 0 && resolvedEditOffsets !== void 0) {
128
+ nextSelections = remapSelectionsAfterEdits(textDocument, selectionsBefore, selectionOffsetsBefore, resolvedEditOffsets);
129
+ if (updateHistory) textDocument.setLastUndoSelectionsAfter(nextSelections);
130
+ }
131
+ this.#applyChange(change, nextSelections, this.#applyChangeToLineAnnotations(change), { skipFocus: !wasFocused });
132
+ }
133
+ /** Whether there is an edit to undo. */
134
+ get canUndo() {
135
+ return this.#textDocument?.canUndo ?? false;
136
+ }
137
+ /** Whether there is an undone edit to redo. */
138
+ get canRedo() {
139
+ return this.#textDocument?.canRedo ?? false;
140
+ }
141
+ /** Undo the last edit. Does nothing when there is nothing to undo. */
142
+ undo() {
143
+ this.#runCommand("undo");
144
+ }
145
+ /** Redo the last undone edit. Does nothing when there is nothing to redo. */
146
+ redo() {
147
+ this.#runCommand("redo");
107
148
  }
108
149
  getState() {
109
150
  const fileRef = this.#getFileRef();
@@ -138,13 +179,13 @@ var Editor = class {
138
179
  const start = textDocument.normalizePosition(selection.start);
139
180
  const end = textDocument.normalizePosition(selection.end);
140
181
  return {
141
- direction: selection.direction === "none" ? DirectionNone : selection.direction === "backward" ? DirectionBackward : DirectionForward,
182
+ direction: selection.direction === "none" ? 0 : selection.direction === "backward" ? -1 : 1,
142
183
  start,
143
184
  end
144
185
  };
145
186
  });
146
187
  this.#updateSelections(resolvedSelections);
147
- this.#scrollToPrimaryCaret(false, "center");
188
+ this.#scrollToPrimaryCaret();
148
189
  }
149
190
  setMarkers(markers) {
150
191
  const textDocument = this.#textDocument;
@@ -157,7 +198,8 @@ var Editor = class {
157
198
  }
158
199
  this.#markerRenderer ??= new MarkerRenderer({
159
200
  getLineHeight: () => this.#metrics.lineHeight,
160
- getFileContainer: () => this.#fileContainer,
201
+ getOverlayElement: () => this.#overlayElement,
202
+ getGutterWidth: () => this.#getGutterWidth(),
161
203
  getCharX: (line, character) => this.#getCharX(line, character),
162
204
  getLineY: (line) => this.#getLineY(line),
163
205
  isMouseDown: () => this.#isContentMouseDown || this.#isGutterMouseDown
@@ -170,7 +212,7 @@ var Editor = class {
170
212
  const preventScroll = options?.preventScroll ?? false;
171
213
  const primarySelection = this.#selections?.at(-1);
172
214
  if (primarySelection !== void 0) {
173
- const pos = primarySelection.direction === DirectionBackward ? primarySelection.end : primarySelection.start;
215
+ const pos = primarySelection.direction === -1 ? primarySelection.end : primarySelection.start;
174
216
  this.#focus(pos, preventScroll);
175
217
  } else this.#focus(void 0, preventScroll);
176
218
  }
@@ -180,6 +222,8 @@ var Editor = class {
180
222
  cleanUp() {
181
223
  this.#tokenizer?.cleanUp();
182
224
  this.#tokenizer = void 0;
225
+ this.#textDocument = void 0;
226
+ this.#fileInfo = void 0;
183
227
  this.#globalEventDisposes?.forEach((dispose) => dispose());
184
228
  this.#globalEventDisposes = void 0;
185
229
  this.#editorEventDisposes?.forEach((dispose) => dispose());
@@ -192,7 +236,7 @@ var Editor = class {
192
236
  this.#contentWidthCache = void 0;
193
237
  this.#lineYCache.clear();
194
238
  this.#wrapLineOffsetsCache.clear();
195
- this.#lastAccessedLineElement = void 0;
239
+ this.#lineElementsCache.clear();
196
240
  this.#lastAccessedCharX = void 0;
197
241
  this.#globalStyleElement?.remove();
198
242
  this.#globalStyleElement = void 0;
@@ -206,14 +250,20 @@ var Editor = class {
206
250
  this.#gutterElement = void 0;
207
251
  this.#contentElement?.removeAttribute("contentEditable");
208
252
  this.#contentElement = void 0;
253
+ this.#contentHasFocus = false;
209
254
  this.#overlayElement?.remove();
210
255
  this.#overlayElement = void 0;
211
256
  this.#resizeObserver?.disconnect();
212
257
  this.#resizeObserver = void 0;
258
+ this.#fontRemeasureScheduled = false;
259
+ if (this.#themeSelectionRefreshFrame !== void 0) {
260
+ cancelAnimationFrame(this.#themeSelectionRefreshFrame);
261
+ this.#themeSelectionRefreshFrame = void 0;
262
+ }
213
263
  this.#resetState();
214
264
  }
215
265
  /** @internal */
216
- __postponeBackgroundTokenizeToNextFrame() {
266
+ __postponeBgTokenizeToNextFrame() {
217
267
  const tokenizer = this.#tokenizer;
218
268
  if (tokenizer !== void 0) {
219
269
  tokenizer.pauseBackgroundTokenize();
@@ -223,7 +273,7 @@ var Editor = class {
223
273
  }
224
274
  }
225
275
  /** @internal */
226
- __syncRenderView = (highlighter, fileContainer, fileContents, lineAnnotations, renderRange) => {
276
+ __syncRenderView = (highlighter, fileContainer, fileOrDiff, lineAnnotations, renderRange) => {
227
277
  const shadowRoot = fileContainer.shadowRoot;
228
278
  if (shadowRoot == null) {
229
279
  console.error("[editor] Could not find the shadow root.");
@@ -235,10 +285,10 @@ var Editor = class {
235
285
  for (const el of shadowRoot.querySelectorAll("[data-code]")) if (el.dataset.deletions === void 0) {
236
286
  codeElement = el;
237
287
  for (const child of el.children) {
238
- const el$1 = child;
239
- const { gutter, content } = el$1.dataset;
240
- if (gutter !== void 0) gutterEl = el$1;
241
- else if (content !== void 0) contentEl = el$1;
288
+ const el = child;
289
+ const { gutter, content } = el.dataset;
290
+ if (gutter !== void 0) gutterEl = el;
291
+ else if (content !== void 0) contentEl = el;
242
292
  }
243
293
  break;
244
294
  }
@@ -250,10 +300,18 @@ var Editor = class {
250
300
  if (this.#themeStyleElement !== void 0) shadowRoot.appendChild(this.#themeStyleElement);
251
301
  if (this.#spriteElement !== void 0) shadowRoot.prepend(this.#spriteElement);
252
302
  }
253
- if (this.#textDocument === void 0 || this.#fileContents === void 0 || this.#fileContents.name !== fileContents.name || this.#fileContents.contents !== fileContents.contents || this.#fileContents.lang !== fileContents.lang || this.#fileContents.cacheKey !== fileContents.cacheKey) {
303
+ if (this.#textDocument === void 0 || this.#fileInfo === void 0 || this.#fileInfo.name !== fileOrDiff.name || this.#fileInfo.lang !== fileOrDiff.lang || this.#fileInfo.cacheKey !== fileOrDiff.cacheKey) {
304
+ let contents = "";
305
+ if ("contents" in fileOrDiff) contents = fileOrDiff.contents;
306
+ else contents = fileOrDiff.additionLines.join("");
254
307
  const editStack = new EditStack({ maxEntries: this.#options.historyMaxEntries });
255
- const textDocument = new TextDocument(fileContents.name, fileContents.contents, fileContents.lang ?? getFiletypeFromFileName(fileContents.name), 0, editStack);
256
- this.#fileContents = fileContents;
308
+ const textDocument = new TextDocument(fileOrDiff.name, contents, fileOrDiff.lang ?? getFiletypeFromFileName(fileOrDiff.name), 0, editStack);
309
+ const { name, lang, cacheKey } = fileOrDiff;
310
+ this.#fileInfo = {
311
+ name,
312
+ lang,
313
+ cacheKey
314
+ };
257
315
  this.#textDocument = textDocument;
258
316
  this.#tokenizer?.cleanUp();
259
317
  this.#tokenizer = new EditorTokenizer({
@@ -261,6 +319,7 @@ var Editor = class {
261
319
  textDocument,
262
320
  codeOptions: this.#fileInstance?.options ?? {},
263
321
  onDeferTokenize: this.#onDeferTokenize,
322
+ onThemeChange: () => this.#scheduleThemeSelectionRefresh(),
264
323
  setStyle: (css) => {
265
324
  this.#themeStyleElement.textContent = css;
266
325
  },
@@ -268,8 +327,10 @@ var Editor = class {
268
327
  });
269
328
  this.#resetState();
270
329
  this.#selections = this.#initSelections;
271
- this.#options.onAttach?.(this, this.#fileInstance);
272
- if (this.#textDocument !== void 0 && this.#options.__debug === true) console.log("[diffs/editor] text document changed !!!");
330
+ requestAnimationFrame(() => {
331
+ this.#options.onAttach?.(this, this.#fileInstance);
332
+ });
333
+ if (this.#textDocument !== void 0 && this.#options.__debug === true) console.log("[diffs/editor] text document rebuilt from", fileOrDiff.name);
273
334
  }
274
335
  if (this.#contentElement !== contentEl) {
275
336
  this.#gutterElement = gutterEl;
@@ -285,14 +346,23 @@ var Editor = class {
285
346
  });
286
347
  if (this.#overlayElement !== void 0) contentEl.after(this.#overlayElement);
287
348
  this.#metrics.init(contentEl);
349
+ this.#remeasureMetricsOnFontLoad();
288
350
  this.#listenContentElement(contentEl, gutterEl);
289
351
  if (this.#contentElement !== void 0 && this.#options.__debug === true) console.log("[diffs/editor] full re-render triggered !!!");
290
352
  }
353
+ if (contentEl.ariaLabel !== fileOrDiff.name) contentEl.ariaLabel = fileOrDiff.name;
354
+ if (lineAnnotations !== void 0 && lineAnnotations.length > 0 || this.#isDiff && this.#diffSyle === "unified") for (const child of this.#contentElement.children) {
355
+ const el = child;
356
+ const { lineAnnotation, lineType } = el.dataset;
357
+ if (lineAnnotation !== void 0 || lineType === "change-deletion") el.setAttribute("contenteditable", "false");
358
+ }
291
359
  this.#resetCache();
292
- this.#wrap = this.#fileInstance?.options.overflow === "wrap";
360
+ this.#tokenizer?.syncTheme(this.#fileInstance?.options ?? {});
293
361
  this.#lineAnnotations = lineAnnotations;
294
362
  this.#renderRange = renderRange;
363
+ this.#viewportWindowLines = renderRange?.totalLines;
295
364
  this.#tokenizer?.prebuildStateStack(renderRange);
365
+ this.#markerRenderer?.removePopup();
296
366
  if (this.#selections !== void 0 || this.#matches !== void 0 || this.#markerRenderer !== void 0) this.#updateSelections(this.#selections ?? []);
297
367
  if (this.#initSelections !== void 0 && this.#primaryCaretElement !== void 0) {
298
368
  this.#initSelections = void 0;
@@ -300,22 +370,30 @@ var Editor = class {
300
370
  } else if (this.#scrollingToLine !== void 0) this.#scrollToLine(this.#scrollingToLine, this.#scrollingToLineChar, this.#scrollingToLineNoFocus);
301
371
  else if (this.#selections !== void 0 && this.#selections.length > 0 && !this.#retainSearchPanelFocus) this.focus({ preventScroll: true });
302
372
  if (this.#retainSearchPanelFocus) this.#searchPanel?.focus();
303
- if (this.#selectionAction !== void 0 && this.#isLineVisible(this.#selectionAction.line) && this.#contentElement !== void 0) this.#selectionAction.render(this.#contentElement);
304
373
  if (this.#options.__debug === true && renderRange !== void 0) {
305
374
  const { startingLine, totalLines } = renderRange;
306
- console.log("[diffs/editor] render file:", fileContents.name, "RenderRange:", startingLine + "-" + (startingLine + totalLines), "of", this.#textDocument.lineCount, "lines");
375
+ console.log("[diffs/editor] render file:", fileOrDiff.name, "RenderRange:", startingLine + "-" + (startingLine + totalLines), "of", this.#textDocument?.lineCount, "lines");
307
376
  }
308
377
  };
378
+ get #diffSyle() {
379
+ return this.#fileInstance?.options.diffStyle ?? "split";
380
+ }
381
+ get #isDiff() {
382
+ return this.#fileInstance?.type === "file-diff";
383
+ }
384
+ get #isWrap() {
385
+ return this.#fileInstance?.options.overflow === "wrap";
386
+ }
309
387
  #resetCache() {
310
388
  this.#lineYCache.clear();
311
389
  this.#wrapLineOffsetsCache.clear();
312
- this.#lastAccessedLineElement = void 0;
390
+ this.#lineElementsCache.clear();
313
391
  this.#lastAccessedCharX = void 0;
314
392
  }
315
393
  #resetState() {
394
+ this.#setSelectedLinesSafe(null);
316
395
  this.#gutterWidthCache = void 0;
317
396
  this.#contentWidthCache = void 0;
318
- this.#fileInstance?.setSelectedLines(null);
319
397
  this.#shouldIgnoreSelectionChange = false;
320
398
  this.#overlayElements?.forEach((el) => el.remove());
321
399
  this.#overlayElements = void 0;
@@ -349,11 +427,13 @@ var Editor = class {
349
427
  this.#globalEventDisposes = [
350
428
  addEventListener(document, "selectionchange", () => {
351
429
  const shadowRoot = this.#fileContainer?.shadowRoot;
352
- if (this.#shouldIgnoreSelectionChange || shadowRoot == null) return;
430
+ if (this.#shouldIgnoreSelectionChange || this.#suppressNativeSelectionSync || shadowRoot == null || !this.#contentHasFocus) return;
353
431
  if (this.#selections !== void 0 && this.#selections.length > 1 && !this.#isContentMouseDown) return;
354
- const composedRange = document.getSelection()?.getComposedRanges({ shadowRoots: [shadowRoot] })?.[0];
432
+ const selectionRaw = document.getSelection();
433
+ if (selectionRaw == null || typeof selectionRaw.getComposedRanges !== "function") return;
434
+ const composedRange = selectionRaw.getComposedRanges({ shadowRoots: [shadowRoot] })?.[0];
355
435
  if (composedRange === void 0 || !this.#rangeBelongsToEditor(composedRange)) return;
356
- let selection = convertSelection(composedRange, DirectionNone);
436
+ let selection = convertSelection(composedRange, 0);
357
437
  if (selection === void 0) return;
358
438
  if (this.#isContentMouseDown && this.#shiftKeyPressed && this.#selections !== void 0 && this.#selections.length > 0) {
359
439
  const primarySelection = this.#selections.at(-1);
@@ -379,9 +459,7 @@ var Editor = class {
379
459
  this.#shiftKeyPressed = false;
380
460
  this.#selectionStart = void 0;
381
461
  this.#reservedSelections = void 0;
382
- this.#overlayElements?.forEach((el, key) => {
383
- if (key.startsWith("selectionActionIcon-")) el.dataset.visible = "true";
384
- });
462
+ if (this.#options.enabledSelectionAction === true && this.#selections !== void 0 && this.#selections.length > 0 && !isCollapsedSelection(this.#selections.at(-1))) this.#updateSelections(this.#selections);
385
463
  }, { passive: true }),
386
464
  addEventListener(document, "keydown", (e) => {
387
465
  if (e.key === "Shift") this.#selectionStart = this.#selections?.at(-1);
@@ -391,6 +469,10 @@ var Editor = class {
391
469
  }, { passive: true })
392
470
  ];
393
471
  }
472
+ #replaceSelectEventListeners(disposes) {
473
+ this.#selectEventDisposes?.forEach((dispose) => dispose());
474
+ this.#selectEventDisposes = disposes;
475
+ }
394
476
  #listenContentElement(contentEl, gutterEl) {
395
477
  const targetIsContentElement = (e) => {
396
478
  const target = e.composedPath()[0];
@@ -398,25 +480,42 @@ var Editor = class {
398
480
  };
399
481
  this.#editorEventDisposes?.forEach((dispose) => dispose());
400
482
  this.#editorEventDisposes = [
483
+ addEventListener(contentEl, "focus", () => {
484
+ this.#contentHasFocus = true;
485
+ if (!this.#isContentMouseDown && !this.#shouldIgnoreSelectionChange && this.#selections !== void 0 && this.#selections.length > 0) this.#setWindowSelection(this.#selections.at(-1));
486
+ }, { passive: true }),
487
+ addEventListener(contentEl, "blur", () => {
488
+ this.#contentHasFocus = false;
489
+ }, { passive: true }),
401
490
  addEventListener(contentEl, "pointerdown", (e) => {
491
+ this.#suppressNativeSelectionSync = false;
402
492
  if (e.pointerType !== "mouse") return;
493
+ if (this.#isDeletedLineTarget(e)) {
494
+ this.#setDeletedTextSelectionActive(true);
495
+ if (this.#selections !== void 0) this.#updateSelections([]);
496
+ return;
497
+ }
498
+ this.#setDeletedTextSelectionActive(false);
403
499
  this.#markerRenderer?.removePopup();
404
- if (isSafari() && this.#lineAnnotations !== void 0 && this.#lineAnnotations.length > 0) this.#selectEventDisposes = [...contentEl.querySelectorAll("[data-line-annotation]")].map((el) => [addEventListener(el, "mouseenter", () => {
405
- this.#shouldIgnoreSelectionChange = true;
406
- }), addEventListener(el, "mouseleave", () => {
407
- this.#shouldIgnoreSelectionChange = false;
408
- })]).flat();
500
+ if (isSafari() && this.#lineAnnotations !== void 0 && this.#lineAnnotations.length > 0) {
501
+ const annotationDisposes = [...contentEl.querySelectorAll("[data-line-annotation]")].map((el) => [addEventListener(el, "mouseenter", () => {
502
+ this.#shouldIgnoreSelectionChange = true;
503
+ }), addEventListener(el, "mouseleave", () => {
504
+ this.#shouldIgnoreSelectionChange = false;
505
+ })]).flat();
506
+ this.#replaceSelectEventListeners(annotationDisposes);
507
+ }
409
508
  this.#isContentMouseDown = true;
410
509
  this.#selectionStart = void 0;
411
510
  if (e.button === 0 && isPrimaryModifier(e)) this.#reservedSelections = this.#selections?.map((selection) => ({ ...selection }));
412
511
  if (e.shiftKey) {
413
512
  const primarySelection = this.#selections?.at(-1);
414
513
  if (primarySelection !== void 0) {
415
- const pos = primarySelection.direction === DirectionBackward ? primarySelection.end : primarySelection.start;
514
+ const pos = primarySelection.direction === -1 ? primarySelection.end : primarySelection.start;
416
515
  this.#setWindowSelection({
417
516
  start: pos,
418
517
  end: pos,
419
- direction: DirectionNone
518
+ direction: 0
420
519
  });
421
520
  }
422
521
  this.#shiftKeyPressed = true;
@@ -437,7 +536,7 @@ var Editor = class {
437
536
  this.#updateSelections([{
438
537
  start: pos,
439
538
  end: pos,
440
- direction: DirectionNone
539
+ direction: 0
441
540
  }]);
442
541
  this.#focus(pos);
443
542
  }
@@ -445,6 +544,7 @@ var Editor = class {
445
544
  return;
446
545
  }
447
546
  if (!targetIsContentElement(e)) return;
547
+ this.#suppressNativeSelectionSync = false;
448
548
  const mvShortcut = isMoveCursorShortcut(e);
449
549
  const textDocument = this.#textDocument;
450
550
  if (this.#selections !== void 0 && this.#selections.length > 0 && mvShortcut !== void 0 && textDocument !== void 0) {
@@ -454,6 +554,19 @@ var Editor = class {
454
554
  e.preventDefault();
455
555
  return;
456
556
  }
557
+ if (e.key === "v" && isPrimaryModifier(e) && this.#options.clipboard !== void 0) {
558
+ e.preventDefault();
559
+ queueRender(this.#handleCustomPasteEvent);
560
+ return;
561
+ }
562
+ if (this.#searchPanel !== void 0) {
563
+ const findAgain = resolveFindAgainShortcut(e);
564
+ if (findAgain !== void 0) {
565
+ e.preventDefault();
566
+ this.#searchPanel.navigate(findAgain === "previous");
567
+ return;
568
+ }
569
+ }
457
570
  const command = resolveEditorCommandFromKeyboardEvent(e);
458
571
  if (command !== void 0) {
459
572
  e.preventDefault();
@@ -463,22 +576,23 @@ var Editor = class {
463
576
  addEventListener(contentEl, "copy", (e) => {
464
577
  if (!targetIsContentElement(e)) return;
465
578
  e.preventDefault();
466
- e.clipboardData?.setData("text", this.#getSelectionText());
579
+ e.clipboardData?.setData("text", this.#isDeletedTextSelectionActive() ? this.#deletedTextForClipboard() : this.#getSelectionText());
467
580
  }),
468
581
  addEventListener(contentEl, "cut", (e) => {
469
582
  if (!targetIsContentElement(e)) return;
470
583
  e.preventDefault();
471
- e.clipboardData?.setData("text", this.#getSelectionText());
472
- this.#replaceSelectionText("");
584
+ e.clipboardData?.setData("text", this.#isDeletedTextSelectionActive() ? this.#deletedTextForClipboard() : this.#cutSelectionText());
473
585
  }),
474
586
  addEventListener(contentEl, "paste", (e) => {
475
587
  if (!targetIsContentElement(e)) return;
476
588
  e.preventDefault();
477
589
  const text = e.clipboardData?.getData("text");
478
- if (text !== void 0) this.#replaceSelectionText(text);
590
+ const textDocument = this.#textDocument;
591
+ if (text !== void 0 && textDocument !== void 0) this.#replaceSelectionText(textDocument.normalizeEol(text), void 0, true);
479
592
  }),
480
593
  addEventListener(contentEl, "beforeinput", (e) => {
481
594
  if (!targetIsContentElement(e)) return;
595
+ if (e.inputType === "insertCompositionText") return;
482
596
  e.preventDefault();
483
597
  this.#handleInput(e.inputType, e.data);
484
598
  }),
@@ -488,14 +602,25 @@ var Editor = class {
488
602
  }),
489
603
  addEventListener(contentEl, "compositionstart", (e) => {
490
604
  if (!targetIsContentElement(e)) return;
605
+ this.#isComposing = true;
491
606
  this.#shouldIgnoreSelectionChange = true;
492
607
  }, { passive: true }),
493
608
  addEventListener(contentEl, "compositionend", (e) => {
494
609
  if (!targetIsContentElement(e)) return;
495
610
  this.#shouldIgnoreSelectionChange = false;
496
- this.#handleInput("insertText", e.data);
611
+ const wasComposing = this.#isComposing;
612
+ this.#isComposing = false;
613
+ if (e.data !== "" || !wasComposing) this.#handleInput("insertText", e.data);
497
614
  }, { passive: true })
498
615
  ];
616
+ const deletionsCode = this.#fileContainer?.shadowRoot?.querySelector("[data-deletions]");
617
+ if (deletionsCode != null) this.#editorEventDisposes.push(addEventListener(deletionsCode, "pointerdown", (e) => {
618
+ const target = e.composedPath()[0];
619
+ const gutterRow = target instanceof HTMLElement ? target.closest("[data-column-number]") : null;
620
+ if (gutterRow instanceof HTMLElement && this.#beginDeletionGutterSelection(gutterRow, deletionsCode, e.pointerType === "mouse")) return;
621
+ this.#setDeletedTextSelectionActive(true);
622
+ if (this.#selections !== void 0) this.#updateSelections([]);
623
+ }, { passive: true }));
499
624
  if (gutterEl !== void 0) {
500
625
  const resolveGutterTarget = (eventTarget, includeContentLine = false) => {
501
626
  let target = eventTarget;
@@ -511,55 +636,61 @@ var Editor = class {
511
636
  return lineNumber - 1;
512
637
  };
513
638
  this.#editorEventDisposes.push(addEventListener(gutterEl, "pointerdown", (e) => {
639
+ const gutterRow = resolveGutterTarget(e.composedPath()[0]);
640
+ if (gutterRow?.dataset.lineType === "change-deletion") {
641
+ const code = gutterRow.closest("[data-code]");
642
+ if (code != null) this.#beginDeletionGutterSelection(gutterRow, code, e.pointerType === "mouse");
643
+ return;
644
+ }
645
+ if (e.pointerType !== "mouse") return;
514
646
  const textDocument = this.#textDocument;
515
- const lineIndex = resolveEditableLine(resolveGutterTarget(e.composedPath()[0]));
647
+ const lineIndex = resolveEditableLine(gutterRow);
516
648
  if (lineIndex === void 0 || textDocument === void 0) return;
517
649
  this.#markerRenderer?.removePopup();
518
- const selection = {
519
- start: {
520
- line: lineIndex,
521
- character: 0
522
- },
523
- end: {
524
- line: lineIndex,
525
- character: textDocument.getLineText(lineIndex).length
526
- },
527
- direction: DirectionForward
528
- };
650
+ const selection = this.#spanLineSelection(lineIndex, lineIndex, textDocument);
529
651
  this.#isGutterMouseDown = true;
530
652
  this.#selectionStart = selection;
531
653
  this.#updateSelections([selection]);
532
- this.#focus(selection.end);
533
- this.#selectEventDisposes = [addEventListener(document, "mousemove", (e$1) => {
654
+ this.#setWindowSelection(selection);
655
+ this.#focus();
656
+ this.#replaceSelectEventListeners([addEventListener(document, "mousemove", (e) => {
534
657
  if (!this.#isGutterMouseDown) return;
535
- const textDocument$1 = this.#textDocument;
536
- const lineIndex$1 = resolveEditableLine(resolveGutterTarget(e$1.composedPath()[0], true));
537
- if (lineIndex$1 === void 0 || textDocument$1 === void 0) return;
538
- let selection$1 = {
539
- start: {
540
- line: lineIndex$1,
541
- character: 0
542
- },
543
- end: {
544
- line: lineIndex$1,
545
- character: textDocument$1.getLineText(lineIndex$1).length
546
- },
547
- direction: DirectionForward
548
- };
549
- if (this.#selectionStart !== void 0) selection$1 = createSelectionFrom(this.#selectionStart, selection$1);
550
- else this.#selectionStart = selection$1;
551
- this.#updateSelections([selection$1]);
552
- this.#focus(selection$1.end);
553
- }, { passive: true })];
658
+ const textDocument = this.#textDocument;
659
+ const lineIndex = resolveEditableLine(resolveGutterTarget(e.composedPath()[0], true));
660
+ if (lineIndex === void 0 || textDocument === void 0) return;
661
+ const anchorLine = this.#selectionStart?.start.line ?? lineIndex;
662
+ const selection = this.#spanLineSelection(anchorLine, lineIndex, textDocument);
663
+ this.#selectionStart ??= selection;
664
+ this.#updateSelections([selection]);
665
+ this.#focus(selection.direction === -1 ? selection.start : selection.end);
666
+ }, { passive: true })]);
554
667
  }, { passive: true }));
555
668
  }
556
669
  this.#markerRenderer?.listenHover(contentEl);
557
670
  this.#resizeObserver?.disconnect();
558
- this.#resizeObserver = new ResizeObserver(() => {
559
- this.#handleLayoutResize();
560
- });
671
+ this.#resizeObserver = new ResizeObserver(this.#handleLayoutResize);
561
672
  this.#resizeObserver.observe(contentEl);
562
673
  this.#resizeObserver.observe(contentEl.parentElement);
674
+ this.#computeContentOffset(contentEl);
675
+ }
676
+ #handleCustomPasteEvent = async () => {
677
+ const clipboard = this.#options.clipboard;
678
+ if (clipboard !== void 0) {
679
+ const text = await clipboard.readText();
680
+ this.#replaceSelectionText(text, void 0, true);
681
+ }
682
+ };
683
+ #computeContentOffset(contentEl) {
684
+ if (this.#isDiff && this.#diffSyle === "split" && this.#isWrap) {
685
+ this.#contentOffset = {
686
+ top: contentEl.offsetTop,
687
+ left: contentEl.offsetLeft - this.#getGutterWidth()
688
+ };
689
+ if (this.#options.__debug === true) console.log("[diffs/editor] content offset:", this.#contentOffset);
690
+ }
691
+ }
692
+ get #activeContentOffset() {
693
+ if (this.#isDiff && this.#diffSyle === "split" && this.#isWrap) return this.#contentOffset;
563
694
  }
564
695
  #runCommand(command) {
565
696
  const textDocument = this.#textDocument;
@@ -595,6 +726,7 @@ var Editor = class {
595
726
  if (this.#selections !== void 0) {
596
727
  const edits = [];
597
728
  const nextSelections = [];
729
+ const sameLineIndents = [];
598
730
  for (const selection of this.#selections) {
599
731
  const startLine = selection.start.line;
600
732
  const outdent = command === "outdent";
@@ -603,26 +735,77 @@ var Editor = class {
603
735
  edits.push(...ret[0]);
604
736
  nextSelections.push(ret[1]);
605
737
  } else {
606
- const lineChar0 = textDocument.charAt({
738
+ const text = textDocument.charAt({
607
739
  line: startLine,
608
740
  character: 0
741
+ }) === " " ? " " : " ".repeat(this.#metrics.tabSize);
742
+ edits.push({
743
+ range: selection,
744
+ newText: text
745
+ });
746
+ sameLineIndents.push({
747
+ line: startLine,
748
+ startCharacter: selection.start.character,
749
+ addedLength: text.length - (selection.end.character - selection.start.character),
750
+ selectionIndex: nextSelections.length
609
751
  });
610
- this.#replaceSelectionText(lineChar0 === " " ? " " : " ".repeat(this.#metrics.tabSize));
752
+ const nextPosition = {
753
+ line: selection.start.line,
754
+ character: selection.start.character + text.length
755
+ };
756
+ nextSelections.push({
757
+ start: nextPosition,
758
+ end: nextPosition,
759
+ direction: 0
760
+ });
761
+ }
762
+ }
763
+ for (const indent of sameLineIndents) {
764
+ let shift = 0;
765
+ for (const other of sameLineIndents) if (other.line === indent.line && other.startCharacter < indent.startCharacter) shift += other.addedLength;
766
+ if (shift !== 0) {
767
+ const current = nextSelections[indent.selectionIndex];
768
+ const position = {
769
+ line: indent.line,
770
+ character: current.start.character + shift
771
+ };
772
+ nextSelections[indent.selectionIndex] = {
773
+ start: position,
774
+ end: position,
775
+ direction: 0
776
+ };
611
777
  }
612
778
  }
613
779
  const change = textDocument.applyEdits(edits, true, this.#selections, nextSelections);
614
780
  if (change !== void 0) this.#applyChange(change, nextSelections);
615
781
  }
616
782
  break;
617
- case "selectAll":
618
- this.#updateSelections([getDocumentFullSelection(textDocument)]);
783
+ case "selectAll": {
784
+ const fullSelection = getDocumentFullSelection(textDocument);
785
+ this.#updateSelections([fullSelection]);
619
786
  this.focus();
787
+ const renderedLines = this.#getRenderedEditableLineRange();
788
+ if (renderedLines !== void 0) {
789
+ this.#suppressNativeSelectionSync = true;
790
+ this.#setWindowSelection({
791
+ start: {
792
+ line: renderedLines.first,
793
+ character: 0
794
+ },
795
+ end: {
796
+ line: renderedLines.last,
797
+ character: textDocument.getLineLength(renderedLines.last)
798
+ },
799
+ direction: 1
800
+ });
801
+ }
620
802
  break;
803
+ }
621
804
  case "moveCursorToDocStart":
622
805
  case "moveCursorToDocEnd":
623
806
  {
624
807
  const atEnd = command === "moveCursorToDocEnd";
625
- this.#updateSelections([getDocumentBoundarySelection(textDocument, atEnd)]);
808
+ this.#updateSelections([getDocumentBoundarySelection(textDocument, atEnd, this.#isDiff)]);
626
809
  this.#scrollToPrimaryCaret();
627
810
  }
628
811
  break;
@@ -632,7 +815,7 @@ var Editor = class {
632
815
  const atEnd = command === "expandSelectionDocEnd";
633
816
  const selections = this.#selections;
634
817
  if (selections !== void 0) {
635
- this.#updateSelections(extendSelections(selections, getDocumentBoundarySelection(textDocument, atEnd)));
818
+ this.#updateSelections(extendSelections(selections, getDocumentBoundarySelection(textDocument, atEnd, this.#isDiff)));
636
819
  this.#scrollToPrimaryCaret();
637
820
  }
638
821
  }
@@ -651,7 +834,7 @@ var Editor = class {
651
834
  break;
652
835
  }
653
836
  }
654
- #handleLayoutResize() {
837
+ #handleLayoutResize = () => {
655
838
  const lineAnnotations = this.#lineAnnotations?.length ?? 0;
656
839
  const prevGutterWidth = this.#gutterWidthCache;
657
840
  const prevContentWidth = this.#contentWidthCache;
@@ -660,9 +843,10 @@ var Editor = class {
660
843
  const gutterWidthChanged = this.#getGutterWidth() !== prevGutterWidth;
661
844
  const contentWidthChanged = this.#getContentWidth() !== prevContentWidth;
662
845
  if (!gutterWidthChanged && !contentWidthChanged) return;
663
- this.#lastAccessedLineElement = void 0;
846
+ this.#lineElementsCache.clear();
664
847
  this.#lastAccessedCharX = void 0;
665
- if (contentWidthChanged && (this.#wrap || lineAnnotations > 0)) {
848
+ this.#metrics.clearTextWidthCache();
849
+ if (contentWidthChanged && (this.#isWrap || lineAnnotations > 0)) {
666
850
  this.#lineYCache.clear();
667
851
  this.#wrapLineOffsetsCache.clear();
668
852
  }
@@ -671,15 +855,29 @@ var Editor = class {
671
855
  if (this.#selections !== void 0) this.focus();
672
856
  }
673
857
  this.#markerRenderer?.removePopup();
858
+ this.#computeContentOffset(this.#contentElement);
859
+ };
860
+ #remeasureMetricsOnFontLoad() {
861
+ if (this.#fontRemeasureScheduled) return;
862
+ const fonts = document.fonts;
863
+ if (fonts === void 0) return;
864
+ this.#fontRemeasureScheduled = true;
865
+ fonts.ready.then(() => {
866
+ if (this.#contentElement === void 0 || !this.#metrics.remeasureCharacterWidth()) return;
867
+ this.#gutterWidthCache = void 0;
868
+ this.#contentWidthCache = void 0;
869
+ this.#resetCache();
870
+ if (this.#selections !== void 0 || this.#matches !== void 0 || this.#markerRenderer !== void 0) this.#updateSelections(this.#selections ?? []);
871
+ this.#markerRenderer?.removePopup();
872
+ });
674
873
  }
675
874
  #rerender(change, newLineAnnotations, renderRange = this.#renderRange, shouldUpdateBuffer) {
676
875
  const tokenizer = this.#tokenizer;
677
876
  const fileInstance = this.#fileInstance;
678
- const fileContents = this.#fileContents;
679
877
  const textDocument = this.#textDocument;
680
878
  const gutterEl = this.#gutterElement;
681
879
  const contentEl = this.#contentElement;
682
- if (tokenizer === void 0 || fileInstance === void 0 || fileContents === void 0 || textDocument === void 0 || contentEl === void 0) return;
880
+ if (tokenizer === void 0 || fileInstance === void 0 || textDocument === void 0 || contentEl === void 0) return;
683
881
  tokenizer.stopBackgroundTokenize();
684
882
  const t = performance.now();
685
883
  const dirtyLines = tokenizer.tokenize(change, renderRange);
@@ -692,14 +890,14 @@ var Editor = class {
692
890
  const child = children[i];
693
891
  if (child !== void 0) {
694
892
  const lineNumber = getLineNumberAttr(child);
695
- if (lineNumber !== void 0) {
696
- const lineIndex = lineNumber - 1;
697
- if (dirtyLines.has(lineIndex)) {
698
- const tokens = dirtyLines.get(lineIndex);
699
- child.replaceChildren(...renderLineTokens(tokens, tokenizer.themeType));
700
- dirtyLineIndexes.delete(lineIndex);
701
- if (dirtyLineIndexes.size === 0) break;
702
- }
893
+ const lineType = child.dataset.lineType;
894
+ if (lineNumber === void 0 || lineType === "change-deletion") continue;
895
+ const lineIndex = lineNumber - 1;
896
+ if (dirtyLines.has(lineIndex)) {
897
+ const tokens = dirtyLines.get(lineIndex);
898
+ child.replaceChildren(...renderLineTokens(tokens, tokenizer.themeType));
899
+ dirtyLineIndexes.delete(lineIndex);
900
+ if (dirtyLineIndexes.size === 0) break;
703
901
  }
704
902
  }
705
903
  }
@@ -730,11 +928,11 @@ var Editor = class {
730
928
  if (change.lineDelta < 0) for (const children of [contentEl.children, gutterEl?.children ?? []]) for (let i = children.length - 1; i >= 0; i--) {
731
929
  const child = children[i];
732
930
  const lineNumber = getLineNumberAttr(child) ?? getLineNumberAttr(child, "columnNumber");
733
- if (lineNumber === void 0) continue;
931
+ const lineType = child.dataset.lineType;
932
+ if (lineNumber === void 0 || lineType === "change-deletion") continue;
734
933
  if (lineNumber - 1 < change.lineCount) break;
735
934
  child.remove();
736
935
  }
737
- const isDiff = Object.hasOwn(fileInstance, "fileDiff");
738
936
  const didLineCountChange = change.lineDelta !== 0;
739
937
  if (didLineCountChange) {
740
938
  let gridRow = contentEl.children.length;
@@ -745,8 +943,9 @@ var Editor = class {
745
943
  contentEl.style.gridRow = "span " + gridRow;
746
944
  if (gutterEl !== void 0) gutterEl.style.gridRow = "span " + gridRow;
747
945
  }
748
- fileInstance.updateRenderCache(dirtyLines, tokenizer.themeType, isDiff ? !didLineCountChange : void 0);
946
+ fileInstance.updateRenderCache(dirtyLines, tokenizer.themeType, !didLineCountChange);
749
947
  if (didLineCountChange) fileInstance.applyDocumentChange(textDocument, newLineAnnotations, shouldUpdateBuffer);
948
+ if (this.#isDiff && (this.#diffSyle === "unified" || didLineCountChange)) this.#resetCache();
750
949
  if (newLineAnnotations !== void 0) {
751
950
  this.#lineAnnotations = newLineAnnotations;
752
951
  renderLineAnnotations(newLineAnnotations, contentEl, gutterEl);
@@ -755,9 +954,16 @@ var Editor = class {
755
954
  }
756
955
  #handleInput(inputType, data) {
757
956
  switch (inputType) {
758
- case "insertText":
759
- this.#replaceSelectionText(data ?? "");
957
+ case "insertText": {
958
+ const text = data ?? "";
959
+ const textDocument = this.#textDocument;
960
+ const selections = this.#selections;
961
+ const autoSurroundTexts = textDocument !== void 0 && selections !== void 0 ? getAutoSurroundReplacementTexts(textDocument, selections, text, this.#options.autoSurround) : void 0;
962
+ this.#replaceSelectionText(autoSurroundTexts ?? text);
760
963
  break;
964
+ }
965
+ case "insertCompositionText": break;
966
+ case "insertLineBreak":
761
967
  case "insertParagraph":
762
968
  this.#replaceSelectionText("\n");
763
969
  break;
@@ -768,6 +974,7 @@ var Editor = class {
768
974
  this.#deleteSelectionText(true);
769
975
  break;
770
976
  case "deleteSoftLineBackward":
977
+ case "deleteHardLineBackward":
771
978
  this.#deleteSoftLineBackward();
772
979
  break;
773
980
  case "deleteHardLineForward":
@@ -785,12 +992,13 @@ var Editor = class {
785
992
  }
786
993
  }
787
994
  #focus(position, preventScroll = true) {
995
+ this.#contentHasFocus = true;
788
996
  if (position !== void 0) {
789
997
  this.#shouldIgnoreSelectionChange = true;
790
998
  this.#setWindowSelection({
791
999
  start: position,
792
1000
  end: position,
793
- direction: DirectionNone
1001
+ direction: 0
794
1002
  });
795
1003
  requestAnimationFrame(() => {
796
1004
  this.#contentElement?.focus({ preventScroll });
@@ -810,7 +1018,7 @@ var Editor = class {
810
1018
  if (startLineElement === void 0 || endLineElement === void 0) return;
811
1019
  let [anchorNode, anchorOffset] = getSelectionAnchor(startLineElement, start.character);
812
1020
  let [focusNode, focusOffset] = getSelectionAnchor(endLineElement, end.character);
813
- if (direction === DirectionBackward) [anchorNode, anchorOffset, focusNode, focusOffset] = [
1021
+ if (direction === -1) [anchorNode, anchorOffset, focusNode, focusOffset] = [
814
1022
  focusNode,
815
1023
  focusOffset,
816
1024
  anchorNode,
@@ -831,7 +1039,7 @@ var Editor = class {
831
1039
  block: scrollPosition,
832
1040
  inline: "nearest"
833
1041
  });
834
- if (!noFocus) this.#focus(primarySelection.direction === DirectionBackward ? primarySelection.end : primarySelection.start);
1042
+ if (!noFocus) this.#focus(primarySelection.direction === -1 ? primarySelection.end : primarySelection.start);
835
1043
  } else {
836
1044
  const pos = getCaretPosition(primarySelection);
837
1045
  this.#scrollToLine(pos.line, pos.character, noFocus);
@@ -845,7 +1053,7 @@ var Editor = class {
845
1053
  return `${componentTop + top}px ${end}px 0 ${start}px`;
846
1054
  }
847
1055
  #scrollToLine(line, char = 0, noFocus = false) {
848
- this.__postponeBackgroundTokenizeToNextFrame();
1056
+ this.__postponeBgTokenizeToNextFrame();
849
1057
  const virtualCaret = h("div", { style: {
850
1058
  position: "absolute",
851
1059
  left: "0",
@@ -869,46 +1077,174 @@ var Editor = class {
869
1077
  });
870
1078
  this.#scrollingToLine = void 0;
871
1079
  this.#scrollingToLineChar = void 0;
1080
+ this.#scrollingToLineFixed = false;
872
1081
  this.#scrollingToLineNoFocus = false;
873
1082
  } else {
874
- let yFix = 0;
875
- if (this.#scrollingToLine === line && this.#contentElement !== void 0) for (let i = this.#contentElement.childElementCount - 1; i >= 0; i--) {
876
- const child = this.#contentElement.children[i];
877
- const lineType = child.dataset.lineType;
878
- const lineNumber = getLineNumberAttr(child);
879
- if (lineType !== void 0 && isLineEditable(lineType) && lineNumber !== void 0) {
880
- yFix = (line - lineNumber) * this.#metrics.lineHeight;
881
- break;
1083
+ const modelLinePosition = this.#fileInstance?.getLinePosition?.(line + 1);
1084
+ if (modelLinePosition !== void 0) {
1085
+ virtualCaret.style.top = modelLinePosition.top + "px";
1086
+ this.#fileContainer?.shadowRoot?.appendChild(virtualCaret);
1087
+ virtualCaret.scrollIntoView({
1088
+ block: "center",
1089
+ inline: "nearest"
1090
+ });
1091
+ if (modelLinePosition.height > 0) {
1092
+ this.#scrollingToLine = line;
1093
+ this.#scrollingToLineChar = char;
1094
+ this.#scrollingToLineNoFocus = noFocus;
1095
+ } else {
1096
+ this.#scrollingToLine = void 0;
1097
+ this.#scrollingToLineChar = void 0;
1098
+ this.#scrollingToLineNoFocus = false;
882
1099
  }
883
- }
884
- const approximateLineY = ((this.#lineAnnotations ?? []).filter((annotation) => annotation.lineNumber < line).length + line) * this.#metrics.lineHeight + yFix;
885
- virtualCaret.style.top = approximateLineY + "px";
886
- this.#fileContainer?.shadowRoot?.appendChild(virtualCaret);
887
- virtualCaret.scrollIntoView({
888
- block: "center",
889
- inline: "nearest"
890
- });
891
- if (this.#scrollingToLine === line && yFix === 0) {
892
- this.#scrollingToLine = void 0;
893
- this.#scrollingToLineChar = void 0;
894
- this.#scrollingToLineNoFocus = false;
895
1100
  } else {
896
- this.#scrollingToLine = line;
897
- this.#scrollingToLineChar = char;
898
- this.#scrollingToLineNoFocus = noFocus;
1101
+ let yFix = 0;
1102
+ if (this.#scrollingToLine === line && this.#contentElement !== void 0) for (let i = this.#contentElement.childElementCount - 1; i >= 0; i--) {
1103
+ const child = this.#contentElement.children[i];
1104
+ const lineType = child.dataset.lineType;
1105
+ const lineNumber = getLineNumberAttr(child);
1106
+ if (lineType !== void 0 && isLineEditable(lineType) && lineNumber !== void 0) {
1107
+ yFix = (line - (lineNumber - 1)) * this.#metrics.lineHeight;
1108
+ break;
1109
+ }
1110
+ }
1111
+ const approximateLineY = ((this.#lineAnnotations ?? []).filter((annotation) => annotation.lineNumber < line).length + line) * this.#metrics.lineHeight + yFix;
1112
+ virtualCaret.style.top = approximateLineY + "px";
1113
+ this.#fileContainer?.shadowRoot?.appendChild(virtualCaret);
1114
+ virtualCaret.scrollIntoView({
1115
+ block: "center",
1116
+ inline: "nearest"
1117
+ });
1118
+ if (this.#scrollingToLine === line && yFix === 0) {
1119
+ this.#scrollingToLine = void 0;
1120
+ this.#scrollingToLineChar = void 0;
1121
+ this.#scrollingToLineFixed = false;
1122
+ this.#scrollingToLineNoFocus = false;
1123
+ } else if (this.#scrollingToLine === line && this.#scrollingToLineFixed) {
1124
+ this.#scrollingToLine = void 0;
1125
+ this.#scrollingToLineChar = void 0;
1126
+ this.#scrollingToLineFixed = false;
1127
+ this.#scrollingToLineNoFocus = false;
1128
+ } else {
1129
+ this.#scrollingToLine = line;
1130
+ this.#scrollingToLineChar = char;
1131
+ this.#scrollingToLineFixed = yFix !== 0;
1132
+ this.#scrollingToLineNoFocus = noFocus;
1133
+ }
899
1134
  }
900
1135
  }
901
1136
  virtualCaret.remove();
902
1137
  }
1138
+ #spanLineSelection(anchorLine, focusLine, textDocument) {
1139
+ const lineStart = (line) => ({
1140
+ line,
1141
+ character: 0
1142
+ });
1143
+ const lineEnd = (line) => ({
1144
+ line,
1145
+ character: textDocument.getLineText(line).length
1146
+ });
1147
+ if (focusLine < anchorLine) return {
1148
+ start: lineStart(focusLine),
1149
+ end: lineEnd(anchorLine),
1150
+ direction: -1
1151
+ };
1152
+ return {
1153
+ start: lineStart(anchorLine),
1154
+ end: lineEnd(focusLine),
1155
+ direction: 1
1156
+ };
1157
+ }
1158
+ #isDeletedLineTarget(event) {
1159
+ const target = event.composedPath()[0];
1160
+ return target instanceof HTMLElement && target.closest("[data-line]")?.getAttribute("data-line-type") === "change-deletion";
1161
+ }
1162
+ #selectDeletedLines(anchorContent, focusContent, deletionsCode) {
1163
+ const rows = [...deletionsCode.querySelectorAll("[data-content] > [data-line]")];
1164
+ const anchorIndex = rows.indexOf(anchorContent);
1165
+ const focusIndex = rows.indexOf(focusContent);
1166
+ const [topContent, bottomContent] = focusIndex < anchorIndex ? [focusContent, anchorContent] : [anchorContent, focusContent];
1167
+ const winSelection = window.getSelection();
1168
+ if (winSelection !== null) {
1169
+ const range = document.createRange();
1170
+ range.setStart(topContent, 0);
1171
+ range.setEnd(bottomContent, bottomContent.childNodes.length);
1172
+ winSelection.removeAllRanges();
1173
+ winSelection.addRange(range);
1174
+ }
1175
+ this.#setDeletedTextSelectionActive(true);
1176
+ this.#updateSelections([]);
1177
+ [...deletionsCode.querySelectorAll("[data-gutter] > [data-column-number]")][focusIndex]?.setAttribute("data-selected-line", "single");
1178
+ const lo = Math.min(anchorIndex, focusIndex);
1179
+ const hi = Math.max(anchorIndex, focusIndex);
1180
+ this.#deletedSelectionText = lo < 0 ? "" : rows.slice(lo, hi + 1).filter((row) => row.getAttribute("data-line-type") === "change-deletion").map((row) => row.textContent ?? "").join("\n");
1181
+ }
1182
+ #contentRowForGutterRow(gutterRow, contentColumn) {
1183
+ const gutterColumn = gutterRow.parentElement;
1184
+ if (gutterColumn == null || contentColumn == null) return;
1185
+ const index = [...gutterColumn.children].indexOf(gutterRow);
1186
+ const row = contentColumn.children[index];
1187
+ return row instanceof HTMLElement ? row : void 0;
1188
+ }
1189
+ #beginDeletionGutterSelection(gutterRow, code, isMouse) {
1190
+ const contentColumn = code.querySelector("[data-content]");
1191
+ const anchorContent = this.#contentRowForGutterRow(gutterRow, contentColumn);
1192
+ if (anchorContent === void 0) return false;
1193
+ this.#selectDeletedLines(anchorContent, anchorContent, code);
1194
+ if (isMouse) this.#replaceSelectEventListeners([addEventListener(document, "mousemove", (moveEvent) => {
1195
+ const moveTarget = moveEvent.composedPath()[0];
1196
+ const moveGutter = moveTarget instanceof HTMLElement ? moveTarget.closest("[data-column-number]") : null;
1197
+ if (moveGutter instanceof HTMLElement && code.contains(moveGutter)) {
1198
+ const focusContent = this.#contentRowForGutterRow(moveGutter, contentColumn);
1199
+ if (focusContent !== void 0) this.#selectDeletedLines(anchorContent, focusContent, code);
1200
+ }
1201
+ }, { passive: true })]);
1202
+ return true;
1203
+ }
1204
+ #isDeletedTextSelectionActive() {
1205
+ return this.#fileContainer?.shadowRoot?.querySelector("pre")?.hasAttribute("data-deleted-text-selection") ?? false;
1206
+ }
1207
+ #deletedTextForClipboard() {
1208
+ return this.#deletedSelectionText !== "" ? this.#deletedSelectionText : window.getSelection()?.toString() ?? "";
1209
+ }
1210
+ #setDeletedTextSelectionActive(active) {
1211
+ const pre = this.#fileContainer?.shadowRoot?.querySelector("pre");
1212
+ if (pre == null) return;
1213
+ if (active) {
1214
+ pre.setAttribute("data-deleted-text-selection", "");
1215
+ for (const highlighted of pre.querySelectorAll("[data-selected-line]")) highlighted.removeAttribute("data-selected-line");
1216
+ this.#deletedSelectionText = "";
1217
+ } else {
1218
+ pre.removeAttribute("data-deleted-text-selection");
1219
+ this.#deletedSelectionText = "";
1220
+ }
1221
+ }
1222
+ #setSelectedLinesSafe(range, lineNumberOnly = false) {
1223
+ try {
1224
+ this.#fileInstance?.setSelectedLines(range, {
1225
+ notify: false,
1226
+ activeLineSide: "additions",
1227
+ lineNumberOnly
1228
+ });
1229
+ } catch {}
1230
+ }
1231
+ #scheduleThemeSelectionRefresh() {
1232
+ if (this.#themeSelectionRefreshFrame !== void 0) return;
1233
+ this.#themeSelectionRefreshFrame = requestAnimationFrame(() => {
1234
+ this.#themeSelectionRefreshFrame = void 0;
1235
+ if (this.#selections !== void 0 || this.#matches !== void 0 || this.#markerRenderer !== void 0) this.#updateSelections(this.#selections ?? []);
1236
+ });
1237
+ }
903
1238
  #updateSelections(selections) {
904
- this.__postponeBackgroundTokenizeToNextFrame();
1239
+ this.__postponeBgTokenizeToNextFrame();
905
1240
  this.#primaryCaretElement = void 0;
906
- this.#fileInstance?.setSelectedLines(null);
907
- this.#gutterElement?.querySelectorAll("[data-active]").forEach((el) => el.removeAttribute("data-active"));
1241
+ this.#setSelectedLinesSafe(null);
908
1242
  if (selections.length === 0 && this.#matches === void 0 && this.#markerRenderer === void 0) {
909
1243
  this.#selections = void 0;
910
1244
  this.#overlayElements?.forEach((el) => el.remove());
911
1245
  this.#overlayElements?.clear();
1246
+ this.#selectionAction?.cleanup();
1247
+ this.#selectionAction = void 0;
912
1248
  return;
913
1249
  }
914
1250
  const fragment = document.createDocumentFragment();
@@ -920,21 +1256,16 @@ var Editor = class {
920
1256
  const normalizedSelections = mergeOverlappingSelections(selections);
921
1257
  const primarySelection = normalizedSelections.at(-1);
922
1258
  this.#selections = normalizedSelections;
923
- if (isCollapsedSelection(primarySelection)) {
924
- const line = primarySelection.start.line + 1;
925
- this.#fileInstance?.setSelectedLines({
926
- start: line,
927
- end: line
928
- });
929
- } else if (this.#gutterElement !== void 0) {
930
- const pos = getCaretPosition(primarySelection);
931
- this.#gutterElement.querySelector(`[data-column-number="${pos.line + 1}"]`)?.setAttribute("data-active", "");
932
- }
1259
+ const hasNonEmptySelection = normalizedSelections.some((selection) => !isCollapsedSelection(selection));
1260
+ const caretLine = getCaretPosition(primarySelection).line + 1;
1261
+ this.#setSelectedLinesSafe({
1262
+ start: caretLine,
1263
+ end: caretLine
1264
+ }, hasNonEmptySelection);
933
1265
  for (const selection of normalizedSelections) {
934
1266
  if (!isCollapsedSelection(selection)) this.#renderSelection(renderCtx, "selection", selection);
935
1267
  this.#renderCaret(renderCtx, selection, selection === primarySelection);
936
1268
  }
937
- if (this.#options.enabledSelectionAction === true && !isCollapsedSelection(primarySelection)) this.#renderSelectionActionIcon(renderCtx, primarySelection);
938
1269
  }
939
1270
  const textDocument = this.#textDocument;
940
1271
  if (this.#matches !== void 0 && textDocument !== void 0) {
@@ -955,6 +1286,7 @@ var Editor = class {
955
1286
  this.#overlayElements?.forEach((el) => el.remove());
956
1287
  this.#overlayElements?.clear();
957
1288
  this.#overlayElements = renderCtx.elements;
1289
+ this.#updateSelectionActionPopover();
958
1290
  }
959
1291
  #renderSelection(renderCtx, type, range, extraDataset) {
960
1292
  if (this.#textDocument === void 0) return;
@@ -962,11 +1294,11 @@ var Editor = class {
962
1294
  for (let line = start.line; line <= end.line; line++) {
963
1295
  if (!this.#isLineVisible(line)) continue;
964
1296
  const isLastLine = line === end.line;
965
- const lineText = this.#textDocument.getLineText(line);
966
1297
  const startChar = line === start.line ? start.character : 0;
967
- const endChar = isLastLine ? end.character : lineText.length;
968
- if (this.#wrap) {
1298
+ const endChar = isLastLine ? end.character : this.#textDocument.getLineLength(line);
1299
+ if (this.#isWrap) {
969
1300
  const contentWidth = this.#getContentWidth();
1301
+ const lineText = this.#textDocument.getLineText(line);
970
1302
  if (2 * this.#metrics.ch + this.#metrics.measureTextWidth(lineText) > contentWidth) {
971
1303
  this.#renderWrappedSelection(renderCtx, line, lineText, startChar, endChar, isLastLine, type, extraDataset);
972
1304
  continue;
@@ -975,7 +1307,7 @@ var Editor = class {
975
1307
  let left = 0;
976
1308
  let width = 0;
977
1309
  let paddingEnd = 0;
978
- if (startChar === 0) left = this.#getGutterWidth() + this.#metrics.ch;
1310
+ if (startChar === 0) left = this.#getGutterWidth() + this.#metrics.ch + (this.#activeContentOffset?.left ?? 0);
979
1311
  else left = this.#getCharX(line, startChar)[0];
980
1312
  if (!isLastLine && type === "selection") paddingEnd = this.#metrics.ch;
981
1313
  if (startChar === endChar) width = paddingEnd;
@@ -986,71 +1318,66 @@ var Editor = class {
986
1318
  #renderWrappedSelection(renderCtx, line, lineText, startChar, endChar, isLastLine, type, extraDataset) {
987
1319
  const wrapOffsets = this.#wrapLineText(line);
988
1320
  const segmentCount = wrapOffsets.length - 1;
989
- const offsetLeft = this.#getGutterWidth() + this.#metrics.ch;
1321
+ const offsetLeft = this.#getGutterWidth() + this.#metrics.ch + (this.#activeContentOffset?.left ?? 0);
990
1322
  for (let wrapLine = 0; wrapLine < segmentCount; wrapLine++) {
991
1323
  const segmentStart = wrapOffsets[wrapLine];
992
1324
  const segmentEnd = wrapOffsets[wrapLine + 1];
993
1325
  const wrapStartChar = Math.max(startChar, segmentStart);
994
1326
  const wrapEndChar = Math.min(endChar, segmentEnd);
995
1327
  if (wrapStartChar > wrapEndChar) continue;
996
- let segmentLeft;
997
- let segmentWidth;
1328
+ const segmentStartWidth = this.#segmentTextWidth(lineText, segmentStart, wrapStartChar);
1329
+ const segmentLeft = offsetLeft + segmentStartWidth;
998
1330
  let paddingEnd = 0;
999
- if (wrapStartChar === 0) segmentLeft = offsetLeft;
1000
- else {
1001
- const prefixInSegment = lineText.slice(segmentStart, wrapStartChar);
1002
- const prefixAsciiColumns = getExpandedAsciiTextColumns(prefixInSegment, this.#metrics.tabSize);
1003
- segmentLeft = offsetLeft + (prefixAsciiColumns !== -1 ? prefixAsciiColumns * this.#metrics.ch : this.#metrics.measureTextWidth(prefixInSegment));
1004
- }
1005
1331
  if (!isLastLine && wrapLine === segmentCount - 1 && type === "selection") paddingEnd = this.#metrics.ch;
1006
- if (wrapStartChar === wrapEndChar) segmentWidth = paddingEnd;
1007
- else {
1008
- const selectionInSegment = lineText.slice(wrapStartChar, wrapEndChar);
1009
- const selectionAsciiWidth = getExpandedAsciiTextColumns(selectionInSegment, this.#metrics.tabSize);
1010
- segmentWidth = selectionAsciiWidth !== -1 ? selectionAsciiWidth * this.#metrics.ch : this.#metrics.measureTextWidth(selectionInSegment);
1011
- segmentWidth += paddingEnd;
1012
- }
1332
+ const segmentWidth = wrapStartChar === wrapEndChar ? paddingEnd : this.#segmentTextWidth(lineText, segmentStart, wrapEndChar) - segmentStartWidth + paddingEnd;
1013
1333
  this.#renderSelectionBlock(renderCtx, type, line, wrapLine, segmentLeft, segmentWidth, extraDataset);
1014
1334
  }
1015
1335
  }
1336
+ #segmentTextWidth(lineText, segmentStart, character) {
1337
+ if (character <= segmentStart) return 0;
1338
+ const segmentText = lineText.slice(segmentStart, character);
1339
+ const asciiColumns = getExpandedAsciiTextColumns(segmentText, this.#metrics.tabSize);
1340
+ return asciiColumns !== -1 ? asciiColumns * this.#metrics.ch : this.#metrics.measureTextWidth(segmentText);
1341
+ }
1016
1342
  #renderSelectionBlock(renderCtx, type, line, wrapLine, left, width, extraDataset) {
1017
1343
  if (width === 0) return;
1018
1344
  const { ch, lineHeight } = this.#metrics;
1019
1345
  const y = this.#getLineY(line) + wrapLine * lineHeight;
1020
- const css = `width:${width}px;transform:translateX(${left}px) translateY(${y}px);`;
1021
- const cacheKey = `${type}-${left}-${y}-${width}${extraDataset ?? ""}`;
1346
+ const cacheKey = `${type}-${line}/${wrapLine}-${left}-${width} ${extraDataset ?? ""}`;
1022
1347
  const overlayEls = this.#overlayElements;
1023
1348
  const rounded = (this.#options.roundedSelection ?? true) && type === "selection";
1024
- const addRoundedCorner = (line$1, wrapLine$1, left$1, radius) => {
1025
- const top = this.#getLineY(line$1) + wrapLine$1 * lineHeight;
1026
- const css$1 = `width:${ch}px;transform:translateX(${left$1}px) translateY(${top}px);`;
1349
+ const addRoundedCorner = (line, wrapLine, left, radius) => {
1350
+ const top = this.#getLineY(line) + wrapLine * lineHeight;
1351
+ const cornerBg = this.#lineBackgroundColor(line);
1352
+ const css = `width:${ch}px;transform:translateX(${left}px) translateY(${top}px);` + (cornerBg !== void 0 ? `--diffs-selection-corner-bg:${cornerBg};` : "");
1027
1353
  const dataset = {
1028
1354
  selectionCorner: "",
1029
1355
  [radius]: ""
1030
1356
  };
1031
- const cacheKeyPrefix = `${type}-block-${left$1}-${top}-1ch`;
1032
- let cacheKey$1 = cacheKeyPrefix + "-" + radius;
1357
+ const cacheKeyPrefix = `${type}-block-${line}/${wrapLine}-${left}-1ch`;
1358
+ let cacheKey = cacheKeyPrefix + "-" + radius;
1033
1359
  if (radius === "rbl") {
1034
1360
  const prevCornerKey = cacheKeyPrefix + "-rtl";
1035
1361
  const prevCorner = renderCtx.elements.get(prevCornerKey);
1036
1362
  if (prevCorner !== void 0) {
1037
1363
  prevCorner.remove();
1038
1364
  renderCtx.elements.delete(prevCornerKey);
1039
- cacheKey$1 += "-rtl";
1365
+ cacheKey += "-rtl";
1040
1366
  dataset.rtl = "";
1041
1367
  }
1042
1368
  }
1043
- let cornerEl = renderCtx.elements.get(cacheKey$1);
1369
+ let cornerEl = renderCtx.elements.get(cacheKey);
1044
1370
  if (cornerEl !== void 0) return;
1045
- if (overlayEls?.has(cacheKey$1) === true) {
1046
- cornerEl = overlayEls.get(cacheKey$1);
1047
- overlayEls.delete(cacheKey$1);
1371
+ if (overlayEls?.has(cacheKey) === true) {
1372
+ cornerEl = overlayEls.get(cacheKey);
1373
+ cornerEl.style.cssText = css;
1374
+ overlayEls.delete(cacheKey);
1048
1375
  } else cornerEl = h("div", {
1049
1376
  dataset: "selectionRange",
1050
- style: { cssText: css$1 },
1377
+ style: { cssText: css },
1051
1378
  children: [h("div", { dataset })]
1052
1379
  }, renderCtx.fragment);
1053
- renderCtx.elements.set(cacheKey$1, cornerEl);
1380
+ renderCtx.elements.set(cacheKey, cornerEl);
1054
1381
  };
1055
1382
  const addRadiusStyle = (element) => {
1056
1383
  const end = left + width;
@@ -1100,10 +1427,9 @@ var Editor = class {
1100
1427
  if (overlayEls?.has(cacheKey) === true) {
1101
1428
  rangeEl = overlayEls.get(cacheKey);
1102
1429
  overlayEls.delete(cacheKey);
1103
- } else rangeEl = h("div", {
1104
- dataset: extraDataset ? [type + "Range", extraDataset] : type + "Range",
1105
- style: { cssText: css }
1106
- }, renderCtx.fragment);
1430
+ } else rangeEl = h("div", { dataset: extraDataset ? [type + "Range", extraDataset] : type + "Range" }, renderCtx.fragment);
1431
+ rangeEl.style.width = `${width}px`;
1432
+ rangeEl.style.transform = `translateX(${left}px) translateY(${y}px)`;
1107
1433
  if (rounded) addRadiusStyle(rangeEl);
1108
1434
  renderCtx.elements.set(cacheKey, rangeEl);
1109
1435
  }
@@ -1123,56 +1449,47 @@ var Editor = class {
1123
1449
  this.#primaryCaretElement = caretEl;
1124
1450
  }
1125
1451
  }
1126
- #renderSelectionActionIcon(renderCtx, selection) {
1127
- const line = getCaretPosition(selection).line;
1128
- if (!this.#isLineVisible(line)) return;
1129
- const [left, wrapLine] = this.#getCharX(line, 0);
1130
- const cacheKey = "selectionActionIcon-" + line + "(" + wrapLine + ")";
1131
- if (renderCtx.elements.has(cacheKey)) return;
1132
- const selectionActionIcon = SelectionActionWidget.renderIcon(left, this.#getLineY(line) + wrapLine * this.#metrics.lineHeight, renderCtx.fragment, () => {
1133
- const cleanUp = () => {
1134
- this.#selectionAction?.cleanup();
1135
- this.#selectionAction = void 0;
1136
- };
1137
- const handleWidgetDomResize = () => {
1138
- this.#lineYCache.clear();
1139
- if (this.#selections !== void 0) this.#updateSelections(this.#selections);
1140
- };
1141
- cleanUp();
1142
- const textDocument = this.#textDocument;
1143
- const renderSelectionAction = this.#options.renderSelectionAction;
1144
- const fileContainer = this.#fileContainer;
1145
- if (textDocument === void 0 || renderSelectionAction === void 0 || fileContainer == null) return;
1146
- const line$1 = selection.end.line;
1147
- const lineText = textDocument.getLineText(line$1);
1452
+ #updateSelectionActionPopover() {
1453
+ const primarySelection = this.#selections?.at(-1);
1454
+ const overlayElement = this.#overlayElement;
1455
+ const textDocument = this.#textDocument;
1456
+ const renderSelectionAction = this.#options.renderSelectionAction;
1457
+ if (this.#options.enabledSelectionAction !== true || renderSelectionAction === void 0 || primarySelection === void 0 || isCollapsedSelection(primarySelection) || this.#isContentMouseDown || overlayElement === void 0 || textDocument === void 0) {
1458
+ this.#selectionAction?.cleanup();
1459
+ this.#selectionAction = void 0;
1460
+ return;
1461
+ }
1462
+ const head = getCaretPosition(primarySelection);
1463
+ if (!this.#isLineVisible(head.line)) {
1464
+ this.#selectionAction?.cleanup();
1465
+ this.#selectionAction = void 0;
1466
+ return;
1467
+ }
1468
+ if (this.#selectionAction === void 0) {
1469
+ const getActiveSelection = () => this.#selections?.at(-1) ?? primarySelection;
1148
1470
  const selectionActionElement = renderSelectionAction({
1149
1471
  textDocument,
1150
- selection,
1151
- applyEdits: (edits) => this.applyEdits(edits, true),
1152
- getSelectionText: () => {
1153
- return this.#textDocument?.getText(selection) ?? "";
1472
+ get selection() {
1473
+ return getActiveSelection();
1154
1474
  },
1475
+ applyEdits: (edits) => this.applyEdits(edits, true),
1476
+ getSelectionText: () => this.#textDocument?.getText(getActiveSelection()) ?? "",
1155
1477
  replaceSelectionText: (text) => {
1156
- this.#replaceSelectionText(text, [selection]);
1478
+ this.#replaceSelectionText(text, [getActiveSelection()]);
1157
1479
  },
1158
1480
  close: () => {
1159
- cleanUp();
1160
- handleWidgetDomResize();
1481
+ this.#selectionAction?.cleanup();
1482
+ this.#selectionAction = void 0;
1161
1483
  this.#scrollToPrimaryCaret();
1162
1484
  }
1163
1485
  });
1164
- let leadingWhitespaces = 0;
1165
- for (let i = 0; i < lineText.length; i++) {
1166
- const charCode = lineText.charCodeAt(i);
1167
- if (charCode === 32) leadingWhitespaces++;
1168
- else if (charCode === 9) leadingWhitespaces += this.#metrics.tabSize;
1169
- else break;
1170
- }
1171
- this.#selectionAction = new SelectionActionWidget(line$1, selectionActionElement, fileContainer, leadingWhitespaces, handleWidgetDomResize);
1172
- this.#updateSelections([selection]);
1173
- if (this.#isLineVisible(line$1) && this.#contentElement !== void 0) this.#selectionAction.render(this.#contentElement);
1174
- });
1175
- renderCtx.elements.set(cacheKey, selectionActionIcon);
1486
+ this.#selectionAction = new SelectionActionWidget(head.line, selectionActionElement, overlayElement);
1487
+ }
1488
+ const [left, wrapLine] = this.#getCharX(head.line, head.character);
1489
+ const lineHeight = this.#metrics.lineHeight;
1490
+ const top = this.#getLineY(head.line) + wrapLine * lineHeight + lineHeight;
1491
+ this.#selectionAction.line = head.line;
1492
+ this.#selectionAction.reposition(left, top, this.#getGutterWidth());
1176
1493
  }
1177
1494
  #openSearchPanel(mode) {
1178
1495
  if (this.#searchPanel !== void 0) {
@@ -1207,7 +1524,7 @@ var Editor = class {
1207
1524
  this.#scrollToPrimaryCaret(true);
1208
1525
  this.#retainSearchPanelFocus = retainFocus;
1209
1526
  };
1210
- this.#searchPanel = new SearchPanelWidget({
1527
+ const searchPanel = new SearchPanelWidget({
1211
1528
  textDocument,
1212
1529
  containerElement: preElement,
1213
1530
  defaultQuery,
@@ -1234,10 +1551,10 @@ var Editor = class {
1234
1551
  this.#matches = allMatches;
1235
1552
  if (options?.syncSelection === false) {
1236
1553
  this.#updateSelections(this.#selections ?? []);
1237
- const primarySelection$1 = this.#selections?.at(-1);
1238
- if (primarySelection$1 !== void 0) {
1239
- const startOffset = textDocument.offsetAt(primarySelection$1.start);
1240
- const endOffset = textDocument.offsetAt(primarySelection$1.end);
1554
+ const primarySelection = this.#selections?.at(-1);
1555
+ if (primarySelection !== void 0) {
1556
+ const startOffset = textDocument.offsetAt(primarySelection.start);
1557
+ const endOffset = textDocument.offsetAt(primarySelection.end);
1241
1558
  for (const match of allMatches) if (match[0] === startOffset && match[1] === endOffset) return match;
1242
1559
  }
1243
1560
  return;
@@ -1261,6 +1578,7 @@ var Editor = class {
1261
1578
  this.#updateSelections(this.#selections ?? []);
1262
1579
  }
1263
1580
  });
1581
+ this.#searchPanel = searchPanel;
1264
1582
  this.#retainSearchPanelFocus = false;
1265
1583
  }
1266
1584
  #getSelectionText() {
@@ -1269,45 +1587,60 @@ var Editor = class {
1269
1587
  if (textDocument === void 0 || selections === void 0) return "";
1270
1588
  return getSelectionText(textDocument, selections);
1271
1589
  }
1272
- #replaceSelectionText(text, selections = this.#selections) {
1590
+ #cutSelectionText() {
1591
+ const textDocument = this.#textDocument;
1592
+ const selections = this.#selections;
1593
+ if (textDocument === void 0 || selections === void 0 || selections.length === 0) return "";
1594
+ if (selections.some((selection) => isCollapsedSelection(selection))) {
1595
+ const cut = resolveSelectionCut(textDocument, selections);
1596
+ this.#applySelectionCutEdits(cut.edits, cut.nextSelectionOffsets);
1597
+ return cut.text;
1598
+ }
1599
+ const text = getSelectionText(textDocument, selections);
1600
+ this.#replaceSelectionText("", void 0, true);
1601
+ return text;
1602
+ }
1603
+ #applySelectionCutEdits(edits, nextSelectionOffsets) {
1604
+ const textDocument = this.#textDocument;
1605
+ const selections = this.#selections;
1606
+ if (textDocument === void 0 || selections === void 0 || edits.length === 0) return;
1607
+ const change = textDocument.applyResolvedEdits(edits, true, selections, void 0, true);
1608
+ if (change === void 0) return;
1609
+ const nextSelections = nextSelectionOffsets.map((offset) => {
1610
+ const caret = textDocument.positionAt(offset);
1611
+ return {
1612
+ start: caret,
1613
+ end: caret,
1614
+ direction: 0
1615
+ };
1616
+ });
1617
+ textDocument.setLastUndoSelectionsAfter(nextSelections);
1618
+ this.#applyChange(change, nextSelections, this.#applyChangeToLineAnnotations(change));
1619
+ }
1620
+ #replaceSelectionText(text, selections = this.#selections, undoBoundary = false) {
1273
1621
  if (selections === void 0) return;
1274
1622
  const textDocument = this.#textDocument;
1275
1623
  const primarySelection = selections.at(-1);
1276
1624
  if (textDocument === void 0 || primarySelection === void 0) return;
1277
- const { nextSelections, change } = Array.isArray(text) && text.length === selections.length ? applyTextReplaceToSelections(textDocument, selections, text, this.#lineAnnotations) : applyTextChangeToSelections(textDocument, selections, {
1625
+ const { nextSelections, change } = Array.isArray(text) && text.length === selections.length ? applyTextReplaceToSelections(textDocument, selections, text, this.#lineAnnotations, undoBoundary) : applyTextChangeToSelections(textDocument, selections, {
1278
1626
  start: textDocument.offsetAt(primarySelection.start),
1279
1627
  end: textDocument.offsetAt(primarySelection.end),
1280
1628
  text: Array.isArray(text) ? text.join("\n") : text
1281
- }, this.#lineAnnotations);
1629
+ }, this.#lineAnnotations, void 0, undoBoundary);
1282
1630
  if (change !== void 0) this.#applyChange(change, nextSelections, this.#applyChangeToLineAnnotations(change));
1283
1631
  }
1284
1632
  #deleteSelectionText(forward = false) {
1285
1633
  const selections = this.#selections;
1286
1634
  const textDocument = this.#textDocument;
1287
1635
  if (selections === void 0 || textDocument === void 0) return;
1288
- const primarySelection = selections.at(-1);
1289
- if (primarySelection === void 0) return;
1290
- let edit;
1291
- if (isCollapsedSelection(primarySelection)) {
1292
- const offset = textDocument.offsetAt(primarySelection.start);
1293
- const nextOffset = forward ? Math.min(textDocument.getText().length, offset + 1) : Math.max(0, offset - 1);
1294
- edit = {
1295
- start: Math.min(offset, nextOffset),
1296
- end: Math.max(offset, nextOffset),
1297
- text: ""
1298
- };
1299
- } else edit = {
1300
- start: textDocument.offsetAt(primarySelection.start),
1301
- end: textDocument.offsetAt(primarySelection.end),
1302
- text: ""
1303
- };
1304
- this.#applyResolvedTextEdit(edit);
1636
+ const { nextSelections, change } = applyDeleteCharacterToSelections(textDocument, selections, forward, this.#lineAnnotations, this.#metrics.tabSize);
1637
+ if (change !== void 0) this.#applyChange(change, nextSelections, this.#applyChangeToLineAnnotations(change));
1305
1638
  }
1306
1639
  #deleteSoftLineBackward() {
1307
1640
  const selections = this.#selections;
1308
1641
  const textDocument = this.#textDocument;
1309
1642
  if (selections === void 0 || textDocument === void 0) return;
1310
- const { nextSelections, change } = applyDeleteSoftLineBackwardToSelections(textDocument, selections, this.#wrap ? (line, character) => {
1643
+ const { nextSelections, change } = applyDeleteSoftLineBackwardToSelections(textDocument, selections, this.#isWrap ? (line, character) => {
1311
1644
  const wrapOffsets = this.#wrapLineText(line);
1312
1645
  for (let w = 0; w + 1 < wrapOffsets.length; w++) {
1313
1646
  const segmentStart = wrapOffsets[w];
@@ -1339,57 +1672,63 @@ var Editor = class {
1339
1672
  const { nextSelections, change } = applyTransposeToSelections(textDocument, selections, this.#lineAnnotations);
1340
1673
  if (change !== void 0) this.#applyChange(change, nextSelections, this.#applyChangeToLineAnnotations(change));
1341
1674
  }
1342
- #applyResolvedTextEdit(edit) {
1343
- if (this.#selections === void 0 || this.#textDocument === void 0) return;
1344
- const { nextSelections, change } = applyTextChangeToSelections(this.#textDocument, this.#selections, edit, this.#lineAnnotations, this.#metrics.tabSize);
1345
- if (change !== void 0) this.#applyChange(change, nextSelections, this.#applyChangeToLineAnnotations(change));
1346
- }
1347
1675
  #getFileRef() {
1348
- const fileContents = this.#fileContents;
1676
+ const fileInfo = this.#fileInfo;
1349
1677
  const textDocument = this.#textDocument;
1350
- if (fileContents === void 0 || textDocument === void 0) return;
1351
- const { contents: _,...file } = fileContents;
1678
+ if (fileInfo === void 0 || textDocument === void 0) return;
1679
+ const file = { ...fileInfo };
1352
1680
  Object.defineProperty(file, "contents", {
1353
1681
  enumerable: true,
1354
1682
  get: () => textDocument.getText()
1355
1683
  });
1356
1684
  return file;
1357
1685
  }
1358
- #applyChange(change, selections, newLineAnnotations, options) {
1686
+ #applyChange(change, newSelections, newLineAnnotations, options) {
1359
1687
  const fileRef = this.#getFileRef();
1360
1688
  const onChange = this.#options.onChange;
1361
1689
  if (fileRef !== void 0 && onChange !== void 0) onChange(fileRef, newLineAnnotations ?? this.#lineAnnotations);
1362
- if (change.lineDelta !== 0) {
1690
+ if (change.lineDelta !== 0 || this.#isWrap) {
1363
1691
  for (const line of this.#lineYCache.keys()) if (line >= change.startLine) this.#lineYCache.delete(line);
1364
1692
  }
1365
- if (this.#wrap) {
1693
+ if (this.#isWrap) {
1366
1694
  for (const line of this.#wrapLineOffsetsCache.keys()) if (line >= change.startLine) this.#wrapLineOffsetsCache.delete(line);
1367
1695
  }
1368
1696
  this.#lastAccessedCharX = void 0;
1369
1697
  let renderRange = this.#renderRange;
1370
1698
  let shouldUpdateBuffer;
1371
- if (renderRange !== void 0 && selections !== void 0 && selections.length > 0) {
1372
- const primarySelection = selections.at(-1);
1699
+ if (renderRange !== void 0 && newSelections !== void 0 && newSelections.length > 0) {
1700
+ const primarySelection = newSelections.at(-1);
1373
1701
  const renderRangeEndLine = renderRange.startingLine + renderRange.totalLines;
1374
- if (primarySelection.end.line === renderRangeEndLine) renderRange = {
1375
- ...renderRange,
1376
- totalLines: renderRange.totalLines + 1
1377
- };
1378
- else if (primarySelection.end.line > renderRangeEndLine) shouldUpdateBuffer = true;
1702
+ if (primarySelection.end.line >= renderRangeEndLine) {
1703
+ const widenedTotalLines = primarySelection.end.line - renderRange.startingLine + 1;
1704
+ const maxWidenLines = this.#viewportWindowLines === void 0 || this.#viewportWindowLines === Infinity ? Infinity : this.#viewportWindowLines * MAX_EDIT_WIDEN_WINDOW_MULTIPLE;
1705
+ if (change.startLine <= renderRangeEndLine && widenedTotalLines <= maxWidenLines) {
1706
+ if (primarySelection.end.line > renderRangeEndLine) shouldUpdateBuffer = true;
1707
+ renderRange = {
1708
+ ...renderRange,
1709
+ totalLines: widenedTotalLines
1710
+ };
1711
+ this.#renderRange = renderRange;
1712
+ } else shouldUpdateBuffer = true;
1713
+ }
1379
1714
  }
1380
1715
  this.#rerender(change, newLineAnnotations, renderRange, shouldUpdateBuffer);
1381
1716
  if (options?.skipSearchRefresh !== true && this.#searchPanel !== void 0 && this.#matches !== void 0) this.#searchPanel.updateMatches({ syncSelection: false });
1382
- if (selections !== void 0) {
1383
- this.#updateSelections(selections);
1384
- if (this.#primaryCaretElement !== void 0) this.#primaryCaretElement.scrollIntoView({
1385
- block: "nearest",
1386
- inline: "nearest"
1387
- });
1388
- else if (selections.length > 0) {
1389
- const pos = getCaretPosition(selections.at(-1));
1390
- this.#scrollToLine(pos.line, pos.character);
1717
+ if (newSelections !== void 0) {
1718
+ this.#updateSelections(newSelections);
1719
+ if (options?.skipFocus !== true) {
1720
+ if (this.#primaryCaretElement !== void 0) requestAnimationFrame(() => {
1721
+ this.#primaryCaretElement?.scrollIntoView({
1722
+ block: "nearest",
1723
+ inline: "nearest"
1724
+ });
1725
+ });
1726
+ else if (newSelections.length > 0) {
1727
+ const pos = getCaretPosition(newSelections.at(-1));
1728
+ this.#scrollToLine(pos.line, pos.character);
1729
+ }
1730
+ this.focus({ preventScroll: true });
1391
1731
  }
1392
- this.focus({ preventScroll: true });
1393
1732
  }
1394
1733
  }
1395
1734
  #applyChangeToLineAnnotations(change) {
@@ -1401,12 +1740,36 @@ var Editor = class {
1401
1740
  }
1402
1741
  }
1403
1742
  }
1743
+ #lineBackgroundColor(line) {
1744
+ const lineElement = this.#getLineElement(line);
1745
+ if (lineElement === void 0) return;
1746
+ const backgroundColor = getComputedStyle(lineElement, "::after").backgroundColor;
1747
+ return backgroundColor === "" || backgroundColor === "transparent" || backgroundColor === "rgba(0, 0, 0, 0)" ? void 0 : backgroundColor;
1748
+ }
1749
+ #getRenderedEditableLineRange() {
1750
+ const contentElement = this.#contentElement;
1751
+ if (contentElement === void 0) return;
1752
+ let first;
1753
+ let last;
1754
+ for (const child of contentElement.children) {
1755
+ const el = child;
1756
+ const lineType = el.dataset.lineType;
1757
+ const lineNumber = getLineNumberAttr(el);
1758
+ if (lineNumber === void 0 || lineType === void 0 || !isLineEditable(lineType)) continue;
1759
+ const line = lineNumber - 1;
1760
+ if (first === void 0 || line < first) first = line;
1761
+ if (last === void 0 || line > last) last = line;
1762
+ }
1763
+ return first === void 0 || last === void 0 ? void 0 : {
1764
+ first,
1765
+ last
1766
+ };
1767
+ }
1404
1768
  #getLineElement(line) {
1405
- const lastAccessed = this.#lastAccessedLineElement;
1406
- if (lastAccessed !== void 0 && lastAccessed[0] === line) return lastAccessed[1];
1769
+ let lineElement = this.#lineElementsCache.get(line);
1770
+ if (lineElement !== void 0) return lineElement ?? void 0;
1407
1771
  const contentElement = this.#contentElement;
1408
1772
  if (contentElement === void 0) return;
1409
- let lineElement = null;
1410
1773
  if (this.#renderRange !== void 0) {
1411
1774
  const { startingLine } = this.#renderRange;
1412
1775
  const { children } = contentElement;
@@ -1421,14 +1784,9 @@ var Editor = class {
1421
1784
  }
1422
1785
  }
1423
1786
  }
1424
- lineElement ??= contentElement.querySelector(`[data-line="${line + 1}"]`);
1425
- if (lineElement !== null) {
1426
- if (lastAccessed !== void 0) {
1427
- lastAccessed[0] = line;
1428
- lastAccessed[1] = lineElement;
1429
- } else this.#lastAccessedLineElement = [line, lineElement];
1430
- return lineElement;
1431
- }
1787
+ lineElement ??= contentElement.querySelector(`[data-line="${line + 1}"]` + (this.#diffSyle === "unified" ? ":not([data-line-type=\"change-deletion\"])" : ""));
1788
+ if (lineElement !== void 0) this.#lineElementsCache.set(line, lineElement);
1789
+ return lineElement ?? void 0;
1432
1790
  }
1433
1791
  #getGutterWidth() {
1434
1792
  if (this.#gutterElement === void 0) return 0;
@@ -1453,7 +1811,8 @@ var Editor = class {
1453
1811
  if (cachedY !== void 0) return cachedY;
1454
1812
  const lineElement = this.#getLineElement(line);
1455
1813
  if (lineElement === void 0) return -1;
1456
- const y = lineElement.offsetTop + this.#metrics.paddingTop;
1814
+ let y = lineElement.offsetTop + this.#metrics.paddingTop;
1815
+ y += this.#activeContentOffset?.top ?? 0;
1457
1816
  this.#lineYCache.set(line, y);
1458
1817
  return y;
1459
1818
  }
@@ -1461,7 +1820,7 @@ var Editor = class {
1461
1820
  if (this.#lastAccessedCharX !== void 0 && this.#lastAccessedCharX[0] === line && this.#lastAccessedCharX[1] === char) return [this.#lastAccessedCharX[2], this.#lastAccessedCharX[3]];
1462
1821
  const lineText = this.#textDocument?.getLineText(line);
1463
1822
  const offsetLeft = this.#getGutterWidth() + this.#metrics.ch;
1464
- if (lineText === void 0 || lineText.length === 0 || char <= 0) return [offsetLeft, 0];
1823
+ if (lineText === void 0 || lineText.length === 0 || char <= 0) return [offsetLeft + (this.#activeContentOffset?.left ?? 0), 0];
1465
1824
  const boundedCharacter = snapTextOffsetToUnicodeBoundary(lineText, Math.min(char, lineText.length));
1466
1825
  const textBeforeCharacter = lineText.slice(0, boundedCharacter);
1467
1826
  const asciiColumns = getExpandedAsciiTextColumns(textBeforeCharacter, this.#metrics.tabSize);
@@ -1469,7 +1828,7 @@ var Editor = class {
1469
1828
  let wrapLine = 0;
1470
1829
  if (asciiColumns !== -1) left = offsetLeft + asciiColumns * this.#metrics.ch;
1471
1830
  else left = offsetLeft + this.#metrics.measureTextWidth(textBeforeCharacter);
1472
- if (this.#wrap) {
1831
+ if (this.#isWrap) {
1473
1832
  const contentWidth = this.#getContentWidth();
1474
1833
  if (2 * this.#metrics.ch + this.#metrics.measureTextWidth(lineText) > contentWidth) {
1475
1834
  const wrapOffsets = this.#wrapLineText(line);
@@ -1485,6 +1844,7 @@ var Editor = class {
1485
1844
  }
1486
1845
  }
1487
1846
  }
1847
+ left += this.#activeContentOffset?.left ?? 0;
1488
1848
  }
1489
1849
  if (this.#lastAccessedCharX !== void 0) {
1490
1850
  this.#lastAccessedCharX[0] = line;
@@ -1564,14 +1924,10 @@ var Editor = class {
1564
1924
  #isLineVisible(line) {
1565
1925
  const lineCount = this.#textDocument?.lineCount ?? 0;
1566
1926
  if (line < 0 || line >= lineCount) return false;
1567
- if (this.#renderRange === void 0) return true;
1568
- const { startingLine, totalLines } = this.#renderRange;
1569
- if (line < startingLine) return false;
1570
- if (totalLines === Infinity) return true;
1571
- return line < startingLine + totalLines;
1927
+ return this.#getLineElement(line) !== void 0;
1572
1928
  }
1573
1929
  };
1574
-
1575
1930
  //#endregion
1576
1931
  export { Editor };
1932
+
1577
1933
  //# sourceMappingURL=editor.js.map