clay-server 2.5.1 → 2.7.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 (41) hide show
  1. package/bin/claude-relay.js +6 -0
  2. package/bin/cli.js +77 -11
  3. package/lib/cli-sessions.js +2 -7
  4. package/lib/config.js +86 -7
  5. package/lib/daemon.js +279 -6
  6. package/lib/ipc.js +12 -0
  7. package/lib/notes.js +4 -3
  8. package/lib/project.js +1174 -28
  9. package/lib/public/app.js +879 -31
  10. package/lib/public/css/diff.css +15 -4
  11. package/lib/public/css/filebrowser.css +363 -3
  12. package/lib/public/css/icon-strip.css +317 -1
  13. package/lib/public/css/input.css +127 -50
  14. package/lib/public/css/loop.css +780 -0
  15. package/lib/public/css/messages.css +1 -1
  16. package/lib/public/css/mobile-nav.css +6 -2
  17. package/lib/public/css/rewind.css +23 -0
  18. package/lib/public/css/server-settings.css +67 -20
  19. package/lib/public/css/sidebar.css +10 -4
  20. package/lib/public/css/skills.css +789 -0
  21. package/lib/public/css/sticky-notes.css +486 -0
  22. package/lib/public/css/title-bar.css +157 -7
  23. package/lib/public/index.html +366 -55
  24. package/lib/public/modules/diff.js +3 -3
  25. package/lib/public/modules/filebrowser.js +169 -45
  26. package/lib/public/modules/input.js +123 -56
  27. package/lib/public/modules/project-settings.js +906 -0
  28. package/lib/public/modules/qrcode.js +23 -26
  29. package/lib/public/modules/server-settings.js +449 -53
  30. package/lib/public/modules/sidebar.js +732 -1
  31. package/lib/public/modules/skills.js +794 -0
  32. package/lib/public/modules/sticky-notes.js +617 -52
  33. package/lib/public/modules/terminal.js +7 -0
  34. package/lib/public/modules/theme.js +9 -19
  35. package/lib/public/modules/tools.js +16 -2
  36. package/lib/public/style.css +2 -0
  37. package/lib/sdk-bridge.js +46 -7
  38. package/lib/server.js +305 -1
  39. package/lib/sessions.js +11 -5
  40. package/lib/utils.js +18 -0
  41. package/package.json +3 -2
@@ -0,0 +1,789 @@
1
+ /* ==========================================================================
2
+ Skills Modal
3
+ ========================================================================== */
4
+
5
+ #skills-modal { position: fixed; inset: 0; z-index: 300; display: flex; align-items: center; justify-content: center; }
6
+ #skills-modal.hidden { display: none; }
7
+
8
+ .skills-dialog {
9
+ width: 1060px;
10
+ max-width: 94vw;
11
+ height: 90vh;
12
+ display: flex;
13
+ flex-direction: column;
14
+ padding: 0;
15
+ overflow: hidden;
16
+ }
17
+
18
+ /* --- Header --- */
19
+ .skills-header {
20
+ display: flex;
21
+ align-items: center;
22
+ justify-content: space-between;
23
+ padding: 16px 20px 0;
24
+ flex-shrink: 0;
25
+ }
26
+
27
+ .skills-title {
28
+ font-size: 15px;
29
+ font-weight: 700;
30
+ color: var(--text);
31
+ display: flex;
32
+ align-items: center;
33
+ gap: 8px;
34
+ }
35
+
36
+ .skills-title .lucide { width: 16px; height: 16px; color: var(--accent); }
37
+
38
+ .skills-powered-by {
39
+ font-size: 11px;
40
+ font-weight: 400;
41
+ color: var(--text-dimmer);
42
+ margin-left: 4px;
43
+ }
44
+
45
+ .skills-powered-by a {
46
+ color: var(--accent);
47
+ text-decoration: none;
48
+ }
49
+
50
+ .skills-powered-by a:hover {
51
+ text-decoration: underline;
52
+ }
53
+
54
+ .skills-close {
55
+ background: none;
56
+ border: none;
57
+ color: var(--text-dimmer);
58
+ cursor: pointer;
59
+ padding: 4px;
60
+ display: flex;
61
+ align-items: center;
62
+ border-radius: 6px;
63
+ transition: color 0.15s, background 0.15s;
64
+ }
65
+
66
+ .skills-close:hover { color: var(--text); background: var(--sidebar-hover); }
67
+ .skills-close .lucide { width: 16px; height: 16px; }
68
+
69
+ /* --- Tabs --- */
70
+ .skills-tabs {
71
+ display: flex;
72
+ gap: 2px;
73
+ padding: 12px 20px 0;
74
+ flex-shrink: 0;
75
+ border-bottom: 1px solid var(--border-subtle);
76
+ }
77
+
78
+ .skills-tab {
79
+ background: none;
80
+ border: none;
81
+ color: var(--text-muted);
82
+ font-family: inherit;
83
+ font-size: 13px;
84
+ font-weight: 500;
85
+ padding: 8px 14px;
86
+ cursor: pointer;
87
+ border-bottom: 2px solid transparent;
88
+ margin-bottom: -1px;
89
+ transition: color 0.15s, border-color 0.15s;
90
+ }
91
+
92
+ .skills-tab:hover { color: var(--text-secondary); }
93
+
94
+ .skills-tab.active {
95
+ color: var(--accent);
96
+ border-bottom-color: var(--accent);
97
+ }
98
+
99
+ /* --- Search --- */
100
+ .skills-search {
101
+ display: flex;
102
+ align-items: center;
103
+ gap: 10px;
104
+ padding: 12px 20px 0;
105
+ flex-shrink: 0;
106
+ }
107
+
108
+ .skills-search .lucide {
109
+ width: 15px;
110
+ height: 15px;
111
+ color: var(--text-dimmer);
112
+ flex-shrink: 0;
113
+ }
114
+
115
+ .skills-search input {
116
+ flex: 1;
117
+ background: none;
118
+ border: none;
119
+ outline: none;
120
+ color: var(--text);
121
+ font-family: inherit;
122
+ font-size: 13px;
123
+ }
124
+
125
+ .skills-search input::placeholder {
126
+ color: var(--text-dimmer);
127
+ }
128
+
129
+ .skills-search-hint {
130
+ font-family: inherit;
131
+ font-size: 11px;
132
+ color: var(--text-dimmer);
133
+ background: var(--sidebar-hover);
134
+ border: 1px solid var(--border-subtle);
135
+ border-radius: 4px;
136
+ padding: 1px 6px;
137
+ line-height: 1.4;
138
+ flex-shrink: 0;
139
+ }
140
+
141
+ .skills-search-clear {
142
+ background: none;
143
+ border: none;
144
+ color: var(--text-dimmer);
145
+ cursor: pointer;
146
+ padding: 2px;
147
+ display: flex;
148
+ align-items: center;
149
+ flex-shrink: 0;
150
+ border-radius: 4px;
151
+ transition: color 0.15s;
152
+ }
153
+
154
+ .skills-search-clear:hover { color: var(--text); }
155
+ .skills-search-clear .lucide { width: 14px; height: 14px; }
156
+ .skills-search-clear.hidden { display: none; }
157
+
158
+ /* --- Content area --- */
159
+ .skills-content {
160
+ flex: 1;
161
+ min-height: 0;
162
+ overflow-y: auto;
163
+ padding: 0;
164
+ }
165
+
166
+ /* --- Loading / Empty --- */
167
+ .skills-loading, .skills-empty {
168
+ display: flex;
169
+ align-items: center;
170
+ justify-content: center;
171
+ gap: 10px;
172
+ padding: 48px 20px;
173
+ font-size: 13px;
174
+ color: var(--text-muted);
175
+ }
176
+
177
+ .skills-spinner {
178
+ width: 16px;
179
+ height: 16px;
180
+ border: 2px solid var(--border);
181
+ border-top-color: var(--text-secondary);
182
+ border-radius: 50%;
183
+ animation: spin 0.6s linear infinite;
184
+ }
185
+
186
+ /* --- List --- */
187
+ .skills-list {
188
+ display: flex;
189
+ flex-direction: column;
190
+ }
191
+
192
+ .skills-item {
193
+ display: flex;
194
+ align-items: center;
195
+ gap: 12px;
196
+ padding: 10px 20px;
197
+ cursor: pointer;
198
+ transition: background 0.12s;
199
+ border-bottom: 1px solid var(--border-subtle);
200
+ }
201
+
202
+ .skills-item:last-child { border-bottom: none; }
203
+ .skills-item:hover { background: rgba(var(--overlay-rgb), 0.04); }
204
+
205
+ .skills-item-rank {
206
+ font-size: 12px;
207
+ font-weight: 600;
208
+ color: var(--text-dimmer);
209
+ min-width: 28px;
210
+ text-align: right;
211
+ flex-shrink: 0;
212
+ font-family: "Roboto Mono", monospace;
213
+ }
214
+
215
+ .skills-item-info {
216
+ flex: 1;
217
+ min-width: 0;
218
+ }
219
+
220
+ .skills-item-name {
221
+ font-size: 13px;
222
+ font-weight: 600;
223
+ color: var(--text);
224
+ white-space: nowrap;
225
+ overflow: hidden;
226
+ text-overflow: ellipsis;
227
+ }
228
+
229
+ .skills-item-source {
230
+ font-size: 11px;
231
+ color: var(--text-muted);
232
+ margin-top: 2px;
233
+ white-space: nowrap;
234
+ overflow: hidden;
235
+ text-overflow: ellipsis;
236
+ }
237
+
238
+ .skills-item-stats {
239
+ display: flex;
240
+ flex-direction: column;
241
+ align-items: flex-end;
242
+ flex-shrink: 0;
243
+ gap: 2px;
244
+ }
245
+
246
+ .skills-item-installs {
247
+ font-size: 12px;
248
+ font-weight: 600;
249
+ color: var(--text-secondary);
250
+ font-family: "Roboto Mono", monospace;
251
+ }
252
+
253
+ .skills-item-change {
254
+ font-size: 11px;
255
+ font-weight: 600;
256
+ color: var(--success);
257
+ font-family: "Roboto Mono", monospace;
258
+ }
259
+
260
+ .skills-item-change.negative { color: var(--error); }
261
+
262
+ /* --- Detail View --- */
263
+ .skills-detail {
264
+ display: flex;
265
+ gap: 0;
266
+ height: 100%;
267
+ min-height: 0;
268
+ }
269
+
270
+ /* Header actions (back + close) */
271
+ .skills-header-actions {
272
+ display: flex;
273
+ align-items: center;
274
+ gap: 4px;
275
+ }
276
+
277
+ .skills-back-btn {
278
+ background: none;
279
+ border: none;
280
+ color: var(--text-dimmer);
281
+ cursor: pointer;
282
+ padding: 4px;
283
+ display: flex;
284
+ align-items: center;
285
+ border-radius: 6px;
286
+ transition: color 0.15s, background 0.15s;
287
+ }
288
+
289
+ .skills-back-btn:hover { color: var(--text); background: var(--sidebar-hover); }
290
+ .skills-back-btn .lucide { width: 16px; height: 16px; }
291
+ .skills-back-btn.hidden { display: none; }
292
+
293
+ .skills-detail-main {
294
+ flex: 1;
295
+ min-width: 0;
296
+ overflow: hidden;
297
+ padding: 0;
298
+ border-right: 1px solid var(--border-subtle);
299
+ display: flex;
300
+ flex-direction: column;
301
+ }
302
+
303
+ .skills-detail-main > .skills-detail-name,
304
+ .skills-detail-main > .skills-detail-desc,
305
+ .skills-detail-main > .skills-detail-cmd {
306
+ flex-shrink: 0;
307
+ margin-left: 20px;
308
+ margin-right: 20px;
309
+ }
310
+
311
+ .skills-detail-main > .skills-detail-name {
312
+ padding-top: 20px;
313
+ }
314
+
315
+ .skills-detail-main > .skills-detail-md-wrap {
316
+ flex: 1;
317
+ min-height: 0;
318
+ overflow-y: auto;
319
+ padding: 0 20px 20px;
320
+ }
321
+
322
+ .skills-detail-name {
323
+ font-size: 18px;
324
+ font-weight: 700;
325
+ color: var(--text);
326
+ margin-bottom: 4px;
327
+ }
328
+
329
+ .skills-detail-desc {
330
+ font-size: 13px;
331
+ color: var(--text-muted);
332
+ margin-bottom: 16px;
333
+ line-height: 1.5;
334
+ }
335
+
336
+ .skills-detail-cmd {
337
+ display: flex;
338
+ align-items: center;
339
+ gap: 8px;
340
+ background: var(--code-bg);
341
+ border: 1px solid var(--border);
342
+ border-radius: 8px;
343
+ padding: 10px 12px;
344
+ margin-bottom: 16px;
345
+ font-family: "Roboto Mono", monospace;
346
+ font-size: 12px;
347
+ color: var(--text);
348
+ overflow-x: auto;
349
+ }
350
+
351
+ .skills-detail-cmd code {
352
+ flex: 1;
353
+ white-space: nowrap;
354
+ user-select: all;
355
+ -webkit-user-select: all;
356
+ }
357
+
358
+ .skills-detail-cmd .skills-copy-btn {
359
+ background: none;
360
+ border: 1px solid var(--border);
361
+ border-radius: 6px;
362
+ color: var(--text-muted);
363
+ cursor: pointer;
364
+ padding: 4px 6px;
365
+ display: flex;
366
+ align-items: center;
367
+ flex-shrink: 0;
368
+ transition: color 0.15s, border-color 0.15s;
369
+ }
370
+
371
+ .skills-detail-cmd .skills-copy-btn .lucide { width: 13px; height: 13px; }
372
+ .skills-detail-cmd .skills-copy-btn:hover { color: var(--text); border-color: var(--text-dimmer); }
373
+ .skills-detail-cmd .skills-copy-btn.copied { color: var(--success); border-color: var(--success); }
374
+
375
+ .skills-detail-section-title {
376
+ font-size: 11px;
377
+ font-weight: 700;
378
+ color: var(--text-dimmer);
379
+ text-transform: uppercase;
380
+ letter-spacing: 0.5px;
381
+ margin-bottom: 8px;
382
+ padding-bottom: 6px;
383
+ border-bottom: 1px solid var(--border-subtle);
384
+ }
385
+
386
+ .skills-detail-md {
387
+ font-size: 13px;
388
+ color: var(--text-secondary);
389
+ line-height: 1.7;
390
+ }
391
+
392
+ .skills-detail-md h1, .skills-detail-md h2, .skills-detail-md h3 {
393
+ color: var(--text);
394
+ margin: 16px 0 8px;
395
+ }
396
+
397
+ .skills-detail-md h1 { font-size: 17px; }
398
+ .skills-detail-md h2 { font-size: 15px; }
399
+ .skills-detail-md h3 { font-size: 14px; }
400
+
401
+ .skills-detail-md p { margin: 0 0 10px; }
402
+ .skills-detail-md ul, .skills-detail-md ol { margin: 0 0 10px; padding-left: 20px; }
403
+ .skills-detail-md li { margin-bottom: 4px; }
404
+
405
+ .skills-detail-md code {
406
+ font-family: "Roboto Mono", monospace;
407
+ font-size: 12px;
408
+ background: rgba(var(--overlay-rgb), 0.06);
409
+ padding: 2px 5px;
410
+ border-radius: 4px;
411
+ }
412
+
413
+ .skills-detail-md pre {
414
+ background: var(--code-bg);
415
+ border: 1px solid var(--border-subtle);
416
+ border-radius: 8px;
417
+ padding: 12px;
418
+ overflow-x: auto;
419
+ margin: 0 0 12px;
420
+ }
421
+
422
+ .skills-detail-md pre code {
423
+ background: none;
424
+ padding: 0;
425
+ }
426
+
427
+ .skills-detail-md a {
428
+ color: var(--accent);
429
+ text-decoration: none;
430
+ }
431
+ .skills-detail-md a:hover { text-decoration: underline; }
432
+
433
+ .skills-detail-md img {
434
+ max-width: 100%;
435
+ border-radius: 8px;
436
+ margin: 8px 0;
437
+ }
438
+
439
+ /* --- Detail Sidebar (right) --- */
440
+ .skills-detail-sidebar {
441
+ width: 240px;
442
+ flex-shrink: 0;
443
+ overflow: hidden;
444
+ padding: 20px 16px;
445
+ display: flex;
446
+ flex-direction: column;
447
+ gap: 20px;
448
+ }
449
+
450
+ .skills-meta-block {}
451
+
452
+ .skills-meta-label {
453
+ font-size: 10px;
454
+ font-weight: 700;
455
+ color: var(--text-dimmer);
456
+ text-transform: uppercase;
457
+ letter-spacing: 0.5px;
458
+ margin-bottom: 6px;
459
+ }
460
+
461
+ .skills-meta-value {
462
+ font-size: 20px;
463
+ font-weight: 700;
464
+ color: var(--text);
465
+ }
466
+
467
+ .skills-meta-value.small {
468
+ font-size: 13px;
469
+ font-weight: 500;
470
+ }
471
+
472
+ .skills-meta-value a {
473
+ color: var(--accent);
474
+ text-decoration: none;
475
+ font-size: 13px;
476
+ font-weight: 500;
477
+ }
478
+
479
+ .skills-meta-value a:hover { text-decoration: underline; }
480
+
481
+ .skills-meta-repo {
482
+ display: flex;
483
+ align-items: center;
484
+ gap: 6px;
485
+ }
486
+
487
+ .skills-meta-repo .lucide { width: 14px; height: 14px; color: var(--text-muted); }
488
+
489
+ /* Audit badges */
490
+ .skills-audit-list {
491
+ display: flex;
492
+ flex-direction: column;
493
+ gap: 6px;
494
+ }
495
+
496
+ .skills-audit-item {
497
+ display: flex;
498
+ align-items: center;
499
+ justify-content: space-between;
500
+ font-size: 12px;
501
+ color: var(--text-secondary);
502
+ }
503
+
504
+ .skills-audit-badge {
505
+ font-size: 10px;
506
+ font-weight: 700;
507
+ text-transform: uppercase;
508
+ padding: 2px 8px;
509
+ border-radius: 4px;
510
+ }
511
+
512
+ .skills-audit-badge.pass {
513
+ background: var(--success-12);
514
+ color: var(--success);
515
+ }
516
+
517
+ .skills-audit-badge.warn {
518
+ background: rgba(245, 166, 35, 0.12);
519
+ color: #f5a623;
520
+ }
521
+
522
+ .skills-audit-badge.fail {
523
+ background: var(--error-12);
524
+ color: var(--error);
525
+ }
526
+
527
+ /* Platform list */
528
+ .skills-platform-list {
529
+ display: flex;
530
+ flex-direction: column;
531
+ gap: 4px;
532
+ }
533
+
534
+ .skills-platform-item {
535
+ display: flex;
536
+ align-items: center;
537
+ justify-content: space-between;
538
+ font-size: 12px;
539
+ color: var(--text-secondary);
540
+ }
541
+
542
+ .skills-platform-count {
543
+ font-family: "Roboto Mono", monospace;
544
+ font-size: 11px;
545
+ color: var(--text-muted);
546
+ }
547
+
548
+ /* Install actions container */
549
+ .skills-install-actions {
550
+ display: flex;
551
+ flex-direction: column;
552
+ gap: 8px;
553
+ }
554
+
555
+ /* Install button */
556
+ .skills-install-btn {
557
+ width: 100%;
558
+ padding: 10px 16px;
559
+ border-radius: 10px;
560
+ border: none;
561
+ background: var(--accent);
562
+ color: #fff;
563
+ font-family: inherit;
564
+ font-size: 13px;
565
+ font-weight: 600;
566
+ cursor: pointer;
567
+ transition: opacity 0.15s, background 0.15s;
568
+ display: flex;
569
+ align-items: center;
570
+ justify-content: center;
571
+ gap: 6px;
572
+ }
573
+
574
+ .skills-install-btn:hover { opacity: 0.85; }
575
+ .skills-install-btn .lucide { width: 14px; height: 14px; }
576
+
577
+ /* Secondary (Global) button — outline style */
578
+ .skills-install-btn.secondary {
579
+ background: transparent;
580
+ border: 1px solid var(--border);
581
+ color: var(--text-secondary);
582
+ }
583
+
584
+ .skills-install-btn.secondary:hover {
585
+ border-color: var(--text-dimmer);
586
+ background: rgba(var(--overlay-rgb), 0.04);
587
+ opacity: 1;
588
+ }
589
+
590
+ /* Installing state */
591
+ .skills-install-btn.installing {
592
+ opacity: 0.6;
593
+ cursor: not-allowed;
594
+ pointer-events: none;
595
+ }
596
+
597
+ .skills-btn-spinner {
598
+ width: 14px;
599
+ height: 14px;
600
+ border: 2px solid rgba(255, 255, 255, 0.3);
601
+ border-top-color: #fff;
602
+ border-radius: 50%;
603
+ animation: spin 0.6s linear infinite;
604
+ flex-shrink: 0;
605
+ }
606
+
607
+ .skills-install-btn.secondary .skills-btn-spinner {
608
+ border-color: rgba(var(--overlay-rgb), 0.15);
609
+ border-top-color: var(--text-secondary);
610
+ }
611
+
612
+ /* Installed badge (list item) */
613
+ .skills-installed-badge {
614
+ display: inline-flex;
615
+ align-items: center;
616
+ gap: 3px;
617
+ font-size: 10px;
618
+ font-weight: 600;
619
+ color: var(--success);
620
+ background: var(--success-12);
621
+ padding: 1px 7px 1px 5px;
622
+ border-radius: 4px;
623
+ margin-left: 8px;
624
+ vertical-align: middle;
625
+ white-space: nowrap;
626
+ }
627
+
628
+ .skills-installed-badge .lucide { width: 10px; height: 10px; }
629
+
630
+ /* Installed status (detail sidebar) */
631
+ .skills-installed-status {
632
+ width: 100%;
633
+ padding: 10px 16px;
634
+ border-radius: 10px;
635
+ border: 1px solid var(--success);
636
+ background: var(--success-12);
637
+ color: var(--success);
638
+ font-family: inherit;
639
+ font-size: 13px;
640
+ font-weight: 600;
641
+ display: flex;
642
+ align-items: center;
643
+ justify-content: center;
644
+ gap: 6px;
645
+ }
646
+
647
+ .skills-installed-status .lucide { width: 15px; height: 15px; }
648
+
649
+ .skills-installed-status.compact {
650
+ padding: 8px 12px;
651
+ font-size: 12px;
652
+ border-radius: 8px;
653
+ }
654
+
655
+ /* Installed row: status + uninstall button side by side */
656
+ .skills-installed-row {
657
+ display: flex;
658
+ align-items: center;
659
+ gap: 6px;
660
+ }
661
+
662
+ .skills-installed-row .skills-installed-status.compact {
663
+ flex: 1;
664
+ min-width: 0;
665
+ }
666
+
667
+ .skills-uninstall-btn {
668
+ width: 30px;
669
+ height: 30px;
670
+ flex-shrink: 0;
671
+ display: flex;
672
+ align-items: center;
673
+ justify-content: center;
674
+ border: 1px solid var(--border);
675
+ border-radius: 8px;
676
+ background: none;
677
+ color: var(--text-dimmer);
678
+ cursor: pointer;
679
+ transition: color 0.15s, border-color 0.15s, background 0.15s;
680
+ }
681
+
682
+ .skills-uninstall-btn .lucide { width: 12px; height: 12px; }
683
+
684
+ .skills-uninstall-btn:hover {
685
+ color: var(--error);
686
+ border-color: var(--error);
687
+ background: var(--error-8);
688
+ }
689
+
690
+ .skills-uninstall-btn.uninstalling {
691
+ opacity: 0.5;
692
+ pointer-events: none;
693
+ }
694
+
695
+ .skills-btn-spinner.small {
696
+ width: 12px;
697
+ height: 12px;
698
+ border-width: 1.5px;
699
+ }
700
+
701
+ /* --- Installed tab --- */
702
+ .skills-installed-item {
703
+ display: flex;
704
+ align-items: flex-start;
705
+ gap: 12px;
706
+ padding: 14px 20px;
707
+ border-bottom: 1px solid var(--border-subtle);
708
+ transition: background 0.15s;
709
+ }
710
+
711
+ .skills-installed-item:last-child {
712
+ border-bottom: none;
713
+ }
714
+
715
+ .skills-installed-item:hover {
716
+ background: var(--bg-hover);
717
+ }
718
+
719
+ .skills-installed-item-info {
720
+ flex: 1;
721
+ min-width: 0;
722
+ }
723
+
724
+ .skills-installed-item-header {
725
+ display: flex;
726
+ align-items: center;
727
+ gap: 8px;
728
+ margin-bottom: 4px;
729
+ }
730
+
731
+ .skills-installed-item-name {
732
+ font-weight: 600;
733
+ font-size: 14px;
734
+ color: var(--text-primary);
735
+ }
736
+
737
+ .skills-installed-item-desc {
738
+ font-size: 12px;
739
+ color: var(--text-secondary);
740
+ line-height: 1.4;
741
+ display: -webkit-box;
742
+ -webkit-line-clamp: 2;
743
+ -webkit-box-orient: vertical;
744
+ overflow: hidden;
745
+ }
746
+
747
+ .skills-installed-item-actions {
748
+ display: flex;
749
+ gap: 4px;
750
+ flex-shrink: 0;
751
+ align-items: center;
752
+ }
753
+
754
+ .skills-empty-hint {
755
+ font-size: 12px;
756
+ color: var(--text-tertiary);
757
+ margin-top: 8px;
758
+ }
759
+
760
+ /* --- Mobile --- */
761
+ @media (max-width: 768px) {
762
+ .skills-dialog {
763
+ width: 100%;
764
+ max-width: 100%;
765
+ height: 100vh;
766
+ max-height: 100vh;
767
+ border-radius: 0;
768
+ }
769
+
770
+ .skills-detail {
771
+ flex-direction: column;
772
+ }
773
+
774
+ .skills-detail-main {
775
+ border-right: none;
776
+ border-bottom: 1px solid var(--border-subtle);
777
+ overflow-y: auto;
778
+ }
779
+
780
+ .skills-detail-sidebar {
781
+ width: 100%;
782
+ flex-direction: row;
783
+ flex-wrap: wrap;
784
+ gap: 16px;
785
+ padding: 16px;
786
+ }
787
+
788
+ .skills-meta-block { min-width: 100px; }
789
+ }