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
@@ -0,0 +1,154 @@
1
+ /* ===== COLLABORATION / DIALOGS ===== */
2
+
3
+ .app-dialog {
4
+ width: min(420px, calc(100vw - var(--space-6)));
5
+ margin: auto;
6
+ padding: 0;
7
+ border: 1px solid var(--color-border);
8
+ border-radius: var(--radius-xl);
9
+ background: var(--color-surface);
10
+ color: var(--color-text);
11
+ box-shadow: var(--shadow-lg);
12
+ opacity: 0;
13
+ transform: scale(0.95);
14
+ transition: opacity 0.2s cubic-bezier(0.16, 1, 0.3, 1), transform 0.2s cubic-bezier(0.16, 1, 0.3, 1), display 0.2s cubic-bezier(0.16, 1, 0.3, 1) allow-discrete;
15
+ }
16
+
17
+ .app-dialog[open] {
18
+ opacity: 1;
19
+ transform: scale(1);
20
+ }
21
+
22
+ @starting-style {
23
+ .app-dialog[open] {
24
+ opacity: 0;
25
+ transform: scale(0.95);
26
+ }
27
+ }
28
+
29
+ .app-dialog::backdrop {
30
+ background: oklch(from var(--color-bg) l c h / 0.72);
31
+ backdrop-filter: blur(6px);
32
+ opacity: 0;
33
+ transition: opacity 0.2s cubic-bezier(0.16, 1, 0.3, 1), display 0.2s cubic-bezier(0.16, 1, 0.3, 1) allow-discrete;
34
+ }
35
+
36
+ .app-dialog[open]::backdrop {
37
+ opacity: 1;
38
+ }
39
+
40
+ @starting-style {
41
+ .app-dialog[open]::backdrop {
42
+ opacity: 0;
43
+ }
44
+ }
45
+
46
+ .app-dialog-form {
47
+ display: grid;
48
+ gap: var(--space-4);
49
+ padding: var(--space-5);
50
+ }
51
+
52
+ .app-dialog-header {
53
+ display: grid;
54
+ gap: var(--space-1);
55
+ }
56
+
57
+ .app-dialog-title {
58
+ font-size: var(--text-base);
59
+ font-weight: 600;
60
+ }
61
+
62
+ .app-dialog-copy {
63
+ color: var(--color-text-muted);
64
+ font-size: var(--text-sm);
65
+ }
66
+
67
+ .app-dialog-field {
68
+ display: grid;
69
+ gap: var(--space-2);
70
+ }
71
+
72
+ .app-dialog-label {
73
+ color: var(--color-text-muted);
74
+ font-size: var(--text-xs);
75
+ font-weight: 600;
76
+ letter-spacing: 0.08em;
77
+ text-transform: uppercase;
78
+ }
79
+
80
+ .app-dialog-hint {
81
+ color: var(--color-text-muted);
82
+ font-size: var(--text-xs);
83
+ line-height: 1.5;
84
+ }
85
+
86
+ .app-dialog-note {
87
+ overflow-wrap: anywhere;
88
+ padding: var(--space-3);
89
+ border: 1px solid var(--color-border);
90
+ border-radius: var(--radius-md);
91
+ background: var(--color-surface-offset);
92
+ color: var(--color-text);
93
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
94
+ font-size: var(--text-xs);
95
+ line-height: 1.6;
96
+ }
97
+
98
+ .app-dialog-note.is-danger {
99
+ border-color: oklch(from var(--color-error) l c h / 0.35);
100
+ background: var(--color-error-highlight);
101
+ color: var(--color-error);
102
+ }
103
+
104
+ .app-dialog-actions {
105
+ display: flex;
106
+ justify-content: flex-end;
107
+ gap: var(--space-2);
108
+ }
109
+
110
+ .tab-lock-overlay {
111
+ position: fixed;
112
+ inset: 0;
113
+ z-index: 1200;
114
+ display: grid;
115
+ place-items: center;
116
+ padding: var(--space-6);
117
+ background: radial-gradient(circle at top, oklch(from var(--color-primary) l c h / 0.16), transparent 38%), oklch(from var(--color-bg) l c h / 0.82);
118
+ backdrop-filter: blur(10px);
119
+ }
120
+
121
+ .tab-lock-card {
122
+ display: grid;
123
+ gap: var(--space-4);
124
+ width: min(520px, 100%);
125
+ padding: var(--space-6);
126
+ border: 1px solid oklch(from var(--color-primary) l c h / 0.25);
127
+ border-radius: var(--radius-xl);
128
+ background: linear-gradient(180deg, var(--color-surface), var(--color-surface-2));
129
+ box-shadow: var(--shadow-lg);
130
+ }
131
+
132
+ .tab-lock-kicker {
133
+ color: var(--color-primary);
134
+ font-size: var(--text-xs);
135
+ font-weight: 700;
136
+ letter-spacing: 0.08em;
137
+ text-transform: uppercase;
138
+ }
139
+
140
+ .tab-lock-title {
141
+ font-size: var(--text-lg);
142
+ line-height: 1.2;
143
+ }
144
+
145
+ .tab-lock-copy {
146
+ color: var(--color-text-muted);
147
+ font-size: var(--text-sm);
148
+ line-height: 1.6;
149
+ }
150
+
151
+ .tab-lock-actions {
152
+ display: flex;
153
+ justify-content: flex-start;
154
+ }
@@ -0,0 +1,103 @@
1
+ /* ===== COLLABORATION / PRESENCE ===== */
2
+
3
+ .mobile-view-toggle {
4
+ display: none;
5
+ }
6
+
7
+ .user-avatars {
8
+ display: flex;
9
+ align-items: center;
10
+ }
11
+
12
+ .user-avatar {
13
+ position: relative;
14
+ z-index: 1;
15
+ display: flex;
16
+ align-items: center;
17
+ justify-content: center;
18
+ width: 24px;
19
+ height: 24px;
20
+ margin-left: -4px;
21
+ border: 2px solid var(--color-surface);
22
+ border-radius: var(--radius-full);
23
+ color: var(--color-text-on-dark);
24
+ font-size: var(--text-meta);
25
+ font-weight: 600;
26
+ flex-shrink: 0;
27
+ }
28
+
29
+ .user-avatar-initial {
30
+ display: inline-flex;
31
+ align-items: center;
32
+ justify-content: center;
33
+ line-height: 1;
34
+ }
35
+
36
+ .user-avatar:first-child {
37
+ margin-left: 0;
38
+ }
39
+
40
+ .user-avatar.is-local {
41
+ z-index: 5;
42
+ width: auto;
43
+ min-width: 44px;
44
+ margin-right: 6px;
45
+ padding: 0 8px 0 6px;
46
+ gap: 4px;
47
+ border-radius: var(--radius-full);
48
+ box-shadow: var(--shadow-accent-ring);
49
+ }
50
+
51
+ .user-avatar.is-local + .user-avatar {
52
+ margin-left: 0;
53
+ }
54
+
55
+ .user-avatar.is-local .user-avatar-initial {
56
+ width: 14px;
57
+ height: 14px;
58
+ border-radius: var(--radius-full);
59
+ background: var(--surface-avatar-muted);
60
+ font-size: var(--text-micro);
61
+ }
62
+
63
+ .user-avatar-self-label {
64
+ padding: 2px 4px;
65
+ border-radius: var(--radius-full);
66
+ background: var(--surface-avatar-label);
67
+ color: var(--color-text-on-dark);
68
+ font-size: var(--text-micro);
69
+ font-weight: 700;
70
+ letter-spacing: 0.04em;
71
+ line-height: 1;
72
+ text-transform: uppercase;
73
+ }
74
+
75
+ .user-avatar-button {
76
+ cursor: pointer;
77
+ padding: 0;
78
+ transition: transform var(--transition-interactive), box-shadow var(--transition-interactive);
79
+ }
80
+
81
+ .user-avatar-button:hover {
82
+ z-index: 2;
83
+ transform: translateY(-1px);
84
+ }
85
+
86
+ .user-avatar-button:focus-visible {
87
+ z-index: 3;
88
+ outline: none;
89
+ box-shadow: var(--shadow-accent-ring-strong);
90
+ }
91
+
92
+ .user-avatar.is-following {
93
+ z-index: 4;
94
+ box-shadow: var(--shadow-accent-ring-solid);
95
+ }
96
+
97
+ .user-avatar-button.different-file {
98
+ opacity: 0.55;
99
+ }
100
+
101
+ .user-avatar-button.different-file:hover {
102
+ opacity: 0.85;
103
+ }
@@ -0,0 +1,3 @@
1
+ @import './collaboration-presence.css';
2
+ @import './collaboration-chat.css';
3
+ @import './collaboration-dialogs.css';
@@ -0,0 +1,236 @@
1
+ /* ===== COMMENTS / CARD ===== */
2
+
3
+ .comment-card-root {
4
+ position: fixed;
5
+ z-index: 50;
6
+ }
7
+
8
+ .comment-card {
9
+ display: flex;
10
+ flex-direction: column;
11
+ gap: var(--space-3);
12
+ width: min(100%, 520px);
13
+ max-height: min(78vh, 720px);
14
+ overflow: hidden;
15
+ padding: var(--space-4);
16
+ border: 1px solid var(--border-comment-strong);
17
+ border-radius: var(--radius-xl-plus);
18
+ background: var(--surface-comment-card);
19
+ box-shadow: var(--shadow-card-strong);
20
+ animation: comment-card-in 140ms cubic-bezier(0.16, 1, 0.3, 1);
21
+ }
22
+
23
+ .comment-card-header {
24
+ flex-shrink: 0;
25
+ }
26
+
27
+ .comment-card-scroll {
28
+ display: flex;
29
+ flex-direction: column;
30
+ gap: var(--space-3);
31
+ min-height: 0;
32
+ overflow: auto;
33
+ padding-right: 2px;
34
+ }
35
+
36
+ .comment-card-title {
37
+ font-size: var(--text-title-sm);
38
+ font-weight: 700;
39
+ letter-spacing: -0.01em;
40
+ }
41
+
42
+ .comment-card-meta {
43
+ margin-top: 2px;
44
+ color: var(--color-comment);
45
+ font-size: var(--text-meta);
46
+ font-weight: 700;
47
+ letter-spacing: 0.05em;
48
+ text-transform: uppercase;
49
+ }
50
+
51
+ .comment-card-close,
52
+ .comment-thread-card-action {
53
+ border: 1px solid transparent;
54
+ background: var(--surface-comment-offset-soft);
55
+ color: var(--color-text-muted);
56
+ transition: color var(--transition-interactive), background var(--transition-interactive), border-color var(--transition-interactive);
57
+ }
58
+
59
+ .comment-card-close:hover,
60
+ .comment-thread-card-action:hover {
61
+ color: var(--color-text);
62
+ border-color: oklch(from var(--color-comment) l c h / 0.16);
63
+ }
64
+
65
+ .comment-thread-card-action.is-active {
66
+ border-color: oklch(from var(--color-comment) l c h / 0.2);
67
+ background: var(--surface-comment-offset-active);
68
+ color: var(--color-text);
69
+ }
70
+
71
+ .comment-thread-card-action.is-danger {
72
+ color: var(--color-error);
73
+ }
74
+
75
+ .comment-card-quote,
76
+ .comment-thread-card-excerpt {
77
+ padding: var(--space-2) var(--space-3);
78
+ border: 1px solid var(--border-comment-muted);
79
+ border-radius: var(--radius-md);
80
+ background: var(--surface-comment-offset);
81
+ color: var(--color-text-muted);
82
+ font-size: var(--text-label);
83
+ }
84
+
85
+ .comment-card-quote {
86
+ max-height: 11rem;
87
+ overflow: auto;
88
+ overflow-wrap: anywhere;
89
+ padding-bottom: calc(var(--space-3) + 2px);
90
+ white-space: pre-wrap;
91
+ word-break: break-word;
92
+ scrollbar-width: thin;
93
+ font-family: var(--font-mono);
94
+ font-size: var(--text-code-sm);
95
+ line-height: 1.65;
96
+ }
97
+
98
+ .comment-card-form,
99
+ .comment-reply-form {
100
+ display: flex;
101
+ flex-direction: column;
102
+ gap: var(--space-3);
103
+ }
104
+
105
+ .comment-card-actions {
106
+ justify-content: flex-end;
107
+ }
108
+
109
+ .comment-card-input {
110
+ resize: vertical;
111
+ min-height: 88px;
112
+ }
113
+
114
+ .comment-thread-card {
115
+ display: flex;
116
+ flex-direction: column;
117
+ gap: var(--space-3);
118
+ padding-top: var(--space-3);
119
+ border-top: 1px solid var(--color-divider);
120
+ }
121
+
122
+ .comment-thread-card-header {
123
+ align-items: flex-start;
124
+ flex-wrap: wrap;
125
+ }
126
+
127
+ .comment-thread-card-heading {
128
+ display: flex;
129
+ flex: 1 1 160px;
130
+ flex-wrap: wrap;
131
+ gap: var(--space-1) var(--space-2);
132
+ min-width: 0;
133
+ }
134
+
135
+ .comment-thread-card-author,
136
+ .comment-message-card-author {
137
+ font-size: var(--text-label);
138
+ font-weight: 700;
139
+ }
140
+
141
+ .comment-thread-card-time,
142
+ .comment-message-card-time {
143
+ color: var(--color-text-faint);
144
+ font-size: var(--text-meta);
145
+ }
146
+
147
+ .comment-thread-card-actions {
148
+ margin-left: auto;
149
+ justify-content: flex-end;
150
+ }
151
+
152
+ .comment-message-card {
153
+ padding: var(--space-2) var(--space-3);
154
+ border: 1px solid var(--border-comment-soft);
155
+ border-radius: var(--radius-md);
156
+ background: var(--surface-comment-subtle-strong);
157
+ }
158
+
159
+ .comment-message-card-body {
160
+ margin-top: var(--space-1);
161
+ font-size: var(--text-label);
162
+ line-height: 1.65;
163
+ }
164
+
165
+ .comment-reaction-bar {
166
+ display: flex;
167
+ align-items: flex-start;
168
+ justify-content: space-between;
169
+ gap: var(--space-2);
170
+ flex-wrap: wrap;
171
+ margin-top: var(--space-2);
172
+ }
173
+
174
+ .comment-reaction-chips {
175
+ display: flex;
176
+ flex-wrap: wrap;
177
+ gap: var(--space-2);
178
+ }
179
+
180
+ .comment-reaction-actions {
181
+ display: flex;
182
+ align-items: center;
183
+ gap: var(--space-2);
184
+ flex-wrap: wrap;
185
+ }
186
+
187
+ .comment-reaction-chip-emoji,
188
+ .comment-reaction-chip-count {
189
+ line-height: 1;
190
+ }
191
+
192
+ .comment-reaction-picker-wrap {
193
+ position: relative;
194
+ display: inline-flex;
195
+ }
196
+
197
+ .comment-reaction-picker {
198
+ position: absolute;
199
+ top: calc(100% + 8px);
200
+ right: 0;
201
+ z-index: 2;
202
+ display: flex;
203
+ flex-direction: column;
204
+ gap: var(--space-2);
205
+ min-width: 220px;
206
+ overflow: auto;
207
+ padding: var(--space-3);
208
+ border: 1px solid var(--border-comment-strong);
209
+ border-radius: var(--radius-lg);
210
+ background: var(--surface-comment-elevated);
211
+ box-shadow: var(--shadow-lg);
212
+ scrollbar-width: thin;
213
+ }
214
+
215
+ .comment-reaction-picker.is-upward {
216
+ top: auto;
217
+ bottom: calc(100% + 8px);
218
+ }
219
+
220
+ .comment-reaction-picker-grid {
221
+ display: grid;
222
+ grid-template-columns: repeat(5, minmax(0, 1fr));
223
+ gap: var(--space-2);
224
+ }
225
+
226
+ @keyframes comment-card-in {
227
+ from {
228
+ opacity: 0;
229
+ transform: translateY(6px) scale(0.98);
230
+ }
231
+
232
+ to {
233
+ opacity: 1;
234
+ transform: translateY(0) scale(1);
235
+ }
236
+ }
@@ -0,0 +1,127 @@
1
+ /* ===== COMMENTS / MARKDOWN ===== */
2
+
3
+ .comment-markdown {
4
+ color: var(--color-text);
5
+ font-size: var(--text-label);
6
+ line-height: 1.65;
7
+ }
8
+
9
+ .comment-markdown > :first-child {
10
+ margin-top: 0;
11
+ }
12
+
13
+ .comment-markdown > :last-child {
14
+ margin-bottom: 0;
15
+ }
16
+
17
+ .comment-markdown p,
18
+ .comment-markdown ul,
19
+ .comment-markdown ol,
20
+ .comment-markdown blockquote,
21
+ .comment-markdown pre,
22
+ .comment-markdown .comment-markdown-table,
23
+ .comment-markdown table {
24
+ max-width: none;
25
+ }
26
+
27
+ .comment-markdown p,
28
+ .comment-markdown ul,
29
+ .comment-markdown ol,
30
+ .comment-markdown blockquote,
31
+ .comment-markdown pre,
32
+ .comment-markdown .comment-markdown-table {
33
+ margin: var(--space-2) 0;
34
+ }
35
+
36
+ .comment-markdown li + li {
37
+ margin-top: 4px;
38
+ }
39
+
40
+ .comment-markdown ul,
41
+ .comment-markdown ol {
42
+ padding-left: var(--space-5);
43
+ }
44
+
45
+ .comment-markdown a {
46
+ color: var(--color-primary);
47
+ overflow-wrap: anywhere;
48
+ text-decoration: underline;
49
+ }
50
+
51
+ .comment-markdown blockquote {
52
+ padding: var(--space-2) var(--space-3);
53
+ border-left: 3px solid oklch(from var(--color-comment) l c h / 0.45);
54
+ border-radius: 0 var(--radius-md) var(--radius-md) 0;
55
+ background: var(--surface-comment-offset-strong);
56
+ color: var(--color-text-muted);
57
+ }
58
+
59
+ .comment-markdown code {
60
+ padding: 2px 6px;
61
+ border-radius: var(--radius-sm);
62
+ background: var(--surface-comment-offset-soft);
63
+ color: var(--color-primary);
64
+ font-family: var(--font-mono);
65
+ font-size: 0.9em;
66
+ }
67
+
68
+ .comment-markdown pre {
69
+ max-width: 100%;
70
+ overflow: auto;
71
+ border: 1px solid var(--border-comment-muted);
72
+ border-radius: var(--radius-lg);
73
+ background: var(--surface-comment-elevated);
74
+ }
75
+
76
+ .comment-markdown pre code {
77
+ display: block;
78
+ width: max-content;
79
+ min-width: 100%;
80
+ padding: var(--space-3);
81
+ background: none;
82
+ color: var(--color-text);
83
+ white-space: pre;
84
+ font-size: var(--text-label);
85
+ line-height: 1.6;
86
+ }
87
+
88
+ .comment-markdown .comment-markdown-table {
89
+ overflow: auto;
90
+ border: 1px solid var(--border-comment-muted);
91
+ border-radius: var(--radius-md);
92
+ }
93
+
94
+ .comment-markdown table {
95
+ width: 100%;
96
+ border-collapse: collapse;
97
+ }
98
+
99
+ .comment-markdown th,
100
+ .comment-markdown td {
101
+ padding: var(--space-2) var(--space-3);
102
+ border-bottom: 1px solid var(--color-divider);
103
+ text-align: left;
104
+ font-size: var(--text-label);
105
+ }
106
+
107
+ .comment-markdown th {
108
+ background: var(--surface-comment-offset);
109
+ }
110
+
111
+ .comment-markdown-preview > :not(pre):not(blockquote):not(.comment-markdown-table) {
112
+ display: -webkit-box;
113
+ -webkit-box-orient: vertical;
114
+ -webkit-line-clamp: 4;
115
+ overflow: hidden;
116
+ }
117
+
118
+ .comment-markdown-preview pre code {
119
+ width: 100%;
120
+ min-width: 0;
121
+ max-height: 6.6rem;
122
+ overflow: hidden;
123
+ }
124
+
125
+ .comment-markdown-preview .comment-markdown-table {
126
+ display: none;
127
+ }
@@ -0,0 +1,60 @@
1
+ /* ===== COMMENTS / OVERLAYS ===== */
2
+
3
+ .comment-editor-layer,
4
+ .comment-preview-layer,
5
+ .comment-preview-highlights {
6
+ position: absolute;
7
+ inset: 0;
8
+ overflow: visible;
9
+ pointer-events: none;
10
+ }
11
+
12
+ .comment-preview-badge {
13
+ right: calc(var(--preview-comment-rail-inset) - var(--preview-comment-rail-offset, 0px));
14
+ }
15
+
16
+ .comment-marker-icon {
17
+ display: inline-flex;
18
+ width: 12px;
19
+ height: 12px;
20
+ flex: 0 0 auto;
21
+ }
22
+
23
+ .comment-marker-icon svg {
24
+ display: block;
25
+ width: 100%;
26
+ height: 100%;
27
+ }
28
+
29
+ .comment-marker-count {
30
+ line-height: 1;
31
+ }
32
+
33
+ .comment-selection-chip {
34
+ position: absolute;
35
+ }
36
+
37
+ .comment-preview-highlight {
38
+ position: absolute;
39
+ border: 1px solid oklch(from var(--color-comment) l c h / 0.16);
40
+ border-radius: var(--radius-sm);
41
+ background: var(--color-comment-soft);
42
+ opacity: 0.56;
43
+ transition: opacity 140ms ease, background-color 140ms ease, border-color 140ms ease;
44
+ }
45
+
46
+ .comment-preview-highlight.is-passive {
47
+ opacity: 0.32;
48
+ }
49
+
50
+ .comment-preview-highlight.is-hovered {
51
+ opacity: 0.72;
52
+ border-color: oklch(from var(--color-comment) l c h / 0.24);
53
+ background: var(--surface-comment-highlight-hover);
54
+ }
55
+
56
+ .comment-preview-highlight.is-active {
57
+ opacity: 0.9;
58
+ border-color: oklch(from var(--color-comment) l c h / 0.3);
59
+ background: var(--surface-comment-highlight-active);
60
+ }