collabmd 0.1.44 → 0.1.46

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 (291) hide show
  1. package/README.md +39 -19
  2. package/bin/collabmd.js +27 -1
  3. package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-CYM5nxUi.js +1 -0
  4. package/dist/client/assets/browser-utils--H_DkyEF.js +1 -0
  5. package/dist/client/assets/chunk-ERSWUTIN-hHdvnhaY.js +41 -0
  6. package/dist/client/assets/{chunk-CZQZEIFA-DT3N9fo7.js → chunk-YGJVY4SA-CjSe7Bx7.js} +2 -2
  7. package/dist/client/assets/comment-thread-store-CdcwrObc.js +1 -0
  8. package/dist/client/assets/comment-threads-9J6Em-_y.js +4 -0
  9. package/dist/client/assets/comment-ui-shared-BC4pt4w8.js +7 -0
  10. package/dist/client/assets/dist-B5HTH2BO.js +1 -0
  11. package/dist/client/assets/{dist-DhLvC8DS.js → dist-B5Jf1SLZ.js} +2 -2
  12. package/dist/client/assets/{dist-CnL7Y2sM.js → dist-BDt3rz7l.js} +1 -1
  13. package/dist/client/assets/dist-BEwK4csK.js +1 -0
  14. package/dist/client/assets/dist-BKW4PALF.js +1 -0
  15. package/dist/client/assets/dist-BWcHHOx-.js +1 -0
  16. package/dist/client/assets/{dist-CYZmbokb.js → dist-BalScOwZ.js} +9 -9
  17. package/dist/client/assets/dist-Bf8f4HmM.js +6 -0
  18. package/dist/client/assets/dist-BjHJDtyU.js +1 -0
  19. package/dist/client/assets/dist-Bm6pf9Bl.js +1 -0
  20. package/dist/client/assets/dist-BoVBdSjk.js +1 -0
  21. package/dist/client/assets/dist-CC5IrQMG.js +1 -0
  22. package/dist/client/assets/{dist-C11hHqv_.js → dist-CCP_AKPG.js} +12 -12
  23. package/dist/client/assets/dist-CZgOmxK6.js +1 -0
  24. package/dist/client/assets/{dist-D2AQ-76g.js → dist-Cqhv5LAk.js} +1 -1
  25. package/dist/client/assets/{dist-MvcV4190.js → dist-D-Z6FLem.js} +1 -1
  26. package/dist/client/assets/dist-DLMiIsNC.js +11 -0
  27. package/dist/client/assets/{dist-3bgCp7iY.js → dist-DZKu9Cs8.js} +1 -1
  28. package/dist/client/assets/dist-DaYdhcVs.js +1 -0
  29. package/dist/client/assets/dist-FWJsgGYI.js +1 -0
  30. package/dist/client/assets/dist-Kh2COra_.js +1 -0
  31. package/dist/client/assets/{dist-JYEDRrPT.js → dist-PDZ3bSqm.js} +1 -1
  32. package/dist/client/assets/{dist-Drp8uu5J.js → dist-TjMh8n1u.js} +1 -1
  33. package/dist/client/assets/{dist-DGb27Dl6.js → dist-dtAdgL39.js} +1 -1
  34. package/dist/client/assets/dist-jv4WdPnK.js +9 -0
  35. package/dist/client/assets/{dist-DK5Gs2wa.js → dist-rGBmqxC7.js} +1 -1
  36. package/dist/client/assets/{dist-DCzuX1AF.js → dist-shrl6K_0.js} +1 -1
  37. package/dist/client/assets/dist-tOaegDYS2.js +1 -0
  38. package/dist/client/assets/dist-ule2n6ak.js +1 -0
  39. package/dist/client/assets/dist-xElaxbia.js +1 -0
  40. package/dist/client/assets/drawio-editor-FzY1cVw8.js +9 -0
  41. package/dist/client/assets/drawioEditor-BjiKJqlc.js +2 -0
  42. package/dist/client/assets/editor-session-Cm9ekeNo.js +54 -0
  43. package/dist/client/assets/embedded-editor-base-CwTkk911.css +1 -0
  44. package/dist/client/assets/{en-GADW4C6J-DQ6zyCEM.js → en-7NFCYGKX-BrgYZAEe.js} +1 -1
  45. package/dist/client/assets/{preview-render-profile-BZzGSg6K.js → es-DXGV3RHd.js} +13 -13
  46. package/dist/client/assets/excalidraw-editor-B46zsTFI.js +9 -0
  47. package/dist/client/assets/excalidraw-editor-Bt7gMSoh.css +1 -0
  48. package/dist/client/assets/excalidraw-scene-BOben2gr.js +1 -0
  49. package/dist/client/assets/excalidrawEditor-CT2pHq7e.js +2 -0
  50. package/dist/client/assets/export-page-A7NHawJY.js +39 -0
  51. package/dist/client/assets/exportDocument-B2L8fe34.css +1 -0
  52. package/dist/client/assets/exportDocument-BaqcOAAW.js +2 -0
  53. package/dist/client/assets/file-icon-svg-CQAjlWjK.js +1 -0
  54. package/dist/client/assets/file-kind-BbqgGzpc.js +1 -0
  55. package/dist/client/assets/image-QXRYHUNP-SWEV8H0J.js +1 -0
  56. package/dist/client/assets/index-ClbjMBVt.js +2 -0
  57. package/dist/client/assets/index-Pum8ET-5.css +1 -0
  58. package/dist/client/assets/main-B3uPyqic.js +893 -0
  59. package/dist/client/assets/modulepreload-polyfill-P2Xu9kJm.js +1 -0
  60. package/dist/client/assets/pdf-BL9Pr2D5.js +54 -0
  61. package/dist/client/assets/pdf.worker-CLesOks4.mjs +64857 -0
  62. package/dist/client/assets/pdf_viewer-FVkkThnz.js +551 -0
  63. package/dist/client/assets/preview-diagram-utils-txBCoW8d.js +1 -0
  64. package/dist/client/assets/{preview-render-compiler-BSaQO_p3.js → preview-render-compiler-BD-XhkS2.js} +2 -2
  65. package/dist/client/assets/preview-render-compiler-BKedaMxx.js +1 -0
  66. package/dist/client/assets/preview-render-profile-CE-5rVTC.js +1 -0
  67. package/dist/client/assets/{preview-render-worker-B42LWvrD.js → preview-render-worker-CiPqc9n6.js} +20 -20
  68. package/dist/client/assets/prod-Dy20X7eT.js +1 -0
  69. package/dist/client/assets/prod-hnwh7wRM.js +177 -0
  70. package/dist/client/assets/quick-switcher-controller-fqOYR7qR.js +12 -0
  71. package/dist/client/assets/runtime-config-BLrEKVO1.js +1 -0
  72. package/dist/client/assets/vault-api-client-_LpV1aIn.js +6 -0
  73. package/dist/client/assets/{yjs-provider-reset-guard-Cox4nxwu.js → yjs-provider-reset-guard-DE0vINDP.js} +1 -1
  74. package/dist/client/drawio-editor.html +3 -2
  75. package/dist/client/excalidraw-editor.html +3 -2
  76. package/dist/client/export-document.html +4 -3
  77. package/dist/client/index.html +109 -27
  78. package/docker-compose.yml +42 -0
  79. package/package.json +26 -15
  80. package/scripts/local-structurizr-compose.mjs +101 -0
  81. package/src/client/app/drawio-editor-entry.js +0 -3
  82. package/src/client/app/drawio-editor.html +1 -0
  83. package/src/client/app/excalidraw-editor-entry.js +0 -3
  84. package/src/client/app/excalidraw-editor.html +1 -0
  85. package/src/client/app/export-document-entry.js +0 -3
  86. package/src/client/app/export-document.html +1 -0
  87. package/src/client/app/index.html +106 -24
  88. package/src/client/app/main-entry.js +0 -5
  89. package/src/client/application/app-shell/chat-feature.js +180 -124
  90. package/src/client/application/app-shell/comments-feature.js +20 -11
  91. package/src/client/application/app-shell/git-feature.js +16 -9
  92. package/src/client/application/app-shell/presence-feature.js +18 -11
  93. package/src/client/application/app-shell/ui-feature-shell.js +78 -17
  94. package/src/client/application/app-shell/ui-feature-sidebar.js +74 -1
  95. package/src/client/application/app-shell/ui-feature-tab-activity.js +2 -2
  96. package/src/client/application/app-shell/ui-feature-toolbar.js +2 -52
  97. package/src/client/application/app-shell/workspace-feature.js +27 -84
  98. package/src/client/application/app-shell-elements.js +9 -1
  99. package/src/client/application/diagram-chrome.js +161 -166
  100. package/src/client/application/diagram-preview-export.js +7 -34
  101. package/src/client/application/diagram-preview-hydrator.js +1 -19
  102. package/src/client/application/markdown-frontmatter.js +0 -2
  103. package/src/client/application/mermaid-preview-hydrator.js +1 -14
  104. package/src/client/application/pdf-preview-controller.js +992 -0
  105. package/src/client/application/plantuml-preview-hydrator.js +0 -10
  106. package/src/client/application/preview-diagram-utils.js +31 -2
  107. package/src/client/application/preview-render-compiler.js +2 -1
  108. package/src/client/application/preview-renderer.js +2 -2
  109. package/src/client/application/quick-switcher-loader.js +3 -1
  110. package/src/client/application/structurizr-preview-controller.js +395 -0
  111. package/src/client/application/workspace-coordinator.js +25 -3
  112. package/src/client/application/workspace-preview-controller.js +91 -5
  113. package/src/client/bootstrap/collabmd-app-shell.js +155 -43
  114. package/src/client/browser-utils.js +44 -0
  115. package/src/client/domain/excalidraw-collaboration.js +0 -2
  116. package/src/client/domain/room.js +38 -0
  117. package/src/client/domain/runtime-paths.js +26 -5
  118. package/src/client/domain/structurizr-language.js +99 -0
  119. package/src/client/domain/vault-paths.js +48 -0
  120. package/src/client/excalidraw-editor.js +833 -51
  121. package/src/client/export/export-pipeline.js +6 -34
  122. package/src/client/infrastructure/auth-client.js +4 -10
  123. package/src/client/infrastructure/browser-notification-port.js +33 -20
  124. package/src/client/infrastructure/browser-preferences-port.js +46 -9
  125. package/src/client/infrastructure/comment-thread-store.js +34 -13
  126. package/src/client/infrastructure/editor-session.js +10 -0
  127. package/src/client/infrastructure/editor-view-adapter.js +133 -5
  128. package/src/client/infrastructure/excalidraw-room-client.js +103 -14
  129. package/src/client/infrastructure/git-api-client.js +5 -0
  130. package/src/client/infrastructure/lobby-presence.js +1 -0
  131. package/src/client/infrastructure/vault-api-client.js +51 -0
  132. package/src/client/infrastructure/workspace-sync-client.js +13 -1
  133. package/src/client/presentation/comment-overview-controller.js +18 -53
  134. package/src/client/presentation/comment-ui/comment-ui-card.js +1 -12
  135. package/src/client/presentation/comment-ui/comment-ui-layout.js +242 -219
  136. package/src/client/presentation/comment-ui/comment-ui-render.js +32 -45
  137. package/src/client/presentation/comment-ui/comment-ui-shared.js +68 -13
  138. package/src/client/presentation/comment-ui-controller.js +5 -1
  139. package/src/client/presentation/drawio-embed-controller.js +9 -102
  140. package/src/client/presentation/drawio-viewer.js +118 -0
  141. package/src/client/presentation/excalidraw-embed-controller.js +74 -8
  142. package/src/client/presentation/file-action-controller.js +134 -0
  143. package/src/client/presentation/file-explorer-controller.js +33 -3
  144. package/src/client/presentation/file-explorer-view.js +59 -34
  145. package/src/client/presentation/file-icon-svg.js +40 -0
  146. package/src/client/presentation/file-tree-state.js +12 -4
  147. package/src/client/presentation/git-diff-view-controller.js +731 -3
  148. package/src/client/presentation/outline-controller.js +86 -0
  149. package/src/client/presentation/quick-switcher-controller.js +257 -74
  150. package/src/client/presentation/quick-switcher-text-search.js +3 -3
  151. package/src/client/presentation/toast-controller.js +3 -0
  152. package/src/client/styles/components/feedback.css +6 -0
  153. package/src/client/styles/components/navigation.css +11 -1
  154. package/src/client/styles/features/collaboration-chat.css +49 -53
  155. package/src/client/styles/features/collaboration-presence.css +9 -7
  156. package/src/client/styles/features/comment-card.css +25 -11
  157. package/src/client/styles/features/comment-overlays.css +0 -4
  158. package/src/client/styles/features/comment-overview.css +44 -21
  159. package/src/client/styles/features/comments-drawer.css +2 -100
  160. package/src/client/styles/features/diagram-preview.css +81 -18
  161. package/src/client/styles/features/diff-special.css +309 -0
  162. package/src/client/styles/features/embedded-preview.css +8 -33
  163. package/src/client/styles/features/quick-switcher.css +8 -0
  164. package/src/client/styles/foundation/themes.css +6 -0
  165. package/src/client/styles/foundation/tokens.css +1 -0
  166. package/src/client/styles/layout/editor-page.css +40 -0
  167. package/src/client/styles/layout/responsive.css +31 -1
  168. package/src/client/styles/layout/shell.css +383 -7
  169. package/src/client/styles/layout/sidebar.css +47 -15
  170. package/src/client/styles/layout/view-modes.css +1 -0
  171. package/src/client/styles/overrides/codemirror.css +217 -15
  172. package/src/client/styles/style.css +1 -0
  173. package/src/client/styles/surfaces/excalidraw-editor.css +294 -0
  174. package/src/domain/comment-threads.js +63 -5
  175. package/src/domain/excalidraw-room-codec.js +6 -4
  176. package/src/domain/file-kind.js +35 -3
  177. package/src/server/application/workspace-reconciliation.js +1 -1
  178. package/src/server/config/env.js +79 -0
  179. package/src/server/create-app-server.js +14 -3
  180. package/src/server/domain/bases/base-definition.js +1 -1
  181. package/src/server/domain/bases/base-expression-runtime.js +1 -4
  182. package/src/server/domain/bases/base-index-snapshot-store.js +1 -4
  183. package/src/server/domain/bases/base-query-service.js +1 -77
  184. package/src/server/domain/bases/base-transform.js +1 -4
  185. package/src/server/domain/collaboration/collaboration-room.js +55 -21
  186. package/src/server/domain/comment-overview.js +25 -8
  187. package/src/server/domain/docx-exporter.js +24 -33
  188. package/src/server/domain/ripgrep-search-service.js +7 -1
  189. package/src/server/domain/workspace-state.js +32 -11
  190. package/src/server/infrastructure/git/diff-service.js +29 -13
  191. package/src/server/infrastructure/git/git-service.js +61 -10
  192. package/src/server/infrastructure/git/history-service.js +96 -29
  193. package/src/server/infrastructure/git/image-mime.js +14 -0
  194. package/src/server/infrastructure/git/path-utils.js +1 -1
  195. package/src/server/infrastructure/git/responses.js +0 -95
  196. package/src/server/infrastructure/git/untracked-files.js +28 -1
  197. package/src/server/infrastructure/github/github-app-client.js +22 -15
  198. package/src/server/infrastructure/http/create-git-api-query-handler.js +31 -1
  199. package/src/server/infrastructure/http/create-request-handler.js +18 -31
  200. package/src/server/infrastructure/http/create-static-handler.js +5 -2
  201. package/src/server/infrastructure/http/create-structurizr-api-handler.js +145 -0
  202. package/src/server/infrastructure/http/create-vault-api-command-handler.js +70 -8
  203. package/src/server/infrastructure/http/create-vault-api-query-handler.js +51 -3
  204. package/src/server/infrastructure/http/http-errors.js +7 -1
  205. package/src/server/infrastructure/http/http-request-helpers.js +22 -0
  206. package/src/server/infrastructure/persistence/path-utils.js +1 -1
  207. package/src/server/infrastructure/persistence/vault-file-store.js +3 -0
  208. package/src/server/infrastructure/structurizr/structurizr-embed.css +43 -0
  209. package/src/server/infrastructure/structurizr/structurizr-workspace-service.js +374 -0
  210. package/src/server/infrastructure/websocket/attach-collaboration-gateway.js +4 -22
  211. package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-CbSISC1w.js +0 -1
  212. package/dist/client/assets/bases-preview-controller-2pLHk0uk.js +0 -143
  213. package/dist/client/assets/browser-utils-CKtI_rZl.js +0 -1
  214. package/dist/client/assets/button-BCEiw4Rw.js +0 -1
  215. package/dist/client/assets/chunk-AXR3VHVW-0GTk_evH.js +0 -41
  216. package/dist/client/assets/comment-threads-D-iKphIp.js +0 -4
  217. package/dist/client/assets/diagram-action-icons-aa_KOv9h.js +0 -36
  218. package/dist/client/assets/dist-BH87JoHx.js +0 -11
  219. package/dist/client/assets/dist-BIkPRZO7.js +0 -6
  220. package/dist/client/assets/dist-BqCsFpx4.js +0 -1
  221. package/dist/client/assets/dist-C2JHCt8U.js +0 -1
  222. package/dist/client/assets/dist-CZjTtmTu.js +0 -1
  223. package/dist/client/assets/dist-Cig4Ov_X.js +0 -1
  224. package/dist/client/assets/dist-CqQEC8gR.js +0 -1
  225. package/dist/client/assets/dist-D4Rzqod1.js +0 -1
  226. package/dist/client/assets/dist-D5sn-mwk.js +0 -9
  227. package/dist/client/assets/dist-D7G-n87v.js +0 -1
  228. package/dist/client/assets/dist-DRqOrNgN.js +0 -1
  229. package/dist/client/assets/dist-DetkMS_4.js +0 -1
  230. package/dist/client/assets/dist-Dp6FVkQ1.js +0 -1
  231. package/dist/client/assets/dist-DtbjNB28.js +0 -1
  232. package/dist/client/assets/dist-DyrYcvpo2.js +0 -1
  233. package/dist/client/assets/dist-GrygD2zE.js +0 -1
  234. package/dist/client/assets/dist-HmEpWUow.js +0 -1
  235. package/dist/client/assets/dist-RTa81Km7.js +0 -1
  236. package/dist/client/assets/drawio-editor-DDvFoarP.js +0 -9
  237. package/dist/client/assets/drawio-embed-controller-BD1GTRwn.js +0 -1
  238. package/dist/client/assets/drawioEditor-Bu5grlH5.js +0 -2
  239. package/dist/client/assets/editor-session-DGlpiAsK.js +0 -16
  240. package/dist/client/assets/embedded-editor-base-C9roKYpW.css +0 -1
  241. package/dist/client/assets/excalidraw-editor-BHu6k8d4.js +0 -9
  242. package/dist/client/assets/excalidraw-editor-Cr_184EF.css +0 -1
  243. package/dist/client/assets/excalidraw-embed-controller-y2fenN_g.js +0 -1
  244. package/dist/client/assets/excalidraw-embed-reconciler-DGiagExg.js +0 -1
  245. package/dist/client/assets/excalidraw-scene-BvsQ6mLP.js +0 -176
  246. package/dist/client/assets/excalidrawEditor-4vFE--Uw.js +0 -2
  247. package/dist/client/assets/export-page-Cby8JzPO.js +0 -39
  248. package/dist/client/assets/exportDocument-C9v-bc7I.css +0 -1
  249. package/dist/client/assets/exportDocument-CRHCfsdo.js +0 -2
  250. package/dist/client/assets/file-history-view-controller-BDjEV9xJ.js +0 -112
  251. package/dist/client/assets/file-kind-BKPOIRPE.js +0 -1
  252. package/dist/client/assets/git-diff-view-controller-DgdM1aqb.js +0 -150
  253. package/dist/client/assets/git-panel-controller-BDTR2HVp.js +0 -207
  254. package/dist/client/assets/image-XGD7JQR6-XDUWHRpO.js +0 -1
  255. package/dist/client/assets/index-7xOyXDhP.css +0 -1
  256. package/dist/client/assets/index-Bz1KuQ6y.js +0 -2
  257. package/dist/client/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  258. package/dist/client/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  259. package/dist/client/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  260. package/dist/client/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  261. package/dist/client/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  262. package/dist/client/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  263. package/dist/client/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  264. package/dist/client/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
  265. package/dist/client/assets/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff +0 -0
  266. package/dist/client/assets/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff +0 -0
  267. package/dist/client/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
  268. package/dist/client/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
  269. package/dist/client/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
  270. package/dist/client/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
  271. package/dist/client/assets/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff +0 -0
  272. package/dist/client/assets/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff +0 -0
  273. package/dist/client/assets/main-Ci07m9oP.js +0 -152
  274. package/dist/client/assets/preview-diagram-utils-n_bbJA9V.js +0 -1
  275. package/dist/client/assets/preview-render-compiler-csGM5ZFz.js +0 -1
  276. package/dist/client/assets/quick-switcher-controller-CoiYvllm.js +0 -12
  277. package/dist/client/assets/room-CDrmIdDt.js +0 -1
  278. package/dist/client/assets/runtime-config-CDgeuPWN.js +0 -1
  279. package/dist/client/assets/runtime-config-loader-BHGniHP5.js +0 -1
  280. package/dist/client/assets/runtime-paths-DvpihCEq.js +0 -1
  281. package/dist/client/assets/segmented-control-DJrHSz8M.js +0 -1
  282. package/dist/client/assets/vault-api-client-sLB2bo56.js +0 -1
  283. package/dist/client/assets/vault-paths-CVkuh0j-.js +0 -5
  284. package/src/client/bootstrap/lazy-controller-feature.js +0 -433
  285. package/src/client/infrastructure/backlinks-api-client.js +0 -16
  286. package/src/client/infrastructure/plantuml-api-client.js +0 -19
  287. package/src/client/infrastructure/runtime-config-loader.js +0 -56
  288. package/src/server/domain/collaboration/room-persistence-controller.js +0 -80
  289. package/src/server/infrastructure/git/command-runner.js +0 -49
  290. package/src/server/infrastructure/git/errors.js +0 -8
  291. package/src/server/infrastructure/http/create-esm-proxy-handler.js +0 -130
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./excalidraw-editor-BHu6k8d4.js","./rolldown-runtime-Dd_uD5pT.js","./chunk-AXR3VHVW-0GTk_evH.js","./preload-helper-HclGiUj8.js","./chunk-SRAX5OIU-KFQikY-4.js","./jsx-runtime-BpzPEenQ.js","./vault-api-client-sLB2bo56.js","./runtime-paths-DvpihCEq.js","./runtime-config-CDgeuPWN.js","./vault-paths-CVkuh0j-.js","./file-kind-BKPOIRPE.js","./browser-utils-CKtI_rZl.js","./vault-api-client-C3mlS_4N.css","./yjs-provider-reset-guard-Cox4nxwu.js","./excalidraw-scene-BvsQ6mLP.js","./chunk-CZQZEIFA-DT3N9fo7.js","./chunk-7XWMRXBY-CfMzEq80.js","./excalidraw-mermaid-stub-BNckbX2n.js","./room-CDrmIdDt.js","./excalidraw-editor-Cr_184EF.css","./embedded-editor-base-C9roKYpW.css"])))=>i.map(i=>d[i]);
2
- import{t as e}from"./runtime-config-loader-BHGniHP5.js";import{t}from"./preload-helper-HclGiUj8.js";await e(),await t(()=>import(`./excalidraw-editor-BHu6k8d4.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]),import.meta.url);
@@ -1,39 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./mermaid.core-DN-lF51U.js","./preload-helper-HclGiUj8.js","./chunk-Y2CYZVJY-DsF7k-Jl.js","./src-oBChb5qS.js","./rolldown-runtime-Dd_uD5pT.js","./chunk-I66GZJ75-CVFiiffQ.js","./chunk-NSK5VX7P-TLH37VXI.js","./dist-B_J_HbC0.js","./chunk-3NCLNEKW-Y2Jf_LI-.js","./chunk-4I5QYGJK-CCB2YcIH.js","./chunk-WRU74C26-h6_XkD3_.js","./chunk-7BUUIJ7U-Bb538aSH.js","./chunk-UBXNYLIW-Bhk-PbFK.js","./chunk-W5SLKNZC-BdNSCxZ9.js","./chunk-QR6OTTB3-CDAA_5Ib.js","./rough.esm-Dy-Kn_BL.js","./chunk-7Z6QIM7H-BP9Pdsm9.js","./line-B_S_S8kV.js","./path-fybaL0A-.js","./array-BifhSqXX.js","./chunk-J7OUQ5F2-4CEb7pvH.js","./chunk-ZIRB5QZD-O39ZBUk3.js"])))=>i.map(i=>d[i]);
2
- import{t as e}from"./preload-helper-HclGiUj8.js";import{f as t}from"./file-kind-BKPOIRPE.js";import{t as n}from"./preview-render-compiler-BSaQO_p3.js";import{i as r,n as i}from"./runtime-paths-DvpihCEq.js";import"./runtime-config-CDgeuPWN.js";import{n as a}from"./browser-utils-CKtI_rZl.js";import{a as o,c as s,o as c}from"./excalidraw-scene-BvsQ6mLP.js";import{l}from"./preview-diagram-utils-n_bbJA9V.js";var u=`collabmd-export-page`,d=`collabmd-export-host`,f=Object.freeze({htmlLabels:!1,flowchart:{defaultRenderer:`dagre-wrapper`,useMaxWidth:!0},class:{defaultRenderer:`dagre-wrapper`,useMaxWidth:!0},startOnLoad:!1,theme:`default`}),p=1e4,ee=10485760,m=1e4,te=1e4,h=1,g=new Set([`image/jpeg`,`image/jpg`,`image/png`,`image/svg+xml`]),ne=new Set([`image/gif`,`image/webp`]),re=new Map([[`image/gif`,`GIF`],[`image/webp`,`WebP`]]),_=null,v=0;function y(e=`asset`){return v+=1,`${e}-${v.toString(36)}`}function b(e,n=``){let r=String(n??``).trim();if(r)return r;let i=String(e??``).split(`/`).filter(Boolean).pop()||`document`;return t(i)||`document`}function x(e){return`data:image/svg+xml;charset=utf-8,${encodeURIComponent(e)}`}function ie(e){let t=new TextEncoder().encode(String(e??``)),n=32768,r=``;for(let e=0;e<t.length;e+=n)r+=String.fromCharCode(...t.subarray(e,e+n));return`data:image/svg+xml;base64,${btoa(r)}`}function S(){return new Promise(e=>requestAnimationFrame(()=>e()))}function ae(e){return new Promise((t,n)=>{let r=new FileReader;r.addEventListener(`load`,()=>t(String(r.result??``))),r.addEventListener(`error`,()=>n(r.error??Error(`Failed to read blob`))),r.readAsDataURL(e)})}function C(e){return new Promise((t,n)=>{let r=new Image;r.decoding=`async`,r.addEventListener(`load`,()=>t(r),{once:!0}),r.addEventListener(`error`,()=>n(Error(`Failed to load image: ${e}`)),{once:!0}),r.src=e})}function w(e){let t=Number.parseFloat(e.getAttribute(`width`)||``),n=Number.parseFloat(e.getAttribute(`height`)||``),r=(e.getAttribute(`viewBox`)||``).split(/\s+/).map(e=>Number.parseFloat(e)),i=Number.isFinite(t)&&t>0?t:Number.isFinite(r[2])&&r[2]>0?r[2]:1200;return{height:Number.isFinite(n)&&n>0?n:Number.isFinite(r[3])&&r[3]>0?r[3]:800,width:i}}function oe(e,{padding:t=16}={}){let n=document.createElement(`div`);n.style.position=`fixed`,n.style.left=`-10000px`,n.style.top=`0`,n.style.visibility=`hidden`,n.style.pointerEvents=`none`,n.innerHTML=e,document.body.appendChild(n);try{let r=n.querySelector(`svg`);if(!(r instanceof SVGSVGElement))return e;let i=null;try{i=r.getBBox()}catch{return e}if(!i||i.width<=0||i.height<=0)return e;let a=Math.max(0,Number(t)||0),o=[Math.floor(i.x-a),Math.floor(i.y-a),Math.ceil(i.width+a*2),Math.ceil(i.height+a*2)],s=Math.ceil(i.width+a*2),c=Math.ceil(i.height+a*2);return r.setAttribute(`viewBox`,o.join(` `)),r.setAttribute(`preserveAspectRatio`,`xMidYMid meet`),r.setAttribute(`width`,String(s)),r.setAttribute(`height`,String(c)),r.outerHTML}finally{n.remove()}}function T(e,t={}){return oe(l(e),t)}async function E(e){let t=URL.createObjectURL(new Blob([e],{type:`image/svg+xml;charset=utf-8`})),n=document.createElement(`div`);n.innerHTML=e;let r=n.querySelector(`svg`);try{let n;try{n=await C(t)}catch{n=await C(ie(e))}let{width:i,height:a}=r?w(r):{height:n.naturalHeight||800,width:n.naturalWidth||1200},o=document.createElement(`canvas`);o.width=Math.max(1,Math.ceil(i)),o.height=Math.max(1,Math.ceil(a));let s=o.getContext(`2d`);if(!s)throw Error(`Canvas is unavailable`);return s.fillStyle=`#ffffff`,s.fillRect(0,0,o.width,o.height),s.drawImage(n,0,0,o.width,o.height),o.toDataURL(`image/png`)}finally{URL.revokeObjectURL(t)}}async function D(e){let t=await C(e),n=document.createElement(`canvas`);n.width=Math.max(1,t.naturalWidth||t.width||1),n.height=Math.max(1,t.naturalHeight||t.height||1);let r=n.getContext(`2d`);if(!r)throw Error(`Canvas is unavailable`);return r.drawImage(t,0,0,n.width,n.height),n.toDataURL(`image/png`)}function O(e=``){return String(e??``).match(/^data:([^;,]+)/iu)?.[1]?.toLowerCase()||``}async function k(e,{warnings:t=[]}={}){let n=O(e);if(g.has(n)||!ne.has(n))return e;let r=re.get(n)||n;try{return await D(e)}catch(n){let i=n instanceof Error?n.message:`Failed to convert ${r} image for DOCX`;return t.push(`Failed to convert ${r} image for DOCX: ${i}`),e}}async function se(e,{timeoutMs:t=m}={}){e instanceof HTMLImageElement&&e.getAttribute(`src`)&&(e.complete||await new Promise(n=>{let r=!1,i=()=>{r||(r=!0,window.clearTimeout(o),e.removeEventListener(`load`,a),e.removeEventListener(`error`,a))},a=()=>{i(),n()},o=window.setTimeout(a,t);e.addEventListener(`load`,a,{once:!0}),e.addEventListener(`error`,a,{once:!0}),e.complete&&a()}),typeof e.decode==`function`&&await e.decode().catch(()=>{}))}async function A(e,t={}){let n=await fetch(e,{headers:{Accept:`application/json`,...t.headers??{}},...t}),r=await n.json().catch(()=>null);if(!n.ok)throw Error(r?.error||`Request failed: ${n.status}`);return r}async function j(e){let t=await A(i(`/file?path=${encodeURIComponent(e)}`));if(typeof t?.content!=`string`)throw Error(`Failed to load ${e}`);return t.content}async function M(e,{maxBytes:t=ee,timeoutMs:n=p}={}){let r=new URL(e,window.location.href),i=new AbortController,a=window.setTimeout(()=>i.abort(),n),o;try{o=await fetch(r.toString(),{credentials:r.origin===window.location.origin?`same-origin`:`omit`,signal:i.signal})}catch(e){throw e instanceof DOMException&&e.name===`AbortError`?Error(`Timed out while fetching asset: ${r.toString()}`,{cause:e}):e}finally{window.clearTimeout(a)}if(!o.ok)throw Error(`Failed to fetch asset: ${r.toString()}`);let s=Number.parseInt(o.headers.get(`content-length`)||``,10);if(Number.isFinite(s)&&s>t)throw Error(`Asset is too large to inline: ${r.toString()}`);let c=await o.blob();if(c.size>t)throw Error(`Asset is too large to inline: ${r.toString()}`);return ae(c)}function ce(e){let t=new URL(r(`/`),window.location.origin);return t.hash=new URLSearchParams({file:e}).toString(),t.toString()}function N(e=``){let t;try{t=new URL(String(e||``).trim())}catch{return``}let n=t.hostname.toLowerCase();if(n===`youtu.be`||n===`www.youtu.be`)return t.pathname.split(`/`).filter(Boolean)[0]||``;if(n.includes(`youtube`)||n.includes(`youtube-nocookie`)){if(t.pathname===`/watch`)return t.searchParams.get(`v`)||``;if(t.pathname.startsWith(`/embed/`))return t.pathname.split(`/`).filter(Boolean)[1]||``}return``}function P(e,{assetId:t=``,docxPosterDataUrl:n=``,posterDataUrl:r=``}={}){let i=document.createElement(`figure`);i.className=`export-video-poster`,t&&i.setAttribute(`data-export-asset-id`,t);let a=document.createElement(`div`);if(a.className=`export-video-poster-card`,r){let t=document.createElement(`div`);t.className=`export-video-poster-media`;let i=document.createElement(`img`);i.alt=`${e.dataset.videoEmbedLabel||`Embedded video`} poster`,i.className=`export-video-poster-image`,i.src=r,i.setAttribute(`data-export-docx-src`,n||r),t.appendChild(i);let o=document.createElement(`span`);o.className=`export-video-play-badge`,o.setAttribute(`aria-hidden`,`true`),o.textContent=`Play`,t.appendChild(o),a.appendChild(t)}let o=document.createElement(`div`);o.className=`export-video-poster-copy`;let s=document.createElement(`strong`);s.textContent=e.dataset.videoEmbedLabel||`Embedded video`;let c=document.createElement(`span`);c.className=`export-video-poster-meta`,c.textContent=e.dataset.videoEmbedKind===`youtube`?`YouTube video`:`Video link`,o.append(s,c),a.appendChild(o);let l=document.createElement(`a`);return l.className=`export-video-link`,l.href=e.dataset.videoEmbedOriginalUrl||e.dataset.videoEmbedSource||e.dataset.videoEmbedUrl||`#`,l.target=`_blank`,l.rel=`noopener noreferrer`,l.textContent=l.href,i.append(a,l),i}async function F(e){let t=document.createElement(`video`);return t.muted=!0,t.playsInline=!0,t.preload=`metadata`,t.crossOrigin=`anonymous`,t.style.position=`fixed`,t.style.left=`-10000px`,t.style.top=`0`,t.style.width=`1px`,t.style.height=`1px`,new Promise((n,r)=>{let i=!1,a=e=>{i||(i=!0,window.clearTimeout(d),t.pause?.(),t.removeEventListener(`error`,c),t.removeEventListener(`loadeddata`,u),t.removeEventListener(`seeked`,l),t.remove(),e())},o=e=>{a(()=>r(Error(e)))},s=()=>{if(t.videoWidth<=0||t.videoHeight<=0){o(`Video poster capture returned no frame: ${e}`);return}try{let e=document.createElement(`canvas`);e.width=t.videoWidth,e.height=t.videoHeight;let r=e.getContext(`2d`);if(!r){o(`Canvas is unavailable`);return}r.drawImage(t,0,0,e.width,e.height);let i=e.toDataURL(`image/png`);a(()=>n(i))}catch(t){o(t instanceof Error?t.message:`Failed to capture video poster: ${e}`)}},c=()=>{o(`Failed to load video poster: ${e}`)},l=()=>{s()},u=()=>{let e=Number.isFinite(t.duration)?t.duration:0,n=e>0?Math.min(h,Math.max(e*.1,0)):0;if(n>.05)try{t.currentTime=n;return}catch{}s()},d=window.setTimeout(()=>{o(`Timed out while loading video poster: ${e}`)},te);t.addEventListener(`error`,c,{once:!0}),t.addEventListener(`loadeddata`,u,{once:!0}),t.addEventListener(`seeked`,l,{once:!0}),document.body.appendChild(t),t.src=e,t.load()})}async function I(e){let t=e.dataset.videoEmbedOriginalUrl||e.dataset.videoEmbedSource||``,n=e.dataset.videoEmbedUrl||``;if((e.dataset.videoEmbedKind||``)===`youtube`){let e=N(t)||N(n);if(!e)throw Error(`Failed to resolve YouTube video id for export`);let r=[`https://i.ytimg.com/vi_webp/${e}/maxresdefault.webp`,`https://i.ytimg.com/vi_webp/${e}/hqdefault.webp`,`https://i.ytimg.com/vi/${e}/maxresdefault.jpg`,`https://i.ytimg.com/vi/${e}/hqdefault.jpg`],i=null;for(let e of r)try{return await M(e,{maxBytes:3145728,timeoutMs:p})}catch(e){i=e}throw i instanceof Error?i:Error(`Failed to fetch YouTube thumbnail`)}if(!t)throw Error(`Missing video source for export poster`);return F(t)}async function L(e,t){let n=await I(t),r=await D(n).catch(()=>n),i=K(e,{dataUrl:n,id:y(`video-poster`),kind:`video-poster`,mimeType:n.startsWith(`data:image/webp`)?`image/webp`:`image/png`,variants:{docx:r}});t.replaceWith(P(t,{assetId:i,docxPosterDataUrl:r,posterDataUrl:n}))}function R({alt:e=``,message:t=``,src:n=``}={}){let r=document.createElement(`span`);if(r.className=`export-warning export-image-fallback`,r.textContent=t||`Image export failed`,!n)return r;r.append(` `);let i=document.createElement(`a`);return i.href=n,i.rel=`noopener noreferrer`,i.target=`_blank`,i.textContent=e||n,r.append(i),r}function z({alt:e,assetId:t,className:n,dataUrl:r,docxDataUrl:i,svgMarkup:a=``}){let o=document.createElement(`figure`);if(o.className=`export-diagram ${n}`.trim(),o.setAttribute(`data-export-asset-id`,t),o.setAttribute(`data-export-label`,e),i&&o.setAttribute(`data-export-docx-src`,i),a){let t=document.createElement(`div`);t.className=`export-diagram-surface`,t.innerHTML=a;let n=t.querySelector(`svg`);if(n){let{width:r}=w(n);t.style.width=`100%`,t.style.maxWidth=`${Math.ceil(r)}px`,n.classList.add(`export-diagram-svg`),n.setAttribute(`role`,`img`),n.setAttribute(`aria-label`,e),n.removeAttribute(`width`),n.removeAttribute(`height`)}return o.appendChild(t),o}let s=document.createElement(`img`);return s.alt=e,s.className=`export-diagram-image`,s.src=r,i&&s.setAttribute(`data-export-docx-src`,i),o.appendChild(s),o}async function B(){return _||(_=e(()=>import(`./mermaid.core-DN-lF51U.js`).then(e=>{let t=e?.default;if(!t)throw Error(`Mermaid runtime failed to initialize`);return t.initialize(f),t}),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]),import.meta.url),_)}function V(e){let t=String(e??``);if(/%%\{[\s\S]*?\binit\s*:/m.test(t)||(/^\s*stateDiagram(?:-v2)?\b/m.test(t)||/^\s*classDiagram\b/m.test(t)||/^\s*gantt\b/m.test(t))&&(t=`%%{init: ${JSON.stringify({htmlLabels:!1})}}%%\n${t}`),/^\s*gantt\b/m.test(t)&&!/\btodayMarker\b/.test(t)){let e=t.split(`
3
- `),n=e.findIndex(e=>/^\s*gantt\b/.test(e));n!==-1&&(e.splice(n+1,0,` todayMarker off`),t=e.join(`
4
- `))}return t}async function H(e){let t=await B();t.initialize(f);let n=document.createElement(`div`);n.style.position=`fixed`,n.style.left=`-10000px`,n.style.top=`0`,n.style.width=`1200px`,document.body.appendChild(n);try{let r=document.createElement(`div`);r.className=`mermaid`,r.id=y(`mermaid-render`),r.textContent=V(e),n.appendChild(r),await t.run({nodes:[r]});let i=r.querySelector(`svg`);if(!i)throw Error(`Mermaid render returned no SVG`);return T(i.outerHTML,{padding:24})}finally{n.remove()}}async function U(e){let t=await A(i(`/plantuml/render`),{body:JSON.stringify({source:e}),headers:{"Content-Type":`application/json`},method:`POST`});if(typeof t?.svg!=`string`||!t.svg.includes(`<svg`))throw Error(`PlantUML render returned no SVG`);return T(t.svg,{padding:16})}async function W(e){let t=await j(e),n=o(t),r=c(n,{theme:`light`});return T((await s({appState:{...r.appState,exportBackground:!0,exportWithDarkMode:!1},elements:r.elements.filter(e=>!e.isDeleted),exportPadding:24,files:r.files||null})).outerHTML,{padding:24})}async function G(e){let t=y(`drawio-export`);return new Promise((n,i)=>{let a=document.createElement(`iframe`);a.className=`drawio-export-iframe`,a.src=(()=>{let n=new URL(r(`/drawio-editor.html`),window.location.origin);return n.searchParams.set(`file`,e),n.searchParams.set(`hostMode`,`export-image`),n.searchParams.set(`instanceId`,t),n.searchParams.set(`mode`,`view`),n.searchParams.set(`theme`,`light`),n.searchParams.set(`previewWidth`,`1200`),n.toString()})();let o=window.setTimeout(()=>{c(),i(Error(`Timed out while exporting draw.io diagram`))},2e4),s=e=>{if(e.origin!==window.location.origin)return;let r=e.data;if(!(!r||r.source!==`drawio-editor`||r.instanceId!==t)){if(r.type===`export-image`&&typeof r.data==`string`&&r.data){c(),n(r.data);return}(r.type===`error`||r.type===`fallback-text`)&&(c(),i(Error(r.message||`Failed to export draw.io diagram`)))}},c=()=>{window.clearTimeout(o),window.removeEventListener(`message`,s),a.remove()};window.addEventListener(`message`,s),document.body.appendChild(a)})}function K(e,t){return e.assets[t.id]=t,t.id}async function q(e,t,{label:n,prefix:r,render:i}){let a=t.querySelector(`.${r}-source`)?.textContent??``,o=t.dataset[`${r}Target`];if(!a.trim()&&o&&(a=await j(o)),!a.trim())throw Error(`${n} source is empty`);let s=await i(a,o),c=x(s),l=await E(s).catch(()=>c),u=K(e,{dataUrl:c,id:y(r),kind:`svg`,mimeType:`image/svg+xml`,text:s,variants:{docx:l}});t.replaceWith(z({alt:n,assetId:u,className:`export-diagram--${r}`,dataUrl:c,docxDataUrl:l,svgMarkup:s}))}async function le(e,t){let n=String(t.dataset.embedTarget??``).trim();if(!n)throw Error(`Missing Excalidraw file path`);let r=await W(n),i=x(r),a=await E(r).catch(()=>i),o=K(e,{dataUrl:i,id:y(`excalidraw`),kind:`svg`,mimeType:`image/svg+xml`,text:r,variants:{docx:a}});t.replaceWith(z({alt:t.dataset.embedLabel||`Excalidraw diagram`,assetId:o,className:`export-diagram--excalidraw`,dataUrl:i,docxDataUrl:a,svgMarkup:r}))}async function ue(e,t){let n=String(t.dataset.drawioTarget??``).trim();if(!n)throw Error(`Missing draw.io file path`);let r=await G(n),i=K(e,{dataUrl:r,id:y(`drawio`),kind:`png`,mimeType:`image/png`});t.replaceWith(z({alt:t.dataset.drawioLabel||`draw.io diagram`,assetId:i,className:`export-diagram--drawio`,dataUrl:r,docxDataUrl:r}))}async function de(e,t){let n=Array.from(t.querySelectorAll(`img`));for(let t of n){let n=t.getAttribute(`src`)||``;if(n){if(n.startsWith(`data:`)){let r=await k(n,{warnings:e.warnings});t.setAttribute(`data-export-docx-src`,r);continue}try{let r=await M(new URL(n,window.location.href).toString()),i=await k(r,{warnings:e.warnings}),a=K(e,{dataUrl:r,id:y(`image`),kind:`image`,mimeType:O(r)||`application/octet-stream`});t.src=r,t.setAttribute(`data-export-asset-id`,a),t.setAttribute(`data-export-docx-src`,i)}catch(r){let i=r instanceof Error?r.message:`Failed to inline ${n}`;e.warnings.push(i),t.replaceWith(R({alt:t.getAttribute(`alt`)||``,message:`Image export failed: ${i}. Source:`,src:n}))}}}}function fe(e){Array.from(e.querySelectorAll(`.wiki-link[data-wiki-target]`)).forEach(e=>{let t=String(e.getAttribute(`data-wiki-target`)||``).trim();t&&(e.setAttribute(`href`,ce(t)),e.setAttribute(`target`,`_blank`),e.setAttribute(`rel`,`noopener noreferrer`))})}function pe(e){Array.from(e.querySelectorAll(`.task-list-item input[type="checkbox"]`)).forEach(e=>{e.setAttribute(`disabled`,`true`)})}async function me(e,{container:t}={}){fe(t),pe(t);let n=Array.from(t.querySelectorAll(`.video-embed-placeholder[data-video-embed-key]`));for(let t of n)try{await L(e,t)}catch(n){e.warnings.push(n instanceof Error?n.message:`Failed to render video poster`),t.replaceWith(P(t))}let r=Array.from(t.querySelectorAll(`.mermaid-shell[data-mermaid-key]`));for(let t of r)try{await q(e,t,{label:t.dataset.mermaidLabel||`Mermaid diagram`,prefix:`mermaid`,render:e=>H(e)})}catch(n){e.warnings.push(n instanceof Error?n.message:`Failed to render Mermaid diagram`),t.replaceWith(Object.assign(document.createElement(`p`),{className:`export-warning`,textContent:`Mermaid export failed: ${n instanceof Error?n.message:`Unknown error`}`}))}let i=Array.from(t.querySelectorAll(`.plantuml-shell[data-plantuml-key]`));for(let t of i)try{await q(e,t,{label:t.dataset.plantumlLabel||`PlantUML diagram`,prefix:`plantuml`,render:e=>U(e)})}catch(n){e.warnings.push(n instanceof Error?n.message:`Failed to render PlantUML diagram`),t.replaceWith(Object.assign(document.createElement(`p`),{className:`export-warning`,textContent:`PlantUML export failed: ${n instanceof Error?n.message:`Unknown error`}`}))}let a=Array.from(t.querySelectorAll(`.excalidraw-embed-placeholder[data-embed-key]`));for(let t of a)try{await le(e,t)}catch(n){e.warnings.push(n instanceof Error?n.message:`Failed to render Excalidraw diagram`),t.replaceWith(Object.assign(document.createElement(`p`),{className:`export-warning`,textContent:`Excalidraw export failed: ${n instanceof Error?n.message:`Unknown error`}`}))}let o=Array.from(t.querySelectorAll(`.drawio-embed-placeholder[data-drawio-key]`));for(let t of o)try{await ue(e,t)}catch(n){e.warnings.push(n instanceof Error?n.message:`Failed to render draw.io diagram`),t.replaceWith(Object.assign(document.createElement(`p`),{className:`export-warning`,textContent:`draw.io export failed: ${n instanceof Error?n.message:`Unknown error`}`}))}return await de(e,t),e}async function he({fileList:e=[],filePath:t,markdownText:r=``,title:a=``}={}){let o=String(t??``).trim(),s=String(r??``),c={assets:{},filePath:o,generatedAt:new Date().toISOString(),html:``,sourceMarkdown:s,title:b(o,a),warnings:[]},l=n({attachmentApiPath:i(`/attachment`),fileList:e,markdownText:s,sourceFilePath:o}),u=document.createElement(`div`);return u.className=`preview-content export-content`,u.innerHTML=l.html,await me(c,{container:u}),c.html=u.innerHTML,c}function J(e,{borderColor:t=`#d1d5db`,cellPadding:n=`8px 10px`,headerBackground:r=`#f3f4f6`}={}){e.setAttribute(`border`,`1`),e.setAttribute(`cellpadding`,`0`),e.setAttribute(`cellspacing`,`0`),e.style.width=`100%`,e.style.borderCollapse=`collapse`,e.style.border=`1px solid ${t}`,e.style.margin=`0 0 16px`,Array.from(e.querySelectorAll(`th`)).forEach(e=>{e.style.border=`1px solid ${t}`,e.style.padding=n,e.style.background=r,e.style.textAlign=`left`,e.style.verticalAlign=`top`}),Array.from(e.querySelectorAll(`td`)).forEach(e=>{e.style.border=`1px solid ${t}`,e.style.padding=n,e.style.textAlign=`left`,e.style.verticalAlign=`top`})}function Y({contentNodes:e=[],borderColor:t=`#d1d5db`,padding:n=`12px`,shade:r=``}={}){let i=document.createElement(`table`);i.setAttribute(`border`,`1`),i.setAttribute(`cellpadding`,`0`),i.setAttribute(`cellspacing`,`0`),i.style.width=`100%`,i.style.borderCollapse=`collapse`,i.style.border=`1px solid ${t}`,i.style.margin=`0 0 16px`;let a=document.createElement(`tr`),o=document.createElement(`td`);return o.style.border=`1px solid ${t}`,o.style.padding=n,o.style.verticalAlign=`top`,r&&(o.style.background=r),e.forEach(e=>{e&&o.appendChild(e)}),a.appendChild(o),i.appendChild(a),i}function ge(e){let t=document.createElement(`table`);t.setAttribute(`role`,`presentation`),t.setAttribute(`cellpadding`,`0`),t.setAttribute(`cellspacing`,`0`),t.style.width=`100%`,t.style.borderCollapse=`collapse`,t.style.margin=`0 0 16px`,t.style.tableLayout=`fixed`;let n=document.createElement(`colgroup`),r=document.createElement(`col`);r.style.width=`6px`;let i=document.createElement(`col`);n.append(r,i),t.appendChild(n);let a=document.createElement(`tr`),o=document.createElement(`td`);o.style.background=`#6366f1`,o.style.width=`6px`,o.style.padding=`0`,o.style.fontSize=`0`,o.style.lineHeight=`0`,o.innerHTML=`&nbsp;`;let s=document.createElement(`td`);s.style.background=`#f8fafc`,s.style.padding=`12px 16px`,s.style.verticalAlign=`top`,s.style.color=`#4b5563`,Array.from(e.childNodes).forEach(e=>{s.appendChild(e.cloneNode(!0))});let c=s.querySelector(`p`);c&&(c.style.marginTop=`0`),Array.from(s.querySelectorAll(`p`)).forEach(e=>{e.style.margin=`0 0 10px`});let l=s.querySelector(`p:last-of-type`);return l&&(l.style.marginBottom=`0`),a.append(o,s),t.appendChild(a),t}function _e(e){let t=(e.textContent||``).replace(/\r\n/g,`
5
- `).split(`
6
- `),n=[];return t.forEach((e,r)=>{let i=document.createElement(`p`);i.style.margin=`0`,r<t.length-1&&(i.style.marginBottom=`2px`),i.style.fontFamily=`'JetBrains Mono', 'Courier New', monospace`,i.style.fontSize=`12px`,i.style.lineHeight=`1.55`,i.style.color=`#111827`;let a=(e||``).replace(/\t/g,` `);a?(i.textContent=a,i.innerHTML=i.innerHTML.replace(/ /g,`&nbsp;`)):i.innerHTML=`&nbsp;`,n.push(i)}),Y({borderColor:`#d1d5db`,contentNodes:n,padding:`12px 14px`,shade:`#f8fafc`})}function ve(e){let t=document.createElement(`template`);return t.innerHTML=e.html,Array.from(t.content.querySelectorAll(`.table-wrapper`)).forEach(e=>{let t=e.querySelector(`:scope > table`);t&&(J(t),e.replaceWith(t))}),Array.from(t.content.querySelectorAll(`table`)).forEach(e=>{J(e)}),Array.from(t.content.querySelectorAll(`pre`)).forEach(e=>{e.replaceWith(_e(e))}),Array.from(t.content.querySelectorAll(`figure.export-diagram[data-export-docx-src]`)).forEach(e=>{let t=e.getAttribute(`data-export-docx-src`),n=e.querySelector(`svg`);if(!t||!n)return;let r=document.createElement(`img`);r.alt=e.getAttribute(`data-export-label`)||`Diagram`,r.className=`export-diagram-image`,r.src=t,r.style.display=`block`,r.style.width=`100%`,r.style.height=`auto`,e.replaceWith(Y({contentNodes:[r],padding:`12px`}))}),Array.from(t.content.querySelectorAll(`figure.export-video-poster`)).forEach(e=>{let t=e.querySelector(`.export-video-poster-card`),n=e.querySelector(`.export-video-poster-image`),r=e.querySelector(`.export-video-link`),i=e.querySelector(`.export-video-poster-copy strong`),a=e.querySelector(`.export-video-poster-meta`),o=document.createElement(`div`);if(o.className=`export-video-poster-docx`,n instanceof HTMLImageElement){let e=document.createElement(`img`);e.alt=n.alt||i?.textContent||`Embedded video poster`,e.className=`export-video-poster-image`,e.src=n.getAttribute(`data-export-docx-src`)||n.getAttribute(`src`)||``,o.appendChild(e)}if(i?.textContent){let e=document.createElement(`p`),t=document.createElement(`strong`);t.textContent=i.textContent,e.appendChild(t),o.appendChild(e)}if(a?.textContent){let e=document.createElement(`p`);e.className=`export-video-poster-meta`,e.textContent=a.textContent,o.appendChild(e)}if(r instanceof HTMLAnchorElement&&r.href){let e=document.createElement(`p`),t=document.createElement(`a`);t.href=r.href,t.textContent=r.textContent||r.href,e.appendChild(t),o.appendChild(e)}if(!o.childNodes.length&&t?.textContent){let e=document.createElement(`p`);e.textContent=t.textContent,o.appendChild(e)}e.replaceWith(Y({contentNodes:[o],padding:`12px`}))}),Array.from(t.content.querySelectorAll(`[data-export-docx-src]`)).forEach(e=>{if(!(e instanceof HTMLImageElement))return;let t=e.getAttribute(`data-export-docx-src`);t&&e.setAttribute(`src`,t)}),Array.from(t.content.querySelectorAll(`blockquote`)).forEach(e=>{e.replaceWith(ge(e))}),Array.from(t.content.querySelectorAll(`figure`)).forEach(e=>{if(e.closest(`table`))return;let t=e.querySelector(`img`);if(!(t instanceof HTMLImageElement))return;let n=t.cloneNode(!0);n.style.display=`block`,n.style.width=`100%`,n.style.height=`auto`,e.replaceWith(Y({contentNodes:[n],padding:`12px`}))}),`<!DOCTYPE html>
7
- <html lang="en">
8
- <head>
9
- <meta charset="UTF-8">
10
- <title>${e.title}</title>
11
- <style>
12
- body { font-family: Arial, sans-serif; color: #111827; line-height: 1.6; }
13
- main { max-width: 760px; margin: 0 auto; }
14
- h1, h2, h3, h4, h5, h6 { color: #111827; margin: 1.3em 0 0.6em; line-height: 1.2; }
15
- h1 { font-size: 28px; border-bottom: 1px solid #d1d5db; padding-bottom: 8px; }
16
- h2 { font-size: 22px; }
17
- h3 { font-size: 18px; }
18
- p, ul, ol, blockquote, pre, table, figure { margin: 0 0 16px; }
19
- a { color: #4338ca; text-decoration: underline; }
20
- pre { padding: 12px; border: 1px solid #d1d5db; background: #f8fafc; overflow: hidden; }
21
- code { font-family: 'JetBrains Mono', 'Courier New', monospace; background: #f3f4f6; padding: 2px 4px; }
22
- pre code { background: transparent; padding: 0; display: block; white-space: pre-wrap; }
23
- blockquote { padding-left: 14px; border-left: 3px solid #6366f1; color: #4b5563; }
24
- table { width: 100%; border-collapse: collapse; border: 1px solid #d1d5db; }
25
- th, td { border: 1px solid #d1d5db; padding: 8px 10px; text-align: left; vertical-align: top; }
26
- th { background: #f3f4f6; }
27
- img { max-width: 100%; height: auto; }
28
- .export-video-poster-docx { margin: 0 0 16px; }
29
- .export-video-poster-card { padding: 14px 16px; border: 1px solid #d1d5db; background: #f8fafc; }
30
- .export-video-poster-image { display: block; margin: 0 0 12px; }
31
- .export-video-poster-meta { display: block; color: #6b7280; font-size: 12px; margin-top: 4px; }
32
- .export-video-link { display: block; margin-top: 8px; word-break: break-word; }
33
- .export-warning { color: #b45309; }
34
- </style>
35
- </head>
36
- <body>
37
- <main>${t.innerHTML}</main>
38
- </body>
39
- </html>`}async function ye(e){let t=await fetch(i(`/export/docx`),{body:JSON.stringify({filePath:e.filePath,html:ve(e),title:e.title}),headers:{"Content-Type":`application/json`},method:`POST`});if(!t.ok){let e=await t.json().catch(()=>null);throw Error(e?.error||`Failed to export DOCX`)}let n=await t.blob();a(n,`${b(e.filePath,e.title)}.docx`,{removeDelayMs:0,revokeDelayMs:1e3})}async function be(){await S(),await S(),await new Promise(e=>{let t=window.setTimeout(e,1500),n=()=>{window.clearTimeout(t),window.removeEventListener(`afterprint`,n),e()};window.addEventListener(`afterprint`,n,{once:!0}),window.print()})}async function xe(e,{settleFrames:t=2,timeoutMs:n=m}={}){if(!e)return``;let r=Array.from(e.querySelectorAll(`img`)).map(e=>se(e,{timeoutMs:n})),i=document.fonts?.ready?Promise.resolve(document.fonts.ready).catch(()=>{}):Promise.resolve();await Promise.allSettled([i,...r]);for(let e=0;e<t;e+=1)await S();return e.innerHTML}async function Se(e,t){if(t===`pdf`){await be(e);return}await ye(e)}function X(e,t={}){!window.opener||window.opener.closed||window.opener.postMessage({...t,source:u,type:e},window.location.origin)}async function Z(){let e=new URL(window.location.href),t=e.searchParams.get(`action`)===`pdf`?`pdf`:`docx`,n=e.searchParams.get(`file`)||``,r=e.searchParams.get(`job`)||``;return r&&window.opener&&!window.opener.closed?(X(`ready`,{jobId:r}),new Promise((e,i)=>{let a=window.setTimeout(()=>{o(),i(Error(`Timed out waiting for export data`))},1e4),o=()=>{window.clearTimeout(a),window.removeEventListener(`message`,s)},s=i=>{if(i.origin!==window.location.origin)return;let a=i.data;!a||a.source!==d||a.type!==`bootstrap`||a.jobId!==r||(o(),e({action:t,fileList:Array.isArray(a.fileList)?a.fileList:[],filePath:a.filePath||n,title:a.title||``,markdownText:a.markdownText||``}))};window.addEventListener(`message`,s)})):{action:t,fileList:[],filePath:n,markdownText:n?await j(n):``,title:``}}var Ce=`h1, h2, h3, h4, h5, h6`,we=[`figure`,`pre`,`blockquote`,`table`].join(`, `);function Q(e){return!!e?.matches?.(we)}function Te(e){e&&Array.from(e.querySelectorAll(Ce)).forEach(e=>{if(e.parentElement?.classList.contains(`export-keep-with-next`))return;let t=e.nextElementSibling;if(!t||t.classList.contains(`export-keep-with-next`))return;let n=[e],r=t;if(r.tagName===`P`){let e=r.nextElementSibling;if(!e||!Q(e))return;n.push(r),r=e}else if(!Q(r))return;n.push(r);let i=document.createElement(`section`);i.className=`export-keep-with-next`,e.before(i),n.forEach(e=>i.appendChild(e))})}function $(e){let t=document.getElementById(`exportStatus`);t&&(t.textContent=e)}function Ee(e){let t=document.getElementById(`exportWarnings`),n=document.getElementById(`exportWarningsSection`);if(!t||!n)return;t.replaceChildren();let r=e.warnings??[];n.hidden=r.length===0,r.forEach(e=>{let n=document.createElement(`li`);n.textContent=e,t.appendChild(n)})}function De(e){let t=document.getElementById(`exportContent`);return t?(document.title=`${e.title} — Export`,t.innerHTML=e.html,Te(t),Ee(e),t):null}async function Oe(){try{$(`Loading export content…`);let e=await Z(),t=await he(e);t.html=await xe(De(t)),$(e.action===`pdf`?`Opening print dialog…`:`Preparing DOCX download…`),await Se(t,e.action),$(e.action===`pdf`?`Print dialog opened.`:`DOCX download started.`),X(`complete`,{jobId:new URL(window.location.href).searchParams.get(`job`)||``})}catch(e){let t=e instanceof Error?e.message:`Export failed`;$(t),X(`error`,{jobId:new URL(window.location.href).searchParams.get(`job`)||``,message:t})}}Oe();
@@ -1 +0,0 @@
1
- :root{--text-xs:clamp(.75rem, .7rem + .25vw, .875rem);--text-sm:clamp(.875rem, .8rem + .35vw, 1rem);--text-base:clamp(1rem, .9rem + .5vw, 1.125rem);--text-lg:clamp(1.125rem, .95rem + .85vw, 1.5rem);--text-xl:clamp(1.5rem, 1rem + 1.5vw, 2.25rem);--text-2xl:clamp(2rem, 1.2rem + 2.5vw, 3.5rem);--text-label:12px;--text-meta:12px;--text-caption:11px;--text-micro:10px;--text-code-sm:12px;--text-ui-sm:13px;--text-ui-md:14px;--text-title-sm:15px;--text-title-md:18px;--font-body:"Inter Variable", "Inter", system-ui, sans-serif;--font-display:"Inter Variable", "Inter", system-ui, sans-serif;--font-prose:system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:"JetBrains Mono", ui-monospace, "SFMono-Regular", "SF Mono", monospace;--space-1:.25rem;--space-2:.5rem;--space-3:.75rem;--space-4:1rem;--space-5:1.25rem;--space-6:1.5rem;--space-8:2rem;--space-10:2.5rem;--space-12:3rem;--space-16:4rem;--space-20:5rem;--space-24:6rem;--space-32:8rem;--radius-sm:.375rem;--radius-md:.5rem;--radius-lg:.75rem;--radius-xl:1rem;--radius-2xs:2px;--radius-xs:4px;--radius-lg-plus:10px;--radius-xl-plus:18px;--radius-full:9999px;--transition-interactive:.18s cubic-bezier(.16, 1, .3, 1);--content-narrow:640px;--content-default:960px;--content-wide:1200px;--preview-content-width:720px;--panel-comments-width:min(300px, 34vw);--panel-comments-min-width:240px;--panel-outline-width:220px;--toolbar-h:48px;--control-h-xs:28px;--control-h-sm:30px;--control-h-md:36px;--control-h-lg:44px;--control-target-min:44px;--control-icon-sm:14px;--control-icon-md:16px;--panel-border-width:1px}:root,[data-theme=light]{--color-bg:#f6f8fa;--color-surface:#fff;--color-surface-2:#fbfcfd;--color-surface-offset:#f0f3f6;--color-surface-offset-2:#e8edf2;--color-surface-dynamic:#dde3ea;--color-surface-raised:#fff;--color-surface-ink:#0b1118;--color-divider:#e3e8ee;--color-border:#cbd4df;--color-text:#17212b;--color-text-muted:#596675;--color-text-faint:#8391a1;--color-text-inverse:#f8fafc;--color-primary:#2563eb;--color-primary-hover:#1d4ed8;--color-primary-active:#1e40af;--color-primary-contrast:#fff;--color-primary-highlight:#dbeafe;--color-comment:#2563eb;--color-comment-soft:#2563eb14;--color-comment-strong:#2563eb24;--color-comment-text:#1e40af;--color-error:#dc2626;--color-danger:#dc2626;--color-error-highlight:#fce8e8;--color-success:#16a34a;--color-success-highlight:#dcfce7;--color-warning:#d97706;--color-warning-highlight:#fef3c7;--diff-add-bg:#16a34a0f;--diff-add-line-bg:#16a34a24;--diff-add-text:#16a34a;--diff-del-bg:#dc26260f;--diff-del-line-bg:#dc262624;--diff-del-text:#dc2626;--diff-hunk-bg:#2563eb14;--diff-hunk-text:#2563eb;--diff-gutter:#8391a1;--surface-fill-subtle:color-mix(in oklab, var(--color-surface) 92%, var(--color-surface-offset) 8%);--surface-fill-strong:color-mix(in oklab, var(--color-surface-offset) 72%, var(--color-surface-offset-2) 28%);--surface-overlay:color-mix(in srgb, var(--color-surface) 84%, var(--color-surface-offset) 16%);--surface-overlay-soft:color-mix(in srgb, var(--color-surface) 88%, var(--color-surface-offset) 12%);--surface-overlay-strong:color-mix(in srgb, var(--color-surface) 90%, var(--color-surface-offset) 10%);--surface-overlay-raised:color-mix(in oklab, var(--color-surface) 94%, transparent);--surface-overlay-header:color-mix(in srgb, var(--color-surface-offset) 76%, var(--color-bg) 24%);--surface-overlay-offset:color-mix(in oklab, var(--color-surface-offset) 82%, transparent);--surface-scrim:oklch(10% 0 0/.42);--surface-scrim-strong:oklch(8% .01 260/.82);--surface-inverse-glass:oklch(18% .02 260/.68);--surface-inverse-glass-hover:oklch(24% .02 260/.82);--surface-media-canvas:#000;--surface-embed-canvas:#fff;--surface-avatar-muted:#ffffff38;--surface-avatar-label:#0f1117d6;--surface-accent-subtle:color-mix(in oklab, var(--color-primary) 8%, var(--color-surface));--surface-accent-soft:color-mix(in oklab, var(--color-primary) 16%, transparent);--surface-accent-strong:color-mix(in oklab, var(--color-primary) 22%, transparent);--surface-success-soft:color-mix(in oklab, var(--color-success) 14%, transparent);--surface-warning-soft:color-mix(in oklab, var(--color-warning) 14%, transparent);--surface-danger-soft:color-mix(in oklab, var(--color-error) 14%, transparent);--surface-comment-shell-header:color-mix(in srgb, var(--color-surface) 97%, var(--color-comment) 3%);--surface-comment-record-hover:color-mix(in srgb, var(--color-surface-2) 92%, var(--color-comment) 8%);--surface-comment-subtle:color-mix(in srgb, var(--color-surface-2) 95%, var(--color-comment) 5%);--surface-comment-subtle-strong:color-mix(in srgb, var(--color-surface-2) 92%, var(--color-comment) 8%);--surface-comment-card:color-mix(in srgb, var(--color-surface) 94%, var(--color-comment) 6%);--surface-comment-elevated:color-mix(in srgb, var(--color-surface) 96%, var(--color-comment) 4%);--surface-comment-offset:color-mix(in srgb, var(--color-surface-offset) 90%, var(--color-comment) 10%);--surface-comment-offset-soft:color-mix(in srgb, var(--color-surface-offset) 88%, var(--color-comment) 12%);--surface-comment-offset-strong:color-mix(in srgb, var(--color-surface-offset) 84%, var(--color-comment) 16%);--surface-comment-offset-active:color-mix(in srgb, var(--color-surface-offset) 72%, var(--color-comment) 28%);--surface-comment-highlight-hover:color-mix(in srgb, var(--color-comment-soft) 74%, var(--color-comment) 26%);--surface-comment-highlight-active:color-mix(in srgb, var(--color-comment-soft) 62%, var(--color-comment) 38%);--surface-comment-selection:color-mix(in srgb, var(--color-surface) 25%, var(--color-comment) 75%);--surface-comment-preview-fade:linear-gradient(180deg, oklch(0% 0 0/0), color-mix(in srgb, var(--color-surface-2) 95%, var(--color-comment) 5%));--border-comment-soft:color-mix(in srgb, var(--color-divider) 90%, var(--color-comment) 10%);--border-comment-muted:color-mix(in srgb, var(--color-divider) 88%, var(--color-comment) 12%);--border-comment-strong:color-mix(in srgb, var(--color-border) 82%, var(--color-comment) 18%);--border-comment-active:color-mix(in srgb, var(--color-border) 78%, var(--color-comment) 22%);--shadow-comment-outline:0 0 0 1px oklch(from var(--color-comment) l c h / .14);--surface-warning-toast:var(--color-warning-highlight);--border-warning-toast:oklab(73.4461% .062398 .147608);--text-warning-toast:#422006;--shadow-warning-toast:var(--shadow-md);--border-accent-soft:color-mix(in oklab, var(--color-primary) 22%, transparent);--border-accent-muted:color-mix(in oklab, var(--color-primary) 24%, var(--color-border));--border-accent-strong:color-mix(in oklab, var(--color-primary) 34%, var(--color-border));--border-accent-stronger:color-mix(in oklab, var(--color-primary) 40%, var(--color-border));--shadow-accent-inset:inset 0 0 0 1px color-mix(in oklab, var(--color-primary) 14%, transparent);--shadow-accent-outline:0 0 0 1px color-mix(in oklab, var(--color-primary) 16%, transparent);--shadow-accent-halo:0 0 0 3px oklch(from var(--color-primary) l c h / .16);--shadow-accent-ring:0 0 0 2px var(--color-surface), 0 0 0 4px oklch(from var(--color-primary) l c h / .18);--shadow-accent-ring-strong:0 0 0 2px var(--color-bg), 0 0 0 4px oklch(from var(--color-primary) l c h / .45);--shadow-accent-ring-solid:0 0 0 2px var(--color-primary), 0 0 0 4px oklch(from var(--color-primary) l c h / .2);--shadow-elevated-soft:0 10px 24px color-mix(in oklab, var(--color-surface-ink) 10%, transparent);--shadow-floating-soft:0 14px 34px oklch(0% 0 0/.18);--shadow-floating-hover:0 18px 40px oklch(0% 0 0/.2);--shadow-media-soft:0 16px 40px oklch(0% 0 0/.24);--shadow-media-stage:0 28px 80px oklch(0% 0 0/.28);--shadow-media-modal:0 10px 40px #00000059;--shadow-card-strong:0 20px 56px oklch(0% 0 0/.24);--shadow-sheet-inset:inset 0 1px 0 color-mix(in oklab, var(--color-text) 4%, transparent);--shadow-focus:0 0 0 3px oklch(from var(--color-primary) l c h / .15);--shadow-focus-compact:0 0 0 2px oklch(from var(--color-primary) l c h / .45);--interactive-border:color-mix(in oklab, var(--color-primary) 22%, transparent);--interactive-surface:color-mix(in oklab, var(--color-primary) 14%, transparent);--color-text-on-dark:#fff;--shadow-sm:0 1px 2px oklch(20% .02 260/.06);--shadow-md:0 4px 12px oklch(20% .02 260/.08);--shadow-lg:0 12px 32px oklch(20% .02 260/.12)}[data-theme=dark]{--color-bg:#0b0f14;--color-surface:#11161d;--color-surface-2:#171d26;--color-surface-offset:#141a22;--color-surface-offset-2:#1c2530;--color-surface-dynamic:#253140;--color-surface-raised:#1a222c;--color-surface-ink:#030608;--color-divider:#242e3a;--color-border:#303c4b;--color-text:#e6edf3;--color-text-muted:#9aa7b4;--color-text-faint:#687584;--color-text-inverse:#0b0f14;--color-primary:#60a5fa;--color-primary-hover:#3b82f6;--color-primary-active:#2563eb;--color-primary-contrast:#07111f;--color-primary-highlight:#172a45;--color-comment:#60a5fa;--color-comment-soft:#60a5fa1a;--color-comment-strong:#60a5fa29;--color-comment-text:#bfdbfe;--color-error:#f87171;--color-danger:#f87171;--color-error-highlight:#2a1a1a;--color-success:#4ade80;--color-success-highlight:#1a2a1a;--color-warning:#fbbf24;--color-warning-highlight:#2a261a;--diff-add-bg:#4ade8014;--diff-add-line-bg:#4ade8026;--diff-add-text:#4ade80;--diff-del-bg:#f8717114;--diff-del-line-bg:#f8717126;--diff-del-text:#f87171;--diff-hunk-bg:#60a5fa1a;--diff-hunk-text:#60a5fa;--diff-gutter:#687584;--surface-fill-subtle:color-mix(in oklab, var(--color-surface) 88%, var(--color-surface-offset) 12%);--surface-fill-strong:color-mix(in oklab, var(--color-surface-offset) 60%, var(--color-surface-offset-2) 40%);--surface-overlay:color-mix(in srgb, var(--color-surface) 84%, var(--color-surface-offset) 16%);--surface-overlay-soft:color-mix(in srgb, var(--color-surface) 88%, var(--color-surface-offset) 12%);--surface-overlay-strong:color-mix(in srgb, var(--color-surface) 90%, var(--color-surface-offset) 10%);--surface-overlay-raised:color-mix(in oklab, var(--color-surface) 94%, transparent);--surface-overlay-header:color-mix(in srgb, var(--color-surface-offset) 76%, var(--color-bg) 24%);--surface-overlay-offset:color-mix(in oklab, var(--color-surface-offset) 82%, transparent);--surface-scrim:oklch(10% 0 0/.42);--surface-scrim-strong:oklch(8% .01 260/.82);--surface-inverse-glass:oklch(18% .02 260/.68);--surface-inverse-glass-hover:oklch(24% .02 260/.82);--surface-media-canvas:#000;--surface-embed-canvas:#121212;--surface-avatar-muted:#ffffff38;--surface-avatar-label:#0f1117d6;--surface-accent-subtle:color-mix(in oklab, var(--color-primary) 8%, var(--color-surface));--surface-accent-soft:color-mix(in oklab, var(--color-primary) 16%, transparent);--surface-accent-strong:color-mix(in oklab, var(--color-primary) 22%, transparent);--surface-success-soft:color-mix(in oklab, var(--color-success) 14%, transparent);--surface-warning-soft:color-mix(in oklab, var(--color-warning) 14%, transparent);--surface-danger-soft:color-mix(in oklab, var(--color-error) 14%, transparent);--surface-comment-shell-header:color-mix(in srgb, var(--color-surface) 97%, var(--color-comment) 3%);--surface-comment-record-hover:color-mix(in srgb, var(--color-surface-2) 92%, var(--color-comment) 8%);--surface-comment-subtle:color-mix(in srgb, var(--color-surface-2) 95%, var(--color-comment) 5%);--surface-comment-subtle-strong:color-mix(in srgb, var(--color-surface-2) 92%, var(--color-comment) 8%);--surface-comment-card:color-mix(in srgb, var(--color-surface) 94%, var(--color-comment) 6%);--surface-comment-elevated:color-mix(in srgb, var(--color-surface) 96%, var(--color-comment) 4%);--surface-comment-offset:color-mix(in srgb, var(--color-surface-offset) 90%, var(--color-comment) 10%);--surface-comment-offset-soft:color-mix(in srgb, var(--color-surface-offset) 88%, var(--color-comment) 12%);--surface-comment-offset-strong:color-mix(in srgb, var(--color-surface-offset) 84%, var(--color-comment) 16%);--surface-comment-offset-active:color-mix(in srgb, var(--color-surface-offset) 72%, var(--color-comment) 28%);--surface-comment-highlight-hover:color-mix(in srgb, var(--color-comment-soft) 74%, var(--color-comment) 26%);--surface-comment-highlight-active:color-mix(in srgb, var(--color-comment-soft) 62%, var(--color-comment) 38%);--surface-comment-selection:color-mix(in srgb, var(--color-surface) 25%, var(--color-comment) 75%);--surface-comment-preview-fade:linear-gradient(180deg, oklch(0% 0 0/0), color-mix(in srgb, var(--color-surface-2) 95%, var(--color-comment) 5%));--border-comment-soft:color-mix(in srgb, var(--color-divider) 90%, var(--color-comment) 10%);--border-comment-muted:color-mix(in srgb, var(--color-divider) 88%, var(--color-comment) 12%);--border-comment-strong:color-mix(in srgb, var(--color-border) 82%, var(--color-comment) 18%);--border-comment-active:color-mix(in srgb, var(--color-border) 78%, var(--color-comment) 22%);--shadow-comment-outline:0 0 0 1px oklch(from var(--color-comment) l c h / .14);--surface-warning-toast:var(--color-warning-highlight);--border-warning-toast:oklab(79.4887% .0497246 .137216/.88);--text-warning-toast:oklab(99.6952% -.000454402 .00461993);--shadow-warning-toast:var(--shadow-md);--border-accent-soft:color-mix(in oklab, var(--color-primary) 22%, transparent);--border-accent-muted:color-mix(in oklab, var(--color-primary) 24%, var(--color-border));--border-accent-strong:color-mix(in oklab, var(--color-primary) 34%, var(--color-border));--border-accent-stronger:color-mix(in oklab, var(--color-primary) 40%, var(--color-border));--shadow-accent-inset:inset 0 0 0 1px color-mix(in oklab, var(--color-primary) 14%, transparent);--shadow-accent-outline:0 0 0 1px color-mix(in oklab, var(--color-primary) 16%, transparent);--shadow-accent-halo:0 0 0 3px oklch(from var(--color-primary) l c h / .16);--shadow-accent-ring:0 0 0 2px var(--color-surface), 0 0 0 4px oklch(from var(--color-primary) l c h / .18);--shadow-accent-ring-strong:0 0 0 2px var(--color-bg), 0 0 0 4px oklch(from var(--color-primary) l c h / .45);--shadow-accent-ring-solid:0 0 0 2px var(--color-primary), 0 0 0 4px oklch(from var(--color-primary) l c h / .2);--shadow-elevated-soft:0 10px 24px color-mix(in oklab, var(--color-surface-ink) 10%, transparent);--shadow-floating-soft:0 14px 34px oklch(0% 0 0/.18);--shadow-floating-hover:0 18px 40px oklch(0% 0 0/.2);--shadow-media-soft:0 16px 40px oklch(0% 0 0/.24);--shadow-media-stage:0 28px 80px oklch(0% 0 0/.28);--shadow-media-modal:0 16px 48px #0009;--shadow-card-strong:0 20px 56px oklch(0% 0 0/.24);--shadow-sheet-inset:inset 0 1px 0 color-mix(in oklab, var(--color-text) 4%, transparent);--shadow-focus:0 0 0 3px oklch(from var(--color-primary) l c h / .15);--shadow-focus-compact:0 0 0 2px oklch(from var(--color-primary) l c h / .45);--interactive-border:color-mix(in oklab, var(--color-primary) 32%, transparent);--interactive-surface:color-mix(in oklab, var(--color-primary) 18%, transparent);--color-text-on-dark:#fff;--shadow-sm:0 1px 2px oklch(0% 0 0/.22);--shadow-md:0 4px 12px oklch(0% 0 0/.3);--shadow-lg:0 16px 40px oklch(0% 0 0/.45)}@media (prefers-color-scheme:dark){:root:not([data-theme]){--color-bg:#0b0f14;--color-surface:#11161d;--color-surface-2:#171d26;--color-surface-offset:#141a22;--color-surface-offset-2:#1c2530;--color-surface-dynamic:#253140;--color-surface-raised:#1a222c;--color-surface-ink:#030608;--color-divider:#242e3a;--color-border:#303c4b;--color-text:#e6edf3;--color-text-muted:#9aa7b4;--color-text-faint:#687584;--color-text-inverse:#0b0f14;--color-primary:#60a5fa;--color-primary-hover:#3b82f6;--color-primary-active:#2563eb;--color-primary-contrast:#07111f;--color-primary-highlight:#172a45;--color-comment:#60a5fa;--color-comment-soft:#60a5fa1a;--color-comment-strong:#60a5fa29;--color-comment-text:#bfdbfe;--color-error:#f87171;--color-error-highlight:#2a1a1a;--color-success:#4ade80;--color-success-highlight:#1a2a1a;--color-warning:#fbbf24;--color-warning-highlight:#2a261a;--surface-fill-subtle:color-mix(in oklab, var(--color-surface) 88%, var(--color-surface-offset) 12%);--surface-fill-strong:color-mix(in oklab, var(--color-surface-offset) 60%, var(--color-surface-offset-2) 40%);--surface-overlay:color-mix(in srgb, var(--color-surface) 84%, var(--color-surface-offset) 16%);--surface-overlay-soft:color-mix(in srgb, var(--color-surface) 88%, var(--color-surface-offset) 12%);--surface-overlay-strong:color-mix(in srgb, var(--color-surface) 90%, var(--color-surface-offset) 10%);--surface-overlay-raised:color-mix(in oklab, var(--color-surface) 94%, transparent);--surface-overlay-header:color-mix(in srgb, var(--color-surface-offset) 76%, var(--color-bg) 24%);--surface-overlay-offset:color-mix(in oklab, var(--color-surface-offset) 82%, transparent);--surface-scrim:oklch(10% 0 0/.42);--surface-scrim-strong:oklch(8% .01 260/.82);--surface-inverse-glass:oklch(18% .02 260/.68);--surface-inverse-glass-hover:oklch(24% .02 260/.82);--surface-media-canvas:#000;--surface-embed-canvas:#121212;--surface-avatar-muted:#ffffff38;--surface-avatar-label:#0f1117d6;--surface-accent-subtle:color-mix(in oklab, var(--color-primary) 8%, var(--color-surface));--surface-accent-soft:color-mix(in oklab, var(--color-primary) 16%, transparent);--surface-accent-strong:color-mix(in oklab, var(--color-primary) 22%, transparent);--surface-success-soft:color-mix(in oklab, var(--color-success) 14%, transparent);--surface-warning-soft:color-mix(in oklab, var(--color-warning) 14%, transparent);--surface-danger-soft:color-mix(in oklab, var(--color-error) 14%, transparent);--surface-comment-shell-header:color-mix(in srgb, var(--color-surface) 97%, var(--color-comment) 3%);--surface-comment-record-hover:color-mix(in srgb, var(--color-surface-2) 92%, var(--color-comment) 8%);--surface-comment-subtle:color-mix(in srgb, var(--color-surface-2) 95%, var(--color-comment) 5%);--surface-comment-subtle-strong:color-mix(in srgb, var(--color-surface-2) 92%, var(--color-comment) 8%);--surface-comment-card:color-mix(in srgb, var(--color-surface) 94%, var(--color-comment) 6%);--surface-comment-elevated:color-mix(in srgb, var(--color-surface) 96%, var(--color-comment) 4%);--surface-comment-offset:color-mix(in srgb, var(--color-surface-offset) 90%, var(--color-comment) 10%);--surface-comment-offset-soft:color-mix(in srgb, var(--color-surface-offset) 88%, var(--color-comment) 12%);--surface-comment-offset-strong:color-mix(in srgb, var(--color-surface-offset) 84%, var(--color-comment) 16%);--surface-comment-offset-active:color-mix(in srgb, var(--color-surface-offset) 72%, var(--color-comment) 28%);--surface-comment-highlight-hover:color-mix(in srgb, var(--color-comment-soft) 74%, var(--color-comment) 26%);--surface-comment-highlight-active:color-mix(in srgb, var(--color-comment-soft) 62%, var(--color-comment) 38%);--surface-comment-selection:color-mix(in srgb, var(--color-surface) 25%, var(--color-comment) 75%);--surface-comment-preview-fade:linear-gradient(180deg, oklch(0% 0 0/0), color-mix(in srgb, var(--color-surface-2) 95%, var(--color-comment) 5%));--border-comment-soft:color-mix(in srgb, var(--color-divider) 90%, var(--color-comment) 10%);--border-comment-muted:color-mix(in srgb, var(--color-divider) 88%, var(--color-comment) 12%);--border-comment-strong:color-mix(in srgb, var(--color-border) 82%, var(--color-comment) 18%);--border-comment-active:color-mix(in srgb, var(--color-border) 78%, var(--color-comment) 22%);--shadow-comment-outline:0 0 0 1px oklch(from var(--color-comment) l c h / .14);--surface-warning-toast:var(--color-warning-highlight);--border-warning-toast:oklab(79.4887% .0497246 .137216/.88);--text-warning-toast:oklab(99.6952% -.000454402 .00461993);--shadow-warning-toast:var(--shadow-md);--border-accent-soft:color-mix(in oklab, var(--color-primary) 22%, transparent);--border-accent-muted:color-mix(in oklab, var(--color-primary) 24%, var(--color-border));--border-accent-strong:color-mix(in oklab, var(--color-primary) 34%, var(--color-border));--border-accent-stronger:color-mix(in oklab, var(--color-primary) 40%, var(--color-border));--shadow-accent-inset:inset 0 0 0 1px color-mix(in oklab, var(--color-primary) 14%, transparent);--shadow-accent-outline:0 0 0 1px color-mix(in oklab, var(--color-primary) 16%, transparent);--shadow-accent-halo:0 0 0 3px oklch(from var(--color-primary) l c h / .16);--shadow-accent-ring:0 0 0 2px var(--color-surface), 0 0 0 4px oklch(from var(--color-primary) l c h / .18);--shadow-accent-ring-strong:0 0 0 2px var(--color-bg), 0 0 0 4px oklch(from var(--color-primary) l c h / .45);--shadow-accent-ring-solid:0 0 0 2px var(--color-primary), 0 0 0 4px oklch(from var(--color-primary) l c h / .2);--shadow-elevated-soft:0 10px 24px color-mix(in oklab, var(--color-surface-ink) 10%, transparent);--shadow-floating-soft:0 14px 34px oklch(0% 0 0/.18);--shadow-floating-hover:0 18px 40px oklch(0% 0 0/.2);--shadow-media-soft:0 16px 40px oklch(0% 0 0/.24);--shadow-media-stage:0 28px 80px oklch(0% 0 0/.28);--shadow-media-modal:0 16px 48px #0009;--shadow-card-strong:0 20px 56px oklch(0% 0 0/.24);--shadow-sheet-inset:inset 0 1px 0 color-mix(in oklab, var(--color-text) 4%, transparent);--shadow-focus:0 0 0 3px oklch(from var(--color-primary) l c h / .15);--shadow-focus-compact:0 0 0 2px oklch(from var(--color-primary) l c h / .45);--interactive-border:color-mix(in oklab, var(--color-primary) 32%, transparent);--interactive-surface:color-mix(in oklab, var(--color-primary) 18%, transparent);--color-text-on-dark:#fff;--shadow-sm:0 1px 2px oklch(0% 0 0/.22);--shadow-md:0 4px 12px oklch(0% 0 0/.3);--shadow-lg:0 16px 40px oklch(0% 0 0/.45)}}.preview-content,.preview-content h1,.preview-content h2,.preview-content h3,.preview-content h4,.preview-content h5,.preview-content h6{font-family:var(--font-prose)}.preview-content h1{margin:var(--space-8) 0 var(--space-4);padding-bottom:var(--space-2);border-bottom:1px solid var(--color-divider);font-size:var(--text-xl);letter-spacing:-.02em;font-weight:700}.preview-content h1:first-child,.preview-content .frontmatter-block+h1{margin-top:0}.preview-content h2{margin:var(--space-6) 0 var(--space-3);font-size:var(--text-lg);letter-spacing:-.01em;font-weight:600}.preview-content h3{margin:var(--space-5) 0 var(--space-2);font-size:var(--text-base);font-weight:600}.preview-content h4,.preview-content h5,.preview-content h6{margin:var(--space-4) 0 var(--space-2);color:var(--color-text-muted);font-size:var(--text-sm);font-weight:600}.preview-content .preview-heading-link-button{border-radius:var(--radius-full);width:1.18em;min-width:1.18em;height:1.18em;color:color-mix(in oklab, var(--color-text-muted) 78%, transparent);transition:transform var(--transition-interactive), background var(--transition-interactive), box-shadow var(--transition-interactive), color var(--transition-interactive), opacity var(--transition-interactive);vertical-align:middle;opacity:0;background:0 0;border:0;margin-inline-start:.28em;display:inline-flex;transform:translateY(-.04em)}.preview-content .preview-heading-link-button>svg{stroke-width:2px;width:.74em;height:.74em}.preview-content .preview-heading-link-button:hover{background:color-mix(in oklab, var(--color-primary) 12%, transparent);box-shadow:var(--shadow-accent-outline);color:var(--color-primary);transform:translateY(-.04em)scale(1.04)}.preview-content h1:hover .preview-heading-link-button,.preview-content h2:hover .preview-heading-link-button,.preview-content h3:hover .preview-heading-link-button,.preview-content h4:hover .preview-heading-link-button,.preview-content h5:hover .preview-heading-link-button,.preview-content h6:hover .preview-heading-link-button,.preview-content .preview-heading-link-button:focus-visible{opacity:1}.preview-content .preview-heading-link-button:focus-visible{background:color-mix(in oklab, var(--color-primary) 14%, transparent);box-shadow:var(--shadow-focus-compact);color:var(--color-primary);outline:0}.preview-content p{max-width:72ch;margin-bottom:var(--space-4)}.preview-content .frontmatter-block{max-width:72ch;margin:0 0 var(--space-5);padding:var(--space-4);border:1px solid var(--color-border);border-radius:var(--radius-lg);background:color-mix(in oklab, var(--color-surface-offset) 72%, var(--color-surface))}.preview-content .frontmatter-label{color:var(--color-text-muted);font-size:var(--text-ui-sm);letter-spacing:.04em;text-transform:uppercase;font-weight:600}.preview-content .frontmatter-block>.frontmatter-label{margin-bottom:var(--space-3);display:block}.preview-content .frontmatter-header{justify-content:space-between;align-items:center;gap:var(--space-3);margin-bottom:var(--space-3);display:flex}.preview-content .frontmatter-toggle{min-height:30px;padding:0 var(--space-3);border:1px solid var(--color-border);background:var(--color-surface);color:var(--color-text);font:inherit;font-size:var(--text-ui-sm);cursor:pointer;border-radius:999px;flex-shrink:0}.preview-content .frontmatter-toggle:hover{background:var(--color-surface-offset)}.preview-content .frontmatter-toggle:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.preview-content .frontmatter-summary{margin-bottom:var(--space-1);color:var(--color-text-muted);font-size:var(--text-ui-sm)}.preview-content .frontmatter-properties{gap:var(--space-3);margin:0;display:grid}.preview-content .frontmatter-property{gap:var(--space-3);grid-template-columns:minmax(0,160px) minmax(0,1fr);align-items:start;display:grid}.preview-content .frontmatter-key{color:var(--color-text-muted);font-size:var(--text-ui-sm);margin:0;font-weight:600}.preview-content .frontmatter-value{min-width:0;margin:0}.preview-content .frontmatter-value-text{color:var(--color-text);overflow-wrap:anywhere;display:inline-block}.preview-content .frontmatter-value-list{gap:var(--space-2);flex-wrap:wrap;display:flex}.preview-content .frontmatter-value-pill{min-height:28px;padding:0 var(--space-3);border:1px solid var(--color-border);background:var(--color-surface);color:var(--color-text);font-size:var(--text-ui-sm);border-radius:999px;align-items:center;display:inline-flex}.preview-content .frontmatter-value-code{border-radius:var(--radius-md);margin:0}.preview-content .frontmatter-value-code code{white-space:pre-wrap;word-break:break-word}.preview-content .frontmatter-empty{color:var(--color-text-muted);font-size:var(--text-ui-sm)}:is(.preview-content p:has(>.excalidraw-embed-placeholder:only-child),.preview-content p:has(>.bases-embed-placeholder:only-child),.preview-content p:has(>.video-embed-placeholder:only-child),.preview-content p:has(>.plantuml-shell:only-child)){max-width:none;margin-bottom:0}.preview-content .bases-shell{width:100%;margin:0 0 var(--space-5);border:1px solid var(--color-divider);border-radius:calc(var(--radius-lg) + 2px);background:var(--color-surface);box-shadow:var(--shadow-md);overflow:hidden}.preview-content .bases-embed-placeholder>.bases-shell{margin:0}.preview-content .bases-toolbar{gap:var(--space-3);padding:var(--space-4);border-bottom:1px solid var(--color-divider);border-radius:calc(var(--radius-lg) + 1px) calc(var(--radius-lg) + 1px) 0 0;background:var(--color-surface);display:grid}.preview-content .bases-toolbar-main,.preview-content .bases-toolbar-actions,.preview-content .bases-summaries,.preview-content .bases-value-list{gap:var(--space-2);flex-wrap:wrap;align-items:center;display:flex}.preview-content .bases-toolbar-main{justify-content:space-between;gap:var(--space-3);min-width:0}.preview-content .bases-tabs{border:1px solid color-mix(in oklab, var(--color-divider) 82%, transparent);border-radius:var(--radius-full);background:color-mix(in oklab, var(--color-surface-offset) 78%, var(--color-surface));scrollbar-width:none;flex-wrap:nowrap;flex:auto;min-width:0;max-width:100%;padding:3px;overflow:auto hidden}.preview-content .bases-tabs::-webkit-scrollbar{display:none}.preview-content .bases-export-btn,.preview-content .bases-link-button{flex-shrink:0}.preview-content .bases-toolbar-actions{justify-content:space-between;gap:var(--space-3);width:100%}.preview-content .bases-toolbar-edit-actions,.preview-content .bases-panel-title-row,.preview-content .bases-toggle-row,.preview-content .bases-filter-group-header,.preview-content .bases-filter-actions-row{gap:var(--space-2);flex-wrap:wrap;align-items:center;display:flex}.preview-content .bases-toolbar-edit-actions{border:1px solid var(--color-divider);border-radius:var(--radius-full);background:color-mix(in oklab, var(--color-surface) 72%, var(--color-surface-offset));box-shadow:inset 0 1px 0 oklch(from var(--color-text) l c h / .04);padding:3px;display:inline-flex}.preview-content .bases-panel-title-row,.preview-content .bases-filter-group-header{justify-content:space-between}.preview-content .bases-sort-row,.preview-content .bases-filter-row{gap:var(--space-2);align-items:stretch;width:100%;display:grid}.preview-content .bases-panel-section>.bases-sort-row{grid-template-columns:minmax(180px,1.35fr) minmax(140px,1fr) auto}.preview-content .bases-sort-list>.bases-sort-row{grid-template-columns:minmax(180px,1.35fr) minmax(140px,1fr) repeat(3,auto)}.preview-content .bases-filter-row{grid-template-columns:minmax(180px,1.2fr) minmax(160px,1fr) minmax(200px,1.35fr) auto}.preview-content .bases-sort-row>.ui-button,.preview-content .bases-filter-row>.ui-button,.preview-content .bases-filter-group-header>.ui-button,.preview-content .bases-filter-actions-row>.ui-button{align-self:stretch}.preview-content .bases-panels{padding:var(--space-3) var(--space-4) var(--space-4);background:var(--color-surface)}.preview-content .bases-panel-card{gap:var(--space-4);padding:var(--space-4);border:1px solid var(--color-divider);border-radius:calc(var(--radius-lg) + 1px);background:var(--color-surface);box-shadow:var(--shadow-sm);display:grid}.preview-content .bases-panel-section{gap:var(--space-2);display:grid}.preview-content .bases-panel-section+.bases-panel-section{padding-top:var(--space-3);border-top:1px solid color-mix(in oklab, var(--color-divider) 86%, transparent)}.preview-content .bases-panel-title,.preview-content .bases-readonly-note{font-size:var(--text-ui-sm);color:var(--color-text-muted)}.preview-content .bases-panel-title{font-weight:600}.preview-content .bases-readonly-note{line-height:1.5}.preview-content .bases-select,.preview-content .bases-filter-value,.preview-content .bases-properties-search-input,.preview-content .bases-filter-advanced{width:100%;min-width:0}.preview-content .bases-select,.preview-content .bases-filter-value,.preview-content .bases-filter-value-combobox{min-height:var(--control-h-md)}.preview-content .bases-select{appearance:none;padding-right:calc(var(--space-6) + var(--space-3));background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16' fill='none'%3E%3Cpath d='M4 6l4 4 4-4' stroke='%23838ea4' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-position:right var(--space-3) center;background-repeat:no-repeat;background-size:16px 16px}.preview-content .bases-filter-value-combobox{min-width:0;position:relative}.preview-content .bases-filter-value{padding-right:var(--space-3)}.preview-content .bases-filter-value--suggestions{padding-right:calc(var(--space-6) + var(--space-3));background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16' fill='none'%3E%3Cpath d='M4 6l4 4 4-4' stroke='%23838ea4' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-position:right var(--space-3) center;background-repeat:no-repeat;background-size:16px 16px}.preview-content .bases-filter-suggestion-list{top:calc(100% + var(--space-1));z-index:3;max-height:224px;padding:var(--space-1);border:1px solid var(--color-border);border-radius:var(--radius-lg);background:var(--color-surface);box-shadow:var(--shadow-lg);gap:2px;display:grid;position:absolute;left:0;right:0;overflow:auto}.preview-content .bases-filter-suggestion{gap:var(--space-2);width:100%;min-height:36px;padding:var(--space-2) var(--space-3);border-radius:calc(var(--radius-md) - 2px);color:var(--color-text);text-align:left;cursor:pointer;background:0 0;border:0;grid-template-columns:minmax(0,1fr) auto;align-items:center;display:grid}.preview-content .bases-filter-suggestion:hover,.preview-content .bases-filter-suggestion:focus-visible{background:var(--surface-fill-subtle);outline:none}.preview-content .bases-filter-suggestion[aria-selected=true]{background:color-mix(in oklab, var(--color-primary) 10%, var(--color-surface));color:var(--color-primary)}.preview-content .bases-filter-suggestion-label,.preview-content .bases-filter-suggestion-meta{min-width:0}.preview-content .bases-filter-suggestion-label{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.preview-content .bases-filter-suggestion-meta{color:var(--color-text-muted);font-size:var(--text-ui-sm)}.preview-content .bases-filter-group{gap:var(--space-3);padding:var(--space-3);border:1px solid color-mix(in oklab, var(--color-divider) 88%, transparent);border-radius:calc(var(--radius-lg) + 1px);background:var(--color-surface);box-shadow:inset 0 1px 0 oklch(from var(--color-text) l c h / .04);display:grid}.preview-content .bases-filter-children,.preview-content .bases-sort-list{gap:var(--space-3);display:grid}.preview-content .bases-properties-search,.preview-content .bases-filter-advanced-label{width:100%;display:block}.preview-content .bases-properties-list{gap:var(--space-2);max-height:320px;padding:var(--space-1);border:1px solid color-mix(in oklab, var(--color-divider) 86%, transparent);border-radius:var(--radius-lg);background:color-mix(in oklab, var(--color-surface-offset) 54%, var(--color-surface));display:grid;overflow:auto}.preview-content .bases-property-option{gap:var(--space-2);padding:var(--space-2) var(--space-3);border:1px solid var(--color-divider);border-radius:var(--radius-md);background:var(--color-surface);transition:transform var(--transition-interactive), border-color var(--transition-interactive), box-shadow var(--transition-interactive), background var(--transition-interactive);grid-template-columns:auto minmax(0,1fr) auto;align-items:center;display:grid}.preview-content .bases-property-option:hover{border-color:color-mix(in oklab, var(--color-divider) 55%, var(--color-primary) 45%);background:var(--surface-fill-subtle);box-shadow:var(--shadow-sm);transform:translateY(-1px)}.preview-content .bases-property-option input[type=checkbox]{width:16px;height:16px;accent-color:var(--color-primary);margin:0}.preview-content .bases-property-option-label{min-width:0;font-weight:500}.preview-content .bases-property-option-meta{font-size:var(--text-ui-sm);color:var(--color-text-faint);text-transform:capitalize}.preview-content .bases-filter-advanced{min-height:180px;padding:var(--space-3);resize:vertical;line-height:1.5}.preview-content .bases-search-shell{border:1px solid color-mix(in oklab, var(--color-border) 82%, var(--color-primary) 18%);border-radius:var(--radius-lg);background:var(--color-surface);width:100%;min-width:min(320px,100%);max-width:min(420px,100%);box-shadow:inset 0 1px 0 oklch(from var(--color-text) l c h / .04);transition:border-color var(--transition-interactive), box-shadow var(--transition-interactive), background var(--transition-interactive);flex:320px;align-items:center;margin-left:auto;display:flex;position:relative}.preview-content .bases-search-shell:focus-within{border-color:var(--color-primary);box-shadow:var(--shadow-focus), inset 0 1px 0 oklch(from var(--color-text) l c h / .04)}.preview-content .bases-search-icon{left:var(--space-3);color:var(--color-text-faint);pointer-events:none;position:absolute}.preview-content .bases-search-input{border-radius:inherit;min-width:0;box-shadow:none;padding-left:calc(var(--space-3) * 2 + 16px);background:0 0;border:0}.preview-content .bases-search-input:focus{box-shadow:none;border-color:#0000}.preview-content .bases-export-btn{min-height:var(--control-h-md);padding-inline:var(--space-4);font-size:var(--text-sm);font-weight:600}.preview-content .bases-export-btn:hover{border-color:color-mix(in oklab, var(--color-border) 45%, var(--color-primary) 55%)}.preview-content .bases-meta,.preview-content .bases-summary-label,.preview-content .bases-card-label{color:var(--color-text-muted);font-size:var(--text-ui-sm)}.preview-content .bases-meta{min-height:28px;padding:0 var(--space-3);border:1px solid color-mix(in oklab, var(--color-divider) 84%, transparent);border-radius:var(--radius-full);background:color-mix(in oklab, var(--color-surface-offset) 72%, var(--color-surface));box-shadow:inset 0 1px 0 oklch(from var(--color-text) l c h / .04);white-space:nowrap;align-items:center;display:inline-flex}.preview-content .bases-summaries{padding:var(--space-3) var(--space-4);border-top:1px solid color-mix(in oklab, var(--color-divider) 78%, transparent);border-bottom:1px solid var(--color-divider);background:var(--color-surface)}.preview-content .bases-summary{align-items:center;gap:var(--space-2);min-height:30px;padding:0 var(--space-3);border:1px solid color-mix(in oklab, var(--color-divider) 84%, transparent);background:var(--color-surface);box-shadow:inset 0 1px 0 oklch(from var(--color-text) l c h / .04);border-radius:999px;display:inline-flex}.preview-content .bases-summary-value{font-weight:600}.preview-content .bases-content{padding:var(--space-4)}.preview-content .bases-group+.bases-group{margin-top:var(--space-5)}.preview-content .bases-group-header{justify-content:space-between;align-items:center;gap:var(--space-2);margin-bottom:var(--space-3);flex-wrap:wrap;display:flex}.preview-content .bases-group-header h3{margin:0}.preview-content .bases-table-shell{border:1px solid color-mix(in oklab, var(--color-divider) 88%, transparent);border-radius:calc(var(--radius-lg) + 1px);background:var(--color-surface);box-shadow:inset 0 1px 0 oklch(from var(--color-text) l c h / .04);overflow-x:auto}.preview-content .bases-table{border-collapse:separate;border-spacing:0;width:100%;min-width:620px}.preview-content .bases-table th,.preview-content .bases-table td{padding:var(--space-3);border-bottom:1px solid var(--color-divider);text-align:left;vertical-align:top}.preview-content .bases-table th{z-index:1;background:color-mix(in oklab, var(--color-surface-offset) 72%, var(--color-surface));color:var(--color-text-muted);font-size:var(--text-ui-sm);white-space:nowrap;font-weight:600;position:sticky;top:0}.preview-content .bases-table tbody tr{transition:background var(--transition-interactive)}.preview-content .bases-table tbody tr:nth-child(2n){background:color-mix(in oklab, var(--color-surface-offset) 24%, transparent)}.preview-content .bases-table tbody tr:hover{background:color-mix(in oklab, var(--color-primary) 6%, var(--color-surface-offset))}.preview-content .bases-table tbody tr:last-child td{border-bottom:0}.preview-content .bases-list,.preview-content .bases-cards{max-width:none;margin:0;padding:0}.preview-content .bases-list{gap:var(--space-2);list-style:none;display:grid}.preview-content .bases-list-item{gap:var(--space-3);padding:var(--space-3);border:1px solid color-mix(in oklab, var(--color-divider) 88%, transparent);border-radius:var(--radius-lg);background:var(--color-surface);box-shadow:inset 0 1px 0 oklch(from var(--color-text) l c h / .04);flex-wrap:wrap;display:flex}.preview-content .bases-list-field{gap:2px;min-width:min(220px,100%);display:grid}.preview-content .bases-cards{gap:var(--space-3);grid-template-columns:repeat(auto-fit,minmax(240px,1fr));display:grid}.preview-content .bases-card{border:1px solid var(--color-border);border-radius:calc(var(--radius-lg) + 2px);background:var(--color-surface);box-shadow:var(--shadow-sm);transition:transform var(--transition-interactive), box-shadow var(--transition-interactive), border-color var(--transition-interactive);grid-template-rows:auto 1fr;display:grid;overflow:hidden}.preview-content .bases-card:hover{border-color:color-mix(in oklab, var(--color-border) 58%, var(--color-primary) 42%);box-shadow:var(--shadow-md);transform:translateY(-1px)}.preview-content .bases-card-media{object-fit:cover;background:color-mix(in oklab, var(--color-surface-offset) 50%, var(--color-surface));width:100%;height:140px;display:block}.preview-content .bases-card-media-color{background:var(--bases-card-swatch)}.preview-content .bases-card-body{gap:var(--space-3);padding:var(--space-4);display:grid}.preview-content .bases-card-field+.bases-card-field{padding-top:var(--space-3);border-top:1px solid color-mix(in oklab, var(--color-divider) 84%, transparent);margin-top:0}.preview-content .bases-link-button{min-height:auto;box-shadow:none;color:var(--color-primary);font-size:inherit;font-weight:600;line-height:inherit;background:0 0;border:0;border-radius:0;padding:0}.preview-content .bases-link-button:hover,.preview-content .bases-link-button:focus-visible{box-shadow:none;color:var(--color-primary);background:0 0;border-color:#0000}.preview-content .bases-value-pill{min-height:26px;padding:0 var(--space-3);border:1px solid var(--color-border);background:color-mix(in oklab, var(--color-surface-offset) 44%, var(--color-surface));box-shadow:inset 0 1px 0 oklch(from var(--color-text) l c h / .04);font-size:var(--text-ui-sm);border-radius:999px;align-items:center;display:inline-flex}.preview-content .bases-inline-image{border:1px solid color-mix(in oklab, var(--color-divider) 84%, transparent);border-radius:var(--radius-md);max-width:120px;max-height:80px;box-shadow:var(--shadow-sm);display:block}.preview-content .bases-unsupported{padding:var(--space-4);border:1px dashed var(--color-border);border-radius:var(--radius-lg);color:var(--color-text-muted);background:color-mix(in oklab, var(--color-surface-offset) 52%, var(--color-surface))}@media (width<=900px){.preview-content .bases-toolbar-actions{justify-content:flex-start}.preview-content .bases-search-shell{max-width:none;margin-left:0}.preview-content .bases-panel-section>.bases-sort-row,.preview-content .bases-sort-list>.bases-sort-row,.preview-content .bases-filter-row{grid-template-columns:1fr}.preview-content .bases-sort-row>.ui-button,.preview-content .bases-filter-row>.ui-button{width:100%}}@media (width<=640px){.preview-content .bases-toolbar,.preview-content .bases-panels,.preview-content .bases-summaries,.preview-content .bases-content{padding-inline:var(--space-3)}.preview-content .bases-toolbar-edit-actions,.preview-content .bases-toggle-row,.preview-content .bases-filter-actions-row{width:100%}.preview-content .bases-toolbar-edit-actions{box-shadow:none;background:0 0;border:0;border-radius:0;grid-template-columns:repeat(2,minmax(0,1fr));padding:0;display:grid}.preview-content .bases-toolbar-edit-actions>.ui-button,.preview-content .bases-toggle-row>.ui-button,.preview-content .bases-filter-actions-row>.ui-button{flex:140px}.preview-content .bases-toolbar-edit-actions>.ui-button{width:100%;min-width:0}.preview-content .bases-toolbar-edit-actions>.ui-button:last-child:nth-child(odd){grid-column:1/-1}.preview-content .bases-property-option{grid-template-columns:auto minmax(0,1fr)}.preview-content .bases-property-option-meta{grid-column:2}.preview-content .bases-table{min-width:540px}}.preview-content a{color:var(--color-primary);border-bottom:1px solid oklch(from var(--color-primary) l c h / .3);transition:border-color var(--transition-interactive);text-decoration:none}.preview-content a:hover{border-bottom-color:var(--color-primary)}.preview-content strong{font-weight:600}.preview-content em{font-style:italic}.preview-content del{color:var(--color-text-muted);text-decoration:line-through}.preview-content ul,.preview-content ol{margin-bottom:var(--space-4);padding-left:var(--space-6)}.preview-content li{margin-bottom:var(--space-1)}.preview-content li>ul,.preview-content li>ol{margin-top:var(--space-1);margin-bottom:0}.preview-content .task-list-item{list-style:none;position:relative}.preview-content .task-list-item input[type=checkbox]{top:.5em;left:calc(var(--space-5) * -1);accent-color:var(--color-primary);cursor:pointer;vertical-align:top;margin:0;position:absolute}.preview-content blockquote{margin:var(--space-4) 0;padding:var(--space-3) var(--space-5);border-left:3px solid var(--color-primary);border-radius:0 var(--radius-md) var(--radius-md) 0;background:var(--color-surface);color:var(--color-text-muted)}.preview-content blockquote p:last-child{margin-bottom:0}.preview-content code{border-radius:var(--radius-sm);background:var(--color-surface-offset);color:var(--color-primary);font-family:var(--font-mono);padding:2px 6px;font-size:.875em}.preview-content pre{max-width:100%;margin:var(--space-4) 0;border:1px solid var(--color-border);border-radius:var(--radius-lg);background:var(--color-surface);-webkit-overflow-scrolling:touch;overflow-x:auto}.preview-content pre code{width:fit-content;min-width:100%;padding:var(--space-4);color:var(--color-text);font-size:var(--text-ui-sm);white-space:pre;word-wrap:normal;overflow-wrap:normal;background:0 0;line-height:1.6;display:block}.preview-content .table-wrapper{margin:var(--space-4) 0;border:1px solid var(--color-border);border-radius:var(--radius-md);-webkit-overflow-scrolling:touch;overflow-x:auto}.preview-content table{border-collapse:collapse;white-space:nowrap;width:100%;min-width:100%}.preview-content th,.preview-content td{padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--color-divider);text-align:left;font-size:var(--text-sm)}.preview-content th{background:var(--color-surface-offset);color:var(--color-text-muted);font-size:var(--text-xs);letter-spacing:.03em;text-transform:uppercase;font-weight:600}.preview-content tr:last-child td{border-bottom:none}.preview-content tr:hover td{background:var(--color-surface-offset)}.preview-content hr{height:1px;margin:var(--space-8) 0;background:var(--color-divider);border:none}.preview-content img{max-width:100%;height:auto;margin:var(--space-4) 0;border-radius:var(--radius-md);cursor:zoom-in}@media (width<=768px){.preview-content .frontmatter-header{flex-flow:row;align-items:center}.preview-content .frontmatter-toggle{margin-left:auto}.preview-content .frontmatter-property{gap:var(--space-1);grid-template-columns:1fr}}[data-theme=light] .preview-content pre,[data-theme=light] .preview-content pre code,[data-theme=light] .hljs{background:var(--color-surface)!important}html[data-surface=export-document]{overscroll-behavior:auto;scrollbar-width:none;height:auto;min-height:100%;overflow:hidden}body[data-surface=export-document]{overscroll-behavior:auto;background:var(--color-bg);height:auto;color:var(--color-text);scrollbar-width:none;overflow:hidden}html[data-surface=export-document]::-webkit-scrollbar{display:none}body[data-surface=export-document]::-webkit-scrollbar{display:none}.export-page-shell{width:min(960px,100vw - 48px);margin:0 auto;padding:32px 0 72px}.export-page-header{justify-content:space-between;align-items:flex-start;margin-bottom:20px;display:flex}.export-page-header h1{margin-bottom:6px;font-size:28px}.export-page-header p{color:var(--color-text-muted);max-width:none}.export-warnings-panel{border:1px solid var(--border-warning-toast);background:var(--surface-warning-toast);color:var(--text-warning-toast);border-radius:12px;margin-bottom:20px;padding:14px 16px}.export-warnings-panel h2{margin-bottom:6px;font-size:14px}.export-warnings-panel ul{padding-left:20px}.export-content{border:1px solid var(--color-divider);background:var(--color-surface);box-shadow:var(--shadow-card-strong);border-radius:20px;padding:32px 40px}.export-content p,.export-content li,.export-content blockquote{max-width:none}.export-content .task-list-item input[type=checkbox]{cursor:default}.export-content .table-wrapper,.export-content .bases-table-shell,.export-content pre{overflow:visible}.export-content table{white-space:normal}.export-content pre code{white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;width:auto}.export-diagram{justify-content:center;margin:18px 0 22px;display:flex}.export-diagram-surface,.export-diagram-image{border:1px solid var(--color-divider);background:var(--color-surface);border-radius:14px;max-width:100%;margin:0}.export-diagram-surface{display:inline-block;overflow:hidden}.export-diagram-image,.export-diagram-svg{width:auto;max-width:100%;height:auto;display:block}.export-video-poster{margin:18px 0 22px}.export-video-poster-card{border:1px solid var(--color-divider);background:var(--surface-fill-subtle);border-radius:14px;padding:16px 18px;overflow:hidden}.export-video-poster-media{border-bottom:1px solid var(--color-divider);background:var(--color-surface-offset);margin:-16px -18px 14px;position:relative;overflow:hidden}.export-video-poster-image{object-fit:cover;width:100%;height:auto;max-height:360px;display:block}.export-video-play-badge{background:oklch(from var(--color-surface) l c h / .86);min-width:72px;color:var(--color-text);text-align:center;box-shadow:var(--shadow-lg);border-radius:999px;padding:8px 14px;font-size:14px;font-weight:700;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.export-video-poster-copy{flex-direction:column;gap:4px;display:flex}.export-video-poster-meta{color:var(--color-text-muted);margin-top:4px;font-size:13px;display:block}.export-video-link{word-break:break-word;margin-top:8px;display:inline-block}.export-warning{border:1px solid var(--border-warning-toast);background:var(--surface-warning-toast);color:var(--text-warning-toast);border-radius:12px;padding:12px 14px}.drawio-export-iframe{opacity:0;pointer-events:none;border:0;width:0;height:0;position:absolute}@media print{html[data-surface=export-document],body[data-surface=export-document]{background:var(--color-surface);scrollbar-width:none;height:auto;overflow:hidden!important}html[data-surface=export-document]::-webkit-scrollbar{display:none}body[data-surface=export-document]::-webkit-scrollbar{display:none}.export-content ::-webkit-scrollbar{display:none}.export-page-shell{width:auto;margin:0;padding:0}.export-page-header,.export-warnings-panel{display:none}.export-content{width:auto;box-shadow:none;border:0;border-radius:0;padding:0;overflow:visible}.export-content pre,.export-content .table-wrapper,.export-content .bases-table-shell{overflow:visible!important}.export-content pre code{white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;width:auto}.export-content h1,.export-content h2,.export-content h3,.export-content h4,.export-content h5,.export-content h6{break-after:avoid-page;page-break-after:avoid}.export-content h1+*,.export-content h2+*,.export-content h3+*,.export-content h4+*,.export-content h5+*,.export-content h6+*{break-before:avoid-page;page-break-before:avoid}.export-content pre,.export-content blockquote,.export-content table,.export-content figure,.export-content img{break-inside:avoid}.export-content .export-keep-with-next{break-inside:avoid-page;page-break-inside:avoid}.export-content p,.export-content li,.export-content blockquote{orphans:3;widows:3}}
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./export-page-Cby8JzPO.js","./preload-helper-HclGiUj8.js","./file-kind-BKPOIRPE.js","./preview-render-compiler-BSaQO_p3.js","./preview-render-profile-BZzGSg6K.js","./rolldown-runtime-Dd_uD5pT.js","./vault-utils-wdQ0RNR9.js","./runtime-paths-DvpihCEq.js","./runtime-config-CDgeuPWN.js","./browser-utils-CKtI_rZl.js","./excalidraw-scene-BvsQ6mLP.js","./chunk-AXR3VHVW-0GTk_evH.js","./chunk-SRAX5OIU-KFQikY-4.js","./jsx-runtime-BpzPEenQ.js","./chunk-CZQZEIFA-DT3N9fo7.js","./chunk-7XWMRXBY-CfMzEq80.js","./excalidraw-mermaid-stub-BNckbX2n.js","./preview-diagram-utils-n_bbJA9V.js"])))=>i.map(i=>d[i]);
2
- import{t as e}from"./runtime-config-loader-BHGniHP5.js";import{t}from"./preload-helper-HclGiUj8.js";import{t as n}from"./base-CxPEiHuy.js";function r(){let e=document.getElementById(`hljs-theme`);e instanceof HTMLLinkElement||(e=document.createElement(`link`),e.id=`hljs-theme`,e.rel=`stylesheet`,document.head.appendChild(e)),e.href=n}await e(),r(),await t(()=>import(`./export-page-Cby8JzPO.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]),import.meta.url);
@@ -1,112 +0,0 @@
1
- import{n as e}from"./vault-utils-wdQ0RNR9.js";import{c as t,l as n}from"./vault-paths-CVkuh0j-.js";import{t as r}from"./button-BCEiw4Rw.js";var i=30;function a(r=``){let i=t(r),a=n(r);return a?`
2
- <span class="file-history-path">${e(i)}</span>
3
- <span class="file-history-dir">${e(a)}</span>
4
- `:`<span class="file-history-path">${e(i)}</span>`}function o(t={}){let n=[String(t.authorName||`Unknown`),String(t.relativeDateLabel||``)];return t.status===`renamed`&&t.oldPath&&n.push(`Renamed from ${t.oldPath}`),n.filter(Boolean).map(t=>e(t)).join(` · `)}function s(e={}){return e.type===`local`?`local`:`commit:${String(e.hash||``).trim()}:${String(e.pathAtCommit||``).trim()}`}function c(){return{commits:[],error:``,hasMore:!1,loaded:!1,loading:!1,loadingMore:!1,offset:0}}var l=class{constructor({diffRenderer:e=null,gitApiClient:t=null,onOpenCommitDiff:n=()=>{},onOpenFile:r=()=>{},onOpenPreview:i=()=>{},onOpenWorkspaceDiff:a=()=>{},toastController:o=null}={}){this.diffRenderer=e,this.gitApiClient=t,this.onOpenCommitDiff=n,this.onOpenFile=r,this.onOpenPreview=i,this.onOpenWorkspaceDiff=a,this.toastController=o,this.page=document.getElementById(`diff-page`),this.content=document.getElementById(`diffContent`),this.fileIndicator=document.getElementById(`diffFileIndicator`),this.openEditorButton=document.getElementById(`diffOpenEditorBtn`),this.primaryActionButton=document.getElementById(`diffPrimaryActionBtn`),this.commitButton=document.getElementById(`diffCommitBtn`),this.backToHistoryButton=document.getElementById(`diffBackToHistoryBtn`),this.gitActionsGroup=document.getElementById(`diffGitActionsGroup`),this.editorActionsGroup=document.getElementById(`diffEditorActionsGroup`),this.actionsDivider=document.getElementById(`diffToolbarDivider`),this.stats=document.getElementById(`diffStats`),this.prevButton=document.getElementById(`diffPrevBtn`),this.nextButton=document.getElementById(`diffNextBtn`),this.layoutToggle=document.getElementById(`diffLayoutToggle`),this.modeButtons=Array.from(document.querySelectorAll(`[data-diff-mode]`)),this.isActive=!1,this.currentFilePath=null,this.localChanges=null,this.history=c(),this.diffMode=`unified`,this.selectedEntryKey=null,this.detailCache=new Map,this.detailErrors=new Map,this.historyListElement=null,this.historyListScrollTop=0,this.loadingEntryKey=null,this.selectionRequestToken=0}initialize(){this.openEditorButton?.addEventListener(`click`,()=>{this.isActive&&this.currentFilePath&&this.onOpenFile?.(this.currentFilePath)}),this.modeButtons.forEach(e=>{e.addEventListener(`click`,()=>{if(!this.isActive)return;let t=e.getAttribute(`data-diff-mode`);!t||t===this.diffMode||(this.diffMode=t,this.render())})}),this.content?.addEventListener(`click`,e=>{if(!this.isActive)return;let t=e.target instanceof Element?e.target.closest(`[data-file-history-select]`):null;if(t){let e=this.findEntryByKey(t.getAttribute(`data-file-history-select`));e&&this.selectEntry(e);return}if(e.target instanceof Element&&e.target.closest(`[data-file-history-open-selected-diff]`)){this.openSelectedDiff();return}if(e.target instanceof Element&&e.target.closest(`[data-file-history-open-selected-preview]`)){this.openSelectedPreview();return}e.target instanceof Element&&e.target.closest(`[data-file-history-load-more]`)&&this.loadMore()})}hide(){this.isActive=!1,this.page?.classList.add(`hidden`),this.content?.classList.remove(`diff-content--history`),this.content&&(this.content.innerHTML=``),this.currentFilePath=null,this.localChanges=null,this.history=c(),this.selectedEntryKey=null,this.loadingEntryKey=null,this.detailCache.clear(),this.detailErrors.clear(),this.historyListElement=null,this.historyListScrollTop=0,this.selectionRequestToken=0}getEntries(){let e=[];this.localChanges&&e.push({...this.localChanges,key:`local`,label:`Local changes`,pathAtCommit:this.currentFilePath,type:`local`});for(let t of this.history.commits??[])e.push({...t,key:s({...t,type:`commit`}),type:`commit`});return e}findEntryByKey(e){return this.getEntries().find(t=>t.key===e)??null}getSelectedEntry(){return this.findEntryByKey(this.selectedEntryKey)}getDefaultEntry(){return this.getEntries()[0]??null}getSelectedDetailState(){let e=this.getSelectedEntry();return e?{detail:this.detailCache.get(e.key)??null,entry:e,error:this.detailErrors.get(e.key)??``,loading:this.loadingEntryKey===e.key}:null}async openFileHistory({filePath:e}){this.isActive=!0,this.currentFilePath=String(e??``).trim()||null,this.localChanges=null,this.history={...c(),loading:!0},this.selectedEntryKey=null,this.loadingEntryKey=null,this.detailCache.clear(),this.detailErrors.clear(),this.historyListElement=null,this.historyListScrollTop=0,this.selectionRequestToken=0,this.renderLoading();try{let[e,t]=await Promise.all([this.loadLocalChanges().catch(()=>null),this.fetchHistoryPage({offset:0})]);this.localChanges=e,this.history=t;let n=this.getDefaultEntry();return n?(await this.selectEntry(n),{history:t,localChanges:e}):(this.render(),{history:t,localChanges:e})}catch(e){return console.error(`[file-history] Failed to load file history:`,e),this.toastController?.show(`Failed to load file history`),this.localChanges=null,this.history={...c(),error:`Failed to load file history`,loaded:!0},this.render(),{history:this.history,localChanges:null}}}async loadLocalChanges(){if(!this.currentFilePath)return null;let e=await this.gitApiClient.readDiff({metaOnly:!0,path:this.currentFilePath,scope:`all`}),t=e.files?.[0];return t?{...t,summary:e.summary??{additions:Number(t.stats?.additions||0),deletions:Number(t.stats?.deletions||0),filesChanged:1}}:null}async fetchHistoryPage({offset:e=0}={}){if(!this.currentFilePath)return{...c(),loaded:!0};let t=await this.gitApiClient.readFileHistory({limit:i,offset:e,path:this.currentFilePath}),n=Array.isArray(t.commits)?t.commits:[];return{commits:n,error:``,hasMore:!!t.hasMore,loaded:!0,loading:!1,loadingMore:!1,offset:e+n.length}}async loadSelectedDetail(e){if(!e)return null;if(e.type===`local`){let t=await this.gitApiClient.readDiff({path:this.currentFilePath||``,scope:`all`});return{detail:t.files?.[0]??null,summary:t.summary??e.summary??null}}let t=await this.gitApiClient.readCommit({hash:e.hash||``,path:e.pathAtCommit||``});return{commit:t.commit??null,detail:t.files?.[0]??null,summary:t.summary??null}}async selectEntry(e){if(!e)return null;let t=e.key||s(e);this.selectedEntryKey=t,this.detailErrors.delete(t);let n=this.detailCache.get(t);if(n)return this.loadingEntryKey=null,this.render(),n;this.loadingEntryKey=t,this.render();let r=++this.selectionRequestToken;try{let n=await this.loadSelectedDetail(e);return this.detailCache.set(t,n),this.detailErrors.delete(t),r===this.selectionRequestToken&&this.selectedEntryKey===t&&(this.loadingEntryKey=null,this.render()),n}catch(n){return console.error(`[file-history] Failed to load selected diff:`,n),this.toastController?.show(e.type===`local`?`Failed to load local diff`:`Failed to load commit diff`),this.detailErrors.set(t,e.type===`local`?`Failed to load local diff`:`Failed to load commit diff`),r===this.selectionRequestToken&&this.selectedEntryKey===t&&(this.loadingEntryKey=null,this.render()),null}}async loadMore(){if(!(!this.currentFilePath||this.history.loading||this.history.loadingMore||!this.history.hasMore)){this.history={...this.history,error:``,loadingMore:!0},this.render();try{let e=await this.fetchHistoryPage({offset:this.history.offset});this.history={commits:[...this.history.commits,...e.commits],error:``,hasMore:e.hasMore,loaded:!0,loading:!1,loadingMore:!1,offset:e.offset},this.render()}catch(e){console.error(`[file-history] Failed to load more history:`,e),this.toastController?.show(`Failed to load file history`),this.history={...this.history,error:`Failed to load file history`,loadingMore:!1},this.render()}}}openSelectedDiff(){let e=this.getSelectedEntry();if(e){if(e.type===`local`){this.onOpenWorkspaceDiff?.(this.currentFilePath);return}this.onOpenCommitDiff?.(e.hash,{historyFilePath:this.currentFilePath,path:e.pathAtCommit})}}openSelectedPreview(){let e=this.getSelectedEntry();!e||e.type!==`commit`||this.onOpenPreview?.({currentFilePath:this.currentFilePath,hash:e.hash,path:e.pathAtCommit})}renderDiffFileHeader(t={}){return typeof this.diffRenderer?.renderFileHeader==`function`?this.diffRenderer.renderFileHeader(t):`
5
- <div class="diff-file-header">
6
- <span class="diff-file-path">${e(t.path||this.currentFilePath||``)}</span>
7
- </div>
8
- `}renderDiffMarkup(e={}){if(typeof this.diffRenderer?.renderDiffDetail==`function`){let t=this.diffRenderer.mode;this.diffRenderer.mode=this.diffMode;let n=this.diffRenderer.renderDiffDetail(e,0,{includeHeader:!0});return this.diffRenderer.mode=t,n}return`
9
- ${this.renderDiffFileHeader(e)}
10
- <div class="diff-empty-state">Diff renderer unavailable.</div>
11
- `}syncToolbar(){let e=this.getSelectedDetailState(),t=e?.entry??null,n=e?.detail?.summary??t?.summary??(t?{additions:Number(t.additions||0),deletions:Number(t.deletions||0)}:null),r=!!t;this.syncToolbarIndicators(t,n,r),this.syncToolbarButtonStates(r)}syncToolbarIndicators(e,t,n){let r=Number(t?.additions||0),i=Number(t?.deletions||0);this.fileIndicator&&(this.fileIndicator.textContent=e?.type===`commit`?e.shortHash||`Commit`:e?.type===`local`?`Local changes`:`History`),this.stats&&(this.stats.innerHTML=`
12
- <span class="ui-stat-token ui-stat-token--add diff-stats-add">+${r}</span>
13
- <span class="ui-stat-token ui-stat-token--del diff-stats-del">-${i}</span>
14
- `,this.stats.classList.toggle(`hidden`,!n))}syncToolbarButtonStates(e){this.backToHistoryButton?.classList.add(`hidden`),this.gitActionsGroup?.classList.add(`hidden`),this.layoutToggle?.classList.add(`hidden`),this.prevButton?.classList.add(`hidden`),this.nextButton?.classList.add(`hidden`),this.actionsDivider?.classList.add(`hidden`),this.editorActionsGroup?.classList.remove(`hidden`),this.modeButtons.forEach(t=>{t.classList.toggle(`hidden`,!e),t.classList.toggle(`active`,t.getAttribute(`data-diff-mode`)===this.diffMode)}),this.openEditorButton?.toggleAttribute(`disabled`,!this.currentFilePath),this.openEditorButton&&(this.openEditorButton.textContent=`Open File`),this.primaryActionButton?.toggleAttribute(`disabled`,!0),this.commitButton?.toggleAttribute(`disabled`,!0)}renderLoading(){this.isActive&&(this.page?.classList.remove(`hidden`),this.content&&(this.content.classList.add(`diff-content--history`),this.content.innerHTML=`<div class="git-panel-empty">Loading file history...</div>`),this.historyListElement=null,this.syncToolbar())}renderEmpty(t){this.isActive&&(this.page?.classList.remove(`hidden`),this.content&&(this.content.classList.add(`diff-content--history`),this.content.innerHTML=`<div class="git-panel-empty">${e(t)}</div>`),this.historyListElement=null,this.syncToolbar())}captureListScroll(){this.historyListElement&&(this.historyListScrollTop=Number(this.historyListElement.scrollTop||0))}restoreListScroll(){if(!this.content?.querySelector){this.historyListElement=null;return}let e=this.content.querySelector(`[data-file-history-list]`);this.historyListElement=e??null,e&&(e.scrollTop=this.historyListScrollTop,e.addEventListener(`scroll`,()=>{this.historyListScrollTop=Number(e.scrollTop||0)},{passive:!0}))}renderScopeLabels(e={}){let t=[];return e.hasStagedChanges&&t.push(`staged`),e.hasWorkingTreeChanges&&t.push(`working tree`),e.hasUntrackedChanges&&t.push(`untracked`),t.length>0?t.join(` · `):`working tree`}renderHistoryItem(t={}){let n=t.key===this.selectedEntryKey,r=Number(t.additions??t.summary?.additions??0),i=Number(t.deletions??t.summary?.deletions??0),a=t.type===`local`?`Live workspace`:o(t),s=t.type===`local`?`Local changes`:t.subject||t.shortHash||`Commit`,c=t.type===`local`?`<span class="ui-pill-badge ui-pill-badge--accent file-history-item-badge">Live</span>`:`<span class="ui-pill-badge ui-pill-badge--code file-history-item-badge">${e(t.shortHash||``)}</span>`;return`
15
- <button
16
- class="ui-record-surface file-history-item${n?` active`:``}${t.type===`local`?` file-history-item-local`:``}"
17
- type="button"
18
- data-file-history-select="${e(t.key)}"
19
- aria-current="${n?`true`:`false`}"
20
- >
21
- <span class="file-history-item-top">
22
- <span class="file-history-item-copy">
23
- <span class="file-history-item-title">${e(s)}</span>
24
- <span class="file-history-item-meta">${t.type===`local`?e(this.renderScopeLabels(t)):a}</span>
25
- </span>
26
- ${c}
27
- </span>
28
- <span class="file-history-item-stats">
29
- <span class="git-change-add">+${r}</span>
30
- <span class="git-change-del">-${i}</span>
31
- </span>
32
- </button>
33
- `}renderSelectedHeader(t){let n=t?.entry;return n?`
34
- <div class="file-history-detail-header">
35
- <div class="file-history-detail-copy">
36
- <span class="file-history-detail-kicker">${n.type===`local`?`Live workspace`:`Commit ${e(n.shortHash||``)}`}</span>
37
- <h2 class="file-history-detail-title">${n.type===`local`?`Local changes`:e(n.subject||n.shortHash||`Commit`)}</h2>
38
- <p class="file-history-detail-meta">${n.type===`local`?e(this.renderScopeLabels(n)):o(n)}</p>
39
- </div>
40
- <div class="file-history-detail-actions">
41
- <button
42
- class="${r({variant:`secondary`,action:!0,surface:!0})}"
43
- type="button"
44
- data-file-history-open-selected-diff
45
- >
46
- Open Standalone Diff
47
- </button>
48
- ${n.type===`commit`?`
49
- <button
50
- class="${r({variant:`primary`,action:!0})}"
51
- type="button"
52
- data-file-history-open-selected-preview
53
- >
54
- Preview File
55
- </button>
56
- `:``}
57
- </div>
58
- </div>
59
- `:`
60
- <div class="file-history-detail-header">
61
- <div class="file-history-detail-copy">
62
- <span class="file-history-detail-kicker">History</span>
63
- <h2 class="file-history-detail-title">No selection</h2>
64
- <p class="file-history-detail-meta">Choose a history item to inspect the file diff.</p>
65
- </div>
66
- </div>
67
- `}renderSelectedBody(t){let n=t?.entry;return n?t.loading?`
68
- <section class="diff-file-block file-history-diff-block">
69
- ${this.renderDiffFileHeader({path:n.pathAtCommit||this.currentFilePath||``})}
70
- <div class="diff-empty-state">Loading diff...</div>
71
- </section>
72
- `:t.error?`
73
- <section class="diff-file-block file-history-diff-block">
74
- ${this.renderDiffFileHeader({path:n.pathAtCommit||this.currentFilePath||``})}
75
- <div class="diff-empty-state">${e(t.error)}</div>
76
- </section>
77
- `:t.detail?.detail?`
78
- <section class="diff-file-block file-history-diff-block">
79
- ${this.renderDiffMarkup(t.detail.detail)}
80
- </section>
81
- `:`<div class="diff-empty-state">No diff available for this history item.</div>`:`<div class="diff-empty-state">Select a history entry to inspect this file.</div>`}render(){if(!this.isActive)return;if(this.page?.classList.remove(`hidden`),this.captureListScroll(),this.syncToolbar(),!this.currentFilePath){this.renderEmpty(`No file selected.`);return}if(this.history.loading&&!this.history.loaded){this.renderLoading();return}if(!(this.localChanges||(this.history.commits?.length??0)>0)){this.renderEmpty(this.history.error||`No history found for this file.`);return}if(!this.content)return;this.content.classList.add(`diff-content--history`);let e=this.getSelectedDetailState();this.content.innerHTML=`
82
- <section class="file-history-shell">
83
- <aside class="file-history-sidebar" aria-label="File history entries">
84
- <header class="file-history-sidebar-header">
85
- <span class="file-history-kicker">File history</span>
86
- <div class="file-history-title">${a(this.currentFilePath)}</div>
87
- <p class="file-history-sidebar-copy">Select an entry to inspect the exact changes for this file.</p>
88
- </header>
89
- <div class="file-history-list" data-file-history-list>
90
- ${this.getEntries().map(e=>this.renderHistoryItem(e)).join(``)}
91
- </div>
92
- ${this.history.hasMore?`
93
- <div class="git-history-footer file-history-footer">
94
- <button
95
- class="${r({variant:`secondary`,size:`compact`,action:!0,surface:!0,extra:`git-history-load-more`})}"
96
- type="button"
97
- data-file-history-load-more
98
- ${this.history.loadingMore?`disabled`:``}
99
- >
100
- ${this.history.loadingMore?`Loading...`:`Load More`}
101
- </button>
102
- </div>
103
- `:``}
104
- </aside>
105
- <section class="file-history-detail">
106
- ${this.renderSelectedHeader(e)}
107
- <div class="file-history-detail-body">
108
- ${this.renderSelectedBody(e)}
109
- </div>
110
- </section>
111
- </section>
112
- `,this.restoreListScroll()}};export{l as FileHistoryViewController};
@@ -1 +0,0 @@
1
- var e=Object.freeze([`.md`,`.markdown`,`.mdx`]),t=`.base`,n=`.excalidraw`,r=`.drawio`,i=Object.freeze([`.mmd`,`.mermaid`]),a=Object.freeze([`.puml`,`.plantuml`]),o=Object.freeze([`.png`,`.jpg`,`.jpeg`,`.webp`,`.gif`,`.svg`]),s=Object.freeze([n,r,...i,...a]),c=Object.freeze([...e,t,...s,...o]),l=/\.(?:md|markdown|mdx|base|excalidraw|drawio|mmd|mermaid|puml|plantuml|png|jpe?g|webp|gif|svg)$/i;function u(e){return String(e??``).trim().toLowerCase()}function d(e,t){let n=u(e);return t.some(e=>n.endsWith(e))}function f(t){return d(t,e)?`markdown`:d(t,[`.base`])?`base`:d(t,[`.excalidraw`])?`excalidraw`:d(t,[`.drawio`])?`drawio`:d(t,i)?`mermaid`:d(t,a)?`plantuml`:d(t,o)?`image`:null}function p(e){let t=f(e);return t?t===`image`?`image`:t===`base`?`base`:t===`markdown`?`file`:t:null}function m(e){let t=u(e);return c.find(e=>t.endsWith(e))??``}function h(e){return f(e)===`markdown`}function g(e){return f(e)===`excalidraw`}function _(e){return f(e)===`base`}function v(e){return f(e)===`mermaid`}function y(e){return f(e)===`drawio`}function b(e){return f(e)===`plantuml`}function x(e){return f(e)===`image`}function S(e){let t=f(e);return t===`excalidraw`||t===`drawio`||t===`mermaid`||t===`plantuml`}function C(e){return f(e)!==null}function w(e){let t=f(e);return t===`markdown`||t===`mermaid`||t===`plantuml`}function T(e){return C(e)}function E(e){return String(e??``).replace(l,``)}export{S as a,x as c,b as d,E as f,_ as i,h as l,w as m,f as n,y as o,T as p,p as r,g as s,m as t,v as u};
@@ -1,150 +0,0 @@
1
- import{n as e}from"./vault-utils-wdQ0RNR9.js";import{c as t,l as n}from"./vault-paths-CVkuh0j-.js";import{t as r}from"./button-BCEiw4Rw.js";function i(e){return`diff-section-${encodeURIComponent(String(e??``)).replace(/%/g,`_`)}`}function a(e){switch(e){case`added`:case`untracked`:return`ui-status-badge--success`;case`deleted`:return`ui-status-badge--danger`;case`renamed`:return`ui-status-badge--accent`;default:return`ui-status-badge--warning`}}function o(e=!1){return`<svg class="diff-section-chevron${e?` collapsed`:``}" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg>`}function s(e,t){let n=0;for(;n<e.length&&n<t.length&&e[n]===t[n];)n+=1;return n}function c(e,t,n){let r=0,i=Math.min(e.length,t.length)-n;for(;r<i;){let n=e.length-1-r,i=t.length-1-r;if(e[n]!==t[i])break;r+=1}return r}function l(t,n){let r=s(t,n),i=c(t,n,r),a=Math.max(r,t.length-i),o=Math.max(r,n.length-i);return{leftHtml:`${e(t.slice(0,r))}${a>r?`<span class="diff-highlight-del">${e(t.slice(r,a))}</span>`:``}${e(t.slice(a))}`,rightHtml:`${e(n.slice(0,r))}${o>r?`<span class="diff-highlight-add">${e(n.slice(r,o))}</span>`:``}${e(n.slice(o))}`}}function u(e=[]){let t=[];for(let n=0;n<e.length;n+=1){let r=e[n];if(r.type===`context`||r.type===`note`){t.push({additions:[],context:[r],deletions:[]});continue}if(r.type!==`deletion`&&r.type!==`addition`)continue;let i=[],a=[];for(;n<e.length&&e[n].type===`deletion`;)i.push(e[n]),n+=1;for(;n<e.length&&e[n].type===`addition`;)a.push(e[n]),n+=1;--n,t.push({additions:a,context:[],deletions:i})}return t}function d(t,n,r){let i=Number.isInteger(t.oldLine)?t.oldLine:``,a=Number.isInteger(t.newLine)?t.newLine:``,o=t.type===`note`?`note`:t.type,s=t.type===`context`||t.type===`note`?` `:n;return`
2
- <div class="diff-line ${o}">
3
- <div class="diff-line-numbers">
4
- <span class="diff-line-num">${i}</span>
5
- <span class="diff-line-num">${a}</span>
6
- </div>
7
- <div class="diff-line-prefix">${e(s)}</div>
8
- <div class="diff-line-content">${r}</div>
9
- </div>
10
- `}function f(t,n){let r=t?e(t.content):``,i=n?e(n.content):``;if(t&&n&&t.type===`deletion`&&n.type===`addition`){let e=l(t.content,n.content);r=e.leftHtml,i=e.rightHtml}return`
11
- <div class="diff-split-row">
12
- <div class="diff-split-line ${t?.type||`empty`}">
13
- <span class="diff-split-num">${Number.isInteger(t?.oldLine)?t.oldLine:``}</span>
14
- <span class="diff-split-content">${r}</span>
15
- </div>
16
- <div class="diff-split-line ${n?.type||`empty`}">
17
- <span class="diff-split-num">${Number.isInteger(n?.newLine)?n.newLine:``}</span>
18
- <span class="diff-split-content">${i}</span>
19
- </div>
20
- </div>
21
- `}var p=class{constructor({gitApiClient:e=null,onBackToHistory:t=null,onCommitStaged:n=null,onOpenFile:r=null,onStageFile:i=null,onUnstageFile:a=null,toastController:o=null}={}){this.gitApiClient=e,this.onBackToHistory=t,this.onCommitStaged=n,this.onOpenFile=r,this.onStageFile=i,this.onUnstageFile=a,this.toastController=o,this.page=document.getElementById(`diff-page`),this.content=document.getElementById(`diffContent`),this.scrollContainer=document.getElementById(`diffScroll`),this.fileIndicator=document.getElementById(`diffFileIndicator`),this.openEditorButton=document.getElementById(`diffOpenEditorBtn`),this.primaryActionButton=document.getElementById(`diffPrimaryActionBtn`),this.commitButton=document.getElementById(`diffCommitBtn`),this.backToHistoryButton=document.getElementById(`diffBackToHistoryBtn`),this.gitActionsGroup=document.getElementById(`diffGitActionsGroup`),this.editorActionsGroup=document.getElementById(`diffEditorActionsGroup`),this.actionsDivider=document.getElementById(`diffToolbarDivider`),this.stats=document.getElementById(`diffStats`),this.prevButton=document.getElementById(`diffPrevBtn`),this.nextButton=document.getElementById(`diffNextBtn`),this.layoutToggle=document.getElementById(`diffLayoutToggle`),this.modeButtons=Array.from(document.querySelectorAll(`[data-diff-mode]`)),this.layoutButtons=Array.from(document.querySelectorAll(`[data-diff-layout]`)),this.isActive=!1,this.mode=`unified`,this.layoutMode=`focused`,this.source=`workspace`,this.data=null,this.currentIndex=0,this.activeFilePath=null,this.fileCache=new Map,this.fileErrors=new Map,this.loadingFiles=new Set,this.collapsedFiles=new Set,this.fileLoadPromises=new Map,this.requestScope=`all`,this.commitHash=null,this.commitMeta=null,this.historyFilePath=null,this.pendingAction=null,this.repoStatus=null}initialize(){this.prevButton?.addEventListener(`click`,()=>{this.isActive&&this.navigateFile(-1)}),this.nextButton?.addEventListener(`click`,()=>{this.isActive&&this.navigateFile(1)}),this.backToHistoryButton?.addEventListener(`click`,()=>{this.isActive&&this.commitMeta?.hash&&this.onBackToHistory?.({hash:this.commitMeta.hash,historyFilePath:this.historyFilePath})}),this.openEditorButton?.addEventListener(`click`,()=>{if(!this.isActive||this.source!==`workspace`)return;let e=this.getCurrentFile();e?.path&&this.onOpenFile?.(e.path)}),this.primaryActionButton?.addEventListener(`click`,()=>{if(!this.isActive)return;let e=this.getPrimaryAction();e&&this.handleFileAction(e)}),this.commitButton?.addEventListener(`click`,()=>{this.isActive&&this.handleFileAction(`commit`)}),this.content?.addEventListener(`click`,e=>{if(!this.isActive)return;let t=e.target instanceof Element?e.target.closest(`[data-load-full-diff]`):null;if(t){let e=t.getAttribute(`data-diff-file-path`)||this.activeFilePath;e&&this.loadFileForPath(e,{forceFullPatch:!0});return}let n=e.target instanceof Element?e.target.closest(`[data-diff-section-toggle]`):null;if(n){let e=n.getAttribute(`data-diff-section-toggle`);e&&this.toggleFileSection(e);return}let r=e.target instanceof Element?e.target.closest(`[data-diff-index-path]`):null;if(r){let e=r.getAttribute(`data-diff-index-path`);e&&this.handleIndexSelection(e)}}),this.modeButtons.forEach(e=>{e.addEventListener(`click`,()=>{if(!this.isActive)return;let t=e.getAttribute(`data-diff-mode`);!t||t===this.mode||(this.mode=t,this.render())})}),this.layoutButtons.forEach(e=>{e.addEventListener(`click`,()=>{if(!this.isActive)return;let t=e.getAttribute(`data-diff-layout`);!t||t===this.layoutMode||this.setLayoutMode(t)})}),this.scrollContainer?.addEventListener(`scroll`,()=>{this.isActive&&this.handleScrollSelection()})}hide(){this.isActive=!1,this.page?.classList.add(`hidden`),this.content&&(this.content.innerHTML=``),this.data=null,this.source=`workspace`,this.layoutMode=`focused`,this.currentIndex=0,this.activeFilePath=null,this.fileCache.clear(),this.fileErrors.clear(),this.loadingFiles.clear(),this.collapsedFiles.clear(),this.fileLoadPromises.clear(),this.requestScope=`all`,this.commitHash=null,this.commitMeta=null,this.historyFilePath=null,this.pendingAction=null,this.repoStatus=null}async openWorkspaceDiff({filePath:e=null,scope:t=`all`}={}){this.isActive=!0,this.source=`workspace`,this.layoutMode=`focused`,this.commitHash=null,this.commitMeta=null,this.historyFilePath=null,this.activeFilePath=e,this.fileCache.clear(),this.fileErrors.clear(),this.loadingFiles.clear(),this.collapsedFiles.clear(),this.fileLoadPromises.clear(),this.requestScope=t,this.renderLoading(`Loading diff summary...`);try{let n=await this.gitApiClient.readDiff({metaOnly:!0,path:e,scope:t});this.data=n;let r=e?Math.max(0,n.files.findIndex(t=>t.path===e)):0;return this.currentIndex=r,this.activeFilePath=n.files?.[r]?.path??null,(n.files?.length??0)===0?(this.render(),n):(await this.loadCurrentFile(),n)}catch(e){return console.error(`[git-diff] Failed to load diff:`,e),this.toastController?.show(`Failed to load git diff`),this.data={files:[],metaOnly:!1,source:`workspace`,summary:{additions:0,deletions:0,filesChanged:0}},this.renderEmpty(`Failed to load git diff`),this.data}}async openCommitDiff({hash:e,path:t=null,historyFilePath:n=null}={}){this.isActive=!0,this.source=`commit`,this.layoutMode=`stacked`,this.commitHash=String(e??``).trim()||null,this.commitMeta=null,this.historyFilePath=String(n??``).trim()||null,this.activeFilePath=t||null,this.fileCache.clear(),this.fileErrors.clear(),this.loadingFiles.clear(),this.collapsedFiles.clear(),this.fileLoadPromises.clear(),this.requestScope=`all`,this.renderLoading(`Loading commit summary...`);try{let e=await this.gitApiClient.readCommit({hash:this.commitHash||``,metaOnly:!0});this.data=e,this.commitMeta=e.commit??null;let n=t?Math.max(0,e.files.findIndex(e=>e.path===t)):0;return this.currentIndex=n,this.activeFilePath=e.files?.[n]?.path??null,this.collapsedFiles=new Set((e.files??[]).map(e=>e.path).filter(e=>e&&e!==this.activeFilePath)),(e.files?.length??0)===0?(this.render(),e):(this.activeFilePath&&await this.loadFileForPath(this.activeFilePath,{render:!1}),this.render(),e)}catch(e){return console.error(`[git-diff] Failed to load commit:`,e),this.toastController?.show(`Failed to load git commit`),this.data={commit:null,files:[],metaOnly:!1,source:`commit`,summary:{additions:0,deletions:0,filesChanged:0}},this.commitMeta=null,this.renderEmpty(`Failed to load git commit`),this.data}}async open(e={}){return this.openWorkspaceDiff(e)}async setLayoutMode(e){let t=e===`stacked`?`stacked`:`focused`;if(this.source!==`commit`){this.layoutMode=`focused`,this.render();return}if(this.layoutMode=t,this.activeFilePath&&this.setActiveFilePath(this.activeFilePath),this.layoutMode===`focused`){await this.loadCurrentFile();return}this.activeFilePath&&(this.collapsedFiles.delete(this.activeFilePath),await this.loadFileForPath(this.activeFilePath,{render:!1})),this.render()}navigateFile(e){if(!this.data?.files?.length||this.source===`commit`&&this.layoutMode===`stacked`)return;let t=Math.max(0,Math.min(this.currentIndex+e,this.data.files.length-1));t!==this.currentIndex&&(this.currentIndex=t,this.activeFilePath=this.data.files[t]?.path??null,this.scrollContainer?.scrollTo({top:0,behavior:`auto`}),this.loadCurrentFile())}renderLoading(t=`Loading git diff...`){this.isActive&&(this.page?.classList.remove(`hidden`),this.content&&(this.content.innerHTML=`<div class="diff-empty-state">${e(t)}</div>`),this.data=null,this.syncToolbar())}renderEmpty(t){this.isActive&&(this.page?.classList.remove(`hidden`),this.content&&(this.content.innerHTML=`<div class="diff-empty-state">${e(t)}</div>`),this.syncToolbar())}renderUnifiedHunk(t){let n=[];for(let r of u(t.lines)){if(r.context.length>0){for(let t of r.context)n.push(d(t,` `,e(t.content)));continue}let t=Math.max(r.deletions.length,r.additions.length);for(let i=0;i<t;i+=1){let t=r.deletions[i]??null,a=r.additions[i]??null,o=t&&a?l(t.content,a.content):null;t&&n.push(d(t,`-`,o?.leftHtml??e(t.content))),a&&n.push(d(a,`+`,o?.rightHtml??e(a.content)))}}return`
22
- <div class="diff-hunk-header">${e(t.header)}</div>
23
- ${n.join(``)}
24
- `}renderFileHeader(t){return`
25
- <div class="diff-file-header">
26
- <span class="diff-file-path">${e(t.path)}</span>
27
- <span class="ui-status-badge ${a(t.status)}">${e(t.status)}</span>
28
- <span class="diff-file-header-stats"><span class="ui-stat-token ui-stat-token--add diff-stats-add">+${t.stats?.additions??0}</span><span class="ui-stat-token ui-stat-token--del diff-stats-del">-${t.stats?.deletions??0}</span></span>
29
- </div>
30
- `}renderUnifiedFileBody(t){return`
31
- ${t.isBinary?`<div class="diff-binary-message">${e(t.binaryMessage||`Binary file changed`)}</div>`:``}
32
- ${t.hunks.map(e=>this.renderUnifiedHunk(e)).join(``)}
33
- `}renderSplitFileBody(t){return`
34
- <div class="diff-split">
35
- <div class="diff-split-pane">
36
- <div class="diff-split-pane-header">Before</div>
37
- ${t.hunks.map(t=>{let n=[];for(let e of u(t.lines)){if(e.context.length>0){for(let t of e.context)n.push(f(t,t));continue}let t=Math.max(e.deletions.length,e.additions.length);for(let r=0;r<t;r+=1)n.push(f(e.deletions[r]??null,e.additions[r]??null))}return`
38
- <div class="diff-split-hunk">${e(t.header)}</div>
39
- ${n.join(``)}
40
- `}).join(``)}
41
- </div>
42
- </div>
43
- `}renderDiffDetail(t,n,{includeHeader:i=!0}={}){if(!t)return`<div class="diff-empty-state">Select a file to load its diff.</div>`;if(t.tooLarge)return`
44
- ${i?this.renderFileHeader(t):``}
45
- <div class="diff-limit-card">
46
- <strong>Large diff withheld</strong>
47
- <span>This file diff is large enough to impact rendering performance.</span>
48
- <button class="${r({variant:`secondary`,extra:`diff-load-full-btn`})}" type="button" data-load-full-diff data-diff-file-path="${e(t.path)}">Load full diff</button>
49
- </div>
50
- `;let a=this.mode===`split`?this.renderSplitFileBody(t,n):this.renderUnifiedFileBody(t,n);return`${i?this.renderFileHeader(t):``}${a}`}renderFocusedFileBody(){let t=this.getCurrentFile();if(!t)return`<div class="diff-empty-state">No changes to display.</div>`;if(this.isFileLoading(t.path))return`
51
- <section class="diff-file-block">
52
- ${this.renderFileHeader(t)}
53
- <div class="diff-empty-state">Loading file diff...</div>
54
- </section>
55
- `;let n=this.fileErrors.get(t.path);return n?`
56
- <section class="diff-file-block">
57
- ${this.renderFileHeader(t)}
58
- <div class="diff-empty-state">${e(n)}</div>
59
- </section>
60
- `:`
61
- <section class="diff-file-block" data-diff-file-index="${this.currentIndex}">
62
- ${this.renderDiffDetail(this.getFileDetail(t.path)??t,this.currentIndex)}
63
- </section>
64
- `}renderCommitHeader(){return this.source!==`commit`||!this.commitMeta?``:`
65
- <section class="diff-commit-header">
66
- <div class="diff-commit-subject">${e(this.commitMeta.subject||this.commitMeta.shortHash||`Commit`)}</div>
67
- <div class="diff-commit-meta">
68
- <span>${e(this.commitMeta.shortHash||``)}</span>
69
- <span>${e(this.commitMeta.authorName||`Unknown`)}</span>
70
- <span title="${e(this.commitMeta.authoredAt||``)}">${e(this.commitMeta.relativeDateLabel||``)}</span>
71
- ${this.commitMeta.isMergeCommit?`<span>Merge commit</span>`:``}
72
- </div>
73
- <div class="diff-commit-meta diff-commit-meta-secondary">
74
- <span>${e(this.commitMeta.hash||``)}</span>
75
- <span>${Number(this.data?.summary?.filesChanged||0)} file${Number(this.data?.summary?.filesChanged||0)===1?``:`s`}</span>
76
- </div>
77
- </section>
78
- `}renderCommitIndex(){return`
79
- <aside class="diff-commit-index" aria-label="Changed files in commit">
80
- <div class="diff-commit-index-header">Changed Files</div>
81
- <div class="diff-commit-index-list">
82
- ${(this.data?.files??[]).map((r,i)=>{let o=this.activeFilePath===r.path,s=n(r.path);return`
83
- <button
84
- class="ui-record-surface diff-index-item${o?` active`:``}"
85
- type="button"
86
- data-diff-index-path="${e(r.path)}"
87
- aria-current="${o?`true`:`false`}"
88
- >
89
- <span class="ui-record-header diff-index-item-top">
90
- <span class="ui-record-title diff-index-item-name">${e(t(r.path))}</span>
91
- <span class="ui-status-badge ${a(r.status)}">${e(r.status)}</span>
92
- </span>
93
- ${s?`<span class="ui-record-subtitle diff-index-item-path">${e(s)}</span>`:``}
94
- <span class="ui-record-meta diff-index-item-meta">
95
- <span>${i+1}</span>
96
- <span class="ui-stat-token ui-stat-token--add diff-stats-add">+${r.stats?.additions??0}</span>
97
- <span class="ui-stat-token ui-stat-token--del diff-stats-del">-${r.stats?.deletions??0}</span>
98
- </span>
99
- </button>
100
- `}).join(``)}
101
- </div>
102
- </aside>
103
- `}renderStackedSection(r,s){let c=this.isFileCollapsed(r.path),l=this.activeFilePath===r.path,u=this.isFileLoading(r.path),d=this.fileErrors.get(r.path),f=this.getFileDetail(r.path)??r,p=c?``:u?`<div class="diff-empty-state">Loading file diff...</div>`:d?`<div class="diff-empty-state">${e(d)}</div>`:this.renderDiffDetail(f,s,{includeHeader:!1});return`
104
- <section
105
- class="diff-commit-section${l?` active`:``}${c?` collapsed`:``}"
106
- id="${i(r.path)}"
107
- data-diff-section-path="${e(r.path)}"
108
- >
109
- <button
110
- class="diff-commit-section-header"
111
- type="button"
112
- data-diff-section-toggle="${e(r.path)}"
113
- >
114
- <span class="diff-commit-section-main">
115
- ${o(c)}
116
- <span class="diff-commit-section-copy">
117
- <span class="diff-commit-section-name">${e(t(r.path))}</span>
118
- ${n(r.path)?`<span class="diff-commit-section-path">${e(n(r.path))}</span>`:``}
119
- </span>
120
- </span>
121
- <span class="diff-commit-section-meta">
122
- <span class="ui-status-badge ${a(r.status)}">${e(r.status)}</span>
123
- <span class="ui-stat-token ui-stat-token--add diff-stats-add">+${r.stats?.additions??0}</span>
124
- <span class="ui-stat-token ui-stat-token--del diff-stats-del">-${r.stats?.deletions??0}</span>
125
- </span>
126
- </button>
127
- <div class="diff-commit-section-body${c?` hidden`:``}">
128
- ${p}
129
- </div>
130
- </section>
131
- `}renderCommitBody(){return this.layoutMode===`focused`?`
132
- <div class="diff-commit-shell diff-commit-shell-focused">
133
- ${this.renderCommitIndex()}
134
- <div class="diff-commit-main">
135
- ${this.renderFocusedFileBody()}
136
- </div>
137
- </div>
138
- `:`
139
- <div class="diff-commit-shell diff-commit-shell-stacked">
140
- ${this.renderCommitIndex()}
141
- <div class="diff-commit-main">
142
- <div class="diff-commit-sections">
143
- ${(this.data?.files??[]).map((e,t)=>this.renderStackedSection(e,t)).join(``)}
144
- </div>
145
- </div>
146
- </div>
147
- `}getCurrentFile(){let e=this.data?.files??[];return e.length===0?null:e[this.currentIndex]??e[0]??null}getFileByPath(e){return(this.data?.files??[]).find(t=>t.path===e)??null}setActiveFilePath(e,{syncIndex:t=!0}={}){if(this.activeFilePath=e,!t)return;let n=Math.max(0,(this.data?.files??[]).findIndex(t=>t.path===e));n>=0&&(this.currentIndex=n)}getCacheKeyForPath(e){return e?this.source===`commit`?`commit:${this.commitHash}:${e}`:`workspace:${this.requestScope}:${e}`:null}getCurrentCacheKey(){return this.getCacheKeyForPath(this.getCurrentFile()?.path??null)}getCurrentFileDetail(){let e=this.getCurrentCacheKey();return e?this.fileCache.get(e):null}getFileDetail(e){let t=this.getCacheKeyForPath(e);return t?this.fileCache.get(t):null}isFileCollapsed(e){return this.collapsedFiles.has(e)}isFileLoading(e){return this.loadingFiles.has(e)}getCurrentActionState(){if(this.source===`commit`)return{canCommit:!1,canStage:!1,canUnstage:!1};let e=this.getCurrentFile(),t=this.getCurrentFileDetail()??e,n=Number(this.repoStatus?.summary?.staged||0);return t?.path?{canCommit:n>0,canStage:!!(t.hasWorkingTreeChanges||t.hasUntrackedChanges),canUnstage:!!t.hasStagedChanges}:{canCommit:n>0,canStage:!1,canUnstage:!1}}getPrimaryAction(){if(this.source===`commit`)return null;let e=this.getCurrentActionState();return e.canStage&&!e.canUnstage?`stage`:e.canUnstage&&!e.canStage||this.requestScope===`staged`&&e.canUnstage?`unstage`:e.canStage?`stage`:e.canUnstage?`unstage`:null}async handleFileAction(e){if(this.source===`commit`)return;let t=this.getCurrentFile();if(!(!t?.path||this.pendingAction)){this.pendingAction=e,this.syncToolbar();try{e===`stage`?await this.onStageFile?.(t.path,{scope:this.requestScope}):e===`unstage`?await this.onUnstageFile?.(t.path,{scope:this.requestScope}):e===`commit`&&await this.onCommitStaged?.()}finally{this.pendingAction=null,this.syncToolbar()}}}setRepoStatus(e){this.repoStatus=e,this.syncToolbar()}async handleIndexSelection(e){if(this.getFileByPath(e)){if(this.setActiveFilePath(e),this.source===`commit`&&this.layoutMode===`stacked`){this.collapsedFiles.delete(e),await this.loadFileForPath(e,{render:!1}),this.render(),this.scrollToFileSection(e);return}await this.loadFileForPath(e)}}async toggleFileSection(e){if(this.source===`commit`&&this.layoutMode===`stacked`){if(this.setActiveFilePath(e),this.collapsedFiles.has(e)){this.collapsedFiles.delete(e),await this.loadFileForPath(e,{render:!1}),this.render(),this.scrollToFileSection(e);return}this.collapsedFiles.add(e),this.render()}}scrollToFileSection(e){if(!this.content)return;let t=i(e),n=()=>{let e=document.getElementById?.(t)??null;if(e){if(this.scrollContainer?.scrollTo&&this.scrollContainer.getBoundingClientRect&&e.getBoundingClientRect){let t=this.scrollContainer.getBoundingClientRect(),n=e.getBoundingClientRect(),r=Number(this.scrollContainer.scrollTop)||0,i=Math.max(0,r+(n.top-t.top)-8);this.scrollContainer.scrollTo({top:i,behavior:`smooth`});return}e.scrollIntoView?.({behavior:`smooth`,block:`start`})}};if(typeof requestAnimationFrame==`function`){requestAnimationFrame(n);return}setTimeout(n,0)}handleScrollSelection(){if(this.source!==`commit`||this.layoutMode!==`stacked`||!this.scrollContainer||!this.content)return;let e=Array.from(this.content.querySelectorAll?.(`[data-diff-section-path]`)??[]);if(e.length===0)return;let t=this.scrollContainer.getBoundingClientRect?.();if(!t)return;let n=t.top+120,r=null;for(let t of e){let e=t.getBoundingClientRect?.();if(!e)continue;let i=t.getAttribute?.(`data-diff-section-path`);if(i){if(e.top<=n)r=i;else if(r)break;else{r=i;break}}}r&&r!==this.activeFilePath&&(this.setActiveFilePath(r),this.render())}async loadCurrentFile({forceFullPatch:e=!1}={}){let t=this.getCurrentFile();return t?.path?this.loadFileForPath(t.path,{forceFullPatch:e}):(this.render(),null)}async loadFileForPath(e,{forceFullPatch:t=!1,render:n=!0}={}){let r=this.getFileByPath(e);if(!r?.path)return n&&this.render(),null;this.setActiveFilePath(e);let i=this.getCacheKeyForPath(e),a=i?this.fileCache.get(i):null;if(a&&(!a.tooLarge||!t))return n&&this.render(),a;let o=`${e}:${t?`full`:`partial`}`;if(this.fileLoadPromises.has(o))return this.fileLoadPromises.get(o);this.loadingFiles.add(e),this.fileErrors.delete(e),n&&this.render();let s=(async()=>{try{let n;if(this.source===`commit`){let i=await this.gitApiClient.readCommit({allowLargePatch:t,hash:this.commitHash||``,path:e});n={...r,...i.files?.[0]??{}}}else{let i=await this.gitApiClient.readDiff({allowLargePatch:t,path:e,scope:this.requestScope});n={...r,...i.files?.[0]??{}}}return i&&this.fileCache.set(i,n),this.fileErrors.delete(e),n}catch(t){console.error(`[git-diff] Failed to load file diff:`,t);let n=this.source===`commit`?`Failed to load commit file diff`:`Failed to load file diff`;return this.fileErrors.set(e,n),this.toastController?.show(n),null}finally{this.loadingFiles.delete(e),this.fileLoadPromises.delete(o),this.render()}})();return this.fileLoadPromises.set(o,s),s}syncToolbar(){let e=this.data?.files?.length??0,t=e===0?0:this.currentIndex+1,n=this.source===`commit`,r=n&&this.layoutMode===`stacked`;if(this.fileIndicator&&(r?this.fileIndicator.textContent=`${e} file${e===1?``:`s`}`:this.fileIndicator.textContent=e>0?`${t} / ${e} files`:`0 / 0 files`),this.stats){let e=this.data?.summary?.additions??0,t=this.data?.summary?.deletions??0;this.stats.innerHTML=`
148
- <span class="ui-stat-token ui-stat-token--add diff-stats-add">+${e}</span>
149
- <span class="ui-stat-token ui-stat-token--del diff-stats-del">-${t}</span>
150
- `}this.modeButtons.forEach(e=>{e.classList.remove(`hidden`),e.classList.toggle(`active`,e.getAttribute(`data-diff-mode`)===this.mode)}),this.layoutButtons.forEach(e=>{e.classList.toggle(`active`,e.getAttribute(`data-diff-layout`)===this.layoutMode)});let i=!!this.getCurrentFile()?.path,a=this.getCurrentActionState(),o=this.getPrimaryAction();this.backToHistoryButton?.classList.toggle(`hidden`,!n),this.gitActionsGroup?.classList.toggle(`hidden`,n),this.editorActionsGroup?.classList.toggle(`hidden`,n),this.actionsDivider?.classList.toggle(`hidden`,n),this.layoutToggle?.classList.toggle(`hidden`,!n),this.stats?.classList.remove(`hidden`),this.openEditorButton&&(this.openEditorButton.textContent=`Open in Editor`),this.openEditorButton?.toggleAttribute(`disabled`,!i||n),this.primaryActionButton&&(this.primaryActionButton.textContent=this.pendingAction===o?`Working...`:o===`unstage`?`Unstage`:`Stage`,this.primaryActionButton.toggleAttribute(`disabled`,n||!i||!o||!!this.pendingAction)),this.commitButton&&(this.commitButton.textContent=this.pendingAction===`commit`?`Working...`:`Commit Staged`),this.commitButton?.toggleAttribute(`disabled`,n||!a.canCommit||!!this.pendingAction),this.prevButton?.classList.remove(`hidden`),this.nextButton?.classList.remove(`hidden`),this.prevButton?.classList.toggle(`hidden`,r),this.nextButton?.classList.toggle(`hidden`,r),this.prevButton?.toggleAttribute(`disabled`,r||this.currentIndex<=0),this.nextButton?.toggleAttribute(`disabled`,r||e===0||this.currentIndex>=e-1)}render(){if(this.isActive){if(this.page?.classList.remove(`hidden`),(this.data?.files??[]).length===0){this.renderEmpty(this.source===`commit`?`No commit changes to display.`:`No changes to display.`);return}this.content&&(this.source===`commit`?this.content.innerHTML=`${this.renderCommitHeader()}${this.renderCommitBody()}`:this.content.innerHTML=this.renderFocusedFileBody(),this.syncToolbar())}}getToolbarTitle({commitHash:e=null,filePath:n=null,path:r=null,scope:i=`all`,source:a=`workspace`}={}){return a===`commit`||this.source===`commit`?this.layoutMode===`stacked`?this.commitMeta?.shortHash?`Commit ${this.commitMeta.shortHash}`:e?`Commit ${String(e).slice(0,7)}`:`Commit Diff`:r?t(r):this.activeFilePath?t(this.activeFilePath):this.commitMeta?.shortHash?`Commit ${this.commitMeta.shortHash}`:e?`Commit ${String(e).slice(0,7)}`:`Commit Diff`:n?t(n):i===`staged`?`Staged Changes`:i===`working-tree`?`Working Tree Changes`:`All Changes`}};export{p as GitDiffViewController};