@openclaw/diffs 2026.5.27-beta.1 → 2026.5.28-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (838) hide show
  1. package/README.md +1 -0
  2. package/dist/assets/viewer-runtime.js +50 -50
  3. package/dist/index.js +419 -81
  4. package/node_modules/@pierre/diffs/dist/components/CodeView.d.ts +22 -7
  5. package/node_modules/@pierre/diffs/dist/components/CodeView.d.ts.map +1 -1
  6. package/node_modules/@pierre/diffs/dist/components/CodeView.js +202 -105
  7. package/node_modules/@pierre/diffs/dist/components/CodeView.js.map +1 -1
  8. package/node_modules/@pierre/diffs/dist/components/File.d.ts +2 -0
  9. package/node_modules/@pierre/diffs/dist/components/File.d.ts.map +1 -1
  10. package/node_modules/@pierre/diffs/dist/components/File.js +13 -9
  11. package/node_modules/@pierre/diffs/dist/components/File.js.map +1 -1
  12. package/node_modules/@pierre/diffs/dist/components/FileDiff.d.ts +2 -0
  13. package/node_modules/@pierre/diffs/dist/components/FileDiff.d.ts.map +1 -1
  14. package/node_modules/@pierre/diffs/dist/components/FileDiff.js +12 -6
  15. package/node_modules/@pierre/diffs/dist/components/FileDiff.js.map +1 -1
  16. package/node_modules/@pierre/diffs/dist/components/VirtualizedFile.d.ts +4 -2
  17. package/node_modules/@pierre/diffs/dist/components/VirtualizedFile.d.ts.map +1 -1
  18. package/node_modules/@pierre/diffs/dist/components/VirtualizedFile.js +23 -6
  19. package/node_modules/@pierre/diffs/dist/components/VirtualizedFile.js.map +1 -1
  20. package/node_modules/@pierre/diffs/dist/components/VirtualizedFileDiff.d.ts +9 -8
  21. package/node_modules/@pierre/diffs/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
  22. package/node_modules/@pierre/diffs/dist/components/VirtualizedFileDiff.js +329 -142
  23. package/node_modules/@pierre/diffs/dist/components/VirtualizedFileDiff.js.map +1 -1
  24. package/node_modules/@pierre/diffs/dist/constants.d.ts.map +1 -1
  25. package/node_modules/@pierre/diffs/dist/index.d.ts +2 -2
  26. package/node_modules/@pierre/diffs/dist/index.js +3 -3
  27. package/node_modules/@pierre/diffs/dist/react/index.d.ts +2 -2
  28. package/node_modules/@pierre/diffs/dist/renderers/DiffHunksRenderer.d.ts +1 -0
  29. package/node_modules/@pierre/diffs/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  30. package/node_modules/@pierre/diffs/dist/renderers/DiffHunksRenderer.js +12 -5
  31. package/node_modules/@pierre/diffs/dist/renderers/DiffHunksRenderer.js.map +1 -1
  32. package/node_modules/@pierre/diffs/dist/renderers/FileRenderer.d.ts +1 -0
  33. package/node_modules/@pierre/diffs/dist/renderers/FileRenderer.d.ts.map +1 -1
  34. package/node_modules/@pierre/diffs/dist/renderers/FileRenderer.js +4 -1
  35. package/node_modules/@pierre/diffs/dist/renderers/FileRenderer.js.map +1 -1
  36. package/node_modules/@pierre/diffs/dist/ssr/index.d.ts +2 -2
  37. package/node_modules/@pierre/diffs/dist/types.d.ts +7 -1
  38. package/node_modules/@pierre/diffs/dist/types.d.ts.map +1 -1
  39. package/node_modules/@pierre/diffs/dist/utils/computeEstimatedDiffHeights.d.ts +28 -0
  40. package/node_modules/@pierre/diffs/dist/utils/computeEstimatedDiffHeights.d.ts.map +1 -0
  41. package/node_modules/@pierre/diffs/dist/utils/computeEstimatedDiffHeights.js +111 -0
  42. package/node_modules/@pierre/diffs/dist/utils/computeEstimatedDiffHeights.js.map +1 -0
  43. package/node_modules/@pierre/diffs/dist/utils/getDiffHunksRendererOptions.d.ts +8 -0
  44. package/node_modules/@pierre/diffs/dist/utils/getDiffHunksRendererOptions.d.ts.map +1 -0
  45. package/node_modules/@pierre/diffs/dist/utils/getDiffHunksRendererOptions.js +31 -0
  46. package/node_modules/@pierre/diffs/dist/utils/getDiffHunksRendererOptions.js.map +1 -0
  47. package/node_modules/@pierre/diffs/dist/utils/getFileRendererOptions.d.ts +8 -0
  48. package/node_modules/@pierre/diffs/dist/utils/getFileRendererOptions.d.ts.map +1 -0
  49. package/node_modules/@pierre/diffs/dist/utils/getFileRendererOptions.js +24 -0
  50. package/node_modules/@pierre/diffs/dist/utils/getFileRendererOptions.js.map +1 -0
  51. package/node_modules/@pierre/diffs/dist/utils/iterateOverDiff.js +29 -30
  52. package/node_modules/@pierre/diffs/dist/utils/iterateOverDiff.js.map +1 -1
  53. package/node_modules/@pierre/diffs/dist/utils/parsePatchFiles.js +8 -1
  54. package/node_modules/@pierre/diffs/dist/utils/parsePatchFiles.js.map +1 -1
  55. package/node_modules/@pierre/diffs/dist/utils/virtualDiffLayout.d.ts +65 -0
  56. package/node_modules/@pierre/diffs/dist/utils/virtualDiffLayout.d.ts.map +1 -0
  57. package/node_modules/@pierre/diffs/dist/utils/virtualDiffLayout.js +94 -0
  58. package/node_modules/@pierre/diffs/dist/utils/virtualDiffLayout.js.map +1 -0
  59. package/node_modules/@pierre/diffs/dist/worker/WorkerPoolManager.d.ts +4 -1
  60. package/node_modules/@pierre/diffs/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  61. package/node_modules/@pierre/diffs/dist/worker/WorkerPoolManager.js +49 -24
  62. package/node_modules/@pierre/diffs/dist/worker/WorkerPoolManager.js.map +1 -1
  63. package/node_modules/@pierre/diffs/dist/worker/types.d.ts +2 -0
  64. package/node_modules/@pierre/diffs/dist/worker/types.d.ts.map +1 -1
  65. package/node_modules/@pierre/diffs/dist/worker/worker-portable.js +163 -40
  66. package/node_modules/@pierre/diffs/dist/worker/worker-portable.js.map +1 -1
  67. package/node_modules/@pierre/diffs/dist/worker/worker.js +60 -30
  68. package/node_modules/@pierre/diffs/dist/worker/worker.js.map +1 -1
  69. package/node_modules/@pierre/diffs/package.json +1 -1
  70. package/node_modules/@shikijs/core/node_modules/@shikijs/types/LICENSE +22 -0
  71. package/node_modules/@shikijs/core/node_modules/@shikijs/types/README.md +7 -0
  72. package/node_modules/@shikijs/core/node_modules/@shikijs/types/dist/index.d.mts +885 -0
  73. package/node_modules/@shikijs/core/node_modules/@shikijs/types/dist/index.mjs +8 -0
  74. package/node_modules/@shikijs/core/node_modules/@shikijs/types/package.json +36 -0
  75. package/node_modules/@shikijs/engine-javascript/node_modules/@shikijs/types/LICENSE +22 -0
  76. package/node_modules/@shikijs/engine-javascript/node_modules/@shikijs/types/README.md +7 -0
  77. package/node_modules/@shikijs/engine-javascript/node_modules/@shikijs/types/dist/index.d.mts +885 -0
  78. package/node_modules/@shikijs/engine-javascript/node_modules/@shikijs/types/dist/index.mjs +8 -0
  79. package/node_modules/@shikijs/engine-javascript/node_modules/@shikijs/types/package.json +36 -0
  80. package/node_modules/@shikijs/engine-oniguruma/node_modules/@shikijs/types/LICENSE +22 -0
  81. package/node_modules/@shikijs/engine-oniguruma/node_modules/@shikijs/types/README.md +7 -0
  82. package/node_modules/@shikijs/engine-oniguruma/node_modules/@shikijs/types/dist/index.d.mts +885 -0
  83. package/node_modules/@shikijs/engine-oniguruma/node_modules/@shikijs/types/dist/index.mjs +8 -0
  84. package/node_modules/@shikijs/engine-oniguruma/node_modules/@shikijs/types/package.json +36 -0
  85. package/node_modules/@shikijs/langs/dist/apex.mjs +1 -1
  86. package/node_modules/@shikijs/langs/dist/bird2.mjs +1 -1
  87. package/node_modules/@shikijs/langs/dist/c3.mjs +1 -1
  88. package/node_modules/@shikijs/langs/dist/cobol.mjs +1 -1
  89. package/node_modules/@shikijs/langs/dist/csharp.mjs +1 -1
  90. package/node_modules/@shikijs/langs/dist/css.mjs +1 -1
  91. package/node_modules/@shikijs/langs/dist/dart.mjs +1 -1
  92. package/node_modules/@shikijs/langs/dist/emacs-lisp.mjs +1 -1
  93. package/node_modules/@shikijs/langs/dist/es-tag-sql.mjs +1 -1
  94. package/node_modules/@shikijs/langs/dist/go.mjs +1 -1
  95. package/node_modules/@shikijs/langs/dist/hack.mjs +1 -1
  96. package/node_modules/@shikijs/langs/dist/julia.mjs +1 -1
  97. package/node_modules/@shikijs/langs/dist/just.mjs +1 -1
  98. package/node_modules/@shikijs/langs/dist/kusto.mjs +1 -1
  99. package/node_modules/@shikijs/langs/dist/latex.mjs +1 -1
  100. package/node_modules/@shikijs/langs/dist/luau.mjs +1 -1
  101. package/node_modules/@shikijs/langs/dist/nextflow-groovy.mjs +1 -1
  102. package/node_modules/@shikijs/langs/dist/php.mjs +1 -1
  103. package/node_modules/@shikijs/langs/dist/ruby.mjs +1 -1
  104. package/node_modules/@shikijs/langs/dist/sql.mjs +1 -1
  105. package/node_modules/@shikijs/langs/dist/typespec.mjs +1 -1
  106. package/node_modules/@shikijs/langs/package.json +6 -3
  107. package/node_modules/@shikijs/themes/node_modules/@shikijs/types/LICENSE +22 -0
  108. package/node_modules/@shikijs/themes/node_modules/@shikijs/types/README.md +7 -0
  109. package/node_modules/@shikijs/themes/node_modules/@shikijs/types/dist/index.d.mts +885 -0
  110. package/node_modules/@shikijs/themes/node_modules/@shikijs/types/dist/index.mjs +8 -0
  111. package/node_modules/@shikijs/themes/node_modules/@shikijs/types/package.json +36 -0
  112. package/node_modules/@shikijs/transformers/node_modules/@shikijs/types/LICENSE +22 -0
  113. package/node_modules/@shikijs/transformers/node_modules/@shikijs/types/README.md +7 -0
  114. package/node_modules/@shikijs/transformers/node_modules/@shikijs/types/dist/index.d.mts +885 -0
  115. package/node_modules/@shikijs/transformers/node_modules/@shikijs/types/dist/index.mjs +8 -0
  116. package/node_modules/@shikijs/transformers/node_modules/@shikijs/types/package.json +36 -0
  117. package/node_modules/@shikijs/types/dist/index.d.mts +686 -684
  118. package/node_modules/@shikijs/types/dist/index.mjs +8 -7
  119. package/node_modules/@shikijs/types/package.json +6 -3
  120. package/node_modules/diff/CONTRIBUTING.md +1 -1
  121. package/node_modules/diff/dist/diff.js +32 -73
  122. package/node_modules/diff/dist/diff.min.js +1 -1
  123. package/node_modules/diff/libcjs/diff/word.d.ts.map +1 -1
  124. package/node_modules/diff/libcjs/diff/word.js +31 -15
  125. package/node_modules/diff/libcjs/util/string.d.ts +2 -14
  126. package/node_modules/diff/libcjs/util/string.d.ts.map +1 -1
  127. package/node_modules/diff/libcjs/util/string.js +2 -61
  128. package/node_modules/diff/libesm/diff/word.d.ts.map +1 -1
  129. package/node_modules/diff/libesm/diff/word.js +31 -16
  130. package/node_modules/diff/libesm/util/string.d.ts +2 -14
  131. package/node_modules/diff/libesm/util/string.d.ts.map +1 -1
  132. package/node_modules/diff/libesm/util/string.js +2 -58
  133. package/node_modules/diff/package.json +24 -22
  134. package/node_modules/diff/release-notes.md +0 -28
  135. package/node_modules/shiki/node_modules/@shikijs/langs/LICENSE +22 -0
  136. package/node_modules/shiki/node_modules/@shikijs/langs/README.md +7 -0
  137. package/node_modules/shiki/node_modules/@shikijs/langs/dist/1c-query.d.mts +3 -0
  138. package/node_modules/shiki/node_modules/@shikijs/langs/dist/1c-query.mjs +2 -0
  139. package/node_modules/shiki/node_modules/@shikijs/langs/dist/1c.d.mts +3 -0
  140. package/node_modules/shiki/node_modules/@shikijs/langs/dist/1c.mjs +2 -0
  141. package/node_modules/shiki/node_modules/@shikijs/langs/dist/abap.d.mts +3 -0
  142. package/node_modules/shiki/node_modules/@shikijs/langs/dist/abap.mjs +5 -0
  143. package/node_modules/shiki/node_modules/@shikijs/langs/dist/actionscript-3.d.mts +3 -0
  144. package/node_modules/shiki/node_modules/@shikijs/langs/dist/actionscript-3.mjs +5 -0
  145. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ada.d.mts +3 -0
  146. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ada.mjs +5 -0
  147. package/node_modules/shiki/node_modules/@shikijs/langs/dist/adoc.d.mts +3 -0
  148. package/node_modules/shiki/node_modules/@shikijs/langs/dist/adoc.mjs +2 -0
  149. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-expression.d.mts +3 -0
  150. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-expression.mjs +5 -0
  151. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-html.d.mts +3 -0
  152. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-html.mjs +16 -0
  153. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-inline-style.d.mts +3 -0
  154. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-inline-style.mjs +8 -0
  155. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-inline-template.d.mts +3 -0
  156. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-inline-template.mjs +10 -0
  157. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-let-declaration.d.mts +3 -0
  158. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-let-declaration.mjs +8 -0
  159. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-template-blocks.d.mts +3 -0
  160. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-template-blocks.mjs +10 -0
  161. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-template.d.mts +3 -0
  162. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-template.mjs +8 -0
  163. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-ts.d.mts +3 -0
  164. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-ts.mjs +18 -0
  165. package/node_modules/shiki/node_modules/@shikijs/langs/dist/apache.d.mts +3 -0
  166. package/node_modules/shiki/node_modules/@shikijs/langs/dist/apache.mjs +5 -0
  167. package/node_modules/shiki/node_modules/@shikijs/langs/dist/apex.d.mts +3 -0
  168. package/node_modules/shiki/node_modules/@shikijs/langs/dist/apex.mjs +5 -0
  169. package/node_modules/shiki/node_modules/@shikijs/langs/dist/apl.d.mts +3 -0
  170. package/node_modules/shiki/node_modules/@shikijs/langs/dist/apl.mjs +16 -0
  171. package/node_modules/shiki/node_modules/@shikijs/langs/dist/applescript.d.mts +3 -0
  172. package/node_modules/shiki/node_modules/@shikijs/langs/dist/applescript.mjs +5 -0
  173. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ara.d.mts +3 -0
  174. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ara.mjs +5 -0
  175. package/node_modules/shiki/node_modules/@shikijs/langs/dist/asciidoc.d.mts +3 -0
  176. package/node_modules/shiki/node_modules/@shikijs/langs/dist/asciidoc.mjs +5 -0
  177. package/node_modules/shiki/node_modules/@shikijs/langs/dist/asm.d.mts +3 -0
  178. package/node_modules/shiki/node_modules/@shikijs/langs/dist/asm.mjs +5 -0
  179. package/node_modules/shiki/node_modules/@shikijs/langs/dist/astro.d.mts +3 -0
  180. package/node_modules/shiki/node_modules/@shikijs/langs/dist/astro.mjs +18 -0
  181. package/node_modules/shiki/node_modules/@shikijs/langs/dist/awk.d.mts +3 -0
  182. package/node_modules/shiki/node_modules/@shikijs/langs/dist/awk.mjs +5 -0
  183. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ballerina.d.mts +3 -0
  184. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ballerina.mjs +5 -0
  185. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bash.d.mts +3 -0
  186. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bash.mjs +2 -0
  187. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bat.d.mts +3 -0
  188. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bat.mjs +5 -0
  189. package/node_modules/shiki/node_modules/@shikijs/langs/dist/batch.d.mts +3 -0
  190. package/node_modules/shiki/node_modules/@shikijs/langs/dist/batch.mjs +2 -0
  191. package/node_modules/shiki/node_modules/@shikijs/langs/dist/be.d.mts +3 -0
  192. package/node_modules/shiki/node_modules/@shikijs/langs/dist/be.mjs +2 -0
  193. package/node_modules/shiki/node_modules/@shikijs/langs/dist/beancount.d.mts +3 -0
  194. package/node_modules/shiki/node_modules/@shikijs/langs/dist/beancount.mjs +5 -0
  195. package/node_modules/shiki/node_modules/@shikijs/langs/dist/berry.d.mts +3 -0
  196. package/node_modules/shiki/node_modules/@shikijs/langs/dist/berry.mjs +5 -0
  197. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bibtex.d.mts +3 -0
  198. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bibtex.mjs +5 -0
  199. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bicep.d.mts +3 -0
  200. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bicep.mjs +5 -0
  201. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bird.d.mts +3 -0
  202. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bird.mjs +2 -0
  203. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bird2.d.mts +3 -0
  204. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bird2.mjs +5 -0
  205. package/node_modules/shiki/node_modules/@shikijs/langs/dist/blade.d.mts +3 -0
  206. package/node_modules/shiki/node_modules/@shikijs/langs/dist/blade.mjs +20 -0
  207. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bsl.d.mts +3 -0
  208. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bsl.mjs +8 -0
  209. package/node_modules/shiki/node_modules/@shikijs/langs/dist/c.d.mts +3 -0
  210. package/node_modules/shiki/node_modules/@shikijs/langs/dist/c.mjs +5 -0
  211. package/node_modules/shiki/node_modules/@shikijs/langs/dist/c3.d.mts +3 -0
  212. package/node_modules/shiki/node_modules/@shikijs/langs/dist/c3.mjs +5 -0
  213. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cadence.d.mts +3 -0
  214. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cadence.mjs +5 -0
  215. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cairo.d.mts +3 -0
  216. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cairo.mjs +8 -0
  217. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cdc.d.mts +3 -0
  218. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cdc.mjs +2 -0
  219. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cjs.d.mts +3 -0
  220. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cjs.mjs +2 -0
  221. package/node_modules/shiki/node_modules/@shikijs/langs/dist/clarity.d.mts +3 -0
  222. package/node_modules/shiki/node_modules/@shikijs/langs/dist/clarity.mjs +5 -0
  223. package/node_modules/shiki/node_modules/@shikijs/langs/dist/clj.d.mts +3 -0
  224. package/node_modules/shiki/node_modules/@shikijs/langs/dist/clj.mjs +2 -0
  225. package/node_modules/shiki/node_modules/@shikijs/langs/dist/clojure.d.mts +3 -0
  226. package/node_modules/shiki/node_modules/@shikijs/langs/dist/clojure.mjs +5 -0
  227. package/node_modules/shiki/node_modules/@shikijs/langs/dist/closure-templates.d.mts +3 -0
  228. package/node_modules/shiki/node_modules/@shikijs/langs/dist/closure-templates.mjs +2 -0
  229. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cmake.d.mts +3 -0
  230. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cmake.mjs +5 -0
  231. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cmd.d.mts +3 -0
  232. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cmd.mjs +2 -0
  233. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cobol.d.mts +3 -0
  234. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cobol.mjs +10 -0
  235. package/node_modules/shiki/node_modules/@shikijs/langs/dist/codeowners.d.mts +3 -0
  236. package/node_modules/shiki/node_modules/@shikijs/langs/dist/codeowners.mjs +5 -0
  237. package/node_modules/shiki/node_modules/@shikijs/langs/dist/codeql.d.mts +3 -0
  238. package/node_modules/shiki/node_modules/@shikijs/langs/dist/codeql.mjs +5 -0
  239. package/node_modules/shiki/node_modules/@shikijs/langs/dist/coffee.d.mts +3 -0
  240. package/node_modules/shiki/node_modules/@shikijs/langs/dist/coffee.mjs +8 -0
  241. package/node_modules/shiki/node_modules/@shikijs/langs/dist/coffeescript.d.mts +3 -0
  242. package/node_modules/shiki/node_modules/@shikijs/langs/dist/coffeescript.mjs +2 -0
  243. package/node_modules/shiki/node_modules/@shikijs/langs/dist/common-lisp.d.mts +3 -0
  244. package/node_modules/shiki/node_modules/@shikijs/langs/dist/common-lisp.mjs +5 -0
  245. package/node_modules/shiki/node_modules/@shikijs/langs/dist/console.d.mts +3 -0
  246. package/node_modules/shiki/node_modules/@shikijs/langs/dist/console.mjs +2 -0
  247. package/node_modules/shiki/node_modules/@shikijs/langs/dist/coq.d.mts +3 -0
  248. package/node_modules/shiki/node_modules/@shikijs/langs/dist/coq.mjs +5 -0
  249. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cpp-macro.d.mts +3 -0
  250. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cpp-macro.mjs +12 -0
  251. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cpp.d.mts +3 -0
  252. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cpp.mjs +14 -0
  253. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cql.d.mts +3 -0
  254. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cql.mjs +2 -0
  255. package/node_modules/shiki/node_modules/@shikijs/langs/dist/crystal.d.mts +3 -0
  256. package/node_modules/shiki/node_modules/@shikijs/langs/dist/crystal.mjs +18 -0
  257. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cs.d.mts +3 -0
  258. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cs.mjs +2 -0
  259. package/node_modules/shiki/node_modules/@shikijs/langs/dist/csharp.d.mts +3 -0
  260. package/node_modules/shiki/node_modules/@shikijs/langs/dist/csharp.mjs +5 -0
  261. package/node_modules/shiki/node_modules/@shikijs/langs/dist/css.d.mts +3 -0
  262. package/node_modules/shiki/node_modules/@shikijs/langs/dist/css.mjs +5 -0
  263. package/node_modules/shiki/node_modules/@shikijs/langs/dist/csv.d.mts +3 -0
  264. package/node_modules/shiki/node_modules/@shikijs/langs/dist/csv.mjs +5 -0
  265. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cts.d.mts +3 -0
  266. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cts.mjs +2 -0
  267. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cue.d.mts +3 -0
  268. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cue.mjs +5 -0
  269. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cypher.d.mts +3 -0
  270. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cypher.mjs +5 -0
  271. package/node_modules/shiki/node_modules/@shikijs/langs/dist/d.d.mts +3 -0
  272. package/node_modules/shiki/node_modules/@shikijs/langs/dist/d.mjs +5 -0
  273. package/node_modules/shiki/node_modules/@shikijs/langs/dist/dart.d.mts +3 -0
  274. package/node_modules/shiki/node_modules/@shikijs/langs/dist/dart.mjs +5 -0
  275. package/node_modules/shiki/node_modules/@shikijs/langs/dist/dax.d.mts +3 -0
  276. package/node_modules/shiki/node_modules/@shikijs/langs/dist/dax.mjs +5 -0
  277. package/node_modules/shiki/node_modules/@shikijs/langs/dist/desktop.d.mts +3 -0
  278. package/node_modules/shiki/node_modules/@shikijs/langs/dist/desktop.mjs +5 -0
  279. package/node_modules/shiki/node_modules/@shikijs/langs/dist/diff.d.mts +3 -0
  280. package/node_modules/shiki/node_modules/@shikijs/langs/dist/diff.mjs +5 -0
  281. package/node_modules/shiki/node_modules/@shikijs/langs/dist/docker.d.mts +3 -0
  282. package/node_modules/shiki/node_modules/@shikijs/langs/dist/docker.mjs +5 -0
  283. package/node_modules/shiki/node_modules/@shikijs/langs/dist/dockerfile.d.mts +3 -0
  284. package/node_modules/shiki/node_modules/@shikijs/langs/dist/dockerfile.mjs +2 -0
  285. package/node_modules/shiki/node_modules/@shikijs/langs/dist/dotenv.d.mts +3 -0
  286. package/node_modules/shiki/node_modules/@shikijs/langs/dist/dotenv.mjs +5 -0
  287. package/node_modules/shiki/node_modules/@shikijs/langs/dist/dream-maker.d.mts +3 -0
  288. package/node_modules/shiki/node_modules/@shikijs/langs/dist/dream-maker.mjs +5 -0
  289. package/node_modules/shiki/node_modules/@shikijs/langs/dist/edge.d.mts +3 -0
  290. package/node_modules/shiki/node_modules/@shikijs/langs/dist/edge.mjs +12 -0
  291. package/node_modules/shiki/node_modules/@shikijs/langs/dist/elisp.d.mts +3 -0
  292. package/node_modules/shiki/node_modules/@shikijs/langs/dist/elisp.mjs +2 -0
  293. package/node_modules/shiki/node_modules/@shikijs/langs/dist/elixir.d.mts +3 -0
  294. package/node_modules/shiki/node_modules/@shikijs/langs/dist/elixir.mjs +8 -0
  295. package/node_modules/shiki/node_modules/@shikijs/langs/dist/elm.d.mts +3 -0
  296. package/node_modules/shiki/node_modules/@shikijs/langs/dist/elm.mjs +8 -0
  297. package/node_modules/shiki/node_modules/@shikijs/langs/dist/emacs-lisp.d.mts +3 -0
  298. package/node_modules/shiki/node_modules/@shikijs/langs/dist/emacs-lisp.mjs +5 -0
  299. package/node_modules/shiki/node_modules/@shikijs/langs/dist/erb.d.mts +3 -0
  300. package/node_modules/shiki/node_modules/@shikijs/langs/dist/erb.mjs +10 -0
  301. package/node_modules/shiki/node_modules/@shikijs/langs/dist/erl.d.mts +3 -0
  302. package/node_modules/shiki/node_modules/@shikijs/langs/dist/erl.mjs +2 -0
  303. package/node_modules/shiki/node_modules/@shikijs/langs/dist/erlang.d.mts +3 -0
  304. package/node_modules/shiki/node_modules/@shikijs/langs/dist/erlang.mjs +8 -0
  305. package/node_modules/shiki/node_modules/@shikijs/langs/dist/es-tag-css.d.mts +3 -0
  306. package/node_modules/shiki/node_modules/@shikijs/langs/dist/es-tag-css.mjs +12 -0
  307. package/node_modules/shiki/node_modules/@shikijs/langs/dist/es-tag-glsl.d.mts +3 -0
  308. package/node_modules/shiki/node_modules/@shikijs/langs/dist/es-tag-glsl.mjs +12 -0
  309. package/node_modules/shiki/node_modules/@shikijs/langs/dist/es-tag-html.d.mts +3 -0
  310. package/node_modules/shiki/node_modules/@shikijs/langs/dist/es-tag-html.mjs +12 -0
  311. package/node_modules/shiki/node_modules/@shikijs/langs/dist/es-tag-sql.d.mts +3 -0
  312. package/node_modules/shiki/node_modules/@shikijs/langs/dist/es-tag-sql.mjs +10 -0
  313. package/node_modules/shiki/node_modules/@shikijs/langs/dist/es-tag-xml.d.mts +3 -0
  314. package/node_modules/shiki/node_modules/@shikijs/langs/dist/es-tag-xml.mjs +8 -0
  315. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f.d.mts +3 -0
  316. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f.mjs +2 -0
  317. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f03.d.mts +3 -0
  318. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f03.mjs +2 -0
  319. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f08.d.mts +3 -0
  320. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f08.mjs +2 -0
  321. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f18.d.mts +3 -0
  322. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f18.mjs +2 -0
  323. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f77.d.mts +3 -0
  324. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f77.mjs +2 -0
  325. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f90.d.mts +3 -0
  326. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f90.mjs +2 -0
  327. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f95.d.mts +3 -0
  328. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f95.mjs +2 -0
  329. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fennel.d.mts +3 -0
  330. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fennel.mjs +5 -0
  331. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fish.d.mts +3 -0
  332. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fish.mjs +5 -0
  333. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fluent.d.mts +3 -0
  334. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fluent.mjs +5 -0
  335. package/node_modules/shiki/node_modules/@shikijs/langs/dist/for.d.mts +3 -0
  336. package/node_modules/shiki/node_modules/@shikijs/langs/dist/for.mjs +2 -0
  337. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fortran-fixed-form.d.mts +3 -0
  338. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fortran-fixed-form.mjs +8 -0
  339. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fortran-free-form.d.mts +3 -0
  340. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fortran-free-form.mjs +5 -0
  341. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fs.d.mts +3 -0
  342. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fs.mjs +2 -0
  343. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fsharp.d.mts +3 -0
  344. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fsharp.mjs +8 -0
  345. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fsl.d.mts +3 -0
  346. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fsl.mjs +2 -0
  347. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ftl.d.mts +3 -0
  348. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ftl.mjs +2 -0
  349. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gd.d.mts +3 -0
  350. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gd.mjs +2 -0
  351. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gdresource.d.mts +3 -0
  352. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gdresource.mjs +10 -0
  353. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gdscript.d.mts +3 -0
  354. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gdscript.mjs +5 -0
  355. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gdshader.d.mts +3 -0
  356. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gdshader.mjs +5 -0
  357. package/node_modules/shiki/node_modules/@shikijs/langs/dist/genie.d.mts +3 -0
  358. package/node_modules/shiki/node_modules/@shikijs/langs/dist/genie.mjs +5 -0
  359. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gherkin.d.mts +3 -0
  360. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gherkin.mjs +5 -0
  361. package/node_modules/shiki/node_modules/@shikijs/langs/dist/git-commit.d.mts +3 -0
  362. package/node_modules/shiki/node_modules/@shikijs/langs/dist/git-commit.mjs +8 -0
  363. package/node_modules/shiki/node_modules/@shikijs/langs/dist/git-rebase.d.mts +3 -0
  364. package/node_modules/shiki/node_modules/@shikijs/langs/dist/git-rebase.mjs +8 -0
  365. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gjs.d.mts +3 -0
  366. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gjs.mjs +2 -0
  367. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gleam.d.mts +3 -0
  368. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gleam.mjs +5 -0
  369. package/node_modules/shiki/node_modules/@shikijs/langs/dist/glimmer-js.d.mts +3 -0
  370. package/node_modules/shiki/node_modules/@shikijs/langs/dist/glimmer-js.mjs +14 -0
  371. package/node_modules/shiki/node_modules/@shikijs/langs/dist/glimmer-ts.d.mts +3 -0
  372. package/node_modules/shiki/node_modules/@shikijs/langs/dist/glimmer-ts.mjs +14 -0
  373. package/node_modules/shiki/node_modules/@shikijs/langs/dist/glsl.d.mts +3 -0
  374. package/node_modules/shiki/node_modules/@shikijs/langs/dist/glsl.mjs +8 -0
  375. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gn.d.mts +3 -0
  376. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gn.mjs +5 -0
  377. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gnuplot.d.mts +3 -0
  378. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gnuplot.mjs +5 -0
  379. package/node_modules/shiki/node_modules/@shikijs/langs/dist/go.d.mts +3 -0
  380. package/node_modules/shiki/node_modules/@shikijs/langs/dist/go.mjs +5 -0
  381. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gql.d.mts +3 -0
  382. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gql.mjs +2 -0
  383. package/node_modules/shiki/node_modules/@shikijs/langs/dist/graphql.d.mts +3 -0
  384. package/node_modules/shiki/node_modules/@shikijs/langs/dist/graphql.mjs +14 -0
  385. package/node_modules/shiki/node_modules/@shikijs/langs/dist/groovy.d.mts +3 -0
  386. package/node_modules/shiki/node_modules/@shikijs/langs/dist/groovy.mjs +5 -0
  387. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gts.d.mts +3 -0
  388. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gts.mjs +2 -0
  389. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hack.d.mts +3 -0
  390. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hack.mjs +10 -0
  391. package/node_modules/shiki/node_modules/@shikijs/langs/dist/haml.d.mts +3 -0
  392. package/node_modules/shiki/node_modules/@shikijs/langs/dist/haml.mjs +10 -0
  393. package/node_modules/shiki/node_modules/@shikijs/langs/dist/handlebars.d.mts +3 -0
  394. package/node_modules/shiki/node_modules/@shikijs/langs/dist/handlebars.mjs +14 -0
  395. package/node_modules/shiki/node_modules/@shikijs/langs/dist/haskell.d.mts +3 -0
  396. package/node_modules/shiki/node_modules/@shikijs/langs/dist/haskell.mjs +5 -0
  397. package/node_modules/shiki/node_modules/@shikijs/langs/dist/haxe.d.mts +3 -0
  398. package/node_modules/shiki/node_modules/@shikijs/langs/dist/haxe.mjs +5 -0
  399. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hbs.d.mts +3 -0
  400. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hbs.mjs +2 -0
  401. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hcl.d.mts +3 -0
  402. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hcl.mjs +5 -0
  403. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hjson.d.mts +3 -0
  404. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hjson.mjs +5 -0
  405. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hlsl.d.mts +3 -0
  406. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hlsl.mjs +5 -0
  407. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hs.d.mts +3 -0
  408. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hs.mjs +2 -0
  409. package/node_modules/shiki/node_modules/@shikijs/langs/dist/html-derivative.d.mts +3 -0
  410. package/node_modules/shiki/node_modules/@shikijs/langs/dist/html-derivative.mjs +8 -0
  411. package/node_modules/shiki/node_modules/@shikijs/langs/dist/html.d.mts +3 -0
  412. package/node_modules/shiki/node_modules/@shikijs/langs/dist/html.mjs +10 -0
  413. package/node_modules/shiki/node_modules/@shikijs/langs/dist/http.d.mts +3 -0
  414. package/node_modules/shiki/node_modules/@shikijs/langs/dist/http.mjs +14 -0
  415. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hurl.d.mts +3 -0
  416. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hurl.mjs +12 -0
  417. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hxml.d.mts +3 -0
  418. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hxml.mjs +8 -0
  419. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hy.d.mts +3 -0
  420. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hy.mjs +5 -0
  421. package/node_modules/shiki/node_modules/@shikijs/langs/dist/imba.d.mts +3 -0
  422. package/node_modules/shiki/node_modules/@shikijs/langs/dist/imba.mjs +5 -0
  423. package/node_modules/shiki/node_modules/@shikijs/langs/dist/index.d.mts +3 -0
  424. package/node_modules/shiki/node_modules/@shikijs/langs/dist/index.mjs +353 -0
  425. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ini.d.mts +3 -0
  426. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ini.mjs +5 -0
  427. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jade.d.mts +3 -0
  428. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jade.mjs +2 -0
  429. package/node_modules/shiki/node_modules/@shikijs/langs/dist/java.d.mts +3 -0
  430. package/node_modules/shiki/node_modules/@shikijs/langs/dist/java.mjs +5 -0
  431. package/node_modules/shiki/node_modules/@shikijs/langs/dist/javascript.d.mts +3 -0
  432. package/node_modules/shiki/node_modules/@shikijs/langs/dist/javascript.mjs +5 -0
  433. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jinja-html.d.mts +3 -0
  434. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jinja-html.mjs +8 -0
  435. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jinja.d.mts +3 -0
  436. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jinja.mjs +8 -0
  437. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jison.d.mts +3 -0
  438. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jison.mjs +8 -0
  439. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jl.d.mts +3 -0
  440. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jl.mjs +2 -0
  441. package/node_modules/shiki/node_modules/@shikijs/langs/dist/js.d.mts +3 -0
  442. package/node_modules/shiki/node_modules/@shikijs/langs/dist/js.mjs +2 -0
  443. package/node_modules/shiki/node_modules/@shikijs/langs/dist/json.d.mts +3 -0
  444. package/node_modules/shiki/node_modules/@shikijs/langs/dist/json.mjs +5 -0
  445. package/node_modules/shiki/node_modules/@shikijs/langs/dist/json5.d.mts +3 -0
  446. package/node_modules/shiki/node_modules/@shikijs/langs/dist/json5.mjs +5 -0
  447. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jsonc.d.mts +3 -0
  448. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jsonc.mjs +5 -0
  449. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jsonl.d.mts +3 -0
  450. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jsonl.mjs +5 -0
  451. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jsonnet.d.mts +3 -0
  452. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jsonnet.mjs +5 -0
  453. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jssm.d.mts +3 -0
  454. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jssm.mjs +5 -0
  455. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jsx.d.mts +3 -0
  456. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jsx.mjs +5 -0
  457. package/node_modules/shiki/node_modules/@shikijs/langs/dist/julia.d.mts +3 -0
  458. package/node_modules/shiki/node_modules/@shikijs/langs/dist/julia.mjs +16 -0
  459. package/node_modules/shiki/node_modules/@shikijs/langs/dist/just.d.mts +3 -0
  460. package/node_modules/shiki/node_modules/@shikijs/langs/dist/just.mjs +18 -0
  461. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kdl.d.mts +3 -0
  462. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kdl.mjs +5 -0
  463. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kotlin.d.mts +3 -0
  464. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kotlin.mjs +5 -0
  465. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kql.d.mts +3 -0
  466. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kql.mjs +2 -0
  467. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kt.d.mts +3 -0
  468. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kt.mjs +2 -0
  469. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kts.d.mts +3 -0
  470. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kts.mjs +2 -0
  471. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kusto.d.mts +3 -0
  472. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kusto.mjs +5 -0
  473. package/node_modules/shiki/node_modules/@shikijs/langs/dist/latex.d.mts +3 -0
  474. package/node_modules/shiki/node_modules/@shikijs/langs/dist/latex.mjs +8 -0
  475. package/node_modules/shiki/node_modules/@shikijs/langs/dist/lean.d.mts +3 -0
  476. package/node_modules/shiki/node_modules/@shikijs/langs/dist/lean.mjs +5 -0
  477. package/node_modules/shiki/node_modules/@shikijs/langs/dist/lean4.d.mts +3 -0
  478. package/node_modules/shiki/node_modules/@shikijs/langs/dist/lean4.mjs +2 -0
  479. package/node_modules/shiki/node_modules/@shikijs/langs/dist/less.d.mts +3 -0
  480. package/node_modules/shiki/node_modules/@shikijs/langs/dist/less.mjs +5 -0
  481. package/node_modules/shiki/node_modules/@shikijs/langs/dist/liquid.d.mts +3 -0
  482. package/node_modules/shiki/node_modules/@shikijs/langs/dist/liquid.mjs +14 -0
  483. package/node_modules/shiki/node_modules/@shikijs/langs/dist/lisp.d.mts +3 -0
  484. package/node_modules/shiki/node_modules/@shikijs/langs/dist/lisp.mjs +2 -0
  485. package/node_modules/shiki/node_modules/@shikijs/langs/dist/lit.d.mts +3 -0
  486. package/node_modules/shiki/node_modules/@shikijs/langs/dist/lit.mjs +2 -0
  487. package/node_modules/shiki/node_modules/@shikijs/langs/dist/llvm.d.mts +3 -0
  488. package/node_modules/shiki/node_modules/@shikijs/langs/dist/llvm.mjs +5 -0
  489. package/node_modules/shiki/node_modules/@shikijs/langs/dist/log.d.mts +3 -0
  490. package/node_modules/shiki/node_modules/@shikijs/langs/dist/log.mjs +5 -0
  491. package/node_modules/shiki/node_modules/@shikijs/langs/dist/logo.d.mts +3 -0
  492. package/node_modules/shiki/node_modules/@shikijs/langs/dist/logo.mjs +5 -0
  493. package/node_modules/shiki/node_modules/@shikijs/langs/dist/lua.d.mts +3 -0
  494. package/node_modules/shiki/node_modules/@shikijs/langs/dist/lua.mjs +8 -0
  495. package/node_modules/shiki/node_modules/@shikijs/langs/dist/luau.d.mts +3 -0
  496. package/node_modules/shiki/node_modules/@shikijs/langs/dist/luau.mjs +5 -0
  497. package/node_modules/shiki/node_modules/@shikijs/langs/dist/make.d.mts +3 -0
  498. package/node_modules/shiki/node_modules/@shikijs/langs/dist/make.mjs +5 -0
  499. package/node_modules/shiki/node_modules/@shikijs/langs/dist/makefile.d.mts +3 -0
  500. package/node_modules/shiki/node_modules/@shikijs/langs/dist/makefile.mjs +2 -0
  501. package/node_modules/shiki/node_modules/@shikijs/langs/dist/markdown-nix.d.mts +3 -0
  502. package/node_modules/shiki/node_modules/@shikijs/langs/dist/markdown-nix.mjs +5 -0
  503. package/node_modules/shiki/node_modules/@shikijs/langs/dist/markdown-vue.d.mts +3 -0
  504. package/node_modules/shiki/node_modules/@shikijs/langs/dist/markdown-vue.mjs +5 -0
  505. package/node_modules/shiki/node_modules/@shikijs/langs/dist/markdown.d.mts +3 -0
  506. package/node_modules/shiki/node_modules/@shikijs/langs/dist/markdown.mjs +5 -0
  507. package/node_modules/shiki/node_modules/@shikijs/langs/dist/marko.d.mts +3 -0
  508. package/node_modules/shiki/node_modules/@shikijs/langs/dist/marko.mjs +14 -0
  509. package/node_modules/shiki/node_modules/@shikijs/langs/dist/matlab.d.mts +3 -0
  510. package/node_modules/shiki/node_modules/@shikijs/langs/dist/matlab.mjs +5 -0
  511. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mbt.d.mts +3 -0
  512. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mbt.mjs +2 -0
  513. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mbti.d.mts +3 -0
  514. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mbti.mjs +2 -0
  515. package/node_modules/shiki/node_modules/@shikijs/langs/dist/md.d.mts +3 -0
  516. package/node_modules/shiki/node_modules/@shikijs/langs/dist/md.mjs +2 -0
  517. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mdc.d.mts +3 -0
  518. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mdc.mjs +12 -0
  519. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mdx.d.mts +3 -0
  520. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mdx.mjs +5 -0
  521. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mediawiki.d.mts +3 -0
  522. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mediawiki.mjs +2 -0
  523. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mermaid.d.mts +3 -0
  524. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mermaid.mjs +5 -0
  525. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mips.d.mts +3 -0
  526. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mips.mjs +2 -0
  527. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mipsasm.d.mts +3 -0
  528. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mipsasm.mjs +5 -0
  529. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mjs.d.mts +3 -0
  530. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mjs.mjs +2 -0
  531. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mmd.d.mts +3 -0
  532. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mmd.mjs +2 -0
  533. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mojo.d.mts +3 -0
  534. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mojo.mjs +5 -0
  535. package/node_modules/shiki/node_modules/@shikijs/langs/dist/moonbit.d.mts +3 -0
  536. package/node_modules/shiki/node_modules/@shikijs/langs/dist/moonbit.mjs +5 -0
  537. package/node_modules/shiki/node_modules/@shikijs/langs/dist/move.d.mts +3 -0
  538. package/node_modules/shiki/node_modules/@shikijs/langs/dist/move.mjs +5 -0
  539. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mts.d.mts +3 -0
  540. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mts.mjs +2 -0
  541. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nar.d.mts +3 -0
  542. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nar.mjs +2 -0
  543. package/node_modules/shiki/node_modules/@shikijs/langs/dist/narrat.d.mts +3 -0
  544. package/node_modules/shiki/node_modules/@shikijs/langs/dist/narrat.mjs +5 -0
  545. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nextflow-groovy.d.mts +3 -0
  546. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nextflow-groovy.mjs +5 -0
  547. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nextflow.d.mts +3 -0
  548. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nextflow.mjs +8 -0
  549. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nf.d.mts +3 -0
  550. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nf.mjs +2 -0
  551. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nginx.d.mts +3 -0
  552. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nginx.mjs +8 -0
  553. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nim.d.mts +3 -0
  554. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nim.mjs +20 -0
  555. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nix.d.mts +3 -0
  556. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nix.mjs +8 -0
  557. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nu.d.mts +3 -0
  558. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nu.mjs +2 -0
  559. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nushell.d.mts +3 -0
  560. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nushell.mjs +5 -0
  561. package/node_modules/shiki/node_modules/@shikijs/langs/dist/objc.d.mts +3 -0
  562. package/node_modules/shiki/node_modules/@shikijs/langs/dist/objc.mjs +2 -0
  563. package/node_modules/shiki/node_modules/@shikijs/langs/dist/objective-c.d.mts +3 -0
  564. package/node_modules/shiki/node_modules/@shikijs/langs/dist/objective-c.mjs +5 -0
  565. package/node_modules/shiki/node_modules/@shikijs/langs/dist/objective-cpp.d.mts +3 -0
  566. package/node_modules/shiki/node_modules/@shikijs/langs/dist/objective-cpp.mjs +5 -0
  567. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ocaml.d.mts +3 -0
  568. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ocaml.mjs +5 -0
  569. package/node_modules/shiki/node_modules/@shikijs/langs/dist/odin.d.mts +3 -0
  570. package/node_modules/shiki/node_modules/@shikijs/langs/dist/odin.mjs +5 -0
  571. package/node_modules/shiki/node_modules/@shikijs/langs/dist/openscad.d.mts +3 -0
  572. package/node_modules/shiki/node_modules/@shikijs/langs/dist/openscad.mjs +5 -0
  573. package/node_modules/shiki/node_modules/@shikijs/langs/dist/pascal.d.mts +3 -0
  574. package/node_modules/shiki/node_modules/@shikijs/langs/dist/pascal.mjs +5 -0
  575. package/node_modules/shiki/node_modules/@shikijs/langs/dist/perl.d.mts +3 -0
  576. package/node_modules/shiki/node_modules/@shikijs/langs/dist/perl.mjs +16 -0
  577. package/node_modules/shiki/node_modules/@shikijs/langs/dist/perl6.d.mts +3 -0
  578. package/node_modules/shiki/node_modules/@shikijs/langs/dist/perl6.mjs +2 -0
  579. package/node_modules/shiki/node_modules/@shikijs/langs/dist/php.d.mts +3 -0
  580. package/node_modules/shiki/node_modules/@shikijs/langs/dist/php.mjs +18 -0
  581. package/node_modules/shiki/node_modules/@shikijs/langs/dist/pkl.d.mts +3 -0
  582. package/node_modules/shiki/node_modules/@shikijs/langs/dist/pkl.mjs +5 -0
  583. package/node_modules/shiki/node_modules/@shikijs/langs/dist/plsql.d.mts +3 -0
  584. package/node_modules/shiki/node_modules/@shikijs/langs/dist/plsql.mjs +5 -0
  585. package/node_modules/shiki/node_modules/@shikijs/langs/dist/po.d.mts +3 -0
  586. package/node_modules/shiki/node_modules/@shikijs/langs/dist/po.mjs +5 -0
  587. package/node_modules/shiki/node_modules/@shikijs/langs/dist/polar.d.mts +3 -0
  588. package/node_modules/shiki/node_modules/@shikijs/langs/dist/polar.mjs +5 -0
  589. package/node_modules/shiki/node_modules/@shikijs/langs/dist/postcss.d.mts +3 -0
  590. package/node_modules/shiki/node_modules/@shikijs/langs/dist/postcss.mjs +5 -0
  591. package/node_modules/shiki/node_modules/@shikijs/langs/dist/pot.d.mts +3 -0
  592. package/node_modules/shiki/node_modules/@shikijs/langs/dist/pot.mjs +2 -0
  593. package/node_modules/shiki/node_modules/@shikijs/langs/dist/potx.d.mts +3 -0
  594. package/node_modules/shiki/node_modules/@shikijs/langs/dist/potx.mjs +2 -0
  595. package/node_modules/shiki/node_modules/@shikijs/langs/dist/powerquery.d.mts +3 -0
  596. package/node_modules/shiki/node_modules/@shikijs/langs/dist/powerquery.mjs +5 -0
  597. package/node_modules/shiki/node_modules/@shikijs/langs/dist/powershell.d.mts +3 -0
  598. package/node_modules/shiki/node_modules/@shikijs/langs/dist/powershell.mjs +5 -0
  599. package/node_modules/shiki/node_modules/@shikijs/langs/dist/prisma.d.mts +3 -0
  600. package/node_modules/shiki/node_modules/@shikijs/langs/dist/prisma.mjs +5 -0
  601. package/node_modules/shiki/node_modules/@shikijs/langs/dist/prolog.d.mts +3 -0
  602. package/node_modules/shiki/node_modules/@shikijs/langs/dist/prolog.mjs +5 -0
  603. package/node_modules/shiki/node_modules/@shikijs/langs/dist/properties.d.mts +3 -0
  604. package/node_modules/shiki/node_modules/@shikijs/langs/dist/properties.mjs +2 -0
  605. package/node_modules/shiki/node_modules/@shikijs/langs/dist/proto.d.mts +3 -0
  606. package/node_modules/shiki/node_modules/@shikijs/langs/dist/proto.mjs +5 -0
  607. package/node_modules/shiki/node_modules/@shikijs/langs/dist/protobuf.d.mts +3 -0
  608. package/node_modules/shiki/node_modules/@shikijs/langs/dist/protobuf.mjs +2 -0
  609. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ps.d.mts +3 -0
  610. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ps.mjs +2 -0
  611. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ps1.d.mts +3 -0
  612. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ps1.mjs +2 -0
  613. package/node_modules/shiki/node_modules/@shikijs/langs/dist/pug.d.mts +3 -0
  614. package/node_modules/shiki/node_modules/@shikijs/langs/dist/pug.mjs +12 -0
  615. package/node_modules/shiki/node_modules/@shikijs/langs/dist/puppet.d.mts +3 -0
  616. package/node_modules/shiki/node_modules/@shikijs/langs/dist/puppet.mjs +5 -0
  617. package/node_modules/shiki/node_modules/@shikijs/langs/dist/purescript.d.mts +3 -0
  618. package/node_modules/shiki/node_modules/@shikijs/langs/dist/purescript.mjs +5 -0
  619. package/node_modules/shiki/node_modules/@shikijs/langs/dist/py.d.mts +3 -0
  620. package/node_modules/shiki/node_modules/@shikijs/langs/dist/py.mjs +2 -0
  621. package/node_modules/shiki/node_modules/@shikijs/langs/dist/python.d.mts +3 -0
  622. package/node_modules/shiki/node_modules/@shikijs/langs/dist/python.mjs +5 -0
  623. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ql.d.mts +3 -0
  624. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ql.mjs +2 -0
  625. package/node_modules/shiki/node_modules/@shikijs/langs/dist/qml.d.mts +3 -0
  626. package/node_modules/shiki/node_modules/@shikijs/langs/dist/qml.mjs +8 -0
  627. package/node_modules/shiki/node_modules/@shikijs/langs/dist/qmldir.d.mts +3 -0
  628. package/node_modules/shiki/node_modules/@shikijs/langs/dist/qmldir.mjs +5 -0
  629. package/node_modules/shiki/node_modules/@shikijs/langs/dist/qss.d.mts +3 -0
  630. package/node_modules/shiki/node_modules/@shikijs/langs/dist/qss.mjs +5 -0
  631. package/node_modules/shiki/node_modules/@shikijs/langs/dist/r.d.mts +3 -0
  632. package/node_modules/shiki/node_modules/@shikijs/langs/dist/r.mjs +5 -0
  633. package/node_modules/shiki/node_modules/@shikijs/langs/dist/racket.d.mts +3 -0
  634. package/node_modules/shiki/node_modules/@shikijs/langs/dist/racket.mjs +5 -0
  635. package/node_modules/shiki/node_modules/@shikijs/langs/dist/raku.d.mts +3 -0
  636. package/node_modules/shiki/node_modules/@shikijs/langs/dist/raku.mjs +5 -0
  637. package/node_modules/shiki/node_modules/@shikijs/langs/dist/razor.d.mts +3 -0
  638. package/node_modules/shiki/node_modules/@shikijs/langs/dist/razor.mjs +10 -0
  639. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rb.d.mts +3 -0
  640. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rb.mjs +2 -0
  641. package/node_modules/shiki/node_modules/@shikijs/langs/dist/reg.d.mts +3 -0
  642. package/node_modules/shiki/node_modules/@shikijs/langs/dist/reg.mjs +5 -0
  643. package/node_modules/shiki/node_modules/@shikijs/langs/dist/regex.d.mts +3 -0
  644. package/node_modules/shiki/node_modules/@shikijs/langs/dist/regex.mjs +2 -0
  645. package/node_modules/shiki/node_modules/@shikijs/langs/dist/regexp.d.mts +3 -0
  646. package/node_modules/shiki/node_modules/@shikijs/langs/dist/regexp.mjs +5 -0
  647. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rel.d.mts +3 -0
  648. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rel.mjs +5 -0
  649. package/node_modules/shiki/node_modules/@shikijs/langs/dist/riscv.d.mts +3 -0
  650. package/node_modules/shiki/node_modules/@shikijs/langs/dist/riscv.mjs +5 -0
  651. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ron.d.mts +3 -0
  652. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ron.mjs +5 -0
  653. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rosmsg.d.mts +3 -0
  654. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rosmsg.mjs +5 -0
  655. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rs.d.mts +3 -0
  656. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rs.mjs +2 -0
  657. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rst.d.mts +3 -0
  658. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rst.mjs +22 -0
  659. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ruby.d.mts +3 -0
  660. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ruby.mjs +30 -0
  661. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rust.d.mts +3 -0
  662. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rust.mjs +5 -0
  663. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sas.d.mts +3 -0
  664. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sas.mjs +8 -0
  665. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sass.d.mts +3 -0
  666. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sass.mjs +5 -0
  667. package/node_modules/shiki/node_modules/@shikijs/langs/dist/scad.d.mts +3 -0
  668. package/node_modules/shiki/node_modules/@shikijs/langs/dist/scad.mjs +2 -0
  669. package/node_modules/shiki/node_modules/@shikijs/langs/dist/scala.d.mts +3 -0
  670. package/node_modules/shiki/node_modules/@shikijs/langs/dist/scala.mjs +5 -0
  671. package/node_modules/shiki/node_modules/@shikijs/langs/dist/scheme.d.mts +3 -0
  672. package/node_modules/shiki/node_modules/@shikijs/langs/dist/scheme.mjs +5 -0
  673. package/node_modules/shiki/node_modules/@shikijs/langs/dist/scss.d.mts +3 -0
  674. package/node_modules/shiki/node_modules/@shikijs/langs/dist/scss.mjs +8 -0
  675. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sdbl.d.mts +3 -0
  676. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sdbl.mjs +5 -0
  677. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sh.d.mts +3 -0
  678. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sh.mjs +2 -0
  679. package/node_modules/shiki/node_modules/@shikijs/langs/dist/shader.d.mts +3 -0
  680. package/node_modules/shiki/node_modules/@shikijs/langs/dist/shader.mjs +2 -0
  681. package/node_modules/shiki/node_modules/@shikijs/langs/dist/shaderlab.d.mts +3 -0
  682. package/node_modules/shiki/node_modules/@shikijs/langs/dist/shaderlab.mjs +8 -0
  683. package/node_modules/shiki/node_modules/@shikijs/langs/dist/shell.d.mts +3 -0
  684. package/node_modules/shiki/node_modules/@shikijs/langs/dist/shell.mjs +2 -0
  685. package/node_modules/shiki/node_modules/@shikijs/langs/dist/shellscript.d.mts +3 -0
  686. package/node_modules/shiki/node_modules/@shikijs/langs/dist/shellscript.mjs +5 -0
  687. package/node_modules/shiki/node_modules/@shikijs/langs/dist/shellsession.d.mts +3 -0
  688. package/node_modules/shiki/node_modules/@shikijs/langs/dist/shellsession.mjs +8 -0
  689. package/node_modules/shiki/node_modules/@shikijs/langs/dist/smalltalk.d.mts +3 -0
  690. package/node_modules/shiki/node_modules/@shikijs/langs/dist/smalltalk.mjs +5 -0
  691. package/node_modules/shiki/node_modules/@shikijs/langs/dist/solidity.d.mts +3 -0
  692. package/node_modules/shiki/node_modules/@shikijs/langs/dist/solidity.mjs +5 -0
  693. package/node_modules/shiki/node_modules/@shikijs/langs/dist/soy.d.mts +3 -0
  694. package/node_modules/shiki/node_modules/@shikijs/langs/dist/soy.mjs +8 -0
  695. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sparql.d.mts +3 -0
  696. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sparql.mjs +8 -0
  697. package/node_modules/shiki/node_modules/@shikijs/langs/dist/spl.d.mts +3 -0
  698. package/node_modules/shiki/node_modules/@shikijs/langs/dist/spl.mjs +2 -0
  699. package/node_modules/shiki/node_modules/@shikijs/langs/dist/splunk.d.mts +3 -0
  700. package/node_modules/shiki/node_modules/@shikijs/langs/dist/splunk.mjs +5 -0
  701. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sql.d.mts +3 -0
  702. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sql.mjs +5 -0
  703. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ssh-config.d.mts +3 -0
  704. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ssh-config.mjs +5 -0
  705. package/node_modules/shiki/node_modules/@shikijs/langs/dist/stata.d.mts +3 -0
  706. package/node_modules/shiki/node_modules/@shikijs/langs/dist/stata.mjs +8 -0
  707. package/node_modules/shiki/node_modules/@shikijs/langs/dist/styl.d.mts +3 -0
  708. package/node_modules/shiki/node_modules/@shikijs/langs/dist/styl.mjs +2 -0
  709. package/node_modules/shiki/node_modules/@shikijs/langs/dist/stylus.d.mts +3 -0
  710. package/node_modules/shiki/node_modules/@shikijs/langs/dist/stylus.mjs +5 -0
  711. package/node_modules/shiki/node_modules/@shikijs/langs/dist/surql.d.mts +3 -0
  712. package/node_modules/shiki/node_modules/@shikijs/langs/dist/surql.mjs +2 -0
  713. package/node_modules/shiki/node_modules/@shikijs/langs/dist/surrealql.d.mts +3 -0
  714. package/node_modules/shiki/node_modules/@shikijs/langs/dist/surrealql.mjs +8 -0
  715. package/node_modules/shiki/node_modules/@shikijs/langs/dist/svelte.d.mts +3 -0
  716. package/node_modules/shiki/node_modules/@shikijs/langs/dist/svelte.mjs +14 -0
  717. package/node_modules/shiki/node_modules/@shikijs/langs/dist/swift.d.mts +3 -0
  718. package/node_modules/shiki/node_modules/@shikijs/langs/dist/swift.mjs +5 -0
  719. package/node_modules/shiki/node_modules/@shikijs/langs/dist/system-verilog.d.mts +3 -0
  720. package/node_modules/shiki/node_modules/@shikijs/langs/dist/system-verilog.mjs +5 -0
  721. package/node_modules/shiki/node_modules/@shikijs/langs/dist/systemd.d.mts +3 -0
  722. package/node_modules/shiki/node_modules/@shikijs/langs/dist/systemd.mjs +5 -0
  723. package/node_modules/shiki/node_modules/@shikijs/langs/dist/talon.d.mts +3 -0
  724. package/node_modules/shiki/node_modules/@shikijs/langs/dist/talon.mjs +2 -0
  725. package/node_modules/shiki/node_modules/@shikijs/langs/dist/talonscript.d.mts +3 -0
  726. package/node_modules/shiki/node_modules/@shikijs/langs/dist/talonscript.mjs +5 -0
  727. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tasl.d.mts +3 -0
  728. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tasl.mjs +5 -0
  729. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tcl.d.mts +3 -0
  730. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tcl.mjs +5 -0
  731. package/node_modules/shiki/node_modules/@shikijs/langs/dist/templ.d.mts +3 -0
  732. package/node_modules/shiki/node_modules/@shikijs/langs/dist/templ.mjs +12 -0
  733. package/node_modules/shiki/node_modules/@shikijs/langs/dist/terraform.d.mts +3 -0
  734. package/node_modules/shiki/node_modules/@shikijs/langs/dist/terraform.mjs +5 -0
  735. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tex.d.mts +3 -0
  736. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tex.mjs +8 -0
  737. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tf.d.mts +3 -0
  738. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tf.mjs +2 -0
  739. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tfvars.d.mts +3 -0
  740. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tfvars.mjs +2 -0
  741. package/node_modules/shiki/node_modules/@shikijs/langs/dist/toml.d.mts +3 -0
  742. package/node_modules/shiki/node_modules/@shikijs/langs/dist/toml.mjs +5 -0
  743. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tres.d.mts +3 -0
  744. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tres.mjs +2 -0
  745. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ts-tags.d.mts +3 -0
  746. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ts-tags.mjs +18 -0
  747. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ts.d.mts +3 -0
  748. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ts.mjs +2 -0
  749. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tscn.d.mts +3 -0
  750. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tscn.mjs +2 -0
  751. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tsp.d.mts +3 -0
  752. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tsp.mjs +2 -0
  753. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tsv.d.mts +3 -0
  754. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tsv.mjs +5 -0
  755. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tsx.d.mts +3 -0
  756. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tsx.mjs +5 -0
  757. package/node_modules/shiki/node_modules/@shikijs/langs/dist/turtle.d.mts +3 -0
  758. package/node_modules/shiki/node_modules/@shikijs/langs/dist/turtle.mjs +5 -0
  759. package/node_modules/shiki/node_modules/@shikijs/langs/dist/twig.d.mts +3 -0
  760. package/node_modules/shiki/node_modules/@shikijs/langs/dist/twig.mjs +18 -0
  761. package/node_modules/shiki/node_modules/@shikijs/langs/dist/typ.d.mts +3 -0
  762. package/node_modules/shiki/node_modules/@shikijs/langs/dist/typ.mjs +2 -0
  763. package/node_modules/shiki/node_modules/@shikijs/langs/dist/typescript.d.mts +3 -0
  764. package/node_modules/shiki/node_modules/@shikijs/langs/dist/typescript.mjs +5 -0
  765. package/node_modules/shiki/node_modules/@shikijs/langs/dist/typespec.d.mts +3 -0
  766. package/node_modules/shiki/node_modules/@shikijs/langs/dist/typespec.mjs +5 -0
  767. package/node_modules/shiki/node_modules/@shikijs/langs/dist/typst.d.mts +3 -0
  768. package/node_modules/shiki/node_modules/@shikijs/langs/dist/typst.mjs +5 -0
  769. package/node_modules/shiki/node_modules/@shikijs/langs/dist/v.d.mts +3 -0
  770. package/node_modules/shiki/node_modules/@shikijs/langs/dist/v.mjs +5 -0
  771. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vala.d.mts +3 -0
  772. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vala.mjs +5 -0
  773. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vb.d.mts +3 -0
  774. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vb.mjs +5 -0
  775. package/node_modules/shiki/node_modules/@shikijs/langs/dist/verilog.d.mts +3 -0
  776. package/node_modules/shiki/node_modules/@shikijs/langs/dist/verilog.mjs +5 -0
  777. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vhdl.d.mts +3 -0
  778. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vhdl.mjs +5 -0
  779. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vim.d.mts +3 -0
  780. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vim.mjs +2 -0
  781. package/node_modules/shiki/node_modules/@shikijs/langs/dist/viml.d.mts +3 -0
  782. package/node_modules/shiki/node_modules/@shikijs/langs/dist/viml.mjs +5 -0
  783. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vimscript.d.mts +3 -0
  784. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vimscript.mjs +2 -0
  785. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue-directives.d.mts +3 -0
  786. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue-directives.mjs +5 -0
  787. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue-html.d.mts +3 -0
  788. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue-html.mjs +8 -0
  789. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue-interpolations.d.mts +3 -0
  790. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue-interpolations.mjs +5 -0
  791. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue-sfc-style-variable-injection.d.mts +3 -0
  792. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue-sfc-style-variable-injection.mjs +8 -0
  793. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue-vine.d.mts +3 -0
  794. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue-vine.mjs +18 -0
  795. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue.d.mts +3 -0
  796. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue.mjs +26 -0
  797. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vy.d.mts +3 -0
  798. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vy.mjs +2 -0
  799. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vyper.d.mts +3 -0
  800. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vyper.mjs +5 -0
  801. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wasm.d.mts +3 -0
  802. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wasm.mjs +5 -0
  803. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wenyan.d.mts +3 -0
  804. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wenyan.mjs +5 -0
  805. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wgsl.d.mts +3 -0
  806. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wgsl.mjs +5 -0
  807. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wiki.d.mts +3 -0
  808. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wiki.mjs +2 -0
  809. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wikitext.d.mts +3 -0
  810. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wikitext.mjs +5 -0
  811. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wit.d.mts +3 -0
  812. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wit.mjs +5 -0
  813. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wl.d.mts +3 -0
  814. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wl.mjs +2 -0
  815. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wolfram.d.mts +3 -0
  816. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wolfram.mjs +5 -0
  817. package/node_modules/shiki/node_modules/@shikijs/langs/dist/xml.d.mts +3 -0
  818. package/node_modules/shiki/node_modules/@shikijs/langs/dist/xml.mjs +8 -0
  819. package/node_modules/shiki/node_modules/@shikijs/langs/dist/xsl.d.mts +3 -0
  820. package/node_modules/shiki/node_modules/@shikijs/langs/dist/xsl.mjs +8 -0
  821. package/node_modules/shiki/node_modules/@shikijs/langs/dist/yaml.d.mts +3 -0
  822. package/node_modules/shiki/node_modules/@shikijs/langs/dist/yaml.mjs +5 -0
  823. package/node_modules/shiki/node_modules/@shikijs/langs/dist/yml.d.mts +3 -0
  824. package/node_modules/shiki/node_modules/@shikijs/langs/dist/yml.mjs +2 -0
  825. package/node_modules/shiki/node_modules/@shikijs/langs/dist/zenscript.d.mts +3 -0
  826. package/node_modules/shiki/node_modules/@shikijs/langs/dist/zenscript.mjs +5 -0
  827. package/node_modules/shiki/node_modules/@shikijs/langs/dist/zig.d.mts +3 -0
  828. package/node_modules/shiki/node_modules/@shikijs/langs/dist/zig.mjs +5 -0
  829. package/node_modules/shiki/node_modules/@shikijs/langs/dist/zsh.d.mts +3 -0
  830. package/node_modules/shiki/node_modules/@shikijs/langs/dist/zsh.mjs +2 -0
  831. package/node_modules/shiki/node_modules/@shikijs/langs/package.json +384 -0
  832. package/node_modules/shiki/node_modules/@shikijs/types/LICENSE +22 -0
  833. package/node_modules/shiki/node_modules/@shikijs/types/README.md +7 -0
  834. package/node_modules/shiki/node_modules/@shikijs/types/dist/index.d.mts +885 -0
  835. package/node_modules/shiki/node_modules/@shikijs/types/dist/index.mjs +8 -0
  836. package/node_modules/shiki/node_modules/@shikijs/types/package.json +36 -0
  837. package/npm-shrinkwrap.json +90 -14
  838. package/package.json +10 -8
@@ -1 +1 @@
1
- {"version":3,"file":"CodeView.js","names":["renderedItems: CodeViewRenderedItem<LAnnotation>[]","nextItems: CodeViewContextItem<LAnnotation>[]","nextIdToItem: Map<\n string,\n CodeViewContextItem<LAnnotation>\n >","nextInstanceToItem: Map<\n VirtualizedFileDiff<LAnnotation> | VirtualizedFile<LAnnotation>,\n CodeViewContextItem<LAnnotation>\n >","firstDirtyIndex: number | undefined","prevElement: HTMLElement | undefined","slotSnapshot: CodeViewRenderedItem<LAnnotation>[]"],"sources":["../../src/components/CodeView.ts"],"sourcesContent":["import {\n CORE_CSS_ATTRIBUTE,\n DEFAULT_CODE_VIEW_FILE_METRICS,\n DEFAULT_CODE_VIEW_LAYOUT,\n DEFAULT_SMOOTH_SCROLL_SETTINGS,\n DEFAULT_THEMES,\n DIFFS_DEVELOPMENT_BUILD,\n DIFFS_TAG_NAME,\n THEME_CSS_ATTRIBUTE,\n UNSAFE_CSS_ATTRIBUTE,\n} from '../constants';\nimport type { SelectionWriteOptions } from '../managers/InteractionManager';\nimport {\n dequeueRender,\n queueRender,\n} from '../managers/UniversalRenderingManager';\nimport type {\n CodeViewDiffItem,\n CodeViewFileItem,\n CodeViewItem,\n CodeViewItemScrollTarget,\n CodeViewLayout,\n CodeViewLineScrollTarget,\n CodeViewPositionScrollTarget,\n CodeViewRangeScrollTarget,\n CodeViewScrollBehavior,\n CodeViewScrollTarget,\n HunkSeparators,\n SelectedLineRange,\n SelectionSide,\n SmoothScrollSettings,\n VirtualFileMetrics,\n VirtualWindowSpecs,\n} from '../types';\nimport { areObjectsEqual } from '../utils/areObjectsEqual';\nimport { areSelectionsEqual } from '../utils/areSelectionsEqual';\nimport { areThemesEqual } from '../utils/areThemesEqual';\nimport { createWindowFromScrollPosition } from '../utils/createWindowFromScrollPosition';\nimport { isStyleNode } from '../utils/isStyleNode';\nimport { prefersReducedMotion } from '../utils/prefersReducedMotion';\nimport { roundToDevicePixel } from '../utils/roundToDevicePixel';\nimport type { WorkerPoolManager } from '../worker';\nimport type { FileOptions } from './File';\nimport type { FileDiffOptions } from './FileDiff';\nimport { VirtualizedFile } from './VirtualizedFile';\nimport { VirtualizedFileDiff } from './VirtualizedFileDiff';\nimport type { VirtualizerConfig } from './Virtualizer';\n\n// When re-rendering content of the virtualizer, it's important that we\n// maintain a visual anchor, usually this is the first fully visible element,\n// whether it's an Item (a file or diff header), or a specific line. If the\n// rendered content ever ends up shifting things around, we'll need to reset\n// the new position back to the viewportOffset, relative to where that element\n// currently is\ninterface ItemAnchor {\n type: 'item';\n id: string;\n viewportOffset: number;\n}\n\ninterface LineAnchor {\n type: 'line';\n id: string;\n lineNumber: number;\n side: SelectionSide | undefined;\n viewportOffset: number;\n}\n\ntype ScrollAnchor = ItemAnchor | LineAnchor;\n\ninterface LineScrollPosition {\n top: number;\n height: number;\n}\n\ninterface StickyBounds {\n stickyTop: number;\n stickyBottom: number;\n}\n\ninterface PagedScrollPosition {\n pagedScrollTop: number;\n scrollPageOffset: number;\n}\n\ninterface AdvancedVirtualizedBaseItem {\n /** Current index of this record in the ordered items array. */\n index: number;\n /** Absolute top offset of this item inside the scroll content. */\n top: number;\n /** Total measured height reserved for this item. */\n height: number;\n /** Root <diffs-container> node currently mounted for this item, only exists\n * when rendered. */\n element: HTMLElement | undefined;\n /** Last controlled version observed for this record. */\n version: number | undefined;\n}\n\ninterface CodeViewDiffItemContext<\n LAnnotation,\n> extends AdvancedVirtualizedBaseItem {\n type: 'diff';\n /** Latest item snapshot for this record. Controlled updates can replace it. */\n item: CodeViewDiffItem<LAnnotation>;\n /** Virtualized diff instance responsible for rendering this item. */\n instance: VirtualizedFileDiff<LAnnotation>;\n}\n\ninterface CodeViewFileItemContext<\n LAnnotation,\n> extends AdvancedVirtualizedBaseItem {\n type: 'file';\n /** Latest item snapshot for this record. Controlled updates can replace it. */\n item: CodeViewFileItem<LAnnotation>;\n /** Virtualized file instance responsible for rendering this item. */\n instance: VirtualizedFile<LAnnotation>;\n}\n\ntype CodeViewContextItem<LAnnotation> =\n | CodeViewDiffItemContext<LAnnotation>\n | CodeViewFileItemContext<LAnnotation>;\n\nexport interface CodeViewRenderedDiffItem<LAnnotation> {\n id: string;\n type: 'diff';\n item: CodeViewDiffItem<LAnnotation>;\n version: number | undefined;\n element: HTMLElement;\n instance: VirtualizedFileDiff<LAnnotation>;\n}\n\nexport interface CodeViewRenderedFileItem<LAnnotation> {\n id: string;\n type: 'file';\n item: CodeViewFileItem<LAnnotation>;\n version: number | undefined;\n element: HTMLElement;\n instance: VirtualizedFile<LAnnotation>;\n}\n\nexport type CodeViewRenderedItem<LAnnotation> =\n | CodeViewRenderedDiffItem<LAnnotation>\n | CodeViewRenderedFileItem<LAnnotation>;\n\nexport interface CodeViewLineSelection {\n id: string;\n range: SelectedLineRange;\n}\n\nexport interface CodeViewCoordinator<LAnnotation> {\n hasHeaderRenderers: boolean;\n hasAnnotationRenderer: boolean;\n hasGutterRenderer: boolean;\n onSnapshotChange(\n snapshot: CodeViewRenderedItem<LAnnotation>[] | undefined\n ): void;\n}\n\nexport type CodeViewScrollListener<LAnnotation> = (\n scrollTop: number,\n viewer: CodeView<LAnnotation>\n) => void;\n\ntype OverloadCallbackArgs<TCallback> = TCallback extends (\n ...args: infer TArgs\n) => unknown\n ? TArgs\n : never;\n\ntype CallbackReturn<TCallback> = TCallback extends (\n ...args: never[]\n) => infer TReturn\n ? TReturn\n : never;\n\ntype OverloadFileCallbackArgs<\n LAnnotation,\n TKey extends keyof FileOptions<LAnnotation>,\n> = OverloadCallbackArgs<NonNullable<FileOptions<LAnnotation>[TKey]>>;\n\ntype OverloadDiffCallbackArgs<\n LAnnotation,\n TKey extends keyof FileDiffOptions<LAnnotation>,\n> = OverloadCallbackArgs<NonNullable<FileDiffOptions<LAnnotation>[TKey]>>;\n\ntype CodeViewFileOptionCallback<\n LAnnotation,\n TKey extends keyof FileOptions<LAnnotation>,\n> = (\n ...args: [\n ...OverloadFileCallbackArgs<LAnnotation, TKey>,\n context: CodeViewFileItemContext<LAnnotation>,\n ]\n) => CallbackReturn<NonNullable<FileOptions<LAnnotation>[TKey]>>;\n\ntype CodeViewDiffOptionCallback<\n LAnnotation,\n TKey extends keyof FileDiffOptions<LAnnotation>,\n> = (\n ...args: [\n ...OverloadDiffCallbackArgs<LAnnotation, TKey>,\n context: CodeViewDiffItemContext<LAnnotation>,\n ]\n) => CallbackReturn<NonNullable<FileDiffOptions<LAnnotation>[TKey]>>;\n\ntype CodeViewOptionCallback<\n LAnnotation,\n TKey extends keyof FileOptions<LAnnotation> &\n keyof FileDiffOptions<LAnnotation>,\n> = {\n (\n ...args: [\n ...OverloadFileCallbackArgs<LAnnotation, TKey>,\n context: CodeViewFileItemContext<LAnnotation>,\n ]\n ): CallbackReturn<NonNullable<FileOptions<LAnnotation>[TKey]>>;\n (\n ...args: [\n ...OverloadDiffCallbackArgs<LAnnotation, TKey>,\n context: CodeViewDiffItemContext<LAnnotation>,\n ]\n ): CallbackReturn<NonNullable<FileDiffOptions<LAnnotation>[TKey]>>;\n};\n\nconst CODE_VIEW_DIFF_OPTION_KEYS = [\n 'theme',\n 'disableLineNumbers',\n 'overflow',\n 'themeType',\n 'disableFileHeader',\n 'disableVirtualizationBuffers',\n 'preferredHighlighter',\n 'useCSSClasses',\n 'useTokenTransformer',\n 'tokenizeMaxLineLength',\n 'tokenizeMaxLength',\n 'unsafeCSS',\n 'diffStyle',\n 'diffIndicators',\n 'disableBackground',\n 'expandUnchanged',\n 'collapsedContextThreshold',\n 'lineDiffType',\n 'maxLineDiffLength',\n 'expansionLineCount',\n 'lineHoverHighlight',\n 'enableTokenInteractionsOnWhitespace',\n 'enableGutterUtility',\n '__debugPointerEvents',\n 'enableLineSelection',\n 'controlledSelection',\n 'disableErrorHandling',\n] as const;\n\ntype CodeViewDiffOptionKeys = (typeof CODE_VIEW_DIFF_OPTION_KEYS)[number];\n\nconst CODE_VIEW_FILE_OPTION_KEYS = [\n 'theme',\n 'disableLineNumbers',\n 'overflow',\n 'themeType',\n 'disableFileHeader',\n 'disableVirtualizationBuffers',\n 'preferredHighlighter',\n 'useCSSClasses',\n 'useTokenTransformer',\n 'tokenizeMaxLineLength',\n 'tokenizeMaxLength',\n 'unsafeCSS',\n 'lineHoverHighlight',\n 'enableTokenInteractionsOnWhitespace',\n 'enableGutterUtility',\n '__debugPointerEvents',\n 'enableLineSelection',\n 'controlledSelection',\n 'disableErrorHandling',\n] as const;\n\ntype CodeViewPassThroughOptions<LAnnotation> = Pick<\n FileDiffOptions<LAnnotation>,\n CodeViewDiffOptionKeys\n>;\n\ntype CodeViewMode = 'file' | 'diff';\n\ntype CodeViewModeItemContext<\n LAnnotation,\n TMode extends CodeViewMode,\n> = TMode extends 'file'\n ? CodeViewFileItemContext<LAnnotation>\n : CodeViewDiffItemContext<LAnnotation>;\n\ntype CodeViewModeOptionCallback<\n LAnnotation,\n TMode extends CodeViewMode,\n TKey extends CodeViewSharedCallbackKeys | CodeViewSelectionCallbackKeys,\n> = TMode extends 'file'\n ? CodeViewFileOptionCallback<LAnnotation, TKey>\n : CodeViewDiffOptionCallback<LAnnotation, TKey>;\n\ntype CodeViewModeInternalOptionCallback<\n LAnnotation,\n TMode extends CodeViewMode,\n TKey extends CodeViewSharedCallbackKeys | CodeViewSelectionCallbackKeys,\n> = (\n ...args: [\n ...OverloadCallbackArgs<\n NonNullable<CodeViewModeOptions<LAnnotation, TMode>[TKey]>\n >,\n CodeViewModeItemContext<LAnnotation, TMode>,\n ]\n) => CallbackReturn<NonNullable<CodeViewModeOptions<LAnnotation, TMode>[TKey]>>;\n\ntype CodeViewModeOptions<\n LAnnotation,\n TMode extends CodeViewMode,\n> = TMode extends 'file'\n ? FileOptions<LAnnotation>\n : FileDiffOptions<LAnnotation>;\n\nconst CODE_VIEW_SHARED_CALLBACK_KEYS = [\n 'renderCustomHeader',\n 'renderHeaderPrefix',\n 'renderHeaderMetadata',\n 'renderAnnotation',\n 'renderGutterUtility',\n 'onPostRender',\n 'onGutterUtilityClick',\n 'onLineClick',\n 'onLineNumberClick',\n 'onLineEnter',\n 'onLineLeave',\n 'onTokenClick',\n 'onTokenEnter',\n 'onTokenLeave',\n] as const;\n\nconst CODE_VIEW_SELECTION_CALLBACK_KEYS = [\n 'onLineSelected',\n 'onLineSelectionStart',\n 'onLineSelectionChange',\n 'onLineSelectionEnd',\n] as const;\n\ntype CodeViewSharedCallbackKeys =\n (typeof CODE_VIEW_SHARED_CALLBACK_KEYS)[number];\n\ntype CodeViewSelectionCallbackKeys =\n (typeof CODE_VIEW_SELECTION_CALLBACK_KEYS)[number];\n\ntype CodeViewSharedCallbackOptions<LAnnotation> = {\n [TKey in CodeViewSharedCallbackKeys]?: CodeViewOptionCallback<\n LAnnotation,\n TKey\n >;\n};\n\ntype CodeViewSelectionCallbackOptions<LAnnotation> = {\n [TKey in CodeViewSelectionCallbackKeys]?: CodeViewOptionCallback<\n LAnnotation,\n TKey\n >;\n};\n\nexport interface CodeViewOptions<LAnnotation>\n extends\n CodeViewPassThroughOptions<LAnnotation>,\n CodeViewSharedCallbackOptions<LAnnotation>,\n CodeViewSelectionCallbackOptions<LAnnotation> {\n hunkSeparators?: Exclude<HunkSeparators, 'custom'>;\n itemMetrics?: Partial<VirtualFileMetrics>;\n pointerEventsOnScroll?: boolean;\n smoothScrollSettings?: SmoothScrollSettings;\n stickyHeaders?: boolean;\n controlledSelection?: boolean;\n onSelectedLinesChange?(selection: CodeViewLineSelection | null): void;\n layout?: CodeViewLayout;\n\n /** Internal dev-only check to ensure your `itemMetrics` are correct. Its\n * automatically disabled in a production build because it will hurt\n * performance fairly significantly */\n __devOnlyValidateItemHeights?: boolean;\n}\n\nconst DEFAULT_SCROLL_INTERACTION_RESTORE_DELAY_MS = 120;\nconst SCROLLING_CODE_OVERFLOW_FIX_VARIABLE = '--diffs-overflow-override';\nconst SCROLL_REBASE_CONTAINER_HEIGHT = 12_000_000;\nconst SCROLL_REBASE_TRIGGER_TOP = 1_000_000;\nconst SCROLL_REBASE_TARGET_TOP = 2_000_000;\nconst SCROLL_REBASE_TARGET_BOTTOM =\n SCROLL_REBASE_CONTAINER_HEIGHT - SCROLL_REBASE_TARGET_TOP;\nconst SCROLL_REBASE_THRESHOLD =\n SCROLL_REBASE_CONTAINER_HEIGHT - SCROLL_REBASE_TRIGGER_TOP;\nconst CODE_VIEW_ELEMENT_POOL_LIMIT = 32;\n\ninterface ScrollToAnimation {\n position: number;\n velocity: number;\n lastTimestamp: number;\n}\n\ninterface SpringStepResult {\n position: number;\n velocity: number;\n}\n\n// A vibe slopped heuristic to detect mobile safari only\nconst MOBILE_SAFARI = (() => {\n const { navigator } = globalThis;\n\n const userAgent = navigator.userAgent;\n const isIOS = /iP(?:hone|ad|od)/.test(userAgent);\n const isIPadOS =\n navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;\n\n return (\n (isIOS || isIPadOS) &&\n /AppleWebKit/.test(userAgent) &&\n /Safari/.test(userAgent) &&\n !/(CriOS|FxiOS|EdgiOS|OPiOS)/.test(userAgent)\n );\n})();\n\ntype PendingAlignTypes = Exclude<CodeViewLineScrollTarget['align'], 'nearest'>;\n\ninterface PendingLineTarget extends Omit<CodeViewLineScrollTarget, 'align'> {\n align?: PendingAlignTypes;\n}\n\ninterface PendingRangeTarget extends Omit<CodeViewRangeScrollTarget, 'align'> {\n align?: PendingAlignTypes;\n}\n\ninterface PendingItemTarget extends Omit<CodeViewItemScrollTarget, 'align'> {\n align?: PendingAlignTypes;\n}\n\ntype PendingScrollTarget =\n | CodeViewPositionScrollTarget\n | PendingLineTarget\n | PendingRangeTarget\n | PendingItemTarget;\n\nexport class CodeView<LAnnotation = undefined> {\n static __STOP = false;\n static __lastScrollPosition = 0;\n\n public type = 'advanced' as const;\n public readonly config: VirtualizerConfig = {\n overscrollSize: 200,\n intersectionObserverMargin: 0,\n resizeDebugging: false,\n };\n private items: CodeViewContextItem<LAnnotation>[] = [];\n private idToItem: Map<string, CodeViewContextItem<LAnnotation>> = new Map();\n private selectedLines: CodeViewLineSelection | null = null;\n // NOTE(amadeus): We should probably attach an id to instances and use that\n // for lookups, instead of maintaining this map...\n private instanceToItem: Map<\n VirtualizedFileDiff<LAnnotation> | VirtualizedFile<LAnnotation>,\n CodeViewContextItem<LAnnotation>\n > = new Map();\n private layoutDirtyIndex: number | undefined;\n private slotCoordinator: CodeViewCoordinator<LAnnotation> | undefined;\n private slotSnapshot: CodeViewRenderedItem<LAnnotation>[] | undefined;\n private scrollListeners: Set<CodeViewScrollListener<LAnnotation>> = new Set();\n private scrollHeight = 0;\n private containerHeight = -1;\n private scrollTop: number = 0;\n private scrollPageOffset: number = 0;\n private scrollDirty = true;\n private scrollInteractionFixTimer: ReturnType<typeof setTimeout> | undefined;\n private pointerEventsDisabled = false;\n private codeOverflowFix = false;\n private height: number = 0;\n private heightDirty = true;\n private windowSpecs: VirtualWindowSpecs = { top: 0, bottom: 0 };\n private renderState = {\n scrollTop: -1,\n firstIndex: -1,\n lastIndex: -1,\n stickyHeight: 0,\n stickyTop: -1,\n stickyBottom: -1,\n };\n private itemMetricsCache: VirtualFileMetrics = DEFAULT_CODE_VIEW_FILE_METRICS;\n // Pending scroll target, either instant or smooth. The next render cycle\n // will attempt to resolve it's position instantly or as part of a dynamic\n // animation.\n //\n // - 'item' / 'line' targets stay here until isPendingTargetSettled returns\n // true. Their destination top is re-derived from live layout every frame,\n // absorbing async measurement (annotations, line wrap) that shifts the\n // target mid-flight.\n // - 'position' targets settle on the first frame that applies their\n // scrollTop — there is no layout-dependent destination to chase.\n private pendingScrollTarget: PendingScrollTarget | undefined;\n private pendingLayoutAnchor: ScrollAnchor | undefined;\n\n // Active smooth-scroll animation state. Only populated while a scrollTo\n // with `behavior: 'smooth'` is in flight; cleared on settle (position +\n // velocity within epsilon of the destination) or on user-input abort.\n //\n // - position: current interpolated scrollTop, in CSS pixels.\n // - velocity: rate of change, in CSS pixels per millisecond.\n // - lastTimestamp: High Resolution Time (same clock as RAF timestamps)\n // of the previous integration step.\n private scrollAnimation: ScrollToAnimation | undefined;\n\n private root: HTMLElement | undefined;\n private resizeObserver: ResizeObserver | undefined;\n\n private container: HTMLDivElement | undefined = document.createElement('div');\n private stickyContainer = document.createElement('div');\n private stickyOffset = document.createElement('div');\n private elementPool: HTMLElement[] = [];\n // Container-managed elements may still have externally-owned light DOM slot\n // children after release, so hold them here until they are safe to reuse.\n // i.e. the react CodeView component will require a separate react cleanup\n // phase that we don't want to interrupt\n private pendingElementPool: HTMLElement[] = [];\n private options: CodeViewOptions<LAnnotation>;\n private workerManager: WorkerPoolManager | undefined;\n private isContainerManaged: boolean;\n\n constructor(\n options: CodeViewOptions<LAnnotation> = { theme: DEFAULT_THEMES },\n workerManager?: WorkerPoolManager | undefined,\n isContainerManaged = false\n ) {\n this.options = options;\n this.computeMetricsCache(options.itemMetrics);\n this.workerManager = workerManager;\n this.isContainerManaged = isContainerManaged;\n\n this.stickyOffset.style.contain = 'layout size';\n this.stickyContainer.style.position = 'sticky';\n this.stickyContainer.style.width = '100%';\n this.stickyContainer.style.contain = 'layout style inline-size';\n this.stickyContainer.style.isolation = 'isolate';\n this.stickyContainer.style.display = 'flex';\n this.stickyContainer.style.flexDirection = 'column';\n }\n\n private getLayout(): CodeViewLayout {\n return this.options.layout ?? DEFAULT_CODE_VIEW_LAYOUT;\n }\n\n private computeMetricsCache(\n itemMetrics: Partial<VirtualFileMetrics> | undefined\n ): VirtualFileMetrics {\n this.itemMetricsCache = {\n hunkLineCount:\n itemMetrics?.hunkLineCount ??\n DEFAULT_CODE_VIEW_FILE_METRICS.hunkLineCount,\n lineHeight:\n itemMetrics?.lineHeight ?? DEFAULT_CODE_VIEW_FILE_METRICS.lineHeight,\n diffHeaderHeight:\n itemMetrics?.diffHeaderHeight ??\n DEFAULT_CODE_VIEW_FILE_METRICS.diffHeaderHeight,\n hunkSeparatorHeight: itemMetrics?.hunkSeparatorHeight,\n spacing: itemMetrics?.spacing ?? DEFAULT_CODE_VIEW_FILE_METRICS.spacing,\n paddingTop: itemMetrics?.paddingTop,\n paddingBottom: itemMetrics?.paddingBottom,\n };\n return this.itemMetricsCache;\n }\n\n private getSmoothScrollSettings(): SmoothScrollSettings {\n return this.options.smoothScrollSettings ?? DEFAULT_SMOOTH_SCROLL_SETTINGS;\n }\n\n private shouldDisablePointerEvents(): boolean {\n return this.options.pointerEventsOnScroll !== true;\n }\n\n private shouldValidateItemHeights(): boolean {\n return (\n DIFFS_DEVELOPMENT_BUILD &&\n this.options.__devOnlyValidateItemHeights === true\n );\n }\n\n private validateRenderedItemHeight(\n item: CodeViewContextItem<LAnnotation>\n ): void {\n if (!this.shouldValidateItemHeights() || item.element == null) {\n return;\n }\n\n const stickySpecs = item.instance.getAdvancedStickySpecs();\n if (stickySpecs == null) {\n return;\n }\n\n const expectedHeight = stickySpecs.height;\n const actualHeight = item.element.getBoundingClientRect().height;\n\n if (expectedHeight === actualHeight) {\n return;\n }\n\n console.error(\n 'CodeView: reconciled item height does not match DOM height',\n {\n id: item.item.id,\n type: item.type,\n index: item.index,\n version: item.version,\n expectedHeight,\n actualHeight,\n delta: actualHeight - expectedHeight,\n stickyTopOffset: stickySpecs.topOffset,\n virtualizedHeight: item.instance.getVirtualizedHeight(),\n top: item.top,\n scrollTop: this.getScrollTop(),\n windowSpecs: { ...this.windowSpecs },\n element: item.element,\n instance: item.instance,\n }\n );\n }\n\n private clearScrollInteractionTimer(): void {\n if (this.scrollInteractionFixTimer != null) {\n clearTimeout(this.scrollInteractionFixTimer);\n this.scrollInteractionFixTimer = undefined;\n }\n }\n\n private suspendScrollInteractions(): void {\n this.clearScrollInteractionTimer();\n\n if (this.shouldDisablePointerEvents() && !this.pointerEventsDisabled) {\n this.stickyContainer.style.pointerEvents = 'none';\n this.pointerEventsDisabled = true;\n }\n\n // This is a really important fix for mobile safari; under aggressive scroll\n // conditions we'll eventually crash/reload the page. It appears to be\n // caused by the fact that the code wrapper elements are horizontally\n // scrollable, so while aggressively scrolling, we disable scrolling. We\n // don't want to apply this fix to good browsers since in those cases it\n // can fuck with layout in ways that aren't appropriate\n if (MOBILE_SAFARI && !this.codeOverflowFix) {\n this.stickyContainer.style.setProperty(\n SCROLLING_CODE_OVERFLOW_FIX_VARIABLE,\n 'hidden'\n );\n this.codeOverflowFix = true;\n }\n\n this.scrollInteractionFixTimer = setTimeout(\n this.restoreScrollInteractions,\n DEFAULT_SCROLL_INTERACTION_RESTORE_DELAY_MS\n );\n }\n\n private restoreScrollInteractions = (): void => {\n this.clearScrollInteractionTimer();\n\n if (this.pointerEventsDisabled) {\n this.stickyContainer.style.removeProperty('pointer-events');\n this.pointerEventsDisabled = false;\n }\n\n if (this.codeOverflowFix) {\n this.stickyContainer.style.setProperty(\n SCROLLING_CODE_OVERFLOW_FIX_VARIABLE,\n 'auto'\n );\n this.codeOverflowFix = false;\n }\n };\n\n private syncLayout(): void {\n const { gap, paddingBottom, paddingTop } = this.getLayout();\n this.stickyContainer.style.gap = `${gap}px`;\n this.container?.style.setProperty('margin-top', `${paddingTop}px`);\n this.container?.style.setProperty('margin-bottom', `${paddingBottom}px`);\n }\n\n public setup(root: HTMLElement): void {\n if (this.root != null) {\n throw new Error('CodeView.setup: already setup');\n }\n this.root = root;\n this.root.style.overflowAnchor = 'none';\n this.container ??= document.createElement('div');\n // NOTE(amadeus): We can't put `size` in here or it breaks\n // Firefox's sticky headers\n this.container.style.contain = 'layout style';\n this.syncLayout();\n this.container.appendChild(this.stickyOffset);\n this.container.appendChild(this.stickyContainer);\n this.root.appendChild(this.container);\n this.scrollDirty = true;\n this.heightDirty = true;\n this.resizeObserver = new ResizeObserver(this.handleResize);\n this.resizeObserver.observe(this.stickyContainer);\n this.root.addEventListener('scroll', this.handleScroll, {\n passive: true,\n });\n // Any user-driven scroll intent cancels an in-flight programmatic scroll.\n // pointerdown catches scrollbar drag (the scrollbar belongs to root);\n // wheel / touchstart cover trackpad + touch scroll; keydown covers arrow\n // keys, PgUp/PgDn, Home/End on a focused scroll container.\n this.root.addEventListener('wheel', this.clearPendingScroll, {\n passive: true,\n });\n this.root.addEventListener('touchstart', this.clearPendingScroll, {\n passive: true,\n });\n this.root.addEventListener('pointerdown', this.clearPendingScroll, {\n passive: true,\n });\n this.root.addEventListener('keydown', this.clearPendingScroll, {\n passive: true,\n });\n this.resizeObserver.observe(this.root);\n this.render(true);\n\n // FIXME(amadeus): Remove me before release\n window.__INSTANCE = this;\n // Test code to bring back in if needed\n // window.__CODE_VIEW_SCROLL_BEFORE_REBASE = (pixelsBefore = 1_000) => {\n // const target = this.clampScrollTop(\n // this.scrollPageOffset + SCROLL_REBASE_THRESHOLD - pixelsBefore\n // );\n // this.scrollTo({\n // type: 'position',\n // position: target,\n // behavior: 'instant',\n // });\n // };\n window.__TOGGLE = () => {\n if (CodeView.__STOP) {\n CodeView.__STOP = false;\n this.scrollTo({\n type: 'position',\n position: CodeView.__lastScrollPosition,\n behavior: 'instant',\n });\n } else {\n CodeView.__lastScrollPosition = this.getScrollTop();\n CodeView.__STOP = true;\n }\n };\n }\n\n public reset(): void {\n this.restoreScrollInteractions();\n this.cleanAllRenderedItems();\n this.selectedLines = null;\n this.items.length = 0;\n this.idToItem.clear();\n this.instanceToItem.clear();\n this.layoutDirtyIndex = undefined;\n this.stickyContainer.textContent = '';\n this.stickyOffset.style.height = '';\n this.container?.style.removeProperty('height');\n this.containerHeight = -1;\n this.windowSpecs = { top: 0, bottom: 0 };\n this.pendingLayoutAnchor = undefined;\n this.height = 0;\n this.scrollTop = 0;\n this.scrollPageOffset = 0;\n this.scrollHeight = 0;\n this.scrollDirty = true;\n this.heightDirty = true;\n this.resetRenderState();\n // NOTE(amadeus): Container managed CodeView controls when flushing\n // occurs. This is mostly to make imperative vanilla js api easier to work\n // with\n if (!this.isContainerManaged) {\n this.flushSlotCoordinator();\n }\n }\n\n public cleanUp(): void {\n this.reset();\n this.clearElementPool();\n this.restoreScrollInteractions();\n this.resizeObserver?.disconnect();\n this.resizeObserver = undefined;\n this.root?.removeEventListener('scroll', this.handleScroll);\n this.root?.removeEventListener('wheel', this.clearPendingScroll);\n this.root?.removeEventListener('touchstart', this.clearPendingScroll);\n this.root?.removeEventListener('pointerdown', this.clearPendingScroll);\n this.root?.removeEventListener('keydown', this.clearPendingScroll);\n this.root?.style.removeProperty('overflow-anchor');\n this.container?.remove();\n this.stickyOffset.remove();\n this.stickyContainer.remove();\n this.stickyContainer.textContent = '';\n this.root = undefined;\n this.container = undefined;\n }\n\n private cleanAllRenderedItems() {\n if (this.renderState.firstIndex === -1) {\n return;\n }\n for (\n let index = this.renderState.firstIndex;\n index <= this.renderState.lastIndex;\n index++\n ) {\n const item = this.items[index];\n if (item == null) {\n throw new Error(\n `CodeView.cleanAllRenderedItems: Item does not exist at index: ${index}`\n );\n }\n this.releaseRenderedItem(item);\n }\n }\n\n private primeScrollTarget(target: PendingScrollTarget): void {\n if (target.type === 'position') return;\n\n const item = this.idToItem.get(target.id);\n if (item == null) return;\n\n item.instance.primeHighlightCache();\n }\n\n private acquireElement(): HTMLElement {\n this.promotePendingPooledElements();\n return this.elementPool.pop() ?? document.createElement(DIFFS_TAG_NAME);\n }\n\n private releaseRenderedItem(item: CodeViewContextItem<LAnnotation>): void {\n const { element } = item;\n item.instance.cleanUp(true);\n item.element = undefined;\n if (element == null) {\n return;\n }\n\n element.remove();\n this.cleanElementForPool(element);\n this.queueElementForPool(element);\n }\n\n // Strip item-specific DOM while keeping the expensive shared shell assets\n // that are valid for every item in this CodeView until shared options change.\n private cleanElementForPool(element: HTMLElement): void {\n const { shadowRoot } = element;\n if (shadowRoot != null) {\n for (const child of Array.from(shadowRoot.children)) {\n if (!isPooledShadowChild(child)) {\n child.remove();\n }\n }\n }\n\n if (!this.isContainerManaged) {\n element.replaceChildren();\n }\n }\n\n private queueElementForPool(element: HTMLElement): void {\n if (this.getElementPoolSize() >= CODE_VIEW_ELEMENT_POOL_LIMIT) {\n return;\n }\n\n if (this.isElementClean(element)) {\n this.elementPool.push(element);\n } else {\n this.pendingElementPool.push(element);\n }\n }\n\n private promotePendingPooledElements(): void {\n if (this.pendingElementPool.length === 0) {\n return;\n }\n\n const { pendingElementPool: pendingElements } = this;\n this.pendingElementPool = [];\n for (const element of pendingElements) {\n if (\n this.isElementClean(element) &&\n this.elementPool.length < CODE_VIEW_ELEMENT_POOL_LIMIT\n ) {\n this.elementPool.push(element);\n } else if (this.getElementPoolSize() < CODE_VIEW_ELEMENT_POOL_LIMIT) {\n this.pendingElementPool.push(element);\n }\n }\n }\n\n private isElementClean(element: HTMLElement): boolean {\n return element.childNodes.length === 0;\n }\n\n private getElementPoolSize(): number {\n return this.elementPool.length + this.pendingElementPool.length;\n }\n\n private clearElementPool(): void {\n this.elementPool.length = 0;\n this.pendingElementPool.length = 0;\n }\n\n private resolveEffectiveScrollBehavior(\n target: CodeViewScrollTarget,\n destination: number\n ): Exclude<CodeViewScrollBehavior, 'smooth-auto'> {\n if (prefersReducedMotion()) {\n return 'instant';\n }\n\n if (target.behavior !== 'smooth-auto') {\n return target.behavior ?? 'instant';\n }\n\n return Math.abs(destination - this.getScrollTop()) <= this.getHeight() * 10\n ? 'smooth'\n : 'instant';\n }\n\n public scrollTo(target: CodeViewScrollTarget): void {\n if (this.root == null) {\n return;\n }\n\n const pendingTarget = this.normalizeScrollTarget(target);\n if (pendingTarget == null) {\n return;\n }\n\n const destination = this.resolveScrollTargetTop(pendingTarget);\n if (destination == null) {\n return;\n }\n\n this.primeScrollTarget(pendingTarget);\n\n const behavior = this.resolveEffectiveScrollBehavior(\n pendingTarget,\n destination\n );\n if (behavior === 'smooth') {\n // Use ??= so if we have an animation in progress it will be smoothly\n // transitioned into the new target and not reset\n this.scrollAnimation ??= {\n position: this.getScrollTop(),\n velocity: 0,\n // Since we kick off a render to requestAnimationFrame, by initializing\n // lastTimestamp as performance.now() it means we can begin animating\n // on the next render call and not wait a frame to get frame time\n lastTimestamp: performance.now(),\n };\n } else {\n this.scrollAnimation = undefined;\n }\n\n // We'll attempt to scroll to this new target on the next render frame\n this.suspendScrollInteractions();\n this.pendingLayoutAnchor = undefined;\n this.pendingScrollTarget = pendingTarget;\n this.render();\n }\n\n public setSelectedLines(\n selection: CodeViewLineSelection | null,\n options?: SelectionWriteOptions\n ): void {\n this.applySelectedLines(selection, options);\n }\n\n public getSelectedLines(): CodeViewLineSelection | null {\n return this.selectedLines;\n }\n\n public clearSelectedLines(options?: SelectionWriteOptions): void {\n this.applySelectedLines(null, options);\n }\n\n public getItem(itemId: string): CodeViewItem<LAnnotation> | undefined {\n return this.idToItem.get(itemId)?.item;\n }\n\n public updateItem(input: CodeViewItem<LAnnotation>): boolean {\n const item = this.idToItem.get(input.id);\n if (item == null) {\n console.error(`CodeView.updateItem: unknown item id \"${input.id}\"`);\n return false;\n }\n\n if (!this.syncItemRecord(item, input)) {\n return false;\n }\n\n this.markItemLayoutDirty(item);\n this.scrollDirty = true;\n this.render();\n this.syncSelection();\n return true;\n }\n\n public updateItemId(oldId: string, newId: string): boolean {\n if (oldId === newId) {\n return true;\n }\n\n const item = this.idToItem.get(oldId);\n if (item == null) {\n console.error(`CodeView.updateItemId: unknown item id \"${oldId}\"`);\n return false;\n }\n\n if (this.idToItem.has(newId)) {\n console.error(`CodeView.updateItemId: duplicate item id \"${newId}\"`);\n return false;\n }\n\n this.idToItem.delete(oldId);\n item.item.id = newId;\n this.idToItem.set(newId, item);\n if (item.type === 'diff') {\n item.instance.setOptions(this.createOptions(item.item));\n } else {\n item.instance.setOptions(this.createOptions(item.item));\n }\n\n if (this.selectedLines?.id === oldId) {\n this.selectedLines = { ...this.selectedLines, id: newId };\n this.options.onSelectedLinesChange?.(this.selectedLines);\n }\n this.renamePendingScrollTarget(oldId, newId);\n this.renamePendingLayoutAnchor(oldId, newId);\n this.render();\n return true;\n }\n\n public addItem(input: CodeViewItem<LAnnotation>): void {\n this.addItems([input]);\n this.syncSelection();\n }\n\n public addItems(inputs: readonly CodeViewItem<LAnnotation>[]): void {\n this.appendItemsInternal(inputs);\n this.syncSelection();\n }\n\n public setItems(items: readonly CodeViewItem<LAnnotation>[]): void {\n if (items.length === 0) {\n this.reset();\n } else if (this.items.length === 0) {\n this.appendItemsInternal(items);\n } else if (!this.tryAppendItems(items)) {\n this.reconcileItems(items);\n }\n this.syncSelection();\n }\n\n /**\n * Append new records to the viewer while preserving existing layout state.\n * This is the shared path for imperative adds and the append-only reconcile\n * fast path, so it measures new items immediately and only triggers render\n * once at the end.\n */\n private appendItemsInternal(\n inputs: readonly CodeViewItem<LAnnotation>[],\n render = true\n ): void {\n if (inputs.length === 0) {\n return;\n }\n\n const layout = this.getLayout();\n let nextTop = this.items.length === 0 ? 0 : this.scrollHeight + layout.gap;\n const appendedTop = nextTop;\n for (let index = 0; index < inputs.length; index++) {\n const input = inputs[index];\n if (input == null) {\n throw new Error('CodeView.appendItemsInternal: missing input item');\n }\n if (this.idToItem.has(input.id)) {\n throw new Error(`CodeView.addItem: duplicate id \"${input.id}\"`);\n }\n\n const item = this.createItem(input, this.items.length, nextTop);\n this.items.push(item);\n this.idToItem.set(item.item.id, item);\n this.instanceToItem.set(item.instance, item);\n item.height = prepareItemInstance(item);\n nextTop += item.height + layout.gap;\n }\n\n this.scrollHeight = nextTop - layout.gap;\n this.scrollDirty = true;\n if (render) {\n if (this.canSkipRenderForAppend(appendedTop)) {\n this.syncContainerHeight();\n } else {\n this.render();\n }\n }\n }\n\n private canSkipRenderForAppend(appendedTop: number): boolean {\n return (\n this.container != null &&\n this.renderState.firstIndex !== -1 &&\n this.pendingScrollTarget == null &&\n this.scrollAnimation == null &&\n this.layoutDirtyIndex == null &&\n appendedTop > this.windowSpecs.bottom\n );\n }\n\n public setOptions(options: CodeViewOptions<LAnnotation> | undefined): void {\n if (options == null) {\n return;\n }\n\n this.capturePendingLayoutAnchor();\n const previousLayout = this.getLayout();\n const { itemMetricsCache: previousItemMetrics } = this;\n\n if (shouldClearPool(this.options, options)) {\n this.clearElementPool();\n }\n // NOTE(amadeus): This is also something that's probably ridiculously\n // expensive to pull off, and we should probably figure out some way to\n // incrementally version/render stuff\n this.options = options;\n const nextItemMetrics = this.computeMetricsCache(options.itemMetrics);\n const itemMetricsChanged = !areObjectsEqual(\n previousItemMetrics,\n nextItemMetrics\n );\n if (!areObjectsEqual(previousLayout, this.getLayout())) {\n this.syncLayout();\n }\n for (let index = 0; index < this.items.length; index++) {\n const item = this.items[index];\n if (item == null) {\n throw new Error('CodeView.setOptions: invalid item index');\n }\n\n if (itemMetricsChanged) {\n item.instance.setMetrics(nextItemMetrics, true);\n }\n if (item.type === 'diff') {\n item.instance.setOptions(this.createOptions(item.item));\n } else {\n item.instance.setOptions(this.createOptions(item.item));\n }\n }\n\n this.markLayoutDirtyFromIndex(0);\n this.scrollDirty = true;\n if (!this.isContainerManaged && this.items.length > 0) {\n this.render();\n }\n }\n\n private capturePendingLayoutAnchor(): void {\n if (\n this.root == null ||\n this.items.length === 0 ||\n this.pendingScrollTarget != null\n ) {\n return;\n }\n\n this.pendingLayoutAnchor = this.getScrollAnchor(this.getScrollTop());\n }\n\n public render(immediate = false): void {\n if (CodeView.__STOP) {\n return;\n }\n if (immediate) {\n dequeueRender(this.computeRenderRangeAndEmit);\n this.computeRenderRangeAndEmit();\n } else {\n queueRender(this.computeRenderRangeAndEmit);\n }\n }\n\n public instanceChanged(\n instance: VirtualizedFile<LAnnotation> | VirtualizedFileDiff<LAnnotation>,\n layoutDirty: boolean\n ): void {\n // NOTE(amadeus): This is technically broken at the moment. What we\n // probably SHOULD do to fix is, it push the instance to some sort of\n // instance changed set, then iterate through all items and re-compute\n // everything to get new tops?\n const item = this.instanceToItem.get(instance);\n if (item == null) {\n throw new Error(\n 'CodeView.instanceChanged: An instance has changed that is not registered'\n );\n }\n if (layoutDirty) {\n this.markItemLayoutDirty(item);\n }\n this.render();\n }\n\n public getWindowSpecs(): VirtualWindowSpecs {\n return this.windowSpecs;\n }\n\n public getContainerElement(): HTMLElement | undefined {\n return this.root;\n }\n\n public getRenderedItems(): CodeViewRenderedItem<LAnnotation>[] {\n const { firstIndex, lastIndex } = this.renderState;\n if (firstIndex === -1 || lastIndex === -1 || lastIndex < firstIndex) {\n return [];\n }\n\n const renderedItems: CodeViewRenderedItem<LAnnotation>[] = [];\n\n for (let index = firstIndex; index <= lastIndex; index++) {\n const item = this.items[index];\n if (item?.element == null) {\n continue;\n }\n\n if (item.type === 'diff') {\n renderedItems.push({\n id: item.item.id,\n type: 'diff',\n item: item.item,\n version: item.version,\n element: item.element,\n instance: item.instance,\n });\n } else {\n renderedItems.push({\n id: item.item.id,\n type: 'file',\n item: item.item,\n version: item.version,\n element: item.element,\n instance: item.instance,\n });\n }\n }\n\n return renderedItems;\n }\n\n public setSlotCoordinator(\n coordinator?: CodeViewCoordinator<LAnnotation>\n ): boolean {\n if (coordinator === this.slotCoordinator) {\n return false;\n }\n this.slotCoordinator = coordinator;\n this.slotSnapshot = undefined;\n return true;\n }\n\n public getSlotSnapshot(\n coordinator: CodeViewCoordinator<LAnnotation>\n ): CodeViewRenderedItem<LAnnotation>[] | undefined {\n return getSlotSnapshot(this.getRenderedItems(), coordinator);\n }\n\n public subscribeToScroll(\n listener: CodeViewScrollListener<LAnnotation>\n ): () => void {\n this.scrollListeners.add(listener);\n return () => {\n this.scrollListeners.delete(listener);\n };\n }\n\n public getLocalTopForInstance(\n instance: VirtualizedFile<LAnnotation> | VirtualizedFileDiff<LAnnotation>\n ): number {\n const item = this.instanceToItem.get(instance);\n if (item == null) {\n throw new Error(\n 'CodeView.getLocalTopForInstance: unknown virtualized instance'\n );\n }\n return item.top;\n }\n\n public getTopForItem(id: string): number | undefined {\n const item = this.idToItem.get(id);\n if (item == null) {\n return undefined;\n }\n return item.top + this.getLayout().paddingTop;\n }\n\n private createItem(\n input: CodeViewItem<LAnnotation>,\n index: number,\n top: number\n ): CodeViewContextItem<LAnnotation> {\n const { itemMetricsCache: itemMetrics } = this;\n if (input.type === 'diff') {\n return {\n type: 'diff',\n item: input,\n version: input.version,\n index,\n instance: new VirtualizedFileDiff<LAnnotation>(\n this.createOptions(input),\n this,\n itemMetrics,\n this.workerManager,\n this.isContainerManaged\n ),\n top,\n height: 0,\n element: undefined,\n } satisfies CodeViewDiffItemContext<LAnnotation>;\n }\n\n return {\n type: 'file',\n item: input,\n version: input.version,\n index,\n instance: new VirtualizedFile<LAnnotation>(\n this.createOptions(input),\n this,\n itemMetrics,\n this.workerManager,\n this.isContainerManaged\n ),\n top,\n height: 0,\n element: undefined,\n } satisfies CodeViewFileItemContext<LAnnotation>;\n }\n\n private getItemById(\n itemId: string\n ): CodeViewContextItem<LAnnotation> | undefined {\n const item = this.idToItem.get(itemId);\n if (item == null) {\n console.error(`CodeView.getItemById: unknown item id \"${itemId}\"`);\n }\n return item;\n }\n\n private getItemByMode<TMode extends CodeViewMode>(\n itemId: string,\n mode: TMode\n ): CodeViewModeItemContext<LAnnotation, TMode> | undefined {\n const item = this.getItemById(itemId);\n if (item == null) {\n return undefined;\n }\n if (item.type !== mode) {\n console.error(\n `CodeView.getItemByMode: item id \"${itemId}\" is not a ${mode}`\n );\n return undefined;\n }\n return item as CodeViewModeItemContext<LAnnotation, TMode>;\n }\n\n private applySelectedLines(\n selection: CodeViewLineSelection | null,\n options?: SelectionWriteOptions\n ): void {\n const { selectedLines: prevSelection } = this;\n if (\n (selection == null && prevSelection == null) ||\n (selection != null &&\n prevSelection?.id === selection.id &&\n areSelectionsEqual(prevSelection.range, selection.range))\n ) {\n return;\n }\n\n // If we are selecting a new element and had a previous selection, null out\n // the current selection, otherwise if it's a selection on the same item\n // the next selection will take care of that for us\n if (prevSelection != null && prevSelection.id !== selection?.id) {\n this.idToItem\n .get(prevSelection.id)\n ?.instance.setSelectedLines(null, { notify: false });\n }\n\n this.selectedLines = selection;\n this.idToItem\n .get(selection?.id ?? '')\n ?.instance.setSelectedLines(selection?.range ?? null, options);\n }\n\n private syncSelection(): void {\n if (this.selectedLines == null) {\n return;\n }\n\n const item = this.idToItem.get(this.selectedLines.id);\n if (item == null) {\n this.selectedLines = null;\n return;\n }\n\n item.instance.setSelectedLines(this.selectedLines.range, { notify: false });\n }\n\n private renamePendingScrollTarget(oldId: string, newId: string): void {\n const { pendingScrollTarget } = this;\n if (\n pendingScrollTarget == null ||\n pendingScrollTarget.type === 'position' ||\n pendingScrollTarget.id !== oldId\n ) {\n return;\n }\n\n this.pendingScrollTarget = { ...pendingScrollTarget, id: newId };\n }\n\n private renamePendingLayoutAnchor(oldId: string, newId: string): void {\n if (this.pendingLayoutAnchor?.id === oldId) {\n this.pendingLayoutAnchor.id = newId;\n }\n }\n\n private wrapCallbackWithContext<\n TMode extends CodeViewMode,\n TArgs extends unknown[],\n TResult,\n >(\n mode: TMode,\n itemId: string,\n callback: (\n ...args: [...TArgs, CodeViewModeItemContext<LAnnotation, TMode>]\n ) => TResult\n ): (...args: TArgs) => TResult | undefined {\n return (...args: TArgs) => {\n const item = this.getItemByMode(itemId, mode);\n if (item == null) {\n return undefined;\n }\n return callback(...args, item);\n };\n }\n\n private getWrappedOptionCallback<\n TMode extends CodeViewMode,\n TKey extends CodeViewSharedCallbackKeys,\n >(\n mode: TMode,\n key: TKey,\n itemId: string\n ): CodeViewModeOptions<LAnnotation, TMode>[TKey] | undefined {\n const callback = this.options[key] as\n | CodeViewModeOptionCallback<LAnnotation, TMode, TKey>\n | undefined;\n if (callback == null) {\n return undefined;\n }\n return this.wrapCallbackWithContext(\n mode,\n itemId,\n callback as CodeViewModeInternalOptionCallback<LAnnotation, TMode, TKey>\n ) as CodeViewModeOptions<LAnnotation, TMode>[TKey] | undefined;\n }\n\n private getWrappedSelectionOptionCallback<\n TMode extends CodeViewMode,\n TKey extends CodeViewSelectionCallbackKeys,\n >(\n mode: TMode,\n key: TKey,\n itemId: string\n ): CodeViewModeOptions<LAnnotation, TMode>[TKey] | undefined {\n if (this.options.enableLineSelection !== true) {\n return undefined;\n }\n const callback = this.options[key] as\n | ((\n range: SelectedLineRange | null,\n context: CodeViewModeItemContext<LAnnotation, TMode>\n ) => unknown)\n | undefined;\n return ((range: SelectedLineRange | null) => {\n const item = this.getItemByMode(itemId, mode);\n if (item == null) {\n return undefined;\n }\n const selection = range == null ? null : { id: itemId, range };\n if (this.options.controlledSelection !== true) {\n if (range != null || this.selectedLines?.id === itemId) {\n this.applySelectedLines(selection, { notify: false });\n }\n }\n this.options.onSelectedLinesChange?.(selection);\n return callback?.(range, item);\n }) as CodeViewModeOptions<LAnnotation, TMode>[TKey] | undefined;\n }\n\n private createOptions(\n item: CodeViewFileItem<LAnnotation>\n ): FileOptions<LAnnotation>;\n private createOptions(\n item: CodeViewDiffItem<LAnnotation>\n ): FileDiffOptions<LAnnotation>;\n private createOptions(\n item: CodeViewItem<LAnnotation>\n ): FileOptions<LAnnotation> | FileDiffOptions<LAnnotation> {\n const { id: itemId, type: mode } = item;\n const options =\n mode === 'file'\n ? ({\n stickyHeader: this.options.stickyHeaders,\n } satisfies FileOptions<LAnnotation>)\n : ({\n stickyHeader: this.options.stickyHeaders,\n hunkSeparators: this.options.hunkSeparators,\n } satisfies FileDiffOptions<LAnnotation>);\n // NOTE(amadeus): Hacks on hacks...\n const target = options as Record<string, unknown>;\n const passThroughKeys =\n mode === 'file' ? CODE_VIEW_FILE_OPTION_KEYS : CODE_VIEW_DIFF_OPTION_KEYS;\n\n for (const key of passThroughKeys) {\n const value = this.options[key];\n if (value !== undefined) {\n target[key] = value;\n }\n }\n target.collapsed = item.collapsed === true;\n\n for (const key of CODE_VIEW_SHARED_CALLBACK_KEYS) {\n const callback = this.getWrappedOptionCallback(mode, key, itemId);\n if (callback !== undefined) {\n target[key] = callback;\n }\n }\n\n for (const key of CODE_VIEW_SELECTION_CALLBACK_KEYS) {\n const callback = this.getWrappedSelectionOptionCallback(\n mode,\n key,\n itemId\n );\n if (callback !== undefined) {\n target[key] = callback;\n }\n }\n\n return options;\n }\n\n /**\n * Track the earliest index whose measured layout may now be stale. Later\n * render passes relayout from this point forward so we do not have to rebuild\n * positions for the whole list after every change.\n */\n private markLayoutDirtyFromIndex(index: number): void {\n this.layoutDirtyIndex = Math.min(this.layoutDirtyIndex ?? index, index);\n }\n\n /**\n * Mark the earliest affected item as layout-dirty after an imperative change.\n * Each record carries its current array index so this stays O(1) even when\n * the viewer holds a very large number of items.\n */\n private markItemLayoutDirty(item: CodeViewContextItem<LAnnotation>): void {\n if (this.items[item.index] !== item) {\n throw new Error(\n `CodeView.markItemLayoutDirty: unknown item id \"${item.item.id}\"`\n );\n }\n\n this.markLayoutDirtyFromIndex(item.index);\n }\n\n /**\n * Detect the common controlled-update case where the new list simply extends\n * the existing ordered prefix. When that happens we can reuse every current\n * record in place, sync any versioned payload changes, and append only the new\n * tail instead of rebuilding the whole list.\n */\n private tryAppendItems(items: readonly CodeViewItem<LAnnotation>[]): boolean {\n if (items.length <= this.items.length) {\n return false;\n }\n\n for (let index = 0; index < this.items.length; index++) {\n const existingItem = this.items[index];\n if (existingItem == null) {\n throw new Error('CodeView.tryAppendItems: missing existing item');\n }\n const nextItem = items[index];\n if (\n nextItem == null ||\n existingItem.item.id !== nextItem.id ||\n existingItem.type !== nextItem.type\n ) {\n return false;\n }\n }\n\n for (let index = 0; index < this.items.length; index++) {\n const existingItem = this.items[index];\n if (existingItem == null) {\n throw new Error('CodeView.tryAppendItems: missing existing item');\n }\n const nextItem = items[index];\n if (nextItem == null) {\n throw new Error(\n 'CodeView.tryAppendItems: append candidate missing prefix item'\n );\n }\n if (this.syncItemRecord(existingItem, nextItem)) {\n this.markLayoutDirtyFromIndex(index);\n }\n }\n\n this.appendItemsInternal(items.slice(this.items.length), false);\n this.scrollDirty = true;\n this.render();\n return true;\n }\n\n /**\n * Reconcile a new controlled item list against the existing records by id.\n * This reuses records and instances when type matches, cleans up removed\n * records, rebuilds the lookup maps, and marks layout dirty whenever order,\n * membership, or versioned item data changes.\n */\n private reconcileItems(items: readonly CodeViewItem<LAnnotation>[]): void {\n const { items: previousItems, idToItem: previousById } = this;\n const removedItems = new Set(previousItems);\n const nextItems: CodeViewContextItem<LAnnotation>[] = [];\n const nextIdToItem: Map<\n string,\n CodeViewContextItem<LAnnotation>\n > = new Map();\n const nextInstanceToItem: Map<\n VirtualizedFileDiff<LAnnotation> | VirtualizedFile<LAnnotation>,\n CodeViewContextItem<LAnnotation>\n > = new Map();\n let firstDirtyIndex: number | undefined;\n\n for (let index = 0; index < items.length; index++) {\n const input = items[index];\n if (input == null) {\n throw new Error('CodeView.reconcileItems: missing input item');\n }\n if (nextIdToItem.has(input.id)) {\n throw new Error(`CodeView.setItems: duplicate id \"${input.id}\"`);\n }\n\n const previousItem = previousById.get(input.id);\n const item =\n previousItem != null && previousItem.type === input.type\n ? previousItem\n : this.createItem(input, index, 0);\n\n item.index = index;\n\n if (previousItem != null && previousItem.type === input.type) {\n removedItems.delete(previousItem);\n if (this.syncItemRecord(item, input)) {\n firstDirtyIndex = Math.min(firstDirtyIndex ?? index, index);\n }\n } else {\n firstDirtyIndex = Math.min(firstDirtyIndex ?? index, index);\n }\n\n if (previousItems[index] !== item) {\n firstDirtyIndex = Math.min(firstDirtyIndex ?? index, index);\n }\n\n nextItems.push(item);\n nextIdToItem.set(input.id, item);\n nextInstanceToItem.set(item.instance, item);\n }\n\n for (let index = 0; index < previousItems.length; index++) {\n const removedItem = previousItems[index];\n if (removedItem == null || !removedItems.has(removedItem)) {\n continue;\n }\n this.releaseRenderedItem(removedItem);\n const dirtyIndex = Math.max(nextItems.length - 1, 0);\n firstDirtyIndex = Math.min(firstDirtyIndex ?? dirtyIndex, dirtyIndex);\n }\n\n if (firstDirtyIndex == null) {\n return;\n }\n\n this.items = nextItems;\n this.idToItem = nextIdToItem;\n this.instanceToItem = nextInstanceToItem;\n\n if (this.renderState.firstIndex >= nextItems.length) {\n this.resetRenderState();\n } else if (this.renderState.lastIndex >= nextItems.length) {\n this.renderState.lastIndex = nextItems.length - 1;\n }\n\n this.markLayoutDirtyFromIndex(firstDirtyIndex);\n this.scrollDirty = true;\n this.render();\n }\n\n /**\n * Update a reused record from the latest controlled item only when its item\n * version changes. Matching versions mean CodeView keeps the current record\n * snapshot, which lets imperative updates remain in place until the caller\n * intentionally publishes a newer version.\n */\n private syncItemRecord(\n item: CodeViewContextItem<LAnnotation>,\n nextItem: CodeViewItem<LAnnotation>\n ): boolean {\n if (item.type !== nextItem.type) {\n throw new Error(\n `CodeView.syncItemRecord: type mismatch for id \"${nextItem.id}\"`\n );\n }\n\n if (item.version === nextItem.version) {\n return false;\n }\n\n item.item = nextItem;\n item.version = nextItem.version;\n if (item.type === 'diff') {\n item.instance.setOptions(this.createOptions(item.item));\n } else {\n item.instance.setOptions(this.createOptions(item.item));\n }\n return true;\n }\n\n private getMaxScrollTopForHeight(scrollHeight: number): number {\n const { paddingBottom, paddingTop } = this.getLayout();\n return Math.max(\n paddingTop + scrollHeight + paddingBottom - this.getHeight(),\n 0\n );\n }\n\n private getMaxScrollTop(): number {\n return this.getMaxScrollTopForHeight(this.getScrollHeight());\n }\n\n private shouldRebaseScroll(): boolean {\n return this.getMaxScrollTop() > SCROLL_REBASE_THRESHOLD;\n }\n\n private getPagedScrollHeight(): number {\n return this.shouldRebaseScroll()\n ? Math.min(this.getScrollHeight(), SCROLL_REBASE_CONTAINER_HEIGHT)\n : this.getScrollHeight();\n }\n\n private getMaxPagedScrollTop(): number {\n return this.getMaxScrollTopForHeight(this.getPagedScrollHeight());\n }\n\n private clampPagedScrollTop(value: number): number {\n const maxScroll = this.getMaxPagedScrollTop();\n return Math.max(0, Math.min(value, maxScroll));\n }\n\n /**\n * Clamps a logical scroll position to the min/max allowable scroll range\n * based on the full computed content height.\n */\n private clampScrollTop(value: number): number {\n const maxScroll = this.getMaxScrollTop();\n return Math.max(0, Math.min(value, maxScroll));\n }\n\n private getMaxScrollPageOffset(): number {\n return Math.max(this.getMaxScrollTop() - this.getMaxPagedScrollTop(), 0);\n }\n\n private clampScrollPageOffset(value: number): number {\n const maxOffset = this.getMaxScrollPageOffset();\n return Math.max(0, Math.min(value, maxOffset));\n }\n\n private resolveScrollPageWindow(\n scrollTop: number,\n preferredPagedScrollTop: number\n ): { pagedScrollTop: number; scrollPageOffset: number } {\n let pagedScrollTop = roundToDevicePixel(\n this.clampPagedScrollTop(preferredPagedScrollTop)\n );\n let scrollPageOffset = this.clampScrollPageOffset(\n scrollTop - pagedScrollTop\n );\n\n pagedScrollTop = roundToDevicePixel(\n this.clampPagedScrollTop(scrollTop - scrollPageOffset)\n );\n scrollPageOffset = this.clampScrollPageOffset(scrollTop - pagedScrollTop);\n return { pagedScrollTop, scrollPageOffset };\n }\n\n /**\n * Resolve how a logical scrollTop maps onto the reusable paged scroll window\n * without mutating the current page offset.\n */\n private resolvePagedScrollPosition(\n logicalScrollTop: number\n ): PagedScrollPosition {\n if (!this.shouldRebaseScroll()) {\n return {\n pagedScrollTop: this.clampPagedScrollTop(logicalScrollTop),\n scrollPageOffset: 0,\n };\n }\n\n const currentPageOffset = this.clampScrollPageOffset(this.scrollPageOffset);\n\n const pagedScrollTop = logicalScrollTop - currentPageOffset;\n const pagedMaxScrollTop = this.getMaxPagedScrollTop();\n const maxRebaseOffset = this.getMaxScrollPageOffset();\n const shouldMoveDown =\n pagedScrollTop > SCROLL_REBASE_THRESHOLD &&\n currentPageOffset < maxRebaseOffset;\n const shouldMoveUp =\n pagedScrollTop < SCROLL_REBASE_TRIGGER_TOP && currentPageOffset > 0;\n\n if (\n pagedScrollTop < 0 ||\n pagedScrollTop > pagedMaxScrollTop ||\n shouldMoveDown ||\n shouldMoveUp\n ) {\n const nextWindow = this.resolveScrollPageWindow(\n logicalScrollTop,\n shouldMoveUp\n ? Math.min(SCROLL_REBASE_TARGET_BOTTOM, pagedMaxScrollTop)\n : SCROLL_REBASE_TARGET_TOP\n );\n return nextWindow;\n }\n\n return {\n pagedScrollTop: roundToDevicePixel(\n this.clampPagedScrollTop(pagedScrollTop)\n ),\n scrollPageOffset: currentPageOffset,\n };\n }\n\n private needsScrollPageUpdate(logicalScrollTop: number): boolean {\n const roundedScrollTop = roundToDevicePixel(\n this.clampScrollTop(logicalScrollTop)\n );\n const { scrollPageOffset } =\n this.resolvePagedScrollPosition(roundedScrollTop);\n return scrollPageOffset !== this.scrollPageOffset;\n }\n\n private getPagedLayoutTop(logicalTop: number): number {\n if (!this.shouldRebaseScroll()) {\n return logicalTop;\n }\n return Math.max(logicalTop - this.scrollPageOffset, 0);\n }\n\n private getStickyHeaderOffset(): number {\n return this.options.stickyHeaders === true &&\n this.options.disableFileHeader !== true\n ? this.itemMetricsCache.diffHeaderHeight\n : 0;\n }\n\n private getScrollTargetRect(\n target:\n | CodeViewItemScrollTarget\n | CodeViewLineScrollTarget\n | CodeViewRangeScrollTarget\n ): { top: number; height: number } | undefined {\n const item = this.idToItem.get(target.id);\n if (item == null) {\n console.warn(`CodeView.scrollTo: unknown item id \"${target.id}\"`);\n return undefined;\n }\n\n if (target.type === 'item') {\n return { top: item.top, height: item.height };\n }\n\n if (target.type === 'range') {\n const rangePosition = this.getRangeScrollPosition(item, target);\n if (rangePosition == null) {\n console.warn(\n `CodeView.scrollTo: unable to resolve range ${formatSelectedLineRange(target.range)} for item \"${target.id}\"`\n );\n return undefined;\n }\n\n return {\n top: item.top + rangePosition.top,\n height: rangePosition.height,\n };\n }\n\n const linePosition = this.getLineScrollPosition(item, target);\n if (linePosition == null) {\n console.warn(\n `CodeView.scrollTo: unable to resolve line ${target.lineNumber} for item \"${target.id}\"`\n );\n return undefined;\n }\n\n return {\n top: item.top + linePosition.top,\n height: linePosition.height,\n };\n }\n\n private normalizeScrollTarget(\n target: CodeViewScrollTarget\n ): PendingScrollTarget | undefined {\n if (target.type === 'position' || target.align !== 'nearest') {\n return target as PendingScrollTarget;\n }\n\n const rect = this.getScrollTargetRect(target);\n if (rect == null) {\n return undefined;\n }\n\n // Determine a stable scrollTo target for `nearest` alignment. This is to\n // ensure that we don't experience any scroll bouncing\n const offset = target.offset ?? 0;\n const targetTop = this.getLayout().paddingTop + rect.top;\n const targetBottom = targetTop + rect.height;\n const currentTop = this.getScrollTop();\n const visibleTop =\n currentTop +\n (target.type === 'line' || target.type === 'range'\n ? this.getStickyHeaderOffset()\n : 0);\n const visibleBottom = currentTop + this.getHeight();\n\n // If the item is spanning beyond the full viewport,\n // do nothing as it's already in view\n if (\n targetTop - offset <= visibleTop &&\n targetBottom + offset >= visibleBottom\n ) {\n return undefined;\n }\n\n // Let's use the top as the target\n if (targetTop - offset < visibleTop) {\n return { ...target, align: 'start' };\n }\n\n // Let's use the top as the target\n if (targetBottom + offset > visibleBottom) {\n return { ...target, align: 'end' };\n }\n\n // The element is already in view, nothing to do.\n return undefined;\n }\n\n /**\n * Resolve a target's scroll position\n\n * Returns `undefined` when we can't resolve a target for whatever reason\n */\n private resolveScrollTargetTop(\n target: PendingScrollTarget\n ): number | undefined {\n if (target.type === 'position') {\n const clampedPosition = this.clampScrollTop(target.position);\n return clampedPosition !== target.position\n ? // If our position was clamped, we we shouldn't apply the sticky offset\n clampedPosition\n : this.clampScrollTop(target.position - this.getStickyHeaderOffset());\n }\n\n const item = this.idToItem.get(target.id);\n if (item == null) {\n console.warn(`CodeView.scrollTo: unknown item id \"${target.id}\"`);\n return undefined;\n }\n\n if (target.type === 'item') {\n return this.clampScrollTop(\n this.resolveAlignedScrollPosition(\n item.top,\n item.height,\n target.align,\n target.offset\n )\n );\n }\n\n if (target.type === 'range') {\n const rangePosition = this.getRangeScrollPosition(item, target);\n if (rangePosition == null) {\n console.warn(\n `CodeView.scrollTo: unable to resolve range ${formatSelectedLineRange(target.range)} for item \"${target.id}\"`\n );\n return undefined;\n }\n\n return this.clampScrollTop(\n this.resolveAlignedScrollPosition(\n item.top + rangePosition.top,\n rangePosition.height,\n target.align,\n target.offset,\n this.getStickyHeaderOffset()\n )\n );\n }\n\n const linePosition = this.getLineScrollPosition(item, target);\n if (linePosition == null) {\n console.warn(\n `CodeView.scrollTo: unable to resolve line ${target.lineNumber} for item \"${target.id}\"`\n );\n return undefined;\n }\n\n return this.clampScrollTop(\n this.resolveAlignedScrollPosition(\n item.top + linePosition.top,\n linePosition.height,\n target.align,\n target.offset,\n this.getStickyHeaderOffset()\n )\n );\n }\n\n /**\n * Given an existing scroll target (scroll top and height), figure out the\n * correct scroll position to target based on the desired alignment, offset\n * and stickyOffset if necessary\n */\n private resolveAlignedScrollPosition(\n // REVIEW: lets turn this into a named interface object, essentially named\n // arguments that can't be confused/reversed\n targetTop: number,\n targetHeight: number,\n align: PendingAlignTypes,\n offset = 0,\n stickyOffset = 0\n ): number {\n targetTop += this.getLayout().paddingTop;\n const viewportHeight = this.getHeight();\n // If the item + offset is bigger than the viewport, we'll fall back to\n // 'start'\n if (align === 'center' && targetHeight + offset < viewportHeight) {\n return targetTop - (viewportHeight - targetHeight) / 2 + offset;\n }\n if (align === 'end') {\n return targetTop - (viewportHeight - targetHeight) + offset;\n }\n // 'start', the default\n return targetTop - stickyOffset - offset;\n }\n\n private getLineScrollPosition(\n item: CodeViewContextItem<LAnnotation>,\n target: CodeViewLineScrollTarget\n ): LineScrollPosition | undefined {\n if (item.type === 'diff') {\n return item.instance.getLinePosition(target.lineNumber, target.side);\n }\n\n return item.instance.getLinePosition(target.lineNumber);\n }\n\n private getRangeScrollPosition(\n item: CodeViewContextItem<LAnnotation>,\n target: CodeViewRangeScrollTarget\n ): LineScrollPosition | undefined {\n const { range } = target;\n const startPosition = this.getLineScrollPosition(item, {\n type: 'line',\n id: target.id,\n lineNumber: range.start,\n side: range.side,\n });\n const endPosition = this.getLineScrollPosition(item, {\n type: 'line',\n id: target.id,\n lineNumber: range.end,\n side: range.endSide ?? range.side,\n });\n if (startPosition == null || endPosition == null) {\n return undefined;\n }\n\n const startTop = startPosition.top;\n const startBottom = startTop + startPosition.height;\n const endTop = endPosition.top;\n const endBottom = endTop + endPosition.height;\n const top = Math.min(startTop, endTop);\n const bottom = Math.max(startBottom, endBottom);\n return { top, height: bottom - top };\n }\n\n /**\n * Determine target scroll position for current frame.\n *\n * If there's no pendingScrollTarget then we just return the current scroll\n * position\n *\n * If there's a pendingScrollTarget then we depend on whether there's a\n * smooth scroll animation or not. If not just return the destination, or\n * compute next position given the smooth scroll spring physics\n */\n private computeTargetScrollTopForFrame(\n scrollTop: number,\n frameTimestamp: number\n ): number {\n if (this.pendingScrollTarget == null) {\n return scrollTop;\n }\n const destination = this.resolveScrollTargetTop(this.pendingScrollTarget);\n if (destination == null) {\n return scrollTop;\n }\n const { scrollAnimation } = this;\n if (scrollAnimation == null) {\n return destination;\n }\n return this.computeSpringStep(scrollAnimation, destination, frameTimestamp)\n .position;\n }\n\n /**\n * Closed-form critical-damped ODE step.\n *\n * Stable at any dt (Euler would blow up once ω·dt ≳ 1), so this survives\n * big RAF gaps (tab-wake, offscreen frames) and resize-driven ticks that\n * fire outside the normal RAF cadence.\n */\n private computeSpringStep(\n animation: ScrollToAnimation,\n destination: number,\n frameTimestamp: number\n ): SpringStepResult {\n const dt = Math.max(0, frameTimestamp - animation.lastTimestamp);\n const { omega } = this.getSmoothScrollSettings();\n const decay = Math.exp(-omega * dt);\n const displacement = animation.position - destination;\n const springCoeff = animation.velocity + omega * displacement;\n const position = destination + (displacement + springCoeff * dt) * decay;\n const velocity =\n (springCoeff * (1 - omega * dt) - omega * displacement) * decay;\n return { position, velocity };\n }\n\n /**\n * For any given pendingScrollTarget, updates any in flight smooth scroll\n * animations and returns the target scrollTop to move towards\n *\n * Resolves the animation based on frame time and adopts any necessary scroll\n * anchoring corrections if necessary\n */\n private advanceScrollAnimation(\n frameTimestamp: number,\n anchorDelta: number\n ): number | undefined {\n if (this.pendingScrollTarget == null) {\n return undefined;\n }\n const destination = this.resolveScrollTargetTop(this.pendingScrollTarget);\n if (destination == null) {\n this.pendingScrollTarget = undefined;\n this.scrollAnimation = undefined;\n return undefined;\n }\n const animation = this.scrollAnimation;\n if (animation == null) {\n return destination;\n }\n\n animation.position += anchorDelta;\n\n const { position, velocity } = this.computeSpringStep(\n animation,\n destination,\n frameTimestamp\n );\n animation.lastTimestamp = frameTimestamp;\n animation.position = position;\n animation.velocity = velocity;\n\n const { positionEpsilon, velocityEpsilon } = this.getSmoothScrollSettings();\n if (\n Math.abs(destination - position) <= positionEpsilon &&\n Math.abs(velocity) <= velocityEpsilon\n ) {\n animation.position = destination;\n animation.velocity = 0;\n this.scrollAnimation = undefined;\n return destination;\n }\n\n return animation.position;\n }\n\n private computeRenderRangeAndEmit = (\n timestamp: number = performance.now()\n ): void => {\n if (CodeView.__STOP || this.container == null) {\n return;\n }\n\n // Read the current viewport and logical scroll position before making DOM\n // mutations, then capture an anchor that can survive layout recalculation.\n const viewportHeight = this.getHeight();\n const initialScrollTop = this.getScrollTop();\n let scrollTopAfterLayout = initialScrollTop;\n // Typically a pendingLayoutAnchor will be created from a setOptions call,\n // that will force us to attempt to fit to a new scroll position to not\n // allow the viewport to jump around on us. This can also be triggered\n // later on if a particular item marks itself as dirty\n let computeScrollCorrection = this.pendingLayoutAnchor != null;\n // We need to grab the anchor before we re-compute any layout updates, or\n // else we'll get invalid anchor reference data. If we have a\n // pendingLayoutAnchor it will just grab that for us instead of attempting\n // to compute one\n let scrollAnchor = this.getScrollAnchor(scrollTopAfterLayout);\n\n // If any item marked itself as difty, we should re-compute everything\n // after it and then force a new scroll top correction if we aren't already\n if (this.layoutDirtyIndex != null) {\n this.recomputeLayout(this.layoutDirtyIndex);\n this.layoutDirtyIndex = undefined;\n computeScrollCorrection = true;\n }\n\n // If layout shifted, resolve the logical scrollTop that keeps the captured\n // anchor in the same viewport position.\n if (computeScrollCorrection && scrollAnchor != null) {\n const anchoredScrollTopAfterLayout =\n this.resolveAnchoredScrollTop(scrollAnchor);\n if (anchoredScrollTopAfterLayout != null) {\n const layoutAnchorDelta =\n anchoredScrollTopAfterLayout - scrollTopAfterLayout;\n scrollTopAfterLayout = anchoredScrollTopAfterLayout;\n if (this.scrollAnimation != null) {\n // If we have a delta measurement adjustment, we have to pass that\n // change onto the scroll animation to ensure the animation remains\n // stable, later on\n this.scrollAnimation.position += layoutAnchorDelta;\n }\n }\n }\n // Recomputing layout can shrink the scroll range, for example when items\n // collapse, so clamp current scroll position and update DOM so scroll\n // changes are valid before deriving the render window for this frame.\n if (computeScrollCorrection) {\n scrollTopAfterLayout = this.clampScrollTop(scrollTopAfterLayout);\n this.syncContainerHeight();\n }\n\n // Resolve the logical scrollTop this render frame should target. The paged\n // root scrollTop is derived later only if the scaffold needs to move.\n const targetScrollTop = this.computeTargetScrollTopForFrame(\n scrollTopAfterLayout,\n timestamp\n );\n\n // When performing very large scroll jumps, we should attempt to render the\n // bare minimum to ensure we can paint quickly. We'll queue up another\n // render at the end to fill things out on the next tick. If we had to\n // correct layout-adjusted scroll state then we should not fitPerfectly\n // because there's a good chance we'll be re-rendering the same elements\n // again\n const fitPerfectly =\n !computeScrollCorrection &&\n (this.renderState.scrollTop === -1 ||\n Math.abs(targetScrollTop - this.renderState.scrollTop) >\n viewportHeight + this.config.overscrollSize * 2);\n\n // If we are doing a `fitPerfectly` render it means we are rendering\n // completely new content which means no need to scroll fix anything\n if (fitPerfectly) {\n scrollAnchor = undefined;\n }\n\n // Compute the projected logical window, then synchronize the paged scroll\n // scaffold before mutating rendered items.\n this.windowSpecs = createWindowFromScrollPosition({\n scrollTop: targetScrollTop,\n height: viewportHeight,\n scrollHeight: this.getScrollHeight(),\n fitPerfectly,\n fitPerfectlyOverscroll: this.getFitPerfectlyOverscroll(),\n overscrollSize: this.config.overscrollSize,\n });\n let syncedScrollTop = initialScrollTop;\n if (\n (this.pendingScrollTarget != null &&\n targetScrollTop !== syncedScrollTop) ||\n this.needsScrollPageUpdate(targetScrollTop)\n ) {\n // Apply programmatic scrolls and user-driven page rebases before DOM\n // mutations so the browser reconciles the render against the right\n // paged scroll position.\n this.applyScrollFix(targetScrollTop, syncedScrollTop, this.windowSpecs);\n syncedScrollTop = targetScrollTop;\n }\n\n // Reconcile the currently mounted DOM against the new projected render\n // window, cleaning up any elements that are no longer visible.\n const { top, bottom } = this.windowSpecs;\n const { firstIndex, lastIndex } = this.renderState;\n if (firstIndex >= 0) {\n for (let index = firstIndex; index <= lastIndex; index++) {\n const item = this.items[index];\n if (item == null) {\n throw new Error(\n `CodeView.computeRenderRangeAndEmit: No item at index: ${index}`\n );\n }\n const isVisible = item.top > top - item.height && item.top <= bottom;\n // If not visible, we should unmount it and clean it up\n if (!isVisible) {\n this.releaseRenderedItem(item);\n }\n }\n }\n\n let prevElement: HTMLElement | undefined;\n const updatedItems = new Set<CodeViewContextItem<LAnnotation>>();\n const startingIndex = this.findFirstVisibleIndex(top);\n const lastRenderedIndex = this.findLastVisibleIndex(bottom);\n\n for (\n let itemIndex = startingIndex;\n itemIndex <= lastRenderedIndex;\n itemIndex++\n ) {\n const item = this.items[itemIndex];\n if (item == null) {\n throw new Error(`CodeView.computeRenderRangeAndEmit: missing item`);\n }\n const { instance } = item;\n // If the item isn't rendered yet, we need to create a wrapper element\n // for it and render it\n if (item.element == null) {\n item.element = this.acquireElement();\n syncRenderedItemOrder(this.stickyContainer, item.element, prevElement);\n instance.virtualizedSetup();\n if (renderItem(item, item.element)) {\n updatedItems.add(item);\n }\n prevElement = item.element;\n }\n // Otherwise kick off a render as necessary\n else {\n syncRenderedItemOrder(this.stickyContainer, item.element, prevElement);\n if (renderItem(item)) {\n updatedItems.add(item);\n }\n prevElement = item.element;\n }\n }\n\n this.renderState.firstIndex =\n startingIndex <= lastRenderedIndex ? startingIndex : -1;\n this.renderState.lastIndex = lastRenderedIndex;\n\n this.flushSlotCoordinator();\n this.reconcileRenderedItems(updatedItems);\n this.syncContainerHeight();\n this.updateStickyPositioning();\n\n // Now that the dom has been flushed and we've computed our updated\n // item/line metrics, we should attempt to resolve any scroll anchors and\n // scroll animation data. We have already applied the desired scroll\n // position before rendering, so the only scroll changes should be to\n // scrollFix from lines that did not match their computed state.\n //\n // - No pending scrollTo target → Only attempt to scrollFix if there's a\n // mismatch\n // - Instant pending scrollTo target → Resolve target anchor position and\n // apply any necessary scroll fixes\n // - Smooth pending scrollTo target → Apply necessary scrollFix if\n // necessary and rebase/update the outstanding spring animation values.\n const anchoredScrollTopAfterRender =\n scrollAnchor != null\n ? this.resolveAnchoredScrollTop(scrollAnchor)\n : undefined;\n if (scrollAnchor === this.pendingLayoutAnchor) {\n this.pendingLayoutAnchor = undefined;\n }\n // The amount of computed layout shift from the render\n const postRenderAnchorDelta =\n anchoredScrollTopAfterRender != null\n ? anchoredScrollTopAfterRender - scrollTopAfterLayout\n : 0;\n\n let postRenderScrollTop = targetScrollTop;\n let shouldCheckPendingTargetSettled = false;\n if (this.pendingScrollTarget != null) {\n const pendingTargetScrollTop = this.advanceScrollAnimation(\n timestamp,\n postRenderAnchorDelta\n );\n if (pendingTargetScrollTop != null) {\n postRenderScrollTop = pendingTargetScrollTop;\n shouldCheckPendingTargetSettled = true;\n }\n // If something bad happened with our pending scroll target, then we'd\n // fall back here. Unlikely to happen in practice, but we need to reset\n // the scrollTop if so\n else {\n postRenderScrollTop = scrollTopAfterLayout;\n }\n } else {\n postRenderScrollTop = anchoredScrollTopAfterRender ?? targetScrollTop;\n }\n // If the new intended scroll position has changed, we should apply that\n // now to bring everything in line\n if (postRenderScrollTop !== syncedScrollTop) {\n this.applyScrollFix(\n postRenderScrollTop,\n syncedScrollTop,\n this.windowSpecs\n );\n syncedScrollTop = postRenderScrollTop;\n }\n if (\n shouldCheckPendingTargetSettled &&\n this.pendingScrollTarget != null &&\n this.isPendingTargetSettled(this.pendingScrollTarget)\n ) {\n this.pendingScrollTarget = undefined;\n this.scrollAnimation = undefined;\n }\n this.renderState.scrollTop = roundToDevicePixel(syncedScrollTop);\n\n this.flushManagers(updatedItems);\n\n // If we are hitting a fitPerfectly heuristic, we should queue up another\n // render to fill out content. If we are performing a scroll animation we'll\n // need another render to continue.\n if (fitPerfectly || this.scrollAnimation != null) {\n this.render();\n }\n };\n\n private flushManagers(\n updatedItems: Set<CodeViewContextItem<LAnnotation>>\n ): void {\n for (const item of updatedItems) {\n item.instance.flushManagers();\n }\n }\n\n private syncContainerHeight(): void {\n const pagedScrollHeight = this.getPagedScrollHeight();\n if (this.container == null || this.containerHeight === pagedScrollHeight) {\n return;\n }\n\n this.container.style.height = `${pagedScrollHeight}px`;\n this.containerHeight = pagedScrollHeight;\n }\n\n private getStickyBounds(\n windowSpecs?: VirtualWindowSpecs\n ): StickyBounds | undefined {\n const { firstIndex, lastIndex } =\n windowSpecs != null\n ? {\n firstIndex: this.findFirstVisibleIndex(windowSpecs.top),\n lastIndex: this.findLastVisibleIndex(windowSpecs.bottom),\n }\n : this.renderState;\n\n if (firstIndex === -1 || lastIndex === -1 || firstIndex > lastIndex) {\n return undefined;\n }\n const firstStickySpecs =\n this.items[firstIndex]?.instance.getAdvancedStickySpecs(windowSpecs);\n const lastStickySpecs =\n this.items[lastIndex]?.instance.getAdvancedStickySpecs(windowSpecs);\n\n if (firstStickySpecs == null || lastStickySpecs == null) {\n return undefined;\n }\n\n return {\n stickyTop: this.getPagedLayoutTop(\n Math.max(firstStickySpecs.topOffset, 0)\n ),\n stickyBottom: this.getPagedLayoutTop(\n lastStickySpecs.topOffset + lastStickySpecs.height\n ),\n };\n }\n\n private applyStickyPositioning({\n stickyTop,\n stickyBottom,\n }: StickyBounds): void {\n const height = this.getHeight();\n const { itemMetricsCache: itemMetrics } = this;\n const stickyContainerHeight = stickyBottom - stickyTop;\n\n this.renderState.stickyHeight = stickyContainerHeight;\n this.renderState.stickyTop = stickyTop;\n this.renderState.stickyBottom = stickyBottom;\n\n this.stickyOffset.style.height = `${stickyTop}px`;\n // NOTE(amadeus): Wee polish lad -- when dragging the scrollbar up or\n // down quickly, this prevents the laggy scroll view from lining up with\n // the numbers exactly\n const randomOffset = ((Math.random() * itemMetrics.lineHeight) >> 0) * -1;\n const stickyJitter =\n -Math.max(stickyContainerHeight + randomOffset, 0) + height;\n this.stickyContainer.style.top = `${stickyJitter}px`;\n this.stickyContainer.style.bottom = `${stickyJitter + itemMetrics.diffHeaderHeight}px`;\n }\n\n private syncPagedScrollScaffolding(windowSpecs: VirtualWindowSpecs): void {\n this.syncContainerHeight();\n const stickyBounds = this.getStickyBounds(windowSpecs);\n if (stickyBounds == null) {\n return;\n }\n this.applyStickyPositioning(stickyBounds);\n }\n\n private reconcileRenderedItems(\n updatedItems?: Set<CodeViewContextItem<LAnnotation>>\n ): void {\n const { firstIndex, lastIndex } = this.renderState;\n if (firstIndex === -1) {\n return;\n }\n\n let currentTop = -1;\n let heightChanged = false;\n // Iterate through the rendered items to reconcile height. If a height\n // has changed, we'll have to iterate all the way till the end to update\n // all appropriate heights\n for (let index = firstIndex; index < this.items.length; index++) {\n // If we've incurred no height changes and ended, we can abort\n if (!heightChanged && index > lastIndex) {\n break;\n }\n const item = this.items[index];\n if (item == null) {\n throw new Error('CodeView.reconcileRenderedItems: Invalid item');\n }\n if (currentTop === -1) {\n currentTop = item.top;\n } else if (item.top !== currentTop) {\n item.top = currentTop;\n item.instance.syncVirtualizedTop();\n heightChanged = true;\n }\n // If updatedInstances provided, only reconcile those. If not provided\n // (resize path), reconcile all rendered items.\n if (updatedItems == null ? index <= lastIndex : updatedItems.has(item)) {\n if (item.instance.reconcileHeights()) {\n heightChanged = true;\n item.height = item.instance.getVirtualizedHeight();\n }\n this.validateRenderedItemHeight(item);\n }\n currentTop += item.instance.getVirtualizedHeight();\n if (index < this.items.length - 1) {\n currentTop += this.getLayout().gap;\n }\n }\n\n if (heightChanged && currentTop != null) {\n this.scrollDirty = true;\n this.scrollHeight = currentTop;\n }\n }\n\n private updateStickyPositioning(): void {\n const stickyBounds = this.getStickyBounds();\n if (stickyBounds == null) {\n return;\n }\n const { stickyTop, stickyBottom } = stickyBounds;\n const stickyContainerHeight = stickyBottom - stickyTop;\n\n if (\n stickyContainerHeight === this.renderState.stickyHeight &&\n stickyTop === this.renderState.stickyTop &&\n stickyBottom === this.renderState.stickyBottom\n ) {\n return;\n }\n\n this.applyStickyPositioning(stickyBounds);\n }\n\n private handleScroll = (): void => {\n if (CodeView.__STOP) {\n return;\n }\n this.suspendScrollInteractions();\n this.scrollDirty = true;\n this.notifyScroll();\n this.render();\n };\n\n // Abort any in-flight programmatic scroll when the user takes over.\n // Attached to root as a passive listener for wheel / touchstart /\n // pointerdown / keydown; we never mutate the event, just drop our state.\n private clearPendingScroll = (): void => {\n this.pendingScrollTarget = undefined;\n this.pendingLayoutAnchor = undefined;\n this.scrollAnimation = undefined;\n };\n\n private handleResize = (entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n // If the sticky container resizes (could be from a render, which it will\n // probably ignore) or if an annotation or line wrap triggers a resize\n if (entry.target === this.stickyContainer) {\n const blockSize = entry.borderBoxSize[0].blockSize;\n // If the height of the sticky container was already known, there's\n // nothing for us to do\n if (blockSize !== this.renderState.stickyHeight) {\n // If content resizes above the viewport, we want to be sure that it\n // doesn't cause things to jump within the viewport\n const currentScrollTop = this.getScrollTop();\n const anchor = this.getScrollAnchor(currentScrollTop);\n\n this.reconcileRenderedItems();\n this.updateStickyPositioning();\n\n const anchoredScrollTop =\n anchor != null ? this.resolveAnchoredScrollTop(anchor) : undefined;\n if (anchoredScrollTop != null) {\n const resizeAnchorDelta = anchoredScrollTop - currentScrollTop;\n this.applyScrollFix(\n anchoredScrollTop,\n currentScrollTop,\n this.windowSpecs\n );\n if (this.scrollAnimation != null) {\n // if we had to apply a scroll fix then we should make sure to\n // match the scroll fix delta to the scrollAnimation position to\n // ensure the animation continues smoothly as if the scroll fix\n // never happened\n this.scrollAnimation.position += resizeAnchorDelta;\n }\n }\n if (\n this.pendingScrollTarget != null &&\n this.isPendingTargetSettled(this.pendingScrollTarget)\n ) {\n this.pendingScrollTarget = undefined;\n this.scrollAnimation = undefined;\n }\n }\n }\n // Root element resize (element-mode only)\n else {\n this.scrollDirty = true;\n this.heightDirty = true;\n this.render();\n }\n }\n };\n\n /**\n * Figure out scrollTop accounting for sticky header if enabled and\n * necessary\n */\n private getScrollAnchorViewportTop(\n absoluteItemTop: number,\n scrollTop: number\n ): number {\n return absoluteItemTop < scrollTop\n ? scrollTop + this.getStickyHeaderOffset()\n : scrollTop;\n }\n\n /**\n * Attempt to find a scroll anchor based on build in metrics of the existing\n * rendered files/diff.\n *\n * A scroll anchor represents the first fully visible element (in other\n * words, the first file or first line who's top is fully in the viewport).\n */\n private getScrollAnchor(scrollTop: number): ScrollAnchor | undefined {\n // If we already have a pendingLayoutAnchor, let's use that.\n if (this.pendingLayoutAnchor != null) {\n return this.pendingLayoutAnchor;\n }\n\n const { firstIndex, lastIndex, stickyTop, stickyBottom } = this.renderState;\n if (firstIndex === -1 || lastIndex === -1) {\n return undefined;\n }\n\n const viewportHeight = this.getHeight();\n // If we have no previoius frame, we shouldn't scroll anchor\n if (stickyTop === -1 || stickyBottom === -1) {\n return undefined;\n }\n\n for (let index = firstIndex; index <= lastIndex; index++) {\n const item = this.items[index];\n if (item == null) {\n continue;\n }\n\n const absoluteItemTop = this.getLayout().paddingTop + item.top;\n const absoluteItemBottom = absoluteItemTop + item.height;\n // Skip items entirely above the viewport since we can't see it\n if (absoluteItemBottom <= scrollTop) {\n continue;\n }\n // If the item starts below the viewport bottom we are done searching.\n if (absoluteItemTop >= scrollTop + viewportHeight) {\n break;\n }\n\n if (absoluteItemTop >= scrollTop) {\n return {\n type: 'item',\n id: item.item.id,\n viewportOffset: absoluteItemTop - scrollTop,\n };\n }\n\n // First attempt to grab a the first fully visible line\n const anchorViewportTop = this.getScrollAnchorViewportTop(\n absoluteItemTop,\n scrollTop\n );\n const localViewportTop = anchorViewportTop - absoluteItemTop;\n const lineAnchor = item.instance.getNumericScrollAnchor(localViewportTop);\n if (lineAnchor != null) {\n const absoluteLineTop = absoluteItemTop + lineAnchor.top;\n return {\n type: 'line',\n id: item.item.id,\n lineNumber: lineAnchor.lineNumber,\n side: lineAnchor.side,\n viewportOffset: absoluteLineTop - scrollTop,\n };\n }\n }\n\n // I don't think we'll ever make it this far...\n return undefined;\n }\n\n /**\n * Given a scroll anchor, attempt to resolve a newly updated (and clamped)\n * scroll position to keep the anchored element in place.\n *\n * If we can't resolve a position for whatever reason, we'll return\n * undefined.\n */\n private resolveAnchoredScrollTop(anchor: ScrollAnchor): number | undefined {\n const item = this.idToItem.get(anchor.id);\n if (item == null) {\n return undefined;\n }\n\n const { paddingTop } = this.getLayout();\n if (anchor.type === 'item') {\n const absoluteItemTop = paddingTop + item.top;\n return this.clampScrollTop(absoluteItemTop - anchor.viewportOffset);\n }\n\n const linePosition =\n item.type === 'diff'\n ? item.instance.getLinePosition(anchor.lineNumber, anchor.side)\n : item.instance.getLinePosition(anchor.lineNumber);\n if (linePosition == null) {\n return undefined;\n }\n const absoluteLineTop = paddingTop + item.top + linePosition.top;\n return this.clampScrollTop(absoluteLineTop - anchor.viewportOffset);\n }\n\n /**\n * Apply a device-pixel-rounded scroll position if it differs from the last\n * logical scrollTop synchronized into the paged scroll scaffold.\n */\n private applyScrollFix(\n targetScrollTop: number,\n syncedScrollTop: number,\n windowSpecs: VirtualWindowSpecs\n ): void {\n if (this.root == null) {\n return;\n }\n const roundedTargetScrollTop = roundToDevicePixel(\n this.clampScrollTop(targetScrollTop)\n );\n const roundedSyncedScrollTop = roundToDevicePixel(syncedScrollTop);\n\n const { scrollPageOffset: previousPageOffset } = this;\n const syncedPagedScrollTop = roundToDevicePixel(\n this.clampPagedScrollTop(roundedSyncedScrollTop - previousPageOffset)\n );\n const { pagedScrollTop, scrollPageOffset } =\n this.resolvePagedScrollPosition(roundedTargetScrollTop);\n const targetPagedScrollTop = pagedScrollTop;\n\n const rebaseChanged = previousPageOffset !== scrollPageOffset;\n if (\n roundedTargetScrollTop === this.renderState.scrollTop &&\n roundedTargetScrollTop === roundedSyncedScrollTop &&\n targetPagedScrollTop === syncedPagedScrollTop &&\n !rebaseChanged\n ) {\n return;\n }\n this.suspendScrollInteractions();\n if (targetPagedScrollTop !== syncedPagedScrollTop || rebaseChanged) {\n this.scrollPageOffset = scrollPageOffset;\n this.syncPagedScrollScaffolding(windowSpecs);\n }\n if (targetPagedScrollTop !== syncedPagedScrollTop) {\n this.root.scrollTo({ top: targetPagedScrollTop, behavior: 'instant' });\n }\n // Keep cached scroll state in sync with writes we performed ourselves, so\n // later reads do not need to touch layout just to discover the same value.\n this.renderState.scrollTop = roundedTargetScrollTop;\n this.scrollTop = roundedTargetScrollTop;\n this.scrollDirty = false;\n }\n\n /**\n * Decide whether a pending programmatic scroll has reached its\n * destination and should be cleared.\n */\n private isPendingTargetSettled(target: PendingScrollTarget): boolean {\n const top = this.resolveScrollTargetTop(target);\n if (top == null) {\n return true;\n }\n return roundToDevicePixel(this.getScrollTop()) === roundToDevicePixel(top);\n }\n\n public getScrollTop(): number {\n if (!this.scrollDirty) {\n return this.scrollTop;\n }\n this.scrollDirty = false;\n const rootScrollTop = this.root?.scrollTop ?? 0;\n this.scrollTop = this.clampScrollTop(rootScrollTop + this.scrollPageOffset);\n return this.scrollTop;\n }\n\n public getHeight(): number {\n if (!this.heightDirty) {\n return this.height;\n }\n this.heightDirty = false;\n this.height = this.root?.getBoundingClientRect().height ?? 0;\n return this.height;\n }\n\n public getScrollHeight(): number {\n return this.scrollHeight;\n }\n\n private flushSlotCoordinator(): void {\n if (this.slotCoordinator == null) {\n return;\n }\n const { onSnapshotChange } = this.slotCoordinator;\n\n const slotSnapshot = getSlotSnapshot(\n this.getRenderedItems(),\n this.slotCoordinator\n );\n\n if (areSlotSnapshotsEqual(this.slotSnapshot, slotSnapshot)) {\n return;\n }\n\n this.slotSnapshot = slotSnapshot;\n onSnapshotChange(slotSnapshot);\n }\n\n private notifyScroll(): void {\n // Avoid DOM thrash of checking scroll position if we don't need it\n if (this.scrollListeners.size === 0) {\n return;\n }\n const scrollTop = this.getScrollTop();\n for (const listener of this.scrollListeners) {\n listener(scrollTop, this);\n }\n }\n\n /**\n * Find the first item whose bottom edge crosses into the viewport window.\n * This lets scroll-time rendering jump directly near the visible range instead\n * of linearly scanning from the start of very large item lists.\n */\n private findFirstVisibleIndex(top: number): number {\n let low = 0;\n let high = this.items.length - 1;\n let result = this.items.length;\n\n while (low <= high) {\n const mid = (low + high) >> 1;\n const item = this.items[mid];\n if (item == null) {\n throw new Error('CodeView.findFirstVisibleIndex: invalid item index');\n }\n\n if (item.top + item.height > top) {\n result = mid;\n high = mid - 1;\n } else {\n low = mid + 1;\n }\n }\n\n return result;\n }\n\n /**\n * Find the last item whose top edge is still within the viewport window.\n * Paired with findFirstVisibleIndex, this bounds the render loop to only the\n * slice of items that can actually intersect the current scroll range.\n */\n private findLastVisibleIndex(bottom: number): number {\n let low = 0;\n let high = this.items.length - 1;\n let result = -1;\n\n while (low <= high) {\n const mid = (low + high) >> 1;\n const item = this.items[mid];\n if (item == null) {\n throw new Error('CodeView.findLastVisibleIndex: invalid item index');\n }\n\n if (item.top <= bottom) {\n result = mid;\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n\n return result;\n }\n\n /**\n * Recompute measured tops and heights starting from the earliest dirty item.\n * Earlier items keep their existing layout, while everything from startIndex\n * onward is remeasured so downstream positions and total scroll height stay\n * consistent after inserts, removals, or versioned item updates.\n */\n private recomputeLayout(startIndex = 0): void {\n if (this.items.length === 0) {\n this.scrollHeight = 0;\n return;\n }\n\n const layout = this.getLayout();\n let runningTop = 0;\n if (startIndex > 0) {\n const previousItem = this.items[startIndex - 1];\n if (previousItem == null) {\n throw new Error('CodeView.recomputeLayout: invalid dirty index');\n }\n runningTop = previousItem.top + previousItem.height + layout.gap;\n }\n\n for (let index = startIndex; index < this.items.length; index++) {\n const item = this.items[index];\n if (item == null) {\n throw new Error('CodeView.recomputeLayout: invalid item index');\n }\n item.top = runningTop;\n if (item.type === 'diff') {\n item.height = item.instance.prepareVirtualizedItem(item.item.fileDiff);\n } else {\n item.height = item.instance.prepareVirtualizedItem(item.item.file);\n }\n runningTop += item.height;\n if (index < this.items.length - 1) {\n runningTop += layout.gap;\n }\n }\n\n if (runningTop !== this.scrollHeight) {\n this.scrollDirty = true;\n }\n this.scrollHeight = runningTop;\n }\n\n private resetRenderState() {\n this.renderState.scrollTop = -1;\n this.renderState.firstIndex = -1;\n this.renderState.lastIndex = -1;\n this.renderState.stickyHeight = 0;\n this.renderState.stickyTop = -1;\n this.renderState.stickyBottom = -1;\n }\n\n // We actually need a bit of overscroll even when attempting to fit perfectly\n // because we rounde to the nearest container and we may need to render the\n // gaps before and after a perfectly fit element to include the spacing\n // between. We do this by adding the the gap and header height above and\n // below the viewport\n private getFitPerfectlyOverscroll() {\n return this.getLayout().gap + this.itemMetricsCache.diffHeaderHeight;\n }\n}\n\nfunction prepareItemInstance<LAnnotation>(\n item: CodeViewContextItem<LAnnotation>\n): number {\n item.instance.cleanUp(true);\n if (item.type === 'diff') {\n return item.instance.prepareVirtualizedItem(item.item.fileDiff);\n } else {\n return item.instance.prepareVirtualizedItem(item.item.file);\n }\n}\n\nfunction shouldClearPool<LAnnotation>(\n previousOptions: CodeViewOptions<LAnnotation>,\n nextOptions: CodeViewOptions<LAnnotation>\n): boolean {\n return (\n !areThemesEqual(\n previousOptions.theme ?? DEFAULT_THEMES,\n nextOptions.theme ?? DEFAULT_THEMES\n ) ||\n (previousOptions.themeType ?? 'system') !==\n (nextOptions.themeType ?? 'system') ||\n previousOptions.unsafeCSS !== nextOptions.unsafeCSS\n );\n}\n\nfunction isPooledShadowChild(child: Element): boolean {\n if (child instanceof SVGElement) {\n return true;\n }\n return (\n isStyleNode(child) &&\n (child.hasAttribute(CORE_CSS_ATTRIBUTE) ||\n child.hasAttribute(THEME_CSS_ATTRIBUTE) ||\n child.hasAttribute(UNSAFE_CSS_ATTRIBUTE))\n );\n}\n\nfunction formatSelectedLineRange(range: SelectedLineRange): string {\n const start = formatSelectedLinePoint(range.start, range.side);\n const end = formatSelectedLinePoint(range.end, range.endSide ?? range.side);\n return start === end ? start : `${start}-${end}`;\n}\n\nfunction formatSelectedLinePoint(\n lineNumber: number,\n side: SelectionSide | undefined\n): string {\n if (side == null) {\n return `${lineNumber}`;\n }\n\n return `${side === 'deletions' ? 'D' : 'A'}${lineNumber}`;\n}\n\nfunction renderItem<LAnnotation>(\n item: CodeViewContextItem<LAnnotation>,\n fileContainer?: HTMLElement\n): boolean {\n if (item.type === 'diff') {\n return item.instance.render({\n deferManagers: true,\n fileContainer,\n fileDiff: item.item.fileDiff,\n lineAnnotations: item.item.annotations,\n });\n } else {\n return item.instance.render({\n deferManagers: true,\n fileContainer,\n file: item.item.file,\n lineAnnotations: item.item.annotations,\n });\n }\n}\n\n/**\n * Keep the rendered DOM order aligned with the current record order even when\n * we reuse existing elements. Reused items may already be mounted elsewhere in\n * the sticky container, so this moves them into the correct sibling position\n * before rendering updates.\n */\nfunction syncRenderedItemOrder(\n container: HTMLElement,\n element: HTMLElement,\n prevElement: HTMLElement | undefined\n): void {\n if (prevElement == null) {\n if (container.firstChild !== element) {\n container.prepend(element);\n }\n return;\n }\n\n if (prevElement.nextSibling !== element) {\n prevElement.after(element);\n }\n}\n\nfunction hasAnnotations<LAnnotation>(item: CodeViewItem<LAnnotation>): boolean {\n return (item.annotations?.length ?? 0) > 0;\n}\n\nfunction getSlotSnapshot<LAnnotation>(\n renderedItems: CodeViewRenderedItem<LAnnotation>[],\n {\n hasHeaderRenderers,\n hasAnnotationRenderer,\n hasGutterRenderer,\n }: CodeViewCoordinator<LAnnotation>\n): CodeViewRenderedItem<LAnnotation>[] | undefined {\n if (renderedItems.length === 0) {\n return undefined;\n }\n\n if (hasHeaderRenderers || hasGutterRenderer) {\n return renderedItems;\n }\n\n if (!hasAnnotationRenderer) {\n return undefined;\n }\n\n const slotSnapshot: CodeViewRenderedItem<LAnnotation>[] = [];\n\n for (const renderedItem of renderedItems) {\n if (hasAnnotations(renderedItem.item)) {\n slotSnapshot.push(renderedItem);\n }\n }\n\n return slotSnapshot.length > 0 ? slotSnapshot : undefined;\n}\n\nfunction areSlotSnapshotsEqual<LAnnotation>(\n previous: CodeViewRenderedItem<LAnnotation>[] | undefined,\n next: CodeViewRenderedItem<LAnnotation>[] | undefined\n): boolean {\n if (previous == null || next == null) {\n return previous === next;\n }\n\n if (previous.length !== next.length) {\n return false;\n }\n\n for (let index = 0; index < previous.length; index++) {\n const previousItem = previous[index];\n const nextItem = next[index];\n if (\n previousItem == null ||\n nextItem == null ||\n previousItem.id !== nextItem.id ||\n previousItem.type !== nextItem.type ||\n previousItem.element !== nextItem.element ||\n previousItem.version !== nextItem.version\n ) {\n return false;\n }\n }\n\n return true;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CodeView.js","names":["renderedItems: CodeViewRenderedItem<LAnnotation>[]","instance","nextItems: CodeViewContextItem<LAnnotation>[]","nextIdToItem: Map<\n string,\n CodeViewContextItem<LAnnotation>\n >","nextInstanceToItem: Map<\n VirtualizedFileDiff<LAnnotation> | VirtualizedFile<LAnnotation>,\n CodeViewContextItem<LAnnotation>\n >","firstDirtyIndex: number | undefined","prevElement: HTMLElement | undefined","slotSnapshot: CodeViewRenderedItem<LAnnotation>[]"],"sources":["../../src/components/CodeView.ts"],"sourcesContent":["import {\n CORE_CSS_ATTRIBUTE,\n DEFAULT_CODE_VIEW_FILE_METRICS,\n DEFAULT_CODE_VIEW_LAYOUT,\n DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n DEFAULT_SMOOTH_SCROLL_SETTINGS,\n DEFAULT_THEMES,\n DIFFS_DEVELOPMENT_BUILD,\n DIFFS_TAG_NAME,\n THEME_CSS_ATTRIBUTE,\n UNSAFE_CSS_ATTRIBUTE,\n} from '../constants';\nimport type { SelectionWriteOptions } from '../managers/InteractionManager';\nimport {\n dequeueRender,\n queueRender,\n} from '../managers/UniversalRenderingManager';\nimport type {\n CodeViewDiffItem,\n CodeViewFileItem,\n CodeViewItem,\n CodeViewItemScrollTarget,\n CodeViewLayout,\n CodeViewLineScrollTarget,\n CodeViewPositionScrollTarget,\n CodeViewRangeScrollTarget,\n CodeViewScrollBehavior,\n CodeViewScrollTarget,\n HunkSeparators,\n PendingCodeViewLayoutReset,\n SelectedLineRange,\n SelectionSide,\n SmoothScrollSettings,\n VirtualFileMetrics,\n VirtualWindowSpecs,\n} from '../types';\nimport { areObjectsEqual } from '../utils/areObjectsEqual';\nimport { areOptionsEqual } from '../utils/areOptionsEqual';\nimport { areSelectionsEqual } from '../utils/areSelectionsEqual';\nimport { areThemesEqual } from '../utils/areThemesEqual';\nimport { createWindowFromScrollPosition } from '../utils/createWindowFromScrollPosition';\nimport { isStyleNode } from '../utils/isStyleNode';\nimport { prefersReducedMotion } from '../utils/prefersReducedMotion';\nimport { roundToDevicePixel } from '../utils/roundToDevicePixel';\nimport type { WorkerPoolManager } from '../worker';\nimport type { FileOptions } from './File';\nimport type { FileDiffOptions } from './FileDiff';\nimport { VirtualizedFile } from './VirtualizedFile';\nimport { VirtualizedFileDiff } from './VirtualizedFileDiff';\nimport type { VirtualizerConfig } from './Virtualizer';\n\n// When re-rendering content of the virtualizer, it's important that we\n// maintain a visual anchor, usually this is the first fully visible element,\n// whether it's an Item (a file or diff header), or a specific line. If the\n// rendered content ever ends up shifting things around, we'll need to reset\n// the new position back to the viewportOffset, relative to where that element\n// currently is\ninterface ItemAnchor {\n type: 'item';\n id: string;\n viewportOffset: number;\n}\n\ninterface LineAnchor {\n type: 'line';\n id: string;\n lineNumber: number;\n side: SelectionSide | undefined;\n viewportOffset: number;\n}\n\ntype ScrollAnchor = ItemAnchor | LineAnchor;\n\ninterface LineScrollPosition {\n top: number;\n height: number;\n}\n\ninterface StickyBounds {\n stickyTop: number;\n stickyBottom: number;\n}\n\ninterface PagedScrollPosition {\n pagedScrollTop: number;\n scrollPageOffset: number;\n}\n\ninterface AdvancedVirtualizedBaseItem {\n /** Current index of this record in the ordered items array. */\n index: number;\n /** Absolute top offset of this item inside the scroll content. */\n top: number;\n /** Total measured height reserved for this item. */\n height: number;\n /** Root <diffs-container> node currently mounted for this item, only exists\n * when rendered. */\n element: HTMLElement | undefined;\n /** Last controlled version observed for this record. */\n version: number | undefined;\n /** Last CodeView option revision this item rendered with. */\n renderedOptionsRevision: number;\n}\n\ninterface CodeViewDiffItemContext<\n LAnnotation,\n> extends AdvancedVirtualizedBaseItem {\n type: 'diff';\n /** Latest item snapshot for this record. Controlled updates can replace it. */\n item: CodeViewDiffItem<LAnnotation>;\n /** Virtualized diff instance responsible for rendering this item. */\n instance: VirtualizedFileDiff<LAnnotation>;\n}\n\ninterface CodeViewFileItemContext<\n LAnnotation,\n> extends AdvancedVirtualizedBaseItem {\n type: 'file';\n /** Latest item snapshot for this record. Controlled updates can replace it. */\n item: CodeViewFileItem<LAnnotation>;\n /** Virtualized file instance responsible for rendering this item. */\n instance: VirtualizedFile<LAnnotation>;\n}\n\ntype CodeViewContextItem<LAnnotation> =\n | CodeViewDiffItemContext<LAnnotation>\n | CodeViewFileItemContext<LAnnotation>;\n\nexport interface CodeViewRenderedDiffItem<LAnnotation> {\n id: string;\n type: 'diff';\n item: CodeViewDiffItem<LAnnotation>;\n version: number | undefined;\n element: HTMLElement;\n instance: VirtualizedFileDiff<LAnnotation>;\n}\n\nexport interface CodeViewRenderedFileItem<LAnnotation> {\n id: string;\n type: 'file';\n item: CodeViewFileItem<LAnnotation>;\n version: number | undefined;\n element: HTMLElement;\n instance: VirtualizedFile<LAnnotation>;\n}\n\nexport type CodeViewRenderedItem<LAnnotation> =\n | CodeViewRenderedDiffItem<LAnnotation>\n | CodeViewRenderedFileItem<LAnnotation>;\n\nexport interface CodeViewLineSelection {\n id: string;\n range: SelectedLineRange;\n}\n\nexport interface CodeViewCoordinator<LAnnotation> {\n hasHeaderRenderers: boolean;\n hasAnnotationRenderer: boolean;\n hasGutterRenderer: boolean;\n onSnapshotChange(\n snapshot: CodeViewRenderedItem<LAnnotation>[] | undefined\n ): void;\n}\n\nexport type CodeViewScrollListener<LAnnotation> = (\n scrollTop: number,\n viewer: CodeView<LAnnotation>\n) => void;\n\ntype OverloadCallbackArgs<TCallback> = TCallback extends (\n ...args: infer TArgs\n) => unknown\n ? TArgs\n : never;\n\ntype CallbackReturn<TCallback> = TCallback extends (\n ...args: never[]\n) => infer TReturn\n ? TReturn\n : never;\n\ntype OverloadFileCallbackArgs<\n LAnnotation,\n TKey extends keyof FileOptions<LAnnotation>,\n> = OverloadCallbackArgs<NonNullable<FileOptions<LAnnotation>[TKey]>>;\n\ntype OverloadDiffCallbackArgs<\n LAnnotation,\n TKey extends keyof FileDiffOptions<LAnnotation>,\n> = OverloadCallbackArgs<NonNullable<FileDiffOptions<LAnnotation>[TKey]>>;\n\ntype CodeViewFileOptionCallback<\n LAnnotation,\n TKey extends keyof FileOptions<LAnnotation>,\n> = (\n ...args: [\n ...OverloadFileCallbackArgs<LAnnotation, TKey>,\n context: CodeViewFileItemContext<LAnnotation>,\n ]\n) => CallbackReturn<NonNullable<FileOptions<LAnnotation>[TKey]>>;\n\ntype CodeViewDiffOptionCallback<\n LAnnotation,\n TKey extends keyof FileDiffOptions<LAnnotation>,\n> = (\n ...args: [\n ...OverloadDiffCallbackArgs<LAnnotation, TKey>,\n context: CodeViewDiffItemContext<LAnnotation>,\n ]\n) => CallbackReturn<NonNullable<FileDiffOptions<LAnnotation>[TKey]>>;\n\ntype CodeViewOptionCallback<\n LAnnotation,\n TKey extends keyof FileOptions<LAnnotation> &\n keyof FileDiffOptions<LAnnotation>,\n> = {\n (\n ...args: [\n ...OverloadFileCallbackArgs<LAnnotation, TKey>,\n context: CodeViewFileItemContext<LAnnotation>,\n ]\n ): CallbackReturn<NonNullable<FileOptions<LAnnotation>[TKey]>>;\n (\n ...args: [\n ...OverloadDiffCallbackArgs<LAnnotation, TKey>,\n context: CodeViewDiffItemContext<LAnnotation>,\n ]\n ): CallbackReturn<NonNullable<FileDiffOptions<LAnnotation>[TKey]>>;\n};\n\nconst CODE_VIEW_DIFF_OPTION_KEYS = [\n 'theme',\n 'disableLineNumbers',\n 'overflow',\n 'themeType',\n 'disableFileHeader',\n 'disableVirtualizationBuffers',\n 'preferredHighlighter',\n 'useCSSClasses',\n 'useTokenTransformer',\n 'tokenizeMaxLineLength',\n 'tokenizeMaxLength',\n 'unsafeCSS',\n 'diffStyle',\n 'diffIndicators',\n 'disableBackground',\n 'expandUnchanged',\n 'collapsedContextThreshold',\n 'lineDiffType',\n 'maxLineDiffLength',\n 'expansionLineCount',\n 'lineHoverHighlight',\n 'enableTokenInteractionsOnWhitespace',\n 'enableGutterUtility',\n '__debugPointerEvents',\n 'enableLineSelection',\n 'controlledSelection',\n 'disableErrorHandling',\n] as const;\n\ntype CodeViewDiffOptionKeys = (typeof CODE_VIEW_DIFF_OPTION_KEYS)[number];\n\nconst CODE_VIEW_FILE_OPTION_KEYS = [\n 'theme',\n 'disableLineNumbers',\n 'overflow',\n 'themeType',\n 'disableFileHeader',\n 'disableVirtualizationBuffers',\n 'preferredHighlighter',\n 'useCSSClasses',\n 'useTokenTransformer',\n 'tokenizeMaxLineLength',\n 'tokenizeMaxLength',\n 'unsafeCSS',\n 'lineHoverHighlight',\n 'enableTokenInteractionsOnWhitespace',\n 'enableGutterUtility',\n '__debugPointerEvents',\n 'enableLineSelection',\n 'controlledSelection',\n 'disableErrorHandling',\n] as const;\n\ntype CodeViewFileOptionKeys = (typeof CODE_VIEW_FILE_OPTION_KEYS)[number];\n\ntype CodeViewPassThroughOptions<LAnnotation> = Pick<\n FileDiffOptions<LAnnotation>,\n CodeViewDiffOptionKeys\n>;\n\ntype CodeViewMode = 'file' | 'diff';\n\ntype CodeViewModeItemContext<\n LAnnotation,\n TMode extends CodeViewMode,\n> = TMode extends 'file'\n ? CodeViewFileItemContext<LAnnotation>\n : CodeViewDiffItemContext<LAnnotation>;\n\ntype CodeViewModeOptionCallback<\n LAnnotation,\n TMode extends CodeViewMode,\n TKey extends CodeViewSharedCallbackKeys | CodeViewSelectionCallbackKeys,\n> = TMode extends 'file'\n ? CodeViewFileOptionCallback<LAnnotation, TKey>\n : CodeViewDiffOptionCallback<LAnnotation, TKey>;\n\ntype CodeViewModeInternalOptionCallback<\n LAnnotation,\n TMode extends CodeViewMode,\n TKey extends CodeViewSharedCallbackKeys | CodeViewSelectionCallbackKeys,\n> = (\n ...args: [\n ...OverloadCallbackArgs<\n NonNullable<CodeViewModeOptions<LAnnotation, TMode>[TKey]>\n >,\n CodeViewModeItemContext<LAnnotation, TMode>,\n ]\n) => CallbackReturn<NonNullable<CodeViewModeOptions<LAnnotation, TMode>[TKey]>>;\n\ntype CodeViewModeOptions<\n LAnnotation,\n TMode extends CodeViewMode,\n> = TMode extends 'file'\n ? FileOptions<LAnnotation>\n : FileDiffOptions<LAnnotation>;\n\nconst CODE_VIEW_SHARED_CALLBACK_KEYS = [\n 'renderCustomHeader',\n 'renderHeaderPrefix',\n 'renderHeaderMetadata',\n 'renderAnnotation',\n 'renderGutterUtility',\n 'onPostRender',\n 'onGutterUtilityClick',\n 'onLineClick',\n 'onLineNumberClick',\n 'onLineEnter',\n 'onLineLeave',\n 'onTokenClick',\n 'onTokenEnter',\n 'onTokenLeave',\n] as const;\n\nconst CODE_VIEW_SELECTION_CALLBACK_KEYS = [\n 'onLineSelected',\n 'onLineSelectionStart',\n 'onLineSelectionChange',\n 'onLineSelectionEnd',\n] as const;\n\ntype CodeViewSharedCallbackKeys =\n (typeof CODE_VIEW_SHARED_CALLBACK_KEYS)[number];\n\ntype CodeViewSelectionCallbackKeys =\n (typeof CODE_VIEW_SELECTION_CALLBACK_KEYS)[number];\n\nconst CODE_VIEW_ITEM_OPTIONS_STATE = Symbol('CodeView.itemOptionsState');\n\ntype CodeViewItemCallbackCache = Partial<\n Record<CodeViewSharedCallbackKeys | CodeViewSelectionCallbackKeys, unknown>\n>;\n\n// Each item gets a tiny state record and an options object whose properties\n// come from a shared prototype. This avoids retaining dozens of getter closures\n// and property descriptors per item while still letting the item instance read\n// the latest CodeView options whenever it renders.\ninterface CodeViewItemOptionsState {\n // Store the id instead of the item object so item -> instance -> options does\n // not form a strong cycle back to the item context. The id also lets\n // updateItemId() keep reused instances pointed at the current record.\n id: string;\n // Callback wrappers are only needed when a renderer/interaction path reads a\n // callback option, so this cache stays absent for plain CodeView items.\n callbackCache?: CodeViewItemCallbackCache;\n}\n\ntype CodeViewItemOptions<\n LAnnotation,\n TMode extends CodeViewMode,\n> = CodeViewModeOptions<LAnnotation, TMode> & {\n [CODE_VIEW_ITEM_OPTIONS_STATE]: CodeViewItemOptionsState;\n};\n\nfunction defineOptionsState<LAnnotation, TMode extends CodeViewMode>(\n options: CodeViewModeOptions<LAnnotation, TMode>,\n state: CodeViewItemOptionsState\n): void {\n // Keep the state hidden from option enumeration. Renderer option builders\n // should copy known keys explicitly and must not depend on object spread.\n Object.defineProperty(options, CODE_VIEW_ITEM_OPTIONS_STATE, {\n configurable: false,\n enumerable: false,\n value: state,\n });\n}\n\nfunction getItemOptionsState<LAnnotation, TMode extends CodeViewMode>(\n options: CodeViewModeOptions<LAnnotation, TMode>\n): CodeViewItemOptionsState {\n return (options as CodeViewItemOptions<LAnnotation, TMode>)[\n CODE_VIEW_ITEM_OPTIONS_STATE\n ];\n}\n\ntype CodeViewSharedCallbackOptions<LAnnotation> = {\n [TKey in CodeViewSharedCallbackKeys]?: CodeViewOptionCallback<\n LAnnotation,\n TKey\n >;\n};\n\ntype CodeViewSelectionCallbackOptions<LAnnotation> = {\n [TKey in CodeViewSelectionCallbackKeys]?: CodeViewOptionCallback<\n LAnnotation,\n TKey\n >;\n};\n\nfunction defineItemOption<TOptions extends object, TKey extends keyof TOptions>(\n target: TOptions,\n key: TKey,\n get: (receiver: TOptions) => TOptions[TKey]\n): void {\n // These accessors usually live on the shared prototype. Passing `this` to the\n // getter lets one shared accessor resolve per-item state from the receiving\n // options object instead of closing over an individual item.\n Object.defineProperty(target, key, {\n configurable: false,\n enumerable: true,\n get() {\n return get(this as TOptions);\n },\n });\n}\n\nexport interface CodeViewOptions<LAnnotation>\n extends\n CodeViewPassThroughOptions<LAnnotation>,\n CodeViewSharedCallbackOptions<LAnnotation>,\n CodeViewSelectionCallbackOptions<LAnnotation> {\n hunkSeparators?: Exclude<HunkSeparators, 'custom'>;\n itemMetrics?: Partial<VirtualFileMetrics>;\n pointerEventsOnScroll?: boolean;\n smoothScrollSettings?: SmoothScrollSettings;\n stickyHeaders?: boolean;\n controlledSelection?: boolean;\n onSelectedLinesChange?(selection: CodeViewLineSelection | null): void;\n layout?: CodeViewLayout;\n\n /** Internal dev-only check to ensure your `itemMetrics` are correct. Its\n * automatically disabled in a production build because it will hurt\n * performance fairly significantly */\n __devOnlyValidateItemHeights?: boolean;\n}\n\nconst DEFAULT_SCROLL_INTERACTION_RESTORE_DELAY_MS = 120;\nconst SCROLLING_CODE_OVERFLOW_FIX_VARIABLE = '--diffs-overflow-override';\nconst SCROLL_REBASE_CONTAINER_HEIGHT = 12_000_000;\nconst SCROLL_REBASE_TRIGGER_TOP = 1_000_000;\nconst SCROLL_REBASE_TARGET_TOP = 2_000_000;\nconst SCROLL_REBASE_TARGET_BOTTOM =\n SCROLL_REBASE_CONTAINER_HEIGHT - SCROLL_REBASE_TARGET_TOP;\nconst SCROLL_REBASE_THRESHOLD =\n SCROLL_REBASE_CONTAINER_HEIGHT - SCROLL_REBASE_TRIGGER_TOP;\ninterface ScrollToAnimation {\n position: number;\n velocity: number;\n lastTimestamp: number;\n}\n\ninterface SpringStepResult {\n position: number;\n velocity: number;\n}\n\n// A vibe slopped heuristic to detect mobile safari only\nconst MOBILE_SAFARI = (() => {\n const { navigator } = globalThis;\n\n const userAgent = navigator.userAgent;\n const isIOS = /iP(?:hone|ad|od)/.test(userAgent);\n const isIPadOS =\n navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;\n\n return (\n (isIOS || isIPadOS) &&\n /AppleWebKit/.test(userAgent) &&\n /Safari/.test(userAgent) &&\n !/(CriOS|FxiOS|EdgiOS|OPiOS)/.test(userAgent)\n );\n})();\n\ntype PendingAlignTypes = Exclude<CodeViewLineScrollTarget['align'], 'nearest'>;\n\ninterface PendingLineTarget extends Omit<CodeViewLineScrollTarget, 'align'> {\n align?: PendingAlignTypes;\n}\n\ninterface PendingRangeTarget extends Omit<CodeViewRangeScrollTarget, 'align'> {\n align?: PendingAlignTypes;\n}\n\ninterface PendingItemTarget extends Omit<CodeViewItemScrollTarget, 'align'> {\n align?: PendingAlignTypes;\n}\n\ntype PendingScrollTarget =\n | CodeViewPositionScrollTarget\n | PendingLineTarget\n | PendingRangeTarget\n | PendingItemTarget;\n\nexport class CodeView<LAnnotation = undefined> {\n static __STOP = false;\n static __lastScrollPosition = 0;\n\n public type = 'advanced' as const;\n public readonly config: VirtualizerConfig = {\n overscrollSize: 200,\n intersectionObserverMargin: 0,\n resizeDebugging: false,\n };\n private items: CodeViewContextItem<LAnnotation>[] = [];\n private idToItem: Map<string, CodeViewContextItem<LAnnotation>> = new Map();\n private selectedLines: CodeViewLineSelection | null = null;\n // NOTE(amadeus): We should probably attach an id to instances and use that\n // for lookups, instead of maintaining this map...\n private instanceToItem: Map<\n VirtualizedFileDiff<LAnnotation> | VirtualizedFile<LAnnotation>,\n CodeViewContextItem<LAnnotation>\n > = new Map();\n private layoutDirtyIndex: number | undefined;\n private pendingLayoutReset: PendingCodeViewLayoutReset | undefined;\n private renderOptionsRevision = 0;\n private slotCoordinator: CodeViewCoordinator<LAnnotation> | undefined;\n private slotSnapshot: CodeViewRenderedItem<LAnnotation>[] | undefined;\n private scrollListeners: Set<CodeViewScrollListener<LAnnotation>> = new Set();\n private scrollHeight = 0;\n private containerHeight = -1;\n private scrollTop: number = 0;\n private scrollPageOffset: number = 0;\n private scrollDirty = true;\n private scrollInteractionFixTimer: ReturnType<typeof setTimeout> | undefined;\n private pointerEventsDisabled = false;\n private codeOverflowFix = false;\n private height: number = 0;\n private heightDirty = true;\n private windowSpecs: VirtualWindowSpecs = { top: 0, bottom: 0 };\n private renderState = {\n scrollTop: -1,\n firstIndex: -1,\n lastIndex: -1,\n stickyHeight: 0,\n stickyTop: -1,\n stickyBottom: -1,\n };\n private itemMetricsCache: VirtualFileMetrics = DEFAULT_CODE_VIEW_FILE_METRICS;\n private readonly fileOptionsPrototype: FileOptions<LAnnotation>;\n private readonly diffOptionsPrototype: FileDiffOptions<LAnnotation>;\n // Pending scroll target, either instant or smooth. The next render cycle\n // will attempt to resolve it's position instantly or as part of a dynamic\n // animation.\n //\n // - 'item' / 'line' targets stay here until isPendingTargetSettled returns\n // true. Their destination top is re-derived from live layout every frame,\n // absorbing async measurement (annotations, line wrap) that shifts the\n // target mid-flight.\n // - 'position' targets settle on the first frame that applies their\n // scrollTop — there is no layout-dependent destination to chase.\n private pendingScrollTarget: PendingScrollTarget | undefined;\n private pendingLayoutAnchor: ScrollAnchor | undefined;\n\n // Active smooth-scroll animation state. Only populated while a scrollTo\n // with `behavior: 'smooth'` is in flight; cleared on settle (position +\n // velocity within epsilon of the destination) or on user-input abort.\n //\n // - position: current interpolated scrollTop, in CSS pixels.\n // - velocity: rate of change, in CSS pixels per millisecond.\n // - lastTimestamp: High Resolution Time (same clock as RAF timestamps)\n // of the previous integration step.\n private scrollAnimation: ScrollToAnimation | undefined;\n\n private root: HTMLElement | undefined;\n private resizeObserver: ResizeObserver | undefined;\n\n private container: HTMLDivElement | undefined = document.createElement('div');\n private stickyContainer = document.createElement('div');\n private stickyOffset = document.createElement('div');\n private elementPool: HTMLElement[] = [];\n private elementPoolVersion = 0;\n private elementPoolTracker = new WeakMap<HTMLElement, number>();\n // Container-managed elements may still have externally-owned light DOM slot\n // children after release, so hold them here until they are safe to reuse.\n // i.e. the react CodeView component will require a separate react cleanup\n // phase that we don't want to interrupt\n private pendingElementPool: HTMLElement[] = [];\n private options: CodeViewOptions<LAnnotation>;\n private workerManager: WorkerPoolManager | undefined;\n private isContainerManaged: boolean;\n\n constructor(\n options: CodeViewOptions<LAnnotation> = { theme: DEFAULT_THEMES },\n workerManager?: WorkerPoolManager | undefined,\n isContainerManaged = false\n ) {\n this.options = options;\n this.computeMetricsCache(options.itemMetrics);\n this.fileOptionsPrototype = this.createFileOptionsPrototype();\n this.diffOptionsPrototype = this.createDiffOptionsPrototype();\n this.workerManager = workerManager;\n this.isContainerManaged = isContainerManaged;\n\n this.stickyOffset.style.contain = 'layout size';\n this.stickyContainer.style.position = 'sticky';\n this.stickyContainer.style.width = '100%';\n this.stickyContainer.style.contain = 'layout style inline-size';\n this.stickyContainer.style.isolation = 'isolate';\n this.stickyContainer.style.display = 'flex';\n this.stickyContainer.style.flexDirection = 'column';\n }\n\n private getLayout(): CodeViewLayout {\n return this.options.layout ?? DEFAULT_CODE_VIEW_LAYOUT;\n }\n\n private computeMetricsCache(\n itemMetrics: Partial<VirtualFileMetrics> | undefined\n ): VirtualFileMetrics {\n this.itemMetricsCache = {\n hunkLineCount:\n itemMetrics?.hunkLineCount ??\n DEFAULT_CODE_VIEW_FILE_METRICS.hunkLineCount,\n lineHeight:\n itemMetrics?.lineHeight ?? DEFAULT_CODE_VIEW_FILE_METRICS.lineHeight,\n diffHeaderHeight:\n itemMetrics?.diffHeaderHeight ??\n DEFAULT_CODE_VIEW_FILE_METRICS.diffHeaderHeight,\n hunkSeparatorHeight: itemMetrics?.hunkSeparatorHeight,\n spacing: itemMetrics?.spacing ?? DEFAULT_CODE_VIEW_FILE_METRICS.spacing,\n paddingTop: itemMetrics?.paddingTop,\n paddingBottom: itemMetrics?.paddingBottom,\n };\n return this.itemMetricsCache;\n }\n\n private getSmoothScrollSettings(): SmoothScrollSettings {\n return this.options.smoothScrollSettings ?? DEFAULT_SMOOTH_SCROLL_SETTINGS;\n }\n\n private shouldDisablePointerEvents(): boolean {\n return this.options.pointerEventsOnScroll !== true;\n }\n\n private shouldValidateItemHeights(): boolean {\n return (\n DIFFS_DEVELOPMENT_BUILD &&\n this.options.__devOnlyValidateItemHeights === true\n );\n }\n\n private validateRenderedItemHeight(\n item: CodeViewContextItem<LAnnotation>\n ): void {\n if (!this.shouldValidateItemHeights() || item.element == null) {\n return;\n }\n\n const stickySpecs = item.instance.getAdvancedStickySpecs();\n if (stickySpecs == null) {\n return;\n }\n\n const expectedHeight = stickySpecs.height;\n const actualHeight = item.element.getBoundingClientRect().height;\n\n if (expectedHeight === actualHeight) {\n return;\n }\n\n console.error(\n 'CodeView: reconciled item height does not match DOM height',\n {\n id: item.item.id,\n type: item.type,\n index: item.index,\n version: item.version,\n expectedHeight,\n actualHeight,\n delta: actualHeight - expectedHeight,\n stickyTopOffset: stickySpecs.topOffset,\n virtualizedHeight: item.instance.getVirtualizedHeight(),\n top: item.top,\n scrollTop: this.getScrollTop(),\n windowSpecs: { ...this.windowSpecs },\n element: item.element,\n instance: item.instance,\n }\n );\n }\n\n private clearScrollInteractionTimer(): void {\n if (this.scrollInteractionFixTimer != null) {\n clearTimeout(this.scrollInteractionFixTimer);\n this.scrollInteractionFixTimer = undefined;\n }\n }\n\n private suspendScrollInteractions(): void {\n this.clearScrollInteractionTimer();\n\n if (this.shouldDisablePointerEvents() && !this.pointerEventsDisabled) {\n this.stickyContainer.style.pointerEvents = 'none';\n this.pointerEventsDisabled = true;\n }\n\n // This is a really important fix for mobile safari; under aggressive scroll\n // conditions we'll eventually crash/reload the page. It appears to be\n // caused by the fact that the code wrapper elements are horizontally\n // scrollable, so while aggressively scrolling, we disable scrolling. We\n // don't want to apply this fix to good browsers since in those cases it\n // can fuck with layout in ways that aren't appropriate\n if (MOBILE_SAFARI && !this.codeOverflowFix) {\n this.stickyContainer.style.setProperty(\n SCROLLING_CODE_OVERFLOW_FIX_VARIABLE,\n 'hidden'\n );\n this.codeOverflowFix = true;\n }\n\n this.scrollInteractionFixTimer = setTimeout(\n this.restoreScrollInteractions,\n DEFAULT_SCROLL_INTERACTION_RESTORE_DELAY_MS\n );\n }\n\n private restoreScrollInteractions = (): void => {\n this.clearScrollInteractionTimer();\n\n if (this.pointerEventsDisabled) {\n this.stickyContainer.style.removeProperty('pointer-events');\n this.pointerEventsDisabled = false;\n }\n\n if (this.codeOverflowFix) {\n this.stickyContainer.style.setProperty(\n SCROLLING_CODE_OVERFLOW_FIX_VARIABLE,\n 'auto'\n );\n this.codeOverflowFix = false;\n }\n };\n\n private syncLayout(): void {\n const { gap, paddingBottom, paddingTop } = this.getLayout();\n this.stickyContainer.style.gap = `${gap}px`;\n this.container?.style.setProperty('margin-top', `${paddingTop}px`);\n this.container?.style.setProperty('margin-bottom', `${paddingBottom}px`);\n }\n\n public setup(root: HTMLElement): void {\n if (this.root != null) {\n throw new Error('CodeView.setup: already setup');\n }\n this.workerManager?.subscribeToThemeChanges(this);\n this.root = root;\n this.root.style.overflowAnchor = 'none';\n this.container ??= document.createElement('div');\n // NOTE(amadeus): We can't put `size` in here or it breaks\n // Firefox's sticky headers\n this.container.style.contain = 'layout style';\n this.syncLayout();\n this.container.appendChild(this.stickyOffset);\n this.container.appendChild(this.stickyContainer);\n this.root.appendChild(this.container);\n this.scrollDirty = true;\n this.heightDirty = true;\n this.resizeObserver = new ResizeObserver(this.handleResize);\n this.resizeObserver.observe(this.stickyContainer);\n this.root.addEventListener('scroll', this.handleScroll, {\n passive: true,\n });\n // Any user-driven scroll intent cancels an in-flight programmatic scroll.\n // pointerdown catches scrollbar drag (the scrollbar belongs to root);\n // wheel / touchstart cover trackpad + touch scroll; keydown covers arrow\n // keys, PgUp/PgDn, Home/End on a focused scroll container.\n this.root.addEventListener('wheel', this.clearPendingScroll, {\n passive: true,\n });\n this.root.addEventListener('touchstart', this.clearPendingScroll, {\n passive: true,\n });\n this.root.addEventListener('pointerdown', this.clearPendingScroll, {\n passive: true,\n });\n this.root.addEventListener('keydown', this.clearPendingScroll, {\n passive: true,\n });\n this.resizeObserver.observe(this.root);\n this.render(true);\n\n // FIXME(amadeus): Remove me before release\n window.__INSTANCE = this;\n // Test code to bring back in if needed\n // window.__CODE_VIEW_SCROLL_BEFORE_REBASE = (pixelsBefore = 1_000) => {\n // const target = this.clampScrollTop(\n // this.scrollPageOffset + SCROLL_REBASE_THRESHOLD - pixelsBefore\n // );\n // this.scrollTo({\n // type: 'position',\n // position: target,\n // behavior: 'instant',\n // });\n // };\n window.__TOGGLE = () => {\n if (CodeView.__STOP) {\n CodeView.__STOP = false;\n this.scrollTo({\n type: 'position',\n position: CodeView.__lastScrollPosition,\n behavior: 'instant',\n });\n } else {\n CodeView.__lastScrollPosition = this.getScrollTop();\n CodeView.__STOP = true;\n }\n };\n }\n\n public reset(): void {\n this.restoreScrollInteractions();\n this.cleanAllRenderedItems();\n this.selectedLines = null;\n this.items.length = 0;\n this.idToItem.clear();\n this.instanceToItem.clear();\n this.layoutDirtyIndex = undefined;\n this.pendingLayoutReset = undefined;\n this.stickyContainer.textContent = '';\n this.stickyOffset.style.height = '';\n this.container?.style.removeProperty('height');\n this.containerHeight = -1;\n this.windowSpecs = { top: 0, bottom: 0 };\n this.pendingLayoutAnchor = undefined;\n this.height = 0;\n this.scrollTop = 0;\n this.scrollPageOffset = 0;\n this.scrollHeight = 0;\n this.scrollDirty = true;\n this.heightDirty = true;\n this.resetRenderState();\n // NOTE(amadeus): Container managed CodeView controls when flushing\n // occurs. This is mostly to make imperative vanilla js api easier to work\n // with\n if (!this.isContainerManaged) {\n this.flushSlotCoordinator();\n }\n }\n\n public cleanUp(): void {\n this.reset();\n this.clearElementPool();\n this.restoreScrollInteractions();\n this.workerManager?.unsubscribeToThemeChanges(this);\n this.resizeObserver?.disconnect();\n this.resizeObserver = undefined;\n this.root?.removeEventListener('scroll', this.handleScroll);\n this.root?.removeEventListener('wheel', this.clearPendingScroll);\n this.root?.removeEventListener('touchstart', this.clearPendingScroll);\n this.root?.removeEventListener('pointerdown', this.clearPendingScroll);\n this.root?.removeEventListener('keydown', this.clearPendingScroll);\n this.root?.style.removeProperty('overflow-anchor');\n this.container?.remove();\n this.stickyOffset.remove();\n this.stickyContainer.remove();\n this.stickyContainer.textContent = '';\n this.root = undefined;\n this.container = undefined;\n }\n\n private cleanAllRenderedItems() {\n if (this.renderState.firstIndex === -1) {\n return;\n }\n for (\n let index = this.renderState.firstIndex;\n index <= this.renderState.lastIndex;\n index++\n ) {\n const item = this.items[index];\n if (item == null) {\n throw new Error(\n `CodeView.cleanAllRenderedItems: Item does not exist at index: ${index}`\n );\n }\n this.releaseRenderedItem(item);\n }\n }\n\n private primeScrollTarget(target: PendingScrollTarget): void {\n if (target.type === 'position') return;\n\n const item = this.idToItem.get(target.id);\n if (item == null) return;\n\n item.instance.primeHighlightCache();\n }\n\n private getElementPoolLimit() {\n const viewportSize = this.getHeight() + this.config.overscrollSize * 2;\n const { diffHeaderHeight } = this.itemMetricsCache;\n // The goal here roughly is to hold an element pool that's maxed out at\n // around the size of all collapsed files, doubled if `isContainerManaged`\n // because we have to wait an additional render tick to actually re-use the\n // elements\n return (\n Math.max(\n 8,\n Math.ceil(viewportSize / Math.max(diffHeaderHeight, 10)) + 1\n ) * (this.isContainerManaged ? 2 : 1)\n );\n }\n\n private acquireElement(): HTMLElement {\n this.promotePendingPooledElements();\n let element = this.elementPool.pop();\n while (element != null && !this.isElementPoolGenerationCurrent(element)) {\n element = this.elementPool.pop();\n }\n element ??= document.createElement(DIFFS_TAG_NAME);\n this.markElementPoolGenerationCurrent(element);\n return element;\n }\n\n private releaseRenderedItem(item: CodeViewContextItem<LAnnotation>): void {\n const { element } = item;\n item.instance.cleanUp(true);\n item.element = undefined;\n if (element == null) {\n return;\n }\n\n element.remove();\n this.cleanElement(element);\n this.queueElementForPool(element);\n }\n\n // Strip item-specific DOM while keeping the expensive shared shell assets\n // that are valid for every item in this CodeView until shared options\n // change.\n private cleanElement(element: HTMLElement): void {\n const { shadowRoot } = element;\n if (shadowRoot != null) {\n for (const child of Array.from(shadowRoot.children)) {\n if (!isPooledShadowChild(child)) {\n child.remove();\n }\n }\n }\n\n if (!this.isContainerManaged) {\n element.replaceChildren();\n }\n }\n\n private queueElementForPool(element: HTMLElement): void {\n const poolLimit = this.getElementPoolLimit();\n if (\n !this.isElementPoolGenerationCurrent(element) ||\n this.getElementPoolSize() >= poolLimit\n ) {\n return;\n }\n\n if (this.isElementClean(element)) {\n this.elementPool.push(element);\n } else {\n this.pendingElementPool.push(element);\n }\n }\n\n private promotePendingPooledElements(): void {\n if (this.pendingElementPool.length === 0) {\n return;\n }\n\n const { pendingElementPool: pendingElements } = this;\n this.pendingElementPool = [];\n const poolLimit = this.getElementPoolLimit();\n for (const element of pendingElements) {\n if (\n this.isElementPoolGenerationCurrent(element) &&\n this.isElementClean(element) &&\n this.elementPool.length < poolLimit\n ) {\n this.elementPool.push(element);\n } else if (\n this.isElementPoolGenerationCurrent(element) &&\n this.getElementPoolSize() < poolLimit\n ) {\n this.pendingElementPool.push(element);\n }\n }\n }\n\n private isElementClean(element: HTMLElement): boolean {\n return element.childNodes.length === 0;\n }\n\n private getElementPoolSize(): number {\n return this.elementPool.length + this.pendingElementPool.length;\n }\n\n private clearElementPool(): void {\n this.elementPool.length = 0;\n this.pendingElementPool.length = 0;\n }\n\n private invalidateElementPool(): void {\n this.elementPoolVersion++;\n this.clearElementPool();\n }\n\n private markElementPoolGenerationCurrent(element: HTMLElement): void {\n this.elementPoolTracker.set(element, this.elementPoolVersion);\n }\n\n private isElementPoolGenerationCurrent(element: HTMLElement): boolean {\n return this.elementPoolTracker.get(element) === this.elementPoolVersion;\n }\n\n private resolveEffectiveScrollBehavior(\n target: CodeViewScrollTarget,\n destination: number\n ): Exclude<CodeViewScrollBehavior, 'smooth-auto'> {\n if (prefersReducedMotion()) {\n return 'instant';\n }\n\n if (target.behavior !== 'smooth-auto') {\n return target.behavior ?? 'instant';\n }\n\n return Math.abs(destination - this.getScrollTop()) <= this.getHeight() * 10\n ? 'smooth'\n : 'instant';\n }\n\n public scrollTo(target: CodeViewScrollTarget): void {\n if (this.root == null) {\n return;\n }\n\n const pendingTarget = this.normalizeScrollTarget(target);\n if (pendingTarget == null) {\n return;\n }\n\n const destination = this.resolveScrollTargetTop(pendingTarget);\n if (destination == null) {\n return;\n }\n\n this.primeScrollTarget(pendingTarget);\n\n const behavior = this.resolveEffectiveScrollBehavior(\n pendingTarget,\n destination\n );\n if (behavior === 'smooth') {\n // Use ??= so if we have an animation in progress it will be smoothly\n // transitioned into the new target and not reset\n this.scrollAnimation ??= {\n position: this.getScrollTop(),\n velocity: 0,\n // Since we kick off a render to requestAnimationFrame, by initializing\n // lastTimestamp as performance.now() it means we can begin animating\n // on the next render call and not wait a frame to get frame time\n lastTimestamp: performance.now(),\n };\n } else {\n this.scrollAnimation = undefined;\n }\n\n // We'll attempt to scroll to this new target on the next render frame\n this.suspendScrollInteractions();\n this.pendingLayoutAnchor = undefined;\n this.pendingScrollTarget = pendingTarget;\n this.render();\n }\n\n public setSelectedLines(\n selection: CodeViewLineSelection | null,\n options?: SelectionWriteOptions\n ): void {\n this.applySelectedLines(selection, options);\n }\n\n public getSelectedLines(): CodeViewLineSelection | null {\n return this.selectedLines;\n }\n\n public clearSelectedLines(options?: SelectionWriteOptions): void {\n this.applySelectedLines(null, options);\n }\n\n public getItem(itemId: string): CodeViewItem<LAnnotation> | undefined {\n return this.idToItem.get(itemId)?.item;\n }\n\n public updateItem(input: CodeViewItem<LAnnotation>): boolean {\n const item = this.idToItem.get(input.id);\n if (item == null) {\n console.error(`CodeView.updateItem: unknown item id \"${input.id}\"`);\n return false;\n }\n\n if (!this.syncItemRecord(item, input)) {\n return false;\n }\n\n this.markItemLayoutDirty(item);\n this.scrollDirty = true;\n this.render();\n this.syncSelection();\n return true;\n }\n\n public updateItemId(oldId: string, newId: string): boolean {\n if (oldId === newId) {\n return true;\n }\n\n const item = this.idToItem.get(oldId);\n if (item == null) {\n console.error(`CodeView.updateItemId: unknown item id \"${oldId}\"`);\n return false;\n }\n\n if (this.idToItem.has(newId)) {\n console.error(`CodeView.updateItemId: duplicate item id \"${newId}\"`);\n return false;\n }\n\n this.idToItem.delete(oldId);\n item.item.id = newId;\n this.idToItem.set(newId, item);\n this.updateItemOptionsId(item.instance.options, newId);\n\n if (this.selectedLines?.id === oldId) {\n this.selectedLines = { ...this.selectedLines, id: newId };\n this.options.onSelectedLinesChange?.(this.selectedLines);\n }\n this.renamePendingScrollTarget(oldId, newId);\n this.renamePendingLayoutAnchor(oldId, newId);\n this.render();\n return true;\n }\n\n public addItem(input: CodeViewItem<LAnnotation>): void {\n this.addItems([input]);\n this.syncSelection();\n }\n\n public addItems(inputs: readonly CodeViewItem<LAnnotation>[]): void {\n this.appendItemsInternal(inputs);\n this.syncSelection();\n }\n\n public setItems(items: readonly CodeViewItem<LAnnotation>[]): void {\n if (items.length === 0) {\n this.reset();\n } else if (this.items.length === 0) {\n this.appendItemsInternal(items);\n } else if (!this.tryAppendItems(items)) {\n this.reconcileItems(items);\n }\n this.syncSelection();\n }\n\n /**\n * Append new records to the viewer while preserving existing layout state.\n * This is the shared path for imperative adds and the append-only reconcile\n * fast path, so it measures new items immediately and only triggers render\n * once at the end.\n */\n private appendItemsInternal(\n inputs: readonly CodeViewItem<LAnnotation>[],\n render = true\n ): void {\n if (inputs.length === 0) {\n return;\n }\n\n const layout = this.getLayout();\n let nextTop = this.items.length === 0 ? 0 : this.scrollHeight + layout.gap;\n const appendedTop = nextTop;\n for (let index = 0; index < inputs.length; index++) {\n const input = inputs[index];\n if (input == null) {\n throw new Error('CodeView.appendItemsInternal: missing input item');\n }\n if (this.idToItem.has(input.id)) {\n throw new Error(`CodeView.addItem: duplicate id \"${input.id}\"`);\n }\n\n const item = this.createItem(input, this.items.length, nextTop);\n this.items.push(item);\n this.idToItem.set(item.item.id, item);\n this.instanceToItem.set(item.instance, item);\n item.height = prepareItemInstance(item);\n nextTop += item.height + layout.gap;\n }\n\n this.scrollHeight = nextTop - layout.gap;\n this.scrollDirty = true;\n if (render) {\n if (this.canSkipRenderForAppend(appendedTop)) {\n this.syncContainerHeight();\n } else {\n this.render();\n }\n }\n }\n\n private canSkipRenderForAppend(appendedTop: number): boolean {\n return (\n this.container != null &&\n this.renderState.firstIndex !== -1 &&\n this.pendingScrollTarget == null &&\n this.scrollAnimation == null &&\n this.layoutDirtyIndex == null &&\n appendedTop > this.windowSpecs.bottom\n );\n }\n\n public onThemeChange(): void {\n this.invalidateElementPool();\n }\n\n public setOptions(options: CodeViewOptions<LAnnotation> | undefined): void {\n if (options == null) {\n return;\n }\n\n this.capturePendingLayoutAnchor();\n const { options: prevOptions } = this;\n const previousLayout = this.getLayout();\n const { itemMetricsCache: previousItemMetrics } = this;\n\n if (shouldClearPool(prevOptions, options)) {\n this.invalidateElementPool();\n }\n\n this.options = options;\n const nextItemMetrics = this.computeMetricsCache(options.itemMetrics);\n const itemMetricsChanged = !areObjectsEqual(\n previousItemMetrics,\n nextItemMetrics\n );\n const layoutChanged = !areObjectsEqual(previousLayout, this.getLayout());\n if (layoutChanged) {\n this.syncLayout();\n }\n\n const itemLayoutChanged =\n itemMetricsChanged || hasItemLayoutOptionChanged(prevOptions, options);\n if (itemLayoutChanged) {\n const previousReset = this.pendingLayoutReset;\n this.pendingLayoutReset = {\n metrics: itemMetricsChanged ? nextItemMetrics : previousReset?.metrics,\n resetFileLayoutCache: true,\n resetDiffLayoutCache: true,\n includeEstimatedDiffHeights:\n previousReset?.includeEstimatedDiffHeights === true ||\n itemMetricsChanged ||\n hasCodeViewDiffEstimateOptionChanged(prevOptions, options),\n };\n }\n\n if (layoutChanged || itemLayoutChanged) {\n this.markLayoutDirtyFromIndex(0);\n this.scrollDirty = true;\n }\n\n if (!areOptionsEqual(prevOptions, options)) {\n this.renderOptionsRevision++;\n }\n\n if (!this.isContainerManaged && this.items.length > 0) {\n this.render();\n }\n }\n\n private capturePendingLayoutAnchor(): void {\n if (\n this.root == null ||\n this.items.length === 0 ||\n this.pendingScrollTarget != null\n ) {\n return;\n }\n\n this.pendingLayoutAnchor = this.getScrollAnchor(this.getScrollTop());\n }\n\n public render(immediate = false): void {\n if (CodeView.__STOP) {\n return;\n }\n if (immediate) {\n dequeueRender(this.computeRenderRangeAndEmit);\n this.computeRenderRangeAndEmit();\n } else {\n queueRender(this.computeRenderRangeAndEmit);\n }\n }\n\n public instanceChanged(\n instance: VirtualizedFile<LAnnotation> | VirtualizedFileDiff<LAnnotation>,\n layoutDirty: boolean\n ): void {\n // NOTE(amadeus): This is technically broken at the moment. What we\n // probably SHOULD do to fix is, it push the instance to some sort of\n // instance changed set, then iterate through all items and re-compute\n // everything to get new tops?\n const item = this.instanceToItem.get(instance);\n if (item == null) {\n throw new Error(\n 'CodeView.instanceChanged: An instance has changed that is not registered'\n );\n }\n if (layoutDirty) {\n this.markItemLayoutDirty(item);\n }\n this.render();\n }\n\n public getWindowSpecs(): VirtualWindowSpecs {\n return this.windowSpecs;\n }\n\n public getContainerElement(): HTMLElement | undefined {\n return this.root;\n }\n\n public getRenderedItems(): CodeViewRenderedItem<LAnnotation>[] {\n const { firstIndex, lastIndex } = this.renderState;\n if (firstIndex === -1 || lastIndex === -1 || lastIndex < firstIndex) {\n return [];\n }\n\n const renderedItems: CodeViewRenderedItem<LAnnotation>[] = [];\n\n for (let index = firstIndex; index <= lastIndex; index++) {\n const item = this.items[index];\n if (item?.element == null) {\n continue;\n }\n\n if (item.type === 'diff') {\n renderedItems.push({\n id: item.item.id,\n type: 'diff',\n item: item.item,\n version: item.version,\n element: item.element,\n instance: item.instance,\n });\n } else {\n renderedItems.push({\n id: item.item.id,\n type: 'file',\n item: item.item,\n version: item.version,\n element: item.element,\n instance: item.instance,\n });\n }\n }\n\n return renderedItems;\n }\n\n public setSlotCoordinator(\n coordinator?: CodeViewCoordinator<LAnnotation>\n ): boolean {\n if (coordinator === this.slotCoordinator) {\n return false;\n }\n this.slotCoordinator = coordinator;\n this.slotSnapshot = undefined;\n return true;\n }\n\n public getSlotSnapshot(\n coordinator: CodeViewCoordinator<LAnnotation>\n ): CodeViewRenderedItem<LAnnotation>[] | undefined {\n return getSlotSnapshot(this.getRenderedItems(), coordinator);\n }\n\n public subscribeToScroll(\n listener: CodeViewScrollListener<LAnnotation>\n ): () => void {\n this.scrollListeners.add(listener);\n return () => {\n this.scrollListeners.delete(listener);\n };\n }\n\n public getLocalTopForInstance(\n instance: VirtualizedFile<LAnnotation> | VirtualizedFileDiff<LAnnotation>\n ): number {\n const item = this.instanceToItem.get(instance);\n if (item == null) {\n throw new Error(\n 'CodeView.getLocalTopForInstance: unknown virtualized instance'\n );\n }\n return item.top;\n }\n\n public getTopForItem(id: string): number | undefined {\n const item = this.idToItem.get(id);\n if (item == null) {\n return undefined;\n }\n return item.top + this.getLayout().paddingTop;\n }\n\n private createItem(\n input: CodeViewItem<LAnnotation>,\n index: number,\n top: number\n ): CodeViewContextItem<LAnnotation> {\n const { itemMetricsCache: itemMetrics } = this;\n if (input.type === 'diff') {\n const instance = new VirtualizedFileDiff<LAnnotation>(\n this.createDiffOptions(input.id),\n this,\n itemMetrics,\n this.workerManager,\n this.isContainerManaged\n );\n return {\n type: 'diff',\n item: input,\n version: input.version,\n index,\n top,\n height: 0,\n element: undefined,\n renderedOptionsRevision: this.renderOptionsRevision,\n instance,\n } satisfies CodeViewDiffItemContext<LAnnotation>;\n }\n\n const instance = new VirtualizedFile<LAnnotation>(\n this.createFileOptions(input.id),\n this,\n itemMetrics,\n this.workerManager,\n this.isContainerManaged\n );\n return {\n type: 'file',\n item: input,\n version: input.version,\n index,\n top,\n height: 0,\n element: undefined,\n renderedOptionsRevision: this.renderOptionsRevision,\n instance,\n } satisfies CodeViewFileItemContext<LAnnotation>;\n }\n\n private applySelectedLines(\n selection: CodeViewLineSelection | null,\n options?: SelectionWriteOptions\n ): void {\n const { selectedLines: prevSelection } = this;\n if (\n (selection == null && prevSelection == null) ||\n (selection != null &&\n prevSelection?.id === selection.id &&\n areSelectionsEqual(prevSelection.range, selection.range))\n ) {\n return;\n }\n\n // If we are selecting a new element and had a previous selection, null out\n // the current selection, otherwise if it's a selection on the same item\n // the next selection will take care of that for us\n if (prevSelection != null && prevSelection.id !== selection?.id) {\n this.idToItem\n .get(prevSelection.id)\n ?.instance.setSelectedLines(null, { notify: false });\n }\n\n this.selectedLines = selection;\n this.idToItem\n .get(selection?.id ?? '')\n ?.instance.setSelectedLines(selection?.range ?? null, options);\n }\n\n private syncSelection(): void {\n if (this.selectedLines == null) {\n return;\n }\n\n const item = this.idToItem.get(this.selectedLines.id);\n if (item == null) {\n this.selectedLines = null;\n return;\n }\n\n item.instance.setSelectedLines(this.selectedLines.range, { notify: false });\n }\n\n private renamePendingScrollTarget(oldId: string, newId: string): void {\n const { pendingScrollTarget } = this;\n if (\n pendingScrollTarget == null ||\n pendingScrollTarget.type === 'position' ||\n pendingScrollTarget.id !== oldId\n ) {\n return;\n }\n\n this.pendingScrollTarget = { ...pendingScrollTarget, id: newId };\n }\n\n private renamePendingLayoutAnchor(oldId: string, newId: string): void {\n if (this.pendingLayoutAnchor?.id === oldId) {\n this.pendingLayoutAnchor.id = newId;\n }\n }\n\n // CodeView owns advanced option invalidation. These item option facades only\n // answer current option reads for the item instance that keeps them for its\n // lifetime. The accessors live on per-CodeView prototypes so large viewers do\n // not allocate the full option surface for every file or diff item.\n private createFileOptionsPrototype(): FileOptions<LAnnotation> {\n const prototype = {} as FileOptions<LAnnotation>;\n\n for (const key of CODE_VIEW_FILE_OPTION_KEYS) {\n defineItemOption<FileOptions<LAnnotation>, CodeViewFileOptionKeys>(\n prototype,\n key,\n () => this.options[key]\n );\n }\n\n defineItemOption(\n prototype,\n 'stickyHeader',\n () => this.options.stickyHeaders\n );\n defineItemOption(\n prototype,\n 'collapsed',\n (receiver) =>\n this.getItemOptions(getItemOptionsState(receiver), 'file')?.item\n .collapsed === true\n );\n\n for (const key of CODE_VIEW_SHARED_CALLBACK_KEYS) {\n this.defineItemSharedCallback(prototype, 'file', key);\n }\n for (const key of CODE_VIEW_SELECTION_CALLBACK_KEYS) {\n this.defineItemSelectionCallback(prototype, 'file', key);\n }\n\n return prototype;\n }\n\n private createDiffOptionsPrototype(): FileDiffOptions<LAnnotation> {\n const prototype = {} as FileDiffOptions<LAnnotation>;\n\n for (const key of CODE_VIEW_DIFF_OPTION_KEYS) {\n defineItemOption<FileDiffOptions<LAnnotation>, CodeViewDiffOptionKeys>(\n prototype,\n key,\n () => this.options[key]\n );\n }\n\n defineItemOption(\n prototype,\n 'stickyHeader',\n () => this.options.stickyHeaders\n );\n defineItemOption(\n prototype,\n 'hunkSeparators',\n () => this.options.hunkSeparators\n );\n defineItemOption(\n prototype,\n 'collapsed',\n (receiver) =>\n this.getItemOptions(getItemOptionsState(receiver), 'diff')?.item\n .collapsed === true\n );\n\n for (const key of CODE_VIEW_SHARED_CALLBACK_KEYS) {\n this.defineItemSharedCallback(prototype, 'diff', key);\n }\n for (const key of CODE_VIEW_SELECTION_CALLBACK_KEYS) {\n this.defineItemSelectionCallback(prototype, 'diff', key);\n }\n\n return prototype;\n }\n\n private createFileOptions(id: string): FileOptions<LAnnotation> {\n // The per-item options object intentionally owns only hidden state. All\n // public option reads fall through to the shared prototype above.\n const options = Object.create(\n this.fileOptionsPrototype\n ) as FileOptions<LAnnotation>;\n const state: CodeViewItemOptionsState = {\n id,\n };\n defineOptionsState(options, state);\n return options;\n }\n\n private createDiffOptions(id: string): FileDiffOptions<LAnnotation> {\n // The per-item options object intentionally owns only hidden state. All\n // public option reads fall through to the shared prototype above.\n const options = Object.create(\n this.diffOptionsPrototype\n ) as FileDiffOptions<LAnnotation>;\n const state: CodeViewItemOptionsState = {\n id,\n };\n defineOptionsState(options, state);\n return options;\n }\n\n private updateItemOptionsId(\n options: FileOptions<LAnnotation> | FileDiffOptions<LAnnotation>,\n id: string\n ): void {\n getItemOptionsState(options).id = id;\n }\n\n private getItemOptions<TMode extends CodeViewMode>(\n state: CodeViewItemOptionsState,\n mode: TMode\n ): CodeViewModeItemContext<LAnnotation, TMode> | undefined {\n const item = this.idToItem.get(state.id);\n if (item == null || item.type !== mode) {\n return undefined;\n }\n return item as CodeViewModeItemContext<LAnnotation, TMode>;\n }\n\n private defineItemSharedCallback<\n TMode extends CodeViewMode,\n TKey extends CodeViewSharedCallbackKeys,\n >(\n options: CodeViewModeOptions<LAnnotation, TMode>,\n mode: TMode,\n key: TKey\n ): void {\n defineItemOption(\n options as Record<\n TKey,\n CodeViewModeOptions<LAnnotation, TMode>[TKey] | undefined\n >,\n key,\n (receiver) => {\n const current = this.options[key] as\n | CodeViewModeOptionCallback<LAnnotation, TMode, TKey>\n | undefined;\n if (current == null) {\n return undefined;\n }\n\n const state = getItemOptionsState(\n receiver as CodeViewModeOptions<LAnnotation, TMode>\n );\n // Allocate wrapper storage only once a callback option is actually\n // observed. Most large CodeViews never read these callback properties.\n const callbackCache = (state.callbackCache ??= {});\n let wrapped = callbackCache[key] as\n | CodeViewModeOptions<LAnnotation, TMode>[TKey]\n | undefined;\n if (wrapped == null) {\n wrapped = ((...args: unknown[]) => {\n const latest = this.getItemOptions(state, mode);\n if (latest == null) {\n return undefined;\n }\n const callback = this.options[key] as\n | CodeViewModeInternalOptionCallback<LAnnotation, TMode, TKey>\n | undefined;\n return (\n callback as ((...callbackArgs: unknown[]) => unknown) | undefined\n )?.(...args, latest);\n }) as CodeViewModeOptions<LAnnotation, TMode>[TKey];\n\n callbackCache[key] = wrapped;\n }\n\n return wrapped;\n }\n );\n }\n\n private defineItemSelectionCallback<\n TMode extends CodeViewMode,\n TKey extends CodeViewSelectionCallbackKeys,\n >(\n options: CodeViewModeOptions<LAnnotation, TMode>,\n mode: TMode,\n key: TKey\n ): void {\n defineItemOption(\n options as Record<\n TKey,\n CodeViewModeOptions<LAnnotation, TMode>[TKey] | undefined\n >,\n key,\n (receiver) => {\n if (this.options.enableLineSelection !== true) {\n return undefined;\n }\n\n const state = getItemOptionsState(\n receiver as CodeViewModeOptions<LAnnotation, TMode>\n );\n // Selection callbacks also use the per-item lazy cache. The wrapper\n // owns CodeView selection synchronization and then delegates to the\n // latest user callback, if one exists.\n const callbackCache = (state.callbackCache ??= {});\n let wrapped = callbackCache[key] as\n | CodeViewModeOptions<LAnnotation, TMode>[TKey]\n | undefined;\n if (wrapped == null) {\n wrapped = ((range: SelectedLineRange | null) => {\n const latest = this.getItemOptions(state, mode);\n if (latest == null) {\n return undefined;\n }\n\n const selection =\n range == null ? null : { id: latest.item.id, range };\n if (this.options.controlledSelection !== true) {\n if (range != null || this.selectedLines?.id === latest.item.id) {\n this.applySelectedLines(selection, { notify: false });\n }\n }\n\n this.options.onSelectedLinesChange?.(selection);\n\n const callback = this.options[key] as\n | ((\n nextRange: SelectedLineRange | null,\n context: CodeViewModeItemContext<LAnnotation, TMode>\n ) => unknown)\n | undefined;\n return callback?.(range, latest);\n }) as CodeViewModeOptions<LAnnotation, TMode>[TKey];\n\n callbackCache[key] = wrapped;\n }\n\n return wrapped;\n }\n );\n }\n\n /**\n * Track the earliest index whose measured layout may now be stale. Later\n * render passes relayout from this point forward so we do not have to rebuild\n * positions for the whole list after every change.\n */\n private markLayoutDirtyFromIndex(index: number): void {\n this.layoutDirtyIndex = Math.min(this.layoutDirtyIndex ?? index, index);\n }\n\n /**\n * Mark the earliest affected item as layout-dirty after an imperative change.\n * Each record carries its current array index so this stays O(1) even when\n * the viewer holds a very large number of items.\n */\n private markItemLayoutDirty(item: CodeViewContextItem<LAnnotation>): void {\n if (this.items[item.index] !== item) {\n throw new Error(\n `CodeView.markItemLayoutDirty: unknown item id \"${item.item.id}\"`\n );\n }\n\n this.markLayoutDirtyFromIndex(item.index);\n }\n\n /**\n * Detect the common controlled-update case where the new list simply extends\n * the existing ordered prefix. When that happens we can reuse every current\n * record in place, sync any versioned payload changes, and append only the new\n * tail instead of rebuilding the whole list.\n */\n private tryAppendItems(items: readonly CodeViewItem<LAnnotation>[]): boolean {\n if (items.length <= this.items.length) {\n return false;\n }\n\n for (let index = 0; index < this.items.length; index++) {\n const existingItem = this.items[index];\n if (existingItem == null) {\n throw new Error('CodeView.tryAppendItems: missing existing item');\n }\n const nextItem = items[index];\n if (\n nextItem == null ||\n existingItem.item.id !== nextItem.id ||\n existingItem.type !== nextItem.type\n ) {\n return false;\n }\n }\n\n for (let index = 0; index < this.items.length; index++) {\n const existingItem = this.items[index];\n if (existingItem == null) {\n throw new Error('CodeView.tryAppendItems: missing existing item');\n }\n const nextItem = items[index];\n if (nextItem == null) {\n throw new Error(\n 'CodeView.tryAppendItems: append candidate missing prefix item'\n );\n }\n if (this.syncItemRecord(existingItem, nextItem)) {\n this.markLayoutDirtyFromIndex(index);\n }\n }\n\n this.appendItemsInternal(items.slice(this.items.length), false);\n this.scrollDirty = true;\n this.render();\n return true;\n }\n\n /**\n * Reconcile a new controlled item list against the existing records by id.\n * This reuses records and instances when type matches, cleans up removed\n * records, rebuilds the lookup maps, and marks layout dirty whenever order,\n * membership, or versioned item data changes.\n */\n private reconcileItems(items: readonly CodeViewItem<LAnnotation>[]): void {\n const { items: previousItems, idToItem: previousById } = this;\n const removedItems = new Set(previousItems);\n const nextItems: CodeViewContextItem<LAnnotation>[] = [];\n const nextIdToItem: Map<\n string,\n CodeViewContextItem<LAnnotation>\n > = new Map();\n const nextInstanceToItem: Map<\n VirtualizedFileDiff<LAnnotation> | VirtualizedFile<LAnnotation>,\n CodeViewContextItem<LAnnotation>\n > = new Map();\n let firstDirtyIndex: number | undefined;\n\n for (let index = 0; index < items.length; index++) {\n const input = items[index];\n if (input == null) {\n throw new Error('CodeView.reconcileItems: missing input item');\n }\n if (nextIdToItem.has(input.id)) {\n throw new Error(`CodeView.setItems: duplicate id \"${input.id}\"`);\n }\n\n const previousItem = previousById.get(input.id);\n const item =\n previousItem != null && previousItem.type === input.type\n ? previousItem\n : this.createItem(input, index, 0);\n\n item.index = index;\n\n if (previousItem != null && previousItem.type === input.type) {\n removedItems.delete(previousItem);\n if (this.syncItemRecord(item, input)) {\n firstDirtyIndex = Math.min(firstDirtyIndex ?? index, index);\n }\n } else {\n firstDirtyIndex = Math.min(firstDirtyIndex ?? index, index);\n }\n\n if (previousItems[index] !== item) {\n firstDirtyIndex = Math.min(firstDirtyIndex ?? index, index);\n }\n\n nextItems.push(item);\n nextIdToItem.set(input.id, item);\n nextInstanceToItem.set(item.instance, item);\n }\n\n for (let index = 0; index < previousItems.length; index++) {\n const removedItem = previousItems[index];\n if (removedItem == null || !removedItems.has(removedItem)) {\n continue;\n }\n this.releaseRenderedItem(removedItem);\n const dirtyIndex = Math.max(nextItems.length - 1, 0);\n firstDirtyIndex = Math.min(firstDirtyIndex ?? dirtyIndex, dirtyIndex);\n }\n\n if (firstDirtyIndex == null) {\n return;\n }\n\n this.items = nextItems;\n this.idToItem = nextIdToItem;\n this.instanceToItem = nextInstanceToItem;\n\n if (this.renderState.firstIndex >= nextItems.length) {\n this.resetRenderState();\n } else if (this.renderState.lastIndex >= nextItems.length) {\n this.renderState.lastIndex = nextItems.length - 1;\n }\n\n this.markLayoutDirtyFromIndex(firstDirtyIndex);\n this.scrollDirty = true;\n this.render();\n }\n\n /**\n * Update a reused record from the latest controlled item only when its item\n * version changes. Matching versions mean CodeView keeps the current record\n * snapshot, which lets imperative updates remain in place until the caller\n * intentionally publishes a newer version.\n */\n private syncItemRecord(\n item: CodeViewContextItem<LAnnotation>,\n nextItem: CodeViewItem<LAnnotation>\n ): boolean {\n if (item.type !== nextItem.type) {\n throw new Error(\n `CodeView.syncItemRecord: type mismatch for id \"${nextItem.id}\"`\n );\n }\n\n if (item.version === nextItem.version) {\n return false;\n }\n\n item.item = nextItem;\n item.version = nextItem.version;\n item.renderedOptionsRevision = -1;\n return true;\n }\n\n private getMaxScrollTopForHeight(scrollHeight: number): number {\n const { paddingBottom, paddingTop } = this.getLayout();\n return Math.max(\n paddingTop + scrollHeight + paddingBottom - this.getHeight(),\n 0\n );\n }\n\n private getMaxScrollTop(): number {\n return this.getMaxScrollTopForHeight(this.getScrollHeight());\n }\n\n private shouldRebaseScroll(): boolean {\n return this.getMaxScrollTop() > SCROLL_REBASE_THRESHOLD;\n }\n\n private getPagedScrollHeight(): number {\n return this.shouldRebaseScroll()\n ? Math.min(this.getScrollHeight(), SCROLL_REBASE_CONTAINER_HEIGHT)\n : this.getScrollHeight();\n }\n\n private getMaxPagedScrollTop(): number {\n return this.getMaxScrollTopForHeight(this.getPagedScrollHeight());\n }\n\n private clampPagedScrollTop(value: number): number {\n const maxScroll = this.getMaxPagedScrollTop();\n return Math.max(0, Math.min(value, maxScroll));\n }\n\n /**\n * Clamps a logical scroll position to the min/max allowable scroll range\n * based on the full computed content height.\n */\n private clampScrollTop(value: number): number {\n const maxScroll = this.getMaxScrollTop();\n return Math.max(0, Math.min(value, maxScroll));\n }\n\n private getMaxScrollPageOffset(): number {\n return Math.max(this.getMaxScrollTop() - this.getMaxPagedScrollTop(), 0);\n }\n\n private clampScrollPageOffset(value: number): number {\n const maxOffset = this.getMaxScrollPageOffset();\n return Math.max(0, Math.min(value, maxOffset));\n }\n\n private resolveScrollPageWindow(\n scrollTop: number,\n preferredPagedScrollTop: number\n ): { pagedScrollTop: number; scrollPageOffset: number } {\n let pagedScrollTop = roundToDevicePixel(\n this.clampPagedScrollTop(preferredPagedScrollTop)\n );\n let scrollPageOffset = this.clampScrollPageOffset(\n scrollTop - pagedScrollTop\n );\n\n pagedScrollTop = roundToDevicePixel(\n this.clampPagedScrollTop(scrollTop - scrollPageOffset)\n );\n scrollPageOffset = this.clampScrollPageOffset(scrollTop - pagedScrollTop);\n return { pagedScrollTop, scrollPageOffset };\n }\n\n /**\n * Resolve how a logical scrollTop maps onto the reusable paged scroll window\n * without mutating the current page offset.\n */\n private resolvePagedScrollPosition(\n logicalScrollTop: number\n ): PagedScrollPosition {\n if (!this.shouldRebaseScroll()) {\n return {\n pagedScrollTop: this.clampPagedScrollTop(logicalScrollTop),\n scrollPageOffset: 0,\n };\n }\n\n const currentPageOffset = this.clampScrollPageOffset(this.scrollPageOffset);\n\n const pagedScrollTop = logicalScrollTop - currentPageOffset;\n const pagedMaxScrollTop = this.getMaxPagedScrollTop();\n const maxRebaseOffset = this.getMaxScrollPageOffset();\n const shouldMoveDown =\n pagedScrollTop > SCROLL_REBASE_THRESHOLD &&\n currentPageOffset < maxRebaseOffset;\n const shouldMoveUp =\n pagedScrollTop < SCROLL_REBASE_TRIGGER_TOP && currentPageOffset > 0;\n\n if (\n pagedScrollTop < 0 ||\n pagedScrollTop > pagedMaxScrollTop ||\n shouldMoveDown ||\n shouldMoveUp\n ) {\n const nextWindow = this.resolveScrollPageWindow(\n logicalScrollTop,\n shouldMoveUp\n ? Math.min(SCROLL_REBASE_TARGET_BOTTOM, pagedMaxScrollTop)\n : SCROLL_REBASE_TARGET_TOP\n );\n return nextWindow;\n }\n\n return {\n pagedScrollTop: roundToDevicePixel(\n this.clampPagedScrollTop(pagedScrollTop)\n ),\n scrollPageOffset: currentPageOffset,\n };\n }\n\n private needsScrollPageUpdate(logicalScrollTop: number): boolean {\n const roundedScrollTop = roundToDevicePixel(\n this.clampScrollTop(logicalScrollTop)\n );\n const { scrollPageOffset } =\n this.resolvePagedScrollPosition(roundedScrollTop);\n return scrollPageOffset !== this.scrollPageOffset;\n }\n\n private getPagedLayoutTop(logicalTop: number): number {\n if (!this.shouldRebaseScroll()) {\n return logicalTop;\n }\n return Math.max(logicalTop - this.scrollPageOffset, 0);\n }\n\n private getStickyHeaderOffset(): number {\n return this.options.stickyHeaders === true &&\n this.options.disableFileHeader !== true\n ? this.itemMetricsCache.diffHeaderHeight\n : 0;\n }\n\n private getScrollTargetRect(\n target:\n | CodeViewItemScrollTarget\n | CodeViewLineScrollTarget\n | CodeViewRangeScrollTarget\n ): { top: number; height: number } | undefined {\n const item = this.idToItem.get(target.id);\n if (item == null) {\n console.warn(`CodeView.scrollTo: unknown item id \"${target.id}\"`);\n return undefined;\n }\n\n if (target.type === 'item') {\n return { top: item.top, height: item.height };\n }\n\n if (target.type === 'range') {\n const rangePosition = this.getRangeScrollPosition(item, target);\n if (rangePosition == null) {\n console.warn(\n `CodeView.scrollTo: unable to resolve range ${formatSelectedLineRange(target.range)} for item \"${target.id}\"`\n );\n return undefined;\n }\n\n return {\n top: item.top + rangePosition.top,\n height: rangePosition.height,\n };\n }\n\n const linePosition = this.getLineScrollPosition(item, target);\n if (linePosition == null) {\n console.warn(\n `CodeView.scrollTo: unable to resolve line ${target.lineNumber} for item \"${target.id}\"`\n );\n return undefined;\n }\n\n return {\n top: item.top + linePosition.top,\n height: linePosition.height,\n };\n }\n\n private normalizeScrollTarget(\n target: CodeViewScrollTarget\n ): PendingScrollTarget | undefined {\n if (target.type === 'position' || target.align !== 'nearest') {\n return target as PendingScrollTarget;\n }\n\n const rect = this.getScrollTargetRect(target);\n if (rect == null) {\n return undefined;\n }\n\n // Determine a stable scrollTo target for `nearest` alignment. This is to\n // ensure that we don't experience any scroll bouncing\n const offset = target.offset ?? 0;\n const targetTop = this.getLayout().paddingTop + rect.top;\n const targetBottom = targetTop + rect.height;\n const currentTop = this.getScrollTop();\n const visibleTop =\n currentTop +\n (target.type === 'line' || target.type === 'range'\n ? this.getStickyHeaderOffset()\n : 0);\n const visibleBottom = currentTop + this.getHeight();\n\n // If the item is spanning beyond the full viewport,\n // do nothing as it's already in view\n if (\n targetTop - offset <= visibleTop &&\n targetBottom + offset >= visibleBottom\n ) {\n return undefined;\n }\n\n // Let's use the top as the target\n if (targetTop - offset < visibleTop) {\n return { ...target, align: 'start' };\n }\n\n // Let's use the top as the target\n if (targetBottom + offset > visibleBottom) {\n return { ...target, align: 'end' };\n }\n\n // The element is already in view, nothing to do.\n return undefined;\n }\n\n /**\n * Resolve a target's scroll position\n\n * Returns `undefined` when we can't resolve a target for whatever reason\n */\n private resolveScrollTargetTop(\n target: PendingScrollTarget\n ): number | undefined {\n if (target.type === 'position') {\n const clampedPosition = this.clampScrollTop(target.position);\n return clampedPosition !== target.position\n ? // If our position was clamped, we we shouldn't apply the sticky offset\n clampedPosition\n : this.clampScrollTop(target.position - this.getStickyHeaderOffset());\n }\n\n const item = this.idToItem.get(target.id);\n if (item == null) {\n console.warn(`CodeView.scrollTo: unknown item id \"${target.id}\"`);\n return undefined;\n }\n\n if (target.type === 'item') {\n return this.clampScrollTop(\n this.resolveAlignedScrollPosition(\n item.top,\n item.height,\n target.align,\n target.offset\n )\n );\n }\n\n if (target.type === 'range') {\n const rangePosition = this.getRangeScrollPosition(item, target);\n if (rangePosition == null) {\n console.warn(\n `CodeView.scrollTo: unable to resolve range ${formatSelectedLineRange(target.range)} for item \"${target.id}\"`\n );\n return undefined;\n }\n\n return this.clampScrollTop(\n this.resolveAlignedScrollPosition(\n item.top + rangePosition.top,\n rangePosition.height,\n target.align,\n target.offset,\n this.getStickyHeaderOffset()\n )\n );\n }\n\n const linePosition = this.getLineScrollPosition(item, target);\n if (linePosition == null) {\n console.warn(\n `CodeView.scrollTo: unable to resolve line ${target.lineNumber} for item \"${target.id}\"`\n );\n return undefined;\n }\n\n return this.clampScrollTop(\n this.resolveAlignedScrollPosition(\n item.top + linePosition.top,\n linePosition.height,\n target.align,\n target.offset,\n this.getStickyHeaderOffset()\n )\n );\n }\n\n /**\n * Given an existing scroll target (scroll top and height), figure out the\n * correct scroll position to target based on the desired alignment, offset\n * and stickyOffset if necessary\n */\n private resolveAlignedScrollPosition(\n // REVIEW: lets turn this into a named interface object, essentially named\n // arguments that can't be confused/reversed\n targetTop: number,\n targetHeight: number,\n align: PendingAlignTypes,\n offset = 0,\n stickyOffset = 0\n ): number {\n targetTop += this.getLayout().paddingTop;\n const viewportHeight = this.getHeight();\n // If the item + offset is bigger than the viewport, we'll fall back to\n // 'start'\n if (align === 'center' && targetHeight + offset < viewportHeight) {\n return targetTop - (viewportHeight - targetHeight) / 2 + offset;\n }\n if (align === 'end') {\n return targetTop - (viewportHeight - targetHeight) + offset;\n }\n // 'start', the default\n return targetTop - stickyOffset - offset;\n }\n\n private getLineScrollPosition(\n item: CodeViewContextItem<LAnnotation>,\n target: CodeViewLineScrollTarget\n ): LineScrollPosition | undefined {\n if (item.type === 'diff') {\n return item.instance.getLinePosition(target.lineNumber, target.side);\n }\n\n return item.instance.getLinePosition(target.lineNumber);\n }\n\n private getRangeScrollPosition(\n item: CodeViewContextItem<LAnnotation>,\n target: CodeViewRangeScrollTarget\n ): LineScrollPosition | undefined {\n const { range } = target;\n const startPosition = this.getLineScrollPosition(item, {\n type: 'line',\n id: target.id,\n lineNumber: range.start,\n side: range.side,\n });\n const endPosition = this.getLineScrollPosition(item, {\n type: 'line',\n id: target.id,\n lineNumber: range.end,\n side: range.endSide ?? range.side,\n });\n if (startPosition == null || endPosition == null) {\n return undefined;\n }\n\n const startTop = startPosition.top;\n const startBottom = startTop + startPosition.height;\n const endTop = endPosition.top;\n const endBottom = endTop + endPosition.height;\n const top = Math.min(startTop, endTop);\n const bottom = Math.max(startBottom, endBottom);\n return { top, height: bottom - top };\n }\n\n /**\n * Determine target scroll position for current frame.\n *\n * If there's no pendingScrollTarget then we just return the current scroll\n * position\n *\n * If there's a pendingScrollTarget then we depend on whether there's a\n * smooth scroll animation or not. If not just return the destination, or\n * compute next position given the smooth scroll spring physics\n */\n private computeTargetScrollTopForFrame(\n scrollTop: number,\n frameTimestamp: number\n ): number {\n if (this.pendingScrollTarget == null) {\n return scrollTop;\n }\n const destination = this.resolveScrollTargetTop(this.pendingScrollTarget);\n if (destination == null) {\n return scrollTop;\n }\n const { scrollAnimation } = this;\n if (scrollAnimation == null) {\n return destination;\n }\n return this.computeSpringStep(scrollAnimation, destination, frameTimestamp)\n .position;\n }\n\n /**\n * Closed-form critical-damped ODE step.\n *\n * Stable at any dt (Euler would blow up once ω·dt ≳ 1), so this survives\n * big RAF gaps (tab-wake, offscreen frames) and resize-driven ticks that\n * fire outside the normal RAF cadence.\n */\n private computeSpringStep(\n animation: ScrollToAnimation,\n destination: number,\n frameTimestamp: number\n ): SpringStepResult {\n const dt = Math.max(0, frameTimestamp - animation.lastTimestamp);\n const { omega } = this.getSmoothScrollSettings();\n const decay = Math.exp(-omega * dt);\n const displacement = animation.position - destination;\n const springCoeff = animation.velocity + omega * displacement;\n const position = destination + (displacement + springCoeff * dt) * decay;\n const velocity =\n (springCoeff * (1 - omega * dt) - omega * displacement) * decay;\n return { position, velocity };\n }\n\n /**\n * For any given pendingScrollTarget, updates any in flight smooth scroll\n * animations and returns the target scrollTop to move towards\n *\n * Resolves the animation based on frame time and adopts any necessary scroll\n * anchoring corrections if necessary\n */\n private advanceScrollAnimation(\n frameTimestamp: number,\n anchorDelta: number\n ): number | undefined {\n if (this.pendingScrollTarget == null) {\n return undefined;\n }\n const destination = this.resolveScrollTargetTop(this.pendingScrollTarget);\n if (destination == null) {\n this.pendingScrollTarget = undefined;\n this.scrollAnimation = undefined;\n return undefined;\n }\n const animation = this.scrollAnimation;\n if (animation == null) {\n return destination;\n }\n\n animation.position += anchorDelta;\n\n const { position, velocity } = this.computeSpringStep(\n animation,\n destination,\n frameTimestamp\n );\n animation.lastTimestamp = frameTimestamp;\n animation.position = position;\n animation.velocity = velocity;\n\n const { positionEpsilon, velocityEpsilon } = this.getSmoothScrollSettings();\n if (\n Math.abs(destination - position) <= positionEpsilon &&\n Math.abs(velocity) <= velocityEpsilon\n ) {\n animation.position = destination;\n animation.velocity = 0;\n this.scrollAnimation = undefined;\n return destination;\n }\n\n return animation.position;\n }\n\n private computeRenderRangeAndEmit = (\n timestamp: number = performance.now()\n ): void => {\n if (CodeView.__STOP || this.container == null) {\n return;\n }\n\n // Read the current viewport and logical scroll position before making DOM\n // mutations, then capture an anchor that can survive layout recalculation.\n const viewportHeight = this.getHeight();\n const initialScrollTop = this.getScrollTop();\n let scrollTopAfterLayout = initialScrollTop;\n // Typically a pendingLayoutAnchor will be created from a setOptions call,\n // that will force us to attempt to fit to a new scroll position to not\n // allow the viewport to jump around on us. This can also be triggered\n // later on if a particular item marks itself as dirty\n let computeScrollCorrection = this.pendingLayoutAnchor != null;\n // We need to grab the anchor before we re-compute any layout updates, or\n // else we'll get invalid anchor reference data. If we have a\n // pendingLayoutAnchor it will just grab that for us instead of attempting\n // to compute one\n let scrollAnchor = this.getScrollAnchor(scrollTopAfterLayout);\n\n // If any item marked itself as difty, we should re-compute everything\n // after it and then force a new scroll top correction if we aren't already\n if (this.layoutDirtyIndex != null) {\n this.recomputeLayout(this.layoutDirtyIndex, this.pendingLayoutReset);\n this.layoutDirtyIndex = undefined;\n this.pendingLayoutReset = undefined;\n computeScrollCorrection = true;\n }\n\n // If layout shifted, resolve the logical scrollTop that keeps the captured\n // anchor in the same viewport position.\n if (computeScrollCorrection && scrollAnchor != null) {\n const anchoredScrollTopAfterLayout =\n this.resolveAnchoredScrollTop(scrollAnchor);\n if (anchoredScrollTopAfterLayout != null) {\n const layoutAnchorDelta =\n anchoredScrollTopAfterLayout - scrollTopAfterLayout;\n scrollTopAfterLayout = anchoredScrollTopAfterLayout;\n if (this.scrollAnimation != null) {\n // If we have a delta measurement adjustment, we have to pass that\n // change onto the scroll animation to ensure the animation remains\n // stable, later on\n this.scrollAnimation.position += layoutAnchorDelta;\n }\n }\n }\n // Recomputing layout can shrink the scroll range, for example when items\n // collapse, so clamp current scroll position and update DOM so scroll\n // changes are valid before deriving the render window for this frame.\n if (computeScrollCorrection) {\n scrollTopAfterLayout = this.clampScrollTop(scrollTopAfterLayout);\n this.syncContainerHeight();\n }\n\n // Resolve the logical scrollTop this render frame should target. The paged\n // root scrollTop is derived later only if the scaffold needs to move.\n const targetScrollTop = this.computeTargetScrollTopForFrame(\n scrollTopAfterLayout,\n timestamp\n );\n\n // When performing very large scroll jumps, we should attempt to render the\n // bare minimum to ensure we can paint quickly. We'll queue up another\n // render at the end to fill things out on the next tick. If we had to\n // correct layout-adjusted scroll state then we should not fitPerfectly\n // because there's a good chance we'll be re-rendering the same elements\n // again\n const fitPerfectly =\n !computeScrollCorrection &&\n (this.renderState.scrollTop === -1 ||\n Math.abs(targetScrollTop - this.renderState.scrollTop) >\n viewportHeight + this.config.overscrollSize * 2);\n\n // If we are doing a `fitPerfectly` render it means we are rendering\n // completely new content which means no need to scroll fix anything\n if (fitPerfectly) {\n scrollAnchor = undefined;\n }\n\n // Compute the projected logical window, then synchronize the paged scroll\n // scaffold before mutating rendered items.\n this.windowSpecs = createWindowFromScrollPosition({\n scrollTop: targetScrollTop,\n height: viewportHeight,\n scrollHeight: this.getScrollHeight(),\n fitPerfectly,\n fitPerfectlyOverscroll: this.getFitPerfectlyOverscroll(),\n overscrollSize: this.config.overscrollSize,\n });\n let syncedScrollTop = initialScrollTop;\n if (\n (this.pendingScrollTarget != null &&\n targetScrollTop !== syncedScrollTop) ||\n this.needsScrollPageUpdate(targetScrollTop)\n ) {\n // Apply programmatic scrolls and user-driven page rebases before DOM\n // mutations so the browser reconciles the render against the right\n // paged scroll position.\n this.applyScrollFix(targetScrollTop, syncedScrollTop, this.windowSpecs);\n syncedScrollTop = targetScrollTop;\n }\n\n // Reconcile the currently mounted DOM against the new projected render\n // window, cleaning up any elements that are no longer visible.\n const { top, bottom } = this.windowSpecs;\n const { firstIndex, lastIndex } = this.renderState;\n if (firstIndex >= 0) {\n for (let index = firstIndex; index <= lastIndex; index++) {\n const item = this.items[index];\n if (item == null) {\n throw new Error(\n `CodeView.computeRenderRangeAndEmit: No item at index: ${index}`\n );\n }\n const isVisible = item.top > top - item.height && item.top <= bottom;\n // If not visible, we should unmount it and clean it up\n if (!isVisible) {\n this.releaseRenderedItem(item);\n }\n }\n }\n\n let prevElement: HTMLElement | undefined;\n const updatedItems = new Set<CodeViewContextItem<LAnnotation>>();\n const startingIndex = this.findFirstVisibleIndex(top);\n const lastRenderedIndex = this.findLastVisibleIndex(bottom);\n\n for (\n let itemIndex = startingIndex;\n itemIndex <= lastRenderedIndex;\n itemIndex++\n ) {\n const item = this.items[itemIndex];\n if (item == null) {\n throw new Error(`CodeView.computeRenderRangeAndEmit: missing item`);\n }\n const { instance } = item;\n // If the item isn't rendered yet, we need to create a wrapper element\n // for it and render it\n if (item.element == null) {\n item.element = this.acquireElement();\n syncRenderedItemOrder(this.stickyContainer, item.element, prevElement);\n instance.virtualizedSetup();\n if (renderItem(item, item.element)) {\n item.renderedOptionsRevision = this.renderOptionsRevision;\n updatedItems.add(item);\n }\n prevElement = item.element;\n }\n // Otherwise kick off a render as necessary\n else {\n syncRenderedItemOrder(this.stickyContainer, item.element, prevElement);\n const forceRender =\n item.renderedOptionsRevision !== this.renderOptionsRevision;\n if (renderItem(item, undefined, forceRender)) {\n item.renderedOptionsRevision = this.renderOptionsRevision;\n updatedItems.add(item);\n }\n prevElement = item.element;\n }\n }\n\n this.renderState.firstIndex =\n startingIndex <= lastRenderedIndex ? startingIndex : -1;\n this.renderState.lastIndex = lastRenderedIndex;\n\n this.flushSlotCoordinator();\n this.reconcileRenderedItems(updatedItems);\n this.syncContainerHeight();\n this.updateStickyPositioning();\n\n // Now that the dom has been flushed and we've computed our updated\n // item/line metrics, we should attempt to resolve any scroll anchors and\n // scroll animation data. We have already applied the desired scroll\n // position before rendering, so the only scroll changes should be to\n // scrollFix from lines that did not match their computed state.\n //\n // - No pending scrollTo target → Only attempt to scrollFix if there's a\n // mismatch\n // - Instant pending scrollTo target → Resolve target anchor position and\n // apply any necessary scroll fixes\n // - Smooth pending scrollTo target → Apply necessary scrollFix if\n // necessary and rebase/update the outstanding spring animation values.\n const anchoredScrollTopAfterRender =\n scrollAnchor != null\n ? this.resolveAnchoredScrollTop(scrollAnchor)\n : undefined;\n if (scrollAnchor === this.pendingLayoutAnchor) {\n this.pendingLayoutAnchor = undefined;\n }\n // The amount of computed layout shift from the render\n const postRenderAnchorDelta =\n anchoredScrollTopAfterRender != null\n ? anchoredScrollTopAfterRender - scrollTopAfterLayout\n : 0;\n\n let postRenderScrollTop = targetScrollTop;\n let shouldCheckPendingTargetSettled = false;\n if (this.pendingScrollTarget != null) {\n const pendingTargetScrollTop = this.advanceScrollAnimation(\n timestamp,\n postRenderAnchorDelta\n );\n if (pendingTargetScrollTop != null) {\n postRenderScrollTop = pendingTargetScrollTop;\n shouldCheckPendingTargetSettled = true;\n }\n // If something bad happened with our pending scroll target, then we'd\n // fall back here. Unlikely to happen in practice, but we need to reset\n // the scrollTop if so\n else {\n postRenderScrollTop = scrollTopAfterLayout;\n }\n } else {\n postRenderScrollTop = anchoredScrollTopAfterRender ?? targetScrollTop;\n }\n // If the new intended scroll position has changed, we should apply that\n // now to bring everything in line\n if (postRenderScrollTop !== syncedScrollTop) {\n this.applyScrollFix(\n postRenderScrollTop,\n syncedScrollTop,\n this.windowSpecs\n );\n syncedScrollTop = postRenderScrollTop;\n }\n if (\n shouldCheckPendingTargetSettled &&\n this.pendingScrollTarget != null &&\n this.isPendingTargetSettled(this.pendingScrollTarget)\n ) {\n this.pendingScrollTarget = undefined;\n this.scrollAnimation = undefined;\n }\n this.renderState.scrollTop = roundToDevicePixel(syncedScrollTop);\n\n this.flushManagers(updatedItems);\n\n // If we are hitting a fitPerfectly heuristic, we should queue up another\n // render to fill out content. If we are performing a scroll animation we'll\n // need another render to continue.\n if (fitPerfectly || this.scrollAnimation != null) {\n this.render();\n }\n };\n\n private flushManagers(\n updatedItems: Set<CodeViewContextItem<LAnnotation>>\n ): void {\n for (const item of updatedItems) {\n item.instance.flushManagers();\n }\n }\n\n private syncContainerHeight(): void {\n const pagedScrollHeight = this.getPagedScrollHeight();\n if (this.container == null || this.containerHeight === pagedScrollHeight) {\n return;\n }\n\n this.container.style.height = `${pagedScrollHeight}px`;\n this.containerHeight = pagedScrollHeight;\n }\n\n private getStickyBounds(\n windowSpecs?: VirtualWindowSpecs\n ): StickyBounds | undefined {\n const { firstIndex, lastIndex } =\n windowSpecs != null\n ? {\n firstIndex: this.findFirstVisibleIndex(windowSpecs.top),\n lastIndex: this.findLastVisibleIndex(windowSpecs.bottom),\n }\n : this.renderState;\n\n if (firstIndex === -1 || lastIndex === -1 || firstIndex > lastIndex) {\n return undefined;\n }\n const firstStickySpecs =\n this.items[firstIndex]?.instance.getAdvancedStickySpecs(windowSpecs);\n const lastStickySpecs =\n this.items[lastIndex]?.instance.getAdvancedStickySpecs(windowSpecs);\n\n if (firstStickySpecs == null || lastStickySpecs == null) {\n return undefined;\n }\n\n return {\n stickyTop: this.getPagedLayoutTop(\n Math.max(firstStickySpecs.topOffset, 0)\n ),\n stickyBottom: this.getPagedLayoutTop(\n lastStickySpecs.topOffset + lastStickySpecs.height\n ),\n };\n }\n\n private applyStickyPositioning({\n stickyTop,\n stickyBottom,\n }: StickyBounds): void {\n const height = this.getHeight();\n const { itemMetricsCache: itemMetrics } = this;\n const stickyContainerHeight = stickyBottom - stickyTop;\n\n this.renderState.stickyHeight = stickyContainerHeight;\n this.renderState.stickyTop = stickyTop;\n this.renderState.stickyBottom = stickyBottom;\n\n this.stickyOffset.style.height = `${stickyTop}px`;\n // NOTE(amadeus): Wee polish lad -- when dragging the scrollbar up or\n // down quickly, this prevents the laggy scroll view from lining up with\n // the numbers exactly\n const randomOffset = ((Math.random() * itemMetrics.lineHeight) >> 0) * -1;\n const stickyJitter =\n -Math.max(stickyContainerHeight + randomOffset, 0) + height;\n this.stickyContainer.style.top = `${stickyJitter}px`;\n this.stickyContainer.style.bottom = `${stickyJitter + itemMetrics.diffHeaderHeight}px`;\n }\n\n private syncPagedScrollScaffolding(windowSpecs: VirtualWindowSpecs): void {\n this.syncContainerHeight();\n const stickyBounds = this.getStickyBounds(windowSpecs);\n if (stickyBounds == null) {\n return;\n }\n this.applyStickyPositioning(stickyBounds);\n }\n\n private reconcileRenderedItems(\n updatedItems?: Set<CodeViewContextItem<LAnnotation>>\n ): void {\n const { firstIndex, lastIndex } = this.renderState;\n if (firstIndex === -1) {\n return;\n }\n\n let currentTop = -1;\n let heightChanged = false;\n // Iterate through the rendered items to reconcile height. If a height\n // has changed, we'll have to iterate all the way till the end to update\n // all appropriate heights\n for (let index = firstIndex; index < this.items.length; index++) {\n // If we've incurred no height changes and ended, we can abort\n if (!heightChanged && index > lastIndex) {\n break;\n }\n const item = this.items[index];\n if (item == null) {\n throw new Error('CodeView.reconcileRenderedItems: Invalid item');\n }\n if (currentTop === -1) {\n currentTop = item.top;\n } else if (item.top !== currentTop) {\n item.top = currentTop;\n item.instance.syncVirtualizedTop();\n heightChanged = true;\n }\n // If updatedInstances provided, only reconcile those. If not provided\n // (resize path), reconcile all rendered items.\n if (updatedItems == null ? index <= lastIndex : updatedItems.has(item)) {\n if (item.instance.reconcileHeights()) {\n heightChanged = true;\n item.height = item.instance.getVirtualizedHeight();\n }\n this.validateRenderedItemHeight(item);\n }\n currentTop += item.instance.getVirtualizedHeight();\n if (index < this.items.length - 1) {\n currentTop += this.getLayout().gap;\n }\n }\n\n if (heightChanged && currentTop != null) {\n this.scrollDirty = true;\n this.scrollHeight = currentTop;\n }\n }\n\n private updateStickyPositioning(): void {\n const stickyBounds = this.getStickyBounds();\n if (stickyBounds == null) {\n return;\n }\n const { stickyTop, stickyBottom } = stickyBounds;\n const stickyContainerHeight = stickyBottom - stickyTop;\n\n if (\n stickyContainerHeight === this.renderState.stickyHeight &&\n stickyTop === this.renderState.stickyTop &&\n stickyBottom === this.renderState.stickyBottom\n ) {\n return;\n }\n\n this.applyStickyPositioning(stickyBounds);\n }\n\n private handleScroll = (): void => {\n if (CodeView.__STOP) {\n return;\n }\n this.suspendScrollInteractions();\n this.scrollDirty = true;\n this.notifyScroll();\n this.render();\n };\n\n // Abort any in-flight programmatic scroll when the user takes over.\n // Attached to root as a passive listener for wheel / touchstart /\n // pointerdown / keydown; we never mutate the event, just drop our state.\n private clearPendingScroll = (): void => {\n this.pendingScrollTarget = undefined;\n this.pendingLayoutAnchor = undefined;\n this.scrollAnimation = undefined;\n };\n\n private handleResize = (entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n // If the sticky container resizes (could be from a render, which it will\n // probably ignore) or if an annotation or line wrap triggers a resize\n if (entry.target === this.stickyContainer) {\n const blockSize = entry.borderBoxSize[0].blockSize;\n // If the height of the sticky container was already known, there's\n // nothing for us to do\n if (blockSize !== this.renderState.stickyHeight) {\n // If content resizes above the viewport, we want to be sure that it\n // doesn't cause things to jump within the viewport\n const currentScrollTop = this.getScrollTop();\n const anchor = this.getScrollAnchor(currentScrollTop);\n\n this.reconcileRenderedItems();\n this.updateStickyPositioning();\n\n const anchoredScrollTop =\n anchor != null ? this.resolveAnchoredScrollTop(anchor) : undefined;\n if (anchoredScrollTop != null) {\n const resizeAnchorDelta = anchoredScrollTop - currentScrollTop;\n this.applyScrollFix(\n anchoredScrollTop,\n currentScrollTop,\n this.windowSpecs\n );\n if (this.scrollAnimation != null) {\n // if we had to apply a scroll fix then we should make sure to\n // match the scroll fix delta to the scrollAnimation position to\n // ensure the animation continues smoothly as if the scroll fix\n // never happened\n this.scrollAnimation.position += resizeAnchorDelta;\n }\n }\n if (\n this.pendingScrollTarget != null &&\n this.isPendingTargetSettled(this.pendingScrollTarget)\n ) {\n this.pendingScrollTarget = undefined;\n this.scrollAnimation = undefined;\n }\n }\n }\n // Root element resize (element-mode only)\n else {\n this.scrollDirty = true;\n this.heightDirty = true;\n this.render();\n }\n }\n };\n\n /**\n * Figure out scrollTop accounting for sticky header if enabled and\n * necessary\n */\n private getScrollAnchorViewportTop(\n absoluteItemTop: number,\n scrollTop: number\n ): number {\n return absoluteItemTop < scrollTop\n ? scrollTop + this.getStickyHeaderOffset()\n : scrollTop;\n }\n\n /**\n * Attempt to find a scroll anchor based on build in metrics of the existing\n * rendered files/diff.\n *\n * A scroll anchor represents the first fully visible element (in other\n * words, the first file or first line who's top is fully in the viewport).\n */\n private getScrollAnchor(scrollTop: number): ScrollAnchor | undefined {\n // If we already have a pendingLayoutAnchor, let's use that.\n if (this.pendingLayoutAnchor != null) {\n return this.pendingLayoutAnchor;\n }\n\n const { firstIndex, lastIndex, stickyTop, stickyBottom } = this.renderState;\n if (firstIndex === -1 || lastIndex === -1) {\n return undefined;\n }\n\n const viewportHeight = this.getHeight();\n // If we have no previoius frame, we shouldn't scroll anchor\n if (stickyTop === -1 || stickyBottom === -1) {\n return undefined;\n }\n\n for (let index = firstIndex; index <= lastIndex; index++) {\n const item = this.items[index];\n if (item == null) {\n continue;\n }\n\n const absoluteItemTop = this.getLayout().paddingTop + item.top;\n const absoluteItemBottom = absoluteItemTop + item.height;\n // Skip items entirely above the viewport since we can't see it\n if (absoluteItemBottom <= scrollTop) {\n continue;\n }\n // If the item starts below the viewport bottom we are done searching.\n if (absoluteItemTop >= scrollTop + viewportHeight) {\n break;\n }\n\n if (absoluteItemTop >= scrollTop) {\n return {\n type: 'item',\n id: item.item.id,\n viewportOffset: absoluteItemTop - scrollTop,\n };\n }\n\n // First attempt to grab a the first fully visible line\n const anchorViewportTop = this.getScrollAnchorViewportTop(\n absoluteItemTop,\n scrollTop\n );\n const localViewportTop = anchorViewportTop - absoluteItemTop;\n const lineAnchor = item.instance.getNumericScrollAnchor(localViewportTop);\n if (lineAnchor != null) {\n const absoluteLineTop = absoluteItemTop + lineAnchor.top;\n return {\n type: 'line',\n id: item.item.id,\n lineNumber: lineAnchor.lineNumber,\n side: lineAnchor.side,\n viewportOffset: absoluteLineTop - scrollTop,\n };\n }\n }\n\n // I don't think we'll ever make it this far...\n return undefined;\n }\n\n /**\n * Given a scroll anchor, attempt to resolve a newly updated (and clamped)\n * scroll position to keep the anchored element in place.\n *\n * If we can't resolve a position for whatever reason, we'll return\n * undefined.\n */\n private resolveAnchoredScrollTop(anchor: ScrollAnchor): number | undefined {\n const item = this.idToItem.get(anchor.id);\n if (item == null) {\n return undefined;\n }\n\n const { paddingTop } = this.getLayout();\n if (anchor.type === 'item') {\n const absoluteItemTop = paddingTop + item.top;\n return this.clampScrollTop(absoluteItemTop - anchor.viewportOffset);\n }\n\n const linePosition =\n item.type === 'diff'\n ? item.instance.getLinePosition(anchor.lineNumber, anchor.side)\n : item.instance.getLinePosition(anchor.lineNumber);\n if (linePosition == null) {\n return undefined;\n }\n const absoluteLineTop = paddingTop + item.top + linePosition.top;\n return this.clampScrollTop(absoluteLineTop - anchor.viewportOffset);\n }\n\n /**\n * Apply a device-pixel-rounded scroll position if it differs from the last\n * logical scrollTop synchronized into the paged scroll scaffold.\n */\n private applyScrollFix(\n targetScrollTop: number,\n syncedScrollTop: number,\n windowSpecs: VirtualWindowSpecs\n ): void {\n if (this.root == null) {\n return;\n }\n const roundedTargetScrollTop = roundToDevicePixel(\n this.clampScrollTop(targetScrollTop)\n );\n const roundedSyncedScrollTop = roundToDevicePixel(syncedScrollTop);\n\n const { scrollPageOffset: previousPageOffset } = this;\n const syncedPagedScrollTop = roundToDevicePixel(\n this.clampPagedScrollTop(roundedSyncedScrollTop - previousPageOffset)\n );\n const { pagedScrollTop, scrollPageOffset } =\n this.resolvePagedScrollPosition(roundedTargetScrollTop);\n const targetPagedScrollTop = pagedScrollTop;\n\n const rebaseChanged = previousPageOffset !== scrollPageOffset;\n if (\n roundedTargetScrollTop === this.renderState.scrollTop &&\n roundedTargetScrollTop === roundedSyncedScrollTop &&\n targetPagedScrollTop === syncedPagedScrollTop &&\n !rebaseChanged\n ) {\n return;\n }\n this.suspendScrollInteractions();\n if (targetPagedScrollTop !== syncedPagedScrollTop || rebaseChanged) {\n this.scrollPageOffset = scrollPageOffset;\n this.syncPagedScrollScaffolding(windowSpecs);\n }\n if (targetPagedScrollTop !== syncedPagedScrollTop) {\n this.root.scrollTo({ top: targetPagedScrollTop, behavior: 'instant' });\n }\n // Keep cached scroll state in sync with writes we performed ourselves, so\n // later reads do not need to touch layout just to discover the same value.\n this.renderState.scrollTop = roundedTargetScrollTop;\n this.scrollTop = roundedTargetScrollTop;\n this.scrollDirty = false;\n }\n\n /**\n * Decide whether a pending programmatic scroll has reached its\n * destination and should be cleared.\n */\n private isPendingTargetSettled(target: PendingScrollTarget): boolean {\n const top = this.resolveScrollTargetTop(target);\n if (top == null) {\n return true;\n }\n return roundToDevicePixel(this.getScrollTop()) === roundToDevicePixel(top);\n }\n\n public getScrollTop(): number {\n if (!this.scrollDirty) {\n return this.scrollTop;\n }\n this.scrollDirty = false;\n const rootScrollTop = this.root?.scrollTop ?? 0;\n this.scrollTop = this.clampScrollTop(rootScrollTop + this.scrollPageOffset);\n return this.scrollTop;\n }\n\n public getHeight(): number {\n if (!this.heightDirty) {\n return this.height;\n }\n this.heightDirty = false;\n this.height = this.root?.getBoundingClientRect().height ?? 0;\n return this.height;\n }\n\n public getScrollHeight(): number {\n return this.scrollHeight;\n }\n\n private flushSlotCoordinator(): void {\n if (this.slotCoordinator == null) {\n return;\n }\n const { onSnapshotChange } = this.slotCoordinator;\n\n const slotSnapshot = getSlotSnapshot(\n this.getRenderedItems(),\n this.slotCoordinator\n );\n\n if (areSlotSnapshotsEqual(this.slotSnapshot, slotSnapshot)) {\n return;\n }\n\n this.slotSnapshot = slotSnapshot;\n onSnapshotChange(slotSnapshot);\n }\n\n private notifyScroll(): void {\n // Avoid DOM thrash of checking scroll position if we don't need it\n if (this.scrollListeners.size === 0) {\n return;\n }\n const scrollTop = this.getScrollTop();\n for (const listener of this.scrollListeners) {\n listener(scrollTop, this);\n }\n }\n\n /**\n * Find the first item whose bottom edge crosses into the viewport window.\n * This lets scroll-time rendering jump directly near the visible range instead\n * of linearly scanning from the start of very large item lists.\n */\n private findFirstVisibleIndex(top: number): number {\n let low = 0;\n let high = this.items.length - 1;\n let result = this.items.length;\n\n while (low <= high) {\n const mid = (low + high) >> 1;\n const item = this.items[mid];\n if (item == null) {\n throw new Error('CodeView.findFirstVisibleIndex: invalid item index');\n }\n\n if (item.top + item.height > top) {\n result = mid;\n high = mid - 1;\n } else {\n low = mid + 1;\n }\n }\n\n return result;\n }\n\n /**\n * Find the last item whose top edge is still within the viewport window.\n * Paired with findFirstVisibleIndex, this bounds the render loop to only the\n * slice of items that can actually intersect the current scroll range.\n */\n private findLastVisibleIndex(bottom: number): number {\n let low = 0;\n let high = this.items.length - 1;\n let result = -1;\n\n while (low <= high) {\n const mid = (low + high) >> 1;\n const item = this.items[mid];\n if (item == null) {\n throw new Error('CodeView.findLastVisibleIndex: invalid item index');\n }\n\n if (item.top <= bottom) {\n result = mid;\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n\n return result;\n }\n\n /**\n * Recompute measured tops and heights starting from the earliest dirty item.\n * Earlier items keep their existing layout, while everything from startIndex\n * onward is remeasured so downstream positions and total scroll height stay\n * consistent after inserts, removals, or versioned item updates.\n */\n private recomputeLayout(\n startIndex = 0,\n reset: PendingCodeViewLayoutReset | undefined\n ): void {\n if (this.items.length === 0) {\n this.scrollHeight = 0;\n return;\n }\n\n const layout = this.getLayout();\n let runningTop = 0;\n if (startIndex > 0) {\n const previousItem = this.items[startIndex - 1];\n if (previousItem == null) {\n throw new Error('CodeView.recomputeLayout: invalid dirty index');\n }\n runningTop = previousItem.top + previousItem.height + layout.gap;\n }\n\n for (let index = startIndex; index < this.items.length; index++) {\n const item = this.items[index];\n if (item == null) {\n throw new Error('CodeView.recomputeLayout: invalid item index');\n }\n item.top = runningTop;\n if (item.type === 'diff') {\n item.height = item.instance.prepareCodeViewItem(\n item.item.fileDiff,\n runningTop,\n reset\n );\n } else {\n item.height = item.instance.prepareCodeViewItem(\n item.item.file,\n runningTop,\n reset\n );\n }\n runningTop += item.height;\n if (index < this.items.length - 1) {\n runningTop += layout.gap;\n }\n }\n\n if (runningTop !== this.scrollHeight) {\n this.scrollDirty = true;\n }\n this.scrollHeight = runningTop;\n }\n\n private resetRenderState() {\n this.renderState.scrollTop = -1;\n this.renderState.firstIndex = -1;\n this.renderState.lastIndex = -1;\n this.renderState.stickyHeight = 0;\n this.renderState.stickyTop = -1;\n this.renderState.stickyBottom = -1;\n }\n\n // We actually need a bit of overscroll even when attempting to fit perfectly\n // because we rounde to the nearest container and we may need to render the\n // gaps before and after a perfectly fit element to include the spacing\n // between. We do this by adding the the gap and header height above and\n // below the viewport\n private getFitPerfectlyOverscroll() {\n return this.getLayout().gap + this.itemMetricsCache.diffHeaderHeight;\n }\n}\n\nfunction prepareItemInstance<LAnnotation>(\n item: CodeViewContextItem<LAnnotation>\n): number {\n item.instance.cleanUp(true);\n if (item.type === 'diff') {\n return item.instance.prepareCodeViewItem(item.item.fileDiff, item.top);\n } else {\n return item.instance.prepareCodeViewItem(item.item.file, item.top);\n }\n}\n\nfunction shouldClearPool<LAnnotation>(\n previousOptions: CodeViewOptions<LAnnotation>,\n nextOptions: CodeViewOptions<LAnnotation>\n): boolean {\n return (\n !areThemesEqual(\n previousOptions.theme ?? DEFAULT_THEMES,\n nextOptions.theme ?? DEFAULT_THEMES\n ) ||\n (previousOptions.themeType ?? 'system') !==\n (nextOptions.themeType ?? 'system') ||\n previousOptions.unsafeCSS !== nextOptions.unsafeCSS\n );\n}\n\nfunction hasItemLayoutOptionChanged<LAnnotation>(\n previousOptions: CodeViewOptions<LAnnotation>,\n nextOptions: CodeViewOptions<LAnnotation>\n): boolean {\n return (\n (previousOptions.overflow ?? 'scroll') !==\n (nextOptions.overflow ?? 'scroll') ||\n (previousOptions.disableLineNumbers ?? false) !==\n (nextOptions.disableLineNumbers ?? false) ||\n (previousOptions.disableFileHeader ?? false) !==\n (nextOptions.disableFileHeader ?? false) ||\n previousOptions.unsafeCSS !== nextOptions.unsafeCSS ||\n (previousOptions.diffStyle ?? 'split') !==\n (nextOptions.diffStyle ?? 'split') ||\n (previousOptions.diffIndicators ?? 'bars') !==\n (nextOptions.diffIndicators ?? 'bars') ||\n (previousOptions.hunkSeparators ?? 'line-info') !==\n (nextOptions.hunkSeparators ?? 'line-info') ||\n (previousOptions.expandUnchanged ?? false) !==\n (nextOptions.expandUnchanged ?? false) ||\n (previousOptions.collapsedContextThreshold ??\n DEFAULT_COLLAPSED_CONTEXT_THRESHOLD) !==\n (nextOptions.collapsedContextThreshold ??\n DEFAULT_COLLAPSED_CONTEXT_THRESHOLD)\n );\n}\n\nfunction hasCodeViewDiffEstimateOptionChanged<LAnnotation>(\n previousOptions: CodeViewOptions<LAnnotation>,\n nextOptions: CodeViewOptions<LAnnotation>\n): boolean {\n return (\n (previousOptions.disableFileHeader ?? false) !==\n (nextOptions.disableFileHeader ?? false) ||\n (previousOptions.hunkSeparators ?? 'line-info') !==\n (nextOptions.hunkSeparators ?? 'line-info') ||\n (previousOptions.expandUnchanged ?? false) !==\n (nextOptions.expandUnchanged ?? false) ||\n (previousOptions.collapsedContextThreshold ??\n DEFAULT_COLLAPSED_CONTEXT_THRESHOLD) !==\n (nextOptions.collapsedContextThreshold ??\n DEFAULT_COLLAPSED_CONTEXT_THRESHOLD)\n );\n}\n\nfunction isPooledShadowChild(child: Element): boolean {\n if (child instanceof SVGElement) {\n return true;\n }\n return (\n isStyleNode(child) &&\n (child.hasAttribute(CORE_CSS_ATTRIBUTE) ||\n child.hasAttribute(THEME_CSS_ATTRIBUTE) ||\n child.hasAttribute(UNSAFE_CSS_ATTRIBUTE))\n );\n}\n\nfunction formatSelectedLineRange(range: SelectedLineRange): string {\n const start = formatSelectedLinePoint(range.start, range.side);\n const end = formatSelectedLinePoint(range.end, range.endSide ?? range.side);\n return start === end ? start : `${start}-${end}`;\n}\n\nfunction formatSelectedLinePoint(\n lineNumber: number,\n side: SelectionSide | undefined\n): string {\n if (side == null) {\n return `${lineNumber}`;\n }\n\n return `${side === 'deletions' ? 'D' : 'A'}${lineNumber}`;\n}\n\nfunction renderItem<LAnnotation>(\n item: CodeViewContextItem<LAnnotation>,\n fileContainer?: HTMLElement,\n forceRender = false\n): boolean {\n if (item.type === 'diff') {\n return item.instance.render({\n deferManagers: true,\n fileContainer,\n fileDiff: item.item.fileDiff,\n forceRender,\n lineAnnotations: item.item.annotations,\n });\n } else {\n return item.instance.render({\n deferManagers: true,\n fileContainer,\n file: item.item.file,\n forceRender,\n lineAnnotations: item.item.annotations,\n });\n }\n}\n\n/**\n * Keep the rendered DOM order aligned with the current record order even when\n * we reuse existing elements. Reused items may already be mounted elsewhere in\n * the sticky container, so this moves them into the correct sibling position\n * before rendering updates.\n */\nfunction syncRenderedItemOrder(\n container: HTMLElement,\n element: HTMLElement,\n prevElement: HTMLElement | undefined\n): void {\n if (prevElement == null) {\n if (container.firstChild !== element) {\n container.prepend(element);\n }\n return;\n }\n\n if (prevElement.nextSibling !== element) {\n prevElement.after(element);\n }\n}\n\nfunction hasAnnotations<LAnnotation>(item: CodeViewItem<LAnnotation>): boolean {\n return (item.annotations?.length ?? 0) > 0;\n}\n\nfunction getSlotSnapshot<LAnnotation>(\n renderedItems: CodeViewRenderedItem<LAnnotation>[],\n {\n hasHeaderRenderers,\n hasAnnotationRenderer,\n hasGutterRenderer,\n }: CodeViewCoordinator<LAnnotation>\n): CodeViewRenderedItem<LAnnotation>[] | undefined {\n if (renderedItems.length === 0) {\n return undefined;\n }\n\n if (hasHeaderRenderers || hasGutterRenderer) {\n return renderedItems;\n }\n\n if (!hasAnnotationRenderer) {\n return undefined;\n }\n\n const slotSnapshot: CodeViewRenderedItem<LAnnotation>[] = [];\n\n for (const renderedItem of renderedItems) {\n if (hasAnnotations(renderedItem.item)) {\n slotSnapshot.push(renderedItem);\n }\n }\n\n return slotSnapshot.length > 0 ? slotSnapshot : undefined;\n}\n\nfunction areSlotSnapshotsEqual<LAnnotation>(\n previous: CodeViewRenderedItem<LAnnotation>[] | undefined,\n next: CodeViewRenderedItem<LAnnotation>[] | undefined\n): boolean {\n if (previous == null || next == null) {\n return previous === next;\n }\n\n if (previous.length !== next.length) {\n return false;\n }\n\n for (let index = 0; index < previous.length; index++) {\n const previousItem = previous[index];\n const nextItem = next[index];\n if (\n previousItem == null ||\n nextItem == null ||\n previousItem.id !== nextItem.id ||\n previousItem.type !== nextItem.type ||\n previousItem.element !== nextItem.element ||\n previousItem.version !== nextItem.version\n ) {\n return false;\n }\n }\n\n return true;\n}\n"],"mappings":"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"}