clay-server 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 (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +281 -0
  3. package/bin/cli.js +2385 -0
  4. package/lib/cli-sessions.js +270 -0
  5. package/lib/config.js +237 -0
  6. package/lib/daemon.js +489 -0
  7. package/lib/ipc.js +112 -0
  8. package/lib/notes.js +120 -0
  9. package/lib/pages.js +664 -0
  10. package/lib/project.js +1433 -0
  11. package/lib/public/app.js +2795 -0
  12. package/lib/public/apple-touch-icon-dark.png +0 -0
  13. package/lib/public/apple-touch-icon.png +0 -0
  14. package/lib/public/css/base.css +264 -0
  15. package/lib/public/css/diff.css +128 -0
  16. package/lib/public/css/filebrowser.css +1114 -0
  17. package/lib/public/css/highlight.css +144 -0
  18. package/lib/public/css/icon-strip.css +296 -0
  19. package/lib/public/css/input.css +573 -0
  20. package/lib/public/css/menus.css +856 -0
  21. package/lib/public/css/messages.css +1445 -0
  22. package/lib/public/css/mobile-nav.css +354 -0
  23. package/lib/public/css/overlays.css +697 -0
  24. package/lib/public/css/rewind.css +505 -0
  25. package/lib/public/css/server-settings.css +761 -0
  26. package/lib/public/css/sidebar.css +936 -0
  27. package/lib/public/css/sticky-notes.css +358 -0
  28. package/lib/public/css/title-bar.css +314 -0
  29. package/lib/public/favicon-dark.svg +1 -0
  30. package/lib/public/favicon.svg +1 -0
  31. package/lib/public/icon-192-dark.png +0 -0
  32. package/lib/public/icon-192.png +0 -0
  33. package/lib/public/icon-512-dark.png +0 -0
  34. package/lib/public/icon-512.png +0 -0
  35. package/lib/public/icon-mono.svg +1 -0
  36. package/lib/public/index.html +762 -0
  37. package/lib/public/manifest.json +27 -0
  38. package/lib/public/modules/diff.js +398 -0
  39. package/lib/public/modules/events.js +21 -0
  40. package/lib/public/modules/filebrowser.js +1411 -0
  41. package/lib/public/modules/fileicons.js +172 -0
  42. package/lib/public/modules/icons.js +54 -0
  43. package/lib/public/modules/input.js +584 -0
  44. package/lib/public/modules/markdown.js +356 -0
  45. package/lib/public/modules/notifications.js +649 -0
  46. package/lib/public/modules/qrcode.js +70 -0
  47. package/lib/public/modules/rewind.js +345 -0
  48. package/lib/public/modules/server-settings.js +510 -0
  49. package/lib/public/modules/sidebar.js +1083 -0
  50. package/lib/public/modules/state.js +3 -0
  51. package/lib/public/modules/sticky-notes.js +688 -0
  52. package/lib/public/modules/terminal.js +697 -0
  53. package/lib/public/modules/theme.js +738 -0
  54. package/lib/public/modules/tools.js +1608 -0
  55. package/lib/public/modules/utils.js +56 -0
  56. package/lib/public/style.css +15 -0
  57. package/lib/public/sw.js +75 -0
  58. package/lib/push.js +124 -0
  59. package/lib/sdk-bridge.js +989 -0
  60. package/lib/server.js +582 -0
  61. package/lib/sessions.js +424 -0
  62. package/lib/terminal-manager.js +187 -0
  63. package/lib/terminal.js +24 -0
  64. package/lib/themes/ayu-light.json +9 -0
  65. package/lib/themes/catppuccin-latte.json +9 -0
  66. package/lib/themes/catppuccin-mocha.json +9 -0
  67. package/lib/themes/clay-light.json +10 -0
  68. package/lib/themes/clay.json +10 -0
  69. package/lib/themes/dracula.json +9 -0
  70. package/lib/themes/everforest-light.json +9 -0
  71. package/lib/themes/everforest.json +9 -0
  72. package/lib/themes/github-light.json +9 -0
  73. package/lib/themes/gruvbox-dark.json +9 -0
  74. package/lib/themes/gruvbox-light.json +9 -0
  75. package/lib/themes/monokai.json +9 -0
  76. package/lib/themes/nord-light.json +9 -0
  77. package/lib/themes/nord.json +9 -0
  78. package/lib/themes/one-dark.json +9 -0
  79. package/lib/themes/one-light.json +9 -0
  80. package/lib/themes/rose-pine-dawn.json +9 -0
  81. package/lib/themes/rose-pine.json +9 -0
  82. package/lib/themes/solarized-dark.json +9 -0
  83. package/lib/themes/solarized-light.json +9 -0
  84. package/lib/themes/tokyo-night-light.json +9 -0
  85. package/lib/themes/tokyo-night.json +9 -0
  86. package/lib/updater.js +97 -0
  87. package/package.json +47 -0
@@ -0,0 +1,936 @@
1
+ /* ==========================================================================
2
+ Sidebar
3
+ ========================================================================== */
4
+
5
+ #sidebar-column {
6
+ width: 240px;
7
+ min-width: 192px;
8
+ max-width: 320px;
9
+ background: var(--sidebar-bg);
10
+ transition: width 0.2s ease;
11
+ padding-bottom: 58px;
12
+ }
13
+
14
+ #sidebar {
15
+ flex: 1;
16
+ display: flex;
17
+ flex-direction: column;
18
+ overflow: hidden;
19
+ }
20
+
21
+ #layout.sidebar-collapsed #sidebar-column {
22
+ width: 0;
23
+ min-width: 0;
24
+ overflow: hidden;
25
+ }
26
+
27
+ /* --- Sidebar Header (removed — now in icon-strip + title-bar) --- */
28
+ #sidebar-header {
29
+ display: none;
30
+ }
31
+
32
+ #sidebar-nav {
33
+ display: flex;
34
+ flex-direction: column;
35
+ padding: 8px 8px 4px;
36
+ flex-shrink: 0;
37
+ }
38
+
39
+ /* --- Project List --- */
40
+ #project-list-section {
41
+ padding: 0 4px;
42
+ margin-bottom: 4px;
43
+ border-bottom: 1px solid var(--border-subtle);
44
+ }
45
+
46
+ #project-list-header {
47
+ display: flex;
48
+ align-items: center;
49
+ justify-content: space-between;
50
+ padding: 8px 8px 6px;
51
+ }
52
+
53
+ .project-list-title {
54
+ font-size: 11px;
55
+ font-weight: 600;
56
+ color: var(--text-dimmer);
57
+ text-transform: uppercase;
58
+ letter-spacing: 0.5px;
59
+ }
60
+
61
+ #project-list-add {
62
+ display: flex;
63
+ align-items: center;
64
+ justify-content: center;
65
+ width: 22px;
66
+ height: 22px;
67
+ border: none;
68
+ background: transparent;
69
+ color: var(--text-dimmer);
70
+ cursor: pointer;
71
+ border-radius: 6px;
72
+ transition: background 0.15s, color 0.15s;
73
+ }
74
+
75
+ #project-list-add:hover {
76
+ background: var(--sidebar-hover);
77
+ color: var(--text);
78
+ }
79
+
80
+ #project-list-add .lucide {
81
+ width: 14px;
82
+ height: 14px;
83
+ }
84
+
85
+ #project-list {
86
+ padding: 0 0 6px;
87
+ overflow-y: auto;
88
+ max-height: 200px;
89
+ }
90
+
91
+ .project-list-item {
92
+ display: flex;
93
+ align-items: center;
94
+ gap: 10px;
95
+ padding: 7px 8px 7px 10px;
96
+ cursor: pointer;
97
+ font-size: 13px;
98
+ color: var(--text-muted);
99
+ text-decoration: none;
100
+ transition: background 0.15s, color 0.15s;
101
+ border-left: 3px solid transparent;
102
+ border-radius: 0 6px 6px 0;
103
+ }
104
+
105
+ .project-list-item:hover {
106
+ background: rgba(var(--overlay-rgb), 0.05);
107
+ color: var(--text-secondary);
108
+ }
109
+
110
+ .project-list-item.current {
111
+ background: var(--accent-8);
112
+ border-left-color: var(--accent);
113
+ color: var(--text);
114
+ }
115
+
116
+ .project-list-item.current .pd-name {
117
+ font-weight: 600;
118
+ }
119
+
120
+ .pd-name {
121
+ flex: 1;
122
+ font-size: 13px;
123
+ overflow: hidden;
124
+ text-overflow: ellipsis;
125
+ white-space: nowrap;
126
+ }
127
+
128
+ .pd-count {
129
+ font-size: 12px;
130
+ color: var(--text-dimmer);
131
+ flex-shrink: 0;
132
+ font-variant-numeric: tabular-nums;
133
+ }
134
+
135
+ .pd-indicator {
136
+ width: 6px;
137
+ height: 6px;
138
+ border-radius: 50%;
139
+ flex-shrink: 0;
140
+ }
141
+
142
+ .pd-indicator.active {
143
+ background: var(--accent);
144
+ }
145
+
146
+ .pd-indicator.inactive {
147
+ background: var(--text-dimmer);
148
+ opacity: 0.4;
149
+ }
150
+
151
+ .pd-remove {
152
+ display: none;
153
+ background: none;
154
+ border: none;
155
+ color: var(--text-muted);
156
+ cursor: pointer;
157
+ padding: 2px;
158
+ border-radius: 4px;
159
+ flex-shrink: 0;
160
+ line-height: 0;
161
+ transition: color 0.15s, background 0.15s;
162
+ }
163
+
164
+ .pd-remove .lucide { width: 14px; height: 14px; }
165
+ .project-list-item:hover .pd-remove { display: block; }
166
+ .pd-remove:hover { color: var(--error); background: rgba(var(--overlay-rgb), 0.06); }
167
+
168
+ /* --- Project Hint (single-project onboarding) --- */
169
+ #project-hint {
170
+ padding: 8px 10px;
171
+ margin: 0 4px 4px;
172
+ display: flex;
173
+ align-items: flex-start;
174
+ gap: 6px;
175
+ border-radius: 8px;
176
+ background: var(--accent-12);
177
+ border: 1px solid var(--accent-20);
178
+ }
179
+
180
+ #project-hint.hidden {
181
+ display: none;
182
+ }
183
+
184
+ .project-hint-text {
185
+ font-size: 11px;
186
+ color: var(--accent);
187
+ line-height: 1.5;
188
+ }
189
+
190
+ .project-hint-text code {
191
+ background: var(--accent-15);
192
+ padding: 1px 5px;
193
+ border-radius: 3px;
194
+ font-family: "Roboto Mono", monospace;
195
+ font-size: 10.5px;
196
+ color: var(--accent-hover);
197
+ }
198
+
199
+ #project-hint-dismiss {
200
+ background: none;
201
+ border: none;
202
+ color: var(--accent);
203
+ cursor: pointer;
204
+ padding: 1px;
205
+ flex-shrink: 0;
206
+ display: flex;
207
+ align-items: center;
208
+ opacity: 0.6;
209
+ transition: opacity 0.15s;
210
+ }
211
+
212
+ #project-hint-dismiss:hover {
213
+ opacity: 1;
214
+ }
215
+
216
+ #project-hint-dismiss .lucide {
217
+ width: 12px;
218
+ height: 12px;
219
+ }
220
+
221
+ /* sidebar-toggle-btn hidden — collapse handled by icon strip / title bar */
222
+ #sidebar-toggle-btn {
223
+ display: none;
224
+ }
225
+
226
+ /* --- Sidebar section headers --- */
227
+ .sidebar-section-header {
228
+ padding: 8px 12px 4px;
229
+ }
230
+
231
+ .sidebar-section-title {
232
+ font-size: 11px;
233
+ font-weight: 600;
234
+ color: var(--text-dimmer);
235
+ text-transform: uppercase;
236
+ letter-spacing: 0.5px;
237
+ }
238
+
239
+ /* --- Tools section --- */
240
+ #sidebar-tools {
241
+ flex-shrink: 0;
242
+ border-bottom: 1px solid var(--border-subtle);
243
+ padding-top: 8px;
244
+ padding-bottom: 4px;
245
+ }
246
+
247
+ /* --- Sessions header (pinned above scroll) --- */
248
+ #sidebar-sessions-header {
249
+ flex-shrink: 0;
250
+ }
251
+
252
+ .session-list-header {
253
+ display: flex;
254
+ align-items: center;
255
+ justify-content: space-between;
256
+ padding: 8px 8px 4px 12px;
257
+ font-size: 11px;
258
+ font-weight: 600;
259
+ color: var(--text-dimmer);
260
+ text-transform: uppercase;
261
+ letter-spacing: 0.5px;
262
+ }
263
+
264
+ .session-list-header-actions {
265
+ display: flex;
266
+ align-items: center;
267
+ gap: 2px;
268
+ }
269
+
270
+ .session-list-header-actions button {
271
+ display: flex;
272
+ align-items: center;
273
+ justify-content: center;
274
+ width: 22px;
275
+ height: 22px;
276
+ border-radius: 6px;
277
+ border: none;
278
+ background: transparent;
279
+ color: var(--text-dimmer);
280
+ cursor: pointer;
281
+ padding: 0;
282
+ transition: color 0.15s, background 0.15s;
283
+ }
284
+
285
+ .session-list-header-actions button .lucide { width: 14px; height: 14px; }
286
+ .session-list-header-actions button:hover { color: var(--text); background: var(--sidebar-hover); }
287
+
288
+ /* --- Session search --- */
289
+ #session-search {
290
+ padding: 0 12px 8px;
291
+ position: relative;
292
+ }
293
+
294
+ #session-search.hidden {
295
+ display: none;
296
+ }
297
+
298
+ #session-search-input {
299
+ width: 100%;
300
+ padding: 7px 28px 7px 10px;
301
+ border-radius: 8px;
302
+ border: 1px solid var(--border);
303
+ background: var(--input-bg);
304
+ color: var(--text);
305
+ font-size: 13px;
306
+ font-family: inherit;
307
+ outline: none;
308
+ transition: border-color 0.15s;
309
+ box-sizing: border-box;
310
+ }
311
+
312
+ #session-search-input:focus {
313
+ border-color: var(--accent);
314
+ }
315
+
316
+ #session-search-input::placeholder {
317
+ color: var(--text-dimmer);
318
+ }
319
+
320
+ #session-search-clear {
321
+ position: absolute;
322
+ right: 16px;
323
+ top: calc(50% - 4px);
324
+ transform: translateY(-50%);
325
+ display: flex;
326
+ align-items: center;
327
+ justify-content: center;
328
+ width: 20px;
329
+ height: 20px;
330
+ border: none;
331
+ background: transparent;
332
+ color: var(--text-dimmer);
333
+ cursor: pointer;
334
+ padding: 0;
335
+ border-radius: 4px;
336
+ transition: color 0.15s, background 0.15s;
337
+ }
338
+
339
+ #session-search-clear .lucide { width: 14px; height: 14px; }
340
+ #session-search-clear:hover { color: var(--text); background: var(--sidebar-hover); }
341
+
342
+ #search-session-btn.active {
343
+ color: var(--accent);
344
+ }
345
+
346
+ .session-item.search-match {
347
+ background: var(--accent-12);
348
+ color: var(--text);
349
+ }
350
+
351
+ .session-item.search-match .session-item-text {
352
+ color: var(--accent);
353
+ }
354
+
355
+ .session-item.search-dimmed {
356
+ opacity: 0.35;
357
+ }
358
+
359
+ .session-highlight {
360
+ background: var(--accent-30);
361
+ color: var(--text);
362
+ border-radius: 2px;
363
+ padding: 0 1px;
364
+ }
365
+
366
+ /* --- Search hit timeline (right-side markers) --- */
367
+ .search-timeline {
368
+ position: absolute;
369
+ right: 8px;
370
+ z-index: 10;
371
+ pointer-events: none;
372
+ }
373
+
374
+ .search-blink {
375
+ animation: searchBlink 0.4s ease-in-out 3;
376
+ }
377
+
378
+ @keyframes searchBlink {
379
+ 0%, 100% { box-shadow: none; }
380
+ 50% { box-shadow: 0 0 0 2px var(--accent); border-radius: 12px; }
381
+ }
382
+
383
+ #session-list {
384
+ padding: 2px 8px;
385
+ }
386
+
387
+ .session-group-header {
388
+ padding: 10px 12px 4px;
389
+ font-size: 11px;
390
+ font-weight: 600;
391
+ color: var(--text-dimmer);
392
+ letter-spacing: 0.3px;
393
+ }
394
+
395
+ .session-item {
396
+ position: relative;
397
+ display: flex;
398
+ align-items: center;
399
+ gap: 4px;
400
+ padding: 0 36px 0 12px;
401
+ height: 34px;
402
+ border-radius: 10px;
403
+ cursor: pointer;
404
+ font-size: 13px;
405
+ color: var(--text-muted);
406
+ margin-bottom: 0;
407
+ transition: background 0.35s ease, color 0.35s ease;
408
+ contain: size layout;
409
+ }
410
+
411
+ .session-item-text {
412
+ flex: 1;
413
+ overflow: hidden;
414
+ text-overflow: ellipsis;
415
+ white-space: nowrap;
416
+ min-width: 0;
417
+ }
418
+
419
+ .session-item:hover {
420
+ background: var(--sidebar-hover);
421
+ color: var(--text-secondary);
422
+ }
423
+
424
+ .session-item.active {
425
+ background: var(--sidebar-active);
426
+ color: var(--text);
427
+ font-weight: 600;
428
+ }
429
+
430
+ .session-item .session-processing {
431
+ display: inline-block;
432
+ width: 6px;
433
+ height: 6px;
434
+ border-radius: 50%;
435
+ background: var(--accent);
436
+ animation: pulse 1.5s ease-in-out infinite;
437
+ margin-right: 8px;
438
+ vertical-align: middle;
439
+ }
440
+
441
+ .session-more-btn {
442
+ position: absolute;
443
+ right: 8px;
444
+ top: 50%;
445
+ transform: translateY(-50%);
446
+ display: flex;
447
+ width: 24px;
448
+ height: 24px;
449
+ border-radius: 6px;
450
+ border: none;
451
+ background: transparent;
452
+ color: var(--text-muted);
453
+ cursor: pointer;
454
+ align-items: center;
455
+ justify-content: center;
456
+ padding: 0;
457
+ opacity: 0;
458
+ transition: opacity 0.35s ease, color 0.15s, background 0.15s;
459
+ }
460
+
461
+ .session-more-btn .lucide,
462
+ .session-more-btn svg { width: 14px; height: 14px; display: block; }
463
+ .session-item:hover .session-more-btn { opacity: 1; }
464
+ .session-more-btn:hover { color: var(--text); background: rgba(var(--overlay-rgb), 0.06); }
465
+
466
+ /* --- Session context menu --- */
467
+ .session-ctx-menu {
468
+ position: fixed;
469
+ background: var(--sidebar-bg);
470
+ border: 1px solid var(--border);
471
+ border-radius: 10px;
472
+ padding: 4px 0;
473
+ min-width: 140px;
474
+ box-shadow: 0 4px 16px rgba(var(--shadow-rgb), 0.4);
475
+ z-index: 9999;
476
+ }
477
+
478
+ .session-ctx-item {
479
+ display: flex;
480
+ align-items: center;
481
+ gap: 8px;
482
+ width: 100%;
483
+ padding: 8px 12px;
484
+ font-size: 13px;
485
+ color: var(--text-secondary);
486
+ background: none;
487
+ border: none;
488
+ font-family: inherit;
489
+ cursor: pointer;
490
+ transition: background 0.15s;
491
+ }
492
+
493
+ .session-ctx-item .lucide { width: 14px; height: 14px; flex-shrink: 0; }
494
+ .session-ctx-item:hover { background: rgba(var(--overlay-rgb), 0.05); }
495
+
496
+ .session-ctx-item.session-ctx-delete { color: var(--error); }
497
+ .session-ctx-item.session-ctx-delete:hover { background: var(--error-8); }
498
+
499
+ /* --- Session inline rename --- */
500
+ .session-rename-input {
501
+ width: 100%;
502
+ background: var(--input-bg);
503
+ border: 1px solid var(--text-dimmer);
504
+ border-radius: 6px;
505
+ color: var(--text);
506
+ font-size: 13px;
507
+ font-family: inherit;
508
+ padding: 2px 6px;
509
+ outline: none;
510
+ }
511
+
512
+ @media (hover: none) {
513
+ .session-more-btn { opacity: 1; }
514
+ .msg-copy-hint { opacity: 1; }
515
+ .msg-user[data-uuid] .bubble::after { display: none; }
516
+ .mermaid-diagram::after { display: none; }
517
+ }
518
+
519
+ /* --- User Island (bottom bar spanning icon strip + sidebar) --- */
520
+ #user-island {
521
+ position: absolute;
522
+ bottom: 8px;
523
+ left: 8px;
524
+ width: calc(72px + 240px - 16px);
525
+ height: 58px;
526
+ display: flex;
527
+ align-items: center;
528
+ background: var(--bg);
529
+ padding: 0 8px 0 0;
530
+ gap: 0;
531
+ z-index: 15;
532
+ border-radius: 10px;
533
+ }
534
+
535
+ #user-island::before {
536
+ content: "";
537
+ position: absolute;
538
+ top: 100%;
539
+ left: -8px;
540
+ right: -8px;
541
+ height: 8px;
542
+ background: var(--sidebar-bg);
543
+ }
544
+
545
+ .user-island-avatar {
546
+ width: 72px;
547
+ flex-shrink: 0;
548
+ display: flex;
549
+ align-items: center;
550
+ justify-content: center;
551
+ }
552
+
553
+ .user-island-avatar .footer-mascot {
554
+ width: 32px;
555
+ height: 32px;
556
+ border-radius: 50%;
557
+ }
558
+
559
+ .user-island-avatar-letter {
560
+ width: 32px;
561
+ height: 32px;
562
+ border-radius: 50%;
563
+ background: var(--accent2);
564
+ color: #fff;
565
+ font-family: "Nunito", sans-serif;
566
+ font-size: 15px;
567
+ font-weight: 800;
568
+ display: flex;
569
+ align-items: center;
570
+ justify-content: center;
571
+ flex-shrink: 0;
572
+ }
573
+
574
+ .user-island-info {
575
+ flex: 1;
576
+ min-width: 0;
577
+ overflow: hidden;
578
+ }
579
+
580
+ .user-island-name {
581
+ font-family: "Nunito", sans-serif;
582
+ font-size: 13px;
583
+ font-weight: 700;
584
+ color: var(--text);
585
+ white-space: nowrap;
586
+ overflow: hidden;
587
+ text-overflow: ellipsis;
588
+ }
589
+
590
+ .user-island-actions {
591
+ display: flex;
592
+ align-items: center;
593
+ gap: 2px;
594
+ flex-shrink: 0;
595
+ }
596
+
597
+ .user-island-actions button {
598
+ width: 32px;
599
+ height: 32px;
600
+ border-radius: 6px;
601
+ border: none;
602
+ background: transparent;
603
+ color: var(--text-muted);
604
+ cursor: pointer;
605
+ display: flex;
606
+ align-items: center;
607
+ justify-content: center;
608
+ transition: background 0.15s, color 0.15s;
609
+ }
610
+
611
+ .user-island-actions button .lucide {
612
+ width: 16px;
613
+ height: 16px;
614
+ }
615
+
616
+ .user-island-actions button:hover {
617
+ background: var(--sidebar-hover);
618
+ color: var(--text-secondary);
619
+ }
620
+
621
+ .user-island-chip {
622
+ --chip-star: #FFE500;
623
+ position: relative;
624
+ display: inline-flex;
625
+ align-items: center;
626
+ gap: 5px;
627
+ padding: 4px 11px 4px 8px;
628
+ border-radius: 99px;
629
+ border: 1px solid var(--accent2-30);
630
+ background: var(--accent2);
631
+ color: #fff;
632
+ font-family: inherit;
633
+ font-size: 11px;
634
+ font-weight: 700;
635
+ text-decoration: none;
636
+ cursor: pointer;
637
+ transition: all 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
638
+ white-space: nowrap;
639
+ overflow: hidden;
640
+ box-shadow:
641
+ 0 1px 4px color-mix(in srgb, var(--accent2), black 75%),
642
+ inset 0 1px 0 rgba(255, 255, 255, 0.06);
643
+ }
644
+
645
+ /* shimmer sweep */
646
+ .user-island-chip::before {
647
+ content: "";
648
+ position: absolute;
649
+ top: 0;
650
+ left: -120%;
651
+ width: 60%;
652
+ height: 100%;
653
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.07), transparent);
654
+ animation: chip-shimmer 5s ease-in-out 2s infinite;
655
+ pointer-events: none;
656
+ }
657
+
658
+ @keyframes chip-shimmer {
659
+ 0%, 75%, 100% { left: -120%; }
660
+ 35% { left: 160%; }
661
+ }
662
+
663
+ .chip-octocat {
664
+ width: 13px;
665
+ height: 13px;
666
+ flex-shrink: 0;
667
+ filter: drop-shadow(0 0 3px rgba(255, 255, 255, 0.2));
668
+ transition: filter 0.3s ease;
669
+ }
670
+
671
+ .chip-star {
672
+ color: var(--chip-star);
673
+ font-size: 9px;
674
+ line-height: 1;
675
+ text-shadow: 0 0 5px color-mix(in srgb, var(--chip-star), transparent 60%);
676
+ animation: chip-star-pulse 3s ease-in-out infinite;
677
+ transition: text-shadow 0.3s ease;
678
+ }
679
+
680
+ @keyframes chip-star-pulse {
681
+ 0%, 100% { opacity: 0.75; text-shadow: 0 0 4px color-mix(in srgb, var(--chip-star), transparent 70%); }
682
+ 50% { opacity: 1; text-shadow: 0 0 8px color-mix(in srgb, var(--chip-star), transparent 35%); }
683
+ }
684
+
685
+ .chip-label {
686
+ color: #fff;
687
+ letter-spacing: 0.01em;
688
+ }
689
+
690
+ .user-island-chip:hover {
691
+ border-color: color-mix(in srgb, var(--chip-star), transparent 55%);
692
+ background: var(--accent2-hover);
693
+ box-shadow:
694
+ 0 2px 10px color-mix(in srgb, var(--chip-star), transparent 88%),
695
+ 0 1px 4px color-mix(in srgb, var(--accent2), black 65%),
696
+ inset 0 1px 0 rgba(255, 255, 255, 0.08);
697
+ transform: translateY(-1px);
698
+ }
699
+
700
+ .user-island-chip:hover .chip-octocat {
701
+ filter: drop-shadow(0 0 6px rgba(255, 255, 255, 0.35));
702
+ }
703
+
704
+ .user-island-chip:hover .chip-star {
705
+ text-shadow: 0 0 10px color-mix(in srgb, var(--chip-star), transparent 10%);
706
+ animation: none;
707
+ opacity: 1;
708
+ }
709
+
710
+ .user-island-chip:active {
711
+ transform: translateY(0);
712
+ box-shadow:
713
+ 0 1px 3px color-mix(in srgb, var(--accent2), black 65%),
714
+ inset 0 1px 2px rgba(0, 0, 0, 0.15);
715
+ }
716
+
717
+ #layout.sidebar-collapsed #user-island .user-island-info,
718
+ #layout.sidebar-collapsed #user-island .user-island-actions {
719
+ display: none;
720
+ }
721
+
722
+ .footer-mascot {
723
+ flex-shrink: 0;
724
+ border-radius: 3px;
725
+ }
726
+
727
+ .footer-version {
728
+ font-size: 11px;
729
+ color: var(--text-dimmer);
730
+ font-weight: 400;
731
+ }
732
+
733
+
734
+ .sidebar-menu-item.has-badge { position: relative; }
735
+ .sidebar-menu-item .menu-badge {
736
+ margin-left: auto;
737
+ font-size: 11px;
738
+ font-weight: 600;
739
+ color: var(--success);
740
+ }
741
+
742
+ /* --- Sidebar overlay (mobile) --- */
743
+ #sidebar-overlay {
744
+ display: none;
745
+ position: fixed;
746
+ inset: 0;
747
+ background: rgba(var(--shadow-rgb), 0.6);
748
+ z-index: 99;
749
+ backdrop-filter: blur(2px);
750
+ -webkit-backdrop-filter: blur(2px);
751
+ }
752
+
753
+ #sidebar-overlay.visible { display: block; }
754
+
755
+ /* --- Sidebar expand (desktop collapsed) --- */
756
+ #sidebar-expand-btn {
757
+ display: none;
758
+ background: none;
759
+ border: none;
760
+ color: var(--text-secondary);
761
+ cursor: pointer;
762
+ padding: 4px;
763
+ margin-right: 10px;
764
+ flex-shrink: 0;
765
+ align-items: center;
766
+ justify-content: center;
767
+ transition: color 0.15s;
768
+ }
769
+
770
+ #sidebar-expand-btn .lucide {
771
+ width: 20px;
772
+ height: 20px;
773
+ }
774
+
775
+ #sidebar-expand-btn:hover {
776
+ color: var(--text);
777
+ }
778
+
779
+ #layout.sidebar-collapsed #sidebar-expand-btn {
780
+ display: flex;
781
+ }
782
+
783
+ /* --- Hamburger --- */
784
+ #hamburger-btn {
785
+ display: none;
786
+ background: none;
787
+ border: none;
788
+ color: var(--text-secondary);
789
+ cursor: pointer;
790
+ padding: 4px;
791
+ margin-right: 10px;
792
+ flex-shrink: 0;
793
+ }
794
+
795
+ #hamburger-btn .lucide {
796
+ width: 20px;
797
+ height: 20px;
798
+ }
799
+
800
+ /* --- Theme picker --- */
801
+ .theme-picker {
802
+ position: fixed;
803
+ background: var(--bg-alt);
804
+ border: 1px solid var(--border);
805
+ border-radius: 12px;
806
+ padding: 0;
807
+ min-width: 220px;
808
+ max-height: 70vh;
809
+ overflow-y: auto;
810
+ box-shadow: 0 8px 32px rgba(var(--shadow-rgb), 0.5);
811
+ z-index: 200;
812
+ opacity: 0;
813
+ transform: translateY(8px);
814
+ pointer-events: none;
815
+ transition: opacity 0.15s, transform 0.15s;
816
+ }
817
+
818
+ .theme-picker.visible {
819
+ opacity: 1;
820
+ transform: translateY(0);
821
+ pointer-events: auto;
822
+ }
823
+
824
+ .theme-picker-header {
825
+ padding: 8px 14px 4px;
826
+ font-size: 11px;
827
+ font-weight: 600;
828
+ color: var(--text-dimmer);
829
+ text-transform: uppercase;
830
+ letter-spacing: 0.5px;
831
+ position: sticky;
832
+ top: 0;
833
+ background: var(--bg-alt);
834
+ z-index: 1;
835
+ }
836
+
837
+ .theme-picker-section {
838
+ padding-bottom: 4px;
839
+ }
840
+
841
+ .theme-picker-item {
842
+ display: flex;
843
+ align-items: center;
844
+ gap: 10px;
845
+ width: 100%;
846
+ padding: 7px 14px;
847
+ border: none;
848
+ background: none;
849
+ color: var(--text-secondary);
850
+ font-family: inherit;
851
+ font-size: 13px;
852
+ cursor: pointer;
853
+ transition: background 0.15s;
854
+ }
855
+
856
+ .theme-picker-item:hover {
857
+ background: rgba(var(--overlay-rgb), 0.05);
858
+ }
859
+
860
+ .theme-picker-item.active {
861
+ color: var(--text);
862
+ }
863
+
864
+ .theme-swatches {
865
+ display: flex;
866
+ gap: 3px;
867
+ flex-shrink: 0;
868
+ }
869
+
870
+ .theme-swatch {
871
+ width: 12px;
872
+ height: 12px;
873
+ border-radius: 3px;
874
+ border: 1px solid rgba(var(--overlay-rgb), 0.1);
875
+ }
876
+
877
+ .theme-picker-label {
878
+ flex: 1;
879
+ text-align: left;
880
+ }
881
+
882
+ .theme-picker-check {
883
+ font-size: 14px;
884
+ color: var(--accent);
885
+ opacity: 0;
886
+ flex-shrink: 0;
887
+ }
888
+
889
+ .theme-picker-item.active .theme-picker-check {
890
+ opacity: 1;
891
+ }
892
+
893
+ /* --- Sidebar resize handle (overlay, no layout space) --- */
894
+ #sidebar-resize-handle {
895
+ position: absolute;
896
+ top: 0;
897
+ bottom: 0;
898
+ width: 8px;
899
+ margin-left: -4px;
900
+ cursor: col-resize;
901
+ z-index: 10;
902
+ }
903
+
904
+ #sidebar-resize-handle::before {
905
+ content: "";
906
+ position: absolute;
907
+ top: 0;
908
+ bottom: 0;
909
+ left: 50%;
910
+ width: 2px;
911
+ margin-left: -1px;
912
+ background: var(--accent);
913
+ opacity: 0;
914
+ transition: opacity 0.2s;
915
+ }
916
+
917
+ #sidebar-resize-handle:hover::before,
918
+ #sidebar-resize-handle.dragging::before {
919
+ opacity: 1;
920
+ }
921
+
922
+ /* Hide resize handle when sidebar is collapsed */
923
+ #layout.sidebar-collapsed #sidebar-resize-handle {
924
+ display: none;
925
+ }
926
+
927
+ @media (max-width: 768px) {
928
+ #sidebar-resize-handle {
929
+ display: none;
930
+ }
931
+
932
+ #user-island {
933
+ display: none;
934
+ }
935
+ }
936
+