collabmd 0.1.45 → 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 (190) 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/comment-thread-store-CdcwrObc.js +1 -0
  7. package/dist/client/assets/comment-threads-9J6Em-_y.js +4 -0
  8. package/dist/client/assets/comment-ui-shared-BC4pt4w8.js +7 -0
  9. package/dist/client/assets/dist-B5HTH2BO.js +1 -0
  10. package/dist/client/assets/{dist-DhLvC8DS.js → dist-B5Jf1SLZ.js} +2 -2
  11. package/dist/client/assets/{dist-CnL7Y2sM.js → dist-BDt3rz7l.js} +1 -1
  12. package/dist/client/assets/dist-BEwK4csK.js +1 -0
  13. package/dist/client/assets/dist-BKW4PALF.js +1 -0
  14. package/dist/client/assets/dist-BWcHHOx-.js +1 -0
  15. package/dist/client/assets/{dist-CYZmbokb.js → dist-BalScOwZ.js} +9 -9
  16. package/dist/client/assets/dist-Bf8f4HmM.js +6 -0
  17. package/dist/client/assets/dist-BjHJDtyU.js +1 -0
  18. package/dist/client/assets/dist-Bm6pf9Bl.js +1 -0
  19. package/dist/client/assets/dist-BoVBdSjk.js +1 -0
  20. package/dist/client/assets/dist-CC5IrQMG.js +1 -0
  21. package/dist/client/assets/{dist-C11hHqv_.js → dist-CCP_AKPG.js} +12 -12
  22. package/dist/client/assets/dist-CZgOmxK6.js +1 -0
  23. package/dist/client/assets/{dist-D2AQ-76g.js → dist-Cqhv5LAk.js} +1 -1
  24. package/dist/client/assets/{dist-MvcV4190.js → dist-D-Z6FLem.js} +1 -1
  25. package/dist/client/assets/dist-DLMiIsNC.js +11 -0
  26. package/dist/client/assets/{dist-3bgCp7iY.js → dist-DZKu9Cs8.js} +1 -1
  27. package/dist/client/assets/dist-DaYdhcVs.js +1 -0
  28. package/dist/client/assets/dist-FWJsgGYI.js +1 -0
  29. package/dist/client/assets/dist-Kh2COra_.js +1 -0
  30. package/dist/client/assets/{dist-JYEDRrPT.js → dist-PDZ3bSqm.js} +1 -1
  31. package/dist/client/assets/{dist-Drp8uu5J.js → dist-TjMh8n1u.js} +1 -1
  32. package/dist/client/assets/{dist-DGb27Dl6.js → dist-dtAdgL39.js} +1 -1
  33. package/dist/client/assets/dist-jv4WdPnK.js +9 -0
  34. package/dist/client/assets/{dist-DK5Gs2wa.js → dist-rGBmqxC7.js} +1 -1
  35. package/dist/client/assets/{dist-DCzuX1AF.js → dist-shrl6K_0.js} +1 -1
  36. package/dist/client/assets/dist-tOaegDYS2.js +1 -0
  37. package/dist/client/assets/dist-ule2n6ak.js +1 -0
  38. package/dist/client/assets/dist-xElaxbia.js +1 -0
  39. package/dist/client/assets/{drawio-editor-ClE8jpoG.js → drawio-editor-FzY1cVw8.js} +1 -1
  40. package/dist/client/assets/drawioEditor-BjiKJqlc.js +2 -0
  41. package/dist/client/assets/editor-session-Cm9ekeNo.js +54 -0
  42. package/dist/client/assets/embedded-editor-base-CwTkk911.css +1 -0
  43. package/dist/client/assets/{preview-render-profile-BZzGSg6K.js → es-DXGV3RHd.js} +13 -13
  44. package/dist/client/assets/excalidraw-editor-B46zsTFI.js +9 -0
  45. package/dist/client/assets/{excalidraw-editor-CyGwOhLz.css → excalidraw-editor-Bt7gMSoh.css} +1 -1
  46. package/dist/client/assets/excalidraw-scene-BOben2gr.js +1 -0
  47. package/dist/client/assets/excalidrawEditor-CT2pHq7e.js +2 -0
  48. package/dist/client/assets/{export-page-CUfws2T-.js → export-page-A7NHawJY.js} +3 -3
  49. package/dist/client/assets/exportDocument-B2L8fe34.css +1 -0
  50. package/dist/client/assets/exportDocument-BaqcOAAW.js +2 -0
  51. package/dist/client/assets/file-icon-svg-CQAjlWjK.js +1 -0
  52. package/dist/client/assets/file-kind-BbqgGzpc.js +1 -0
  53. package/dist/client/assets/image-QXRYHUNP-SWEV8H0J.js +1 -0
  54. package/dist/client/assets/index-ClbjMBVt.js +2 -0
  55. package/dist/client/assets/index-Pum8ET-5.css +1 -0
  56. package/dist/client/assets/main-B3uPyqic.js +893 -0
  57. package/dist/client/assets/pdf-BL9Pr2D5.js +54 -0
  58. package/dist/client/assets/pdf.worker-CLesOks4.mjs +64857 -0
  59. package/dist/client/assets/pdf_viewer-FVkkThnz.js +551 -0
  60. package/dist/client/assets/{preview-render-compiler-BSaQO_p3.js → preview-render-compiler-BD-XhkS2.js} +2 -2
  61. package/dist/client/assets/preview-render-compiler-BKedaMxx.js +1 -0
  62. package/dist/client/assets/preview-render-profile-CE-5rVTC.js +1 -0
  63. package/dist/client/assets/{preview-render-worker-B42LWvrD.js → preview-render-worker-CiPqc9n6.js} +20 -20
  64. package/dist/client/assets/prod-Dy20X7eT.js +1 -0
  65. package/dist/client/assets/prod-hnwh7wRM.js +177 -0
  66. package/dist/client/assets/quick-switcher-controller-fqOYR7qR.js +12 -0
  67. package/dist/client/assets/runtime-config-BLrEKVO1.js +1 -0
  68. package/dist/client/assets/vault-api-client-_LpV1aIn.js +6 -0
  69. package/dist/client/drawio-editor.html +1 -1
  70. package/dist/client/excalidraw-editor.html +1 -1
  71. package/dist/client/export-document.html +2 -2
  72. package/dist/client/index.html +15 -3
  73. package/docker-compose.yml +42 -0
  74. package/package.json +17 -4
  75. package/scripts/local-structurizr-compose.mjs +101 -0
  76. package/src/client/app/index.html +13 -1
  77. package/src/client/application/app-shell/comments-feature.js +19 -10
  78. package/src/client/application/app-shell/git-feature.js +12 -0
  79. package/src/client/application/app-shell/presence-feature.js +2 -1
  80. package/src/client/application/app-shell/ui-feature-shell.js +45 -2
  81. package/src/client/application/app-shell/ui-feature-toolbar.js +2 -52
  82. package/src/client/application/app-shell/workspace-feature.js +5 -1
  83. package/src/client/application/app-shell-elements.js +2 -0
  84. package/src/client/application/pdf-preview-controller.js +992 -0
  85. package/src/client/application/structurizr-preview-controller.js +395 -0
  86. package/src/client/application/workspace-coordinator.js +25 -3
  87. package/src/client/application/workspace-preview-controller.js +91 -2
  88. package/src/client/bootstrap/collabmd-app-shell.js +31 -5
  89. package/src/client/browser-utils.js +44 -0
  90. package/src/client/domain/runtime-paths.js +26 -5
  91. package/src/client/domain/structurizr-language.js +99 -0
  92. package/src/client/domain/vault-paths.js +48 -0
  93. package/src/client/excalidraw-editor.js +833 -51
  94. package/src/client/infrastructure/browser-preferences-port.js +10 -0
  95. package/src/client/infrastructure/comment-thread-store.js +34 -13
  96. package/src/client/infrastructure/editor-session.js +10 -0
  97. package/src/client/infrastructure/editor-view-adapter.js +46 -2
  98. package/src/client/infrastructure/excalidraw-room-client.js +103 -14
  99. package/src/client/infrastructure/git-api-client.js +5 -0
  100. package/src/client/infrastructure/vault-api-client.js +26 -0
  101. package/src/client/presentation/comment-ui/comment-ui-shared.js +4 -0
  102. package/src/client/presentation/drawio-embed-controller.js +9 -102
  103. package/src/client/presentation/drawio-viewer.js +118 -0
  104. package/src/client/presentation/excalidraw-embed-controller.js +74 -8
  105. package/src/client/presentation/file-action-controller.js +102 -0
  106. package/src/client/presentation/file-explorer-view.js +10 -29
  107. package/src/client/presentation/file-icon-svg.js +40 -0
  108. package/src/client/presentation/file-tree-state.js +2 -0
  109. package/src/client/presentation/git-diff-view-controller.js +731 -3
  110. package/src/client/presentation/outline-controller.js +86 -0
  111. package/src/client/presentation/quick-switcher-controller.js +25 -13
  112. package/src/client/presentation/quick-switcher-text-search.js +1 -1
  113. package/src/client/styles/components/navigation.css +11 -1
  114. package/src/client/styles/features/diagram-preview.css +76 -0
  115. package/src/client/styles/features/diff-special.css +309 -0
  116. package/src/client/styles/foundation/themes.css +6 -0
  117. package/src/client/styles/layout/shell.css +358 -1
  118. package/src/client/styles/layout/view-modes.css +1 -0
  119. package/src/client/styles/style.css +1 -0
  120. package/src/client/styles/surfaces/excalidraw-editor.css +294 -0
  121. package/src/domain/comment-threads.js +63 -5
  122. package/src/domain/excalidraw-room-codec.js +6 -4
  123. package/src/domain/file-kind.js +35 -3
  124. package/src/server/config/env.js +79 -0
  125. package/src/server/create-app-server.js +12 -0
  126. package/src/server/domain/bases/base-definition.js +1 -1
  127. package/src/server/domain/bases/base-expression-runtime.js +1 -4
  128. package/src/server/domain/bases/base-index-snapshot-store.js +1 -4
  129. package/src/server/domain/bases/base-transform.js +1 -4
  130. package/src/server/domain/collaboration/collaboration-room.js +55 -21
  131. package/src/server/domain/comment-overview.js +15 -5
  132. package/src/server/domain/ripgrep-search-service.js +4 -0
  133. package/src/server/infrastructure/git/diff-service.js +5 -0
  134. package/src/server/infrastructure/git/git-service.js +21 -0
  135. package/src/server/infrastructure/git/history-service.js +54 -0
  136. package/src/server/infrastructure/git/image-mime.js +14 -0
  137. package/src/server/infrastructure/git/untracked-files.js +28 -1
  138. package/src/server/infrastructure/http/create-git-api-query-handler.js +31 -1
  139. package/src/server/infrastructure/http/create-request-handler.js +16 -23
  140. package/src/server/infrastructure/http/create-static-handler.js +5 -2
  141. package/src/server/infrastructure/http/create-structurizr-api-handler.js +145 -0
  142. package/src/server/infrastructure/http/create-vault-api-command-handler.js +66 -4
  143. package/src/server/infrastructure/http/create-vault-api-query-handler.js +51 -3
  144. package/src/server/infrastructure/http/http-request-helpers.js +22 -0
  145. package/src/server/infrastructure/persistence/path-utils.js +1 -1
  146. package/src/server/infrastructure/persistence/vault-file-store.js +3 -0
  147. package/src/server/infrastructure/structurizr/structurizr-embed.css +43 -0
  148. package/src/server/infrastructure/structurizr/structurizr-workspace-service.js +374 -0
  149. package/src/server/infrastructure/websocket/attach-collaboration-gateway.js +4 -22
  150. package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-CbSISC1w.js +0 -1
  151. package/dist/client/assets/browser-utils-CKtI_rZl.js +0 -1
  152. package/dist/client/assets/chunk-ERSWUTIN-ME9RVNel.js +0 -41
  153. package/dist/client/assets/comment-threads-DDegmaFO.js +0 -4
  154. package/dist/client/assets/dist-BH87JoHx.js +0 -11
  155. package/dist/client/assets/dist-BIkPRZO7.js +0 -6
  156. package/dist/client/assets/dist-BqCsFpx4.js +0 -1
  157. package/dist/client/assets/dist-C2JHCt8U.js +0 -1
  158. package/dist/client/assets/dist-CZjTtmTu.js +0 -1
  159. package/dist/client/assets/dist-Cig4Ov_X.js +0 -1
  160. package/dist/client/assets/dist-CqQEC8gR.js +0 -1
  161. package/dist/client/assets/dist-D4Rzqod1.js +0 -1
  162. package/dist/client/assets/dist-D5sn-mwk.js +0 -9
  163. package/dist/client/assets/dist-D7G-n87v.js +0 -1
  164. package/dist/client/assets/dist-DRqOrNgN.js +0 -1
  165. package/dist/client/assets/dist-DetkMS_4.js +0 -1
  166. package/dist/client/assets/dist-Dp6FVkQ1.js +0 -1
  167. package/dist/client/assets/dist-DtbjNB28.js +0 -1
  168. package/dist/client/assets/dist-DyrYcvpo2.js +0 -1
  169. package/dist/client/assets/dist-GrygD2zE.js +0 -1
  170. package/dist/client/assets/dist-HmEpWUow.js +0 -1
  171. package/dist/client/assets/dist-RTa81Km7.js +0 -1
  172. package/dist/client/assets/drawioEditor-CXaTM9Ds.js +0 -2
  173. package/dist/client/assets/editor-session-GTwZS6Df.js +0 -16
  174. package/dist/client/assets/embedded-editor-base-CiNEc8vy.css +0 -1
  175. package/dist/client/assets/excalidraw-editor-BZVM81BO.js +0 -9
  176. package/dist/client/assets/excalidraw-scene-C8n9CHsK.js +0 -176
  177. package/dist/client/assets/excalidrawEditor-DxJanCze.js +0 -2
  178. package/dist/client/assets/exportDocument-BCuxqXDY.js +0 -2
  179. package/dist/client/assets/exportDocument-DV-OX74E.css +0 -1
  180. package/dist/client/assets/file-kind-BKPOIRPE.js +0 -1
  181. package/dist/client/assets/image-QXRYHUNP-lfTHE3bb.js +0 -1
  182. package/dist/client/assets/index-C3YnUgMD.css +0 -1
  183. package/dist/client/assets/index-D2wXraJ1.js +0 -2
  184. package/dist/client/assets/main-DtiGz7uI.js +0 -795
  185. package/dist/client/assets/preview-render-compiler-csGM5ZFz.js +0 -1
  186. package/dist/client/assets/quick-switcher-controller-shW_6vPY.js +0 -12
  187. package/dist/client/assets/room-CQLoqtMo.js +0 -1
  188. package/dist/client/assets/runtime-config-DSGmGE9V.js +0 -1
  189. package/dist/client/assets/vault-api-client-C6bcGwy-.js +0 -5
  190. package/src/server/domain/collaboration/room-persistence-controller.js +0 -80
@@ -171,6 +171,10 @@
171
171
  overscroll-behavior: contain;
172
172
  }
173
173
 
174
+ .preview-container.is-pdf-file-preview {
175
+ overflow-x: auto;
176
+ }
177
+
174
178
  .preview-content {
175
179
  position: relative;
176
180
  min-width: 0;
@@ -217,6 +221,18 @@
217
221
  padding: var(--space-4);
218
222
  }
219
223
 
224
+ .preview-content.is-pdf-file-preview {
225
+ position: relative;
226
+ display: flex;
227
+ box-sizing: border-box;
228
+ width: 100%;
229
+ min-height: 100%;
230
+ height: 100%;
231
+ max-width: none;
232
+ margin: 0;
233
+ padding: var(--space-3);
234
+ }
235
+
220
236
  .preview-content.is-base-file-preview {
221
237
  width: 100%;
222
238
  min-height: 100%;
@@ -236,7 +252,8 @@
236
252
  padding: var(--space-3);
237
253
  }
238
254
 
239
- .preview-content.is-drawio-file-preview {
255
+ .preview-content.is-drawio-file-preview,
256
+ .preview-content.is-structurizr-file-preview {
240
257
  position: relative;
241
258
  display: flex;
242
259
  box-sizing: border-box;
@@ -260,8 +277,10 @@
260
277
  }
261
278
 
262
279
  .preview-content.is-drawio-file-preview [data-preview-render-host='true'],
280
+ .preview-content.is-structurizr-file-preview [data-preview-render-host='true'],
263
281
  .preview-content.is-excalidraw-file-preview [data-preview-render-host='true'],
264
282
  .preview-content.is-image-file-preview [data-preview-render-host='true'],
283
+ .preview-content.is-pdf-file-preview [data-preview-render-host='true'],
265
284
  .preview-content.is-base-file-preview [data-preview-render-host='true'] {
266
285
  display: flex;
267
286
  flex: 1;
@@ -271,6 +290,10 @@
271
290
  min-height: 100%;
272
291
  }
273
292
 
293
+ .preview-content.is-pdf-file-preview [data-preview-render-host='true'] {
294
+ flex-direction: column;
295
+ }
296
+
274
297
  .image-file-preview-shell {
275
298
  display: flex;
276
299
  align-items: center;
@@ -289,6 +312,340 @@
289
312
  box-shadow: var(--shadow-lg);
290
313
  }
291
314
 
315
+ .pdf-file-preview-shell {
316
+ display: flex;
317
+ flex: 0 0 auto;
318
+ flex-direction: column;
319
+ width: 100%;
320
+ min-height: 100%;
321
+ margin: 0;
322
+ gap: var(--space-3);
323
+ }
324
+
325
+ .pdf-file-preview-toolbar {
326
+ position: sticky;
327
+ top: var(--space-3);
328
+ z-index: 2;
329
+ display: flex;
330
+ flex-wrap: wrap;
331
+ align-items: center;
332
+ justify-content: space-between;
333
+ gap: var(--space-3);
334
+ width: min(100%, 960px);
335
+ min-height: 32px;
336
+ margin: 0 auto;
337
+ padding: var(--space-2) var(--space-3);
338
+ border: 1px solid var(--color-divider);
339
+ border-radius: var(--radius-lg);
340
+ background: var(--color-surface);
341
+ box-shadow: var(--shadow-md);
342
+ }
343
+
344
+ .pdf-file-preview-toolbar-start,
345
+ .pdf-file-preview-zoom-controls {
346
+ display: inline-flex;
347
+ align-items: center;
348
+ }
349
+
350
+ .pdf-file-preview-toolbar-start {
351
+ display: flex;
352
+ flex: 1 1 auto;
353
+ min-width: 0;
354
+ flex-wrap: wrap;
355
+ gap: var(--space-3);
356
+ }
357
+
358
+ .pdf-file-preview-zoom-controls {
359
+ gap: 4px;
360
+ }
361
+
362
+ .pdf-file-preview-zoom-button,
363
+ .pdf-file-preview-back-button {
364
+ width: 28px;
365
+ min-width: 28px;
366
+ height: 28px;
367
+ padding: 0;
368
+ font-size: 16px;
369
+ font-weight: 700;
370
+ line-height: 1;
371
+ }
372
+
373
+ .pdf-file-preview-zoom-label {
374
+ min-width: 48px;
375
+ color: var(--color-text-muted);
376
+ font-size: var(--text-xs);
377
+ font-variant-numeric: tabular-nums;
378
+ font-weight: 600;
379
+ text-align: center;
380
+ }
381
+
382
+ .pdf-file-preview-status {
383
+ color: var(--color-text-muted);
384
+ font-size: var(--text-meta);
385
+ white-space: nowrap;
386
+ }
387
+
388
+ .pdf-file-preview-find-controls {
389
+ display: inline-flex;
390
+ min-width: 0;
391
+ align-items: center;
392
+ gap: 4px;
393
+ }
394
+
395
+ .pdf-file-preview-find-input {
396
+ box-sizing: border-box;
397
+ width: min(190px, 24vw);
398
+ min-width: 120px;
399
+ height: 28px;
400
+ padding: 0 8px;
401
+ border: 1px solid var(--color-border);
402
+ border-radius: var(--radius-sm);
403
+ background: var(--color-surface-offset);
404
+ color: var(--color-text);
405
+ font: inherit;
406
+ font-size: var(--text-xs);
407
+ }
408
+
409
+ .pdf-file-preview-find-input:focus {
410
+ outline: none;
411
+ border-color: var(--color-primary);
412
+ box-shadow: var(--shadow-focus);
413
+ }
414
+
415
+ .pdf-file-preview-find-input::placeholder {
416
+ color: var(--color-text-faint);
417
+ }
418
+
419
+ .pdf-file-preview-find-status {
420
+ min-width: 48px;
421
+ color: var(--color-text-muted);
422
+ font-size: var(--text-xs);
423
+ font-variant-numeric: tabular-nums;
424
+ text-align: center;
425
+ white-space: nowrap;
426
+ }
427
+
428
+ .pdf-file-preview-find-button {
429
+ width: 28px;
430
+ min-width: 28px;
431
+ height: 28px;
432
+ padding: 0;
433
+ font-size: 20px;
434
+ line-height: 1;
435
+ }
436
+
437
+ .pdf-file-preview-download {
438
+ color: var(--color-primary);
439
+ font-size: var(--text-meta);
440
+ font-weight: 600;
441
+ }
442
+
443
+ .pdf-file-preview-pages {
444
+ --pdf-page-width: min(100%, 960px);
445
+ touch-action: pan-x pan-y;
446
+ display: flex;
447
+ flex-direction: column;
448
+ align-items: flex-start;
449
+ width: 100%;
450
+ gap: var(--space-4);
451
+ padding: 0 var(--space-2) var(--space-8);
452
+ }
453
+
454
+ .pdf-page {
455
+ position: relative;
456
+ flex: 0 0 auto;
457
+ width: var(--pdf-page-width, min(100%, 960px));
458
+ max-width: none;
459
+ margin-inline: auto;
460
+ overflow: hidden;
461
+ border-radius: var(--radius-sm);
462
+ background: var(--color-surface);
463
+ box-shadow: var(--shadow-lg);
464
+ --scale-factor: 1;
465
+ --user-unit: 1;
466
+ --total-scale-factor: calc(var(--scale-factor) * var(--user-unit));
467
+ --scale-round-x: 1px;
468
+ --scale-round-y: 1px;
469
+ }
470
+
471
+ .pdf-page > .page {
472
+ position: relative;
473
+ width: 100%;
474
+ height: 100%;
475
+ margin: 0;
476
+ overflow: visible;
477
+ }
478
+
479
+ .pdf-page .canvasWrapper {
480
+ position: relative;
481
+ width: 100%;
482
+ height: 100%;
483
+ overflow: hidden;
484
+ }
485
+
486
+ .pdf-page-canvas {
487
+ position: absolute;
488
+ inset: 0;
489
+ z-index: 0;
490
+ display: block;
491
+ width: 100%;
492
+ height: 100%;
493
+ background: var(--color-surface);
494
+ }
495
+
496
+ .pdf-page .textLayer {
497
+ position: absolute;
498
+ inset: 0;
499
+ z-index: 1;
500
+ overflow: hidden;
501
+ color-scheme: only light;
502
+ text-align: initial;
503
+ opacity: 1;
504
+ line-height: 1;
505
+ letter-spacing: normal;
506
+ word-spacing: normal;
507
+ transform-origin: 0 0;
508
+ caret-color: CanvasText;
509
+ }
510
+
511
+ .pdf-page .annotationLayer {
512
+ position: absolute;
513
+ inset: 0;
514
+ z-index: 2;
515
+ pointer-events: none;
516
+ transform-origin: 0 0;
517
+ }
518
+
519
+ .pdf-page .annotationLayer section {
520
+ position: absolute;
521
+ box-sizing: border-box;
522
+ pointer-events: auto;
523
+ }
524
+
525
+ .pdf-page .annotationLayer :is(.linkAnnotation, .buttonWidgetAnnotation.pushButton) > a {
526
+ position: absolute;
527
+ inset: 0;
528
+ cursor: pointer;
529
+ }
530
+
531
+ .pdf-page .textLayer :is(span, br) {
532
+ position: absolute;
533
+ color: transparent;
534
+ white-space: pre;
535
+ cursor: text;
536
+ transform-origin: 0% 0%;
537
+ -webkit-user-select: text;
538
+ user-select: text;
539
+ }
540
+
541
+ .pdf-page .textLayer {
542
+ --min-font-size: 1;
543
+ --text-scale-factor: calc(var(--total-scale-factor) * var(--min-font-size));
544
+ --min-font-size-inv: calc(1 / var(--min-font-size));
545
+ }
546
+
547
+ .pdf-page .textLayer > :not(.markedContent),
548
+ .pdf-page .textLayer .markedContent span:not(.markedContent) {
549
+ z-index: 1;
550
+ --font-height: 0;
551
+ font-size: calc(var(--text-scale-factor) * var(--font-height));
552
+ --scale-x: 1;
553
+ --rotate: 0deg;
554
+ transform: rotate(var(--rotate)) scaleX(var(--scale-x)) scale(var(--min-font-size-inv));
555
+ }
556
+
557
+ .pdf-page .textLayer .markedContent {
558
+ display: contents;
559
+ }
560
+
561
+ .pdf-page .textLayer .highlight {
562
+ margin: -1px;
563
+ padding: 1px;
564
+ border-radius: 4px;
565
+ background: var(--pdf-highlight-bg);
566
+ }
567
+
568
+ .pdf-page .textLayer .highlight.selected {
569
+ background: var(--pdf-highlight-selected-bg);
570
+ scroll-margin-top: 50px;
571
+ }
572
+
573
+ .pdf-page .textLayer .highlight.begin {
574
+ border-radius: 4px 0 0 4px;
575
+ }
576
+
577
+ .pdf-page .textLayer .highlight.middle {
578
+ border-radius: 0;
579
+ }
580
+
581
+ .pdf-page .textLayer .highlight.end {
582
+ border-radius: 0 4px 4px 0;
583
+ }
584
+
585
+ .pdf-page .textLayer ::selection {
586
+ background: var(--pdf-selection-bg);
587
+ color: transparent;
588
+ }
589
+
590
+ .pdf-page .textLayer .endOfContent {
591
+ position: absolute;
592
+ inset: 100% 0 0;
593
+ z-index: 0;
594
+ display: block;
595
+ cursor: default;
596
+ user-select: none;
597
+ }
598
+
599
+ .pdf-page .textLayer.selecting .endOfContent {
600
+ top: 0;
601
+ }
602
+
603
+ .pdf-file-preview-error,
604
+ .pdf-file-preview-password-prompt {
605
+ display: flex;
606
+ flex-direction: column;
607
+ align-items: center;
608
+ justify-content: center;
609
+ gap: var(--space-3);
610
+ width: min(100%, 960px);
611
+ min-height: 240px;
612
+ margin: 0 auto;
613
+ padding: var(--space-6);
614
+ border: 1px solid var(--color-divider);
615
+ border-radius: var(--radius-lg);
616
+ color: var(--color-text-muted);
617
+ text-align: center;
618
+ }
619
+
620
+ .pdf-file-preview-password-prompt {
621
+ box-sizing: border-box;
622
+ align-items: stretch;
623
+ width: min(100%, 440px);
624
+ background: var(--color-surface);
625
+ }
626
+
627
+ .pdf-file-preview-password-title,
628
+ .pdf-file-preview-password-copy {
629
+ margin: 0;
630
+ }
631
+
632
+ .pdf-file-preview-password-title {
633
+ color: var(--color-text);
634
+ font-size: var(--text-lg);
635
+ }
636
+
637
+ .pdf-file-preview-password-field {
638
+ display: grid;
639
+ gap: var(--space-2);
640
+ color: var(--color-text-muted);
641
+ font-size: var(--text-meta);
642
+ text-align: left;
643
+ }
644
+
645
+ .pdf-file-preview-password-field .ui-input {
646
+ width: 100%;
647
+ }
648
+
292
649
  .preview-content.is-mermaid-file-preview .mermaid-shell,
293
650
  .preview-content.is-plantuml-file-preview .plantuml-shell {
294
651
  flex: 1;
@@ -29,6 +29,7 @@
29
29
  .editor-layout[data-view="preview"] .preview-content.is-drawio-file-preview,
30
30
  .editor-layout[data-view="preview"] .preview-content.is-base-file-preview,
31
31
  .editor-layout[data-view="preview"] .preview-content.is-image-file-preview,
32
+ .editor-layout[data-view="preview"] .preview-content.is-pdf-file-preview,
32
33
  .editor-layout[data-view="preview"] .preview-content.is-mermaid-file-preview,
33
34
  .editor-layout[data-view="preview"] .preview-content.is-plantuml-file-preview {
34
35
  max-width: none;
@@ -17,6 +17,7 @@
17
17
  @import './features/diff-toolbar.css';
18
18
  @import './features/diff-commit.css';
19
19
  @import './features/diff-lines.css';
20
+ @import './features/diff-special.css';
20
21
  @import './features/collaboration-presence.css';
21
22
  @import './features/collaboration-chat.css';
22
23
  @import './features/collaboration-dialogs.css';
@@ -31,6 +31,300 @@ body[data-surface='excalidraw-editor'][data-document-mode='preview'] .disable-vi
31
31
  pointer-events: none;
32
32
  }
33
33
 
34
+ .diagram-comments-overlay {
35
+ position: absolute;
36
+ z-index: 25;
37
+ inset: 0;
38
+ pointer-events: none;
39
+ }
40
+
41
+ .diagram-comments-toolbar {
42
+ display: inline-flex;
43
+ align-items: center;
44
+ gap: var(--space-2);
45
+ pointer-events: auto;
46
+ }
47
+
48
+ .diagram-comment-button,
49
+ .diagram-comment-close,
50
+ .diagram-comment-back,
51
+ .diagram-comment-marker {
52
+ border: 0;
53
+ font: inherit;
54
+ cursor: pointer;
55
+ }
56
+
57
+ .diagram-comment-button {
58
+ display: inline-flex;
59
+ align-items: center;
60
+ justify-content: center;
61
+ gap: var(--space-2);
62
+ min-height: var(--control-h-sm);
63
+ padding: 0 var(--space-3);
64
+ border: 1px solid transparent;
65
+ border-radius: var(--radius-md);
66
+ background: transparent;
67
+ color: var(--color-text);
68
+ box-shadow: none;
69
+ transition: transform var(--transition-interactive), background var(--transition-interactive), border-color var(--transition-interactive), color var(--transition-interactive);
70
+ }
71
+
72
+ .diagram-comment-button:hover:not(:disabled),
73
+ .diagram-comment-back:hover {
74
+ border-color: var(--color-comment);
75
+ }
76
+
77
+ .diagram-comment-button:hover:not(:disabled),
78
+ .diagram-comment-button.is-active {
79
+ background: var(--color-surface-raised);
80
+ }
81
+
82
+ .diagram-comment-button:active:not(:disabled),
83
+ .diagram-comment-add:active:not(:disabled) {
84
+ transform: translateY(1px);
85
+ }
86
+
87
+ .diagram-comment-button:focus-visible,
88
+ .diagram-comment-add:focus-visible,
89
+ .diagram-comment-close:focus-visible,
90
+ .diagram-comment-back:focus-visible,
91
+ .diagram-comment-marker:focus-visible {
92
+ outline: 2px solid var(--color-primary);
93
+ outline-offset: 2px;
94
+ }
95
+
96
+ .diagram-comment-icon {
97
+ width: 15px;
98
+ height: 15px;
99
+ flex: 0 0 auto;
100
+ }
101
+
102
+ .diagram-comments-toolbar .diagram-comment-button,
103
+ .diagram-comments-toolbar .diagram-comment-add {
104
+ position: relative;
105
+ }
106
+
107
+ .diagram-comment-count {
108
+ position: absolute;
109
+ top: -4px;
110
+ right: -4px;
111
+ display: inline-flex;
112
+ align-items: center;
113
+ justify-content: center;
114
+ box-sizing: border-box;
115
+ min-width: 1.125rem;
116
+ height: 1.125rem;
117
+ padding: 0 0.25rem;
118
+ border: 2px solid var(--color-surface);
119
+ border-radius: var(--radius-full);
120
+ background: var(--color-comment);
121
+ color: var(--color-primary-contrast);
122
+ font-family: inherit;
123
+ font-size: var(--text-caption);
124
+ font-variant-numeric: tabular-nums;
125
+ font-weight: 700;
126
+ line-height: 1;
127
+ text-align: center;
128
+ pointer-events: none;
129
+ }
130
+
131
+ .diagram-comment-add {
132
+ display: inline-flex;
133
+ align-items: center;
134
+ justify-content: center;
135
+ width: var(--control-h-sm);
136
+ min-width: var(--control-h-sm);
137
+ height: var(--control-h-sm);
138
+ padding: 0;
139
+ border: 1px solid var(--border-comment-soft);
140
+ border-radius: var(--radius-md);
141
+ background: var(--color-comment-soft);
142
+ color: var(--color-comment-text);
143
+ cursor: pointer;
144
+ transition: transform var(--transition-interactive), background var(--transition-interactive), border-color var(--transition-interactive), color var(--transition-interactive);
145
+ }
146
+
147
+ .diagram-comment-add:hover:not(:disabled) {
148
+ border-color: var(--border-comment-active);
149
+ background: var(--surface-comment-offset-active);
150
+ }
151
+
152
+ .diagram-comment-button.is-primary {
153
+ border-color: var(--color-primary);
154
+ background: var(--color-primary);
155
+ color: var(--color-primary-contrast);
156
+ }
157
+
158
+ .diagram-comment-button.is-danger {
159
+ color: var(--color-error);
160
+ }
161
+
162
+ .diagram-comment-button:disabled {
163
+ cursor: not-allowed;
164
+ opacity: 0.5;
165
+ }
166
+
167
+ .diagram-comment-add:disabled {
168
+ cursor: not-allowed;
169
+ opacity: 0.5;
170
+ }
171
+
172
+ .diagram-comment-markers {
173
+ position: absolute;
174
+ inset: 0;
175
+ pointer-events: none;
176
+ }
177
+
178
+ .diagram-comment-marker {
179
+ position: absolute;
180
+ display: inline-flex;
181
+ align-items: center;
182
+ justify-content: center;
183
+ width: 24px;
184
+ height: 24px;
185
+ padding: 0;
186
+ border: 2px solid var(--color-surface);
187
+ border-radius: 50%;
188
+ background: var(--color-comment);
189
+ color: var(--color-primary-contrast);
190
+ box-shadow: var(--shadow-accent-ring);
191
+ pointer-events: auto;
192
+ transform: translate(-50%, -50%);
193
+ }
194
+
195
+ .diagram-comment-marker.is-active {
196
+ box-shadow: var(--shadow-accent-ring-strong);
197
+ }
198
+
199
+ .diagram-comments-drawer {
200
+ position: absolute;
201
+ top: 4.5rem;
202
+ right: var(--space-3);
203
+ bottom: var(--space-3);
204
+ display: flex;
205
+ flex-direction: column;
206
+ width: min(22rem, calc(100vw - (2 * var(--space-3))));
207
+ border: 1px solid var(--color-divider);
208
+ border-radius: var(--radius-lg);
209
+ background: var(--color-surface);
210
+ box-shadow: var(--shadow-lg);
211
+ color: var(--color-text);
212
+ pointer-events: auto;
213
+ overflow: hidden;
214
+ }
215
+
216
+ .diagram-comments-drawer-header {
217
+ display: flex;
218
+ align-items: center;
219
+ justify-content: space-between;
220
+ padding: var(--space-3);
221
+ border-bottom: 1px solid var(--color-divider);
222
+ background: var(--color-surface);
223
+ }
224
+
225
+ .diagram-comments-drawer-header-actions {
226
+ display: flex;
227
+ align-items: center;
228
+ gap: var(--space-1);
229
+ }
230
+
231
+ .diagram-comment-close {
232
+ width: 28px;
233
+ height: 28px;
234
+ border-radius: var(--radius-full);
235
+ background: transparent;
236
+ color: var(--color-text-muted);
237
+ font-size: 22px;
238
+ }
239
+
240
+ .diagram-comments-drawer-content {
241
+ display: flex;
242
+ flex: 1;
243
+ flex-direction: column;
244
+ gap: var(--space-3);
245
+ padding: var(--space-3);
246
+ overflow: auto;
247
+ }
248
+
249
+ .diagram-comment-message-body {
250
+ margin: 0;
251
+ color: var(--color-text-muted);
252
+ white-space: pre-wrap;
253
+ overflow-wrap: anywhere;
254
+ }
255
+
256
+ .diagram-comment-message-meta {
257
+ color: var(--color-comment-text);
258
+ font-weight: 650;
259
+ }
260
+
261
+ .diagram-comments-drawer-content.is-list {
262
+ gap: 0;
263
+ padding: var(--space-2) var(--space-2) var(--space-4);
264
+ }
265
+
266
+ .diagram-comment-anchor-label {
267
+ margin: 0;
268
+ color: var(--color-text-muted);
269
+ font-size: var(--text-ui-sm);
270
+ }
271
+
272
+ .diagram-comment-back {
273
+ align-self: flex-start;
274
+ padding: 0;
275
+ background: transparent;
276
+ color: var(--color-comment-text);
277
+ }
278
+
279
+ .diagram-comment-messages {
280
+ display: grid;
281
+ gap: var(--space-2);
282
+ }
283
+
284
+ .diagram-comment-message {
285
+ padding: var(--space-3);
286
+ border: 1px solid var(--border-comment-soft);
287
+ border-radius: var(--radius-md);
288
+ background: var(--color-surface-2);
289
+ }
290
+
291
+ .diagram-comment-form {
292
+ display: grid;
293
+ gap: var(--space-3);
294
+ }
295
+
296
+ .diagram-comment-input {
297
+ width: 100%;
298
+ box-sizing: border-box;
299
+ resize: vertical;
300
+ padding: var(--space-2) var(--space-3);
301
+ border: 1px solid var(--color-border);
302
+ border-radius: var(--radius-md);
303
+ background: var(--color-surface);
304
+ color: var(--color-text);
305
+ font: inherit;
306
+ }
307
+
308
+ .diagram-comment-input:focus {
309
+ border-color: var(--color-primary);
310
+ outline: none;
311
+ box-shadow: var(--shadow-focus-compact);
312
+ }
313
+
314
+ .diagram-comment-form-actions {
315
+ display: flex;
316
+ justify-content: flex-end;
317
+ gap: var(--space-2);
318
+ }
319
+
320
+ @media (max-width: 600px) {
321
+ .diagram-comments-drawer {
322
+ top: var(--space-3);
323
+ right: var(--space-3);
324
+ bottom: 4.25rem;
325
+ }
326
+ }
327
+
34
328
  .loading-state {
35
329
  display: flex;
36
330
  align-items: center;