@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,162 +0,0 @@
1
- interface PendingRequest {
2
- resolve: (svg: string) => void;
3
- reject: (err: Error) => void;
4
- timer: ReturnType<typeof setTimeout>;
5
- }
6
-
7
- const RENDER_TIMEOUT_MS = 15_000;
8
- const MAX_CONSECUTIVE_ERRORS = 3;
9
-
10
- let worker: Worker | null = null;
11
- let workerReady: Promise<void> | null = null;
12
- const pendingRequests = new Map<string, PendingRequest>();
13
- let requestCounter = 0;
14
- let consecutiveErrors = 0;
15
-
16
- function resetWorker(
17
- reason: Error,
18
- currentWorker: Worker | null = worker,
19
- ): void {
20
- if (currentWorker) currentWorker.terminate();
21
- if (worker === currentWorker) {
22
- worker = null;
23
- workerReady = null;
24
- }
25
- for (const [, pending] of pendingRequests) {
26
- clearTimeout(pending.timer);
27
- pending.reject(reason);
28
- }
29
- pendingRequests.clear();
30
- }
31
-
32
- function createWorker(): { worker: Worker; ready: Promise<void> } {
33
- const w = new Worker(new URL("./mermaid-worker.ts", import.meta.url).href, {
34
- type: "module",
35
- });
36
-
37
- const ready = new Promise<void>((resolve, reject) => {
38
- const timeout = setTimeout(() => {
39
- w.removeEventListener("message", onReady);
40
- w.removeEventListener("error", onStartupError);
41
- w.terminate();
42
- if (worker === w) {
43
- worker = null;
44
- workerReady = null;
45
- }
46
- reject(new Error("Mermaid worker failed to start within 30s"));
47
- }, 30_000);
48
-
49
- function onStartupError(event: ErrorEvent) {
50
- clearTimeout(timeout);
51
- w.removeEventListener("message", onReady);
52
- w.removeEventListener("error", onStartupError);
53
- w.terminate();
54
- if (worker === w) {
55
- worker = null;
56
- workerReady = null;
57
- }
58
- reject(new Error(`Mermaid worker failed to start: ${event.message}`));
59
- }
60
-
61
- function onReady(event: MessageEvent) {
62
- if (event.data?.type === "ready") {
63
- clearTimeout(timeout);
64
- w.removeEventListener("message", onReady);
65
- w.removeEventListener("error", onStartupError);
66
- resolve();
67
- }
68
- }
69
- w.addEventListener("message", onReady);
70
- w.addEventListener("error", onStartupError);
71
- });
72
-
73
- w.addEventListener("message", (event: MessageEvent) => {
74
- const { id, svg, error } = event.data;
75
- if (!id) return;
76
-
77
- const pending = pendingRequests.get(id);
78
- if (!pending) return;
79
-
80
- clearTimeout(pending.timer);
81
- pendingRequests.delete(id);
82
-
83
- if (error) {
84
- consecutiveErrors++;
85
- pending.reject(new Error(error));
86
- } else {
87
- consecutiveErrors = 0;
88
- pending.resolve(svg);
89
- }
90
- });
91
-
92
- w.addEventListener("error", (event) => {
93
- resetWorker(new Error(`Worker error: ${event.message}`), w);
94
- });
95
-
96
- return { worker: w, ready };
97
- }
98
-
99
- async function ensureWorker(): Promise<Worker> {
100
- if (worker && workerReady) {
101
- await workerReady;
102
-
103
- if (consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) {
104
- resetWorker(
105
- new Error("Mermaid worker restarted after repeated render failures"),
106
- );
107
- consecutiveErrors = 0;
108
- }
109
- }
110
-
111
- if (!worker) {
112
- const result = createWorker();
113
- worker = result.worker;
114
- workerReady = result.ready;
115
- await workerReady;
116
- }
117
-
118
- return worker;
119
- }
120
-
121
- async function renderMermaidSvg(code: string): Promise<string> {
122
- const w = await ensureWorker();
123
-
124
- const id = `req-${++requestCounter}`;
125
- const diagramId = `mermaid-ssr-${requestCounter}`;
126
-
127
- return new Promise<string>((resolve, reject) => {
128
- const timer = setTimeout(() => {
129
- pendingRequests.delete(id);
130
- resetWorker(
131
- new Error(`Mermaid render timed out after ${RENDER_TIMEOUT_MS}ms`),
132
- w,
133
- );
134
- reject(
135
- new Error(`Mermaid render timed out after ${RENDER_TIMEOUT_MS}ms`),
136
- );
137
- }, RENDER_TIMEOUT_MS);
138
-
139
- pendingRequests.set(id, { resolve, reject, timer });
140
-
141
- w.postMessage({ id, code, diagramId });
142
- });
143
- }
144
-
145
- export async function renderMermaidBlocks(
146
- blocks: string[],
147
- ): Promise<(string | null)[]> {
148
- const results: (string | null)[] = [];
149
- for (const code of blocks) {
150
- try {
151
- const svg = await renderMermaidSvg(code);
152
- results.push(svg);
153
- } catch {
154
- results.push(null);
155
- }
156
- }
157
- return results;
158
- }
159
-
160
- export function disposeMermaidWorker(): void {
161
- resetWorker(new Error("Mermaid worker disposed"));
162
- }
@@ -1,60 +0,0 @@
1
- /// <reference lib="webworker" />
2
-
3
- import { JSDOM } from "jsdom";
4
- import { getMermaidInitConfig } from "./mermaid-config";
5
-
6
- const dom = new JSDOM(
7
- '<!DOCTYPE html><html><body><div id="mermaid-container"></div></body></html>',
8
- {
9
- url: "http://localhost",
10
- pretendToBeVisual: true,
11
- contentType: "text/html",
12
- },
13
- );
14
-
15
- const g = globalThis as Record<string, unknown>;
16
- g.window = dom.window;
17
- g.document = dom.window.document;
18
- g.navigator = dom.window.navigator;
19
- g.DOMParser = dom.window.DOMParser;
20
- g.XMLSerializer = dom.window.XMLSerializer;
21
- g.HTMLElement = dom.window.HTMLElement;
22
- g.SVGElement = (dom.window as unknown as Record<string, unknown>).SVGElement;
23
-
24
- const mermaid = (await import("mermaid")).default;
25
- mermaid.initialize(getMermaidInitConfig());
26
-
27
- interface RenderRequest {
28
- id: string;
29
- code: string;
30
- diagramId: string;
31
- }
32
-
33
- function resetBody() {
34
- const body = dom.window.document.body;
35
- while (body.firstChild) body.removeChild(body.firstChild);
36
- const container = dom.window.document.createElement("div");
37
- container.id = "mermaid-container";
38
- body.appendChild(container);
39
- }
40
-
41
- let renderQueue: Promise<void> = Promise.resolve();
42
-
43
- self.onmessage = (event: MessageEvent<RenderRequest>) => {
44
- const { id, code, diagramId } = event.data;
45
-
46
- renderQueue = renderQueue.then(async () => {
47
- try {
48
- resetBody();
49
- const { svg } = await mermaid.render(diagramId, code);
50
- self.postMessage({ id, svg });
51
- } catch (err) {
52
- self.postMessage({
53
- id,
54
- error: err instanceof Error ? err.message : String(err),
55
- });
56
- }
57
- });
58
- };
59
-
60
- self.postMessage({ type: "ready" });
@@ -1,157 +0,0 @@
1
- import type { Highlighter } from "./highlight/highlighter";
2
- import { resolveMarginNotePositions } from "./margin-layout";
3
-
4
- type Listener = () => void;
5
-
6
- export class Positions {
7
- private relative = new Map<string, number>();
8
- private absolute = new Map<string, number>();
9
- private snapshot: Record<string, number> = {};
10
- private notes = new Map<string, HTMLElement>();
11
- private ids: string[] = [];
12
- private pendingTop: number | undefined;
13
- private listeners = new Set<Listener>();
14
- private root: HTMLElement | null = null;
15
- private container: HTMLElement | null = null;
16
- private highlighter: Highlighter | null = null;
17
- private resizeRaf: number | null = null;
18
- private cacheRaf: number | null = null;
19
- private unsubCache: (() => void) | null = null;
20
-
21
- attach(root: HTMLElement, container: HTMLElement, highlighter: Highlighter) {
22
- this.root = root;
23
- this.container = container;
24
- this.highlighter = highlighter;
25
- window.addEventListener("resize", this.onResize);
26
-
27
- this.unsubCache = highlighter.onCacheInvalidated(() => {
28
- if (this.cacheRaf !== null) return;
29
- this.cacheRaf = requestAnimationFrame(() => {
30
- this.cacheRaf = null;
31
- this.cache();
32
- });
33
- });
34
- }
35
-
36
- detach() {
37
- window.removeEventListener("resize", this.onResize);
38
- if (this.resizeRaf !== null) cancelAnimationFrame(this.resizeRaf);
39
- if (this.cacheRaf !== null) cancelAnimationFrame(this.cacheRaf);
40
- this.resizeRaf = null;
41
- this.cacheRaf = null;
42
- this.unsubCache?.();
43
- this.unsubCache = null;
44
- this.root = null;
45
- this.container = null;
46
- this.highlighter = null;
47
- }
48
-
49
- cache() {
50
- if (!this.root || !this.container || !this.highlighter) return;
51
-
52
- const highlightedIds = this.highlighter.getHighlightedIds();
53
- if (highlightedIds.length === 0) return;
54
-
55
- const ref = this.container.getBoundingClientRect();
56
- const scrollY = window.scrollY;
57
-
58
- this.relative.clear();
59
- this.absolute.clear();
60
-
61
- const positions = this.highlighter.getPositions(ref);
62
- for (const [id, relTop] of positions) {
63
- this.relative.set(id, relTop);
64
- this.absolute.set(id, relTop + ref.top + scrollY);
65
- }
66
-
67
- const snap: Record<string, number> = {};
68
- for (const [id, top] of this.absolute) snap[id] = top;
69
- this.snapshot = snap;
70
-
71
- this.apply();
72
- this.notify();
73
- this.exposeReady();
74
- }
75
-
76
- setIds(ids: string[]) {
77
- this.ids = ids;
78
- }
79
-
80
- setPending(top: number | undefined) {
81
- if (this.pendingTop === top) return;
82
- this.pendingTop = top;
83
- this.apply();
84
- }
85
-
86
- register(id: string, el: HTMLElement) {
87
- this.notes.set(id, el);
88
- const top = this.resolve().get(id);
89
- if (top !== undefined) {
90
- el.style.top = `${top}px`;
91
- el.style.visibility = "visible";
92
- } else {
93
- el.style.visibility = "hidden";
94
- }
95
- }
96
-
97
- unregister(id: string) {
98
- this.notes.delete(id);
99
- }
100
-
101
- getAbsolute(): Record<string, number> {
102
- return this.snapshot;
103
- }
104
-
105
- subscribe(fn: Listener): () => void {
106
- this.listeners.add(fn);
107
- return () => this.listeners.delete(fn);
108
- }
109
-
110
- dispose() {
111
- this.detach();
112
- this.relative.clear();
113
- this.absolute.clear();
114
- this.snapshot = {};
115
- this.notes.clear();
116
- this.listeners.clear();
117
- this.ids = [];
118
- }
119
-
120
- private resolve(): Map<string, number> {
121
- const pos: Record<string, number> = {};
122
- for (const [id, top] of this.relative) pos[id] = top;
123
- return resolveMarginNotePositions(this.ids, pos, this.pendingTop);
124
- }
125
-
126
- private apply() {
127
- const resolved = this.resolve();
128
- for (const [id, el] of this.notes) {
129
- const top = resolved.get(id);
130
- if (top !== undefined) {
131
- el.style.top = `${top}px`;
132
- el.style.visibility = "visible";
133
- } else {
134
- el.style.visibility = "hidden";
135
- }
136
- }
137
- }
138
-
139
- private onResize = () => {
140
- if (this.resizeRaf !== null) return;
141
- this.resizeRaf = requestAnimationFrame(() => {
142
- this.resizeRaf = null;
143
- this.cache();
144
- });
145
- };
146
-
147
- private notify() {
148
- for (const fn of this.listeners) fn();
149
- }
150
-
151
- private exposeReady() {
152
- if (typeof window !== "undefined") {
153
- (window as unknown as Record<string, unknown>).__readitPositionsReady =
154
- performance.now();
155
- }
156
- }
157
- }
@@ -1,244 +0,0 @@
1
- import type { KeybindingOverride, ShortcutBinding } from "../schema";
2
- import type { TranslationKey } from "./i18n/types";
3
-
4
- const IS_MAC =
5
- typeof navigator !== "undefined" && navigator.platform.includes("Mac");
6
-
7
- export const ShortcutActions = {
8
- COPY_ALL: "copyAll",
9
- COPY_ALL_RAW: "copyAllRaw",
10
- NAVIGATE_NEXT: "navigateNext",
11
- NAVIGATE_PREVIOUS: "navigatePrevious",
12
- COPY_SELECTION_RAW: "copySelectionRaw",
13
- COPY_SELECTION_LLM: "copySelectionLLM",
14
- CLEAR_SELECTION: "clearSelection",
15
- } as const;
16
-
17
- export type ShortcutAction =
18
- (typeof ShortcutActions)[keyof typeof ShortcutActions];
19
-
20
- export interface ShortcutDefinition {
21
- id: ShortcutAction;
22
- label: TranslationKey;
23
- description: TranslationKey;
24
- defaultBinding: ShortcutBinding;
25
- binding: ShortcutBinding;
26
- enabled: boolean;
27
- }
28
-
29
- export const DEFAULT_SHORTCUTS: ShortcutDefinition[] = [
30
- {
31
- id: ShortcutActions.COPY_ALL,
32
- label: "shortcut.copyAll.label",
33
- description: "shortcut.copyAll.description",
34
- defaultBinding: { key: "c", alt: true },
35
- binding: { key: "c", alt: true },
36
- enabled: true,
37
- },
38
- {
39
- id: ShortcutActions.COPY_ALL_RAW,
40
- label: "shortcut.copyAllRaw.label",
41
- description: "shortcut.copyAllRaw.description",
42
- defaultBinding: { key: "c", alt: true, shift: true },
43
- binding: { key: "c", alt: true, shift: true },
44
- enabled: true,
45
- },
46
- {
47
- id: ShortcutActions.NAVIGATE_NEXT,
48
- label: "shortcut.navigateNext.label",
49
- description: "shortcut.navigateNext.description",
50
- defaultBinding: { key: "ArrowDown", alt: true },
51
- binding: { key: "ArrowDown", alt: true },
52
- enabled: true,
53
- },
54
- {
55
- id: ShortcutActions.NAVIGATE_PREVIOUS,
56
- label: "shortcut.navigatePrevious.label",
57
- description: "shortcut.navigatePrevious.description",
58
- defaultBinding: { key: "ArrowUp", alt: true },
59
- binding: { key: "ArrowUp", alt: true },
60
- enabled: true,
61
- },
62
- {
63
- id: ShortcutActions.COPY_SELECTION_RAW,
64
- label: "shortcut.copySelectionRaw.label",
65
- description: "shortcut.copySelectionRaw.description",
66
- defaultBinding: IS_MAC
67
- ? { key: "c", meta: true, shift: true }
68
- : { key: "c", ctrl: true, shift: true },
69
- binding: IS_MAC
70
- ? { key: "c", meta: true, shift: true }
71
- : { key: "c", ctrl: true, shift: true },
72
- enabled: true,
73
- },
74
- {
75
- id: ShortcutActions.COPY_SELECTION_LLM,
76
- label: "shortcut.copySelectionLLM.label",
77
- description: "shortcut.copySelectionLLM.description",
78
- defaultBinding: IS_MAC
79
- ? { key: "c", meta: true, alt: true }
80
- : { key: "c", ctrl: true, alt: true },
81
- binding: IS_MAC
82
- ? { key: "c", meta: true, alt: true }
83
- : { key: "c", ctrl: true, alt: true },
84
- enabled: true,
85
- },
86
- {
87
- id: ShortcutActions.CLEAR_SELECTION,
88
- label: "shortcut.clearSelection.label",
89
- description: "shortcut.clearSelection.description",
90
- defaultBinding: { key: "Escape" },
91
- binding: { key: "Escape" },
92
- enabled: true,
93
- },
94
- ];
95
-
96
- export function matchesBinding(
97
- event: KeyboardEvent,
98
- binding: ShortcutBinding,
99
- ): boolean {
100
- if (event.key.toLowerCase() !== binding.key.toLowerCase()) return false;
101
- if (!!binding.alt !== event.altKey) return false;
102
- if (!!binding.ctrl !== event.ctrlKey) return false;
103
- if (!!binding.meta !== event.metaKey) return false;
104
- if (!!binding.shift !== event.shiftKey) return false;
105
- return true;
106
- }
107
-
108
- export function formatBinding(
109
- binding: ShortcutBinding,
110
- isMac: boolean,
111
- ): string {
112
- const parts: string[] = [];
113
-
114
- if (binding.ctrl) {
115
- parts.push(isMac ? "\u2303" : "Ctrl");
116
- }
117
- if (binding.meta) {
118
- parts.push(isMac ? "\u2318" : "Meta");
119
- }
120
- if (binding.alt) {
121
- parts.push(isMac ? "\u2325" : "Alt");
122
- }
123
- if (binding.shift) {
124
- parts.push(isMac ? "\u21E7" : "Shift");
125
- }
126
-
127
- const keyDisplay = KEY_DISPLAY_MAP[binding.key] ?? binding.key.toUpperCase();
128
- parts.push(keyDisplay);
129
-
130
- return parts.join(isMac ? "" : "+");
131
- }
132
-
133
- const KEY_DISPLAY_MAP: Record<string, string> = {
134
- ArrowUp: "\u2191",
135
- ArrowDown: "\u2193",
136
- ArrowLeft: "\u2190",
137
- ArrowRight: "\u2192",
138
- Escape: "Esc",
139
- Enter: "\u21B5",
140
- Backspace: "\u232B",
141
- Delete: "\u2326",
142
- Tab: "\u21E5",
143
- " ": "Space",
144
- };
145
-
146
- export function resolveShortcuts(
147
- overrides: KeybindingOverride[],
148
- ): ShortcutDefinition[] {
149
- return DEFAULT_SHORTCUTS.map((def) => {
150
- const override = overrides.find((o) => o.id === def.id);
151
- if (!override) return { ...def };
152
- return {
153
- ...def,
154
- binding: override.binding ?? def.defaultBinding,
155
- enabled: override.enabled,
156
- };
157
- });
158
- }
159
-
160
- // Mac-specific reserved bindings (Cmd+key)
161
- export const RESERVED_BINDINGS_MAC: ShortcutBinding[] = [
162
- { key: "r", meta: true },
163
- { key: "w", meta: true },
164
- { key: "t", meta: true },
165
- { key: "n", meta: true },
166
- { key: "q", meta: true },
167
- { key: "l", meta: true },
168
- { key: "a", meta: true },
169
- { key: "f", meta: true },
170
- { key: "p", meta: true },
171
- ];
172
-
173
- // Windows/Linux reserved bindings (Ctrl+key consumed by browser)
174
- export const RESERVED_BINDINGS_OTHER: ShortcutBinding[] = [
175
- { key: "r", ctrl: true },
176
- { key: "w", ctrl: true },
177
- { key: "t", ctrl: true },
178
- { key: "n", ctrl: true },
179
- { key: "l", ctrl: true },
180
- { key: "a", ctrl: true },
181
- { key: "f", ctrl: true },
182
- { key: "p", ctrl: true },
183
- ];
184
-
185
- export function isReservedBinding(
186
- binding: ShortcutBinding,
187
- isMac: boolean,
188
- ): boolean {
189
- const reserved = isMac ? RESERVED_BINDINGS_MAC : RESERVED_BINDINGS_OTHER;
190
- // Ignore shift when checking reserved bindings because browsers also
191
- // consume the shifted variants (e.g. Cmd+Shift+R, Ctrl+Shift+T).
192
- return reserved.some(
193
- (r) =>
194
- r.key.toLowerCase() === binding.key.toLowerCase() &&
195
- !!r.alt === !!binding.alt &&
196
- !!r.ctrl === !!binding.ctrl &&
197
- !!r.meta === !!binding.meta,
198
- );
199
- }
200
-
201
- export function eventToBinding(event: KeyboardEvent): ShortcutBinding {
202
- return {
203
- key: event.key,
204
- ...(event.altKey && { alt: true }),
205
- ...(event.ctrlKey && { ctrl: true }),
206
- ...(event.metaKey && { meta: true }),
207
- ...(event.shiftKey && { shift: true }),
208
- };
209
- }
210
-
211
- export function bindingsEqual(a: ShortcutBinding, b: ShortcutBinding): boolean {
212
- return (
213
- a.key.toLowerCase() === b.key.toLowerCase() &&
214
- !!a.alt === !!b.alt &&
215
- !!a.ctrl === !!b.ctrl &&
216
- !!a.meta === !!b.meta &&
217
- !!a.shift === !!b.shift
218
- );
219
- }
220
-
221
- export interface ShortcutGroup {
222
- label: TranslationKey;
223
- ids: ShortcutAction[];
224
- }
225
-
226
- export const SHORTCUT_GROUPS: ShortcutGroup[] = [
227
- {
228
- label: "shortcutGroup.copy",
229
- ids: [
230
- ShortcutActions.COPY_ALL,
231
- ShortcutActions.COPY_ALL_RAW,
232
- ShortcutActions.COPY_SELECTION_RAW,
233
- ShortcutActions.COPY_SELECTION_LLM,
234
- ],
235
- },
236
- {
237
- label: "shortcutGroup.navigate",
238
- ids: [ShortcutActions.NAVIGATE_NEXT, ShortcutActions.NAVIGATE_PREVIOUS],
239
- },
240
- {
241
- label: "shortcutGroup.other",
242
- ids: [ShortcutActions.CLEAR_SELECTION],
243
- },
244
- ];
package/src/lib/utils.ts DELETED
@@ -1,15 +0,0 @@
1
- import { type ClassValue, clsx } from "clsx";
2
- import { twMerge } from "tailwind-merge";
3
-
4
- export function isMarkdownFile(filePath: string): boolean {
5
- return filePath.endsWith(".md") || filePath.endsWith(".markdown");
6
- }
7
-
8
- export function cn(...inputs: ReadonlyArray<ClassValue>) {
9
- return twMerge(clsx(inputs));
10
- }
11
-
12
- export function truncate(text: string, maxLength = 30): string {
13
- if (text.length <= maxLength) return text;
14
- return `${text.slice(0, maxLength)}…`;
15
- }
package/src/main.ts DELETED
@@ -1,16 +0,0 @@
1
- import { mount } from "svelte";
2
- import "./index.css";
3
- import App from "./App.svelte";
4
- import { hydrateFromInlineData } from "./stores/app.svelte";
5
- import { initSettings } from "./stores/settings.svelte";
6
- import { initShortcuts } from "./stores/shortcuts.svelte";
7
-
8
- const dataEl = document.getElementById("__readit");
9
- if (dataEl) {
10
- const data = JSON.parse(dataEl.textContent ?? "{}");
11
- hydrateFromInlineData(data);
12
- initSettings(data.settings);
13
- initShortcuts(data.settings?.keybindings ?? []);
14
- }
15
-
16
- mount(App, { target: document.getElementById("app")! });