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

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 (623) hide show
  1. package/README.md +9 -9
  2. package/dist/components/CodeView.d.ts +10 -11
  3. package/dist/components/CodeView.d.ts.map +1 -1
  4. package/dist/components/CodeView.js +8 -8
  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 +32 -17
  9. package/dist/components/File.js.map +1 -1
  10. package/dist/components/FileDiff.d.ts +19 -19
  11. package/dist/components/FileDiff.d.ts.map +1 -1
  12. package/dist/components/FileDiff.js +84 -54
  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 +1 -2
  19. package/dist/components/UnresolvedFile.d.ts.map +1 -1
  20. package/dist/components/UnresolvedFile.js +3 -3
  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 +19 -18
  25. package/dist/components/VirtualizedFile.js.map +1 -1
  26. package/dist/components/VirtualizedFileDiff.d.ts +2 -3
  27. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
  28. package/dist/components/VirtualizedFileDiff.js +17 -18
  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 +26 -2
  51. package/dist/editor/editor.d.ts.map +1 -1
  52. package/dist/editor/editor.js +551 -252
  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 +41 -4
  77. package/dist/editor/selection.d.ts.map +1 -1
  78. package/dist/editor/selection.js +423 -83
  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 +79 -10
  95. package/dist/editor/textMeasure.js.map +1 -1
  96. package/dist/editor/tokenzier.d.ts +1 -0
  97. package/dist/editor/tokenzier.d.ts.map +1 -1
  98. package/dist/editor/tokenzier.js +16 -13
  99. package/dist/editor/tokenzier.js.map +1 -1
  100. package/dist/editor/utils.d.ts +2 -1
  101. package/dist/editor/utils.d.ts.map +1 -1
  102. package/dist/editor/utils.js +6 -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 +10 -10
  185. package/dist/index.js +2 -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 -3
  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 +1 -0
  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 +1 -3
  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 +30 -24
  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 +1 -1
  300. package/dist/ssr/preloadDiffs.d.ts.map +1 -1
  301. package/dist/ssr/preloadDiffs.js +1 -2
  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 +11 -5
  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 +1 -1
  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/cleanLastNewline.d.ts.map +1 -1
  376. package/dist/utils/cleanLastNewline.js +1 -1
  377. package/dist/utils/cleanLastNewline.js.map +1 -1
  378. package/dist/utils/computeEstimatedDiffHeights.d.ts.map +1 -1
  379. package/dist/utils/computeEstimatedDiffHeights.js +1 -2
  380. package/dist/utils/computeEstimatedDiffHeights.js.map +1 -1
  381. package/dist/utils/computeFileOffsets.d.ts +9 -1
  382. package/dist/utils/computeFileOffsets.d.ts.map +1 -1
  383. package/dist/utils/computeFileOffsets.js +20 -2
  384. package/dist/utils/computeFileOffsets.js.map +1 -1
  385. package/dist/utils/computeVirtualFileMetrics.d.ts.map +1 -1
  386. package/dist/utils/computeVirtualFileMetrics.js +1 -2
  387. package/dist/utils/computeVirtualFileMetrics.js.map +1 -1
  388. package/dist/utils/createAnnotationElement.d.ts +1 -1
  389. package/dist/utils/createAnnotationElement.d.ts.map +1 -1
  390. package/dist/utils/createAnnotationElement.js +1 -2
  391. package/dist/utils/createAnnotationElement.js.map +1 -1
  392. package/dist/utils/createAnnotationWrapperNode.d.ts.map +1 -1
  393. package/dist/utils/createAnnotationWrapperNode.js +1 -1
  394. package/dist/utils/createAnnotationWrapperNode.js.map +1 -1
  395. package/dist/utils/createContentColumn.d.ts +1 -1
  396. package/dist/utils/createContentColumn.d.ts.map +1 -1
  397. package/dist/utils/createContentColumn.js +1 -2
  398. package/dist/utils/createContentColumn.js.map +1 -1
  399. package/dist/utils/createEmptyRowBuffer.d.ts +1 -1
  400. package/dist/utils/createEmptyRowBuffer.d.ts.map +1 -1
  401. package/dist/utils/createEmptyRowBuffer.js +1 -2
  402. package/dist/utils/createEmptyRowBuffer.js.map +1 -1
  403. package/dist/utils/createFileHeaderElement.d.ts +1 -1
  404. package/dist/utils/createFileHeaderElement.d.ts.map +1 -1
  405. package/dist/utils/createFileHeaderElement.js +6 -3
  406. package/dist/utils/createFileHeaderElement.js.map +1 -1
  407. package/dist/utils/createGutterUtilityContentNode.d.ts.map +1 -1
  408. package/dist/utils/createGutterUtilityContentNode.js +1 -1
  409. package/dist/utils/createGutterUtilityContentNode.js.map +1 -1
  410. package/dist/utils/createGutterUtilityElement.d.ts +1 -1
  411. package/dist/utils/createGutterUtilityElement.d.ts.map +1 -1
  412. package/dist/utils/createGutterUtilityElement.js +1 -2
  413. package/dist/utils/createGutterUtilityElement.js.map +1 -1
  414. package/dist/utils/createNoNewlineElement.d.ts +1 -1
  415. package/dist/utils/createNoNewlineElement.d.ts.map +1 -1
  416. package/dist/utils/createNoNewlineElement.js +1 -2
  417. package/dist/utils/createNoNewlineElement.js.map +1 -1
  418. package/dist/utils/createPreElement.d.ts +1 -1
  419. package/dist/utils/createPreElement.d.ts.map +1 -1
  420. package/dist/utils/createPreElement.js +1 -2
  421. package/dist/utils/createPreElement.js.map +1 -1
  422. package/dist/utils/createRowNodes.d.ts.map +1 -1
  423. package/dist/utils/createRowNodes.js +1 -1
  424. package/dist/utils/createRowNodes.js.map +1 -1
  425. package/dist/utils/createSeparator.d.ts +1 -1
  426. package/dist/utils/createSeparator.d.ts.map +1 -1
  427. package/dist/utils/createSeparator.js +1 -2
  428. package/dist/utils/createSeparator.js.map +1 -1
  429. package/dist/utils/createSpanNodeFromToken.d.ts.map +1 -1
  430. package/dist/utils/createSpanNodeFromToken.js +1 -2
  431. package/dist/utils/createSpanNodeFromToken.js.map +1 -1
  432. package/dist/utils/createStyleElement.d.ts +1 -1
  433. package/dist/utils/createStyleElement.d.ts.map +1 -1
  434. package/dist/utils/createStyleElement.js +1 -2
  435. package/dist/utils/createStyleElement.js.map +1 -1
  436. package/dist/utils/createTransformerWithState.d.ts.map +1 -1
  437. package/dist/utils/createTransformerWithState.js +1 -2
  438. package/dist/utils/createTransformerWithState.js.map +1 -1
  439. package/dist/utils/createUnsafeCSSStyleNode.d.ts.map +1 -1
  440. package/dist/utils/createUnsafeCSSStyleNode.js +1 -2
  441. package/dist/utils/createUnsafeCSSStyleNode.js.map +1 -1
  442. package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -1
  443. package/dist/utils/createWindowFromScrollPosition.js +5 -5
  444. package/dist/utils/createWindowFromScrollPosition.js.map +1 -1
  445. package/dist/utils/cssWrappers.d.ts.map +1 -1
  446. package/dist/utils/cssWrappers.js +2 -3
  447. package/dist/utils/cssWrappers.js.map +1 -1
  448. package/dist/utils/detachString.d.ts.map +1 -1
  449. package/dist/utils/detachString.js +1 -1
  450. package/dist/utils/detachString.js.map +1 -1
  451. package/dist/utils/diffAcceptRejectHunk.d.ts.map +1 -1
  452. package/dist/utils/diffAcceptRejectHunk.js +1 -2
  453. package/dist/utils/diffAcceptRejectHunk.js.map +1 -1
  454. package/dist/utils/formatCSSVariablePrefix.d.ts.map +1 -1
  455. package/dist/utils/formatCSSVariablePrefix.js +1 -1
  456. package/dist/utils/formatCSSVariablePrefix.js.map +1 -1
  457. package/dist/utils/getDiffHunksRendererOptions.d.ts.map +1 -1
  458. package/dist/utils/getDiffHunksRendererOptions.js +1 -1
  459. package/dist/utils/getDiffHunksRendererOptions.js.map +1 -1
  460. package/dist/utils/getFileRendererOptions.d.ts.map +1 -1
  461. package/dist/utils/getFileRendererOptions.js +1 -1
  462. package/dist/utils/getFileRendererOptions.js.map +1 -1
  463. package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
  464. package/dist/utils/getFiletypeFromFileName.js +1 -1
  465. package/dist/utils/getFiletypeFromFileName.js.map +1 -1
  466. package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
  467. package/dist/utils/getHighlighterOptions.js +1 -2
  468. package/dist/utils/getHighlighterOptions.js.map +1 -1
  469. package/dist/utils/getHighlighterThemeStyles.d.ts.map +1 -1
  470. package/dist/utils/getHighlighterThemeStyles.js +1 -2
  471. package/dist/utils/getHighlighterThemeStyles.js.map +1 -1
  472. package/dist/utils/getHunkSeparatorSlotName.d.ts.map +1 -1
  473. package/dist/utils/getHunkSeparatorSlotName.js +1 -1
  474. package/dist/utils/getHunkSeparatorSlotName.js.map +1 -1
  475. package/dist/utils/getIconForType.d.ts.map +1 -1
  476. package/dist/utils/getIconForType.js +1 -1
  477. package/dist/utils/getIconForType.js.map +1 -1
  478. package/dist/utils/getLineAnnotationName.d.ts.map +1 -1
  479. package/dist/utils/getLineAnnotationName.js +1 -1
  480. package/dist/utils/getLineAnnotationName.js.map +1 -1
  481. package/dist/utils/getLineEndingType.d.ts.map +1 -1
  482. package/dist/utils/getLineEndingType.js +1 -1
  483. package/dist/utils/getLineEndingType.js.map +1 -1
  484. package/dist/utils/getLineNodes.d.ts +1 -1
  485. package/dist/utils/getLineNodes.d.ts.map +1 -1
  486. package/dist/utils/getLineNodes.js +1 -1
  487. package/dist/utils/getLineNodes.js.map +1 -1
  488. package/dist/utils/getMergeConflictActionSlotName.d.ts.map +1 -1
  489. package/dist/utils/getMergeConflictActionSlotName.js +1 -1
  490. package/dist/utils/getMergeConflictActionSlotName.js.map +1 -1
  491. package/dist/utils/getMergeConflictLineTypes.d.ts.map +1 -1
  492. package/dist/utils/getMergeConflictLineTypes.js +1 -2
  493. package/dist/utils/getMergeConflictLineTypes.js.map +1 -1
  494. package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -1
  495. package/dist/utils/getOrCreateCodeNode.js +1 -1
  496. package/dist/utils/getOrCreateCodeNode.js.map +1 -1
  497. package/dist/utils/getSingularPatch.d.ts.map +1 -1
  498. package/dist/utils/getSingularPatch.js +1 -2
  499. package/dist/utils/getSingularPatch.js.map +1 -1
  500. package/dist/utils/getThemes.d.ts.map +1 -1
  501. package/dist/utils/getThemes.js +1 -2
  502. package/dist/utils/getThemes.js.map +1 -1
  503. package/dist/utils/getTotalLineCountFromHunks.d.ts.map +1 -1
  504. package/dist/utils/getTotalLineCountFromHunks.js +1 -1
  505. package/dist/utils/getTotalLineCountFromHunks.js.map +1 -1
  506. package/dist/utils/hast_utils.d.ts +1 -1
  507. package/dist/utils/hast_utils.d.ts.map +1 -1
  508. package/dist/utils/hast_utils.js +1 -1
  509. package/dist/utils/hast_utils.js.map +1 -1
  510. package/dist/utils/hostTheme.d.ts.map +1 -1
  511. package/dist/utils/hostTheme.js +1 -2
  512. package/dist/utils/hostTheme.js.map +1 -1
  513. package/dist/utils/includesFileAnnotations.d.ts.map +1 -1
  514. package/dist/utils/includesFileAnnotations.js +5 -5
  515. package/dist/utils/includesFileAnnotations.js.map +1 -1
  516. package/dist/utils/isDefaultRenderRange.d.ts.map +1 -1
  517. package/dist/utils/isDefaultRenderRange.js +1 -1
  518. package/dist/utils/isDefaultRenderRange.js.map +1 -1
  519. package/dist/utils/isDiffPlainText.d.ts.map +1 -1
  520. package/dist/utils/isDiffPlainText.js +1 -2
  521. package/dist/utils/isDiffPlainText.js.map +1 -1
  522. package/dist/utils/isFilePlainText.d.ts.map +1 -1
  523. package/dist/utils/isFilePlainText.js +1 -2
  524. package/dist/utils/isFilePlainText.js.map +1 -1
  525. package/dist/utils/isStyleNode.d.ts.map +1 -1
  526. package/dist/utils/isStyleNode.js +1 -1
  527. package/dist/utils/isStyleNode.js.map +1 -1
  528. package/dist/utils/isWorkerContext.d.ts.map +1 -1
  529. package/dist/utils/isWorkerContext.js +1 -1
  530. package/dist/utils/isWorkerContext.js.map +1 -1
  531. package/dist/utils/iterateOverDiff.d.ts.map +1 -1
  532. package/dist/utils/iterateOverDiff.js +44 -45
  533. package/dist/utils/iterateOverDiff.js.map +1 -1
  534. package/dist/utils/normalizeDiffResolution.d.ts.map +1 -1
  535. package/dist/utils/normalizeDiffResolution.js +1 -1
  536. package/dist/utils/normalizeDiffResolution.js.map +1 -1
  537. package/dist/utils/parseDiffDecorations.d.ts.map +1 -1
  538. package/dist/utils/parseDiffDecorations.js +1 -2
  539. package/dist/utils/parseDiffDecorations.js.map +1 -1
  540. package/dist/utils/parseDiffFromFile.d.ts +0 -1
  541. package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
  542. package/dist/utils/parseDiffFromFile.js +1 -2
  543. package/dist/utils/parseDiffFromFile.js.map +1 -1
  544. package/dist/utils/parseLineType.d.ts.map +1 -1
  545. package/dist/utils/parseLineType.js +1 -1
  546. package/dist/utils/parseLineType.js.map +1 -1
  547. package/dist/utils/parseMergeConflictDiffFromFile.d.ts.map +1 -1
  548. package/dist/utils/parseMergeConflictDiffFromFile.js +5 -5
  549. package/dist/utils/parseMergeConflictDiffFromFile.js.map +1 -1
  550. package/dist/utils/parsePatchFiles.d.ts.map +1 -1
  551. package/dist/utils/parsePatchFiles.js +6 -7
  552. package/dist/utils/parsePatchFiles.js.map +1 -1
  553. package/dist/utils/prefersReducedMotion.d.ts.map +1 -1
  554. package/dist/utils/prefersReducedMotion.js +1 -1
  555. package/dist/utils/prefersReducedMotion.js.map +1 -1
  556. package/dist/utils/prerenderHTMLIfNecessary.d.ts.map +1 -1
  557. package/dist/utils/prerenderHTMLIfNecessary.js +1 -1
  558. package/dist/utils/prerenderHTMLIfNecessary.js.map +1 -1
  559. package/dist/utils/processLine.d.ts +1 -1
  560. package/dist/utils/processLine.d.ts.map +1 -1
  561. package/dist/utils/processLine.js +1 -2
  562. package/dist/utils/processLine.js.map +1 -1
  563. package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
  564. package/dist/utils/renderDiffWithHighlighter.js +4 -5
  565. package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
  566. package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
  567. package/dist/utils/renderFileWithHighlighter.js +1 -2
  568. package/dist/utils/renderFileWithHighlighter.js.map +1 -1
  569. package/dist/utils/resolveConflict.d.ts.map +1 -1
  570. package/dist/utils/resolveConflict.js +1 -2
  571. package/dist/utils/resolveConflict.js.map +1 -1
  572. package/dist/utils/resolveRegion.d.ts.map +1 -1
  573. package/dist/utils/resolveRegion.js +1 -1
  574. package/dist/utils/resolveRegion.js.map +1 -1
  575. package/dist/utils/roundToDevicePixel.d.ts.map +1 -1
  576. package/dist/utils/roundToDevicePixel.js +1 -1
  577. package/dist/utils/roundToDevicePixel.js.map +1 -1
  578. package/dist/utils/scrollbarGutter.d.ts.map +1 -1
  579. package/dist/utils/scrollbarGutter.js +1 -2
  580. package/dist/utils/scrollbarGutter.js.map +1 -1
  581. package/dist/utils/setLanguageOverride.d.ts.map +1 -1
  582. package/dist/utils/setLanguageOverride.js +1 -1
  583. package/dist/utils/setLanguageOverride.js.map +1 -1
  584. package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
  585. package/dist/utils/setWrapperNodeProps.js +1 -1
  586. package/dist/utils/setWrapperNodeProps.js.map +1 -1
  587. package/dist/utils/shouldUseTokenTransformer.d.ts.map +1 -1
  588. package/dist/utils/shouldUseTokenTransformer.js +1 -1
  589. package/dist/utils/shouldUseTokenTransformer.js.map +1 -1
  590. package/dist/utils/splitFileContents.d.ts.map +1 -1
  591. package/dist/utils/splitFileContents.js +1 -2
  592. package/dist/utils/splitFileContents.js.map +1 -1
  593. package/dist/utils/trimPatchContext.d.ts.map +1 -1
  594. package/dist/utils/trimPatchContext.js +1 -2
  595. package/dist/utils/trimPatchContext.js.map +1 -1
  596. package/dist/utils/updateDiffHunks.d.ts +2 -1
  597. package/dist/utils/updateDiffHunks.d.ts.map +1 -1
  598. package/dist/utils/updateDiffHunks.js +22 -3
  599. package/dist/utils/updateDiffHunks.js.map +1 -1
  600. package/dist/utils/virtualDiffLayout.d.ts.map +1 -1
  601. package/dist/utils/virtualDiffLayout.js +1 -2
  602. package/dist/utils/virtualDiffLayout.js.map +1 -1
  603. package/dist/utils/wrapTokenFragments.d.ts +1 -1
  604. package/dist/utils/wrapTokenFragments.d.ts.map +1 -1
  605. package/dist/utils/wrapTokenFragments.js +1 -2
  606. package/dist/utils/wrapTokenFragments.js.map +1 -1
  607. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  608. package/dist/worker/WorkerPoolManager.js +5 -5
  609. package/dist/worker/WorkerPoolManager.js.map +1 -1
  610. package/dist/worker/getOrCreateWorkerPoolSingleton.d.ts.map +1 -1
  611. package/dist/worker/getOrCreateWorkerPoolSingleton.js +1 -2
  612. package/dist/worker/getOrCreateWorkerPoolSingleton.js.map +1 -1
  613. package/dist/worker/index.js +1 -2
  614. package/dist/worker/types.d.ts.map +1 -1
  615. package/dist/worker/wasm-B9ZqxnKj.js +8 -0
  616. package/dist/worker/wasm-B9ZqxnKj.js.map +1 -0
  617. package/dist/worker/worker-portable.js +2779 -6403
  618. package/dist/worker/worker-portable.js.map +1 -1
  619. package/dist/worker/worker.js +89 -123
  620. package/dist/worker/worker.js.map +1 -1
  621. package/package.json +13 -14
  622. package/dist/worker/wasm-qE0LgnY3.js +0 -10
  623. 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,17 +14,17 @@ 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();
@@ -42,18 +43,22 @@ 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
+ #contentHasFocus = false;
56
+ #isComposing = false;
53
57
  #isGutterMouseDown = false;
54
58
  #isContentMouseDown = false;
55
59
  #shiftKeyPressed = false;
56
60
  #selectionStart;
61
+ #deletedSelectionText = "";
57
62
  #reservedSelections;
58
63
  #initSelections;
59
64
  #selections;
@@ -62,6 +67,7 @@ var Editor = class {
62
67
  #scrollingToLineChar;
63
68
  #scrollingToLineNoFocus = false;
64
69
  #retainSearchPanelFocus = false;
70
+ #fontRemeasureScheduled = false;
65
71
  #onDeferTokenize = (lines, themeType) => {
66
72
  this.#fileInstance?.updateRenderCache(lines, themeType);
67
73
  if (this.#renderRange !== void 0 && this.#renderRange.totalLines !== Infinity) {
@@ -77,17 +83,16 @@ var Editor = class {
77
83
  this.#options = options;
78
84
  }
79
85
  edit(component) {
80
- const { useTokenTransformer, enableGutterUtility, enableLineSelection, expandUnchanged, diffStyle, lineHoverHighlight,...rest } = component.options;
86
+ const { useTokenTransformer, enableGutterUtility, enableLineSelection, expandUnchanged, lineHoverHighlight, ...rest } = component.options;
81
87
  const isDiff = component.type === "file-diff";
82
- if (useTokenTransformer !== true || enableGutterUtility === true || enableLineSelection === true || lineHoverHighlight !== "disabled" || expandUnchanged !== true && isDiff || diffStyle === "unified" && isDiff) {
88
+ if (useTokenTransformer !== true || enableGutterUtility === true || enableLineSelection === true || expandUnchanged !== true && isDiff || lineHoverHighlight !== "disabled") {
83
89
  component.setOptions({
84
90
  ...rest,
85
91
  useTokenTransformer: true,
86
92
  enableGutterUtility: false,
87
93
  enableLineSelection: false,
88
- lineHoverHighlight: "disabled",
89
94
  expandUnchanged: true,
90
- diffStyle: "split"
95
+ lineHoverHighlight: "disabled"
91
96
  });
92
97
  component.rerender();
93
98
  }
@@ -102,8 +107,42 @@ var Editor = class {
102
107
  applyEdits(edits, updateHistory = false) {
103
108
  const textDocument = this.#textDocument;
104
109
  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));
110
+ const wasFocused = this.#contentHasFocus;
111
+ const selectionsBefore = this.#selections;
112
+ const selectionOffsetsBefore = selectionsBefore?.map((selection) => [textDocument.offsetAt(selection.start), textDocument.offsetAt(selection.end)]);
113
+ const resolvedEditOffsets = selectionsBefore === void 0 ? void 0 : edits.map((edit) => {
114
+ const a = textDocument.offsetAt(edit.range.start);
115
+ const b = textDocument.offsetAt(edit.range.end);
116
+ return {
117
+ start: Math.min(a, b),
118
+ end: Math.max(a, b),
119
+ text: edit.newText
120
+ };
121
+ }).sort((a, b) => a.start - b.start);
122
+ const change = textDocument.applyEdits(edits, updateHistory, selectionsBefore);
123
+ if (change === void 0) return;
124
+ let nextSelections;
125
+ if (selectionsBefore !== void 0 && selectionOffsetsBefore !== void 0 && resolvedEditOffsets !== void 0) {
126
+ nextSelections = remapSelectionsAfterEdits(textDocument, selectionsBefore, selectionOffsetsBefore, resolvedEditOffsets);
127
+ if (updateHistory) textDocument.setLastUndoSelectionsAfter(nextSelections);
128
+ }
129
+ this.#applyChange(change, nextSelections, this.#applyChangeToLineAnnotations(change), { skipFocus: !wasFocused });
130
+ }
131
+ /** Whether there is an edit to undo. */
132
+ get canUndo() {
133
+ return this.#textDocument?.canUndo ?? false;
134
+ }
135
+ /** Whether there is an undone edit to redo. */
136
+ get canRedo() {
137
+ return this.#textDocument?.canRedo ?? false;
138
+ }
139
+ /** Undo the last edit. Does nothing when there is nothing to undo. */
140
+ undo() {
141
+ this.#runCommand("undo");
142
+ }
143
+ /** Redo the last undone edit. Does nothing when there is nothing to redo. */
144
+ redo() {
145
+ this.#runCommand("redo");
107
146
  }
108
147
  getState() {
109
148
  const fileRef = this.#getFileRef();
@@ -138,7 +177,7 @@ var Editor = class {
138
177
  const start = textDocument.normalizePosition(selection.start);
139
178
  const end = textDocument.normalizePosition(selection.end);
140
179
  return {
141
- direction: selection.direction === "none" ? DirectionNone : selection.direction === "backward" ? DirectionBackward : DirectionForward,
180
+ direction: selection.direction === "none" ? 0 : selection.direction === "backward" ? -1 : 1,
142
181
  start,
143
182
  end
144
183
  };
@@ -157,7 +196,8 @@ var Editor = class {
157
196
  }
158
197
  this.#markerRenderer ??= new MarkerRenderer({
159
198
  getLineHeight: () => this.#metrics.lineHeight,
160
- getFileContainer: () => this.#fileContainer,
199
+ getOverlayElement: () => this.#overlayElement,
200
+ getGutterWidth: () => this.#getGutterWidth(),
161
201
  getCharX: (line, character) => this.#getCharX(line, character),
162
202
  getLineY: (line) => this.#getLineY(line),
163
203
  isMouseDown: () => this.#isContentMouseDown || this.#isGutterMouseDown
@@ -170,7 +210,7 @@ var Editor = class {
170
210
  const preventScroll = options?.preventScroll ?? false;
171
211
  const primarySelection = this.#selections?.at(-1);
172
212
  if (primarySelection !== void 0) {
173
- const pos = primarySelection.direction === DirectionBackward ? primarySelection.end : primarySelection.start;
213
+ const pos = primarySelection.direction === -1 ? primarySelection.end : primarySelection.start;
174
214
  this.#focus(pos, preventScroll);
175
215
  } else this.#focus(void 0, preventScroll);
176
216
  }
@@ -206,10 +246,12 @@ var Editor = class {
206
246
  this.#gutterElement = void 0;
207
247
  this.#contentElement?.removeAttribute("contentEditable");
208
248
  this.#contentElement = void 0;
249
+ this.#contentHasFocus = false;
209
250
  this.#overlayElement?.remove();
210
251
  this.#overlayElement = void 0;
211
252
  this.#resizeObserver?.disconnect();
212
253
  this.#resizeObserver = void 0;
254
+ this.#fontRemeasureScheduled = false;
213
255
  this.#resetState();
214
256
  }
215
257
  /** @internal */
@@ -223,7 +265,7 @@ var Editor = class {
223
265
  }
224
266
  }
225
267
  /** @internal */
226
- __syncRenderView = (highlighter, fileContainer, fileContents, lineAnnotations, renderRange) => {
268
+ __syncRenderView = (highlighter, fileContainer, fileOrDiff, lineAnnotations, renderRange) => {
227
269
  const shadowRoot = fileContainer.shadowRoot;
228
270
  if (shadowRoot == null) {
229
271
  console.error("[editor] Could not find the shadow root.");
@@ -235,10 +277,10 @@ var Editor = class {
235
277
  for (const el of shadowRoot.querySelectorAll("[data-code]")) if (el.dataset.deletions === void 0) {
236
278
  codeElement = el;
237
279
  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;
280
+ const el = child;
281
+ const { gutter, content } = el.dataset;
282
+ if (gutter !== void 0) gutterEl = el;
283
+ else if (content !== void 0) contentEl = el;
242
284
  }
243
285
  break;
244
286
  }
@@ -250,10 +292,19 @@ var Editor = class {
250
292
  if (this.#themeStyleElement !== void 0) shadowRoot.appendChild(this.#themeStyleElement);
251
293
  if (this.#spriteElement !== void 0) shadowRoot.prepend(this.#spriteElement);
252
294
  }
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) {
295
+ const documentReplaced = this.#textDocument === void 0 || this.#fileInfo === void 0 || this.#fileInfo.name !== fileOrDiff.name || this.#fileInfo.lang !== fileOrDiff.lang || this.#fileInfo.cacheKey !== fileOrDiff.cacheKey;
296
+ if (documentReplaced) {
297
+ let contents = "";
298
+ if ("contents" in fileOrDiff) contents = fileOrDiff.contents;
299
+ else contents = fileOrDiff.additionLines.join("");
254
300
  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;
301
+ const textDocument = new TextDocument(fileOrDiff.name, contents, fileOrDiff.lang ?? getFiletypeFromFileName(fileOrDiff.name), 0, editStack);
302
+ const { name, lang, cacheKey } = fileOrDiff;
303
+ this.#fileInfo = {
304
+ name,
305
+ lang,
306
+ cacheKey
307
+ };
257
308
  this.#textDocument = textDocument;
258
309
  this.#tokenizer?.cleanUp();
259
310
  this.#tokenizer = new EditorTokenizer({
@@ -268,10 +319,14 @@ var Editor = class {
268
319
  });
269
320
  this.#resetState();
270
321
  this.#selections = this.#initSelections;
271
- this.#options.onAttach?.(this, this.#fileInstance);
322
+ requestAnimationFrame(() => {
323
+ this.#options.onAttach?.(this, this.#fileInstance);
324
+ });
272
325
  if (this.#textDocument !== void 0 && this.#options.__debug === true) console.log("[diffs/editor] text document changed !!!");
273
326
  }
327
+ let fullRerender = false;
274
328
  if (this.#contentElement !== contentEl) {
329
+ fullRerender = true;
275
330
  this.#gutterElement = gutterEl;
276
331
  this.#contentElement = extend(contentEl, {
277
332
  contentEditable: "true",
@@ -285,14 +340,29 @@ var Editor = class {
285
340
  });
286
341
  if (this.#overlayElement !== void 0) contentEl.after(this.#overlayElement);
287
342
  this.#metrics.init(contentEl);
343
+ this.#remeasureMetricsOnFontLoad();
288
344
  this.#listenContentElement(contentEl, gutterEl);
289
345
  if (this.#contentElement !== void 0 && this.#options.__debug === true) console.log("[diffs/editor] full re-render triggered !!!");
290
346
  }
347
+ if (contentEl.ariaLabel !== fileOrDiff.name) contentEl.ariaLabel = fileOrDiff.name;
348
+ if (lineAnnotations !== void 0 && lineAnnotations.length > 0 || this.#isDiff && this.#diffSyle === "unified") for (const child of this.#contentElement.children) {
349
+ const el = child;
350
+ const { lineAnnotation, lineType } = el.dataset;
351
+ if (lineAnnotation !== void 0 || lineType === "change-deletion") el.setAttribute("contenteditable", "false");
352
+ }
291
353
  this.#resetCache();
292
- this.#wrap = this.#fileInstance?.options.overflow === "wrap";
354
+ this.#tokenizer?.syncTheme(this.#fileInstance?.options ?? {});
293
355
  this.#lineAnnotations = lineAnnotations;
294
356
  this.#renderRange = renderRange;
357
+ this.#viewportWindowLines = renderRange?.totalLines;
295
358
  this.#tokenizer?.prebuildStateStack(renderRange);
359
+ const fileInstance = this.#fileInstance;
360
+ const textDocument = this.#textDocument;
361
+ if (!documentReplaced && fullRerender && fileInstance?.rerenderFromDocument !== void 0 && textDocument !== void 0 && this.#shouldRenderDivergeFromDocument(textDocument)) {
362
+ fileInstance.rerenderFromDocument(textDocument);
363
+ return;
364
+ }
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,12 +370,20 @@ 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();
@@ -313,9 +391,9 @@ var Editor = class {
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 || 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,41 @@ 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) => {
402
491
  if (e.pointerType !== "mouse") return;
492
+ if (this.#isDeletedLineTarget(e)) {
493
+ this.#setDeletedTextSelectionActive(true);
494
+ if (this.#selections !== void 0) this.#updateSelections([]);
495
+ return;
496
+ }
497
+ this.#setDeletedTextSelectionActive(false);
403
498
  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();
499
+ if (isSafari() && this.#lineAnnotations !== void 0 && this.#lineAnnotations.length > 0) {
500
+ const annotationDisposes = [...contentEl.querySelectorAll("[data-line-annotation]")].map((el) => [addEventListener(el, "mouseenter", () => {
501
+ this.#shouldIgnoreSelectionChange = true;
502
+ }), addEventListener(el, "mouseleave", () => {
503
+ this.#shouldIgnoreSelectionChange = false;
504
+ })]).flat();
505
+ this.#replaceSelectEventListeners(annotationDisposes);
506
+ }
409
507
  this.#isContentMouseDown = true;
410
508
  this.#selectionStart = void 0;
411
509
  if (e.button === 0 && isPrimaryModifier(e)) this.#reservedSelections = this.#selections?.map((selection) => ({ ...selection }));
412
510
  if (e.shiftKey) {
413
511
  const primarySelection = this.#selections?.at(-1);
414
512
  if (primarySelection !== void 0) {
415
- const pos = primarySelection.direction === DirectionBackward ? primarySelection.end : primarySelection.start;
513
+ const pos = primarySelection.direction === -1 ? primarySelection.end : primarySelection.start;
416
514
  this.#setWindowSelection({
417
515
  start: pos,
418
516
  end: pos,
419
- direction: DirectionNone
517
+ direction: 0
420
518
  });
421
519
  }
422
520
  this.#shiftKeyPressed = true;
@@ -437,7 +535,7 @@ var Editor = class {
437
535
  this.#updateSelections([{
438
536
  start: pos,
439
537
  end: pos,
440
- direction: DirectionNone
538
+ direction: 0
441
539
  }]);
442
540
  this.#focus(pos);
443
541
  }
@@ -454,6 +552,19 @@ var Editor = class {
454
552
  e.preventDefault();
455
553
  return;
456
554
  }
555
+ if (e.key === "v" && isPrimaryModifier(e) && this.#options.clipboard !== void 0) {
556
+ e.preventDefault();
557
+ queueRender(this.#handleCustomPasteEvent);
558
+ return;
559
+ }
560
+ if (this.#searchPanel !== void 0) {
561
+ const findAgain = resolveFindAgainShortcut(e);
562
+ if (findAgain !== void 0) {
563
+ e.preventDefault();
564
+ this.#searchPanel.navigate(findAgain === "previous");
565
+ return;
566
+ }
567
+ }
457
568
  const command = resolveEditorCommandFromKeyboardEvent(e);
458
569
  if (command !== void 0) {
459
570
  e.preventDefault();
@@ -463,22 +574,23 @@ var Editor = class {
463
574
  addEventListener(contentEl, "copy", (e) => {
464
575
  if (!targetIsContentElement(e)) return;
465
576
  e.preventDefault();
466
- e.clipboardData?.setData("text", this.#getSelectionText());
577
+ e.clipboardData?.setData("text", this.#isDeletedTextSelectionActive() ? this.#deletedTextForClipboard() : this.#getSelectionText());
467
578
  }),
468
579
  addEventListener(contentEl, "cut", (e) => {
469
580
  if (!targetIsContentElement(e)) return;
470
581
  e.preventDefault();
471
- e.clipboardData?.setData("text", this.#getSelectionText());
472
- this.#replaceSelectionText("");
582
+ e.clipboardData?.setData("text", this.#isDeletedTextSelectionActive() ? this.#deletedTextForClipboard() : this.#cutSelectionText());
473
583
  }),
474
584
  addEventListener(contentEl, "paste", (e) => {
475
585
  if (!targetIsContentElement(e)) return;
476
586
  e.preventDefault();
477
587
  const text = e.clipboardData?.getData("text");
478
- if (text !== void 0) this.#replaceSelectionText(text);
588
+ const textDocument = this.#textDocument;
589
+ if (text !== void 0 && textDocument !== void 0) this.#replaceSelectionText(textDocument.normalizeEol(text), void 0, true);
479
590
  }),
480
591
  addEventListener(contentEl, "beforeinput", (e) => {
481
592
  if (!targetIsContentElement(e)) return;
593
+ if (e.inputType === "insertCompositionText") return;
482
594
  e.preventDefault();
483
595
  this.#handleInput(e.inputType, e.data);
484
596
  }),
@@ -488,14 +600,25 @@ var Editor = class {
488
600
  }),
489
601
  addEventListener(contentEl, "compositionstart", (e) => {
490
602
  if (!targetIsContentElement(e)) return;
603
+ this.#isComposing = true;
491
604
  this.#shouldIgnoreSelectionChange = true;
492
605
  }, { passive: true }),
493
606
  addEventListener(contentEl, "compositionend", (e) => {
494
607
  if (!targetIsContentElement(e)) return;
495
608
  this.#shouldIgnoreSelectionChange = false;
496
- this.#handleInput("insertText", e.data);
609
+ const wasComposing = this.#isComposing;
610
+ this.#isComposing = false;
611
+ if (e.data !== "" || !wasComposing) this.#handleInput("insertText", e.data);
497
612
  }, { passive: true })
498
613
  ];
614
+ const deletionsCode = this.#fileContainer?.shadowRoot?.querySelector("[data-deletions]");
615
+ if (deletionsCode != null) this.#editorEventDisposes.push(addEventListener(deletionsCode, "pointerdown", (e) => {
616
+ const target = e.composedPath()[0];
617
+ const gutterRow = target instanceof HTMLElement ? target.closest("[data-column-number]") : null;
618
+ if (gutterRow instanceof HTMLElement && this.#beginDeletionGutterSelection(gutterRow, deletionsCode, e.pointerType === "mouse")) return;
619
+ this.#setDeletedTextSelectionActive(true);
620
+ if (this.#selections !== void 0) this.#updateSelections([]);
621
+ }, { passive: true }));
499
622
  if (gutterEl !== void 0) {
500
623
  const resolveGutterTarget = (eventTarget, includeContentLine = false) => {
501
624
  let target = eventTarget;
@@ -511,55 +634,61 @@ var Editor = class {
511
634
  return lineNumber - 1;
512
635
  };
513
636
  this.#editorEventDisposes.push(addEventListener(gutterEl, "pointerdown", (e) => {
637
+ const gutterRow = resolveGutterTarget(e.composedPath()[0]);
638
+ if (gutterRow?.dataset.lineType === "change-deletion") {
639
+ const code = gutterRow.closest("[data-code]");
640
+ if (code != null) this.#beginDeletionGutterSelection(gutterRow, code, e.pointerType === "mouse");
641
+ return;
642
+ }
643
+ if (e.pointerType !== "mouse") return;
514
644
  const textDocument = this.#textDocument;
515
- const lineIndex = resolveEditableLine(resolveGutterTarget(e.composedPath()[0]));
645
+ const lineIndex = resolveEditableLine(gutterRow);
516
646
  if (lineIndex === void 0 || textDocument === void 0) return;
517
647
  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
- };
648
+ const selection = this.#spanLineSelection(lineIndex, lineIndex, textDocument);
529
649
  this.#isGutterMouseDown = true;
530
650
  this.#selectionStart = selection;
531
651
  this.#updateSelections([selection]);
532
- this.#focus(selection.end);
533
- this.#selectEventDisposes = [addEventListener(document, "mousemove", (e$1) => {
652
+ this.#setWindowSelection(selection);
653
+ this.#focus();
654
+ this.#replaceSelectEventListeners([addEventListener(document, "mousemove", (e) => {
534
655
  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 })];
656
+ const textDocument = this.#textDocument;
657
+ const lineIndex = resolveEditableLine(resolveGutterTarget(e.composedPath()[0], true));
658
+ if (lineIndex === void 0 || textDocument === void 0) return;
659
+ const anchorLine = this.#selectionStart?.start.line ?? lineIndex;
660
+ const selection = this.#spanLineSelection(anchorLine, lineIndex, textDocument);
661
+ this.#selectionStart ??= selection;
662
+ this.#updateSelections([selection]);
663
+ this.#focus(selection.direction === -1 ? selection.start : selection.end);
664
+ }, { passive: true })]);
554
665
  }, { passive: true }));
555
666
  }
556
667
  this.#markerRenderer?.listenHover(contentEl);
557
668
  this.#resizeObserver?.disconnect();
558
- this.#resizeObserver = new ResizeObserver(() => {
559
- this.#handleLayoutResize();
560
- });
669
+ this.#resizeObserver = new ResizeObserver(this.#handleLayoutResize);
561
670
  this.#resizeObserver.observe(contentEl);
562
671
  this.#resizeObserver.observe(contentEl.parentElement);
672
+ this.#computeContentOffset(contentEl);
673
+ }
674
+ #handleCustomPasteEvent = async () => {
675
+ const clipboard = this.#options.clipboard;
676
+ if (clipboard !== void 0) {
677
+ const text = await clipboard.readText();
678
+ this.#replaceSelectionText(text, void 0, true);
679
+ }
680
+ };
681
+ #computeContentOffset(contentEl) {
682
+ if (this.#isDiff && this.#diffSyle === "split" && this.#isWrap) {
683
+ this.#contentOffset = {
684
+ top: contentEl.offsetTop,
685
+ left: contentEl.offsetLeft - this.#getGutterWidth()
686
+ };
687
+ if (this.#options.__debug === true) console.log("[diffs/editor] content offset:", this.#contentOffset);
688
+ }
689
+ }
690
+ get #activeContentOffset() {
691
+ if (this.#isDiff && this.#diffSyle === "split" && this.#isWrap) return this.#contentOffset;
563
692
  }
564
693
  #runCommand(command) {
565
694
  const textDocument = this.#textDocument;
@@ -595,6 +724,7 @@ var Editor = class {
595
724
  if (this.#selections !== void 0) {
596
725
  const edits = [];
597
726
  const nextSelections = [];
727
+ const sameLineIndents = [];
598
728
  for (const selection of this.#selections) {
599
729
  const startLine = selection.start.line;
600
730
  const outdent = command === "outdent";
@@ -603,11 +733,45 @@ var Editor = class {
603
733
  edits.push(...ret[0]);
604
734
  nextSelections.push(ret[1]);
605
735
  } else {
606
- const lineChar0 = textDocument.charAt({
736
+ const text = textDocument.charAt({
607
737
  line: startLine,
608
738
  character: 0
739
+ }) === " " ? " " : " ".repeat(this.#metrics.tabSize);
740
+ edits.push({
741
+ range: selection,
742
+ newText: text
609
743
  });
610
- this.#replaceSelectionText(lineChar0 === " " ? " " : " ".repeat(this.#metrics.tabSize));
744
+ sameLineIndents.push({
745
+ line: startLine,
746
+ startCharacter: selection.start.character,
747
+ addedLength: text.length - (selection.end.character - selection.start.character),
748
+ selectionIndex: nextSelections.length
749
+ });
750
+ const nextPosition = {
751
+ line: selection.start.line,
752
+ character: selection.start.character + text.length
753
+ };
754
+ nextSelections.push({
755
+ start: nextPosition,
756
+ end: nextPosition,
757
+ direction: 0
758
+ });
759
+ }
760
+ }
761
+ for (const indent of sameLineIndents) {
762
+ let shift = 0;
763
+ for (const other of sameLineIndents) if (other.line === indent.line && other.startCharacter < indent.startCharacter) shift += other.addedLength;
764
+ if (shift !== 0) {
765
+ const current = nextSelections[indent.selectionIndex];
766
+ const position = {
767
+ line: indent.line,
768
+ character: current.start.character + shift
769
+ };
770
+ nextSelections[indent.selectionIndex] = {
771
+ start: position,
772
+ end: position,
773
+ direction: 0
774
+ };
611
775
  }
612
776
  }
613
777
  const change = textDocument.applyEdits(edits, true, this.#selections, nextSelections);
@@ -651,7 +815,7 @@ var Editor = class {
651
815
  break;
652
816
  }
653
817
  }
654
- #handleLayoutResize() {
818
+ #handleLayoutResize = () => {
655
819
  const lineAnnotations = this.#lineAnnotations?.length ?? 0;
656
820
  const prevGutterWidth = this.#gutterWidthCache;
657
821
  const prevContentWidth = this.#contentWidthCache;
@@ -662,7 +826,8 @@ var Editor = class {
662
826
  if (!gutterWidthChanged && !contentWidthChanged) return;
663
827
  this.#lastAccessedLineElement = void 0;
664
828
  this.#lastAccessedCharX = void 0;
665
- if (contentWidthChanged && (this.#wrap || lineAnnotations > 0)) {
829
+ this.#metrics.clearTextWidthCache();
830
+ if (contentWidthChanged && (this.#isWrap || lineAnnotations > 0)) {
666
831
  this.#lineYCache.clear();
667
832
  this.#wrapLineOffsetsCache.clear();
668
833
  }
@@ -671,15 +836,29 @@ var Editor = class {
671
836
  if (this.#selections !== void 0) this.focus();
672
837
  }
673
838
  this.#markerRenderer?.removePopup();
839
+ this.#computeContentOffset(this.#contentElement);
840
+ };
841
+ #remeasureMetricsOnFontLoad() {
842
+ if (this.#fontRemeasureScheduled) return;
843
+ const fonts = document.fonts;
844
+ if (fonts === void 0) return;
845
+ this.#fontRemeasureScheduled = true;
846
+ fonts.ready.then(() => {
847
+ if (this.#contentElement === void 0 || !this.#metrics.remeasureCharacterWidth()) return;
848
+ this.#gutterWidthCache = void 0;
849
+ this.#contentWidthCache = void 0;
850
+ this.#resetCache();
851
+ if (this.#selections !== void 0 || this.#matches !== void 0 || this.#markerRenderer !== void 0) this.#updateSelections(this.#selections ?? []);
852
+ this.#markerRenderer?.removePopup();
853
+ });
674
854
  }
675
855
  #rerender(change, newLineAnnotations, renderRange = this.#renderRange, shouldUpdateBuffer) {
676
856
  const tokenizer = this.#tokenizer;
677
857
  const fileInstance = this.#fileInstance;
678
- const fileContents = this.#fileContents;
679
858
  const textDocument = this.#textDocument;
680
859
  const gutterEl = this.#gutterElement;
681
860
  const contentEl = this.#contentElement;
682
- if (tokenizer === void 0 || fileInstance === void 0 || fileContents === void 0 || textDocument === void 0 || contentEl === void 0) return;
861
+ if (tokenizer === void 0 || fileInstance === void 0 || textDocument === void 0 || contentEl === void 0) return;
683
862
  tokenizer.stopBackgroundTokenize();
684
863
  const t = performance.now();
685
864
  const dirtyLines = tokenizer.tokenize(change, renderRange);
@@ -692,14 +871,14 @@ var Editor = class {
692
871
  const child = children[i];
693
872
  if (child !== void 0) {
694
873
  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
- }
874
+ const lineType = child.dataset.lineType;
875
+ if (lineNumber === void 0 || lineType === "change-deletion") continue;
876
+ const lineIndex = lineNumber - 1;
877
+ if (dirtyLines.has(lineIndex)) {
878
+ const tokens = dirtyLines.get(lineIndex);
879
+ child.replaceChildren(...renderLineTokens(tokens, tokenizer.themeType));
880
+ dirtyLineIndexes.delete(lineIndex);
881
+ if (dirtyLineIndexes.size === 0) break;
703
882
  }
704
883
  }
705
884
  }
@@ -730,11 +909,11 @@ var Editor = class {
730
909
  if (change.lineDelta < 0) for (const children of [contentEl.children, gutterEl?.children ?? []]) for (let i = children.length - 1; i >= 0; i--) {
731
910
  const child = children[i];
732
911
  const lineNumber = getLineNumberAttr(child) ?? getLineNumberAttr(child, "columnNumber");
733
- if (lineNumber === void 0) continue;
912
+ const lineType = child.dataset.lineType;
913
+ if (lineNumber === void 0 || lineType === "change-deletion") continue;
734
914
  if (lineNumber - 1 < change.lineCount) break;
735
915
  child.remove();
736
916
  }
737
- const isDiff = Object.hasOwn(fileInstance, "fileDiff");
738
917
  const didLineCountChange = change.lineDelta !== 0;
739
918
  if (didLineCountChange) {
740
919
  let gridRow = contentEl.children.length;
@@ -745,7 +924,7 @@ var Editor = class {
745
924
  contentEl.style.gridRow = "span " + gridRow;
746
925
  if (gutterEl !== void 0) gutterEl.style.gridRow = "span " + gridRow;
747
926
  }
748
- fileInstance.updateRenderCache(dirtyLines, tokenizer.themeType, isDiff ? !didLineCountChange : void 0);
927
+ fileInstance.updateRenderCache(dirtyLines, tokenizer.themeType, this.#isDiff && !didLineCountChange, didLineCountChange);
749
928
  if (didLineCountChange) fileInstance.applyDocumentChange(textDocument, newLineAnnotations, shouldUpdateBuffer);
750
929
  if (newLineAnnotations !== void 0) {
751
930
  this.#lineAnnotations = newLineAnnotations;
@@ -753,11 +932,31 @@ var Editor = class {
753
932
  }
754
933
  if (this.#options.__debug === true) console.log(`[diffs/editor] re-render in: ${round(performance.now() - t2)}ms,`, `tokenize in: ${round(t2 - t)}ms (${dirtyLines.size} dirty lines)`);
755
934
  }
935
+ #shouldRenderDivergeFromDocument(textDocument) {
936
+ const contentEl = this.#contentElement;
937
+ if (contentEl === void 0) return false;
938
+ for (const child of contentEl.children) {
939
+ const el = child;
940
+ const lineType = el.dataset.lineType;
941
+ const lineNumber = getLineNumberAttr(el);
942
+ if (lineNumber === void 0 || lineType === void 0 || !isLineEditable(lineType)) continue;
943
+ const lineIndex = lineNumber - 1;
944
+ if (lineIndex >= textDocument.lineCount || el.textContent !== textDocument.getLineText(lineIndex)) return true;
945
+ }
946
+ return false;
947
+ }
756
948
  #handleInput(inputType, data) {
757
949
  switch (inputType) {
758
- case "insertText":
759
- this.#replaceSelectionText(data ?? "");
950
+ case "insertText": {
951
+ const text = data ?? "";
952
+ const textDocument = this.#textDocument;
953
+ const selections = this.#selections;
954
+ const autoSurroundTexts = textDocument !== void 0 && selections !== void 0 ? getAutoSurroundReplacementTexts(textDocument, selections, text, this.#options.autoSurround) : void 0;
955
+ this.#replaceSelectionText(autoSurroundTexts ?? text);
760
956
  break;
957
+ }
958
+ case "insertCompositionText": break;
959
+ case "insertLineBreak":
761
960
  case "insertParagraph":
762
961
  this.#replaceSelectionText("\n");
763
962
  break;
@@ -785,12 +984,13 @@ var Editor = class {
785
984
  }
786
985
  }
787
986
  #focus(position, preventScroll = true) {
987
+ this.#contentHasFocus = true;
788
988
  if (position !== void 0) {
789
989
  this.#shouldIgnoreSelectionChange = true;
790
990
  this.#setWindowSelection({
791
991
  start: position,
792
992
  end: position,
793
- direction: DirectionNone
993
+ direction: 0
794
994
  });
795
995
  requestAnimationFrame(() => {
796
996
  this.#contentElement?.focus({ preventScroll });
@@ -810,7 +1010,7 @@ var Editor = class {
810
1010
  if (startLineElement === void 0 || endLineElement === void 0) return;
811
1011
  let [anchorNode, anchorOffset] = getSelectionAnchor(startLineElement, start.character);
812
1012
  let [focusNode, focusOffset] = getSelectionAnchor(endLineElement, end.character);
813
- if (direction === DirectionBackward) [anchorNode, anchorOffset, focusNode, focusOffset] = [
1013
+ if (direction === -1) [anchorNode, anchorOffset, focusNode, focusOffset] = [
814
1014
  focusNode,
815
1015
  focusOffset,
816
1016
  anchorNode,
@@ -831,7 +1031,7 @@ var Editor = class {
831
1031
  block: scrollPosition,
832
1032
  inline: "nearest"
833
1033
  });
834
- if (!noFocus) this.#focus(primarySelection.direction === DirectionBackward ? primarySelection.end : primarySelection.start);
1034
+ if (!noFocus) this.#focus(primarySelection.direction === -1 ? primarySelection.end : primarySelection.start);
835
1035
  } else {
836
1036
  const pos = getCaretPosition(primarySelection);
837
1037
  this.#scrollToLine(pos.line, pos.character, noFocus);
@@ -900,15 +1100,109 @@ var Editor = class {
900
1100
  }
901
1101
  virtualCaret.remove();
902
1102
  }
1103
+ #spanLineSelection(anchorLine, focusLine, textDocument) {
1104
+ const lineStart = (line) => ({
1105
+ line,
1106
+ character: 0
1107
+ });
1108
+ const lineEnd = (line) => ({
1109
+ line,
1110
+ character: textDocument.getLineText(line).length
1111
+ });
1112
+ if (focusLine < anchorLine) return {
1113
+ start: lineStart(focusLine),
1114
+ end: lineEnd(anchorLine),
1115
+ direction: -1
1116
+ };
1117
+ return {
1118
+ start: lineStart(anchorLine),
1119
+ end: lineEnd(focusLine),
1120
+ direction: 1
1121
+ };
1122
+ }
1123
+ #isDeletedLineTarget(event) {
1124
+ const target = event.composedPath()[0];
1125
+ return target instanceof HTMLElement && target.closest("[data-line]")?.getAttribute("data-line-type") === "change-deletion";
1126
+ }
1127
+ #selectDeletedLines(anchorContent, focusContent, deletionsCode) {
1128
+ const rows = [...deletionsCode.querySelectorAll("[data-content] > [data-line]")];
1129
+ const anchorIndex = rows.indexOf(anchorContent);
1130
+ const focusIndex = rows.indexOf(focusContent);
1131
+ const [topContent, bottomContent] = focusIndex < anchorIndex ? [focusContent, anchorContent] : [anchorContent, focusContent];
1132
+ const winSelection = window.getSelection();
1133
+ if (winSelection !== null) {
1134
+ const range = document.createRange();
1135
+ range.setStart(topContent, 0);
1136
+ range.setEnd(bottomContent, bottomContent.childNodes.length);
1137
+ winSelection.removeAllRanges();
1138
+ winSelection.addRange(range);
1139
+ }
1140
+ this.#setDeletedTextSelectionActive(true);
1141
+ this.#updateSelections([]);
1142
+ [...deletionsCode.querySelectorAll("[data-gutter] > [data-column-number]")][focusIndex]?.setAttribute("data-selected-line", "single");
1143
+ const lo = Math.min(anchorIndex, focusIndex);
1144
+ const hi = Math.max(anchorIndex, focusIndex);
1145
+ this.#deletedSelectionText = lo < 0 ? "" : rows.slice(lo, hi + 1).filter((row) => row.getAttribute("data-line-type") === "change-deletion").map((row) => row.textContent ?? "").join("\n");
1146
+ }
1147
+ #contentRowForGutterRow(gutterRow, contentColumn) {
1148
+ const gutterColumn = gutterRow.parentElement;
1149
+ if (gutterColumn == null || contentColumn == null) return;
1150
+ const index = [...gutterColumn.children].indexOf(gutterRow);
1151
+ const row = contentColumn.children[index];
1152
+ return row instanceof HTMLElement ? row : void 0;
1153
+ }
1154
+ #beginDeletionGutterSelection(gutterRow, code, isMouse) {
1155
+ const contentColumn = code.querySelector("[data-content]");
1156
+ const anchorContent = this.#contentRowForGutterRow(gutterRow, contentColumn);
1157
+ if (anchorContent === void 0) return false;
1158
+ this.#selectDeletedLines(anchorContent, anchorContent, code);
1159
+ if (isMouse) this.#replaceSelectEventListeners([addEventListener(document, "mousemove", (moveEvent) => {
1160
+ const moveTarget = moveEvent.composedPath()[0];
1161
+ const moveGutter = moveTarget instanceof HTMLElement ? moveTarget.closest("[data-column-number]") : null;
1162
+ if (moveGutter instanceof HTMLElement && code.contains(moveGutter)) {
1163
+ const focusContent = this.#contentRowForGutterRow(moveGutter, contentColumn);
1164
+ if (focusContent !== void 0) this.#selectDeletedLines(anchorContent, focusContent, code);
1165
+ }
1166
+ }, { passive: true })]);
1167
+ return true;
1168
+ }
1169
+ #isDeletedTextSelectionActive() {
1170
+ return this.#fileContainer?.shadowRoot?.querySelector("pre")?.hasAttribute("data-deleted-text-selection") ?? false;
1171
+ }
1172
+ #deletedTextForClipboard() {
1173
+ return this.#deletedSelectionText !== "" ? this.#deletedSelectionText : window.getSelection()?.toString() ?? "";
1174
+ }
1175
+ #setDeletedTextSelectionActive(active) {
1176
+ const pre = this.#fileContainer?.shadowRoot?.querySelector("pre");
1177
+ if (pre == null) return;
1178
+ if (active) {
1179
+ pre.setAttribute("data-deleted-text-selection", "");
1180
+ for (const highlighted of pre.querySelectorAll("[data-selected-line]")) highlighted.removeAttribute("data-selected-line");
1181
+ this.#deletedSelectionText = "";
1182
+ } else {
1183
+ pre.removeAttribute("data-deleted-text-selection");
1184
+ this.#deletedSelectionText = "";
1185
+ }
1186
+ }
1187
+ #setSelectedLinesSafe(range, lineNumberOnly = false) {
1188
+ try {
1189
+ this.#fileInstance?.setSelectedLines(range, {
1190
+ notify: false,
1191
+ activeLineSide: "additions",
1192
+ lineNumberOnly
1193
+ });
1194
+ } catch {}
1195
+ }
903
1196
  #updateSelections(selections) {
904
1197
  this.__postponeBackgroundTokenizeToNextFrame();
905
1198
  this.#primaryCaretElement = void 0;
906
- this.#fileInstance?.setSelectedLines(null);
907
- this.#gutterElement?.querySelectorAll("[data-active]").forEach((el) => el.removeAttribute("data-active"));
1199
+ this.#setSelectedLinesSafe(null);
908
1200
  if (selections.length === 0 && this.#matches === void 0 && this.#markerRenderer === void 0) {
909
1201
  this.#selections = void 0;
910
1202
  this.#overlayElements?.forEach((el) => el.remove());
911
1203
  this.#overlayElements?.clear();
1204
+ this.#selectionAction?.cleanup();
1205
+ this.#selectionAction = void 0;
912
1206
  return;
913
1207
  }
914
1208
  const fragment = document.createDocumentFragment();
@@ -920,21 +1214,16 @@ var Editor = class {
920
1214
  const normalizedSelections = mergeOverlappingSelections(selections);
921
1215
  const primarySelection = normalizedSelections.at(-1);
922
1216
  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
- }
1217
+ const hasNonEmptySelection = normalizedSelections.some((selection) => !isCollapsedSelection(selection));
1218
+ const caretLine = getCaretPosition(primarySelection).line + 1;
1219
+ this.#setSelectedLinesSafe({
1220
+ start: caretLine,
1221
+ end: caretLine
1222
+ }, hasNonEmptySelection);
933
1223
  for (const selection of normalizedSelections) {
934
1224
  if (!isCollapsedSelection(selection)) this.#renderSelection(renderCtx, "selection", selection);
935
1225
  this.#renderCaret(renderCtx, selection, selection === primarySelection);
936
1226
  }
937
- if (this.#options.enabledSelectionAction === true && !isCollapsedSelection(primarySelection)) this.#renderSelectionActionIcon(renderCtx, primarySelection);
938
1227
  }
939
1228
  const textDocument = this.#textDocument;
940
1229
  if (this.#matches !== void 0 && textDocument !== void 0) {
@@ -955,6 +1244,7 @@ var Editor = class {
955
1244
  this.#overlayElements?.forEach((el) => el.remove());
956
1245
  this.#overlayElements?.clear();
957
1246
  this.#overlayElements = renderCtx.elements;
1247
+ this.#updateSelectionActionPopover();
958
1248
  }
959
1249
  #renderSelection(renderCtx, type, range, extraDataset) {
960
1250
  if (this.#textDocument === void 0) return;
@@ -965,7 +1255,7 @@ var Editor = class {
965
1255
  const lineText = this.#textDocument.getLineText(line);
966
1256
  const startChar = line === start.line ? start.character : 0;
967
1257
  const endChar = isLastLine ? end.character : lineText.length;
968
- if (this.#wrap) {
1258
+ if (this.#isWrap) {
969
1259
  const contentWidth = this.#getContentWidth();
970
1260
  if (2 * this.#metrics.ch + this.#metrics.measureTextWidth(lineText) > contentWidth) {
971
1261
  this.#renderWrappedSelection(renderCtx, line, lineText, startChar, endChar, isLastLine, type, extraDataset);
@@ -975,7 +1265,7 @@ var Editor = class {
975
1265
  let left = 0;
976
1266
  let width = 0;
977
1267
  let paddingEnd = 0;
978
- if (startChar === 0) left = this.#getGutterWidth() + this.#metrics.ch;
1268
+ if (startChar === 0) left = this.#getGutterWidth() + this.#metrics.ch + (this.#activeContentOffset?.left ?? 0);
979
1269
  else left = this.#getCharX(line, startChar)[0];
980
1270
  if (!isLastLine && type === "selection") paddingEnd = this.#metrics.ch;
981
1271
  if (startChar === endChar) width = paddingEnd;
@@ -986,71 +1276,64 @@ var Editor = class {
986
1276
  #renderWrappedSelection(renderCtx, line, lineText, startChar, endChar, isLastLine, type, extraDataset) {
987
1277
  const wrapOffsets = this.#wrapLineText(line);
988
1278
  const segmentCount = wrapOffsets.length - 1;
989
- const offsetLeft = this.#getGutterWidth() + this.#metrics.ch;
1279
+ const offsetLeft = this.#getGutterWidth() + this.#metrics.ch + (this.#activeContentOffset?.left ?? 0);
990
1280
  for (let wrapLine = 0; wrapLine < segmentCount; wrapLine++) {
991
1281
  const segmentStart = wrapOffsets[wrapLine];
992
1282
  const segmentEnd = wrapOffsets[wrapLine + 1];
993
1283
  const wrapStartChar = Math.max(startChar, segmentStart);
994
1284
  const wrapEndChar = Math.min(endChar, segmentEnd);
995
1285
  if (wrapStartChar > wrapEndChar) continue;
996
- let segmentLeft;
997
- let segmentWidth;
1286
+ const segmentStartWidth = this.#segmentTextWidth(lineText, segmentStart, wrapStartChar);
1287
+ const segmentLeft = offsetLeft + segmentStartWidth;
998
1288
  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
1289
  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
- }
1290
+ const segmentWidth = wrapStartChar === wrapEndChar ? paddingEnd : this.#segmentTextWidth(lineText, segmentStart, wrapEndChar) - segmentStartWidth + paddingEnd;
1013
1291
  this.#renderSelectionBlock(renderCtx, type, line, wrapLine, segmentLeft, segmentWidth, extraDataset);
1014
1292
  }
1015
1293
  }
1294
+ #segmentTextWidth(lineText, segmentStart, character) {
1295
+ if (character <= segmentStart) return 0;
1296
+ const segmentText = lineText.slice(segmentStart, character);
1297
+ const asciiColumns = getExpandedAsciiTextColumns(segmentText, this.#metrics.tabSize);
1298
+ return asciiColumns !== -1 ? asciiColumns * this.#metrics.ch : this.#metrics.measureTextWidth(segmentText);
1299
+ }
1016
1300
  #renderSelectionBlock(renderCtx, type, line, wrapLine, left, width, extraDataset) {
1017
1301
  if (width === 0) return;
1018
1302
  const { ch, lineHeight } = this.#metrics;
1019
1303
  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 ?? ""}`;
1304
+ const cacheKey = `${type}-${line}/${wrapLine}-${left}-${width} ${extraDataset ?? ""}`;
1022
1305
  const overlayEls = this.#overlayElements;
1023
1306
  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);`;
1307
+ const addRoundedCorner = (line, wrapLine, left, radius) => {
1308
+ const css = `width:${ch}px;transform:translateX(${left}px) translateY(${this.#getLineY(line) + wrapLine * lineHeight}px);`;
1027
1309
  const dataset = {
1028
1310
  selectionCorner: "",
1029
1311
  [radius]: ""
1030
1312
  };
1031
- const cacheKeyPrefix = `${type}-block-${left$1}-${top}-1ch`;
1032
- let cacheKey$1 = cacheKeyPrefix + "-" + radius;
1313
+ const cacheKeyPrefix = `${type}-block-${line}/${wrapLine}-${left}-1ch`;
1314
+ let cacheKey = cacheKeyPrefix + "-" + radius;
1033
1315
  if (radius === "rbl") {
1034
1316
  const prevCornerKey = cacheKeyPrefix + "-rtl";
1035
1317
  const prevCorner = renderCtx.elements.get(prevCornerKey);
1036
1318
  if (prevCorner !== void 0) {
1037
1319
  prevCorner.remove();
1038
1320
  renderCtx.elements.delete(prevCornerKey);
1039
- cacheKey$1 += "-rtl";
1321
+ cacheKey += "-rtl";
1040
1322
  dataset.rtl = "";
1041
1323
  }
1042
1324
  }
1043
- let cornerEl = renderCtx.elements.get(cacheKey$1);
1325
+ let cornerEl = renderCtx.elements.get(cacheKey);
1044
1326
  if (cornerEl !== void 0) return;
1045
- if (overlayEls?.has(cacheKey$1) === true) {
1046
- cornerEl = overlayEls.get(cacheKey$1);
1047
- overlayEls.delete(cacheKey$1);
1327
+ if (overlayEls?.has(cacheKey) === true) {
1328
+ cornerEl = overlayEls.get(cacheKey);
1329
+ cornerEl.style.cssText = css;
1330
+ overlayEls.delete(cacheKey);
1048
1331
  } else cornerEl = h("div", {
1049
1332
  dataset: "selectionRange",
1050
- style: { cssText: css$1 },
1333
+ style: { cssText: css },
1051
1334
  children: [h("div", { dataset })]
1052
1335
  }, renderCtx.fragment);
1053
- renderCtx.elements.set(cacheKey$1, cornerEl);
1336
+ renderCtx.elements.set(cacheKey, cornerEl);
1054
1337
  };
1055
1338
  const addRadiusStyle = (element) => {
1056
1339
  const end = left + width;
@@ -1100,10 +1383,9 @@ var Editor = class {
1100
1383
  if (overlayEls?.has(cacheKey) === true) {
1101
1384
  rangeEl = overlayEls.get(cacheKey);
1102
1385
  overlayEls.delete(cacheKey);
1103
- } else rangeEl = h("div", {
1104
- dataset: extraDataset ? [type + "Range", extraDataset] : type + "Range",
1105
- style: { cssText: css }
1106
- }, renderCtx.fragment);
1386
+ } else rangeEl = h("div", { dataset: extraDataset ? [type + "Range", extraDataset] : type + "Range" }, renderCtx.fragment);
1387
+ rangeEl.style.width = `${width}px`;
1388
+ rangeEl.style.transform = `translateX(${left}px) translateY(${y}px)`;
1107
1389
  if (rounded) addRadiusStyle(rangeEl);
1108
1390
  renderCtx.elements.set(cacheKey, rangeEl);
1109
1391
  }
@@ -1113,66 +1395,61 @@ var Editor = class {
1113
1395
  const [left, wrapLine] = this.#getCharX(line, character);
1114
1396
  const cacheKey = "caret-" + line + "/" + wrapLine + ":" + character;
1115
1397
  if (renderCtx.elements.has(cacheKey)) return;
1116
- const caretEl = h("div", {
1117
- dataset: "caret",
1118
- style: { transform: `translateX(${left - 1}px) translateY(${this.#getLineY(line) + wrapLine * this.#metrics.lineHeight}px)` }
1119
- }, renderCtx.fragment);
1398
+ const x = left - 1;
1399
+ const y = this.#getLineY(line) + wrapLine * this.#metrics.lineHeight;
1400
+ let caretEl;
1401
+ if (this.#overlayElements?.has(cacheKey) === true) {
1402
+ caretEl = this.#overlayElements.get(cacheKey);
1403
+ this.#overlayElements.delete(cacheKey);
1404
+ } else caretEl = h("div", { dataset: "caret" }, renderCtx.fragment);
1405
+ caretEl.style.transform = `translateX(${x}px) translateY(${y}px)`;
1120
1406
  renderCtx.elements.set(cacheKey, caretEl);
1121
1407
  if (isPrimary) {
1122
1408
  caretEl.style.scrollMargin = this.#getScrollMargin();
1123
1409
  this.#primaryCaretElement = caretEl;
1124
1410
  }
1125
1411
  }
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);
1412
+ #updateSelectionActionPopover() {
1413
+ const primarySelection = this.#selections?.at(-1);
1414
+ const overlayElement = this.#overlayElement;
1415
+ const textDocument = this.#textDocument;
1416
+ const renderSelectionAction = this.#options.renderSelectionAction;
1417
+ if (this.#options.enabledSelectionAction !== true || renderSelectionAction === void 0 || primarySelection === void 0 || isCollapsedSelection(primarySelection) || this.#isContentMouseDown || overlayElement === void 0 || textDocument === void 0) {
1418
+ this.#selectionAction?.cleanup();
1419
+ this.#selectionAction = void 0;
1420
+ return;
1421
+ }
1422
+ const head = getCaretPosition(primarySelection);
1423
+ if (!this.#isLineVisible(head.line)) {
1424
+ this.#selectionAction?.cleanup();
1425
+ this.#selectionAction = void 0;
1426
+ return;
1427
+ }
1428
+ if (this.#selectionAction === void 0) {
1429
+ const getActiveSelection = () => this.#selections?.at(-1) ?? primarySelection;
1148
1430
  const selectionActionElement = renderSelectionAction({
1149
1431
  textDocument,
1150
- selection,
1151
- applyEdits: (edits) => this.applyEdits(edits, true),
1152
- getSelectionText: () => {
1153
- return this.#textDocument?.getText(selection) ?? "";
1432
+ get selection() {
1433
+ return getActiveSelection();
1154
1434
  },
1435
+ applyEdits: (edits) => this.applyEdits(edits, true),
1436
+ getSelectionText: () => this.#textDocument?.getText(getActiveSelection()) ?? "",
1155
1437
  replaceSelectionText: (text) => {
1156
- this.#replaceSelectionText(text, [selection]);
1438
+ this.#replaceSelectionText(text, [getActiveSelection()]);
1157
1439
  },
1158
1440
  close: () => {
1159
- cleanUp();
1160
- handleWidgetDomResize();
1441
+ this.#selectionAction?.cleanup();
1442
+ this.#selectionAction = void 0;
1161
1443
  this.#scrollToPrimaryCaret();
1162
1444
  }
1163
1445
  });
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);
1446
+ this.#selectionAction = new SelectionActionWidget(head.line, selectionActionElement, overlayElement);
1447
+ }
1448
+ const [left, wrapLine] = this.#getCharX(head.line, head.character);
1449
+ const lineHeight = this.#metrics.lineHeight;
1450
+ const top = this.#getLineY(head.line) + wrapLine * lineHeight + lineHeight;
1451
+ this.#selectionAction.line = head.line;
1452
+ this.#selectionAction.reposition(left, top, this.#getGutterWidth());
1176
1453
  }
1177
1454
  #openSearchPanel(mode) {
1178
1455
  if (this.#searchPanel !== void 0) {
@@ -1207,7 +1484,7 @@ var Editor = class {
1207
1484
  this.#scrollToPrimaryCaret(true);
1208
1485
  this.#retainSearchPanelFocus = retainFocus;
1209
1486
  };
1210
- this.#searchPanel = new SearchPanelWidget({
1487
+ const searchPanel = new SearchPanelWidget({
1211
1488
  textDocument,
1212
1489
  containerElement: preElement,
1213
1490
  defaultQuery,
@@ -1234,10 +1511,10 @@ var Editor = class {
1234
1511
  this.#matches = allMatches;
1235
1512
  if (options?.syncSelection === false) {
1236
1513
  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);
1514
+ const primarySelection = this.#selections?.at(-1);
1515
+ if (primarySelection !== void 0) {
1516
+ const startOffset = textDocument.offsetAt(primarySelection.start);
1517
+ const endOffset = textDocument.offsetAt(primarySelection.end);
1241
1518
  for (const match of allMatches) if (match[0] === startOffset && match[1] === endOffset) return match;
1242
1519
  }
1243
1520
  return;
@@ -1261,6 +1538,7 @@ var Editor = class {
1261
1538
  this.#updateSelections(this.#selections ?? []);
1262
1539
  }
1263
1540
  });
1541
+ this.#searchPanel = searchPanel;
1264
1542
  this.#retainSearchPanelFocus = false;
1265
1543
  }
1266
1544
  #getSelectionText() {
@@ -1269,45 +1547,60 @@ var Editor = class {
1269
1547
  if (textDocument === void 0 || selections === void 0) return "";
1270
1548
  return getSelectionText(textDocument, selections);
1271
1549
  }
1272
- #replaceSelectionText(text, selections = this.#selections) {
1550
+ #cutSelectionText() {
1551
+ const textDocument = this.#textDocument;
1552
+ const selections = this.#selections;
1553
+ if (textDocument === void 0 || selections === void 0 || selections.length === 0) return "";
1554
+ if (selections.some((selection) => isCollapsedSelection(selection))) {
1555
+ const cut = resolveSelectionCut(textDocument, selections);
1556
+ this.#applySelectionCutEdits(cut.edits, cut.nextSelectionOffsets);
1557
+ return cut.text;
1558
+ }
1559
+ const text = getSelectionText(textDocument, selections);
1560
+ this.#replaceSelectionText("", void 0, true);
1561
+ return text;
1562
+ }
1563
+ #applySelectionCutEdits(edits, nextSelectionOffsets) {
1564
+ const textDocument = this.#textDocument;
1565
+ const selections = this.#selections;
1566
+ if (textDocument === void 0 || selections === void 0 || edits.length === 0) return;
1567
+ const change = textDocument.applyResolvedEdits(edits, true, selections, void 0, true);
1568
+ if (change === void 0) return;
1569
+ const nextSelections = nextSelectionOffsets.map((offset) => {
1570
+ const caret = textDocument.positionAt(offset);
1571
+ return {
1572
+ start: caret,
1573
+ end: caret,
1574
+ direction: 0
1575
+ };
1576
+ });
1577
+ textDocument.setLastUndoSelectionsAfter(nextSelections);
1578
+ this.#applyChange(change, nextSelections, this.#applyChangeToLineAnnotations(change));
1579
+ }
1580
+ #replaceSelectionText(text, selections = this.#selections, undoBoundary = false) {
1273
1581
  if (selections === void 0) return;
1274
1582
  const textDocument = this.#textDocument;
1275
1583
  const primarySelection = selections.at(-1);
1276
1584
  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, {
1585
+ const { nextSelections, change } = Array.isArray(text) && text.length === selections.length ? applyTextReplaceToSelections(textDocument, selections, text, this.#lineAnnotations, undoBoundary) : applyTextChangeToSelections(textDocument, selections, {
1278
1586
  start: textDocument.offsetAt(primarySelection.start),
1279
1587
  end: textDocument.offsetAt(primarySelection.end),
1280
1588
  text: Array.isArray(text) ? text.join("\n") : text
1281
- }, this.#lineAnnotations);
1589
+ }, this.#lineAnnotations, void 0, undoBoundary);
1282
1590
  if (change !== void 0) this.#applyChange(change, nextSelections, this.#applyChangeToLineAnnotations(change));
1283
1591
  }
1284
1592
  #deleteSelectionText(forward = false) {
1285
1593
  const selections = this.#selections;
1286
1594
  const textDocument = this.#textDocument;
1287
1595
  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);
1596
+ const { nextSelections, change } = applyDeleteCharacterToSelections(textDocument, selections, forward, this.#lineAnnotations, this.#metrics.tabSize);
1597
+ if (change !== void 0) this.#applyChange(change, nextSelections, this.#applyChangeToLineAnnotations(change));
1305
1598
  }
1306
1599
  #deleteSoftLineBackward() {
1307
1600
  const selections = this.#selections;
1308
1601
  const textDocument = this.#textDocument;
1309
1602
  if (selections === void 0 || textDocument === void 0) return;
1310
- const { nextSelections, change } = applyDeleteSoftLineBackwardToSelections(textDocument, selections, this.#wrap ? (line, character) => {
1603
+ const { nextSelections, change } = applyDeleteSoftLineBackwardToSelections(textDocument, selections, this.#isWrap ? (line, character) => {
1311
1604
  const wrapOffsets = this.#wrapLineText(line);
1312
1605
  for (let w = 0; w + 1 < wrapOffsets.length; w++) {
1313
1606
  const segmentStart = wrapOffsets[w];
@@ -1339,16 +1632,11 @@ var Editor = class {
1339
1632
  const { nextSelections, change } = applyTransposeToSelections(textDocument, selections, this.#lineAnnotations);
1340
1633
  if (change !== void 0) this.#applyChange(change, nextSelections, this.#applyChangeToLineAnnotations(change));
1341
1634
  }
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
1635
  #getFileRef() {
1348
- const fileContents = this.#fileContents;
1636
+ const fileInfo = this.#fileInfo;
1349
1637
  const textDocument = this.#textDocument;
1350
- if (fileContents === void 0 || textDocument === void 0) return;
1351
- const { contents: _,...file } = fileContents;
1638
+ if (fileInfo === void 0 || textDocument === void 0) return;
1639
+ const file = { ...fileInfo };
1352
1640
  Object.defineProperty(file, "contents", {
1353
1641
  enumerable: true,
1354
1642
  get: () => textDocument.getText()
@@ -1359,10 +1647,10 @@ var Editor = class {
1359
1647
  const fileRef = this.#getFileRef();
1360
1648
  const onChange = this.#options.onChange;
1361
1649
  if (fileRef !== void 0 && onChange !== void 0) onChange(fileRef, newLineAnnotations ?? this.#lineAnnotations);
1362
- if (change.lineDelta !== 0) {
1650
+ if (change.lineDelta !== 0 || this.#isWrap) {
1363
1651
  for (const line of this.#lineYCache.keys()) if (line >= change.startLine) this.#lineYCache.delete(line);
1364
1652
  }
1365
- if (this.#wrap) {
1653
+ if (this.#isWrap) {
1366
1654
  for (const line of this.#wrapLineOffsetsCache.keys()) if (line >= change.startLine) this.#wrapLineOffsetsCache.delete(line);
1367
1655
  }
1368
1656
  this.#lastAccessedCharX = void 0;
@@ -1371,25 +1659,34 @@ var Editor = class {
1371
1659
  if (renderRange !== void 0 && selections !== void 0 && selections.length > 0) {
1372
1660
  const primarySelection = selections.at(-1);
1373
1661
  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;
1662
+ if (primarySelection.end.line >= renderRangeEndLine) {
1663
+ const widenedTotalLines = primarySelection.end.line - renderRange.startingLine + 1;
1664
+ const maxWidenLines = this.#viewportWindowLines === void 0 || this.#viewportWindowLines === Infinity ? Infinity : this.#viewportWindowLines * MAX_EDIT_WIDEN_WINDOW_MULTIPLE;
1665
+ if (change.startLine <= renderRangeEndLine && widenedTotalLines <= maxWidenLines) {
1666
+ if (primarySelection.end.line > renderRangeEndLine) shouldUpdateBuffer = true;
1667
+ renderRange = {
1668
+ ...renderRange,
1669
+ totalLines: widenedTotalLines
1670
+ };
1671
+ this.#renderRange = renderRange;
1672
+ } else shouldUpdateBuffer = true;
1673
+ }
1379
1674
  }
1380
1675
  this.#rerender(change, newLineAnnotations, renderRange, shouldUpdateBuffer);
1381
1676
  if (options?.skipSearchRefresh !== true && this.#searchPanel !== void 0 && this.#matches !== void 0) this.#searchPanel.updateMatches({ syncSelection: false });
1382
1677
  if (selections !== void 0) {
1383
1678
  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);
1679
+ if (options?.skipFocus !== true) {
1680
+ if (this.#primaryCaretElement !== void 0) this.#primaryCaretElement.scrollIntoView({
1681
+ block: "nearest",
1682
+ inline: "nearest"
1683
+ });
1684
+ else if (selections.length > 0) {
1685
+ const pos = getCaretPosition(selections.at(-1));
1686
+ this.#scrollToLine(pos.line, pos.character);
1687
+ }
1688
+ this.focus({ preventScroll: true });
1391
1689
  }
1392
- this.focus({ preventScroll: true });
1393
1690
  }
1394
1691
  }
1395
1692
  #applyChangeToLineAnnotations(change) {
@@ -1421,7 +1718,7 @@ var Editor = class {
1421
1718
  }
1422
1719
  }
1423
1720
  }
1424
- lineElement ??= contentElement.querySelector(`[data-line="${line + 1}"]`);
1721
+ lineElement ??= contentElement.querySelector(`[data-line="${line + 1}"]` + (this.#diffSyle === "unified" ? ":not([data-line-type=\"change-deletion\"])" : ""));
1425
1722
  if (lineElement !== null) {
1426
1723
  if (lastAccessed !== void 0) {
1427
1724
  lastAccessed[0] = line;
@@ -1453,7 +1750,8 @@ var Editor = class {
1453
1750
  if (cachedY !== void 0) return cachedY;
1454
1751
  const lineElement = this.#getLineElement(line);
1455
1752
  if (lineElement === void 0) return -1;
1456
- const y = lineElement.offsetTop + this.#metrics.paddingTop;
1753
+ let y = lineElement.offsetTop + this.#metrics.paddingTop;
1754
+ y += this.#activeContentOffset?.top ?? 0;
1457
1755
  this.#lineYCache.set(line, y);
1458
1756
  return y;
1459
1757
  }
@@ -1461,7 +1759,7 @@ var Editor = class {
1461
1759
  if (this.#lastAccessedCharX !== void 0 && this.#lastAccessedCharX[0] === line && this.#lastAccessedCharX[1] === char) return [this.#lastAccessedCharX[2], this.#lastAccessedCharX[3]];
1462
1760
  const lineText = this.#textDocument?.getLineText(line);
1463
1761
  const offsetLeft = this.#getGutterWidth() + this.#metrics.ch;
1464
- if (lineText === void 0 || lineText.length === 0 || char <= 0) return [offsetLeft, 0];
1762
+ if (lineText === void 0 || lineText.length === 0 || char <= 0) return [offsetLeft + (this.#activeContentOffset?.left ?? 0), 0];
1465
1763
  const boundedCharacter = snapTextOffsetToUnicodeBoundary(lineText, Math.min(char, lineText.length));
1466
1764
  const textBeforeCharacter = lineText.slice(0, boundedCharacter);
1467
1765
  const asciiColumns = getExpandedAsciiTextColumns(textBeforeCharacter, this.#metrics.tabSize);
@@ -1469,7 +1767,7 @@ var Editor = class {
1469
1767
  let wrapLine = 0;
1470
1768
  if (asciiColumns !== -1) left = offsetLeft + asciiColumns * this.#metrics.ch;
1471
1769
  else left = offsetLeft + this.#metrics.measureTextWidth(textBeforeCharacter);
1472
- if (this.#wrap) {
1770
+ if (this.#isWrap) {
1473
1771
  const contentWidth = this.#getContentWidth();
1474
1772
  if (2 * this.#metrics.ch + this.#metrics.measureTextWidth(lineText) > contentWidth) {
1475
1773
  const wrapOffsets = this.#wrapLineText(line);
@@ -1485,6 +1783,7 @@ var Editor = class {
1485
1783
  }
1486
1784
  }
1487
1785
  }
1786
+ left += this.#activeContentOffset?.left ?? 0;
1488
1787
  }
1489
1788
  if (this.#lastAccessedCharX !== void 0) {
1490
1789
  this.#lastAccessedCharX[0] = line;
@@ -1571,7 +1870,7 @@ var Editor = class {
1571
1870
  return line < startingLine + totalLines;
1572
1871
  }
1573
1872
  };
1574
-
1575
1873
  //#endregion
1576
1874
  export { Editor };
1875
+
1577
1876
  //# sourceMappingURL=editor.js.map