wiki-viewer 1.14.1 → 1.14.2

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 (384) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/build-manifest.json +3 -3
  3. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  4. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  5. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  6. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  7. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  11. package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  15. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  16. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  17. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  18. package/.next/standalone/.next/server/app/api/agent/activity/route.js.nft.json +1 -1
  19. package/.next/standalone/.next/server/app/api/agent/events/[...path]/route.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/api/agent/files/[...path]/route.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/api/agent/fs/file/[...path]/route.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/api/agent/fs/ls/[[...path]]/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/agent/fs/move/route.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/api/agent/fs/search/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/agent/internal/span/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/agent/settings/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/agent/sidecar/[...path]/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/assets/[...path]/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/share/[token]/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/api/share/route.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/api/system/reveal/route.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/api/system/set-root/route.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/api/system/workspaces/[id]/open/route.js.nft.json +1 -1
  34. package/.next/standalone/.next/server/app/api/system/workspaces/[id]/refresh/route.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/api/system/workspaces/[id]/route.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/api/system/workspaces/route.js.nft.json +1 -1
  37. package/.next/standalone/.next/server/app/api/upload/[...path]/route.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/api/wiki/app/route.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/api/wiki/backlinks/route.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/api/wiki/content/route.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/api/wiki/download/route.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/api/wiki/file/route.js.nft.json +1 -1
  43. package/.next/standalone/.next/server/app/api/wiki/folder/route.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/api/wiki/git-branches/route.js.nft.json +1 -1
  45. package/.next/standalone/.next/server/app/api/wiki/git-checkout/route.js.nft.json +1 -1
  46. package/.next/standalone/.next/server/app/api/wiki/git-diff/route.js.nft.json +1 -1
  47. package/.next/standalone/.next/server/app/api/wiki/git-file-info/route.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/api/wiki/git-history/route.js.nft.json +1 -1
  49. package/.next/standalone/.next/server/app/api/wiki/git-pull/route.js.nft.json +1 -1
  50. package/.next/standalone/.next/server/app/api/wiki/move/route.js.nft.json +1 -1
  51. package/.next/standalone/.next/server/app/api/wiki/new-file/route.js.nft.json +1 -1
  52. package/.next/standalone/.next/server/app/api/wiki/outlinks/route.js.nft.json +1 -1
  53. package/.next/standalone/.next/server/app/api/wiki/page/route.js.nft.json +1 -1
  54. package/.next/standalone/.next/server/app/api/wiki/presence/route.js.nft.json +1 -1
  55. package/.next/standalone/.next/server/app/api/wiki/route.js.nft.json +1 -1
  56. package/.next/standalone/.next/server/app/api/wiki/search/route.js.nft.json +1 -1
  57. package/.next/standalone/.next/server/app/api/wiki/slugs/route.js.nft.json +1 -1
  58. package/.next/standalone/.next/server/app/api/wiki/upload/route.js.nft.json +1 -1
  59. package/.next/standalone/.next/server/app/api/wiki/watch/route.js.nft.json +1 -1
  60. package/.next/standalone/.next/server/app/index.html +1 -1
  61. package/.next/standalone/.next/server/app/index.rsc +1 -1
  62. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  63. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  64. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  65. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  66. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  67. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  68. package/.next/standalone/.next/server/middleware-manifest.json +1 -1
  69. package/.next/standalone/.next/server/pages/404.html +1 -1
  70. package/.next/standalone/.next/server/pages/500.html +1 -1
  71. package/.next/standalone/package.json +1 -1
  72. package/bin/postbuild.js +21 -0
  73. package/package.json +1 -1
  74. package/.next/standalone/.github/workflows/publish.yml +0 -37
  75. package/.next/standalone/.handoffs/archive/handoff-20260612-113332.md +0 -98
  76. package/.next/standalone/.handoffs/archive/handoff-20260612-141032.md +0 -73
  77. package/.next/standalone/.pi/ownership.json +0 -3
  78. package/.next/standalone/AGENTS.md +0 -114
  79. package/.next/standalone/DESIGN.md +0 -521
  80. package/.next/standalone/README.md +0 -821
  81. package/.next/standalone/TODO.md +0 -20
  82. package/.next/standalone/agents/bootstrap-prompt.md +0 -14
  83. package/.next/standalone/agents/wiki-viewer-skill/SKILL.md +0 -456
  84. package/.next/standalone/bin/postbuild.js +0 -78
  85. package/.next/standalone/bin/wiki-viewer.js +0 -922
  86. package/.next/standalone/certificates/localhost-key.pem +0 -28
  87. package/.next/standalone/certificates/localhost.pem +0 -24
  88. package/.next/standalone/docs/agent-collab-plan.md +0 -1615
  89. package/.next/standalone/docs/agent-collab-v2-plan.md +0 -771
  90. package/.next/standalone/docs/agent-fs-plan.md +0 -232
  91. package/.next/standalone/docs/editorial-skin-spec.md +0 -242
  92. package/.next/standalone/docs/file-vs-collab-authority.md +0 -124
  93. package/.next/standalone/docs/mobile-readiness-spec.md +0 -229
  94. package/.next/standalone/docs/workspacing-plan.md +0 -364
  95. package/.next/standalone/packages/wiki-viewer-mcp/README.md +0 -195
  96. package/.next/standalone/packages/wiki-viewer-mcp/bench-e2e.mjs +0 -166
  97. package/.next/standalone/packages/wiki-viewer-mcp/bench-latency.mjs +0 -87
  98. package/.next/standalone/packages/wiki-viewer-mcp/bench-payload.mjs +0 -45
  99. package/.next/standalone/packages/wiki-viewer-mcp/dist/http-client.js +0 -331
  100. package/.next/standalone/packages/wiki-viewer-mcp/dist/index.js +0 -531
  101. package/.next/standalone/packages/wiki-viewer-mcp/dist/register.js +0 -94
  102. package/.next/standalone/packages/wiki-viewer-mcp/dist/state-cache.js +0 -28
  103. package/.next/standalone/packages/wiki-viewer-mcp/package-lock.json +0 -1716
  104. package/.next/standalone/packages/wiki-viewer-mcp/package.json +0 -41
  105. package/.next/standalone/packages/wiki-viewer-mcp/src/http-client.ts +0 -459
  106. package/.next/standalone/packages/wiki-viewer-mcp/src/index.ts +0 -638
  107. package/.next/standalone/packages/wiki-viewer-mcp/src/register.ts +0 -144
  108. package/.next/standalone/packages/wiki-viewer-mcp/src/state-cache.ts +0 -55
  109. package/.next/standalone/packages/wiki-viewer-mcp/tsconfig.json +0 -19
  110. package/.next/standalone/pnpm-lock.yaml +0 -6697
  111. package/.next/standalone/pnpm-workspace.yaml +0 -8
  112. package/.next/standalone/postcss.config.mjs +0 -2
  113. package/.next/standalone/src/app/api/agent/activity/route.ts +0 -59
  114. package/.next/standalone/src/app/api/agent/admin/agents/[agentId]/revoke/route.ts +0 -40
  115. package/.next/standalone/src/app/api/agent/admin/agents/route.ts +0 -33
  116. package/.next/standalone/src/app/api/agent/admin/registrations/[regId]/approve/route.ts +0 -83
  117. package/.next/standalone/src/app/api/agent/admin/registrations/[regId]/deny/route.ts +0 -36
  118. package/.next/standalone/src/app/api/agent/admin/registrations/route.ts +0 -27
  119. package/.next/standalone/src/app/api/agent/events/[...path]/route.ts +0 -148
  120. package/.next/standalone/src/app/api/agent/files/[...path]/route.ts +0 -219
  121. package/.next/standalone/src/app/api/agent/fs/file/[...path]/route.ts +0 -446
  122. package/.next/standalone/src/app/api/agent/fs/ls/[[...path]]/route.ts +0 -152
  123. package/.next/standalone/src/app/api/agent/fs/move/route.ts +0 -130
  124. package/.next/standalone/src/app/api/agent/fs/search/route.ts +0 -272
  125. package/.next/standalone/src/app/api/agent/internal/span/route.ts +0 -121
  126. package/.next/standalone/src/app/api/agent/register/[regId]/route.ts +0 -50
  127. package/.next/standalone/src/app/api/agent/register/route.ts +0 -118
  128. package/.next/standalone/src/app/api/agent/settings/route.ts +0 -34
  129. package/.next/standalone/src/app/api/agent/settings/token/regenerate/route.ts +0 -20
  130. package/.next/standalone/src/app/api/agent/sidecar/[...path]/route.ts +0 -53
  131. package/.next/standalone/src/app/api/agents/install/route.ts +0 -143
  132. package/.next/standalone/src/app/api/agents/skill/route.ts +0 -20
  133. package/.next/standalone/src/app/api/agents/skill.tar.gz/route.ts +0 -87
  134. package/.next/standalone/src/app/api/app-proxy/[...path]/route.ts +0 -247
  135. package/.next/standalone/src/app/api/assets/[...path]/route.ts +0 -75
  136. package/.next/standalone/src/app/api/auth/[...all]/route.ts +0 -7
  137. package/.next/standalone/src/app/api/owner/init/route.ts +0 -14
  138. package/.next/standalone/src/app/api/share/[token]/route.ts +0 -269
  139. package/.next/standalone/src/app/api/share/route.ts +0 -127
  140. package/.next/standalone/src/app/api/system/admins/route.ts +0 -103
  141. package/.next/standalone/src/app/api/system/auth-config/route.ts +0 -22
  142. package/.next/standalone/src/app/api/system/auth-settings/route.ts +0 -86
  143. package/.next/standalone/src/app/api/system/browse/route.ts +0 -82
  144. package/.next/standalone/src/app/api/system/clear-root/route.ts +0 -16
  145. package/.next/standalone/src/app/api/system/config/route.ts +0 -14
  146. package/.next/standalone/src/app/api/system/pins/route.ts +0 -38
  147. package/.next/standalone/src/app/api/system/reveal/route.ts +0 -36
  148. package/.next/standalone/src/app/api/system/root-status/route.ts +0 -13
  149. package/.next/standalone/src/app/api/system/set-root/route.ts +0 -53
  150. package/.next/standalone/src/app/api/system/users/route.ts +0 -120
  151. package/.next/standalone/src/app/api/system/workspaces/[id]/open/route.ts +0 -34
  152. package/.next/standalone/src/app/api/system/workspaces/[id]/refresh/route.ts +0 -32
  153. package/.next/standalone/src/app/api/system/workspaces/[id]/route.ts +0 -78
  154. package/.next/standalone/src/app/api/system/workspaces/route.ts +0 -128
  155. package/.next/standalone/src/app/api/upload/[...path]/route.ts +0 -85
  156. package/.next/standalone/src/app/api/wiki/app/route.ts +0 -60
  157. package/.next/standalone/src/app/api/wiki/backlinks/route.ts +0 -29
  158. package/.next/standalone/src/app/api/wiki/content/route.ts +0 -159
  159. package/.next/standalone/src/app/api/wiki/download/route.ts +0 -100
  160. package/.next/standalone/src/app/api/wiki/file/route.ts +0 -57
  161. package/.next/standalone/src/app/api/wiki/folder/route.ts +0 -34
  162. package/.next/standalone/src/app/api/wiki/git-branches/route.ts +0 -32
  163. package/.next/standalone/src/app/api/wiki/git-checkout/route.ts +0 -45
  164. package/.next/standalone/src/app/api/wiki/git-diff/route.ts +0 -33
  165. package/.next/standalone/src/app/api/wiki/git-file-info/route.ts +0 -27
  166. package/.next/standalone/src/app/api/wiki/git-history/route.ts +0 -27
  167. package/.next/standalone/src/app/api/wiki/git-pull/route.ts +0 -48
  168. package/.next/standalone/src/app/api/wiki/move/route.ts +0 -61
  169. package/.next/standalone/src/app/api/wiki/new-file/route.ts +0 -56
  170. package/.next/standalone/src/app/api/wiki/outlinks/route.ts +0 -76
  171. package/.next/standalone/src/app/api/wiki/page/route.ts +0 -92
  172. package/.next/standalone/src/app/api/wiki/presence/route.ts +0 -56
  173. package/.next/standalone/src/app/api/wiki/route.ts +0 -116
  174. package/.next/standalone/src/app/api/wiki/search/route.ts +0 -44
  175. package/.next/standalone/src/app/api/wiki/slugs/route.ts +0 -54
  176. package/.next/standalone/src/app/api/wiki/upload/route.ts +0 -95
  177. package/.next/standalone/src/app/api/wiki/watch/route.ts +0 -67
  178. package/.next/standalone/src/app/globals.css +0 -1249
  179. package/.next/standalone/src/app/icon.svg +0 -11
  180. package/.next/standalone/src/app/layout.tsx +0 -78
  181. package/.next/standalone/src/app/manifest.ts +0 -30
  182. package/.next/standalone/src/app/page.tsx +0 -3260
  183. package/.next/standalone/src/app/s/[token]/page.tsx +0 -357
  184. package/.next/standalone/src/app/signin/page.tsx +0 -16
  185. package/.next/standalone/src/app/signin/signin-form.tsx +0 -238
  186. package/.next/standalone/src/components/ai-panel/activity-row.tsx +0 -284
  187. package/.next/standalone/src/components/ai-panel/ai-panel.tsx +0 -311
  188. package/.next/standalone/src/components/ai-panel/token-section.tsx +0 -313
  189. package/.next/standalone/src/components/auth-settings-sheet.tsx +0 -474
  190. package/.next/standalone/src/components/confirm-dialog.tsx +0 -56
  191. package/.next/standalone/src/components/dir-picker.tsx +0 -606
  192. package/.next/standalone/src/components/editor/backlinks-panel.tsx +0 -139
  193. package/.next/standalone/src/components/editor/bubble-menu.tsx +0 -346
  194. package/.next/standalone/src/components/editor/callout-extension.ts +0 -36
  195. package/.next/standalone/src/components/editor/comment-pip.tsx +0 -56
  196. package/.next/standalone/src/components/editor/comment-thread.tsx +0 -254
  197. package/.next/standalone/src/components/editor/csv-viewer.tsx +0 -379
  198. package/.next/standalone/src/components/editor/document-outline.tsx +0 -230
  199. package/.next/standalone/src/components/editor/editor-toolbar.tsx +0 -564
  200. package/.next/standalone/src/components/editor/editor.tsx +0 -1327
  201. package/.next/standalone/src/components/editor/extensions/drag-handle.ts +0 -325
  202. package/.next/standalone/src/components/editor/extensions/heading-anchors.ts +0 -55
  203. package/.next/standalone/src/components/editor/extensions/proof-span.ts +0 -60
  204. package/.next/standalone/src/components/editor/extensions/resizable-image.tsx +0 -159
  205. package/.next/standalone/src/components/editor/extensions.ts +0 -150
  206. package/.next/standalone/src/components/editor/file-fallback-viewer.tsx +0 -75
  207. package/.next/standalone/src/components/editor/folder-index.tsx +0 -236
  208. package/.next/standalone/src/components/editor/google-doc-viewer.tsx +0 -73
  209. package/.next/standalone/src/components/editor/image-viewer.tsx +0 -57
  210. package/.next/standalone/src/components/editor/large-file-gate.tsx +0 -108
  211. package/.next/standalone/src/components/editor/link-popover.tsx +0 -111
  212. package/.next/standalone/src/components/editor/media-popover.tsx +0 -212
  213. package/.next/standalone/src/components/editor/media-viewer.tsx +0 -70
  214. package/.next/standalone/src/components/editor/mermaid-viewer.tsx +0 -286
  215. package/.next/standalone/src/components/editor/node-app-viewer.tsx +0 -328
  216. package/.next/standalone/src/components/editor/notebook-viewer.tsx +0 -371
  217. package/.next/standalone/src/components/editor/office/docx-viewer.tsx +0 -93
  218. package/.next/standalone/src/components/editor/office/office-chrome.tsx +0 -83
  219. package/.next/standalone/src/components/editor/office/pptx-viewer.tsx +0 -104
  220. package/.next/standalone/src/components/editor/office/xlsx-viewer.tsx +0 -192
  221. package/.next/standalone/src/components/editor/pdf-viewer.tsx +0 -32
  222. package/.next/standalone/src/components/editor/proof-span-popover.tsx +0 -162
  223. package/.next/standalone/src/components/editor/slash-commands.tsx +0 -629
  224. package/.next/standalone/src/components/editor/source-viewer.tsx +0 -289
  225. package/.next/standalone/src/components/editor/suggest-edit-popover.tsx +0 -229
  226. package/.next/standalone/src/components/editor/suggestion-card.tsx +0 -206
  227. package/.next/standalone/src/components/editor/table-menu.tsx +0 -232
  228. package/.next/standalone/src/components/editor/view-mode-comment-button.tsx +0 -77
  229. package/.next/standalone/src/components/editor/website-viewer.tsx +0 -75
  230. package/.next/standalone/src/components/editor/wiki-link-create-dialog.tsx +0 -189
  231. package/.next/standalone/src/components/editor/wiki-link-decorator.ts +0 -79
  232. package/.next/standalone/src/components/editor/wiki-link-extension.ts +0 -120
  233. package/.next/standalone/src/components/editor/wiki-link-picker.tsx +0 -250
  234. package/.next/standalone/src/components/layout/viewer-toolbar.tsx +0 -54
  235. package/.next/standalone/src/components/search/search-command-dialog.tsx +0 -246
  236. package/.next/standalone/src/components/search/sidebar-search-box.tsx +0 -121
  237. package/.next/standalone/src/components/search/snippet-text.tsx +0 -48
  238. package/.next/standalone/src/components/share-dialog.tsx +0 -307
  239. package/.next/standalone/src/components/theme-provider.tsx +0 -16
  240. package/.next/standalone/src/components/theme-toggle.tsx +0 -24
  241. package/.next/standalone/src/components/ui/badge.tsx +0 -35
  242. package/.next/standalone/src/components/ui/button.tsx +0 -56
  243. package/.next/standalone/src/components/ui/card.tsx +0 -63
  244. package/.next/standalone/src/components/ui/collapsible.tsx +0 -9
  245. package/.next/standalone/src/components/ui/command.tsx +0 -151
  246. package/.next/standalone/src/components/ui/context-menu.tsx +0 -191
  247. package/.next/standalone/src/components/ui/dialog.tsx +0 -119
  248. package/.next/standalone/src/components/ui/dropdown-menu.tsx +0 -194
  249. package/.next/standalone/src/components/ui/input.tsx +0 -22
  250. package/.next/standalone/src/components/ui/label.tsx +0 -25
  251. package/.next/standalone/src/components/ui/popover.tsx +0 -33
  252. package/.next/standalone/src/components/ui/scroll-area.tsx +0 -47
  253. package/.next/standalone/src/components/ui/select.tsx +0 -156
  254. package/.next/standalone/src/components/ui/separator.tsx +0 -30
  255. package/.next/standalone/src/components/ui/sheet.tsx +0 -140
  256. package/.next/standalone/src/components/ui/skeleton.tsx +0 -15
  257. package/.next/standalone/src/components/ui/switch.tsx +0 -28
  258. package/.next/standalone/src/components/ui/tabs.tsx +0 -54
  259. package/.next/standalone/src/components/ui/textarea.tsx +0 -21
  260. package/.next/standalone/src/components/ui/tip.tsx +0 -23
  261. package/.next/standalone/src/components/ui/toggle-group.tsx +0 -41
  262. package/.next/standalone/src/components/ui/tooltip.tsx +0 -27
  263. package/.next/standalone/src/components/view-width-toggle.tsx +0 -70
  264. package/.next/standalone/src/components/wiki/frontmatter-header.tsx +0 -164
  265. package/.next/standalone/src/hooks/use-is-mobile.ts +0 -14
  266. package/.next/standalone/src/lib/app-runner.ts +0 -272
  267. package/.next/standalone/src/lib/auth/admin.ts +0 -120
  268. package/.next/standalone/src/lib/auth/allowlist.ts +0 -50
  269. package/.next/standalone/src/lib/auth/client.ts +0 -4
  270. package/.next/standalone/src/lib/auth/csrf.ts +0 -68
  271. package/.next/standalone/src/lib/auth/server.ts +0 -215
  272. package/.next/standalone/src/lib/cabinets/tree.ts +0 -75
  273. package/.next/standalone/src/lib/config.ts +0 -114
  274. package/.next/standalone/src/lib/embeds/detect.ts +0 -142
  275. package/.next/standalone/src/lib/git-secrets.ts +0 -65
  276. package/.next/standalone/src/lib/git.ts +0 -503
  277. package/.next/standalone/src/lib/google/detect.ts +0 -107
  278. package/.next/standalone/src/lib/markdown/parse-frontmatter.ts +0 -104
  279. package/.next/standalone/src/lib/markdown/remark-wikilinks.ts +0 -100
  280. package/.next/standalone/src/lib/markdown/sanitize-schema.ts +0 -106
  281. package/.next/standalone/src/lib/markdown/to-html.ts +0 -282
  282. package/.next/standalone/src/lib/markdown/to-markdown.ts +0 -252
  283. package/.next/standalone/src/lib/proof/activity-shared.ts +0 -31
  284. package/.next/standalone/src/lib/proof/activity.ts +0 -74
  285. package/.next/standalone/src/lib/proof/audit.ts +0 -88
  286. package/.next/standalone/src/lib/proof/auth.ts +0 -143
  287. package/.next/standalone/src/lib/proof/block-refs.ts +0 -133
  288. package/.next/standalone/src/lib/proof/blocks.ts +0 -73
  289. package/.next/standalone/src/lib/proof/client-auth.ts +0 -23
  290. package/.next/standalone/src/lib/proof/collab-state.ts +0 -81
  291. package/.next/standalone/src/lib/proof/event-bus.ts +0 -47
  292. package/.next/standalone/src/lib/proof/file-lock.ts +0 -43
  293. package/.next/standalone/src/lib/proof/glob.ts +0 -51
  294. package/.next/standalone/src/lib/proof/idempotency.ts +0 -37
  295. package/.next/standalone/src/lib/proof/lease.ts +0 -117
  296. package/.next/standalone/src/lib/proof/mutex.ts +0 -36
  297. package/.next/standalone/src/lib/proof/ops-applier.ts +0 -727
  298. package/.next/standalone/src/lib/proof/owner-auth.ts +0 -2
  299. package/.next/standalone/src/lib/proof/pending.ts +0 -97
  300. package/.next/standalone/src/lib/proof/proof-span.ts +0 -141
  301. package/.next/standalone/src/lib/proof/rate-limit.ts +0 -53
  302. package/.next/standalone/src/lib/proof/raw-fs.ts +0 -197
  303. package/.next/standalone/src/lib/proof/register-rate-limit.ts +0 -53
  304. package/.next/standalone/src/lib/proof/registry.ts +0 -195
  305. package/.next/standalone/src/lib/proof/sidecar.ts +0 -103
  306. package/.next/standalone/src/lib/proof/suggest-capture.ts +0 -69
  307. package/.next/standalone/src/lib/proof/types.ts +0 -182
  308. package/.next/standalone/src/lib/proof-config.ts +0 -14
  309. package/.next/standalone/src/lib/root-dir.ts +0 -35
  310. package/.next/standalone/src/lib/search/indexable-exts.ts +0 -25
  311. package/.next/standalone/src/lib/search/indexer.ts +0 -634
  312. package/.next/standalone/src/lib/search/sanitize.ts +0 -35
  313. package/.next/standalone/src/lib/search/search-db.ts +0 -57
  314. package/.next/standalone/src/lib/search/watcher-pool.ts +0 -79
  315. package/.next/standalone/src/lib/shared-docs/db.ts +0 -177
  316. package/.next/standalone/src/lib/toast.ts +0 -9
  317. package/.next/standalone/src/lib/utils.ts +0 -6
  318. package/.next/standalone/src/lib/wiki-helpers.ts +0 -36
  319. package/.next/standalone/src/lib/workspace-client.ts +0 -82
  320. package/.next/standalone/src/lib/workspace-context.ts +0 -173
  321. package/.next/standalone/src/lib/workspaces.ts +0 -400
  322. package/.next/standalone/src/middleware.ts +0 -44
  323. package/.next/standalone/src/stores/ai-panel-store.ts +0 -79
  324. package/.next/standalone/src/stores/editor-store.ts +0 -439
  325. package/.next/standalone/src/stores/pin-store.ts +0 -56
  326. package/.next/standalone/src/stores/proof-store.ts +0 -124
  327. package/.next/standalone/src/stores/recent-store.ts +0 -51
  328. package/.next/standalone/src/stores/search-store.ts +0 -104
  329. package/.next/standalone/src/stores/show-hidden-store.ts +0 -26
  330. package/.next/standalone/src/stores/sidebar-width-store.ts +0 -39
  331. package/.next/standalone/src/stores/skin-store.ts +0 -42
  332. package/.next/standalone/src/stores/tree-store.ts +0 -52
  333. package/.next/standalone/src/stores/view-width-store.ts +0 -101
  334. package/.next/standalone/src/stores/wiki-slugs-store.ts +0 -75
  335. package/.next/standalone/src/tests/proof/activity-aggregator.test.ts +0 -146
  336. package/.next/standalone/src/tests/proof/admin-create-user.test.ts +0 -43
  337. package/.next/standalone/src/tests/proof/agent-fs.test.ts +0 -973
  338. package/.next/standalone/src/tests/proof/agent-ownership.test.ts +0 -140
  339. package/.next/standalone/src/tests/proof/agent-workspace-scope.test.ts +0 -134
  340. package/.next/standalone/src/tests/proof/agents-install.test.ts +0 -110
  341. package/.next/standalone/src/tests/proof/bench-write.ts +0 -179
  342. package/.next/standalone/src/tests/proof/better-auth.test.ts +0 -68
  343. package/.next/standalone/src/tests/proof/block-refs.test.ts +0 -108
  344. package/.next/standalone/src/tests/proof/blocks.test.ts +0 -92
  345. package/.next/standalone/src/tests/proof/collab-state.test.ts +0 -501
  346. package/.next/standalone/src/tests/proof/comments-ops.test.ts +0 -177
  347. package/.next/standalone/src/tests/proof/editor-roundtrip.test.ts +0 -85
  348. package/.next/standalone/src/tests/proof/external-edit.test.ts +0 -58
  349. package/.next/standalone/src/tests/proof/file-lock.test.ts +0 -80
  350. package/.next/standalone/src/tests/proof/git-branches-checkout.test.ts +0 -136
  351. package/.next/standalone/src/tests/proof/git-read-features.test.ts +0 -473
  352. package/.next/standalone/src/tests/proof/git-secrets.test.ts +0 -138
  353. package/.next/standalone/src/tests/proof/git-sparse.test.ts +0 -257
  354. package/.next/standalone/src/tests/proof/git-workspace.test.ts +0 -135
  355. package/.next/standalone/src/tests/proof/git.test.ts +0 -243
  356. package/.next/standalone/src/tests/proof/glob.test.ts +0 -82
  357. package/.next/standalone/src/tests/proof/helpers/auth-session.ts +0 -27
  358. package/.next/standalone/src/tests/proof/markdown-to-html.test.ts +0 -46
  359. package/.next/standalone/src/tests/proof/ops-applier.test.ts +0 -368
  360. package/.next/standalone/src/tests/proof/owner-init.test.ts +0 -2
  361. package/.next/standalone/src/tests/proof/parse-frontmatter.test.ts +0 -60
  362. package/.next/standalone/src/tests/proof/preload.ts +0 -21
  363. package/.next/standalone/src/tests/proof/proof-span.test.ts +0 -98
  364. package/.next/standalone/src/tests/proof/rate-limit.test.ts +0 -54
  365. package/.next/standalone/src/tests/proof/readonly-enforcement.test.ts +0 -161
  366. package/.next/standalone/src/tests/proof/reconcile-sidecar.test.ts +0 -195
  367. package/.next/standalone/src/tests/proof/registration-flow.test.ts +0 -330
  368. package/.next/standalone/src/tests/proof/registry.test.ts +0 -169
  369. package/.next/standalone/src/tests/proof/routes.test.ts +0 -516
  370. package/.next/standalone/src/tests/proof/search-index.test.ts +0 -376
  371. package/.next/standalone/src/tests/proof/sidecar-lifecycle.test.ts +0 -177
  372. package/.next/standalone/src/tests/proof/sidecar-trim.test.ts +0 -58
  373. package/.next/standalone/src/tests/proof/suggestion-ops.test.ts +0 -280
  374. package/.next/standalone/src/tests/proof/wiki-content-put.test.ts +0 -140
  375. package/.next/standalone/src/tests/proof/wiki-routes-auth.test.ts +0 -208
  376. package/.next/standalone/src/tests/proof/workspace-isolation.test.ts +0 -87
  377. package/.next/standalone/src/tests/proof/workspaces-api.test.ts +0 -227
  378. package/.next/standalone/src/types/index.ts +0 -47
  379. package/.next/standalone/tailwind.config.ts +0 -191
  380. package/.next/standalone/tsconfig.json +0 -41
  381. package/.next/standalone/tsconfig.tsbuildinfo +0 -1
  382. /package/.next/standalone/.next/static/{WMOTgfV82apmdovxzgbMx → rRyvFORvJoc5OWbCR2A_P}/_buildManifest.js +0 -0
  383. /package/.next/standalone/.next/static/{WMOTgfV82apmdovxzgbMx → rRyvFORvJoc5OWbCR2A_P}/_clientMiddlewareManifest.js +0 -0
  384. /package/.next/standalone/.next/static/{WMOTgfV82apmdovxzgbMx → rRyvFORvJoc5OWbCR2A_P}/_ssgManifest.js +0 -0
@@ -1,325 +0,0 @@
1
- import { Extension } from "@tiptap/core";
2
- import {
3
- NodeSelection,
4
- Plugin,
5
- PluginKey,
6
- TextSelection,
7
- type Transaction,
8
- } from "@tiptap/pm/state";
9
- import type { EditorView } from "@tiptap/pm/view";
10
-
11
- /**
12
- * Move the top-level block containing the current selection up or down
13
- * by one sibling. Returns true if the doc was mutated. Used for keyboard
14
- * reorder (Alt+Shift+Up/Down) so non-mouse users get parity with the
15
- * drag handle (audit #102).
16
- */
17
- function moveCurrentBlock(
18
- state: EditorView["state"],
19
- dispatch: ((tr: Transaction) => void) | undefined,
20
- direction: "up" | "down",
21
- ): boolean {
22
- const { selection, doc } = state;
23
- // Resolve the top-level block that holds the current selection. We walk
24
- // up to depth 1 because doc → top-level-block → … is the layout we care
25
- // about; nested list items still move as siblings of their parent block.
26
- let $pos = doc.resolve(selection.from);
27
- while ($pos.depth > 1) {
28
- $pos = doc.resolve($pos.before($pos.depth));
29
- }
30
- if ($pos.depth === 0) return false;
31
-
32
- const blockPos = $pos.before(1);
33
- const block = doc.nodeAt(blockPos);
34
- if (!block) return false;
35
-
36
- const parent = doc;
37
- const indexInParent = $pos.index(0);
38
- const siblingIndex =
39
- direction === "up" ? indexInParent - 1 : indexInParent + 1;
40
- if (siblingIndex < 0 || siblingIndex >= parent.childCount) return false;
41
-
42
- const sibling = parent.child(siblingIndex);
43
- let tr = state.tr;
44
-
45
- // Remove the block, then re-insert it on the other side of the sibling.
46
- // Computing the insertion target *before* the cut keeps positions stable.
47
- const blockEnd = blockPos + block.nodeSize;
48
- const siblingStart =
49
- direction === "up" ? blockPos - sibling.nodeSize : blockEnd;
50
- const siblingEnd =
51
- direction === "up" ? blockPos : blockEnd + sibling.nodeSize;
52
-
53
- if (direction === "up") {
54
- tr = tr.delete(blockPos, blockEnd);
55
- tr = tr.insert(siblingStart, block);
56
- // After re-insert the block lives at siblingStart; restore selection on it.
57
- tr = tr.setSelection(NodeSelection.create(tr.doc, siblingStart));
58
- } else {
59
- tr = tr.delete(blockPos, blockEnd);
60
- // After deletion the sibling shifts left by block.nodeSize, so the
61
- // insertion target is siblingEnd - block.nodeSize.
62
- const insertAt = siblingEnd - block.nodeSize;
63
- tr = tr.insert(insertAt, block);
64
- tr = tr.setSelection(NodeSelection.create(tr.doc, insertAt));
65
- }
66
-
67
- if (dispatch) dispatch(tr.scrollIntoView());
68
- return true;
69
- }
70
-
71
- const HANDLE_ID = "cabinet-drag-handle";
72
- const ADD_BTN_ID = "cabinet-gutter-add";
73
-
74
- function getOrCreateAddButton(): HTMLButtonElement {
75
- let el = document.getElementById(ADD_BTN_ID) as HTMLButtonElement | null;
76
- if (!el) {
77
- el = document.createElement("button");
78
- el.id = ADD_BTN_ID;
79
- el.type = "button";
80
- el.setAttribute("aria-label", "Add block");
81
- el.title = "Add block";
82
- el.innerHTML = `<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M5 1V9M1 5H9" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>`;
83
- Object.assign(el.style, {
84
- position: "absolute",
85
- display: "none",
86
- alignItems: "center",
87
- justifyContent: "center",
88
- width: "18px",
89
- height: "18px",
90
- cursor: "pointer",
91
- borderRadius: "4px",
92
- color: "var(--muted-foreground)",
93
- opacity: "0.55",
94
- zIndex: "40",
95
- transition: "opacity 120ms ease, background 120ms ease",
96
- background: "transparent",
97
- border: "none",
98
- padding: "0",
99
- } as Partial<CSSStyleDeclaration>);
100
- el.addEventListener("mouseenter", () => {
101
- if (!el) return;
102
- el.style.opacity = "1";
103
- el.style.background = "var(--muted)";
104
- });
105
- el.addEventListener("mouseleave", () => {
106
- if (!el) return;
107
- el.style.opacity = "0.55";
108
- el.style.background = "transparent";
109
- });
110
- document.body.appendChild(el);
111
- }
112
- return el;
113
- }
114
-
115
- function findBlockAt(view: EditorView, coords: { left: number; top: number }) {
116
- const pos = view.posAtCoords(coords);
117
- if (!pos) return null;
118
- let $pos = view.state.doc.resolve(pos.inside >= 0 ? pos.inside : pos.pos);
119
- while ($pos.depth > 0 && !$pos.parent.type.isBlock) {
120
- $pos = view.state.doc.resolve($pos.before());
121
- }
122
- // Walk up until we find a top-level child of the doc
123
- let depth = $pos.depth;
124
- while (depth > 1) {
125
- const parent = view.state.doc.resolve($pos.before(depth)).parent;
126
- if (parent.type.name === "doc") break;
127
- depth -= 1;
128
- }
129
- const nodePos = depth === 0 ? 0 : $pos.before(Math.max(depth, 1));
130
- const node = view.state.doc.nodeAt(nodePos);
131
- if (!node) return null;
132
- const dom = view.nodeDOM(nodePos) as HTMLElement | null;
133
- return { pos: nodePos, node, dom };
134
- }
135
-
136
- function getOrCreateHandle(): HTMLDivElement {
137
- let el = document.getElementById(HANDLE_ID) as HTMLDivElement | null;
138
- if (!el) {
139
- el = document.createElement("div");
140
- el.id = HANDLE_ID;
141
- el.setAttribute("data-drag-handle", "true");
142
- el.draggable = true;
143
- el.innerHTML = `<svg width="10" height="16" viewBox="0 0 10 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><circle cx="2.5" cy="3" r="1.2"/><circle cx="2.5" cy="8" r="1.2"/><circle cx="2.5" cy="13" r="1.2"/><circle cx="7.5" cy="3" r="1.2"/><circle cx="7.5" cy="8" r="1.2"/><circle cx="7.5" cy="13" r="1.2"/></svg>`;
144
- Object.assign(el.style, {
145
- position: "absolute",
146
- display: "none",
147
- cursor: "grab",
148
- padding: "2px 4px",
149
- borderRadius: "4px",
150
- color: "var(--muted-foreground)",
151
- opacity: "0.55",
152
- zIndex: "40",
153
- userSelect: "none",
154
- transition: "opacity 120ms ease",
155
- } as CSSStyleDeclaration);
156
- el.addEventListener("mouseenter", () => {
157
- if (el) el.style.opacity = "1";
158
- });
159
- el.addEventListener("mouseleave", () => {
160
- if (el) el.style.opacity = "0.55";
161
- });
162
- document.body.appendChild(el);
163
- }
164
- return el;
165
- }
166
-
167
- export const DragHandle = Extension.create({
168
- name: "dragHandle",
169
-
170
- addKeyboardShortcuts() {
171
- // Audit #102: drag handle is mouse-only. Add Alt+Shift+ArrowUp /
172
- // Alt+Shift+ArrowDown so keyboard users can reorder blocks too.
173
- return {
174
- "Mod-Alt-ArrowUp": ({ editor }) =>
175
- moveCurrentBlock(editor.state, editor.view.dispatch, "up"),
176
- "Mod-Alt-ArrowDown": ({ editor }) =>
177
- moveCurrentBlock(editor.state, editor.view.dispatch, "down"),
178
- "Alt-Shift-ArrowUp": ({ editor }) =>
179
- moveCurrentBlock(editor.state, editor.view.dispatch, "up"),
180
- "Alt-Shift-ArrowDown": ({ editor }) =>
181
- moveCurrentBlock(editor.state, editor.view.dispatch, "down"),
182
- };
183
- },
184
-
185
- addProseMirrorPlugins() {
186
- let currentBlock: {
187
- pos: number;
188
- node: { nodeSize: number };
189
- dom: HTMLElement;
190
- } | null = null;
191
-
192
- const handle = typeof document !== "undefined" ? getOrCreateHandle() : null;
193
- const addBtn =
194
- typeof document !== "undefined" ? getOrCreateAddButton() : null;
195
-
196
- const hide = () => {
197
- if (handle) handle.style.display = "none";
198
- if (addBtn) addBtn.style.display = "none";
199
- currentBlock = null;
200
- };
201
-
202
- return [
203
- new Plugin({
204
- key: new PluginKey("cabinetDragHandle"),
205
- view: (view) => {
206
- if (!handle) return { destroy: () => {} };
207
-
208
- const onMouseMove = (event: MouseEvent) => {
209
- if (!view.editable) return;
210
- const rect = view.dom.getBoundingClientRect();
211
- if (
212
- event.clientX < rect.left - 60 ||
213
- event.clientX > rect.right + 60 ||
214
- event.clientY < rect.top ||
215
- event.clientY > rect.bottom
216
- ) {
217
- hide();
218
- return;
219
- }
220
- // Probe inside the editor with clientX clamped to content
221
- const probeX = Math.max(
222
- rect.left + 20,
223
- Math.min(rect.right - 20, event.clientX),
224
- );
225
- const block = findBlockAt(view, {
226
- left: probeX,
227
- top: event.clientY,
228
- });
229
- if (!block?.dom || !(block.dom instanceof HTMLElement)) {
230
- hide();
231
- return;
232
- }
233
- currentBlock = block as typeof currentBlock;
234
- const domRect = block.dom.getBoundingClientRect();
235
- handle.style.display = "flex";
236
- handle.style.top = `${window.scrollY + domRect.top + 4}px`;
237
- handle.style.left = `${window.scrollX + domRect.left - 22}px`;
238
- if (addBtn) {
239
- addBtn.style.display = "flex";
240
- addBtn.style.top = `${window.scrollY + domRect.top + 4}px`;
241
- addBtn.style.left = `${window.scrollX + domRect.left - 44}px`;
242
- }
243
- };
244
-
245
- const onMouseLeave = () => hide();
246
-
247
- const onAddClick = () => {
248
- if (!currentBlock) return;
249
- // Insert a new empty paragraph after the current block, then open slash menu
250
- const afterPos = currentBlock.pos + currentBlock.node.nodeSize;
251
- const insertable = afterPos <= view.state.doc.content.size;
252
- const tr = view.state.tr;
253
- if (insertable) {
254
- // Place cursor at end of current block content (before node closing mark)
255
- const endContent = afterPos - 1;
256
- const sel = TextSelection.create(
257
- view.state.doc,
258
- Math.min(endContent, view.state.doc.content.size),
259
- );
260
- view.dispatch(tr.setSelection(sel));
261
- }
262
- view.focus();
263
- // Split the block to create a new paragraph, then trigger slash menu
264
- const splitTr = view.state.tr.split(view.state.selection.from);
265
- view.dispatch(splitTr);
266
- // Dispatch on view.dom so event.target is the ProseMirror element;
267
- // this lets the global "/" hotkey guard (isEditableTarget) skip it
268
- // while the slash-commands capture listener on window still fires.
269
- view.dom.dispatchEvent(
270
- new KeyboardEvent("keydown", {
271
- key: "/",
272
- bubbles: true,
273
- cancelable: true,
274
- }),
275
- );
276
- };
277
-
278
- const onDragStart = (event: DragEvent) => {
279
- if (!currentBlock || !event.dataTransfer) return;
280
- const { pos, dom } = currentBlock;
281
-
282
- // Select the block so PM treats it as the drag source
283
- const tr = view.state.tr.setSelection(
284
- NodeSelection.create(view.state.doc, pos),
285
- );
286
- view.dispatch(tr);
287
-
288
- const slice = view.state.selection.content();
289
- // Serialize slice content to HTML for external drop targets
290
- const tmp = document.createElement("div");
291
- tmp.appendChild(
292
- view
293
- .someProp("clipboardSerializer")
294
- ?.serializeFragment(slice.content) ??
295
- document.createElement("div"),
296
- );
297
- event.dataTransfer.clearData();
298
- event.dataTransfer.setData("text/html", tmp.innerHTML);
299
- event.dataTransfer.setData("text/plain", dom.textContent ?? "");
300
- event.dataTransfer.effectAllowed = "copyMove";
301
- event.dataTransfer.setDragImage(dom, 0, 0);
302
-
303
- // Hand PM the slice so its built-in drop handler performs the move
304
- view.dragging = { slice, move: true };
305
- };
306
-
307
- window.addEventListener("mousemove", onMouseMove);
308
- view.dom.addEventListener("mouseleave", onMouseLeave);
309
- handle.addEventListener("dragstart", onDragStart);
310
- if (addBtn) addBtn.addEventListener("click", onAddClick);
311
-
312
- return {
313
- destroy() {
314
- window.removeEventListener("mousemove", onMouseMove);
315
- view.dom.removeEventListener("mouseleave", onMouseLeave);
316
- handle.removeEventListener("dragstart", onDragStart);
317
- if (addBtn) addBtn.removeEventListener("click", onAddClick);
318
- hide();
319
- },
320
- };
321
- },
322
- }),
323
- ];
324
- },
325
- });
@@ -1,55 +0,0 @@
1
- import { Extension } from "@tiptap/core";
2
- import type { Node } from "@tiptap/pm/model";
3
- import { Plugin, PluginKey } from "@tiptap/pm/state";
4
- import { Decoration, DecorationSet } from "@tiptap/pm/view";
5
-
6
- function slugify(text: string): string {
7
- return text
8
- .toLowerCase()
9
- .replace(/[^\w\s-]/g, "")
10
- .trim()
11
- .replace(/\s+/g, "-")
12
- .replace(/-+/g, "-");
13
- }
14
-
15
- const HEADING_ANCHOR_KEY = new PluginKey("headingAnchors");
16
-
17
- function buildDecorations(doc: Node): DecorationSet {
18
- const decos: Decoration[] = [];
19
- const seen = new Map<string, number>();
20
- doc.descendants((node, pos) => {
21
- if (node.type.name !== "heading") return;
22
- const base = slugify(node.textContent);
23
- if (!base) return;
24
- const count = seen.get(base) ?? 0;
25
- seen.set(base, count + 1);
26
- const id = count === 0 ? base : `${base}-${count}`;
27
- decos.push(Decoration.node(pos, pos + node.nodeSize, { id }));
28
- });
29
- return DecorationSet.create(doc, decos);
30
- }
31
-
32
- export const HeadingAnchors = Extension.create({
33
- name: "headingAnchors",
34
-
35
- addProseMirrorPlugins() {
36
- return [
37
- new Plugin({
38
- key: HEADING_ANCHOR_KEY,
39
- state: {
40
- init(_, { doc }) {
41
- return buildDecorations(doc);
42
- },
43
- apply(tr, old) {
44
- return tr.docChanged ? buildDecorations(tr.doc) : old;
45
- },
46
- },
47
- props: {
48
- decorations(state) {
49
- return HEADING_ANCHOR_KEY.getState(state) as DecorationSet;
50
- },
51
- },
52
- }),
53
- ];
54
- },
55
- });
@@ -1,60 +0,0 @@
1
- import { Mark, mergeAttributes } from "@tiptap/core";
2
-
3
- export const ProofSpan = Mark.create({
4
- name: "proofSpan",
5
- priority: 900,
6
- inclusive: false,
7
- keepOnSplit: false,
8
-
9
- addAttributes() {
10
- return {
11
- spanId: {
12
- default: null,
13
- parseHTML: (el) => el.getAttribute("id"),
14
- renderHTML: (a) => ({ id: a.spanId }),
15
- },
16
- origin: {
17
- default: "ai",
18
- parseHTML: (el) => el.getAttribute("origin"),
19
- renderHTML: (a) => ({ origin: a.origin }),
20
- },
21
- basis: {
22
- default: null,
23
- parseHTML: (el) => el.getAttribute("basis"),
24
- renderHTML: (a) => ({ basis: a.basis }),
25
- },
26
- basisDetail: {
27
- default: null,
28
- parseHTML: (el) => el.getAttribute("basis-detail"),
29
- renderHTML: (a) => ({ "basis-detail": a.basisDetail }),
30
- },
31
- by: {
32
- default: null,
33
- parseHTML: (el) => el.getAttribute("by"),
34
- renderHTML: (a) => ({ by: a.by }),
35
- },
36
- at: {
37
- default: null,
38
- parseHTML: (el) => el.getAttribute("at"),
39
- renderHTML: (a) => ({ at: a.at }),
40
- },
41
- inResponseTo: {
42
- default: null,
43
- parseHTML: (el) => el.getAttribute("in-response-to"),
44
- renderHTML: (a) => ({ "in-response-to": a.inResponseTo }),
45
- },
46
- };
47
- },
48
-
49
- parseHTML() {
50
- return [{ tag: "proof-span" }];
51
- },
52
-
53
- renderHTML({ HTMLAttributes }) {
54
- return [
55
- "proof-span",
56
- mergeAttributes(HTMLAttributes, { class: "proof-span" }),
57
- 0,
58
- ];
59
- },
60
- });
@@ -1,159 +0,0 @@
1
- "use client";
2
-
3
- import Image from "@tiptap/extension-image";
4
- import {
5
- type NodeViewProps,
6
- NodeViewWrapper,
7
- ReactNodeViewRenderer,
8
- } from "@tiptap/react";
9
- import { useCallback, useRef, useState } from "react";
10
-
11
- interface ImageAttrs {
12
- src: string;
13
- alt?: string | null;
14
- title?: string | null;
15
- width?: string | number | null;
16
- align?: "left" | "center" | "right" | null;
17
- }
18
-
19
- function ResizableImageComponent(props: NodeViewProps) {
20
- const { node, updateAttributes, selected, editor } = props;
21
- const attrs = node.attrs as ImageAttrs;
22
- const imgRef = useRef<HTMLImageElement | null>(null);
23
- const wrapperRef = useRef<HTMLDivElement | null>(null);
24
- const [liveWidth, setLiveWidth] = useState<number | null>(null);
25
-
26
- const align = attrs.align ?? "center";
27
-
28
- const beginResize = useCallback(
29
- (e: React.PointerEvent<HTMLDivElement>, anchor: "left" | "right") => {
30
- if (!editor.isEditable) return;
31
- e.preventDefault();
32
- e.stopPropagation();
33
- const img = imgRef.current;
34
- const wrap = wrapperRef.current;
35
- if (!img || !wrap) return;
36
-
37
- const startX = e.clientX;
38
- const startWidth = img.getBoundingClientRect().width;
39
- const containerWidth =
40
- wrap.parentElement?.getBoundingClientRect().width ?? 800;
41
-
42
- const onMove = (ev: PointerEvent) => {
43
- const delta =
44
- anchor === "right" ? ev.clientX - startX : startX - ev.clientX;
45
- const next = Math.max(80, Math.min(containerWidth, startWidth + delta));
46
- setLiveWidth(next);
47
- };
48
- const onUp = () => {
49
- window.removeEventListener("pointermove", onMove);
50
- window.removeEventListener("pointerup", onUp);
51
- setLiveWidth((curr) => {
52
- if (curr != null) {
53
- updateAttributes({ width: Math.round(curr) });
54
- }
55
- return null;
56
- });
57
- };
58
- window.addEventListener("pointermove", onMove);
59
- window.addEventListener("pointerup", onUp);
60
- },
61
- [editor.isEditable, updateAttributes],
62
- );
63
-
64
- const widthStyle = (() => {
65
- if (liveWidth != null) return `${Math.round(liveWidth)}px`;
66
- if (typeof attrs.width === "number") return `${attrs.width}px`;
67
- if (typeof attrs.width === "string" && attrs.width) return attrs.width;
68
- return undefined;
69
- })();
70
-
71
- const alignClass =
72
- align === "left" ? "mr-auto" : align === "right" ? "ml-auto" : "mx-auto";
73
-
74
- return (
75
- <NodeViewWrapper
76
- as="div"
77
- className={`resizable-image my-3 ${alignClass}`}
78
- data-align={align}
79
- style={{ width: widthStyle ?? "fit-content", maxWidth: "100%" }}
80
- >
81
- <div
82
- ref={wrapperRef}
83
- className={`relative group inline-block max-w-full ${selected ? "ring-2 ring-primary rounded-md" : ""}`}
84
- contentEditable={false}
85
- >
86
- <img
87
- ref={imgRef}
88
- src={attrs.src}
89
- alt={attrs.alt ?? ""}
90
- title={attrs.title ?? undefined}
91
- className="block rounded-md max-w-full h-auto"
92
- style={{ width: widthStyle }}
93
- draggable={false}
94
- />
95
- {editor.isEditable && (
96
- <>
97
- <div
98
- aria-label="Resize from left"
99
- onPointerDown={(e) => beginResize(e, "left")}
100
- className="hover-reveal resize-hit absolute left-0 top-0 bottom-0 w-2 cursor-ew-resize opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center"
101
- >
102
- <div className="w-1 h-8 bg-card border border-border rounded-full shadow" />
103
- </div>
104
- <div
105
- aria-label="Resize from right"
106
- onPointerDown={(e) => beginResize(e, "right")}
107
- className="hover-reveal resize-hit absolute right-0 top-0 bottom-0 w-2 cursor-ew-resize opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center"
108
- >
109
- <div className="w-1 h-8 bg-card border border-border rounded-full shadow" />
110
- </div>
111
- {liveWidth != null && (
112
- <div className="absolute top-1 right-1 text-[10px] px-1.5 py-0.5 rounded bg-primary/80 text-primary-foreground font-mono">
113
- {Math.round(liveWidth)}px
114
- </div>
115
- )}
116
- </>
117
- )}
118
- </div>
119
- </NodeViewWrapper>
120
- );
121
- }
122
-
123
- export const ResizableImage = Image.extend({
124
- name: "image",
125
- draggable: true,
126
- addAttributes() {
127
- return {
128
- ...this.parent?.(),
129
- width: {
130
- default: null,
131
- parseHTML: (element) => {
132
- const w = element.getAttribute("width") ?? element.style.width;
133
- if (!w) return null;
134
- const match = /^(\d+)(px)?$/.exec(w);
135
- return match ? Number(match[1]) : w;
136
- },
137
- renderHTML: (attributes: ImageAttrs) => {
138
- if (!attributes.width) return {};
139
- const w =
140
- typeof attributes.width === "number"
141
- ? `${attributes.width}px`
142
- : attributes.width;
143
- return { style: `width: ${w}` };
144
- },
145
- },
146
- align: {
147
- default: null,
148
- parseHTML: (element) => element.getAttribute("data-align"),
149
- renderHTML: (attributes: ImageAttrs) => {
150
- if (!attributes.align) return {};
151
- return { "data-align": attributes.align };
152
- },
153
- },
154
- };
155
- },
156
- addNodeView() {
157
- return ReactNodeViewRenderer(ResizableImageComponent);
158
- },
159
- });