@peaske7/readit 0.2.1 → 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 (367) 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 -118
  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 -881
  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 -218
  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/RawModal.svelte +0 -126
  293. package/src/components/ReanchorConfirm.svelte +0 -30
  294. package/src/components/SettingsModal.svelte +0 -220
  295. package/src/components/ShortcutCapture.svelte +0 -82
  296. package/src/components/ShortcutList.svelte +0 -145
  297. package/src/components/TabBar.svelte +0 -52
  298. package/src/components/TableOfContents.svelte +0 -125
  299. package/src/components/ui/ActionLink.svelte +0 -40
  300. package/src/components/ui/Button.svelte +0 -53
  301. package/src/components/ui/Dialog.svelte +0 -97
  302. package/src/components/ui/DropdownMenu.svelte +0 -85
  303. package/src/components/ui/DropdownMenuItem.svelte +0 -38
  304. package/src/components/ui/DropdownMenuSeparator.svelte +0 -11
  305. package/src/components/ui/Text.svelte +0 -42
  306. package/src/env.d.ts +0 -6
  307. package/src/index.css +0 -754
  308. package/src/lib/__fixtures__/bench-data.ts +0 -114
  309. package/src/lib/anchor.bench.ts +0 -91
  310. package/src/lib/anchor.test.ts +0 -527
  311. package/src/lib/anchor.ts +0 -381
  312. package/src/lib/comment-storage.bench.ts +0 -49
  313. package/src/lib/comment-storage.test.ts +0 -632
  314. package/src/lib/comment-storage.ts +0 -222
  315. package/src/lib/export.bench.ts +0 -21
  316. package/src/lib/export.ts +0 -36
  317. package/src/lib/headings.test.ts +0 -103
  318. package/src/lib/headings.ts +0 -44
  319. package/src/lib/highlight/core.test.ts +0 -93
  320. package/src/lib/highlight/dom.ts +0 -187
  321. package/src/lib/highlight/highlight-registry.ts +0 -221
  322. package/src/lib/highlight/highlight.bench.ts +0 -92
  323. package/src/lib/highlight/highlighter.ts +0 -247
  324. package/src/lib/highlight/resolver.ts +0 -38
  325. package/src/lib/highlight/types.ts +0 -17
  326. package/src/lib/html-text.test.ts +0 -162
  327. package/src/lib/html-text.ts +0 -161
  328. package/src/lib/i18n/en.ts +0 -116
  329. package/src/lib/i18n/index.ts +0 -3
  330. package/src/lib/i18n/ja.ts +0 -118
  331. package/src/lib/i18n/translations.ts +0 -27
  332. package/src/lib/i18n/types.ts +0 -122
  333. package/src/lib/margin-layout.bench.ts +0 -61
  334. package/src/lib/margin-layout.ts +0 -71
  335. package/src/lib/markdown-renderer.test.ts +0 -154
  336. package/src/lib/markdown-renderer.ts +0 -177
  337. package/src/lib/mermaid-config.ts +0 -38
  338. package/src/lib/mermaid-renderer.ts +0 -162
  339. package/src/lib/mermaid-worker.ts +0 -60
  340. package/src/lib/positions.ts +0 -157
  341. package/src/lib/shortcut-registry.ts +0 -244
  342. package/src/lib/utils.ts +0 -15
  343. package/src/main.ts +0 -16
  344. package/src/schema.ts +0 -92
  345. package/src/server.ts +0 -1220
  346. package/src/stores/app.svelte.ts +0 -231
  347. package/src/stores/locale.svelte.ts +0 -46
  348. package/src/stores/settings.svelte.ts +0 -90
  349. package/src/stores/shortcuts.svelte.ts +0 -104
  350. package/src/stores/ui.svelte.ts +0 -12
  351. package/src/template.ts +0 -104
  352. package/src/test-setup.ts +0 -48
  353. package/svelte.config.js +0 -5
  354. package/test.md +0 -74
  355. package/tsconfig.cli.json +0 -12
  356. package/tsconfig.json +0 -20
  357. package/vite.config.ts +0 -47
  358. package/vitest.config.ts +0 -15
  359. package/vscode-readit/.mcp.json +0 -7
  360. package/vscode-readit/.vscodeignore +0 -7
  361. package/vscode-readit/bun.lock +0 -78
  362. package/vscode-readit/icon.svg +0 -10
  363. package/vscode-readit/package.json +0 -110
  364. package/vscode-readit/src/extension.ts +0 -117
  365. package/vscode-readit/src/server-manager.ts +0 -272
  366. package/vscode-readit/src/webview-provider.ts +0 -204
  367. package/vscode-readit/tsconfig.json +0 -20
@@ -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
- });
@@ -1,247 +0,0 @@
1
- import {
2
- collectTextNodesWithContent,
3
- createRangesForHighlight,
4
- createRangesFromNodes,
5
- getTextOffset,
6
- } from "./dom";
7
- import { HighlightRegistry } from "./highlight-registry";
8
- import type { HighlightComment, TextNodeInfo } from "./types";
9
-
10
- export type SelectionHandler = (
11
- text: string,
12
- startOffset: number,
13
- endOffset: number,
14
- selectionTop: number,
15
- ) => void;
16
- export type HoverHandler = (commentId: string | undefined) => void;
17
- export type ClickHandler = (commentId: string) => void;
18
- export type CacheHandler = () => void;
19
-
20
- export interface Highlighter {
21
- applyHighlights(comments: HighlightComment[]): void;
22
- clearHighlights(): void;
23
- onHighlightHover(callback: HoverHandler): () => void;
24
- onHighlightClick(callback: ClickHandler): () => void;
25
-
26
- setFocused(commentId: string | undefined): void;
27
- scrollToComment(commentId: string): void;
28
- getPositions(containerRect: DOMRect): Map<string, number>;
29
- getHighlightedIds(): string[];
30
- isPointInHighlight(x: number, y: number): boolean;
31
-
32
- onCacheInvalidated(callback: CacheHandler): () => void;
33
-
34
- dispose(): void;
35
- }
36
-
37
- export interface HighlighterOptions {
38
- root: HTMLElement;
39
- container: HTMLElement;
40
- onSelect: SelectionHandler;
41
- }
42
-
43
- export function createHighlighter(options: HighlighterOptions): Highlighter {
44
- const { root, container, onSelect } = options;
45
-
46
- let hoverCallback: HoverHandler | undefined;
47
- let clickCallback: ClickHandler | undefined;
48
- let cacheCallback: CacheHandler | undefined;
49
-
50
- const activePositions = new Map<string, { start: number; end: number }>();
51
- let lastTextContent = "";
52
-
53
- const registry = new HighlightRegistry();
54
-
55
- let lastHoveredId: string | undefined;
56
-
57
- const handleMouseUp = () => {
58
- const selection = window.getSelection();
59
- if (!selection || selection.isCollapsed) return;
60
-
61
- const text = selection
62
- .toString()
63
- .trim()
64
- .replace(/\r?\n\s*/g, "\n");
65
- if (text.length === 0) return;
66
-
67
- const range = selection.getRangeAt(0);
68
-
69
- // Reject whole-document selections caused by DOM mutation
70
- if (
71
- range.startContainer === root &&
72
- range.startOffset === 0 &&
73
- range.endContainer === root &&
74
- range.endOffset === root.childNodes.length
75
- ) {
76
- return;
77
- }
78
-
79
- const startOffset = getTextOffset(
80
- root,
81
- range.startContainer,
82
- range.startOffset,
83
- );
84
- const endOffset = getTextOffset(root, range.endContainer, range.endOffset);
85
-
86
- const rangeRect = range.getBoundingClientRect();
87
- const containerRect = container.getBoundingClientRect();
88
- const selectionTop = rangeRect.top - containerRect.top;
89
-
90
- onSelect(text, startOffset, endOffset, selectionTop);
91
-
92
- requestAnimationFrame(() => {
93
- const pendingRanges = createRangesForHighlight(
94
- root,
95
- startOffset,
96
- endOffset,
97
- );
98
- registry.setPending(pendingRanges);
99
- });
100
- };
101
-
102
- const handleMouseMove = (e: MouseEvent) => {
103
- if (!hoverCallback) return;
104
-
105
- const id = registry.hitTest(e.clientX, e.clientY);
106
-
107
- if (id !== lastHoveredId) {
108
- lastHoveredId = id;
109
- hoverCallback(id);
110
- }
111
- };
112
-
113
- const handleClick = (e: MouseEvent) => {
114
- if (!clickCallback) return;
115
-
116
- const commentId = registry.hitTest(e.clientX, e.clientY);
117
- if (commentId) {
118
- clickCallback(commentId);
119
- }
120
- };
121
-
122
- const applyDiff = (
123
- resolved: Map<string, { start: number; end: number; colorIndex: number }>,
124
- textNodes: TextNodeInfo[],
125
- ) => {
126
- let changed = false;
127
-
128
- for (const [id, prev] of activePositions) {
129
- const next = resolved.get(id);
130
- if (!next || prev.start !== next.start || prev.end !== next.end) {
131
- registry.removeComment(id);
132
- activePositions.delete(id);
133
- changed = true;
134
- }
135
- }
136
-
137
- for (const [id, entry] of resolved) {
138
- if (!activePositions.has(id)) {
139
- const ranges = createRangesFromNodes(textNodes, entry.start, entry.end);
140
- if (ranges.length > 0) {
141
- registry.updateComment(id, ranges, entry.colorIndex);
142
- activePositions.set(id, { start: entry.start, end: entry.end });
143
- changed = true;
144
- }
145
- }
146
- }
147
-
148
- if (changed) {
149
- cacheCallback?.();
150
- }
151
- };
152
-
153
- root.addEventListener("mouseup", handleMouseUp);
154
- root.addEventListener("mousemove", handleMouseMove);
155
- root.addEventListener("click", handleClick);
156
-
157
- return {
158
- applyHighlights(comments: HighlightComment[]) {
159
- const { text: textContent, nodes: textNodes } =
160
- collectTextNodesWithContent(root);
161
-
162
- const contentChanged = textContent !== lastTextContent;
163
- if (contentChanged) {
164
- registry.clearAll();
165
- activePositions.clear();
166
- lastTextContent = textContent;
167
- }
168
-
169
- const resolved = new Map<
170
- string,
171
- { start: number; end: number; colorIndex: number }
172
- >();
173
- let colorIdx = 0;
174
- for (const c of comments) {
175
- if (c.startOffset >= 0 && c.endOffset > c.startOffset) {
176
- resolved.set(c.id, {
177
- start: c.startOffset,
178
- end: c.endOffset,
179
- colorIndex: colorIdx % 4,
180
- });
181
- colorIdx++;
182
- }
183
- }
184
-
185
- applyDiff(resolved, textNodes);
186
- },
187
-
188
- clearHighlights() {
189
- registry.clearAll();
190
- activePositions.clear();
191
- lastTextContent = "";
192
- cacheCallback?.();
193
- },
194
-
195
- onHighlightHover(callback: HoverHandler) {
196
- hoverCallback = callback;
197
- return () => {
198
- hoverCallback = undefined;
199
- };
200
- },
201
-
202
- onHighlightClick(callback: ClickHandler) {
203
- clickCallback = callback;
204
- return () => {
205
- clickCallback = undefined;
206
- };
207
- },
208
-
209
- setFocused(commentId: string | undefined) {
210
- registry.setFocused(commentId);
211
- },
212
-
213
- scrollToComment(commentId: string) {
214
- registry.scrollToComment(commentId);
215
- },
216
-
217
- getPositions(containerRect: DOMRect): Map<string, number> {
218
- return registry.getPositions(containerRect);
219
- },
220
-
221
- getHighlightedIds(): string[] {
222
- return registry.getHighlightedIds();
223
- },
224
-
225
- isPointInHighlight(x: number, y: number): boolean {
226
- return registry.isPointInHighlight(x, y);
227
- },
228
-
229
- onCacheInvalidated(callback: CacheHandler) {
230
- cacheCallback = callback;
231
- return () => {
232
- cacheCallback = undefined;
233
- };
234
- },
235
-
236
- dispose() {
237
- registry.dispose();
238
- root.removeEventListener("mouseup", handleMouseUp);
239
- root.removeEventListener("mousemove", handleMouseMove);
240
- root.removeEventListener("click", handleClick);
241
- hoverCallback = undefined;
242
- clickCallback = undefined;
243
- cacheCallback = undefined;
244
- lastHoveredId = undefined;
245
- },
246
- };
247
- }
@@ -1,38 +0,0 @@
1
- import type { TextPosition } from "./types";
2
-
3
- export function findTextPosition(
4
- textContent: string,
5
- selectedText: string,
6
- hintOffset?: number,
7
- ): TextPosition | undefined {
8
- if (!selectedText || !textContent) return undefined;
9
-
10
- const occurrences: number[] = [];
11
- let idx = 0;
12
- for (;;) {
13
- idx = textContent.indexOf(selectedText, idx);
14
- if (idx === -1) break;
15
- occurrences.push(idx);
16
- idx += 1;
17
- }
18
-
19
- if (occurrences.length === 0) return undefined;
20
- if (occurrences.length === 1) {
21
- return {
22
- start: occurrences[0],
23
- end: occurrences[0] + selectedText.length,
24
- };
25
- }
26
-
27
- const target = hintOffset ?? 0;
28
- let closest = occurrences[0];
29
- let minDist = Math.abs(closest - target);
30
- for (const occ of occurrences) {
31
- const dist = Math.abs(occ - target);
32
- if (dist < minDist) {
33
- minDist = dist;
34
- closest = occ;
35
- }
36
- }
37
- return { start: closest, end: closest + selectedText.length };
38
- }
@@ -1,17 +0,0 @@
1
- export interface TextPosition {
2
- start: number;
3
- end: number;
4
- }
5
-
6
- export interface HighlightComment {
7
- id: string;
8
- selectedText: string;
9
- startOffset: number;
10
- endOffset: number;
11
- }
12
-
13
- export interface TextNodeInfo {
14
- node: Text;
15
- start: number;
16
- end: number;
17
- }