gitmaps 1.0.0

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 (121) hide show
  1. package/README.md +167 -0
  2. package/app/api/auth/favorites/route.ts +56 -0
  3. package/app/api/auth/github/callback/route.ts +103 -0
  4. package/app/api/auth/github/route.ts +32 -0
  5. package/app/api/auth/me/route.ts +52 -0
  6. package/app/api/auth/positions/route.ts +50 -0
  7. package/app/api/chat/route.ts +101 -0
  8. package/app/api/connections/route.ts +72 -0
  9. package/app/api/github/repos/route.ts +111 -0
  10. package/app/api/positions/route.ts +80 -0
  11. package/app/api/repo/branch-diff/route.ts +201 -0
  12. package/app/api/repo/branches/route.ts +53 -0
  13. package/app/api/repo/browse/route.ts +55 -0
  14. package/app/api/repo/clone/route.ts +78 -0
  15. package/app/api/repo/clone-stream/route.ts +131 -0
  16. package/app/api/repo/file-content/route.ts +28 -0
  17. package/app/api/repo/file-delete/route.ts +62 -0
  18. package/app/api/repo/file-history/route.ts +45 -0
  19. package/app/api/repo/file-rename/route.ts +83 -0
  20. package/app/api/repo/file-save/route.ts +45 -0
  21. package/app/api/repo/files/route.ts +169 -0
  22. package/app/api/repo/git-blame/route.ts +86 -0
  23. package/app/api/repo/git-commit/route.ts +40 -0
  24. package/app/api/repo/git-heatmap/route.ts +55 -0
  25. package/app/api/repo/imports/route.ts +154 -0
  26. package/app/api/repo/load/route.ts +56 -0
  27. package/app/api/repo/mode/route.ts +14 -0
  28. package/app/api/repo/search/route.ts +127 -0
  29. package/app/api/repo/tree/route.ts +104 -0
  30. package/app/api/repo/upload/route.ts +53 -0
  31. package/app/api/repo/validate-path.ts +53 -0
  32. package/app/canvas_users.db +0 -0
  33. package/app/canvas_users.db-shm +0 -0
  34. package/app/canvas_users.db-wal +0 -0
  35. package/app/globals.css +7899 -0
  36. package/app/layout.tsx +493 -0
  37. package/app/lib/auth.ts +193 -0
  38. package/app/lib/auto-save.ts +137 -0
  39. package/app/lib/branch-compare.ts +443 -0
  40. package/app/lib/breadcrumbs.ts +170 -0
  41. package/app/lib/canvas-export.ts +358 -0
  42. package/app/lib/canvas-text.ts +912 -0
  43. package/app/lib/canvas.ts +564 -0
  44. package/app/lib/card-arrangement.ts +188 -0
  45. package/app/lib/card-context-menu.tsx +453 -0
  46. package/app/lib/card-diff-markers.ts +270 -0
  47. package/app/lib/card-expand.ts +189 -0
  48. package/app/lib/card-groups.ts +246 -0
  49. package/app/lib/cards.tsx +914 -0
  50. package/app/lib/chat.tsx +308 -0
  51. package/app/lib/code-editor.ts +508 -0
  52. package/app/lib/command-palette.ts +262 -0
  53. package/app/lib/connections.tsx +1037 -0
  54. package/app/lib/context.ts +94 -0
  55. package/app/lib/cursor-sharing.ts +281 -0
  56. package/app/lib/dependency-graph.ts +438 -0
  57. package/app/lib/events.tsx +1747 -0
  58. package/app/lib/file-card-plugin.ts +134 -0
  59. package/app/lib/file-modal.tsx +849 -0
  60. package/app/lib/file-preview.ts +400 -0
  61. package/app/lib/file-tabs.ts +318 -0
  62. package/app/lib/galaxydraw-bridge.ts +477 -0
  63. package/app/lib/galaxydraw.test.ts +229 -0
  64. package/app/lib/global-search.ts +264 -0
  65. package/app/lib/goto-definition.ts +224 -0
  66. package/app/lib/heatmap.ts +178 -0
  67. package/app/lib/hidden-files.tsx +222 -0
  68. package/app/lib/layers.ts +0 -0
  69. package/app/lib/layers.tsx +365 -0
  70. package/app/lib/loading.tsx +45 -0
  71. package/app/lib/multi-repo.ts +286 -0
  72. package/app/lib/new-file-dialog.tsx +230 -0
  73. package/app/lib/onboarding.tsx +213 -0
  74. package/app/lib/perf-overlay.ts +360 -0
  75. package/app/lib/positions.ts +176 -0
  76. package/app/lib/pr-review.ts +374 -0
  77. package/app/lib/production-mode.ts +47 -0
  78. package/app/lib/repo.tsx +977 -0
  79. package/app/lib/settings-modal.tsx +374 -0
  80. package/app/lib/settings.ts +97 -0
  81. package/app/lib/shortcuts-panel.ts +141 -0
  82. package/app/lib/status-bar.ts +128 -0
  83. package/app/lib/symbol-outline.ts +212 -0
  84. package/app/lib/syntax.ts +177 -0
  85. package/app/lib/tab-diff.ts +238 -0
  86. package/app/lib/user.tsx +133 -0
  87. package/app/lib/utils.ts +78 -0
  88. package/app/lib/viewport-culling.ts +728 -0
  89. package/app/page.client.tsx +215 -0
  90. package/app/page.tsx +291 -0
  91. package/app/state/machine.js +196 -0
  92. package/app/styles/main.css +2168 -0
  93. package/banner.png +0 -0
  94. package/cli.ts +44 -0
  95. package/package.json +75 -0
  96. package/packages/galaxydraw/README.md +296 -0
  97. package/packages/galaxydraw/banner.png +0 -0
  98. package/packages/galaxydraw/demo/build-static.ts +100 -0
  99. package/packages/galaxydraw/demo/client.ts +154 -0
  100. package/packages/galaxydraw/demo/dist/client.js +8 -0
  101. package/packages/galaxydraw/demo/index.html +256 -0
  102. package/packages/galaxydraw/demo/server.ts +96 -0
  103. package/packages/galaxydraw/dist/index.js +984 -0
  104. package/packages/galaxydraw/dist/index.js.map +16 -0
  105. package/packages/galaxydraw/node_modules/.bin/tsc.bunx +0 -0
  106. package/packages/galaxydraw/node_modules/.bin/tsc.exe +0 -0
  107. package/packages/galaxydraw/node_modules/.bin/tsserver.bunx +0 -0
  108. package/packages/galaxydraw/node_modules/.bin/tsserver.exe +0 -0
  109. package/packages/galaxydraw/package.json +49 -0
  110. package/packages/galaxydraw/perf.test.ts +284 -0
  111. package/packages/galaxydraw/src/core/cards.ts +435 -0
  112. package/packages/galaxydraw/src/core/engine.ts +339 -0
  113. package/packages/galaxydraw/src/core/events.ts +81 -0
  114. package/packages/galaxydraw/src/core/layout.ts +136 -0
  115. package/packages/galaxydraw/src/core/minimap.ts +216 -0
  116. package/packages/galaxydraw/src/core/state.ts +177 -0
  117. package/packages/galaxydraw/src/core/viewport.ts +106 -0
  118. package/packages/galaxydraw/src/galaxydraw.css +166 -0
  119. package/packages/galaxydraw/src/index.ts +40 -0
  120. package/packages/galaxydraw/tsconfig.json +30 -0
  121. package/server.ts +62 -0
@@ -0,0 +1,2168 @@
1
+ /* Git Canvas - Premium Dark Theme */
2
+ :root {
3
+ --bg-primary: #0a0a0f;
4
+ --bg-secondary: #12121a;
5
+ --bg-tertiary: #1a1a25;
6
+ --bg-elevated: #22222f;
7
+ --bg-card: linear-gradient(135deg, rgba(30, 30, 45, 0.9), rgba(20, 20, 32, 0.95));
8
+
9
+ --accent-primary: #7c3aed;
10
+ --accent-secondary: #a855f7;
11
+ --accent-tertiary: #c084fc;
12
+ --accent-glow: rgba(124, 58, 237, 0.4);
13
+
14
+ --success: #10b981;
15
+ --warning: #f59e0b;
16
+ --error: #ef4444;
17
+ --info: #3b82f6;
18
+
19
+ --text-primary: #f1f5f9;
20
+ --text-secondary: #94a3b8;
21
+ --text-muted: #64748b;
22
+
23
+ --border-subtle: rgba(255, 255, 255, 0.06);
24
+ --border-default: rgba(255, 255, 255, 0.1);
25
+ --border-accent: rgba(124, 58, 237, 0.3);
26
+
27
+ --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.3);
28
+ --shadow-md: 0 4px 20px rgba(0, 0, 0, 0.4);
29
+ --shadow-lg: 0 8px 40px rgba(0, 0, 0, 0.5);
30
+ --shadow-glow: 0 0 30px var(--accent-glow);
31
+
32
+ --radius-sm: 6px;
33
+ --radius-md: 10px;
34
+ --radius-lg: 16px;
35
+ --radius-xl: 24px;
36
+
37
+ --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
38
+ --transition-normal: 250ms cubic-bezier(0.4, 0, 0.2, 1);
39
+ --transition-slow: 400ms cubic-bezier(0.4, 0, 0.2, 1);
40
+
41
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
42
+ --font-mono: 'JetBrains Mono', 'Fira Code', monospace;
43
+ --code-font-size: 12px;
44
+
45
+ --sidebar-width: 320px;
46
+ }
47
+
48
+ * {
49
+ margin: 0;
50
+ padding: 0;
51
+ box-sizing: border-box;
52
+ }
53
+
54
+ html,
55
+ body {
56
+ height: 100%;
57
+ overflow: hidden;
58
+ }
59
+
60
+ body {
61
+ font-family: var(--font-sans);
62
+ background: var(--bg-primary);
63
+ color: var(--text-primary);
64
+ line-height: 1.5;
65
+ }
66
+
67
+ /* Animations */
68
+ @keyframes spin {
69
+ to {
70
+ transform: rotate(360deg);
71
+ }
72
+ }
73
+
74
+ @keyframes fadeIn {
75
+ from {
76
+ opacity: 0;
77
+ }
78
+
79
+ to {
80
+ opacity: 1;
81
+ }
82
+ }
83
+
84
+ /* Scrollbar */
85
+ ::-webkit-scrollbar {
86
+ width: 8px;
87
+ height: 8px;
88
+ }
89
+
90
+ ::-webkit-scrollbar-track {
91
+ background: var(--bg-secondary);
92
+ }
93
+
94
+ ::-webkit-scrollbar-thumb {
95
+ background: var(--bg-elevated);
96
+ border-radius: 4px;
97
+ }
98
+
99
+ ::-webkit-scrollbar-thumb:hover {
100
+ background: var(--accent-primary);
101
+ }
102
+
103
+ /* App Layout */
104
+ #app {
105
+ display: flex;
106
+ height: 100vh;
107
+ background: radial-gradient(ellipse at top left, rgba(124, 58, 237, 0.08) 0%, transparent 50%),
108
+ radial-gradient(ellipse at bottom right, rgba(168, 85, 247, 0.05) 0%, transparent 50%),
109
+ var(--bg-primary);
110
+ }
111
+
112
+ /* Sidebar */
113
+ .sidebar {
114
+ width: var(--sidebar-width);
115
+ background: var(--bg-secondary);
116
+ border-right: 1px solid var(--border-subtle);
117
+ display: flex;
118
+ flex-direction: column;
119
+ overflow: hidden;
120
+ }
121
+
122
+ .sidebar-header {
123
+ padding: 20px;
124
+ border-bottom: 1px solid var(--border-subtle);
125
+ }
126
+
127
+ .logo {
128
+ display: flex;
129
+ align-items: center;
130
+ gap: 12px;
131
+ font-size: 1.25rem;
132
+ font-weight: 600;
133
+ color: var(--text-primary);
134
+ }
135
+
136
+ .logo svg {
137
+ color: var(--accent-primary);
138
+ filter: drop-shadow(0 0 8px var(--accent-glow));
139
+ }
140
+
141
+ /* Repository Selector */
142
+ .repo-selector {
143
+ padding: 16px 20px;
144
+ border-bottom: 1px solid var(--border-subtle);
145
+ }
146
+
147
+ .repo-selector label {
148
+ display: block;
149
+ font-size: 0.75rem;
150
+ font-weight: 500;
151
+ text-transform: uppercase;
152
+ letter-spacing: 0.05em;
153
+ color: var(--text-muted);
154
+ margin-bottom: 8px;
155
+ }
156
+
157
+ .input-group {
158
+ display: flex;
159
+ gap: 8px;
160
+ }
161
+
162
+ .input-group input {
163
+ flex: 1;
164
+ padding: 10px 14px;
165
+ background: var(--bg-tertiary);
166
+ border: 1px solid var(--border-default);
167
+ border-radius: var(--radius-md);
168
+ color: var(--text-primary);
169
+ font-family: var(--font-mono);
170
+ font-size: 0.875rem;
171
+ transition: all var(--transition-fast);
172
+ }
173
+
174
+ .input-group input:focus {
175
+ outline: none;
176
+ border-color: var(--accent-primary);
177
+ box-shadow: 0 0 0 3px var(--accent-glow);
178
+ }
179
+
180
+ .input-group input::placeholder {
181
+ color: var(--text-muted);
182
+ }
183
+
184
+ .btn-icon {
185
+ width: 42px;
186
+ height: 42px;
187
+ display: flex;
188
+ align-items: center;
189
+ justify-content: center;
190
+ background: var(--accent-primary);
191
+ border: none;
192
+ border-radius: var(--radius-md);
193
+ color: white;
194
+ cursor: pointer;
195
+ transition: all var(--transition-fast);
196
+ }
197
+
198
+ .btn-icon:hover {
199
+ background: var(--accent-secondary);
200
+ transform: scale(1.05);
201
+ box-shadow: var(--shadow-glow);
202
+ }
203
+
204
+ .btn-icon:active {
205
+ transform: scale(0.95);
206
+ }
207
+
208
+ /* View Mode Toggle */
209
+ .view-mode-toggle {
210
+ display: flex;
211
+ gap: 2px;
212
+ padding: 0 20px;
213
+ margin-bottom: 4px;
214
+ }
215
+
216
+ .mode-btn {
217
+ flex: 1;
218
+ display: flex;
219
+ align-items: center;
220
+ justify-content: center;
221
+ gap: 6px;
222
+ padding: 7px 10px;
223
+ font-size: 0.7rem;
224
+ font-weight: 500;
225
+ font-family: var(--font-main);
226
+ background: var(--bg-tertiary);
227
+ color: var(--text-muted);
228
+ border: 1px solid var(--border-subtle);
229
+ cursor: pointer;
230
+ transition: all var(--transition-fast);
231
+ }
232
+
233
+ .mode-btn:first-child {
234
+ border-radius: var(--radius-sm) 0 0 var(--radius-sm);
235
+ }
236
+
237
+ .mode-btn:last-child {
238
+ border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
239
+ }
240
+
241
+ .mode-btn:hover {
242
+ background: var(--bg-elevated);
243
+ color: var(--text-secondary);
244
+ }
245
+
246
+ .mode-btn.active {
247
+ background: var(--accent-primary);
248
+ color: white;
249
+ border-color: var(--accent-primary);
250
+ }
251
+
252
+ /* Commit Timeline */
253
+ .commit-timeline {
254
+ flex: 1;
255
+ display: flex;
256
+ flex-direction: column;
257
+ overflow: hidden;
258
+ padding: 16px 0;
259
+ }
260
+
261
+ .section-header {
262
+ display: flex;
263
+ align-items: center;
264
+ justify-content: space-between;
265
+ padding: 0 20px 12px;
266
+ }
267
+
268
+ .section-header h3 {
269
+ font-size: 0.75rem;
270
+ font-weight: 500;
271
+ text-transform: uppercase;
272
+ letter-spacing: 0.05em;
273
+ color: var(--text-muted);
274
+ }
275
+
276
+ .badge {
277
+ background: var(--bg-elevated);
278
+ padding: 2px 8px;
279
+ border-radius: 10px;
280
+ font-size: 0.75rem;
281
+ font-weight: 500;
282
+ color: var(--text-secondary);
283
+ }
284
+
285
+ .timeline-container {
286
+ flex: 1;
287
+ overflow-y: auto;
288
+ padding: 0 12px;
289
+ }
290
+
291
+ .empty-state {
292
+ display: flex;
293
+ flex-direction: column;
294
+ align-items: center;
295
+ justify-content: center;
296
+ padding: 40px 20px;
297
+ text-align: center;
298
+ color: var(--text-muted);
299
+ gap: 12px;
300
+ }
301
+
302
+ .empty-state p {
303
+ font-size: 0.875rem;
304
+ }
305
+
306
+ /* Commit Item */
307
+ .commit-item {
308
+ position: relative;
309
+ padding: 12px 16px;
310
+ margin-bottom: 4px;
311
+ background: transparent;
312
+ border: 1px solid transparent;
313
+ border-radius: var(--radius-md);
314
+ cursor: pointer;
315
+ transition: all var(--transition-fast);
316
+ }
317
+
318
+ .commit-item::before {
319
+ content: '';
320
+ position: absolute;
321
+ left: 0;
322
+ top: 50%;
323
+ transform: translateY(-50%);
324
+ width: 3px;
325
+ height: 0;
326
+ background: var(--accent-primary);
327
+ border-radius: 2px;
328
+ transition: height var(--transition-fast);
329
+ }
330
+
331
+ .commit-item:hover {
332
+ background: var(--bg-tertiary);
333
+ border-color: var(--border-subtle);
334
+ }
335
+
336
+ .commit-item:hover::before {
337
+ height: 50%;
338
+ }
339
+
340
+ .commit-item.active {
341
+ background: var(--bg-card);
342
+ border-color: var(--border-accent);
343
+ box-shadow: var(--shadow-sm);
344
+ }
345
+
346
+ .commit-item.active::before {
347
+ height: 70%;
348
+ box-shadow: 0 0 10px var(--accent-glow);
349
+ }
350
+
351
+ .commit-hash {
352
+ font-family: var(--font-mono);
353
+ font-size: 0.8rem;
354
+ color: var(--accent-tertiary);
355
+ font-weight: 500;
356
+ }
357
+
358
+ .commit-message {
359
+ font-size: 0.875rem;
360
+ color: var(--text-primary);
361
+ margin-top: 4px;
362
+ white-space: nowrap;
363
+ overflow: hidden;
364
+ text-overflow: ellipsis;
365
+ }
366
+
367
+ .commit-meta {
368
+ display: flex;
369
+ align-items: center;
370
+ gap: 12px;
371
+ margin-top: 6px;
372
+ font-size: 0.75rem;
373
+ color: var(--text-muted);
374
+ }
375
+
376
+ .commit-author {
377
+ display: flex;
378
+ align-items: center;
379
+ gap: 4px;
380
+ }
381
+
382
+ /* Canvas Controls */
383
+ .canvas-controls {
384
+ padding: 16px 20px;
385
+ border-top: 1px solid var(--border-subtle);
386
+ }
387
+
388
+ .canvas-controls h3 {
389
+ font-size: 0.75rem;
390
+ font-weight: 500;
391
+ text-transform: uppercase;
392
+ letter-spacing: 0.05em;
393
+ color: var(--text-muted);
394
+ margin-bottom: 12px;
395
+ }
396
+
397
+ .control-row {
398
+ display: flex;
399
+ gap: 8px;
400
+ margin-bottom: 12px;
401
+ }
402
+
403
+ .btn-secondary {
404
+ flex: 1;
405
+ display: flex;
406
+ align-items: center;
407
+ justify-content: center;
408
+ gap: 6px;
409
+ padding: 8px 12px;
410
+ background: var(--bg-tertiary);
411
+ border: 1px solid var(--border-default);
412
+ border-radius: var(--radius-sm);
413
+ color: var(--text-secondary);
414
+ font-size: 0.8rem;
415
+ font-weight: 500;
416
+ cursor: pointer;
417
+ transition: all var(--transition-fast);
418
+ }
419
+
420
+ .btn-secondary:hover {
421
+ background: var(--bg-elevated);
422
+ color: var(--text-primary);
423
+ border-color: var(--border-accent);
424
+ }
425
+
426
+ .zoom-control {
427
+ display: flex;
428
+ align-items: center;
429
+ gap: 12px;
430
+ }
431
+
432
+ .zoom-control label {
433
+ font-size: 0.8rem;
434
+ color: var(--text-muted);
435
+ }
436
+
437
+ .zoom-control input[type="range"] {
438
+ flex: 1;
439
+ appearance: none;
440
+ -webkit-appearance: none;
441
+ height: 4px;
442
+ background: var(--bg-tertiary);
443
+ border-radius: 2px;
444
+ cursor: pointer;
445
+ }
446
+
447
+ .zoom-control input[type="range"]::-webkit-slider-thumb {
448
+ -webkit-appearance: none;
449
+ width: 14px;
450
+ height: 14px;
451
+ background: var(--accent-primary);
452
+ border-radius: 50%;
453
+ cursor: pointer;
454
+ transition: all var(--transition-fast);
455
+ }
456
+
457
+ .zoom-control input[type="range"]::-webkit-slider-thumb:hover {
458
+ transform: scale(1.2);
459
+ box-shadow: 0 0 10px var(--accent-glow);
460
+ }
461
+
462
+ #zoomValue {
463
+ font-size: 0.8rem;
464
+ font-family: var(--font-mono);
465
+ color: var(--text-secondary);
466
+ min-width: 40px;
467
+ text-align: right;
468
+ }
469
+
470
+ /* Hotkey Legend */
471
+ .hotkey-legend {
472
+ margin-top: 16px;
473
+ padding-top: 12px;
474
+ border-top: 1px solid var(--border-subtle);
475
+ }
476
+
477
+ .hotkey-legend h4 {
478
+ font-size: 0.65rem;
479
+ font-weight: 500;
480
+ text-transform: uppercase;
481
+ letter-spacing: 0.08em;
482
+ color: var(--text-muted);
483
+ margin-bottom: 8px;
484
+ }
485
+
486
+ .hotkey-row {
487
+ display: flex;
488
+ align-items: center;
489
+ gap: 8px;
490
+ padding: 3px 0;
491
+ font-size: 0.72rem;
492
+ color: var(--text-muted);
493
+ }
494
+
495
+ .hotkey-row kbd {
496
+ display: inline-block;
497
+ padding: 1px 6px;
498
+ background: var(--bg-elevated);
499
+ border: 1px solid var(--border-default);
500
+ border-radius: 3px;
501
+ font-family: var(--font-mono);
502
+ font-size: 0.65rem;
503
+ color: var(--text-secondary);
504
+ min-width: 28px;
505
+ text-align: center;
506
+ white-space: nowrap;
507
+ }
508
+
509
+ .hotkey-row span {
510
+ color: var(--text-muted);
511
+ font-size: 0.68rem;
512
+ }
513
+
514
+ /* Canvas Area */
515
+ .canvas-area {
516
+ flex: 1;
517
+ display: flex;
518
+ flex-direction: column;
519
+ overflow: hidden;
520
+ position: relative;
521
+ }
522
+
523
+ .canvas-header {
524
+ display: flex;
525
+ align-items: center;
526
+ gap: 16px;
527
+ padding: 8px 16px;
528
+ background: var(--bg-secondary);
529
+ border-bottom: 1px solid var(--border-subtle);
530
+ min-height: 44px;
531
+ }
532
+
533
+ /* View Mode Toggle */
534
+ .view-mode-toggle {
535
+ display: flex;
536
+ gap: 2px;
537
+ background: var(--bg-tertiary);
538
+ border-radius: var(--radius-sm);
539
+ padding: 2px;
540
+ flex-shrink: 0;
541
+ }
542
+
543
+ .mode-btn {
544
+ display: flex;
545
+ align-items: center;
546
+ gap: 5px;
547
+ padding: 5px 12px;
548
+ border: none;
549
+ background: transparent;
550
+ color: var(--text-muted);
551
+ font-size: 0.78rem;
552
+ font-weight: 500;
553
+ cursor: pointer;
554
+ border-radius: 4px;
555
+ transition: all var(--transition-fast);
556
+ white-space: nowrap;
557
+ }
558
+
559
+ .mode-btn:hover {
560
+ color: var(--text-primary);
561
+ background: rgba(255, 255, 255, 0.05);
562
+ }
563
+
564
+ .mode-btn.active {
565
+ color: var(--text-primary);
566
+ background: var(--accent-primary);
567
+ box-shadow: 0 0 10px var(--accent-glow);
568
+ }
569
+
570
+ .mode-btn svg {
571
+ flex-shrink: 0;
572
+ }
573
+
574
+ .current-commit {
575
+ display: flex;
576
+ align-items: center;
577
+ gap: 12px;
578
+ flex: 1;
579
+ min-width: 0;
580
+ overflow: hidden;
581
+ }
582
+
583
+ .current-commit .commit-hash {
584
+ background: var(--bg-elevated);
585
+ padding: 4px 10px;
586
+ border-radius: var(--radius-sm);
587
+ white-space: nowrap;
588
+ }
589
+
590
+ .current-commit span[style] {
591
+ white-space: nowrap;
592
+ overflow: hidden;
593
+ text-overflow: ellipsis;
594
+ }
595
+
596
+ .header-actions {
597
+ display: flex;
598
+ align-items: center;
599
+ gap: 12px;
600
+ flex-shrink: 0;
601
+ }
602
+
603
+ .file-count {
604
+ font-size: 0.875rem;
605
+ color: var(--text-secondary);
606
+ white-space: nowrap;
607
+ }
608
+
609
+ .btn-sm {
610
+ padding: 4px 10px !important;
611
+ font-size: 0.72rem !important;
612
+ gap: 4px !important;
613
+ }
614
+
615
+ /* Canvas Viewport */
616
+ .canvas-viewport {
617
+ flex: 1;
618
+ overflow: hidden;
619
+ position: relative;
620
+ cursor: default;
621
+ background:
622
+ radial-gradient(circle at center, rgba(124, 58, 237, 0.03) 0%, transparent 70%);
623
+ }
624
+
625
+ .canvas {
626
+ position: absolute;
627
+ transform-origin: 0 0;
628
+ min-width: 5000px;
629
+ min-height: 5000px;
630
+ will-change: transform;
631
+ }
632
+
633
+ .canvas-grid {
634
+ position: absolute;
635
+ inset: 0;
636
+ background-image:
637
+ radial-gradient(circle, var(--border-subtle) 1px, transparent 1px);
638
+ background-size: 40px 40px;
639
+ pointer-events: none;
640
+ opacity: 0.5;
641
+ }
642
+
643
+ /* File Card */
644
+ .file-card {
645
+ position: absolute;
646
+ width: 580px;
647
+ max-height: 700px;
648
+ background: var(--bg-card);
649
+ border: 1px solid var(--border-default);
650
+ border-radius: var(--radius-md);
651
+ overflow: hidden;
652
+ transition: box-shadow var(--transition-fast), border-color var(--transition-fast);
653
+ user-select: none;
654
+ backdrop-filter: blur(10px);
655
+ display: flex;
656
+ flex-direction: column;
657
+ contain: layout style;
658
+ }
659
+
660
+ .file-card:hover {
661
+ border-color: var(--border-accent);
662
+ box-shadow: var(--shadow-md), 0 0 20px rgba(124, 58, 237, 0.15);
663
+ z-index: 10;
664
+ }
665
+
666
+ .file-card.dragging {
667
+ box-shadow: var(--shadow-lg), var(--shadow-glow);
668
+ transform: scale(1.02);
669
+ z-index: 100;
670
+ border-color: var(--accent-primary);
671
+ }
672
+
673
+ .file-card-header {
674
+ display: flex;
675
+ align-items: center;
676
+ gap: 8px;
677
+ padding: 10px 14px;
678
+ background: rgba(0, 0, 0, 0.35);
679
+ border-bottom: 1px solid var(--border-subtle);
680
+ position: sticky;
681
+ top: 0;
682
+ z-index: 2;
683
+ flex-shrink: 0;
684
+ cursor: default;
685
+ }
686
+
687
+ /* Simple file cards (all-files mode) */
688
+ .file-card--simple {
689
+ width: 220px;
690
+ max-height: none;
691
+ }
692
+
693
+ .file-card--simple .file-card-header {
694
+ border-bottom: none;
695
+ }
696
+
697
+ .file-icon {
698
+ width: 20px;
699
+ height: 20px;
700
+ display: flex;
701
+ align-items: center;
702
+ justify-content: center;
703
+ color: var(--text-muted);
704
+ }
705
+
706
+ .file-icon.folder {
707
+ color: var(--warning);
708
+ }
709
+
710
+ .file-icon.js {
711
+ color: #f7df1e;
712
+ }
713
+
714
+ .file-icon.ts {
715
+ color: #3178c6;
716
+ }
717
+
718
+ .file-icon.html {
719
+ color: #e34f26;
720
+ }
721
+
722
+ .file-icon.css {
723
+ color: #1572b6;
724
+ }
725
+
726
+ .file-icon.json {
727
+ color: #5bc0de;
728
+ }
729
+
730
+ .file-icon.md {
731
+ color: #083fa1;
732
+ }
733
+
734
+ .file-icon.py {
735
+ color: #3776ab;
736
+ }
737
+
738
+ .file-icon.go {
739
+ color: #00add8;
740
+ }
741
+
742
+ .file-icon.rs {
743
+ color: #ce412b;
744
+ }
745
+
746
+ .file-name {
747
+ flex: 1;
748
+ font-size: 0.8rem;
749
+ font-weight: 500;
750
+ color: var(--text-primary);
751
+ white-space: nowrap;
752
+ overflow: hidden;
753
+ text-overflow: ellipsis;
754
+ }
755
+
756
+ .file-card-body {
757
+ padding: 0;
758
+ font-family: 'JetBrains Mono', monospace;
759
+ font-size: 13px;
760
+ line-height: 1.5;
761
+ color: var(--text-muted);
762
+ overflow-y: auto;
763
+ cursor: default;
764
+ display: flex;
765
+ flex-direction: column;
766
+ flex: 1;
767
+ min-height: 0;
768
+ }
769
+
770
+ /* Styled scrollbar inside file cards */
771
+ .file-card-body::-webkit-scrollbar {
772
+ width: 6px;
773
+ }
774
+
775
+ .file-card-body::-webkit-scrollbar-track {
776
+ background: transparent;
777
+ }
778
+
779
+ .file-card-body::-webkit-scrollbar-thumb {
780
+ background: rgba(124, 58, 237, 0.3);
781
+ border-radius: 3px;
782
+ }
783
+
784
+ .file-card-body::-webkit-scrollbar-thumb:hover {
785
+ background: rgba(124, 58, 237, 0.5);
786
+ }
787
+
788
+ /* Canvas text mode scrollbar */
789
+ .canvas-container {
790
+ scrollbar-width: none;
791
+ /* Hide native scrollbar — CanvasTextRenderer has its own */
792
+ overflow: auto !important;
793
+ overscroll-behavior: contain;
794
+ }
795
+
796
+ .canvas-container::-webkit-scrollbar {
797
+ display: none;
798
+ /* Hide native scrollbar in webkit */
799
+ }
800
+
801
+ .file-path {
802
+ font-family: var(--font-mono);
803
+ font-size: 0.7rem;
804
+ color: var(--text-muted);
805
+ background: var(--bg-card);
806
+ white-space: nowrap;
807
+ overflow: hidden;
808
+ text-overflow: ellipsis;
809
+ padding: 8px 14px;
810
+ border-bottom: 1px solid var(--border-subtle);
811
+ position: sticky;
812
+ top: 0;
813
+ z-index: 5;
814
+ flex-shrink: 0;
815
+ }
816
+
817
+ .file-meta {
818
+ display: flex;
819
+ justify-content: space-between;
820
+ font-size: 0.7rem;
821
+ color: var(--text-muted);
822
+ margin-bottom: 2px;
823
+ }
824
+
825
+ .file-card-actions {
826
+ display: flex;
827
+ gap: 4px;
828
+ padding: 6px 12px;
829
+ border-top: 1px solid var(--border-subtle);
830
+ opacity: 0;
831
+ transition: opacity var(--transition-fast);
832
+ }
833
+
834
+ .file-card:hover .file-card-actions {
835
+ opacity: 1;
836
+ }
837
+
838
+ .file-action {
839
+ flex: 1;
840
+ padding: 4px 8px;
841
+ background: var(--bg-tertiary);
842
+ border: none;
843
+ border-radius: var(--radius-sm);
844
+ color: var(--text-secondary);
845
+ font-size: 0.7rem;
846
+ cursor: pointer;
847
+ transition: all var(--transition-fast);
848
+ }
849
+
850
+ .file-action:hover {
851
+ background: var(--accent-primary);
852
+ color: white;
853
+ }
854
+
855
+ /* File Content Preview Styles */
856
+ .file-card-header {
857
+ flex-wrap: wrap;
858
+ gap: 6px;
859
+ }
860
+
861
+ .file-status {
862
+ margin-left: auto;
863
+ flex-shrink: 0;
864
+ }
865
+
866
+ .file-content-preview {
867
+ margin-top: 0;
868
+ overflow-x: auto;
869
+ overflow-y: visible;
870
+ /* Let body handle vertical scroll */
871
+ background: rgba(0, 0, 0, 0.3);
872
+ border-radius: 0 0 var(--radius-sm) var(--radius-sm);
873
+ /* border: 1px solid var(--border-subtle); Remove border as body handles it */
874
+ }
875
+
876
+ .file-content-preview pre {
877
+ margin: 0;
878
+ padding: 4px 8px;
879
+ font-family: var(--font-mono);
880
+ font-size: 0.65rem;
881
+ line-height: 1.1;
882
+ white-space: pre;
883
+ overflow-x: auto;
884
+ }
885
+
886
+ .file-content-preview code {
887
+ color: var(--text-secondary);
888
+ }
889
+
890
+ .file-content-preview .line-num {
891
+ color: var(--text-muted);
892
+ opacity: 0.5;
893
+ user-select: none;
894
+ display: inline-block;
895
+ margin-right: 12px;
896
+ }
897
+
898
+ .file-content-preview .more-lines {
899
+ color: var(--accent-tertiary);
900
+ font-style: italic;
901
+ opacity: 0.8;
902
+ }
903
+
904
+ .file-content-preview .deleted-notice {
905
+ color: var(--error);
906
+ font-style: italic;
907
+ display: block;
908
+ padding: 20px;
909
+ text-align: center;
910
+ }
911
+
912
+ .file-content-preview .error-notice {
913
+ color: var(--warning);
914
+ font-style: italic;
915
+ display: block;
916
+ padding: 20px;
917
+ text-align: center;
918
+ }
919
+
920
+ /* Status-specific card styling */
921
+ .file-card--added {
922
+ border-color: rgba(34, 197, 94, 0.3);
923
+ }
924
+
925
+ .file-card--added:hover {
926
+ border-color: rgba(34, 197, 94, 0.6);
927
+ box-shadow: var(--shadow-md), 0 0 20px rgba(34, 197, 94, 0.15);
928
+ }
929
+
930
+ .file-card--modified {
931
+ border-color: rgba(234, 179, 8, 0.3);
932
+ }
933
+
934
+ .file-card--modified:hover {
935
+ border-color: rgba(234, 179, 8, 0.6);
936
+ box-shadow: var(--shadow-md), 0 0 20px rgba(234, 179, 8, 0.15);
937
+ }
938
+
939
+ .file-card--deleted {
940
+ border-color: rgba(239, 68, 68, 0.3);
941
+ opacity: 0.8;
942
+ }
943
+
944
+ .file-card--deleted:hover {
945
+ border-color: rgba(239, 68, 68, 0.6);
946
+ box-shadow: var(--shadow-md), 0 0 20px rgba(239, 68, 68, 0.15);
947
+ }
948
+
949
+ /* Side-by-side modified cards are wider */
950
+ .file-card--sidebyside {
951
+ width: 960px;
952
+ }
953
+
954
+ /* Diff line styles */
955
+ .diff-line {
956
+ display: block;
957
+ line-height: 1.15;
958
+ white-space: pre;
959
+ }
960
+
961
+ .diff-line.diff-add {
962
+ color: #4ade80;
963
+ background: rgba(74, 222, 128, 0.15);
964
+ }
965
+
966
+ .diff-line.diff-del {
967
+ color: #f87171;
968
+ background: rgba(248, 113, 113, 0.15);
969
+ }
970
+
971
+ .diff-line.diff-ctx {
972
+ color: var(--text-muted);
973
+ }
974
+
975
+ /* Hunk container */
976
+ .diff-hunk {
977
+ margin-bottom: 4px;
978
+ border: 1px solid var(--border-subtle);
979
+ border-radius: var(--radius-sm);
980
+ overflow: hidden;
981
+ }
982
+
983
+ .diff-hunk:last-child {
984
+ margin-bottom: 0;
985
+ }
986
+
987
+ .diff-hunk-header {
988
+ font-family: var(--font-mono);
989
+ font-size: 0.6rem;
990
+ color: var(--accent-tertiary);
991
+ background: rgba(124, 58, 237, 0.08);
992
+ padding: 2px 8px;
993
+ border-left: 2px solid var(--accent-primary);
994
+ line-height: 1.2;
995
+ display: flex;
996
+ align-items: center;
997
+ justify-content: space-between;
998
+ gap: 8px;
999
+ }
1000
+
1001
+ .diff-hunk-body {
1002
+ max-height: 200px;
1003
+ overflow: auto;
1004
+ overscroll-behavior: contain;
1005
+ }
1006
+
1007
+ .hunk-pane {
1008
+ overflow-x: auto;
1009
+ overflow-y: auto;
1010
+ overscroll-behavior: contain;
1011
+ }
1012
+
1013
+ .hunk-pane::-webkit-scrollbar {
1014
+ width: 4px;
1015
+ height: 4px;
1016
+ }
1017
+
1018
+ .hunk-pane::-webkit-scrollbar-track {
1019
+ background: transparent;
1020
+ }
1021
+
1022
+ .hunk-pane::-webkit-scrollbar-thumb {
1023
+ background: rgba(124, 58, 237, 0.2);
1024
+ border-radius: 2px;
1025
+ }
1026
+
1027
+ .diff-hunk pre {
1028
+ margin: 0;
1029
+ }
1030
+
1031
+ .diff-hunk code {
1032
+ font-size: 0.65rem;
1033
+ line-height: 1.15;
1034
+ }
1035
+
1036
+ /* Minimap */
1037
+ .minimap {
1038
+ position: absolute;
1039
+ bottom: 20px;
1040
+ right: 20px;
1041
+ width: 180px;
1042
+ height: 120px;
1043
+ background: var(--bg-secondary);
1044
+ border: 1px solid var(--border-default);
1045
+ border-radius: var(--radius-md);
1046
+ overflow: hidden;
1047
+ box-shadow: var(--shadow-md);
1048
+ }
1049
+
1050
+ .minimap-viewport {
1051
+ position: absolute;
1052
+ border: 2px solid var(--accent-primary);
1053
+ background: rgba(124, 58, 237, 0.1);
1054
+ border-radius: 2px;
1055
+ pointer-events: none;
1056
+ }
1057
+
1058
+ /* File Preview Modal */
1059
+ .file-preview-modal {
1060
+ position: fixed;
1061
+ inset: 0;
1062
+ display: none;
1063
+ align-items: center;
1064
+ justify-content: center;
1065
+ z-index: 1000;
1066
+ }
1067
+
1068
+ .file-preview-modal.active {
1069
+ display: flex;
1070
+ }
1071
+
1072
+ .modal-backdrop {
1073
+ position: absolute;
1074
+ inset: 0;
1075
+ background: rgba(0, 0, 0, 0.8);
1076
+ backdrop-filter: blur(4px);
1077
+ }
1078
+
1079
+ .modal-content {
1080
+ position: relative;
1081
+ width: 90%;
1082
+ max-width: 900px;
1083
+ max-height: 80vh;
1084
+ background: var(--bg-secondary);
1085
+ border: 1px solid var(--border-default);
1086
+ border-radius: var(--radius-lg);
1087
+ overflow: hidden;
1088
+ box-shadow: var(--shadow-lg);
1089
+ animation: modalIn 0.2s ease-out;
1090
+ }
1091
+
1092
+ @keyframes modalIn {
1093
+ from {
1094
+ opacity: 0;
1095
+ transform: scale(0.95) translateY(10px);
1096
+ }
1097
+
1098
+ to {
1099
+ opacity: 1;
1100
+ transform: scale(1) translateY(0);
1101
+ }
1102
+ }
1103
+
1104
+ .modal-header {
1105
+ display: flex;
1106
+ align-items: center;
1107
+ justify-content: space-between;
1108
+ padding: 16px 20px;
1109
+ background: var(--bg-tertiary);
1110
+ border-bottom: 1px solid var(--border-subtle);
1111
+ }
1112
+
1113
+ .modal-header .file-path {
1114
+ font-family: var(--font-mono);
1115
+ font-size: 0.875rem;
1116
+ color: var(--text-secondary);
1117
+ }
1118
+
1119
+ .modal-close {
1120
+ width: 32px;
1121
+ height: 32px;
1122
+ display: flex;
1123
+ align-items: center;
1124
+ justify-content: center;
1125
+ background: transparent;
1126
+ border: none;
1127
+ border-radius: var(--radius-sm);
1128
+ color: var(--text-muted);
1129
+ font-size: 1.5rem;
1130
+ cursor: pointer;
1131
+ transition: all var(--transition-fast);
1132
+ }
1133
+
1134
+ .modal-close:hover {
1135
+ background: var(--bg-elevated);
1136
+ color: var(--text-primary);
1137
+ }
1138
+
1139
+ .modal-body {
1140
+ padding: 20px;
1141
+ max-height: calc(80vh - 60px);
1142
+ overflow: auto;
1143
+ font-family: var(--font-mono);
1144
+ font-size: 0.875rem;
1145
+ line-height: 1.6;
1146
+ color: var(--text-secondary);
1147
+ white-space: pre-wrap;
1148
+ word-break: break-word;
1149
+ }
1150
+
1151
+ /* Loading States */
1152
+ .loading {
1153
+ position: relative;
1154
+ pointer-events: none;
1155
+ }
1156
+
1157
+ .loading::after {
1158
+ content: '';
1159
+ position: absolute;
1160
+ inset: 0;
1161
+ background: rgba(10, 10, 15, 0.8);
1162
+ display: flex;
1163
+ align-items: center;
1164
+ justify-content: center;
1165
+ }
1166
+
1167
+ @keyframes spin {
1168
+ to {
1169
+ transform: rotate(360deg);
1170
+ }
1171
+ }
1172
+
1173
+ .spinner {
1174
+ width: 24px;
1175
+ height: 24px;
1176
+ border: 2px solid var(--border-default);
1177
+ border-top-color: var(--accent-primary);
1178
+ border-radius: 50%;
1179
+ animation: spin 0.8s linear infinite;
1180
+ }
1181
+
1182
+ /* Toast Notifications */
1183
+ .toast-container {
1184
+ position: fixed;
1185
+ bottom: 20px;
1186
+ left: 50%;
1187
+ transform: translateX(-50%);
1188
+ display: flex;
1189
+ flex-direction: column;
1190
+ gap: 8px;
1191
+ z-index: 2000;
1192
+ }
1193
+
1194
+ .toast {
1195
+ padding: 12px 20px;
1196
+ background: var(--bg-elevated);
1197
+ border: 1px solid var(--border-default);
1198
+ border-radius: var(--radius-md);
1199
+ color: var(--text-primary);
1200
+ font-size: 0.875rem;
1201
+ box-shadow: var(--shadow-lg);
1202
+ animation: toastIn 0.3s ease-out;
1203
+ }
1204
+
1205
+ .toast.error {
1206
+ border-color: var(--error);
1207
+ background: rgba(239, 68, 68, 0.1);
1208
+ }
1209
+
1210
+ .toast.success {
1211
+ border-color: var(--success);
1212
+ background: rgba(16, 185, 129, 0.1);
1213
+ }
1214
+
1215
+ @keyframes toastIn {
1216
+ from {
1217
+ opacity: 0;
1218
+ transform: translateY(20px);
1219
+ }
1220
+
1221
+ to {
1222
+ opacity: 1;
1223
+ transform: translateY(0);
1224
+ }
1225
+ }
1226
+
1227
+ /* Responsive */
1228
+ @media (max-width: 768px) {
1229
+ :root {
1230
+ --sidebar-width: 280px;
1231
+ }
1232
+
1233
+ .sidebar {
1234
+ position: fixed;
1235
+ left: 0;
1236
+ top: 0;
1237
+ bottom: 0;
1238
+ z-index: 100;
1239
+ transform: translateX(-100%);
1240
+ transition: transform var(--transition-normal);
1241
+ }
1242
+
1243
+ .sidebar.open {
1244
+ transform: translateX(0);
1245
+ }
1246
+ }
1247
+
1248
+ /* ─── Canvas Mode Toolbar ─────────────────────────── */
1249
+ .canvas-mode-toolbar {
1250
+ display: flex;
1251
+ gap: 4px;
1252
+ margin-bottom: 8px;
1253
+ }
1254
+
1255
+ .canvas-mode-btn {
1256
+ flex: 1;
1257
+ display: flex;
1258
+ flex-direction: column;
1259
+ align-items: center;
1260
+ gap: 2px;
1261
+ padding: 8px 4px;
1262
+ background: var(--bg-tertiary);
1263
+ border: 1px solid var(--border-subtle);
1264
+ border-radius: var(--radius-sm);
1265
+ color: var(--text-muted);
1266
+ cursor: pointer;
1267
+ transition: all var(--transition-fast);
1268
+ font-size: 10px;
1269
+ font-family: var(--font-mono);
1270
+ }
1271
+
1272
+ .canvas-mode-btn:hover {
1273
+ background: var(--bg-elevated);
1274
+ color: var(--text-secondary);
1275
+ border-color: var(--border-default);
1276
+ }
1277
+
1278
+ .canvas-mode-btn.active {
1279
+ background: rgba(124, 58, 237, 0.15);
1280
+ border-color: var(--accent-primary);
1281
+ color: var(--accent-tertiary);
1282
+ box-shadow: 0 0 12px rgba(124, 58, 237, 0.2);
1283
+ }
1284
+
1285
+ .canvas-mode-btn span {
1286
+ font-size: 9px;
1287
+ opacity: 0.5;
1288
+ font-weight: 600;
1289
+ }
1290
+
1291
+
1292
+
1293
+ .mode-indicator {
1294
+ font-size: 11px;
1295
+ color: var(--text-muted);
1296
+ padding: 4px 0 8px;
1297
+ border-bottom: 1px solid var(--border-subtle);
1298
+ margin-bottom: 8px;
1299
+ }
1300
+
1301
+ .mode-indicator strong {
1302
+ color: var(--accent-tertiary);
1303
+ font-weight: 600;
1304
+ }
1305
+
1306
+ .mode-indicator strong[data-mode="connect"] {
1307
+ color: var(--warning);
1308
+ }
1309
+
1310
+ .mode-indicator strong[data-mode="select"] {
1311
+ color: var(--info);
1312
+ }
1313
+
1314
+ .mode-indicator strong[data-mode="resize"] {
1315
+ color: var(--success);
1316
+ }
1317
+
1318
+ /* ─── Card states ─────────────────────────────────── */
1319
+ .file-card.selected,
1320
+ .gd-card.gd-card--selected {
1321
+ outline: 4px solid rgba(124, 58, 237, 0.85);
1322
+ outline-offset: 3px;
1323
+ box-shadow: 0 0 0 3px var(--accent-glow), 0 0 24px rgba(124, 58, 237, 0.5);
1324
+ }
1325
+
1326
+ .file-card.resizing {
1327
+ outline: 2px dashed var(--success);
1328
+ outline-offset: 2px;
1329
+ }
1330
+
1331
+ .file-card.resizing * {
1332
+ pointer-events: none;
1333
+ }
1334
+
1335
+ /* Corner resize visual hint (bottom-right) */
1336
+ .file-card::after {
1337
+ content: '';
1338
+ position: absolute;
1339
+ bottom: 0;
1340
+ right: 0;
1341
+ width: 16px;
1342
+ height: 16px;
1343
+ background: linear-gradient(135deg, transparent 50%, rgba(124, 58, 237, 0.25) 50%);
1344
+ border-radius: 0 0 var(--radius-md) 0;
1345
+ pointer-events: none;
1346
+ opacity: 0;
1347
+ transition: opacity var(--transition-fast);
1348
+ z-index: 10;
1349
+ }
1350
+
1351
+ .file-card:hover::after {
1352
+ opacity: 1;
1353
+ }
1354
+
1355
+ /* No special cursor on header — card is draggable from everywhere */
1356
+
1357
+
1358
+ /* ─── Line selection & connections ─────────────────── */
1359
+ .diff-line.line-selected {
1360
+ background: rgba(124, 58, 237, 0.25) !important;
1361
+ border-left: 3px solid var(--accent-primary) !important;
1362
+ padding-left: 5px;
1363
+ }
1364
+
1365
+ .diff-line.line-connected {
1366
+ background: rgba(124, 58, 237, 0.12) !important;
1367
+ cursor: pointer;
1368
+ }
1369
+
1370
+ .diff-line.line-connected:hover {
1371
+ background: rgba(124, 58, 237, 0.25) !important;
1372
+ }
1373
+
1374
+ .diff-line.line-flash {
1375
+ animation: lineFlash 1.5s ease-out;
1376
+ }
1377
+
1378
+ @keyframes lineFlash {
1379
+ 0% {
1380
+ background: rgba(124, 58, 237, 0.5);
1381
+ }
1382
+
1383
+ 100% {
1384
+ background: transparent;
1385
+ }
1386
+ }
1387
+
1388
+ /* Connect mode cursor on lines */
1389
+ [style*="cursor: crosshair"] .diff-line {
1390
+ cursor: crosshair;
1391
+ }
1392
+
1393
+ /* More lines truncation notice */
1394
+ .more-lines {
1395
+ display: block;
1396
+ text-align: center;
1397
+ color: var(--text-muted);
1398
+ font-size: 11px;
1399
+ padding: 8px;
1400
+ font-style: italic;
1401
+ border-top: 1px solid var(--border-subtle);
1402
+ }
1403
+
1404
+ /* ─── SVG connection overlay ──────────────────────── */
1405
+ #connectionOverlay {
1406
+ position: absolute;
1407
+ top: 0;
1408
+ left: 0;
1409
+ width: 100%;
1410
+ height: 100%;
1411
+ pointer-events: none;
1412
+ z-index: 100;
1413
+ overflow: visible;
1414
+ }
1415
+
1416
+ #connectionOverlay path {
1417
+ pointer-events: stroke;
1418
+ cursor: pointer;
1419
+ transition: opacity var(--transition-fast), stroke-width var(--transition-fast);
1420
+ }
1421
+
1422
+ #connectionOverlay path:hover {
1423
+ opacity: 1 !important;
1424
+ stroke-width: 3 !important;
1425
+ filter: drop-shadow(0 0 6px var(--accent-primary));
1426
+ }
1427
+
1428
+ /* ─── Connect button in card header ──────────────── */
1429
+ .connect-btn {
1430
+ display: flex;
1431
+ align-items: center;
1432
+ justify-content: center;
1433
+ width: 26px;
1434
+ height: 26px;
1435
+ border: 1px solid var(--border-subtle);
1436
+ border-radius: var(--radius-sm);
1437
+ background: transparent;
1438
+ color: var(--text-muted);
1439
+ cursor: grab;
1440
+ transition: all var(--transition-fast);
1441
+ padding: 0;
1442
+ flex-shrink: 0;
1443
+ opacity: 0;
1444
+ }
1445
+
1446
+ .file-card:hover .connect-btn {
1447
+ opacity: 1;
1448
+ }
1449
+
1450
+ .connect-btn:hover {
1451
+ background: rgba(124, 58, 237, 0.15);
1452
+ border-color: var(--accent-primary);
1453
+ color: var(--accent-primary);
1454
+ transform: scale(1.1);
1455
+ }
1456
+
1457
+ .connect-btn:active {
1458
+ cursor: grabbing;
1459
+ transform: scale(0.95);
1460
+ }
1461
+
1462
+ /* Card states for connection drag */
1463
+ .file-card.connecting {
1464
+ outline: 2px solid var(--accent-primary);
1465
+ outline-offset: 2px;
1466
+ box-shadow: 0 0 25px rgba(124, 58, 237, 0.3);
1467
+ }
1468
+
1469
+ .file-card.connect-target {
1470
+ outline: 2px dashed var(--success);
1471
+ outline-offset: 3px;
1472
+ box-shadow: 0 0 25px rgba(16, 185, 129, 0.3);
1473
+ transform: scale(1.02);
1474
+ transition: all 0.15s ease;
1475
+ }
1476
+
1477
+ /* ─── Connection Dialog ──────────────────────────── */
1478
+ .connection-dialog-overlay {
1479
+ position: fixed;
1480
+ inset: 0;
1481
+ background: rgba(0, 0, 0, 0.6);
1482
+ backdrop-filter: blur(6px);
1483
+ display: flex;
1484
+ align-items: center;
1485
+ justify-content: center;
1486
+ z-index: 10000;
1487
+ animation: fadeIn 0.15s ease;
1488
+ }
1489
+
1490
+ @keyframes fadeIn {
1491
+ from {
1492
+ opacity: 0;
1493
+ }
1494
+
1495
+ to {
1496
+ opacity: 1;
1497
+ }
1498
+ }
1499
+
1500
+ .connection-dialog {
1501
+ background: var(--bg-card);
1502
+ border: 1px solid var(--border-accent);
1503
+ border-radius: var(--radius-lg);
1504
+ padding: 24px;
1505
+ min-width: 480px;
1506
+ max-width: 600px;
1507
+ box-shadow: var(--shadow-lg), 0 0 40px rgba(124, 58, 237, 0.15);
1508
+ }
1509
+
1510
+ .connection-dialog h3 {
1511
+ margin: 0 0 20px 0;
1512
+ font-size: 16px;
1513
+ font-weight: 600;
1514
+ color: var(--text-primary);
1515
+ display: flex;
1516
+ align-items: center;
1517
+ gap: 8px;
1518
+ }
1519
+
1520
+ .connection-dialog h3::before {
1521
+ content: '';
1522
+ display: inline-block;
1523
+ width: 3px;
1524
+ height: 16px;
1525
+ background: var(--accent-primary);
1526
+ border-radius: 2px;
1527
+ }
1528
+
1529
+ .conn-dialog-row {
1530
+ display: flex;
1531
+ align-items: stretch;
1532
+ gap: 16px;
1533
+ margin-bottom: 16px;
1534
+ }
1535
+
1536
+ .conn-dialog-file {
1537
+ flex: 1;
1538
+ background: rgba(0, 0, 0, 0.2);
1539
+ border: 1px solid var(--border-subtle);
1540
+ border-radius: var(--radius-md);
1541
+ padding: 12px;
1542
+ }
1543
+
1544
+ .conn-dialog-file>label {
1545
+ display: block;
1546
+ font-size: 10px;
1547
+ text-transform: uppercase;
1548
+ letter-spacing: 0.5px;
1549
+ color: var(--text-muted);
1550
+ margin-bottom: 4px;
1551
+ }
1552
+
1553
+ .conn-file-name {
1554
+ display: block;
1555
+ font-size: 12px;
1556
+ font-weight: 500;
1557
+ color: var(--text-primary);
1558
+ word-break: break-all;
1559
+ margin-bottom: 10px;
1560
+ }
1561
+
1562
+ .conn-line-range {
1563
+ display: flex;
1564
+ align-items: center;
1565
+ gap: 6px;
1566
+ }
1567
+
1568
+ .conn-line-range label {
1569
+ font-size: 11px;
1570
+ color: var(--text-muted);
1571
+ min-width: 32px;
1572
+ }
1573
+
1574
+ .conn-line-range input {
1575
+ width: 60px;
1576
+ padding: 4px 8px;
1577
+ background: var(--bg-secondary);
1578
+ border: 1px solid var(--border-subtle);
1579
+ border-radius: var(--radius-sm);
1580
+ color: var(--text-primary);
1581
+ font-size: 12px;
1582
+ font-family: var(--font-mono);
1583
+ text-align: center;
1584
+ }
1585
+
1586
+ .conn-line-range input:focus {
1587
+ border-color: var(--accent-primary);
1588
+ outline: none;
1589
+ box-shadow: 0 0 0 2px rgba(124, 58, 237, 0.2);
1590
+ }
1591
+
1592
+ .conn-line-range span {
1593
+ color: var(--text-muted);
1594
+ font-size: 12px;
1595
+ }
1596
+
1597
+ .conn-dialog-arrow {
1598
+ display: flex;
1599
+ align-items: center;
1600
+ color: var(--accent-primary);
1601
+ padding: 0 4px;
1602
+ }
1603
+
1604
+ .conn-dialog-comment {
1605
+ margin-bottom: 20px;
1606
+ }
1607
+
1608
+ .conn-dialog-comment label {
1609
+ display: block;
1610
+ font-size: 11px;
1611
+ text-transform: uppercase;
1612
+ letter-spacing: 0.5px;
1613
+ color: var(--text-muted);
1614
+ margin-bottom: 6px;
1615
+ }
1616
+
1617
+ .conn-dialog-comment input {
1618
+ width: 100%;
1619
+ padding: 8px 12px;
1620
+ background: var(--bg-secondary);
1621
+ border: 1px solid var(--border-subtle);
1622
+ border-radius: var(--radius-md);
1623
+ color: var(--text-primary);
1624
+ font-size: 13px;
1625
+ box-sizing: border-box;
1626
+ }
1627
+
1628
+ .conn-dialog-comment input:focus {
1629
+ border-color: var(--accent-primary);
1630
+ outline: none;
1631
+ box-shadow: 0 0 0 2px rgba(124, 58, 237, 0.2);
1632
+ }
1633
+
1634
+ .conn-dialog-comment input::placeholder {
1635
+ color: var(--text-muted);
1636
+ }
1637
+
1638
+ .conn-dialog-actions {
1639
+ display: flex;
1640
+ justify-content: flex-end;
1641
+ gap: 10px;
1642
+ }
1643
+
1644
+ .btn-secondary {
1645
+ padding: 8px 16px;
1646
+ background: transparent;
1647
+ border: 1px solid var(--border-subtle);
1648
+ border-radius: var(--radius-md);
1649
+ color: var(--text-secondary);
1650
+ font-size: 13px;
1651
+ cursor: pointer;
1652
+ transition: all var(--transition-fast);
1653
+ }
1654
+
1655
+ .btn-secondary:hover {
1656
+ background: rgba(255, 255, 255, 0.05);
1657
+ border-color: var(--text-muted);
1658
+ }
1659
+
1660
+ .btn-primary {
1661
+ padding: 8px 16px;
1662
+ background: var(--accent-primary);
1663
+ border: 1px solid transparent;
1664
+ border-radius: var(--radius-md);
1665
+ color: white;
1666
+ font-size: 13px;
1667
+ font-weight: 500;
1668
+ cursor: pointer;
1669
+ transition: all var(--transition-fast);
1670
+ }
1671
+
1672
+ .btn-primary:hover {
1673
+ background: var(--accent-hover);
1674
+ box-shadow: 0 0 15px rgba(124, 58, 237, 0.3);
1675
+ }
1676
+
1677
+ /* ─── Loading Overlay ─────────────────────────────── */
1678
+ .loading-overlay {
1679
+ position: fixed;
1680
+ inset: 0;
1681
+ background: rgba(10, 10, 15, 0.85);
1682
+ backdrop-filter: blur(8px);
1683
+ display: none;
1684
+ align-items: center;
1685
+ justify-content: center;
1686
+ z-index: 9999;
1687
+ animation: fadeIn 0.2s ease;
1688
+ }
1689
+
1690
+ .loading-overlay.active {
1691
+ display: flex;
1692
+ }
1693
+
1694
+ .loading-content {
1695
+ display: flex;
1696
+ flex-direction: column;
1697
+ align-items: center;
1698
+ gap: 20px;
1699
+ text-align: center;
1700
+ }
1701
+
1702
+ .loading-spinner {
1703
+ width: 48px;
1704
+ height: 48px;
1705
+ border: 3px solid var(--border-default);
1706
+ border-top-color: var(--accent-primary);
1707
+ border-radius: 50%;
1708
+ animation: spin 0.8s linear infinite;
1709
+ box-shadow: 0 0 20px var(--accent-glow);
1710
+ }
1711
+
1712
+ .loading-message {
1713
+ font-size: 1.1rem;
1714
+ font-weight: 500;
1715
+ color: var(--text-primary);
1716
+ letter-spacing: 0.02em;
1717
+ }
1718
+
1719
+ .loading-sub {
1720
+ font-size: 0.8rem;
1721
+ font-family: var(--font-mono);
1722
+ color: var(--text-muted);
1723
+ max-width: 400px;
1724
+ word-break: break-all;
1725
+ }
1726
+
1727
+ /* ─── Hidden Files Modal ─────────────────────────── */
1728
+ .hidden-files-modal {
1729
+ position: fixed;
1730
+ inset: 0;
1731
+ z-index: 9998;
1732
+ display: flex;
1733
+ align-items: center;
1734
+ justify-content: center;
1735
+ animation: fadeIn 0.15s ease;
1736
+ }
1737
+
1738
+ .hidden-modal-backdrop {
1739
+ position: absolute;
1740
+ inset: 0;
1741
+ background: rgba(10, 10, 15, 0.7);
1742
+ backdrop-filter: blur(4px);
1743
+ }
1744
+
1745
+ .hidden-modal-content {
1746
+ position: relative;
1747
+ width: 500px;
1748
+ max-height: 70vh;
1749
+ background: var(--bg-secondary);
1750
+ border: 1px solid var(--border-default);
1751
+ border-radius: var(--radius-lg);
1752
+ box-shadow: var(--shadow-lg);
1753
+ display: flex;
1754
+ flex-direction: column;
1755
+ overflow: hidden;
1756
+ }
1757
+
1758
+ .hidden-modal-header {
1759
+ display: flex;
1760
+ align-items: center;
1761
+ justify-content: space-between;
1762
+ padding: 16px 20px;
1763
+ border-bottom: 1px solid var(--border-subtle);
1764
+ }
1765
+
1766
+ .hidden-modal-header h3 {
1767
+ font-size: 0.95rem;
1768
+ font-weight: 600;
1769
+ color: var(--text-primary);
1770
+ }
1771
+
1772
+ .hidden-modal-actions {
1773
+ display: flex;
1774
+ align-items: center;
1775
+ gap: 8px;
1776
+ }
1777
+
1778
+ .hidden-modal-close {
1779
+ background: none;
1780
+ border: none;
1781
+ color: var(--text-muted);
1782
+ font-size: 1.4rem;
1783
+ cursor: pointer;
1784
+ padding: 0 4px;
1785
+ line-height: 1;
1786
+ transition: color var(--transition-fast);
1787
+ }
1788
+
1789
+ .hidden-modal-close:hover {
1790
+ color: var(--text-primary);
1791
+ }
1792
+
1793
+ .hidden-modal-body {
1794
+ overflow-y: auto;
1795
+ padding: 8px;
1796
+ flex: 1;
1797
+ }
1798
+
1799
+ .hidden-file-row {
1800
+ display: flex;
1801
+ align-items: center;
1802
+ justify-content: space-between;
1803
+ padding: 8px 12px;
1804
+ border-radius: var(--radius-sm);
1805
+ transition: background var(--transition-fast);
1806
+ }
1807
+
1808
+ .hidden-file-row:hover {
1809
+ background: var(--bg-tertiary);
1810
+ }
1811
+
1812
+ .hidden-file-path {
1813
+ font-family: var(--font-mono);
1814
+ font-size: 0.78rem;
1815
+ color: var(--text-secondary);
1816
+ overflow: hidden;
1817
+ text-overflow: ellipsis;
1818
+ white-space: nowrap;
1819
+ flex: 1;
1820
+ min-width: 0;
1821
+ }
1822
+
1823
+ .btn-restore {
1824
+ background: none;
1825
+ border: 1px solid var(--border-default);
1826
+ color: var(--text-muted);
1827
+ padding: 4px 8px;
1828
+ border-radius: var(--radius-sm);
1829
+ cursor: pointer;
1830
+ flex-shrink: 0;
1831
+ display: flex;
1832
+ align-items: center;
1833
+ gap: 4px;
1834
+ transition: all var(--transition-fast);
1835
+ }
1836
+
1837
+ .btn-restore:hover {
1838
+ color: var(--accent-tertiary);
1839
+ border-color: var(--accent-primary);
1840
+ background: rgba(124, 58, 237, 0.1);
1841
+ }
1842
+
1843
+ /* Selected card highlight */
1844
+ .file-card.selected {
1845
+ border-color: var(--accent-primary);
1846
+ outline: 4px solid rgba(124, 58, 237, 0.85);
1847
+ outline-offset: 3px;
1848
+ box-shadow: 0 0 0 3px var(--accent-glow), 0 0 24px rgba(124, 58, 237, 0.5), var(--shadow-md);
1849
+ z-index: 5 !important;
1850
+ }
1851
+
1852
+ /* ─── Settings Modal ─────────────────────────────────── */
1853
+ .settings-modal-backdrop {
1854
+ position: fixed;
1855
+ top: 0;
1856
+ left: 0;
1857
+ width: 100vw;
1858
+ height: 100vh;
1859
+ z-index: 10000;
1860
+ background: rgba(0, 0, 0, 0.6);
1861
+ backdrop-filter: blur(8px);
1862
+ display: flex;
1863
+ align-items: center;
1864
+ justify-content: center;
1865
+ animation: fadeIn 0.15s ease;
1866
+ }
1867
+
1868
+ .settings-modal {
1869
+ background: linear-gradient(135deg, rgba(18, 18, 28, 0.97), rgba(12, 12, 20, 0.99));
1870
+ border: 1px solid var(--border-default);
1871
+ border-radius: 16px;
1872
+ width: min(520px, 90vw);
1873
+ max-height: 80vh;
1874
+ display: flex;
1875
+ flex-direction: column;
1876
+ box-shadow: var(--shadow-lg), 0 0 60px rgba(124, 58, 237, 0.08);
1877
+ overflow: hidden;
1878
+ }
1879
+
1880
+ .settings-header {
1881
+ display: flex;
1882
+ align-items: center;
1883
+ justify-content: space-between;
1884
+ padding: 20px 24px 16px;
1885
+ border-bottom: 1px solid var(--border-subtle);
1886
+ }
1887
+
1888
+ .settings-title {
1889
+ display: flex;
1890
+ align-items: center;
1891
+ gap: 10px;
1892
+ margin: 0;
1893
+ font-size: 18px;
1894
+ font-weight: 600;
1895
+ color: var(--text-primary);
1896
+ letter-spacing: -0.3px;
1897
+ }
1898
+
1899
+ .settings-title svg {
1900
+ color: var(--accent-secondary);
1901
+ }
1902
+
1903
+ .settings-close {
1904
+ background: none;
1905
+ border: none;
1906
+ color: var(--text-muted);
1907
+ font-size: 18px;
1908
+ cursor: pointer;
1909
+ padding: 4px 8px;
1910
+ border-radius: 8px;
1911
+ transition: all 0.15s ease;
1912
+ }
1913
+
1914
+ .settings-close:hover {
1915
+ background: var(--bg-elevated);
1916
+ color: var(--text-primary);
1917
+ }
1918
+
1919
+ .settings-body {
1920
+ flex: 1;
1921
+ overflow-y: auto;
1922
+ padding: 8px 24px 16px;
1923
+ }
1924
+
1925
+ .settings-section {
1926
+ margin-bottom: 8px;
1927
+ }
1928
+
1929
+ .settings-section-title {
1930
+ font-size: 11px;
1931
+ font-weight: 600;
1932
+ text-transform: uppercase;
1933
+ letter-spacing: 1.2px;
1934
+ color: var(--accent-tertiary);
1935
+ margin: 16px 0 10px;
1936
+ padding-bottom: 6px;
1937
+ border-bottom: 1px solid rgba(124, 58, 237, 0.15);
1938
+ }
1939
+
1940
+ .settings-row {
1941
+ display: flex;
1942
+ align-items: center;
1943
+ justify-content: space-between;
1944
+ padding: 10px 0;
1945
+ gap: 16px;
1946
+ }
1947
+
1948
+ .settings-label {
1949
+ flex: 1;
1950
+ min-width: 0;
1951
+ }
1952
+
1953
+ .settings-label-text {
1954
+ display: block;
1955
+ font-size: 13.5px;
1956
+ font-weight: 500;
1957
+ color: var(--text-primary);
1958
+ }
1959
+
1960
+ .settings-label-desc {
1961
+ display: block;
1962
+ font-size: 11.5px;
1963
+ color: var(--text-muted);
1964
+ margin-top: 2px;
1965
+ }
1966
+
1967
+ /* Toggle group (segmented control) */
1968
+ .settings-toggle-group {
1969
+ display: flex;
1970
+ background: var(--bg-tertiary);
1971
+ border-radius: 8px;
1972
+ padding: 3px;
1973
+ gap: 2px;
1974
+ flex-shrink: 0;
1975
+ }
1976
+
1977
+ .settings-toggle-btn {
1978
+ padding: 5px 14px;
1979
+ font-size: 12px;
1980
+ font-weight: 500;
1981
+ border: none;
1982
+ border-radius: 6px;
1983
+ background: transparent;
1984
+ color: var(--text-muted);
1985
+ cursor: pointer;
1986
+ transition: all 0.15s ease;
1987
+ white-space: nowrap;
1988
+ }
1989
+
1990
+ .settings-toggle-btn:hover {
1991
+ color: var(--text-secondary);
1992
+ }
1993
+
1994
+ .settings-toggle-btn.active {
1995
+ background: var(--accent-primary);
1996
+ color: white;
1997
+ box-shadow: 0 2px 8px rgba(124, 58, 237, 0.3);
1998
+ }
1999
+
2000
+ /* Slider */
2001
+ .settings-slider-group {
2002
+ display: flex;
2003
+ align-items: center;
2004
+ gap: 10px;
2005
+ flex-shrink: 0;
2006
+ }
2007
+
2008
+ .settings-slider {
2009
+ width: 120px;
2010
+ height: 4px;
2011
+ -webkit-appearance: none;
2012
+ appearance: none;
2013
+ background: var(--bg-tertiary);
2014
+ border-radius: 2px;
2015
+ outline: none;
2016
+ }
2017
+
2018
+ .settings-slider::-webkit-slider-thumb {
2019
+ -webkit-appearance: none;
2020
+ width: 16px;
2021
+ height: 16px;
2022
+ border-radius: 50%;
2023
+ background: var(--accent-primary);
2024
+ cursor: pointer;
2025
+ box-shadow: 0 2px 6px rgba(124, 58, 237, 0.4);
2026
+ transition: transform 0.1s ease;
2027
+ }
2028
+
2029
+ .settings-slider::-webkit-slider-thumb:hover {
2030
+ transform: scale(1.15);
2031
+ }
2032
+
2033
+ .settings-slider-value {
2034
+ font-size: 12px;
2035
+ font-weight: 600;
2036
+ color: var(--accent-tertiary);
2037
+ min-width: 42px;
2038
+ text-align: right;
2039
+ font-variant-numeric: tabular-nums;
2040
+ }
2041
+
2042
+ /* iOS-style switch */
2043
+ .settings-switch {
2044
+ position: relative;
2045
+ width: 44px;
2046
+ height: 24px;
2047
+ flex-shrink: 0;
2048
+ cursor: pointer;
2049
+ }
2050
+
2051
+ .settings-switch input {
2052
+ opacity: 0;
2053
+ width: 0;
2054
+ height: 0;
2055
+ }
2056
+
2057
+ .settings-switch-slider {
2058
+ position: absolute;
2059
+ inset: 0;
2060
+ background: var(--bg-tertiary);
2061
+ border-radius: 12px;
2062
+ transition: all 0.2s ease;
2063
+ }
2064
+
2065
+ .settings-switch-slider::before {
2066
+ content: '';
2067
+ position: absolute;
2068
+ width: 18px;
2069
+ height: 18px;
2070
+ left: 3px;
2071
+ bottom: 3px;
2072
+ background: var(--text-muted);
2073
+ border-radius: 50%;
2074
+ transition: all 0.2s ease;
2075
+ }
2076
+
2077
+ .settings-switch input:checked+.settings-switch-slider {
2078
+ background: var(--accent-primary);
2079
+ }
2080
+
2081
+ .settings-switch input:checked+.settings-switch-slider::before {
2082
+ transform: translateX(20px);
2083
+ background: white;
2084
+ }
2085
+
2086
+ /* Footer */
2087
+ .settings-footer {
2088
+ display: flex;
2089
+ align-items: center;
2090
+ justify-content: space-between;
2091
+ padding: 12px 24px 16px;
2092
+ border-top: 1px solid var(--border-subtle);
2093
+ }
2094
+
2095
+ .settings-reset-btn {
2096
+ padding: 6px 14px;
2097
+ font-size: 12px;
2098
+ font-weight: 500;
2099
+ border: 1px solid rgba(239, 68, 68, 0.3);
2100
+ border-radius: 8px;
2101
+ background: transparent;
2102
+ color: var(--error);
2103
+ cursor: pointer;
2104
+ transition: all 0.15s ease;
2105
+ }
2106
+
2107
+ .settings-reset-btn:hover {
2108
+ background: rgba(239, 68, 68, 0.1);
2109
+ border-color: rgba(239, 68, 68, 0.5);
2110
+ }
2111
+
2112
+ .settings-footer-note {
2113
+ font-size: 11px;
2114
+ color: var(--text-muted);
2115
+ font-style: italic;
2116
+ }
2117
+
2118
+ /* Production Mode Notice */
2119
+ .production-notice {
2120
+ display: flex;
2121
+ flex-direction: column;
2122
+ align-items: center;
2123
+ justify-content: center;
2124
+ gap: 12px;
2125
+ padding: 60px 40px;
2126
+ text-align: center;
2127
+ height: 100%;
2128
+ color: var(--text-secondary);
2129
+ }
2130
+
2131
+ .production-notice-icon {
2132
+ color: rgba(124, 58, 237, 0.5);
2133
+ margin-bottom: 8px;
2134
+ }
2135
+
2136
+ .production-notice-title {
2137
+ font-size: 18px;
2138
+ font-weight: 600;
2139
+ color: var(--text-primary);
2140
+ margin: 0;
2141
+ }
2142
+
2143
+ .production-notice-desc {
2144
+ font-size: 13px;
2145
+ line-height: 1.6;
2146
+ margin: 0;
2147
+ max-width: 360px;
2148
+ color: var(--text-secondary);
2149
+ }
2150
+
2151
+ .production-notice-cmd {
2152
+ display: inline-block;
2153
+ padding: 10px 28px;
2154
+ background: rgba(124, 58, 237, 0.12);
2155
+ border: 1px solid rgba(124, 58, 237, 0.3);
2156
+ border-radius: 8px;
2157
+ font-size: 15px;
2158
+ font-family: 'JetBrains Mono', monospace;
2159
+ color: var(--accent-tertiary);
2160
+ letter-spacing: 0.03em;
2161
+ user-select: all;
2162
+ }
2163
+
2164
+ .production-notice-sub {
2165
+ font-size: 11px;
2166
+ color: var(--text-muted);
2167
+ margin: 0;
2168
+ }