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,120 @@
1
+ /* ===== COMMENTS / DRAWER ===== */
2
+
3
+ .comments-drawer {
4
+ width: var(--preview-floating-comments-width, var(--panel-comments-width));
5
+ min-width: var(--panel-comments-min-width);
6
+ border-left: 1px solid var(--color-divider);
7
+ background: var(--surface-comment-shell);
8
+ display: flex;
9
+ flex-direction: column;
10
+ min-height: 0;
11
+ box-shadow: inset 1px 0 0 oklch(from var(--color-comment) l c h / 0.06);
12
+ }
13
+
14
+ .comments-drawer-header {
15
+ padding: var(--space-4);
16
+ border-bottom: 1px solid var(--color-divider);
17
+ background: var(--surface-comment-shell-header);
18
+ }
19
+
20
+ .comments-drawer-title {
21
+ color: var(--color-comment);
22
+ font-size: var(--text-label);
23
+ font-weight: 700;
24
+ letter-spacing: 0.06em;
25
+ text-transform: uppercase;
26
+ }
27
+
28
+ .comments-drawer-empty {
29
+ padding: var(--space-4);
30
+ color: var(--color-text-muted);
31
+ font-size: var(--text-label);
32
+ }
33
+
34
+ .comments-drawer-list {
35
+ display: flex;
36
+ flex-direction: column;
37
+ gap: var(--space-3);
38
+ overflow: auto;
39
+ padding: var(--space-3);
40
+ }
41
+
42
+ .comments-drawer-item {
43
+ --ui-record-padding: var(--space-4);
44
+ --ui-record-gap: var(--space-3);
45
+ --ui-record-radius: calc(var(--radius-lg) + 4px);
46
+ --ui-record-border: var(--border-comment-soft);
47
+ --ui-record-bg: var(--surface-comment-record);
48
+ --ui-record-border-hover: oklch(from var(--color-comment) l c h / 0.18);
49
+ --ui-record-bg-hover: var(--surface-comment-record-hover);
50
+ --ui-record-shadow-hover: var(--shadow-md);
51
+ --ui-record-border-active: var(--border-comment-active);
52
+ --ui-record-bg-active: var(--surface-comment-record-active);
53
+ --ui-record-shadow-active: var(--shadow-comment-outline);
54
+ --ui-record-hover-transform: translateY(-1px);
55
+ }
56
+
57
+ .comments-drawer-item-title {
58
+ color: var(--color-comment);
59
+ font-size: var(--text-meta);
60
+ font-weight: 700;
61
+ letter-spacing: 0.05em;
62
+ text-transform: uppercase;
63
+ }
64
+
65
+ .comments-drawer-item-count {
66
+ min-height: 20px;
67
+ border: 1px solid oklch(from var(--color-comment) l c h / 0.18);
68
+ background: var(--color-comment-soft);
69
+ color: var(--color-comment);
70
+ font-weight: 700;
71
+ }
72
+
73
+ .comments-drawer-item-quote {
74
+ max-height: 9.5rem;
75
+ margin: var(--space-3) 0;
76
+ overflow: auto;
77
+ overflow-wrap: anywhere;
78
+ padding: var(--space-3);
79
+ padding-bottom: calc(var(--space-3) + 2px);
80
+ border: 1px solid var(--border-comment-soft);
81
+ border-radius: var(--radius-lg);
82
+ background: var(--surface-comment-offset);
83
+ color: var(--color-text-muted);
84
+ white-space: pre-wrap;
85
+ word-break: break-word;
86
+ scrollbar-width: thin;
87
+ font-family: var(--font-mono);
88
+ font-size: var(--text-code-sm);
89
+ line-height: 1.65;
90
+ }
91
+
92
+ .comments-drawer-item-preview {
93
+ position: relative;
94
+ max-height: 7.8rem;
95
+ overflow: hidden;
96
+ color: var(--color-text-muted);
97
+ }
98
+
99
+ .comments-drawer-item-preview:after {
100
+ content: '';
101
+ position: absolute;
102
+ inset: auto 0 0 0;
103
+ height: 2.5rem;
104
+ background: var(--surface-comment-preview-fade);
105
+ pointer-events: none;
106
+ }
107
+
108
+ .comments-drawer-item-footer {
109
+ align-items: flex-end;
110
+ justify-content: space-between;
111
+ flex-wrap: wrap;
112
+ color: var(--color-text-muted);
113
+ font-size: var(--text-meta);
114
+ font-weight: 600;
115
+ letter-spacing: 0.01em;
116
+ }
117
+
118
+ .comments-drawer-item-updated {
119
+ color: var(--color-text-faint);
120
+ }
@@ -0,0 +1,4 @@
1
+ @import './comments-drawer.css';
2
+ @import './comment-overlays.css';
3
+ @import './comment-card.css';
4
+ @import './comment-markdown.css';
@@ -0,0 +1,227 @@
1
+ /* ===== DIAGRAM PREVIEW ===== */
2
+
3
+ .diagram-preview-shell {
4
+ box-sizing: border-box;
5
+ width: 100%;
6
+ max-width: 100%;
7
+ overflow: hidden;
8
+ margin: var(--space-4) 0;
9
+ border: 1px solid var(--color-border);
10
+ border-radius: var(--radius-md);
11
+ background: var(--color-surface);
12
+ }
13
+
14
+ .diagram-preview-placeholder-card {
15
+ display: flex;
16
+ align-items: center;
17
+ justify-content: space-between;
18
+ gap: var(--space-3);
19
+ padding: var(--space-4);
20
+ background: var(--color-surface);
21
+ }
22
+
23
+ .diagram-preview-placeholder-copy {
24
+ display: grid;
25
+ gap: 2px;
26
+ }
27
+
28
+ .diagram-preview-placeholder-copy strong {
29
+ font-size: var(--text-sm);
30
+ }
31
+
32
+ .diagram-preview-placeholder-copy span {
33
+ color: var(--color-text-muted);
34
+ font-size: var(--text-xs);
35
+ }
36
+
37
+ .diagram-preview-placeholder-btn {
38
+ flex-shrink: 0;
39
+ padding: 4px 10px;
40
+ border: 1px solid var(--color-border);
41
+ border-radius: var(--radius-xs);
42
+ background: var(--color-surface-2);
43
+ color: var(--color-text);
44
+ font-size: var(--text-xs);
45
+ cursor: pointer;
46
+ }
47
+
48
+ .diagram-preview-placeholder-btn:hover {
49
+ background: var(--color-surface-offset);
50
+ }
51
+
52
+ .diagram-preview-toolbar {
53
+ display: flex;
54
+ align-items: center;
55
+ gap: var(--space-2);
56
+ min-width: 0;
57
+ flex-wrap: wrap;
58
+ padding: var(--space-2) var(--space-3);
59
+ border-bottom: 1px solid var(--color-border);
60
+ background: var(--color-surface-raised);
61
+ color: var(--color-text-muted);
62
+ font-size: var(--text-xs);
63
+ user-select: none;
64
+ }
65
+
66
+ .diagram-preview-zoom-label {
67
+ min-width: 52px;
68
+ color: var(--color-text-muted);
69
+ text-align: center;
70
+ font-size: var(--text-xs);
71
+ font-weight: 500;
72
+ font-variant-numeric: tabular-nums;
73
+ }
74
+
75
+ .diagram-preview-frame {
76
+ min-width: 0;
77
+ max-width: 100%;
78
+ max-height: min(70vh, 720px);
79
+ overflow: auto;
80
+ padding: var(--space-3);
81
+ background: transparent;
82
+ overscroll-behavior: contain;
83
+ }
84
+
85
+ .excalidraw-embed,
86
+ .excalidraw-embed-placeholder {
87
+ display: block;
88
+ transition: box-shadow 0.18s ease;
89
+ }
90
+
91
+ .excalidraw-embed-overlay-root {
92
+ position: absolute;
93
+ inset: 0;
94
+ z-index: 1;
95
+ pointer-events: none;
96
+ }
97
+
98
+ .excalidraw-maximized-root {
99
+ position: fixed;
100
+ inset: 0;
101
+ z-index: 171;
102
+ pointer-events: none;
103
+ }
104
+
105
+ body.excalidraw-maximized-open {
106
+ overflow: hidden;
107
+ }
108
+
109
+ body.excalidraw-maximized-open::before {
110
+ content: '';
111
+ position: fixed;
112
+ inset: 0;
113
+ z-index: 170;
114
+ background: var(--surface-scrim);
115
+ backdrop-filter: blur(2px);
116
+ }
117
+
118
+ body.excalidraw-maximized-open .excalidraw-maximized-root {
119
+ z-index: 171;
120
+ }
121
+
122
+ body.excalidraw-maximized-open .resizer {
123
+ opacity: 0;
124
+ pointer-events: none;
125
+ }
126
+
127
+ .excalidraw-embed:hover {
128
+ box-shadow: var(--shadow-elevated-soft);
129
+ }
130
+
131
+ .excalidraw-embed-placeholder.is-hydrated {
132
+ visibility: hidden;
133
+ }
134
+
135
+ .excalidraw-embed-header {
136
+ gap: var(--space-2);
137
+ }
138
+
139
+ .excalidraw-embed-icon {
140
+ display: flex;
141
+ align-items: center;
142
+ flex-shrink: 0;
143
+ color: var(--color-primary);
144
+ }
145
+
146
+ .excalidraw-embed-label {
147
+ flex: 1;
148
+ min-width: 0;
149
+ overflow: hidden;
150
+ text-overflow: ellipsis;
151
+ white-space: nowrap;
152
+ font-weight: 500;
153
+ }
154
+
155
+ .excalidraw-embed-iframe {
156
+ display: block;
157
+ width: 100%;
158
+ min-height: 200px;
159
+ border: none;
160
+ background: var(--surface-embed-canvas);
161
+ }
162
+
163
+ .excalidraw-embed.is-maximized {
164
+ position: fixed;
165
+ inset: var(--space-4);
166
+ z-index: 172;
167
+ display: flex;
168
+ flex-direction: column;
169
+ width: auto;
170
+ max-width: none;
171
+ margin: 0;
172
+ box-sizing: border-box;
173
+ border-radius: var(--radius-lg-plus);
174
+ box-shadow: var(--shadow-media-modal);
175
+ }
176
+
177
+ .excalidraw-embed.is-maximized .excalidraw-embed-header {
178
+ flex-shrink: 0;
179
+ }
180
+
181
+ .excalidraw-embed.is-maximized .excalidraw-embed-iframe {
182
+ flex: 1;
183
+ min-height: 0;
184
+ height: auto !important;
185
+ }
186
+
187
+ .excalidraw-embed.is-maximized .excalidraw-embed-resizer {
188
+ display: none;
189
+ }
190
+
191
+ .excalidraw-embed-resizer {
192
+ position: relative;
193
+ height: 6px;
194
+ background: var(--color-border);
195
+ cursor: ns-resize;
196
+ transition: background 0.18s ease;
197
+ }
198
+
199
+ .excalidraw-embed-resizer::after {
200
+ content: '';
201
+ position: absolute;
202
+ top: 50%;
203
+ left: 50%;
204
+ width: 32px;
205
+ height: 3px;
206
+ border-radius: var(--radius-2xs);
207
+ background: var(--color-text-faint);
208
+ opacity: 0;
209
+ transform: translate(-50%, -50%);
210
+ transition: opacity 0.18s ease;
211
+ }
212
+
213
+ .excalidraw-embed-resizer:hover {
214
+ background: var(--color-primary);
215
+ }
216
+
217
+ .excalidraw-embed-resizer:hover::after {
218
+ opacity: 1;
219
+ }
220
+
221
+ .file-tree-file.is-excalidraw .file-tree-icon {
222
+ color: var(--color-primary);
223
+ }
224
+
225
+ .file-tree-file.is-mermaid .file-tree-icon {
226
+ color: oklch(from var(--color-primary) calc(l * 0.96) calc(c * 0.86) 215);
227
+ }
@@ -0,0 +1,268 @@
1
+ /* ===== DIFF / COMMIT SHELL ===== */
2
+
3
+ .diff-commit-header {
4
+ display: flex;
5
+ flex-direction: column;
6
+ gap: var(--space-2);
7
+ padding: var(--space-4);
8
+ border-bottom: 1px solid var(--color-divider);
9
+ background: linear-gradient(180deg, var(--surface-accent-subtle), var(--color-surface));
10
+ }
11
+
12
+ .diff-commit-subject {
13
+ color: var(--color-text);
14
+ font-size: var(--text-title-md);
15
+ font-weight: 700;
16
+ line-height: 1.3;
17
+ }
18
+
19
+ .diff-commit-meta {
20
+ display: flex;
21
+ flex-wrap: wrap;
22
+ align-items: center;
23
+ gap: var(--space-2);
24
+ color: var(--color-text-muted);
25
+ font-size: var(--text-label);
26
+ }
27
+
28
+ .diff-commit-meta-secondary {
29
+ color: var(--color-text-faint);
30
+ font-family: var(--font-mono);
31
+ font-size: var(--text-meta);
32
+ }
33
+
34
+ .diff-commit-shell {
35
+ display: grid;
36
+ grid-template-columns: minmax(210px, 242px) minmax(0, 1fr);
37
+ gap: 10px;
38
+ align-items: start;
39
+ padding: 10px;
40
+ }
41
+
42
+ .diff-commit-index {
43
+ position: sticky;
44
+ top: var(--space-4);
45
+ display: flex;
46
+ flex-direction: column;
47
+ gap: 8px;
48
+ max-height: calc(100dvh - 220px);
49
+ overflow: hidden;
50
+ padding: 8px;
51
+ border: 1px solid var(--color-divider);
52
+ border-radius: calc(var(--radius-lg) + 2px);
53
+ background: var(--surface-overlay-raised);
54
+ box-shadow: var(--shadow-elevated-soft);
55
+ }
56
+
57
+ .diff-commit-index-header {
58
+ padding-inline: 1px;
59
+ color: var(--color-text-faint);
60
+ font-size: var(--text-caption);
61
+ font-weight: 700;
62
+ letter-spacing: 0.1em;
63
+ text-transform: uppercase;
64
+ }
65
+
66
+ .diff-commit-index-list {
67
+ display: flex;
68
+ flex-direction: column;
69
+ gap: 5px;
70
+ overflow-x: hidden;
71
+ overflow-y: auto;
72
+ padding-block-end: 2px;
73
+ }
74
+
75
+ .diff-index-item {
76
+ --ui-record-padding: 8px 9px;
77
+ --ui-record-gap: 4px;
78
+ --ui-record-border: var(--color-border);
79
+ --ui-record-bg: var(--surface-overlay-offset);
80
+ --ui-record-border-hover: var(--color-border);
81
+ --ui-record-bg-hover: var(--surface-fill-strong);
82
+ --ui-record-border-active: var(--border-accent-strong);
83
+ --ui-record-bg-active: var(--surface-accent-subtle);
84
+ --ui-record-shadow-active: var(--shadow-accent-inset);
85
+ }
86
+
87
+ .diff-index-item-top,
88
+ .diff-index-item-meta {
89
+ gap: 6px;
90
+ }
91
+
92
+ .diff-index-item-name {
93
+ font-size: var(--text-label);
94
+ font-weight: 700;
95
+ }
96
+
97
+ .diff-index-item-path {
98
+ font-size: var(--text-caption);
99
+ }
100
+
101
+ .diff-index-item-meta {
102
+ font-family: var(--font-mono);
103
+ font-size: var(--text-caption);
104
+ }
105
+
106
+ .diff-commit-main {
107
+ min-width: 0;
108
+ }
109
+
110
+ .diff-commit-sections {
111
+ display: flex;
112
+ flex-direction: column;
113
+ gap: 10px;
114
+ }
115
+
116
+ .diff-commit-section {
117
+ overflow: hidden;
118
+ border: 1px solid var(--color-divider);
119
+ border-radius: calc(var(--radius-lg) + 2px);
120
+ background: var(--surface-overlay-raised);
121
+ }
122
+
123
+ .diff-commit-section.active {
124
+ border-color: var(--border-accent-strong);
125
+ box-shadow: var(--shadow-accent-outline);
126
+ }
127
+
128
+ .diff-commit-section-header {
129
+ display: flex;
130
+ align-items: center;
131
+ justify-content: space-between;
132
+ gap: var(--space-3);
133
+ width: 100%;
134
+ padding: 10px 14px;
135
+ background: var(--surface-overlay-offset);
136
+ text-align: left;
137
+ }
138
+
139
+ .diff-commit-section-header:hover {
140
+ background: var(--surface-fill-strong);
141
+ }
142
+
143
+ .diff-commit-section-main,
144
+ .diff-commit-section-meta {
145
+ display: flex;
146
+ align-items: center;
147
+ gap: var(--space-2);
148
+ min-width: 0;
149
+ }
150
+
151
+ .diff-commit-section-main {
152
+ flex: 1;
153
+ }
154
+
155
+ .diff-section-chevron {
156
+ flex-shrink: 0;
157
+ color: var(--color-text-faint);
158
+ transition: transform 150ms ease;
159
+ }
160
+
161
+ .diff-section-chevron.collapsed {
162
+ transform: rotate(-90deg);
163
+ }
164
+
165
+ .diff-commit-section-copy {
166
+ display: flex;
167
+ flex-direction: column;
168
+ min-width: 0;
169
+ }
170
+
171
+ .diff-commit-section-name {
172
+ overflow: hidden;
173
+ color: var(--color-text);
174
+ text-overflow: ellipsis;
175
+ white-space: nowrap;
176
+ font-size: var(--text-ui-sm);
177
+ font-weight: 700;
178
+ }
179
+
180
+ .diff-commit-section-path {
181
+ overflow: hidden;
182
+ color: var(--color-text-faint);
183
+ text-overflow: ellipsis;
184
+ white-space: nowrap;
185
+ font-size: var(--text-meta);
186
+ }
187
+
188
+ .diff-commit-section-meta {
189
+ flex-shrink: 0;
190
+ flex-wrap: wrap;
191
+ justify-content: flex-end;
192
+ font-family: var(--font-mono);
193
+ font-size: var(--text-meta);
194
+ font-weight: 700;
195
+ }
196
+
197
+ .diff-commit-section-body {
198
+ padding: 0;
199
+ }
200
+
201
+ .diff-commit-shell-focused .diff-commit-main .diff-file-block {
202
+ overflow: hidden;
203
+ border: 1px solid var(--color-divider);
204
+ border-radius: calc(var(--radius-lg) + 2px);
205
+ }
206
+
207
+ .diff-file-block {
208
+ margin-bottom: 0;
209
+ }
210
+
211
+ .diff-file-header {
212
+ position: sticky;
213
+ top: 0;
214
+ z-index: 5;
215
+ display: flex;
216
+ align-items: center;
217
+ gap: var(--space-2);
218
+ padding: 8px 14px;
219
+ border-top: 1px solid var(--color-divider);
220
+ border-bottom: 1px solid var(--color-divider);
221
+ background: var(--color-surface-offset);
222
+ }
223
+
224
+ .diff-file-header:first-child {
225
+ border-top: none;
226
+ }
227
+
228
+ .diff-file-path {
229
+ color: var(--color-text);
230
+ font-family: var(--font-mono);
231
+ font-size: var(--text-label);
232
+ font-weight: 500;
233
+ }
234
+
235
+ .diff-file-header-stats {
236
+ display: inline-flex;
237
+ gap: var(--space-2);
238
+ margin-left: auto;
239
+ font-family: var(--font-mono);
240
+ font-size: var(--text-meta);
241
+ }
242
+
243
+ .diff-binary-message,
244
+ .diff-empty-state {
245
+ padding: var(--space-4);
246
+ color: var(--color-text-faint);
247
+ }
248
+
249
+ .diff-limit-card {
250
+ display: flex;
251
+ flex-direction: column;
252
+ align-items: flex-start;
253
+ gap: var(--space-2);
254
+ padding: var(--space-4);
255
+ border-top: 1px solid var(--color-divider);
256
+ color: var(--color-text-muted);
257
+ }
258
+
259
+ .diff-limit-card strong {
260
+ color: var(--color-text);
261
+ font-size: var(--text-sm);
262
+ }
263
+
264
+ .diff-load-full-btn {
265
+ margin-top: var(--space-1);
266
+ font-size: var(--text-label);
267
+ font-weight: 600;
268
+ }