collabmd 0.1.21 → 0.1.23

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 (99) hide show
  1. package/README.md +94 -7
  2. package/bin/collabmd.js +3 -2
  3. package/docker-compose.yml +13 -1
  4. package/package.json +2 -1
  5. package/public/assets/css/style.css +1 -1
  6. package/public/assets/js/chunks/{chunk-HEWVH67U.js → chunk-CYK7KO7W.js} +8 -8
  7. package/public/assets/js/chunks/editor-session-S5AT7BMV.js +22 -0
  8. package/public/assets/js/{excalidraw-editor-TCIH6GJL.js → excalidraw-editor-5YWMGLKF.js} +145 -62
  9. package/public/assets/js/excalidraw-editor.js +1 -1
  10. package/public/assets/js/main.js +503 -182
  11. package/public/index.html +104 -84
  12. package/src/client/application/app-shell/git-feature.js +247 -9
  13. package/src/client/application/app-shell/ui-feature.js +65 -7
  14. package/src/client/application/app-shell/workspace-feature.js +46 -0
  15. package/src/client/application/app-shell-elements.js +2 -0
  16. package/src/client/application/mermaid-preview-hydrator.js +1 -1
  17. package/src/client/application/plantuml-preview-hydrator.js +1 -1
  18. package/src/client/application/workspace-coordinator.js +147 -18
  19. package/src/client/application/workspace-preview-controller.js +34 -0
  20. package/src/client/application/workspace-route-controller.js +104 -0
  21. package/src/client/bootstrap/collabmd-app-shell.js +95 -0
  22. package/src/client/domain/runtime-paths.js +5 -0
  23. package/src/client/excalidraw-editor.js +50 -2
  24. package/src/client/infrastructure/auth-client.js +219 -52
  25. package/src/client/infrastructure/browser-navigation-port.js +20 -0
  26. package/src/client/infrastructure/editor-collaboration-client.js +4 -0
  27. package/src/client/infrastructure/editor-session.js +47 -7
  28. package/src/client/infrastructure/editor-view-adapter.js +122 -58
  29. package/src/client/infrastructure/runtime-config.js +66 -0
  30. package/src/client/presentation/comment-ui-controller.js +82 -26
  31. package/src/client/presentation/comments-panel.js +2 -2
  32. package/src/client/presentation/excalidraw-embed-controller.js +60 -2
  33. package/src/client/presentation/file-history-view-controller.js +806 -0
  34. package/src/client/presentation/git-diff-view-controller.js +718 -121
  35. package/src/client/presentation/git-panel-controller.js +458 -66
  36. package/src/client/presentation/layout-controller.js +1 -1
  37. package/src/client/styles/components/actions.css +89 -0
  38. package/src/client/styles/components/feedback.css +43 -0
  39. package/src/client/styles/components/navigation.css +68 -0
  40. package/src/client/styles/components/scrollbars.css +104 -0
  41. package/src/client/styles/components/states.css +289 -0
  42. package/src/client/styles/components/surfaces.css +155 -0
  43. package/src/client/styles/features/backlinks.css +213 -0
  44. package/src/client/styles/features/collaboration-chat.css +228 -0
  45. package/src/client/styles/features/collaboration-dialogs.css +154 -0
  46. package/src/client/styles/features/collaboration-presence.css +103 -0
  47. package/src/client/styles/features/collaboration-ui.css +3 -0
  48. package/src/client/styles/features/comment-card.css +236 -0
  49. package/src/client/styles/features/comment-markdown.css +127 -0
  50. package/src/client/styles/features/comment-overlays.css +60 -0
  51. package/src/client/styles/features/comments-drawer.css +120 -0
  52. package/src/client/styles/features/comments.css +4 -0
  53. package/src/client/styles/features/diagram-preview.css +227 -0
  54. package/src/client/styles/features/diff-commit.css +268 -0
  55. package/src/client/styles/features/diff-lines.css +160 -0
  56. package/src/client/styles/features/diff-toolbar.css +98 -0
  57. package/src/client/styles/features/diff.css +3 -0
  58. package/src/client/styles/features/embedded-preview.css +218 -0
  59. package/src/client/styles/features/git-branch.css +155 -0
  60. package/src/client/styles/features/git-files.css +105 -0
  61. package/src/client/styles/features/git-history.css +339 -0
  62. package/src/client/styles/features/git.css +3 -0
  63. package/src/client/styles/features/media-lightbox.css +157 -0
  64. package/src/client/styles/features/outline.css +115 -0
  65. package/src/client/styles/features/preview-content.css +3 -0
  66. package/src/client/styles/features/preview-markdown.css +201 -0
  67. package/src/client/styles/features/preview-sidebars.css +2 -0
  68. package/src/client/styles/features/quick-switcher.css +167 -0
  69. package/src/client/styles/foundation/themes.css +347 -0
  70. package/src/client/styles/foundation/tokens.css +66 -0
  71. package/src/client/styles/foundation/utilities.css +36 -0
  72. package/src/client/styles/layout/editor-page.css +203 -0
  73. package/src/client/styles/layout/overlays.css +132 -0
  74. package/src/client/styles/layout/responsive.css +251 -0
  75. package/src/client/styles/layout/shell.css +314 -0
  76. package/src/client/styles/layout/sidebar.css +176 -0
  77. package/src/client/styles/layout/view-modes.css +92 -0
  78. package/src/client/styles/overrides/codemirror.css +53 -0
  79. package/src/client/styles/overrides/highlightjs.css +7 -0
  80. package/src/client/styles/overrides/vendor.css +2 -0
  81. package/src/client/styles/primitives/controls.css +276 -0
  82. package/src/client/styles/style.css +25 -4945
  83. package/src/server/auth/create-auth-service.js +373 -15
  84. package/src/server/auth/session-cookie.js +30 -4
  85. package/src/server/config/env.js +121 -5
  86. package/src/server/create-app-server.js +8 -0
  87. package/src/server/domain/collaboration/collaboration-room.js +90 -47
  88. package/src/server/index.js +3 -1
  89. package/src/server/infrastructure/git/command-runner.js +2 -1
  90. package/src/server/infrastructure/git/git-service.js +48 -2
  91. package/src/server/infrastructure/git/history-service.js +683 -0
  92. package/src/server/infrastructure/git/parsers.js +30 -0
  93. package/src/server/infrastructure/git/responses.js +73 -0
  94. package/src/server/infrastructure/http/create-auth-api-handler.js +30 -2
  95. package/src/server/infrastructure/http/create-git-api-command-handler.js +2 -0
  96. package/src/server/infrastructure/http/create-git-api-handler.js +2 -0
  97. package/src/server/infrastructure/http/create-git-api-query-handler.js +61 -0
  98. package/src/server/infrastructure/http/create-request-handler.js +15 -0
  99. package/public/assets/js/chunks/editor-session-EAUBJCHH.js +0 -22
@@ -77,6 +77,8 @@ export class ExcalidrawEmbedController {
77
77
  this.maximizedRoot = null;
78
78
  this.placeholderObserver = null;
79
79
  this.followedPeerIdsByFilePath = new Map();
80
+ this.pendingDisconnectRequests = new Map();
81
+ this.disconnectRequestCounter = 0;
80
82
 
81
83
  this._onMessage = this._onMessage.bind(this);
82
84
  this._onKeyDown = this._onKeyDown.bind(this);
@@ -104,6 +106,10 @@ export class ExcalidrawEmbedController {
104
106
  entry.placeholder = null;
105
107
  });
106
108
  this.embedEntries.clear();
109
+ this.pendingDisconnectRequests.forEach((request) => {
110
+ request.resolve(false);
111
+ });
112
+ this.pendingDisconnectRequests.clear();
107
113
  this.followedPeerIdsByFilePath.clear();
108
114
  this.overlayRoot?.remove();
109
115
  this.overlayRoot = null;
@@ -242,6 +248,43 @@ export class ExcalidrawEmbedController {
242
248
  });
243
249
  }
244
250
 
251
+ prepareFileDisconnect(filePath, { timeoutMs = 250 } = {}) {
252
+ const entry = this._findEntryByFilePath(filePath);
253
+ if (!entry?.iframe?.contentWindow) {
254
+ return Promise.resolve(false);
255
+ }
256
+
257
+ const requestId = `disconnect-${++this.disconnectRequestCounter}`;
258
+ return new Promise((resolve) => {
259
+ const finish = (value) => {
260
+ if (!this.pendingDisconnectRequests.has(requestId)) {
261
+ return;
262
+ }
263
+
264
+ const request = this.pendingDisconnectRequests.get(requestId);
265
+ window.clearTimeout(request.timeoutId);
266
+ this.pendingDisconnectRequests.delete(requestId);
267
+ resolve(value);
268
+ };
269
+
270
+ const timeoutId = window.setTimeout(() => {
271
+ finish(false);
272
+ }, timeoutMs);
273
+
274
+ this.pendingDisconnectRequests.set(requestId, {
275
+ entry,
276
+ resolve: finish,
277
+ timeoutId,
278
+ });
279
+
280
+ this._postMessageToEntry(entry, {
281
+ source: 'collabmd-host',
282
+ type: 'prepare-disconnect',
283
+ requestId,
284
+ });
285
+ });
286
+ }
287
+
245
288
  _ensurePlaceholderObserver() {
246
289
  if (!this.previewContainer) {
247
290
  return;
@@ -422,6 +465,13 @@ export class ExcalidrawEmbedController {
422
465
  }
423
466
 
424
467
  _destroyEntry(entry) {
468
+ this.pendingDisconnectRequests.forEach((request, requestId) => {
469
+ if (request.entry === entry) {
470
+ request.resolve(false);
471
+ this.pendingDisconnectRequests.delete(requestId);
472
+ }
473
+ });
474
+
425
475
  if (this.maximizedEmbed?.wrapper === entry.wrapper) {
426
476
  this._exitMaximizedEmbed();
427
477
  }
@@ -588,14 +638,14 @@ export class ExcalidrawEmbedController {
588
638
 
589
639
  const openBtn = document.createElement('button');
590
640
  openBtn.type = 'button';
591
- openBtn.className = 'excalidraw-embed-btn diagram-preview-action-btn';
641
+ openBtn.className = 'excalidraw-embed-btn ui-preview-action ui-preview-action--icon-only';
592
642
  openBtn.title = 'Edit in Excalidraw';
593
643
  openBtn.setAttribute('aria-label', 'Edit in Excalidraw');
594
644
  setDiagramActionButtonIcon(openBtn, 'edit');
595
645
 
596
646
  const maxBtn = document.createElement('button');
597
647
  maxBtn.type = 'button';
598
- maxBtn.className = 'excalidraw-embed-btn diagram-preview-action-btn';
648
+ maxBtn.className = 'excalidraw-embed-btn ui-preview-action ui-preview-action--icon-only';
599
649
  maxBtn.title = 'Maximize diagram';
600
650
  maxBtn.setAttribute('aria-label', 'Maximize diagram');
601
651
  setDiagramActionButtonIcon(maxBtn, 'maximize');
@@ -915,6 +965,14 @@ export class ExcalidrawEmbedController {
915
965
  if (msg.type === 'error') {
916
966
  entry.isReady = false;
917
967
  void this._handleEntryBootTimeout(entry);
968
+ return;
969
+ }
970
+
971
+ if (msg.type === 'disconnect-ready') {
972
+ const request = this.pendingDisconnectRequests.get(msg.requestId);
973
+ if (request?.entry === entry) {
974
+ request.resolve(true);
975
+ }
918
976
  }
919
977
  }
920
978