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,105 @@
1
+ /* ===== GIT / FILES ===== */
2
+
3
+ .git-section {
4
+ border-bottom: 1px solid var(--color-divider);
5
+ }
6
+
7
+ .git-section-header {
8
+ display: flex;
9
+ align-items: center;
10
+ gap: 6px;
11
+ width: 100%;
12
+ padding: var(--space-2) var(--space-3);
13
+ background: transparent;
14
+ color: var(--color-text-muted);
15
+ font-size: var(--text-meta);
16
+ font-weight: 600;
17
+ letter-spacing: 0.05em;
18
+ text-transform: uppercase;
19
+ text-align: left;
20
+ }
21
+
22
+ .git-section-header:hover {
23
+ background: var(--color-surface-offset);
24
+ }
25
+
26
+ .git-section-count {
27
+ min-height: 20px;
28
+ }
29
+
30
+ .git-section-chevron {
31
+ color: var(--color-text-faint);
32
+ transition: transform 150ms ease;
33
+ }
34
+
35
+ .git-section-chevron.collapsed {
36
+ transform: rotate(-90deg);
37
+ }
38
+
39
+ .git-file-list {
40
+ padding: var(--space-1) 0;
41
+ }
42
+
43
+ .git-file-row {
44
+ margin: 0 var(--space-2) 2px;
45
+ --ui-item-row-bg-hover: var(--color-surface-offset);
46
+ --ui-item-row-bg-active: var(--color-primary-highlight);
47
+ }
48
+
49
+ .git-file-item {
50
+ padding: 5px var(--space-2) 5px calc(var(--space-2) + 10px);
51
+ border-radius: calc(var(--radius-md) - 2px);
52
+ background: transparent;
53
+ color: var(--color-text-muted);
54
+ text-align: left;
55
+ transition: color var(--transition-interactive);
56
+ }
57
+
58
+ .git-file-item:hover {
59
+ color: var(--color-text);
60
+ }
61
+
62
+ .git-file-item.active {
63
+ color: var(--color-primary);
64
+ }
65
+
66
+ .git-file-row.active .git-file-path {
67
+ color: color-mix(in oklab, var(--color-primary) 56%, var(--color-text-muted));
68
+ }
69
+
70
+ .git-file-icon {
71
+ flex-shrink: 0;
72
+ opacity: 0.5;
73
+ }
74
+
75
+ .git-file-copy {
76
+ min-width: 0;
77
+ }
78
+
79
+ .git-file-name {
80
+ overflow: hidden;
81
+ text-overflow: ellipsis;
82
+ white-space: nowrap;
83
+ font-size: var(--text-ui-sm);
84
+ }
85
+
86
+ .git-file-path {
87
+ overflow: hidden;
88
+ color: var(--color-text-faint);
89
+ text-overflow: ellipsis;
90
+ white-space: nowrap;
91
+ font-size: var(--text-meta);
92
+ }
93
+
94
+ .git-file-actions {
95
+ padding-right: 4px;
96
+ }
97
+
98
+ .git-file-actions .ui-action-icon {
99
+ width: 30px;
100
+ }
101
+
102
+ .git-file-row.active .ui-action-icon--surface {
103
+ background: var(--surface-accent-subtle);
104
+ color: var(--color-text);
105
+ }
@@ -0,0 +1,339 @@
1
+ /* ===== GIT / HISTORY ===== */
2
+
3
+ .git-history-list {
4
+ display: flex;
5
+ flex-direction: column;
6
+ gap: var(--space-1);
7
+ padding: var(--space-3);
8
+ }
9
+
10
+ .git-history-row {
11
+ --ui-record-padding: 10px 11px;
12
+ --ui-record-gap: 4px;
13
+ --ui-record-border: var(--color-border);
14
+ --ui-record-bg: var(--surface-overlay-raised);
15
+ --ui-record-border-hover: var(--border-accent-muted);
16
+ --ui-record-bg-hover: var(--surface-fill-subtle);
17
+ --ui-record-border-active: var(--border-accent-stronger);
18
+ --ui-record-bg-active: var(--surface-accent-subtle);
19
+ --ui-record-shadow-active: var(--shadow-accent-inset);
20
+ }
21
+
22
+ .git-history-subject {
23
+ color: var(--color-text);
24
+ font-size: var(--text-label);
25
+ font-weight: 700;
26
+ }
27
+
28
+ .git-history-row-top,
29
+ .git-history-row-meta,
30
+ .git-history-row-stats {
31
+ gap: var(--space-2);
32
+ }
33
+
34
+ .git-history-hash {
35
+ flex-shrink: 0;
36
+ }
37
+
38
+ .git-history-row-meta {
39
+ color: var(--color-text-faint);
40
+ font-size: var(--text-caption);
41
+ }
42
+
43
+ .git-history-row-stats {
44
+ font-family: var(--font-mono);
45
+ font-size: var(--text-caption);
46
+ font-weight: 700;
47
+ }
48
+
49
+ .git-history-footer {
50
+ padding: 0 var(--space-3) var(--space-3);
51
+ }
52
+
53
+ .git-history-load-more {
54
+ width: 100%;
55
+ }
56
+
57
+ .file-history-shell {
58
+ --file-history-shell-chrome-offset: calc(
59
+ var(--toolbar-h)
60
+ + var(--control-h-md)
61
+ + (var(--space-2) * 2)
62
+ + (var(--space-3) * 2)
63
+ + 1px
64
+ );
65
+ box-sizing: border-box;
66
+ display: grid;
67
+ flex: 1 0 auto;
68
+ grid-template-columns: minmax(260px, 320px) minmax(0, 1fr);
69
+ align-items: start;
70
+ gap: var(--space-3);
71
+ overflow: visible;
72
+ width: 100%;
73
+ min-height: 0;
74
+ padding: var(--space-3);
75
+ }
76
+
77
+ .file-history-sidebar,
78
+ .file-history-detail {
79
+ min-width: 0;
80
+ }
81
+
82
+ .file-history-sidebar {
83
+ position: sticky;
84
+ top: var(--space-4);
85
+ align-self: start;
86
+ display: flex;
87
+ flex-direction: column;
88
+ gap: var(--space-3);
89
+ max-height: calc(100dvh - var(--file-history-shell-chrome-offset));
90
+ min-height: 0;
91
+ overflow: hidden;
92
+ padding: var(--space-3);
93
+ border: 1px solid var(--color-divider);
94
+ border-radius: var(--radius-xl);
95
+ background: var(--surface-overlay-raised);
96
+ box-shadow: var(--shadow-elevated-soft);
97
+ }
98
+
99
+ .file-history-sidebar-header {
100
+ display: grid;
101
+ gap: var(--space-2);
102
+ }
103
+
104
+ .file-history-sidebar-copy {
105
+ margin: 0;
106
+ color: var(--color-text-muted);
107
+ font-size: var(--text-caption);
108
+ line-height: 1.5;
109
+ }
110
+
111
+ .file-history-kicker {
112
+ color: var(--color-text-faint);
113
+ font-size: var(--text-caption);
114
+ font-weight: 700;
115
+ letter-spacing: 0.1em;
116
+ text-transform: uppercase;
117
+ }
118
+
119
+ .file-history-title {
120
+ display: grid;
121
+ gap: var(--space-1);
122
+ }
123
+
124
+ .file-history-path {
125
+ color: var(--color-text);
126
+ font-size: var(--text-title-sm);
127
+ font-weight: 700;
128
+ }
129
+
130
+ .file-history-dir {
131
+ color: var(--color-text-muted);
132
+ font-size: var(--text-caption);
133
+ }
134
+
135
+ .file-history-list {
136
+ display: flex;
137
+ flex-direction: column;
138
+ gap: var(--space-2);
139
+ flex: 1 1 auto;
140
+ min-height: 0;
141
+ min-width: 0;
142
+ padding: 0;
143
+ overflow-y: auto;
144
+ overflow-x: hidden;
145
+ }
146
+
147
+ .file-history-item {
148
+ --ui-record-padding: var(--space-3);
149
+ --ui-record-gap: var(--space-2);
150
+ --ui-record-border: var(--color-border);
151
+ --ui-record-bg: var(--surface-overlay-offset);
152
+ --ui-record-border-hover: var(--color-border);
153
+ --ui-record-bg-hover: var(--surface-fill-strong);
154
+ --ui-record-border-active: var(--border-accent-strong);
155
+ --ui-record-bg-active: var(--surface-accent-subtle);
156
+ --ui-record-shadow-active: var(--shadow-accent-inset);
157
+ box-sizing: border-box;
158
+ display: block;
159
+ max-width: 100%;
160
+ width: 100%;
161
+ text-align: left;
162
+ }
163
+
164
+ .file-history-item.active {
165
+ border-color: var(--border-accent-strong);
166
+ box-shadow: var(--shadow-accent-outline);
167
+ }
168
+
169
+ .file-history-item-local {
170
+ --ui-record-border: color-mix(in srgb, var(--color-primary) 20%, var(--color-divider));
171
+ --ui-record-bg: color-mix(in srgb, var(--surface-accent-subtle) 58%, var(--surface-overlay-offset));
172
+ }
173
+
174
+ .file-history-item-top,
175
+ .file-history-item-copy {
176
+ display: flex;
177
+ gap: var(--space-2);
178
+ min-width: 0;
179
+ }
180
+
181
+ .file-history-item-top {
182
+ align-items: flex-start;
183
+ justify-content: space-between;
184
+ }
185
+
186
+ .file-history-item-copy {
187
+ flex: 1;
188
+ flex-direction: column;
189
+ }
190
+
191
+ .file-history-item-title {
192
+ overflow: hidden;
193
+ color: var(--color-text);
194
+ text-overflow: ellipsis;
195
+ white-space: nowrap;
196
+ font-size: var(--text-label);
197
+ font-weight: 700;
198
+ }
199
+
200
+ .file-history-item-meta {
201
+ overflow: hidden;
202
+ color: var(--color-text-faint);
203
+ text-overflow: ellipsis;
204
+ white-space: nowrap;
205
+ font-size: var(--text-caption);
206
+ }
207
+
208
+ .file-history-item-badge {
209
+ flex-shrink: 0;
210
+ }
211
+
212
+ .file-history-item-stats {
213
+ display: inline-flex;
214
+ gap: var(--space-2);
215
+ color: var(--color-text-faint);
216
+ font-family: var(--font-mono);
217
+ font-size: var(--text-caption);
218
+ font-weight: 700;
219
+ }
220
+
221
+ .file-history-footer {
222
+ padding: 0;
223
+ }
224
+
225
+ .file-history-detail {
226
+ align-self: start;
227
+ display: grid;
228
+ grid-template-rows: auto auto;
229
+ gap: var(--space-3);
230
+ min-height: 0;
231
+ min-width: 0;
232
+ }
233
+
234
+ .file-history-detail-header {
235
+ display: grid;
236
+ grid-template-columns: minmax(0, 1fr) auto;
237
+ align-items: start;
238
+ align-content: start;
239
+ gap: var(--space-3) var(--space-4);
240
+ padding: var(--space-4);
241
+ border: 1px solid var(--color-divider);
242
+ border-radius: var(--radius-xl);
243
+ background: linear-gradient(180deg, var(--surface-accent-subtle), var(--color-surface));
244
+ overflow: hidden;
245
+ }
246
+
247
+ .file-history-detail-copy {
248
+ display: grid;
249
+ gap: var(--space-1);
250
+ min-width: 0;
251
+ }
252
+
253
+ .file-history-detail-kicker {
254
+ color: var(--color-text-faint);
255
+ font-size: var(--text-caption);
256
+ font-weight: 700;
257
+ letter-spacing: 0.08em;
258
+ text-transform: uppercase;
259
+ }
260
+
261
+ .file-history-detail-title {
262
+ margin: 0;
263
+ color: var(--color-text);
264
+ font-size: var(--text-title-md);
265
+ font-weight: 700;
266
+ line-height: 1.3;
267
+ }
268
+
269
+ .file-history-detail-meta {
270
+ margin: 0;
271
+ color: var(--color-text-muted);
272
+ font-size: var(--text-label);
273
+ line-height: 1.5;
274
+ }
275
+
276
+ .file-history-detail-actions {
277
+ display: flex;
278
+ flex-wrap: wrap;
279
+ justify-content: flex-end;
280
+ gap: var(--space-2);
281
+ align-self: start;
282
+ flex-shrink: 0;
283
+ }
284
+
285
+ .file-history-detail-body {
286
+ border: 1px solid var(--color-divider);
287
+ border-radius: var(--radius-xl);
288
+ background: var(--surface-overlay-raised);
289
+ min-height: auto;
290
+ min-width: 0;
291
+ overflow-x: auto;
292
+ overflow-y: hidden;
293
+ }
294
+
295
+ .file-history-diff-block {
296
+ width: max-content;
297
+ min-width: 100%;
298
+ overflow: visible;
299
+ }
300
+
301
+ .file-history-diff-block .diff-file-header,
302
+ .file-history-diff-block .diff-hunk-header,
303
+ .file-history-diff-block .diff-line,
304
+ .file-history-diff-block .diff-split-hunk,
305
+ .file-history-diff-block .diff-split-row {
306
+ min-width: max-content;
307
+ }
308
+
309
+ @media (max-width: 960px) {
310
+ .file-history-shell {
311
+ grid-template-columns: 1fr;
312
+ flex: 0 0 auto;
313
+ overflow: visible;
314
+ }
315
+
316
+ .file-history-sidebar {
317
+ position: static;
318
+ max-height: none;
319
+ }
320
+ }
321
+
322
+ @media (max-width: 768px) {
323
+ .file-history-shell {
324
+ padding: var(--space-3);
325
+ }
326
+
327
+ .file-history-detail-header {
328
+ flex-direction: column;
329
+ }
330
+
331
+ .file-history-detail-actions {
332
+ width: 100%;
333
+ justify-content: stretch;
334
+ }
335
+
336
+ .file-history-detail-actions .ui-button {
337
+ flex: 1;
338
+ }
339
+ }
@@ -0,0 +1,3 @@
1
+ @import './git-branch.css';
2
+ @import './git-files.css';
3
+ @import './git-history.css';
@@ -0,0 +1,157 @@
1
+ /* ===== PREVIEW / MEDIA LIGHTBOX ===== */
2
+
3
+ .image-lightbox-root {
4
+ position: fixed;
5
+ inset: 0;
6
+ z-index: 220;
7
+ display: grid;
8
+ place-items: center;
9
+ pointer-events: auto;
10
+ }
11
+
12
+ .image-lightbox-root[hidden] {
13
+ display: none !important;
14
+ }
15
+
16
+ .image-lightbox-backdrop {
17
+ position: absolute;
18
+ inset: 0;
19
+ border: none;
20
+ background: var(--surface-scrim-strong);
21
+ backdrop-filter: blur(10px);
22
+ cursor: zoom-out;
23
+ }
24
+
25
+ .image-lightbox-shell {
26
+ position: absolute;
27
+ inset: 0;
28
+ z-index: 1;
29
+ }
30
+
31
+ .image-lightbox-toolbar {
32
+ position: absolute;
33
+ top: var(--space-5);
34
+ left: var(--space-5);
35
+ right: var(--space-5);
36
+ z-index: 2;
37
+ display: flex;
38
+ align-items: center;
39
+ justify-content: space-between;
40
+ gap: var(--space-3);
41
+ pointer-events: none;
42
+ }
43
+
44
+ .image-lightbox-title {
45
+ min-width: 0;
46
+ overflow: hidden;
47
+ padding: 8px 12px;
48
+ border-radius: var(--radius-full);
49
+ background: var(--surface-inverse-glass);
50
+ color: var(--color-text-on-dark);
51
+ text-overflow: ellipsis;
52
+ white-space: nowrap;
53
+ backdrop-filter: blur(12px);
54
+ box-shadow: var(--shadow-media-soft);
55
+ pointer-events: auto;
56
+ font-size: var(--text-xs);
57
+ font-weight: 600;
58
+ }
59
+
60
+ .image-lightbox-controls {
61
+ display: inline-flex;
62
+ align-items: center;
63
+ justify-content: flex-end;
64
+ gap: var(--space-2);
65
+ flex-wrap: wrap;
66
+ pointer-events: auto;
67
+ }
68
+
69
+ .image-lightbox-btn {
70
+ min-width: 0;
71
+ padding: 8px 12px;
72
+ border: none;
73
+ border-radius: var(--radius-full);
74
+ background: var(--surface-inverse-glass);
75
+ color: var(--color-text-on-dark);
76
+ backdrop-filter: blur(12px);
77
+ box-shadow: var(--shadow-media-soft);
78
+ transition: background 0.18s ease, transform 0.18s ease;
79
+ font-size: var(--text-xs);
80
+ font-weight: 600;
81
+ }
82
+
83
+ .image-lightbox-btn:hover:not(:disabled) {
84
+ background: var(--surface-inverse-glass-hover);
85
+ }
86
+
87
+ .image-lightbox-btn:disabled {
88
+ opacity: 0.45;
89
+ cursor: default;
90
+ }
91
+
92
+ .image-lightbox-zoom-label {
93
+ min-width: 58px;
94
+ padding: 8px 12px;
95
+ border-radius: var(--radius-full);
96
+ background: var(--surface-inverse-glass);
97
+ color: var(--color-text-on-dark);
98
+ text-align: center;
99
+ backdrop-filter: blur(12px);
100
+ box-shadow: var(--shadow-media-soft);
101
+ font-size: var(--text-xs);
102
+ font-weight: 600;
103
+ font-variant-numeric: tabular-nums;
104
+ }
105
+
106
+ .image-lightbox-viewport {
107
+ position: absolute;
108
+ inset: 0;
109
+ overflow: hidden;
110
+ touch-action: none;
111
+ user-select: none;
112
+ }
113
+
114
+ .image-lightbox-viewport.is-dragging .image-lightbox-image {
115
+ cursor: grabbing !important;
116
+ }
117
+
118
+ .image-lightbox-image {
119
+ position: absolute;
120
+ inset: 0;
121
+ width: auto;
122
+ height: auto;
123
+ max-width: calc(100vw - (var(--space-8) * 2));
124
+ max-height: calc(100vh - (var(--space-8) * 2));
125
+ margin: auto;
126
+ object-fit: contain;
127
+ transform-origin: center center;
128
+ will-change: transform;
129
+ box-shadow: var(--shadow-media-stage);
130
+ }
131
+
132
+ body.image-lightbox-open {
133
+ overflow: hidden;
134
+ }
135
+
136
+ @media (max-width: 768px) {
137
+ .image-lightbox-toolbar {
138
+ top: var(--space-3);
139
+ left: var(--space-3);
140
+ right: var(--space-3);
141
+ flex-direction: column;
142
+ align-items: flex-start;
143
+ }
144
+
145
+ .image-lightbox-controls {
146
+ justify-content: flex-start;
147
+ }
148
+
149
+ .image-lightbox-btn {
150
+ flex: 0 0 auto;
151
+ }
152
+
153
+ .image-lightbox-image {
154
+ max-width: calc(100vw - (var(--space-4) * 2));
155
+ max-height: calc(100vh - (var(--space-4) * 2));
156
+ }
157
+ }
@@ -0,0 +1,115 @@
1
+ /* ===== PREVIEW SIDEBARS / OUTLINE ===== */
2
+
3
+ .outline-panel {
4
+ display: flex;
5
+ flex-direction: column;
6
+ width: var(--preview-floating-outline-width, var(--panel-outline-width));
7
+ flex-shrink: 0;
8
+ overflow: hidden;
9
+ border-left: 1px solid var(--color-divider);
10
+ background: var(--color-surface-offset);
11
+ transition: width 0.2s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.15s ease;
12
+ }
13
+
14
+ .outline-panel.hidden {
15
+ width: 0;
16
+ border-left: none;
17
+ opacity: 0;
18
+ pointer-events: none;
19
+ }
20
+
21
+ .outline-header {
22
+ padding: var(--space-2) var(--space-3);
23
+ border-bottom: 1px solid var(--color-divider);
24
+ flex-shrink: 0;
25
+ }
26
+
27
+ .outline-title {
28
+ color: var(--color-text-muted);
29
+ font-size: var(--text-meta);
30
+ font-weight: 600;
31
+ letter-spacing: 0.05em;
32
+ text-transform: uppercase;
33
+ }
34
+
35
+ .outline-nav {
36
+ flex: 1;
37
+ overflow-x: hidden;
38
+ overflow-y: auto;
39
+ padding: var(--space-2) 0;
40
+ }
41
+
42
+ .outline-nav::-webkit-scrollbar {
43
+ width: 4px;
44
+ }
45
+
46
+ .outline-nav::-webkit-scrollbar-thumb {
47
+ background: var(--color-surface-dynamic);
48
+ border-radius: var(--radius-full);
49
+ }
50
+
51
+ .outline-item {
52
+ display: block;
53
+ width: 100%;
54
+ padding: 3px var(--space-3);
55
+ border: none;
56
+ border-left: 2px solid transparent;
57
+ background: none;
58
+ color: var(--color-text-muted);
59
+ text-align: left;
60
+ white-space: nowrap;
61
+ overflow: hidden;
62
+ text-overflow: ellipsis;
63
+ cursor: pointer;
64
+ transition: color var(--transition-interactive), border-color var(--transition-interactive), background var(--transition-interactive);
65
+ font-family: var(--font-body);
66
+ font-size: var(--text-label);
67
+ line-height: 1.5;
68
+ }
69
+
70
+ .outline-item:hover {
71
+ color: var(--color-text);
72
+ background: var(--color-surface-dynamic);
73
+ }
74
+
75
+ .outline-item.active {
76
+ border-left-color: var(--color-primary);
77
+ background: oklch(from var(--color-primary) l c h / 0.06);
78
+ color: var(--color-primary);
79
+ }
80
+
81
+ .outline-item[data-level='1'] {
82
+ padding-left: var(--space-3);
83
+ font-weight: 600;
84
+ }
85
+
86
+ .outline-item[data-level='2'] {
87
+ padding-left: calc(var(--space-3) + 12px);
88
+ }
89
+
90
+ .outline-item[data-level='3'] {
91
+ padding-left: calc(var(--space-3) + 24px);
92
+ font-size: var(--text-meta);
93
+ }
94
+
95
+ .outline-item[data-level='4'] {
96
+ padding-left: calc(var(--space-3) + 36px);
97
+ font-size: var(--text-meta);
98
+ }
99
+
100
+ .outline-item[data-level='5'] {
101
+ padding-left: calc(var(--space-3) + 48px);
102
+ font-size: var(--text-meta);
103
+ }
104
+
105
+ .outline-item[data-level='6'] {
106
+ padding-left: calc(var(--space-3) + 60px);
107
+ font-size: var(--text-meta);
108
+ }
109
+
110
+ .outline-empty {
111
+ padding: var(--space-4) var(--space-3);
112
+ color: var(--color-text-faint);
113
+ font-size: var(--text-label);
114
+ font-style: italic;
115
+ }
@@ -0,0 +1,3 @@
1
+ @import './preview-markdown.css';
2
+ @import './media-lightbox.css';
3
+ @import './embedded-preview.css';