claude-relay 2.4.2 → 2.5.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 (75) hide show
  1. package/bin/cli.js +1 -2350
  2. package/package.json +7 -42
  3. package/LICENSE +0 -21
  4. package/README.md +0 -281
  5. package/lib/cli-sessions.js +0 -270
  6. package/lib/config.js +0 -222
  7. package/lib/daemon.js +0 -423
  8. package/lib/ipc.js +0 -112
  9. package/lib/pages.js +0 -714
  10. package/lib/project.js +0 -1224
  11. package/lib/public/app.js +0 -2157
  12. package/lib/public/apple-touch-icon.png +0 -0
  13. package/lib/public/css/base.css +0 -145
  14. package/lib/public/css/diff.css +0 -128
  15. package/lib/public/css/filebrowser.css +0 -1076
  16. package/lib/public/css/highlight.css +0 -144
  17. package/lib/public/css/input.css +0 -512
  18. package/lib/public/css/menus.css +0 -683
  19. package/lib/public/css/messages.css +0 -1159
  20. package/lib/public/css/overlays.css +0 -731
  21. package/lib/public/css/rewind.css +0 -529
  22. package/lib/public/css/sidebar.css +0 -794
  23. package/lib/public/favicon.svg +0 -26
  24. package/lib/public/icon-192.png +0 -0
  25. package/lib/public/icon-512.png +0 -0
  26. package/lib/public/icon-mono.svg +0 -19
  27. package/lib/public/index.html +0 -460
  28. package/lib/public/manifest.json +0 -27
  29. package/lib/public/modules/diff.js +0 -398
  30. package/lib/public/modules/events.js +0 -21
  31. package/lib/public/modules/filebrowser.js +0 -1375
  32. package/lib/public/modules/fileicons.js +0 -172
  33. package/lib/public/modules/icons.js +0 -54
  34. package/lib/public/modules/input.js +0 -578
  35. package/lib/public/modules/markdown.js +0 -149
  36. package/lib/public/modules/notifications.js +0 -643
  37. package/lib/public/modules/qrcode.js +0 -70
  38. package/lib/public/modules/rewind.js +0 -334
  39. package/lib/public/modules/sidebar.js +0 -628
  40. package/lib/public/modules/state.js +0 -3
  41. package/lib/public/modules/terminal.js +0 -658
  42. package/lib/public/modules/theme.js +0 -622
  43. package/lib/public/modules/tools.js +0 -1410
  44. package/lib/public/modules/utils.js +0 -56
  45. package/lib/public/style.css +0 -10
  46. package/lib/public/sw.js +0 -75
  47. package/lib/push.js +0 -125
  48. package/lib/sdk-bridge.js +0 -771
  49. package/lib/server.js +0 -577
  50. package/lib/sessions.js +0 -402
  51. package/lib/terminal-manager.js +0 -187
  52. package/lib/terminal.js +0 -24
  53. package/lib/themes/ayu-light.json +0 -9
  54. package/lib/themes/catppuccin-latte.json +0 -9
  55. package/lib/themes/catppuccin-mocha.json +0 -9
  56. package/lib/themes/claude-light.json +0 -9
  57. package/lib/themes/claude.json +0 -9
  58. package/lib/themes/dracula.json +0 -9
  59. package/lib/themes/everforest-light.json +0 -9
  60. package/lib/themes/everforest.json +0 -9
  61. package/lib/themes/github-light.json +0 -9
  62. package/lib/themes/gruvbox-dark.json +0 -9
  63. package/lib/themes/gruvbox-light.json +0 -9
  64. package/lib/themes/monokai.json +0 -9
  65. package/lib/themes/nord-light.json +0 -9
  66. package/lib/themes/nord.json +0 -9
  67. package/lib/themes/one-dark.json +0 -9
  68. package/lib/themes/one-light.json +0 -9
  69. package/lib/themes/rose-pine-dawn.json +0 -9
  70. package/lib/themes/rose-pine.json +0 -9
  71. package/lib/themes/solarized-dark.json +0 -9
  72. package/lib/themes/solarized-light.json +0 -9
  73. package/lib/themes/tokyo-night-light.json +0 -9
  74. package/lib/themes/tokyo-night.json +0 -9
  75. package/lib/updater.js +0 -96
@@ -1,1076 +0,0 @@
1
- /* ==========================================================================
2
- File Browser
3
- ========================================================================== */
4
-
5
- /* --- Session actions --- */
6
- #session-actions {
7
- display: flex;
8
- flex-direction: column;
9
- padding: 0 8px 4px;
10
- }
11
-
12
- #session-actions button {
13
- display: flex;
14
- align-items: center;
15
- gap: 8px;
16
- padding: 8px 12px;
17
- border-radius: 10px;
18
- border: none;
19
- background: transparent;
20
- color: var(--text-secondary);
21
- font-family: inherit;
22
- font-size: 14px;
23
- font-weight: 400;
24
- cursor: pointer;
25
- margin-bottom: 0;
26
- transition: background 0.15s, color 0.15s;
27
- }
28
-
29
- #session-actions button .lucide { width: 16px; height: 16px; flex-shrink: 0; }
30
- #session-actions button:hover { background: var(--sidebar-hover); color: var(--text); }
31
- /* --- Panels --- */
32
- .sidebar-panel { flex: 1; overflow-y: auto; min-height: 0; }
33
- .sidebar-panel.hidden { display: none; }
34
-
35
- /* --- File browser header --- */
36
- #sessions-header-content.hidden,
37
- #files-header-content.hidden {
38
- display: none;
39
- }
40
-
41
- #file-panel-refresh.spinning { animation: spin-once 0.5s ease; }
42
- @keyframes spin-once { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
43
-
44
- /* --- File tree --- */
45
- #file-tree { padding: 4px 8px; }
46
-
47
- .file-tree-item {
48
- display: flex;
49
- align-items: center;
50
- gap: 6px;
51
- padding: 5px 8px;
52
- border-radius: 8px;
53
- cursor: pointer;
54
- font-size: 13px;
55
- color: var(--text-secondary);
56
- transition: background 0.15s, color 0.15s;
57
- user-select: none;
58
- }
59
-
60
- .file-tree-item:hover { background: var(--sidebar-hover); color: var(--text); }
61
- .file-tree-item.active { background: var(--sidebar-active); color: var(--text); }
62
- .file-tree-item .lucide { width: 14px; height: 14px; flex-shrink: 0; }
63
-
64
- .file-tree-name {
65
- flex: 1;
66
- overflow: hidden;
67
- text-overflow: ellipsis;
68
- white-space: nowrap;
69
- min-width: 0;
70
- }
71
-
72
- .file-tree-icon {
73
- display: inline-flex;
74
- align-items: center;
75
- justify-content: center;
76
- width: 16px;
77
- height: 16px;
78
- flex-shrink: 0;
79
- line-height: 0;
80
- }
81
-
82
- .file-tree-icon svg {
83
- width: 16px;
84
- height: 16px;
85
- }
86
-
87
- .file-tree-chevron {
88
- display: inline-flex;
89
- color: var(--text-dimmer);
90
- transition: transform 0.15s;
91
- flex-shrink: 0;
92
- }
93
-
94
- .file-tree-chevron .lucide { width: 12px; height: 12px; }
95
- .file-tree-item.expanded > .file-tree-chevron { transform: rotate(90deg); }
96
-
97
- .file-tree-spacer { width: 12px; flex-shrink: 0; }
98
-
99
- .file-tree-children.hidden { display: none; }
100
-
101
- .file-tree-loading,
102
- .file-tree-empty {
103
- padding: 12px 16px;
104
- font-size: 12px;
105
- color: var(--text-dimmer);
106
- font-style: italic;
107
- }
108
-
109
- .file-tree-error {
110
- padding: 12px 16px;
111
- font-size: 12px;
112
- color: var(--error);
113
- }
114
-
115
- /* --- File viewer --- */
116
-
117
- /* Wide screens: split panel beside #app */
118
- @media (min-width: 1024px) {
119
- #file-viewer {
120
- width: 50%;
121
- max-width: 720px;
122
- min-width: 360px;
123
- border-left: 1px solid var(--border);
124
- background: var(--bg);
125
- display: flex;
126
- flex-direction: column;
127
- overflow: hidden;
128
- flex-shrink: 0;
129
- transition: max-width 0.2s ease, width 0.2s ease;
130
- }
131
- #file-viewer.hidden { display: none; }
132
- #file-viewer.file-viewer-wide {
133
- width: 70%;
134
- max-width: 1200px;
135
- }
136
- }
137
-
138
- /* Narrow screens: full overlay */
139
- @media (max-width: 1023px) {
140
- #file-viewer {
141
- position: fixed;
142
- inset: 0;
143
- background: var(--bg);
144
- z-index: 300;
145
- display: flex;
146
- flex-direction: column;
147
- overflow: hidden;
148
- }
149
- #file-viewer.hidden { display: none; }
150
- }
151
-
152
- .file-viewer-header {
153
- display: flex;
154
- align-items: center;
155
- gap: 8px;
156
- padding: 10px 16px;
157
- border-bottom: 1px solid var(--border-subtle);
158
- flex-shrink: 0;
159
- min-height: 44px;
160
- }
161
-
162
- .file-viewer-path {
163
- flex: 1;
164
- font-family: "SF Mono", Menlo, Monaco, monospace;
165
- font-size: 13px;
166
- color: var(--text-secondary);
167
- overflow: hidden;
168
- text-overflow: ellipsis;
169
- white-space: nowrap;
170
- direction: rtl;
171
- text-align: left;
172
- }
173
-
174
- .file-viewer-btn {
175
- display: flex;
176
- align-items: center;
177
- justify-content: center;
178
- width: 28px;
179
- height: 28px;
180
- border-radius: 6px;
181
- border: none;
182
- background: transparent;
183
- color: var(--text-muted);
184
- cursor: pointer;
185
- flex-shrink: 0;
186
- transition: background 0.15s, color 0.15s;
187
- }
188
-
189
- .file-viewer-btn:hover { background: var(--sidebar-hover); color: var(--text); }
190
- .file-viewer-btn.active { background: var(--accent-bg); color: var(--accent); }
191
- .file-viewer-btn.hidden { display: none; }
192
- .file-viewer-btn .lucide { width: 16px; height: 16px; }
193
-
194
- /* --- Markdown rendered view --- */
195
- .file-viewer-markdown {
196
- padding: 20px 24px;
197
- font-size: 14px;
198
- line-height: 1.7;
199
- color: var(--text);
200
- }
201
-
202
- .file-viewer-markdown h1,
203
- .file-viewer-markdown h2,
204
- .file-viewer-markdown h3,
205
- .file-viewer-markdown h4 { color: var(--text); margin: 1.2em 0 0.5em; }
206
- .file-viewer-markdown h1 { font-size: 1.6em; border-bottom: 1px solid var(--border-subtle); padding-bottom: 0.3em; }
207
- .file-viewer-markdown h2 { font-size: 1.3em; border-bottom: 1px solid var(--border-subtle); padding-bottom: 0.3em; }
208
- .file-viewer-markdown h3 { font-size: 1.1em; }
209
-
210
- .file-viewer-markdown p { margin: 0.6em 0; }
211
- .file-viewer-markdown a { color: var(--accent); text-decoration: none; }
212
- .file-viewer-markdown a:hover { text-decoration: underline; }
213
-
214
- .file-viewer-markdown ul,
215
- .file-viewer-markdown ol { padding-left: 1.5em; margin: 0.5em 0; }
216
- .file-viewer-markdown li { margin: 0.25em 0; }
217
-
218
- .file-viewer-markdown code {
219
- background: var(--code-bg);
220
- padding: 2px 5px;
221
- border-radius: 4px;
222
- font-size: 0.9em;
223
- }
224
-
225
- .file-viewer-markdown pre {
226
- background: var(--code-bg);
227
- border-radius: 8px;
228
- padding: 12px 16px;
229
- overflow-x: auto;
230
- margin: 0.8em 0;
231
- }
232
-
233
- .file-viewer-markdown pre code {
234
- background: none;
235
- padding: 0;
236
- font-size: 13px;
237
- line-height: 1.5;
238
- }
239
-
240
- .file-viewer-markdown blockquote {
241
- border-left: 3px solid var(--accent);
242
- padding-left: 12px;
243
- margin: 0.8em 0;
244
- color: var(--text-secondary);
245
- }
246
-
247
- .file-viewer-markdown table {
248
- border-collapse: collapse;
249
- margin: 0.8em 0;
250
- width: 100%;
251
- }
252
-
253
- .file-viewer-markdown th,
254
- .file-viewer-markdown td {
255
- border: 1px solid var(--border);
256
- padding: 6px 12px;
257
- text-align: left;
258
- font-size: 13px;
259
- }
260
-
261
- .file-viewer-markdown th { background: var(--bg-alt); font-weight: 600; }
262
-
263
- .file-viewer-markdown hr {
264
- border: none;
265
- border-top: 1px solid var(--border-subtle);
266
- margin: 1.5em 0;
267
- }
268
-
269
- .file-viewer-markdown img { max-width: 100%; border-radius: 8px; }
270
-
271
- .file-viewer-body {
272
- flex: 1;
273
- overflow: auto;
274
- padding: 0;
275
- }
276
-
277
- .file-viewer-body pre {
278
- margin: 0;
279
- padding: 16px 20px;
280
- font-family: "SF Mono", Menlo, Monaco, monospace;
281
- font-size: 13px;
282
- line-height: 1.55;
283
- color: var(--text);
284
- white-space: pre-wrap;
285
- word-break: break-word;
286
- }
287
-
288
- .file-viewer-body pre code {
289
- background: none;
290
- padding: 0;
291
- border-radius: 0;
292
- font-size: inherit;
293
- line-height: inherit;
294
- }
295
-
296
- /* Code with line numbers */
297
- .file-viewer-code {
298
- display: flex;
299
- min-height: 0;
300
- }
301
-
302
- .file-viewer-code pre {
303
- margin: 0;
304
- font-family: "SF Mono", Menlo, Monaco, monospace;
305
- font-size: 13px;
306
- line-height: 1.55;
307
- white-space: pre;
308
- word-break: normal;
309
- }
310
-
311
- .file-viewer-gutter {
312
- flex-shrink: 0;
313
- padding: 12px 10px 12px 14px;
314
- text-align: right;
315
- color: var(--text-dimmer);
316
- opacity: 0.5;
317
- user-select: none;
318
- -webkit-user-select: none;
319
- border-right: 1px solid var(--border-subtle);
320
- min-width: 44px;
321
- position: sticky;
322
- left: 0;
323
- background: var(--bg);
324
- z-index: 1;
325
- }
326
-
327
- .file-viewer-code-content {
328
- flex: 1;
329
- padding: 12px 14px;
330
- min-width: 0;
331
- }
332
-
333
- .file-viewer-code-content code {
334
- font-family: inherit;
335
- font-size: inherit;
336
- line-height: inherit;
337
- background: none;
338
- padding: 0;
339
- border-radius: 0;
340
- }
341
-
342
- .file-viewer-code-content .hljs {
343
- background: transparent;
344
- padding: 0;
345
- }
346
-
347
- .file-viewer-binary {
348
- display: flex;
349
- align-items: center;
350
- justify-content: center;
351
- height: 100%;
352
- color: var(--text-dimmer);
353
- font-size: 14px;
354
- }
355
-
356
- .file-viewer-image {
357
- display: flex;
358
- align-items: center;
359
- justify-content: center;
360
- padding: 20px;
361
- }
362
-
363
- .file-viewer-image img {
364
- max-width: 100%;
365
- max-height: 80vh;
366
- border-radius: 8px;
367
- border: 1px solid var(--border-subtle);
368
- }
369
-
370
- /* --- Web Terminal --- */
371
-
372
- /* Terminal header with tabs */
373
- .terminal-header {
374
- display: flex;
375
- align-items: center;
376
- border-bottom: 1px solid var(--border-subtle);
377
- flex-shrink: 0;
378
- min-height: 40px;
379
- background: var(--bg);
380
- }
381
-
382
- .terminal-tabs {
383
- display: flex;
384
- overflow-x: auto;
385
- -webkit-overflow-scrolling: touch;
386
- gap: 0;
387
- min-width: 0;
388
- padding-left: 4px;
389
- }
390
-
391
- .terminal-tabs::-webkit-scrollbar { display: none; }
392
-
393
- .terminal-new-tab-btn {
394
- display: flex;
395
- align-items: center;
396
- justify-content: center;
397
- width: 28px;
398
- height: 28px;
399
- flex-shrink: 0;
400
- border: none;
401
- background: transparent;
402
- color: var(--text-muted);
403
- cursor: pointer;
404
- border-radius: 6px;
405
- padding: 0;
406
- margin: 4px 2px;
407
- transition: background 0.15s, color 0.15s;
408
- }
409
- .terminal-new-tab-btn:hover { background: rgba(var(--overlay-rgb),0.08); color: var(--text); }
410
- .terminal-new-tab-btn .lucide { width: 14px; height: 14px; }
411
-
412
- .terminal-tab {
413
- display: flex;
414
- align-items: center;
415
- gap: 4px;
416
- padding: 8px 10px;
417
- font-size: 12px;
418
- font-family: "SF Mono", Menlo, Monaco, monospace;
419
- color: var(--text-muted);
420
- cursor: pointer;
421
- white-space: nowrap;
422
- border-bottom: 2px solid transparent;
423
- transition: color 0.15s, border-color 0.15s;
424
- flex-shrink: 0;
425
- user-select: none;
426
- }
427
-
428
- .terminal-tab:hover { color: var(--text-secondary); }
429
- .terminal-tab.active { color: var(--text); border-color: var(--accent); }
430
- .terminal-tab.exited { opacity: 0.5; }
431
-
432
- .terminal-tab-close {
433
- display: none;
434
- align-items: center;
435
- justify-content: center;
436
- width: 16px;
437
- height: 16px;
438
- border-radius: 3px;
439
- border: none;
440
- background: transparent;
441
- color: var(--text-dimmer);
442
- cursor: pointer;
443
- padding: 0;
444
- line-height: 1;
445
- }
446
-
447
- .terminal-tab:hover .terminal-tab-close,
448
- .terminal-tab.active .terminal-tab-close { display: flex; }
449
- .terminal-tab-close:hover { background: rgba(var(--overlay-rgb),0.1); color: var(--text); }
450
-
451
- .terminal-tab-label { cursor: default; }
452
-
453
- .terminal-tab-rename {
454
- background: var(--bg);
455
- border: 1px solid var(--accent);
456
- border-radius: 3px;
457
- color: var(--text);
458
- font-size: 12px;
459
- font-family: "SF Mono", Menlo, Monaco, monospace;
460
- padding: 1px 4px;
461
- outline: none;
462
- width: 100px;
463
- }
464
-
465
- .terminal-header-actions {
466
- display: flex;
467
- align-items: center;
468
- gap: 2px;
469
- padding: 0 8px;
470
- flex-shrink: 0;
471
- margin-left: auto;
472
- }
473
-
474
- /* Wide screens: split panel beside #app */
475
- @media (min-width: 1024px) {
476
- #terminal-container {
477
- width: 50%;
478
- max-width: 720px;
479
- min-width: 360px;
480
- border-left: 1px solid var(--border);
481
- background: var(--bg);
482
- display: flex;
483
- flex-direction: column;
484
- overflow: hidden;
485
- flex-shrink: 0;
486
- }
487
- #terminal-container.hidden { display: none; }
488
- }
489
-
490
- /* Narrow screens: full overlay */
491
- @media (max-width: 1023px) {
492
- #terminal-container {
493
- position: fixed;
494
- inset: 0;
495
- background: var(--bg);
496
- z-index: 300;
497
- display: flex;
498
- flex-direction: column;
499
- overflow: hidden;
500
- }
501
- #terminal-container.hidden { display: none; }
502
- }
503
-
504
- #terminal-body {
505
- flex: 1;
506
- min-height: 0;
507
- overflow: hidden;
508
- position: relative;
509
- }
510
-
511
- .terminal-tab-body {
512
- position: absolute;
513
- inset: 0;
514
- padding: 4px 0 0 4px;
515
- }
516
-
517
- .terminal-tab-body .xterm {
518
- height: 100%;
519
- }
520
-
521
- /* --- Terminal key toolbar (mobile) --- */
522
- #terminal-toolbar {
523
- display: flex;
524
- align-items: center;
525
- gap: 6px;
526
- padding: 6px 8px;
527
- background: #252525;
528
- border-bottom: 1px solid #333;
529
- flex-shrink: 0;
530
- overflow-x: auto;
531
- -webkit-overflow-scrolling: touch;
532
- }
533
-
534
- #terminal-toolbar.hidden { display: none; }
535
-
536
- .term-key {
537
- display: flex;
538
- align-items: center;
539
- justify-content: center;
540
- height: 32px;
541
- min-width: 40px;
542
- padding: 0 10px;
543
- border-radius: 6px;
544
- border: 1px solid #444;
545
- background: #333;
546
- color: #d4d4d4;
547
- font-family: "SF Mono", Menlo, Monaco, monospace;
548
- font-size: 12px;
549
- font-weight: 500;
550
- cursor: pointer;
551
- flex-shrink: 0;
552
- -webkit-tap-highlight-color: transparent;
553
- user-select: none;
554
- transition: background 0.1s, border-color 0.1s;
555
- }
556
-
557
- .term-key:active {
558
- background: #555;
559
- border-color: #666;
560
- }
561
-
562
- .term-key-toggle.active {
563
- background: var(--accent);
564
- border-color: var(--accent);
565
- color: #fff;
566
- }
567
-
568
- .term-key-arrow {
569
- min-width: 34px;
570
- padding: 0 6px;
571
- font-size: 10px;
572
- }
573
-
574
- .term-key-spacer {
575
- flex: 1;
576
- min-width: 4px;
577
- }
578
-
579
- .terminal-hint {
580
- padding: 16px;
581
- font-size: 13px;
582
- color: var(--text-dimmer);
583
- font-style: italic;
584
- }
585
-
586
- /* --- Terminal context menu --- */
587
- .term-ctx-menu {
588
- position: fixed;
589
- background: var(--bg-alt);
590
- border: 1px solid var(--border);
591
- border-radius: 10px;
592
- padding: 4px 0;
593
- min-width: 160px;
594
- box-shadow: 0 4px 16px rgba(var(--shadow-rgb), 0.4);
595
- z-index: 500;
596
- }
597
-
598
- .term-ctx-item {
599
- display: flex;
600
- align-items: center;
601
- gap: 8px;
602
- width: 100%;
603
- padding: 8px 12px;
604
- font-size: 13px;
605
- color: var(--text-secondary);
606
- background: none;
607
- border: none;
608
- font-family: inherit;
609
- cursor: pointer;
610
- transition: background 0.15s;
611
- }
612
-
613
- .term-ctx-item .lucide { width: 14px; height: 14px; flex-shrink: 0; }
614
- .term-ctx-item:hover { background: rgba(var(--overlay-rgb), 0.05); }
615
-
616
- /* --- File Edit History --- */
617
-
618
- .file-history-panel {
619
- padding: 16px 20px;
620
- height: 100%;
621
- overflow-y: auto;
622
- }
623
-
624
- .file-history-header {
625
- display: flex;
626
- align-items: center;
627
- justify-content: space-between;
628
- font-size: 13px;
629
- font-weight: 600;
630
- color: var(--text-secondary);
631
- margin-bottom: 12px;
632
- padding-bottom: 8px;
633
- border-bottom: 1px solid var(--border-subtle);
634
- }
635
-
636
- .file-history-list {
637
- display: flex;
638
- flex-direction: column;
639
- gap: 10px;
640
- }
641
-
642
- .file-history-entry {
643
- background: var(--bg-alt);
644
- border: 1px solid var(--border);
645
- border-radius: 10px;
646
- padding: 10px 12px;
647
- cursor: pointer;
648
- transition: border-color 0.15s, background 0.15s;
649
- position: relative;
650
- }
651
-
652
- .file-history-entry:hover { border-color: var(--accent); }
653
- .file-history-entry.no-navigate { cursor: default; opacity: 0.7; }
654
- .file-history-entry.no-navigate:hover { border-color: var(--border); }
655
-
656
- .file-history-entry.selected {
657
- border-color: var(--accent);
658
- background: var(--accent-bg);
659
- }
660
-
661
- .file-history-entry.selected::before {
662
- content: attr(data-select-num);
663
- position: absolute;
664
- top: -6px;
665
- left: -6px;
666
- width: 18px;
667
- height: 18px;
668
- border-radius: 50%;
669
- background: var(--accent);
670
- color: #fff;
671
- font-size: 11px;
672
- font-weight: 600;
673
- display: flex;
674
- align-items: center;
675
- justify-content: center;
676
- }
677
-
678
- .file-history-entry.git-entry {
679
- border-left: 3px solid var(--text-dimmer);
680
- }
681
-
682
- .file-history-entry.git-entry.selected {
683
- border-left-color: var(--accent);
684
- }
685
-
686
- .file-history-entry-header {
687
- display: flex;
688
- justify-content: space-between;
689
- align-items: center;
690
- gap: 8px;
691
- }
692
-
693
- .file-history-title {
694
- font-size: 13px;
695
- font-weight: 500;
696
- color: var(--text);
697
- overflow: hidden;
698
- text-overflow: ellipsis;
699
- white-space: nowrap;
700
- min-width: 0;
701
- flex: 1;
702
- }
703
-
704
- .file-history-badge {
705
- font-size: 11px;
706
- font-weight: 500;
707
- padding: 2px 8px;
708
- border-radius: 10px;
709
- background: var(--accent-bg);
710
- color: var(--accent);
711
- flex-shrink: 0;
712
- }
713
-
714
- .file-history-badge.badge-commit {
715
- background: rgba(var(--overlay-rgb),0.06);
716
- color: var(--text-muted);
717
- }
718
-
719
- .file-history-code-subtitle {
720
- font-family: "SF Mono", Menlo, Monaco, monospace;
721
- font-size: 11px;
722
- color: var(--text-muted);
723
- margin-top: 4px;
724
- padding: 2px 6px;
725
- background: rgba(var(--overlay-rgb), 0.04);
726
- border-radius: 3px;
727
- overflow: hidden;
728
- text-overflow: ellipsis;
729
- white-space: nowrap;
730
- }
731
-
732
- .file-history-meta {
733
- font-size: 11px;
734
- color: var(--text-dimmer);
735
- margin-top: 4px;
736
- overflow: hidden;
737
- text-overflow: ellipsis;
738
- white-space: nowrap;
739
- }
740
-
741
- /* Inline diff preview */
742
- .file-history-diff {
743
- max-height: 200px;
744
- overflow: auto;
745
- border-radius: 6px;
746
- background: var(--code-bg);
747
- margin-top: 8px;
748
- }
749
-
750
- .file-history-write-badge {
751
- padding: 8px 10px;
752
- font-size: 12px;
753
- color: var(--text-muted);
754
- font-style: italic;
755
- text-align: center;
756
- }
757
-
758
- /* Action buttons row */
759
- .file-history-actions {
760
- display: flex;
761
- gap: 6px;
762
- margin-top: 8px;
763
- }
764
-
765
- .file-history-action-btn {
766
- padding: 3px 8px;
767
- border-radius: 4px;
768
- border: 1px solid var(--border);
769
- background: transparent;
770
- color: var(--text-muted);
771
- font-size: 11px;
772
- font-family: inherit;
773
- cursor: pointer;
774
- transition: background 0.15s, color 0.15s, border-color 0.15s;
775
- }
776
-
777
- .file-history-action-btn:hover {
778
- background: var(--sidebar-hover);
779
- color: var(--text);
780
- border-color: var(--text-dimmer);
781
- }
782
-
783
- .file-history-nav-btn {
784
- color: var(--accent);
785
- border-color: transparent;
786
- }
787
-
788
- .file-history-nav-btn:hover {
789
- background: var(--accent-bg);
790
- color: var(--accent);
791
- border-color: var(--accent);
792
- }
793
-
794
- /* Compare bar */
795
- .file-history-compare-bar-slots {
796
- padding: 10px 12px;
797
- margin-bottom: 8px;
798
- border-radius: 8px;
799
- background: rgba(var(--overlay-rgb), 0.04);
800
- border: 1px solid var(--border);
801
- }
802
-
803
- .compare-bar-label {
804
- display: flex;
805
- align-items: center;
806
- gap: 5px;
807
- font-size: 11px;
808
- font-weight: 600;
809
- color: var(--text-secondary);
810
- margin-bottom: 8px;
811
- text-transform: uppercase;
812
- letter-spacing: 0.5px;
813
- }
814
-
815
- .compare-bar-label svg {
816
- width: 13px;
817
- height: 13px;
818
- opacity: 0.7;
819
- }
820
-
821
- .compare-slots-row {
822
- display: flex;
823
- align-items: center;
824
- gap: 8px;
825
- }
826
-
827
- .file-history-compare-slot {
828
- display: flex;
829
- align-items: center;
830
- gap: 6px;
831
- flex: 1;
832
- min-width: 0;
833
- padding: 7px 10px;
834
- border: 1.5px dashed rgba(var(--overlay-rgb), 0.15);
835
- border-radius: 6px;
836
- font-size: 11px;
837
- color: var(--text-muted);
838
- background: rgba(var(--overlay-rgb), 0.02);
839
- transition: border-color 0.15s, background 0.15s;
840
- }
841
-
842
- .file-history-compare-slot.filled {
843
- border-style: solid;
844
- border-color: var(--accent);
845
- background: var(--accent-bg);
846
- color: var(--text-secondary);
847
- }
848
-
849
- .compare-slot-num {
850
- display: flex;
851
- align-items: center;
852
- justify-content: center;
853
- width: 18px;
854
- height: 18px;
855
- border-radius: 4px;
856
- font-size: 10px;
857
- font-weight: 700;
858
- flex-shrink: 0;
859
- background: rgba(var(--overlay-rgb), 0.1);
860
- color: var(--text-muted);
861
- }
862
-
863
- .file-history-compare-slot.filled .compare-slot-num {
864
- background: var(--accent);
865
- color: #fff;
866
- }
867
-
868
- .compare-slot-text {
869
- flex: 1;
870
- min-width: 0;
871
- overflow: hidden;
872
- text-overflow: ellipsis;
873
- white-space: nowrap;
874
- font-family: "SF Mono", Menlo, Monaco, monospace;
875
- font-size: 11px;
876
- }
877
-
878
- .compare-slot-placeholder {
879
- font-style: italic;
880
- opacity: 0.6;
881
- }
882
-
883
- .compare-slot-clear {
884
- flex-shrink: 0;
885
- border: none;
886
- background: none;
887
- color: var(--text-dimmer);
888
- font-size: 14px;
889
- cursor: pointer;
890
- padding: 0 2px;
891
- line-height: 1;
892
- }
893
- .compare-slot-clear:hover { color: var(--text); }
894
-
895
- .compare-slot-arrow {
896
- flex-shrink: 0;
897
- color: var(--text-dimmer);
898
- opacity: 0.5;
899
- }
900
-
901
- .compare-slot-arrow svg {
902
- width: 14px;
903
- height: 14px;
904
- }
905
-
906
- /* Compare button */
907
- .file-history-compare-btn {
908
- display: flex;
909
- align-items: center;
910
- gap: 5px;
911
- padding: 7px 14px;
912
- border-radius: 6px;
913
- border: none;
914
- background: var(--accent);
915
- color: #fff;
916
- font-size: 12px;
917
- font-weight: 500;
918
- cursor: pointer;
919
- font-family: inherit;
920
- flex-shrink: 0;
921
- transition: opacity 0.15s;
922
- }
923
-
924
- .file-history-compare-btn svg {
925
- width: 13px;
926
- height: 13px;
927
- }
928
-
929
- .file-history-compare-btn:hover { opacity: 0.85; }
930
-
931
- /* Compare view */
932
- .file-history-compare-bar {
933
- margin-bottom: 12px;
934
- }
935
-
936
- .file-history-compare-back {
937
- padding: 6px 12px;
938
- border-radius: 6px;
939
- border: 1px solid var(--border);
940
- background: transparent;
941
- color: var(--text-secondary);
942
- font-size: 12px;
943
- cursor: pointer;
944
- font-family: inherit;
945
- transition: background 0.15s, color 0.15s;
946
- }
947
-
948
- .file-history-compare-back:hover { background: var(--sidebar-hover); color: var(--text); }
949
-
950
- /* View file bar (back + toggle) */
951
- .file-history-view-bar {
952
- display: flex;
953
- align-items: center;
954
- justify-content: space-between;
955
- padding: 10px 16px;
956
- flex-shrink: 0;
957
- }
958
-
959
- .file-history-view-toggle {
960
- display: flex;
961
- border: 1px solid var(--border);
962
- border-radius: 6px;
963
- overflow: hidden;
964
- }
965
-
966
- .file-history-toggle-btn {
967
- padding: 4px 10px;
968
- border: none;
969
- background: transparent;
970
- color: var(--text-muted);
971
- font-size: 11px;
972
- font-family: inherit;
973
- cursor: pointer;
974
- transition: background 0.15s, color 0.15s;
975
- }
976
-
977
- .file-history-toggle-btn + .file-history-toggle-btn {
978
- border-left: 1px solid var(--border);
979
- }
980
-
981
- .file-history-toggle-btn:hover {
982
- background: var(--sidebar-hover);
983
- color: var(--text);
984
- }
985
-
986
- .file-history-toggle-btn.active {
987
- background: var(--accent-bg);
988
- color: var(--accent);
989
- }
990
-
991
- /* Full-size diff container (View diff mode) */
992
- .file-history-diff-full {
993
- flex: 1;
994
- overflow: auto;
995
- background: var(--code-bg);
996
- border-top: 1px solid var(--border-subtle);
997
- }
998
-
999
- /* Split view */
1000
- .file-history-compare-view {
1001
- display: flex;
1002
- flex-direction: column;
1003
- height: 100%;
1004
- }
1005
-
1006
- .file-history-compare-view .file-history-compare-bar {
1007
- padding: 10px 16px;
1008
- flex-shrink: 0;
1009
- }
1010
-
1011
- .file-history-compare-content {
1012
- display: flex;
1013
- flex-direction: column;
1014
- flex: 1;
1015
- min-height: 0;
1016
- }
1017
-
1018
- .file-history-split {
1019
- display: flex;
1020
- flex: 1;
1021
- min-height: 0;
1022
- border-top: 1px solid var(--border-subtle);
1023
- }
1024
-
1025
- .file-history-split-pane {
1026
- flex: 1;
1027
- min-width: 0;
1028
- display: flex;
1029
- flex-direction: column;
1030
- }
1031
-
1032
- .file-history-split-pane + .file-history-split-pane {
1033
- border-left: 1px solid var(--border-subtle);
1034
- }
1035
-
1036
- .file-history-split-label {
1037
- padding: 6px 12px;
1038
- font-size: 11px;
1039
- font-weight: 600;
1040
- color: var(--text-muted);
1041
- background: var(--bg-alt);
1042
- border-bottom: 1px solid var(--border-subtle);
1043
- overflow: hidden;
1044
- text-overflow: ellipsis;
1045
- white-space: nowrap;
1046
- flex-shrink: 0;
1047
- }
1048
-
1049
- .file-history-split-code {
1050
- flex: 1;
1051
- overflow: auto;
1052
- background: var(--code-bg);
1053
- }
1054
-
1055
- .file-history-split-code pre {
1056
- margin: 0;
1057
- padding: 8px 12px;
1058
- font-size: 12px;
1059
- line-height: 1.5;
1060
- tab-size: 2;
1061
- }
1062
-
1063
- .file-history-split-code code {
1064
- font-family: "SF Mono", Menlo, Monaco, monospace;
1065
- }
1066
-
1067
- /* --- Message blink animation --- */
1068
- @keyframes message-blink {
1069
- 0%, 100% { background: transparent; }
1070
- 50% { background: var(--accent-bg); }
1071
- }
1072
-
1073
- .message-blink {
1074
- animation: message-blink 0.5s ease 3;
1075
- border-radius: 12px;
1076
- }