@peaske7/readit 0.3.0-rc.0 → 0.3.0-rc.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 (373) hide show
  1. package/dist/.vite/manifest.json +1111 -0
  2. package/dist/assets/_basePickBy-BMMA4Tou.js +1 -0
  3. package/dist/assets/_baseUniq-D40qku1I.js +1 -0
  4. package/dist/assets/arc-Ckg65iy8.js +1 -0
  5. package/dist/assets/architecture-YZFGNWBL-Dv3EY0zV.js +1 -0
  6. package/dist/assets/architectureDiagram-Q4EWVU46-ClRss4cm.js +36 -0
  7. package/dist/assets/array-Bjz-wYpJ.js +1 -0
  8. package/dist/assets/blockDiagram-DXYQGD6D-CBcFvoK1.js +132 -0
  9. package/dist/assets/c4Diagram-AHTNJAMY-D4d3ZLam.js +10 -0
  10. package/dist/assets/channel-D9EJxDy_.js +1 -0
  11. package/dist/assets/chunk-2KRD3SAO-DaFfaCGO.js +1 -0
  12. package/dist/assets/chunk-336JU56O-yLEQoF0v.js +2 -0
  13. package/dist/assets/chunk-426QAEUC-Uyzd4wAA.js +1 -0
  14. package/dist/assets/chunk-4BX2VUAB-DRuTD7x5.js +1 -0
  15. package/dist/assets/chunk-4TB4RGXK-3xbpIi_o.js +206 -0
  16. package/dist/assets/chunk-55IACEB6-BExiaAoD.js +1 -0
  17. package/dist/assets/chunk-5FUZZQ4R-DatVvHnF.js +62 -0
  18. package/dist/assets/chunk-5PVQY5BW-BKgvrGh8.js +2 -0
  19. package/dist/assets/chunk-67CJDMHE-DMt8LNEX.js +1 -0
  20. package/dist/assets/chunk-7N4EOEYR-CzLGefVf.js +1 -0
  21. package/dist/assets/chunk-AA7GKIK3-B6GFAk4U.js +1 -0
  22. package/dist/assets/chunk-BSJP7CBP-BK29yehL.js +1 -0
  23. package/dist/assets/chunk-CIAEETIT-D7hBXImP.js +1 -0
  24. package/dist/assets/chunk-Dlc7tRH4.js +1 -0
  25. package/dist/assets/chunk-EDXVE4YY-PYJdlmyH.js +1 -0
  26. package/dist/assets/chunk-ENJZ2VHE-DUHKBv6x.js +10 -0
  27. package/dist/assets/chunk-FMBD7UC4-2FWyCCAV.js +15 -0
  28. package/dist/assets/chunk-FOC6F5B3-DKFHrt4K.js +1 -0
  29. package/dist/assets/chunk-ICPOFSXX-Bh__D0ec.js +122 -0
  30. package/dist/assets/chunk-K5T4RW27-D51O7IkG.js +94 -0
  31. package/dist/assets/chunk-KGLVRYIC-DMHSCH4T.js +1 -0
  32. package/dist/assets/chunk-LIHQZDEY-C2aANxt9.js +1 -0
  33. package/dist/assets/chunk-ORNJ4GCN-Db_37NRX.js +1 -0
  34. package/dist/assets/chunk-OYMX7WX6-BltXOJLJ.js +231 -0
  35. package/dist/assets/chunk-QZHKN3VN-8Lcg9gti.js +1 -0
  36. package/dist/assets/chunk-U2HBQHQK-ByS6tilY.js +70 -0
  37. package/dist/assets/chunk-X2U36JSP-Bm-4Gqg_.js +1 -0
  38. package/dist/assets/chunk-XPW4576I-Bqbompq4.js +32 -0
  39. package/dist/assets/chunk-YZCP3GAM-CsC0imPb.js +1 -0
  40. package/dist/assets/chunk-ZZ45TVLE-CG-CqfPC.js +1 -0
  41. package/dist/assets/classDiagram-6PBFFD2Q-Jy1uFUk4.js +1 -0
  42. package/dist/assets/classDiagram-v2-HSJHXN6E-ChiLl3rR.js +1 -0
  43. package/dist/assets/clone-BBjvuERA.js +1 -0
  44. package/dist/assets/cose-bilkent-S5V4N54A-q90QeGKv.js +1 -0
  45. package/dist/assets/cytoscape.esm-BfXff3fb.js +321 -0
  46. package/dist/assets/dagre-KV5264BT-BQWiLFJB.js +4 -0
  47. package/dist/assets/dagre-nn_aIZ2E.js +1 -0
  48. package/dist/assets/defaultLocale-BwmRmqJp.js +1 -0
  49. package/dist/assets/diagram-5BDNPKRD-CJa7Y97H.js +10 -0
  50. package/dist/assets/diagram-G4DWMVQ6-tVQGBWfY.js +24 -0
  51. package/dist/assets/diagram-MMDJMWI5-CpimFldm.js +43 -0
  52. package/dist/assets/diagram-TYMM5635-D11WQVgy.js +24 -0
  53. package/dist/assets/dist-BNz65Ibc.js +1 -0
  54. package/dist/assets/erDiagram-SMLLAGMA-C2bLd0jS.js +85 -0
  55. package/dist/assets/flowDiagram-DWJPFMVM-Kw3fOOLT.js +162 -0
  56. package/dist/assets/ganttDiagram-T4ZO3ILL-fyMhyE2X.js +292 -0
  57. package/dist/assets/gitGraph-7Q5UKJZL-BGFRt2qs.js +1 -0
  58. package/dist/assets/gitGraphDiagram-UUTBAWPF-D4JoiOvg.js +106 -0
  59. package/dist/assets/graphlib-DGcD9J2L.js +1 -0
  60. package/dist/assets/index-Cow3qpoq.css +2 -0
  61. package/dist/assets/index-DUf7okYi.js +14 -0
  62. package/dist/assets/info-OMHHGYJF-DI6-Z9vh.js +1 -0
  63. package/dist/assets/infoDiagram-42DDH7IO-D1ZkeMBy.js +2 -0
  64. package/dist/assets/init-TPm5RB77.js +1 -0
  65. package/dist/assets/isArrayLikeObject-69BLnVNM.js +1 -0
  66. package/dist/assets/isEmpty-DUS28g5f.js +1 -0
  67. package/dist/assets/ishikawaDiagram-UXIWVN3A-Dv8hzjZB.js +70 -0
  68. package/dist/assets/journeyDiagram-VCZTEJTY-COeB7F5r.js +139 -0
  69. package/dist/assets/kanban-definition-6JOO6SKY-BbYmxCYU.js +89 -0
  70. package/dist/assets/katex-5SGEXwpi.js +261 -0
  71. package/dist/assets/line-_v2NGEdn.js +1 -0
  72. package/dist/assets/linear-CXMqTN8N.js +1 -0
  73. package/dist/assets/mermaid-config-C8a4L22x.js +1 -0
  74. package/dist/assets/mermaid-parser.core-CFmphzPP.js +4 -0
  75. package/dist/assets/mermaid.core-DnHAupTp.js +11 -0
  76. package/dist/assets/mindmap-definition-QFDTVHPH-D7_lIep7.js +96 -0
  77. package/dist/assets/ordinal-D7l-8DAO.js +1 -0
  78. package/dist/assets/packet-4T2RLAQJ-DidW3JFc.js +1 -0
  79. package/dist/assets/path-BVpCanzE.js +1 -0
  80. package/dist/assets/pie-ZZUOXDRM-Bff2e5hg.js +1 -0
  81. package/dist/assets/pieDiagram-DEJITSTG-DDvYHCT_.js +30 -0
  82. package/dist/assets/quadrantDiagram-34T5L4WZ-DcLcIrdi.js +7 -0
  83. package/dist/assets/radar-PYXPWWZC-CsdZBH3M.js +1 -0
  84. package/dist/assets/requirementDiagram-MS252O5E-DLX6ld7D.js +84 -0
  85. package/dist/assets/rough.esm-BoTisKeL.js +1 -0
  86. package/dist/assets/sankeyDiagram-XADWPNL6-D-1GtsHM.js +10 -0
  87. package/dist/assets/sequenceDiagram-FGHM5R23-Bwxs0YQg.js +157 -0
  88. package/dist/assets/src-CrmkjRpa.js +1 -0
  89. package/dist/assets/stateDiagram-FHFEXIEX-DW7rOcnQ.js +1 -0
  90. package/dist/assets/stateDiagram-v2-QKLJ7IA2-Jm-24vQ2.js +1 -0
  91. package/dist/assets/timeline-definition-GMOUNBTQ-DVdHyzxS.js +120 -0
  92. package/dist/assets/treeView-SZITEDCU-DPKseaET.js +1 -0
  93. package/dist/assets/treemap-W4RFUUIX-DH-7GZe_.js +1 -0
  94. package/dist/assets/vennDiagram-DHZGUBPP-DJaC6xmI.js +34 -0
  95. package/dist/assets/wardley-RL74JXVD-AgyXyBN5.js +1 -0
  96. package/dist/assets/wardleyDiagram-NUSXRM2D-CTKERPKv.js +20 -0
  97. package/dist/assets/xychartDiagram-5P7HB3ND-BuExiLXc.js +7 -0
  98. package/{index.html → dist/index.html} +2 -1
  99. package/dist/index.js +2539 -0
  100. package/package.json +11 -1
  101. package/.agents/skills/remotion-best-practices/SKILL.md +0 -61
  102. package/.agents/skills/remotion-best-practices/rules/3d.md +0 -86
  103. package/.agents/skills/remotion-best-practices/rules/animations.md +0 -27
  104. package/.agents/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +0 -178
  105. package/.agents/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +0 -100
  106. package/.agents/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +0 -108
  107. package/.agents/skills/remotion-best-practices/rules/assets.md +0 -78
  108. package/.agents/skills/remotion-best-practices/rules/audio-visualization.md +0 -198
  109. package/.agents/skills/remotion-best-practices/rules/audio.md +0 -169
  110. package/.agents/skills/remotion-best-practices/rules/calculate-metadata.md +0 -134
  111. package/.agents/skills/remotion-best-practices/rules/can-decode.md +0 -75
  112. package/.agents/skills/remotion-best-practices/rules/charts.md +0 -120
  113. package/.agents/skills/remotion-best-practices/rules/compositions.md +0 -154
  114. package/.agents/skills/remotion-best-practices/rules/display-captions.md +0 -184
  115. package/.agents/skills/remotion-best-practices/rules/extract-frames.md +0 -229
  116. package/.agents/skills/remotion-best-practices/rules/ffmpeg.md +0 -38
  117. package/.agents/skills/remotion-best-practices/rules/fonts.md +0 -152
  118. package/.agents/skills/remotion-best-practices/rules/get-audio-duration.md +0 -58
  119. package/.agents/skills/remotion-best-practices/rules/get-video-dimensions.md +0 -68
  120. package/.agents/skills/remotion-best-practices/rules/get-video-duration.md +0 -60
  121. package/.agents/skills/remotion-best-practices/rules/gifs.md +0 -141
  122. package/.agents/skills/remotion-best-practices/rules/images.md +0 -134
  123. package/.agents/skills/remotion-best-practices/rules/import-srt-captions.md +0 -69
  124. package/.agents/skills/remotion-best-practices/rules/light-leaks.md +0 -73
  125. package/.agents/skills/remotion-best-practices/rules/lottie.md +0 -70
  126. package/.agents/skills/remotion-best-practices/rules/maps.md +0 -412
  127. package/.agents/skills/remotion-best-practices/rules/measuring-dom-nodes.md +0 -34
  128. package/.agents/skills/remotion-best-practices/rules/measuring-text.md +0 -140
  129. package/.agents/skills/remotion-best-practices/rules/parameters.md +0 -109
  130. package/.agents/skills/remotion-best-practices/rules/sequencing.md +0 -118
  131. package/.agents/skills/remotion-best-practices/rules/sfx.md +0 -26
  132. package/.agents/skills/remotion-best-practices/rules/subtitles.md +0 -36
  133. package/.agents/skills/remotion-best-practices/rules/tailwind.md +0 -11
  134. package/.agents/skills/remotion-best-practices/rules/text-animations.md +0 -20
  135. package/.agents/skills/remotion-best-practices/rules/timing.md +0 -179
  136. package/.agents/skills/remotion-best-practices/rules/transcribe-captions.md +0 -70
  137. package/.agents/skills/remotion-best-practices/rules/transitions.md +0 -197
  138. package/.agents/skills/remotion-best-practices/rules/transparent-videos.md +0 -106
  139. package/.agents/skills/remotion-best-practices/rules/trimming.md +0 -51
  140. package/.agents/skills/remotion-best-practices/rules/videos.md +0 -171
  141. package/.agents/skills/remotion-best-practices/rules/voiceover.md +0 -99
  142. package/.agents/skills/simple/SKILL.md +0 -52
  143. package/.agents/skills/vercel-react-best-practices/AGENTS.md +0 -3254
  144. package/.agents/skills/vercel-react-best-practices/README.md +0 -123
  145. package/.agents/skills/vercel-react-best-practices/SKILL.md +0 -141
  146. package/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -55
  147. package/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +0 -42
  148. package/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -39
  149. package/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -38
  150. package/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -80
  151. package/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -51
  152. package/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +0 -28
  153. package/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -99
  154. package/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -59
  155. package/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -31
  156. package/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -49
  157. package/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -35
  158. package/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -50
  159. package/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -74
  160. package/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -71
  161. package/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -48
  162. package/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -56
  163. package/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -107
  164. package/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -80
  165. package/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -28
  166. package/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -70
  167. package/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -32
  168. package/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -50
  169. package/.agents/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +0 -60
  170. package/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -45
  171. package/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -37
  172. package/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -49
  173. package/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -82
  174. package/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -24
  175. package/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -57
  176. package/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -26
  177. package/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
  178. package/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -40
  179. package/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -38
  180. package/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -46
  181. package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
  182. package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
  183. package/.agents/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +0 -85
  184. package/.agents/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +0 -68
  185. package/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -28
  186. package/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +0 -75
  187. package/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -39
  188. package/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -45
  189. package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
  190. package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -29
  191. package/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -74
  192. package/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -58
  193. package/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
  194. package/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -44
  195. package/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
  196. package/.agents/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +0 -82
  197. package/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
  198. package/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -40
  199. package/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
  200. package/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -73
  201. package/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +0 -96
  202. package/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -41
  203. package/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -76
  204. package/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +0 -65
  205. package/.agents/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +0 -142
  206. package/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -83
  207. package/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +0 -38
  208. package/.claude/CLAUDE.md +0 -184
  209. package/.claude/commands/review.md +0 -120
  210. package/.claude/commands/sync-docs.md +0 -71
  211. package/.claude/roadmap.md +0 -121
  212. package/.claude/rules/style-guide.md +0 -830
  213. package/.claude/settings.json +0 -18
  214. package/.claude/user-stories.md +0 -333
  215. package/AGENTS.md +0 -68
  216. package/Makefile +0 -32
  217. package/biome.json +0 -79
  218. package/bun.lock +0 -854
  219. package/bunfig.toml +0 -2
  220. package/docs/design.md +0 -563
  221. package/docs/perf-baseline.md +0 -130
  222. package/docs/plans/2026-03-13-client-mode-design.md +0 -86
  223. package/docs/plans/2026-03-13-client-mode-plan.md +0 -605
  224. package/docs/plans/2026-03-13-keyboard-shortcuts-design.md +0 -129
  225. package/docs/plans/2026-03-13-keyboard-shortcuts-plan.md +0 -1471
  226. package/docs/plans/2026-03-13-multi-document-design.md +0 -183
  227. package/docs/plans/2026-03-13-performance-benchmarks-design.md +0 -121
  228. package/docs/superpowers/plans/2026-03-26-surgical-pruning.md +0 -1176
  229. package/docs/superpowers/specs/2026-03-27-go-server-rewrite-design.md +0 -284
  230. package/e2e/comments.spec.ts +0 -81
  231. package/e2e/document-load.spec.ts +0 -32
  232. package/e2e/export.spec.ts +0 -58
  233. package/e2e/fixtures/sample.md +0 -7
  234. package/e2e/perf/add-comment.spec.ts +0 -116
  235. package/e2e/perf/fixtures/generate.ts +0 -327
  236. package/e2e/perf/initial-load.spec.ts +0 -49
  237. package/e2e/perf/perf.setup.ts +0 -23
  238. package/e2e/perf/perf.teardown.ts +0 -9
  239. package/e2e/perf/screenshot-final.png +0 -0
  240. package/e2e/perf/scroll.spec.ts +0 -39
  241. package/e2e/perf/tab-switch.spec.ts +0 -69
  242. package/e2e/perf/text-selection.spec.ts +0 -119
  243. package/e2e/perf/utils/metrics.ts +0 -350
  244. package/e2e/perf/utils/perf-cli.ts +0 -86
  245. package/e2e/persistence-file.spec.ts +0 -357
  246. package/e2e/utils/cli.ts +0 -84
  247. package/e2e/utils/selection.ts +0 -79
  248. package/go/cmd/readit/main.go +0 -416
  249. package/go/go.mod +0 -20
  250. package/go/go.sum +0 -41
  251. package/go/internal/server/anchor.go +0 -302
  252. package/go/internal/server/anchor_test.go +0 -111
  253. package/go/internal/server/comments.go +0 -390
  254. package/go/internal/server/documents.go +0 -113
  255. package/go/internal/server/embed.go +0 -17
  256. package/go/internal/server/headings.go +0 -33
  257. package/go/internal/server/headings_test.go +0 -75
  258. package/go/internal/server/htmltext.go +0 -123
  259. package/go/internal/server/markdown.go +0 -157
  260. package/go/internal/server/markdown_bench_test.go +0 -42
  261. package/go/internal/server/markdown_test.go +0 -79
  262. package/go/internal/server/server.go +0 -453
  263. package/go/internal/server/server_bench_test.go +0 -122
  264. package/go/internal/server/settings.go +0 -110
  265. package/go/internal/server/sse.go +0 -140
  266. package/go/internal/server/storage.go +0 -275
  267. package/go/internal/server/storage_test.go +0 -152
  268. package/go/internal/server/template.go +0 -66
  269. package/go/internal/server/types.go +0 -101
  270. package/go/internal/server/watcher.go +0 -74
  271. package/lefthook.yml +0 -8
  272. package/nvim-readit/lua/readit/health.lua +0 -64
  273. package/nvim-readit/lua/readit/init.lua +0 -463
  274. package/nvim-readit/plugin/readit.lua +0 -19
  275. package/playwright.config.ts +0 -34
  276. package/skills-lock.json +0 -20
  277. package/src/App.svelte +0 -890
  278. package/src/cli.ts +0 -881
  279. package/src/components/ActionsMenu.svelte +0 -95
  280. package/src/components/CommentBadge.svelte +0 -67
  281. package/src/components/CommentErrorBanner.svelte +0 -33
  282. package/src/components/CommentInput.svelte +0 -75
  283. package/src/components/CommentListItem.svelte +0 -95
  284. package/src/components/CommentManager.svelte +0 -129
  285. package/src/components/CommentNav.svelte +0 -109
  286. package/src/components/DocumentViewer.svelte +0 -233
  287. package/src/components/FloatingComment.svelte +0 -107
  288. package/src/components/Header.svelte +0 -76
  289. package/src/components/InlineEditor.svelte +0 -72
  290. package/src/components/MarginNote.svelte +0 -167
  291. package/src/components/MarginNotesContainer.svelte +0 -33
  292. package/src/components/MermaidEnhancer.svelte +0 -218
  293. package/src/components/MermaidModal.svelte +0 -67
  294. package/src/components/RawModal.svelte +0 -126
  295. package/src/components/ReanchorConfirm.svelte +0 -30
  296. package/src/components/SettingsModal.svelte +0 -220
  297. package/src/components/ShortcutCapture.svelte +0 -82
  298. package/src/components/ShortcutList.svelte +0 -145
  299. package/src/components/TabBar.svelte +0 -52
  300. package/src/components/TableOfContents.svelte +0 -125
  301. package/src/components/ui/ActionLink.svelte +0 -40
  302. package/src/components/ui/Button.svelte +0 -53
  303. package/src/components/ui/Dialog.svelte +0 -97
  304. package/src/components/ui/DropdownMenu.svelte +0 -85
  305. package/src/components/ui/DropdownMenuItem.svelte +0 -38
  306. package/src/components/ui/DropdownMenuSeparator.svelte +0 -11
  307. package/src/components/ui/Text.svelte +0 -42
  308. package/src/env.d.ts +0 -6
  309. package/src/index.css +0 -859
  310. package/src/lib/__fixtures__/bench-data.ts +0 -114
  311. package/src/lib/anchor.bench.ts +0 -91
  312. package/src/lib/anchor.test.ts +0 -527
  313. package/src/lib/anchor.ts +0 -381
  314. package/src/lib/comment-storage.bench.ts +0 -49
  315. package/src/lib/comment-storage.test.ts +0 -694
  316. package/src/lib/comment-storage.ts +0 -226
  317. package/src/lib/export.bench.ts +0 -21
  318. package/src/lib/export.ts +0 -36
  319. package/src/lib/fetch-or-throw.test.ts +0 -59
  320. package/src/lib/fetch-or-throw.ts +0 -12
  321. package/src/lib/headings.test.ts +0 -103
  322. package/src/lib/headings.ts +0 -44
  323. package/src/lib/highlight/core.test.ts +0 -93
  324. package/src/lib/highlight/dom.ts +0 -187
  325. package/src/lib/highlight/highlight-registry.ts +0 -221
  326. package/src/lib/highlight/highlight.bench.ts +0 -92
  327. package/src/lib/highlight/highlighter.ts +0 -247
  328. package/src/lib/highlight/resolver.ts +0 -38
  329. package/src/lib/highlight/types.ts +0 -17
  330. package/src/lib/html-text.test.ts +0 -162
  331. package/src/lib/html-text.ts +0 -161
  332. package/src/lib/i18n/en.ts +0 -124
  333. package/src/lib/i18n/index.ts +0 -3
  334. package/src/lib/i18n/ja.ts +0 -126
  335. package/src/lib/i18n/translations.ts +0 -27
  336. package/src/lib/i18n/types.ts +0 -130
  337. package/src/lib/key-lock.test.ts +0 -104
  338. package/src/lib/key-lock.ts +0 -23
  339. package/src/lib/margin-layout.bench.ts +0 -61
  340. package/src/lib/margin-layout.ts +0 -71
  341. package/src/lib/markdown-renderer.test.ts +0 -154
  342. package/src/lib/markdown-renderer.ts +0 -178
  343. package/src/lib/mermaid-config.ts +0 -38
  344. package/src/lib/mermaid-renderer.ts +0 -162
  345. package/src/lib/mermaid-worker.ts +0 -60
  346. package/src/lib/positions.ts +0 -157
  347. package/src/lib/shortcut-registry.ts +0 -244
  348. package/src/lib/utils.ts +0 -15
  349. package/src/main.ts +0 -16
  350. package/src/schema.ts +0 -92
  351. package/src/server.ts +0 -1216
  352. package/src/stores/app.svelte.ts +0 -231
  353. package/src/stores/locale.svelte.ts +0 -46
  354. package/src/stores/settings.svelte.ts +0 -90
  355. package/src/stores/shortcuts.svelte.ts +0 -104
  356. package/src/stores/ui.svelte.ts +0 -12
  357. package/src/template.ts +0 -104
  358. package/src/test-setup.ts +0 -48
  359. package/svelte.config.js +0 -5
  360. package/test.md +0 -74
  361. package/tsconfig.cli.json +0 -12
  362. package/tsconfig.json +0 -20
  363. package/vite.config.ts +0 -47
  364. package/vitest.config.ts +0 -15
  365. package/vscode-readit/.mcp.json +0 -7
  366. package/vscode-readit/.vscodeignore +0 -7
  367. package/vscode-readit/bun.lock +0 -78
  368. package/vscode-readit/icon.svg +0 -10
  369. package/vscode-readit/package.json +0 -110
  370. package/vscode-readit/src/extension.ts +0 -117
  371. package/vscode-readit/src/server-manager.ts +0 -272
  372. package/vscode-readit/src/webview-provider.ts +0 -204
  373. package/vscode-readit/tsconfig.json +0 -20
@@ -1,187 +0,0 @@
1
- import type { TextNodeInfo } from "./types";
2
-
3
- const BLOCK_ELEMENTS = new Set([
4
- "P",
5
- "DIV",
6
- "H1",
7
- "H2",
8
- "H3",
9
- "H4",
10
- "H5",
11
- "H6",
12
- "PRE",
13
- "BLOCKQUOTE",
14
- "LI",
15
- "TR",
16
- "BR",
17
- ]);
18
-
19
- function findBlockParent(node: Node): Element | null {
20
- let parent = node.parentElement;
21
- while (parent && !BLOCK_ELEMENTS.has(parent.tagName)) {
22
- parent = parent.parentElement;
23
- }
24
- return parent;
25
- }
26
-
27
- export function getTextOffset(
28
- root: Node,
29
- targetNode: Node,
30
- targetOffset: number,
31
- ): number {
32
- let offset = 0;
33
- let lastBlockParent: Element | null = null;
34
- const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);
35
-
36
- let node = walker.nextNode();
37
- while (node) {
38
- const blockParent = findBlockParent(node);
39
-
40
- if (lastBlockParent && blockParent && lastBlockParent !== blockParent) {
41
- if (
42
- !lastBlockParent.contains(blockParent) &&
43
- !blockParent.contains(lastBlockParent)
44
- ) {
45
- offset += 1;
46
- }
47
- }
48
-
49
- if (node === targetNode) {
50
- return offset + targetOffset;
51
- }
52
- offset += node.textContent?.length ?? 0;
53
- lastBlockParent = blockParent;
54
- node = walker.nextNode();
55
- }
56
-
57
- return offset;
58
- }
59
-
60
- export function getDOMTextContent(root: Node): string {
61
- const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);
62
- let text = "";
63
- let lastBlockParent: Element | null = null;
64
- let node = walker.nextNode();
65
-
66
- while (node) {
67
- const blockParent = findBlockParent(node);
68
-
69
- if (lastBlockParent && blockParent && lastBlockParent !== blockParent) {
70
- if (
71
- !lastBlockParent.contains(blockParent) &&
72
- !blockParent.contains(lastBlockParent)
73
- ) {
74
- text += "\n";
75
- }
76
- }
77
-
78
- text += node.textContent ?? "";
79
- lastBlockParent = blockParent;
80
- node = walker.nextNode();
81
- }
82
-
83
- return text;
84
- }
85
-
86
- export function collectTextNodes(root: Node): TextNodeInfo[] {
87
- const textNodes: TextNodeInfo[] = [];
88
- let currentOffset = 0;
89
- let lastBlockParent: Element | null = null;
90
-
91
- const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);
92
- let node = walker.nextNode();
93
-
94
- while (node) {
95
- const blockParent = findBlockParent(node);
96
-
97
- if (lastBlockParent && blockParent && lastBlockParent !== blockParent) {
98
- if (
99
- !lastBlockParent.contains(blockParent) &&
100
- !blockParent.contains(lastBlockParent)
101
- ) {
102
- currentOffset += 1;
103
- }
104
- }
105
-
106
- const length = node.textContent?.length ?? 0;
107
- textNodes.push({
108
- node: node as Text,
109
- start: currentOffset,
110
- end: currentOffset + length,
111
- });
112
- currentOffset += length;
113
- lastBlockParent = blockParent;
114
- node = walker.nextNode();
115
- }
116
-
117
- return textNodes;
118
- }
119
-
120
- export function collectTextNodesWithContent(root: Node): {
121
- text: string;
122
- nodes: TextNodeInfo[];
123
- } {
124
- const nodes: TextNodeInfo[] = [];
125
- let text = "";
126
- let currentOffset = 0;
127
- let lastBlockParent: Element | null = null;
128
-
129
- const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);
130
- let node = walker.nextNode();
131
-
132
- while (node) {
133
- const blockParent = findBlockParent(node);
134
-
135
- if (lastBlockParent && blockParent && lastBlockParent !== blockParent) {
136
- if (
137
- !lastBlockParent.contains(blockParent) &&
138
- !blockParent.contains(lastBlockParent)
139
- ) {
140
- text += "\n";
141
- currentOffset += 1;
142
- }
143
- }
144
-
145
- const content = node.textContent ?? "";
146
- text += content;
147
- const length = content.length;
148
- nodes.push({
149
- node: node as Text,
150
- start: currentOffset,
151
- end: currentOffset + length,
152
- });
153
- currentOffset += length;
154
- lastBlockParent = blockParent;
155
- node = walker.nextNode();
156
- }
157
-
158
- return { text, nodes };
159
- }
160
-
161
- export function createRangesForHighlight(
162
- root: Node,
163
- startOffset: number,
164
- endOffset: number,
165
- ): Range[] {
166
- const textNodes = collectTextNodes(root);
167
- return createRangesFromNodes(textNodes, startOffset, endOffset);
168
- }
169
-
170
- export function createRangesFromNodes(
171
- textNodes: TextNodeInfo[],
172
- startOffset: number,
173
- endOffset: number,
174
- ): Range[] {
175
- const ranges: Range[] = [];
176
-
177
- for (const { node, start, end } of textNodes) {
178
- if (end <= startOffset || start >= endOffset) continue;
179
-
180
- const range = document.createRange();
181
- range.setStart(node, Math.max(0, startOffset - start));
182
- range.setEnd(node, Math.min(node.length, endOffset - start));
183
- ranges.push(range);
184
- }
185
-
186
- return ranges;
187
- }
@@ -1,221 +0,0 @@
1
- const COLOR_COUNT = 4;
2
-
3
- interface CommentEntry {
4
- ranges: Range[];
5
- colorIndex: number;
6
- }
7
-
8
- export class HighlightRegistry {
9
- private comments = new Map<string, CommentEntry>();
10
- private pendingRanges: Range[] = [];
11
- private focusedId: string | undefined;
12
-
13
- setHighlights(
14
- entries: Map<string, { ranges: Range[]; colorIndex: number }>,
15
- ): void {
16
- this.comments.clear();
17
- for (const [id, entry] of entries) {
18
- this.comments.set(id, entry);
19
- }
20
- this.syncCommentHighlights();
21
- }
22
-
23
- updateComment(commentId: string, ranges: Range[], colorIndex: number): void {
24
- this.comments.set(commentId, { ranges, colorIndex });
25
- this.syncCommentHighlights();
26
- }
27
-
28
- removeComment(commentId: string): void {
29
- this.comments.delete(commentId);
30
- if (this.focusedId === commentId) {
31
- this.focusedId = undefined;
32
- this.syncFocused();
33
- }
34
- this.syncCommentHighlights();
35
- }
36
-
37
- clearAll(): void {
38
- this.comments.clear();
39
- this.focusedId = undefined;
40
-
41
- for (let i = 0; i < COLOR_COUNT; i++) {
42
- CSS.highlights.delete(`comment-color-${i}`);
43
- }
44
- CSS.highlights.delete("comment-focused");
45
- this.exposeIds();
46
- }
47
-
48
- setPending(ranges: Range[]): void {
49
- this.pendingRanges = ranges;
50
- if (ranges.length > 0) {
51
- CSS.highlights.set("pending-selection", new Highlight(...ranges));
52
- } else {
53
- CSS.highlights.delete("pending-selection");
54
- }
55
- }
56
-
57
- clearPending(): void {
58
- this.pendingRanges = [];
59
- CSS.highlights.delete("pending-selection");
60
- }
61
-
62
- setFocused(commentId: string | undefined): void {
63
- this.focusedId = commentId;
64
- this.syncFocused();
65
- }
66
-
67
- getBoundingRect(commentId: string): DOMRect | null {
68
- const entry = this.comments.get(commentId);
69
- if (!entry || entry.ranges.length === 0) return null;
70
- return entry.ranges[0].getBoundingClientRect();
71
- }
72
-
73
- getPositions(containerRect: DOMRect): Map<string, number> {
74
- const positions = new Map<string, number>();
75
- for (const [id, entry] of this.comments) {
76
- if (entry.ranges.length === 0) continue;
77
- const rect = entry.ranges[0].getBoundingClientRect();
78
- positions.set(id, rect.top - containerRect.top);
79
- }
80
- return positions;
81
- }
82
-
83
- scrollToComment(commentId: string): void {
84
- const entry = this.comments.get(commentId);
85
- if (!entry || entry.ranges.length === 0) return;
86
-
87
- const range = entry.ranges[0];
88
- const el = range.startContainer.parentElement;
89
- if (el) {
90
- el.scrollIntoView({ behavior: "smooth", block: "center" });
91
- }
92
- }
93
-
94
- hitTest(x: number, y: number): string | undefined {
95
- const pos = caretPositionFromPointCompat(x, y);
96
- if (!pos) return undefined;
97
-
98
- for (const [id, entry] of this.comments) {
99
- for (const range of entry.ranges) {
100
- if (rangeContainsPosition(range, pos.node, pos.offset)) {
101
- return id;
102
- }
103
- }
104
- }
105
- return undefined;
106
- }
107
-
108
- isPointInHighlight(x: number, y: number): boolean {
109
- const pos = caretPositionFromPointCompat(x, y);
110
- if (!pos) return false;
111
-
112
- for (const range of this.pendingRanges) {
113
- if (rangeContainsPosition(range, pos.node, pos.offset)) return true;
114
- }
115
-
116
- for (const [, entry] of this.comments) {
117
- for (const range of entry.ranges) {
118
- if (rangeContainsPosition(range, pos.node, pos.offset)) return true;
119
- }
120
- }
121
-
122
- return false;
123
- }
124
-
125
- getHighlightedIds(): string[] {
126
- return [...this.comments.keys()];
127
- }
128
-
129
- dispose(): void {
130
- this.clearAll();
131
- this.clearPending();
132
- }
133
-
134
- private syncCommentHighlights(): void {
135
- const byColor = new Map<number, Range[]>();
136
- for (let i = 0; i < COLOR_COUNT; i++) {
137
- byColor.set(i, []);
138
- }
139
-
140
- for (const entry of this.comments.values()) {
141
- const bucket = byColor.get(entry.colorIndex % COLOR_COUNT)!;
142
- bucket.push(...entry.ranges);
143
- }
144
-
145
- for (let i = 0; i < COLOR_COUNT; i++) {
146
- const ranges = byColor.get(i)!;
147
- if (ranges.length > 0) {
148
- CSS.highlights.set(`comment-color-${i}`, new Highlight(...ranges));
149
- } else {
150
- CSS.highlights.delete(`comment-color-${i}`);
151
- }
152
- }
153
-
154
- this.syncFocused();
155
- this.exposeIds();
156
- }
157
-
158
- private syncFocused(): void {
159
- if (!this.focusedId) {
160
- CSS.highlights.delete("comment-focused");
161
- return;
162
- }
163
-
164
- const entry = this.comments.get(this.focusedId);
165
- if (!entry || entry.ranges.length === 0) {
166
- CSS.highlights.delete("comment-focused");
167
- return;
168
- }
169
-
170
- CSS.highlights.set("comment-focused", new Highlight(...entry.ranges));
171
- }
172
-
173
- private exposeIds(): void {
174
- if (typeof window !== "undefined") {
175
- (window as unknown as Record<string, unknown>).__readitHighlights = {
176
- commentIds: this.getHighlightedIds(),
177
- };
178
- }
179
- }
180
- }
181
-
182
- interface CaretPosition {
183
- node: Node;
184
- offset: number;
185
- }
186
-
187
- function caretPositionFromPointCompat(
188
- x: number,
189
- y: number,
190
- ): CaretPosition | null {
191
- if ("caretPositionFromPoint" in document) {
192
- const pos = document.caretPositionFromPoint(x, y);
193
- if (pos) return { node: pos.offsetNode, offset: pos.offset };
194
- }
195
-
196
- if ("caretRangeFromPoint" in document) {
197
- const range = (
198
- document as unknown as {
199
- caretRangeFromPoint(x: number, y: number): Range | null;
200
- }
201
- ).caretRangeFromPoint(x, y);
202
- if (range) {
203
- return { node: range.startContainer, offset: range.startOffset };
204
- }
205
- }
206
-
207
- return null;
208
- }
209
-
210
- function rangeContainsPosition(
211
- range: Range,
212
- node: Node,
213
- offset: number,
214
- ): boolean {
215
- try {
216
- const cmp1 = range.comparePoint(node, offset);
217
- return cmp1 === 0;
218
- } catch {
219
- return false;
220
- }
221
- }
@@ -1,92 +0,0 @@
1
- import { bench, describe } from "vitest";
2
- import {
3
- COMMENTS_10,
4
- COMMENTS_50,
5
- LARGE_DOC,
6
- MEDIUM_DOC,
7
- } from "../__fixtures__/bench-data";
8
- import {
9
- collectTextNodes,
10
- collectTextNodesWithContent,
11
- createRangesFromNodes,
12
- } from "./dom";
13
- import { findTextPosition } from "./resolver";
14
-
15
- describe("findTextPosition", () => {
16
- const textContent = LARGE_DOC;
17
-
18
- bench("single comment", () => {
19
- const c = COMMENTS_10[5];
20
- findTextPosition(textContent, c.selectedText, c.startOffset);
21
- });
22
-
23
- bench("10 comments", () => {
24
- for (const c of COMMENTS_10) {
25
- findTextPosition(textContent, c.selectedText, c.startOffset);
26
- }
27
- });
28
-
29
- bench("50 comments", () => {
30
- for (const c of COMMENTS_50) {
31
- findTextPosition(textContent, c.selectedText, c.startOffset);
32
- }
33
- });
34
- });
35
-
36
- function buildDocument(markdown: string): HTMLElement {
37
- const root = document.createElement("article");
38
- const paragraphs = markdown.split("\n\n");
39
- for (const p of paragraphs) {
40
- if (!p.trim()) continue;
41
- const el = p.startsWith("#")
42
- ? document.createElement("h2")
43
- : document.createElement("p");
44
- el.textContent = p.replace(/^#+\s*/, "");
45
- root.appendChild(el);
46
- }
47
- return root;
48
- }
49
-
50
- describe("collectTextNodes", () => {
51
- const mediumRoot = buildDocument(MEDIUM_DOC);
52
- const largeRoot = buildDocument(LARGE_DOC);
53
-
54
- bench("medium doc (150 lines)", () => {
55
- collectTextNodes(mediumRoot);
56
- });
57
-
58
- bench("large doc (300 lines)", () => {
59
- collectTextNodes(largeRoot);
60
- });
61
- });
62
-
63
- describe("collectTextNodesWithContent (single-pass)", () => {
64
- const mediumRoot = buildDocument(MEDIUM_DOC);
65
- const largeRoot = buildDocument(LARGE_DOC);
66
-
67
- bench("medium doc (150 lines)", () => {
68
- collectTextNodesWithContent(mediumRoot);
69
- });
70
-
71
- bench("large doc (300 lines)", () => {
72
- collectTextNodesWithContent(largeRoot);
73
- });
74
- });
75
-
76
- describe("createRangesFromNodes", () => {
77
- bench("10 highlights on medium doc", () => {
78
- const nodes = collectTextNodes(buildDocument(MEDIUM_DOC));
79
- for (const c of COMMENTS_10) {
80
- const pos = findTextPosition(MEDIUM_DOC, c.selectedText, c.startOffset);
81
- if (pos) createRangesFromNodes(nodes, pos.start, pos.end);
82
- }
83
- });
84
-
85
- bench("50 highlights on large doc", () => {
86
- const nodes = collectTextNodes(buildDocument(LARGE_DOC));
87
- for (const c of COMMENTS_50) {
88
- const pos = findTextPosition(LARGE_DOC, c.selectedText, c.startOffset);
89
- if (pos) createRangesFromNodes(nodes, pos.start, pos.end);
90
- }
91
- });
92
- });