quiver-skill-manager 0.1.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.
package/ui/styles.css ADDED
@@ -0,0 +1,870 @@
1
+ *, *::before, *::after {
2
+ box-sizing: border-box;
3
+ margin: 0;
4
+ padding: 0;
5
+ }
6
+
7
+ :root {
8
+ --bg: #fafafa;
9
+ --surface: #ffffff;
10
+ --border: #e2e2e2;
11
+ --text: #1a1a1a;
12
+ --text-secondary: #666;
13
+ --accent: #6366f1;
14
+ --accent-hover: #4f46e5;
15
+ --source-local: #818cf8;
16
+ --source-plugin: #2dd4bf;
17
+ --danger: #ef4444;
18
+ --danger-hover: #dc2626;
19
+ --source-registry: #f59e0b;
20
+ --tag-bg: #f0f0f0;
21
+ --tag-text: #555;
22
+ --radius: 14px;
23
+ --shadow: 0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04);
24
+ --shadow-lg: 0 4px 12px rgba(0,0,0,0.08);
25
+ --shadow-xl: 0 20px 60px rgba(0,0,0,0.12);
26
+ }
27
+
28
+ @media (prefers-color-scheme: dark) {
29
+ :root {
30
+ --bg: #111111;
31
+ --surface: #1a1a1a;
32
+ --border: #2a2a2a;
33
+ --text: #e5e5e5;
34
+ --text-secondary: #999;
35
+ --tag-bg: #2a2a2a;
36
+ --tag-text: #aaa;
37
+ --shadow: 0 1px 3px rgba(0,0,0,0.2);
38
+ --shadow-lg: 0 4px 12px rgba(0,0,0,0.3);
39
+ --shadow-xl: 0 20px 60px rgba(0,0,0,0.4);
40
+ }
41
+ }
42
+
43
+ body {
44
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
45
+ background: var(--bg);
46
+ color: var(--text);
47
+ line-height: 1.5;
48
+ min-height: 100vh;
49
+ }
50
+
51
+ /* Header */
52
+ .header {
53
+ display: flex;
54
+ align-items: center;
55
+ justify-content: space-between;
56
+ padding: 20px 32px;
57
+ border-bottom: 1px solid var(--border);
58
+ background: var(--surface);
59
+ gap: 16px;
60
+ flex-wrap: wrap;
61
+ position: sticky;
62
+ top: 0;
63
+ z-index: 100;
64
+ transition: box-shadow 0.2s;
65
+ }
66
+
67
+ .header.scrolled {
68
+ box-shadow: var(--shadow-lg);
69
+ }
70
+
71
+ .header h1 {
72
+ font-size: 20px;
73
+ font-weight: 700;
74
+ letter-spacing: -0.5px;
75
+ white-space: nowrap;
76
+ }
77
+
78
+ .header-actions {
79
+ display: flex;
80
+ gap: 10px;
81
+ align-items: center;
82
+ }
83
+
84
+ /* Tab bar */
85
+ .tab-bar {
86
+ display: flex;
87
+ gap: 0;
88
+ padding: 0 32px;
89
+ background: var(--surface);
90
+ border-bottom: 1px solid var(--border);
91
+ }
92
+
93
+ .tab {
94
+ position: relative;
95
+ padding: 10px 20px;
96
+ border: none;
97
+ background: none;
98
+ color: var(--text-secondary);
99
+ font-size: 14px;
100
+ font-weight: 500;
101
+ cursor: pointer;
102
+ border-bottom: 2px solid transparent;
103
+ transition: all 0.15s;
104
+ display: flex;
105
+ align-items: center;
106
+ gap: 6px;
107
+ }
108
+
109
+ .tab:hover {
110
+ color: var(--text);
111
+ }
112
+
113
+ .tab.active {
114
+ color: var(--text);
115
+ border-bottom-color: var(--accent);
116
+ }
117
+
118
+ /* Styled tooltips */
119
+ .tab .tooltip {
120
+ position: absolute;
121
+ bottom: calc(100% + 8px);
122
+ left: 50%;
123
+ transform: translateX(-50%);
124
+ background: var(--text);
125
+ color: var(--bg);
126
+ font-size: 12px;
127
+ font-weight: 400;
128
+ padding: 6px 12px;
129
+ border-radius: 6px;
130
+ white-space: nowrap;
131
+ opacity: 0;
132
+ pointer-events: none;
133
+ transition: opacity 0.15s;
134
+ box-shadow: var(--shadow-lg);
135
+ }
136
+
137
+ .tab .tooltip::after {
138
+ content: '';
139
+ position: absolute;
140
+ top: 100%;
141
+ left: 50%;
142
+ transform: translateX(-50%);
143
+ border: 5px solid transparent;
144
+ border-top-color: var(--text);
145
+ }
146
+
147
+ .tab:hover .tooltip {
148
+ opacity: 1;
149
+ }
150
+
151
+ .tab-count {
152
+ font-size: 11px;
153
+ background: var(--tag-bg);
154
+ color: var(--tag-text);
155
+ padding: 1px 6px;
156
+ border-radius: 8px;
157
+ min-width: 20px;
158
+ text-align: center;
159
+ }
160
+
161
+ .tab.active .tab-count {
162
+ background: var(--accent);
163
+ color: white;
164
+ }
165
+
166
+ /* Startup toggle */
167
+ .startup-toggle {
168
+ display: flex;
169
+ align-items: center;
170
+ gap: 8px;
171
+ cursor: pointer;
172
+ font-size: 12px;
173
+ color: var(--text-secondary);
174
+ user-select: none;
175
+ }
176
+
177
+ .startup-toggle input {
178
+ display: none;
179
+ }
180
+
181
+ .toggle-track {
182
+ width: 36px;
183
+ height: 20px;
184
+ background: var(--border);
185
+ border-radius: 10px;
186
+ position: relative;
187
+ transition: background 0.2s;
188
+ flex-shrink: 0;
189
+ }
190
+
191
+ .toggle-thumb {
192
+ width: 16px;
193
+ height: 16px;
194
+ background: white;
195
+ border-radius: 50%;
196
+ position: absolute;
197
+ top: 2px;
198
+ left: 2px;
199
+ transition: transform 0.2s;
200
+ }
201
+
202
+ .startup-toggle input:checked + .toggle-track {
203
+ background: var(--accent);
204
+ }
205
+
206
+ .startup-toggle input:checked + .toggle-track .toggle-thumb {
207
+ transform: translateX(16px);
208
+ }
209
+
210
+ .toggle-label {
211
+ white-space: nowrap;
212
+ }
213
+
214
+ /* Search */
215
+ .search-input {
216
+ padding: 8px 14px;
217
+ border: 1px solid var(--border);
218
+ border-radius: var(--radius);
219
+ background: var(--bg);
220
+ color: var(--text);
221
+ font-size: 14px;
222
+ width: 200px;
223
+ outline: none;
224
+ transition: border-color 0.15s;
225
+ }
226
+
227
+ .search-input:focus {
228
+ border-color: var(--accent);
229
+ }
230
+
231
+ /* Buttons */
232
+ .btn {
233
+ display: inline-flex;
234
+ align-items: center;
235
+ gap: 6px;
236
+ padding: 8px 16px;
237
+ border: 1px solid var(--border);
238
+ border-radius: var(--radius);
239
+ background: var(--surface);
240
+ color: var(--text);
241
+ font-size: 13px;
242
+ font-weight: 500;
243
+ cursor: pointer;
244
+ transition: all 0.15s;
245
+ }
246
+
247
+ .btn:hover {
248
+ background: var(--bg);
249
+ border-color: var(--text-secondary);
250
+ }
251
+
252
+ .btn-primary {
253
+ background: var(--accent);
254
+ color: white;
255
+ border-color: var(--accent);
256
+ }
257
+
258
+ .btn-primary:hover {
259
+ background: var(--accent-hover);
260
+ border-color: var(--accent-hover);
261
+ }
262
+
263
+ .btn-danger {
264
+ color: var(--danger);
265
+ border-color: var(--danger);
266
+ }
267
+
268
+ .btn-danger:hover {
269
+ background: var(--danger);
270
+ color: white;
271
+ }
272
+
273
+ .btn-sm {
274
+ padding: 4px 10px;
275
+ font-size: 12px;
276
+ }
277
+
278
+ /* Main content */
279
+ .main {
280
+ max-width: 1100px;
281
+ margin: 0 auto;
282
+ padding: 24px 32px;
283
+ }
284
+
285
+ /* Skill grid */
286
+ .skill-grid {
287
+ display: grid;
288
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
289
+ gap: 16px;
290
+ }
291
+
292
+ /* Skill card */
293
+ .skill-card {
294
+ background: var(--surface);
295
+ border: 1px solid var(--border);
296
+ border-radius: var(--radius);
297
+ padding: 20px;
298
+ cursor: pointer;
299
+ transition: all 0.15s;
300
+ box-shadow: var(--shadow-lg);
301
+ }
302
+
303
+ .skill-card.source-local {
304
+ border-left: 3px solid var(--source-local);
305
+ }
306
+
307
+ .skill-card.source-plugin {
308
+ border-left: 3px solid var(--source-plugin);
309
+ }
310
+
311
+ .skill-card:hover {
312
+ box-shadow: var(--shadow-xl);
313
+ border-color: var(--accent);
314
+ }
315
+
316
+ .skill-card-header {
317
+ display: flex;
318
+ align-items: flex-start;
319
+ justify-content: space-between;
320
+ margin-bottom: 8px;
321
+ }
322
+
323
+ .skill-card h3 {
324
+ font-size: 15px;
325
+ font-weight: 600;
326
+ }
327
+
328
+ .skill-card .symlink-badge {
329
+ font-size: 11px;
330
+ color: var(--text-secondary);
331
+ background: var(--tag-bg);
332
+ padding: 2px 7px;
333
+ border-radius: 4px;
334
+ }
335
+
336
+ .source-badge {
337
+ font-size: 10px;
338
+ font-weight: 600;
339
+ text-transform: uppercase;
340
+ letter-spacing: 0.3px;
341
+ padding: 2px 7px;
342
+ border-radius: 4px;
343
+ }
344
+
345
+ .source-badge.local {
346
+ color: var(--source-local);
347
+ background: rgba(129, 140, 248, 0.12);
348
+ }
349
+
350
+ .source-badge.plugin {
351
+ color: var(--source-plugin);
352
+ background: rgba(45, 212, 191, 0.12);
353
+ }
354
+
355
+ .skill-card p {
356
+ font-size: 13px;
357
+ color: var(--text-secondary);
358
+ margin-bottom: 12px;
359
+ display: -webkit-box;
360
+ -webkit-line-clamp: 2;
361
+ -webkit-box-orient: vertical;
362
+ overflow: hidden;
363
+ }
364
+
365
+ .skill-card-meta {
366
+ display: flex;
367
+ align-items: center;
368
+ gap: 8px;
369
+ flex-wrap: wrap;
370
+ }
371
+
372
+ .tag {
373
+ font-size: 11px;
374
+ padding: 2px 8px;
375
+ background: var(--tag-bg);
376
+ color: var(--tag-text);
377
+ border-radius: 4px;
378
+ }
379
+
380
+ .file-count {
381
+ font-size: 11px;
382
+ color: var(--text-secondary);
383
+ margin-left: auto;
384
+ }
385
+
386
+ /* Skill detail panel */
387
+ .detail-overlay {
388
+ position: fixed;
389
+ inset: 0;
390
+ background: rgba(0,0,0,0.4);
391
+ z-index: 100;
392
+ display: flex;
393
+ justify-content: flex-end;
394
+ }
395
+
396
+ .detail-panel {
397
+ width: min(560px, 90vw);
398
+ background: var(--surface);
399
+ height: 100%;
400
+ overflow-y: auto;
401
+ box-shadow: -4px 0 24px rgba(0,0,0,0.12);
402
+ padding: 28px;
403
+ animation: slideIn 0.2s ease;
404
+ line-height: 1.6;
405
+ }
406
+
407
+ @keyframes slideIn {
408
+ from { transform: translateX(100%); }
409
+ to { transform: translateX(0); }
410
+ }
411
+
412
+ .detail-panel h2 {
413
+ font-size: 20px;
414
+ margin-bottom: 4px;
415
+ }
416
+
417
+ .detail-panel .description {
418
+ color: var(--text-secondary);
419
+ font-size: 14px;
420
+ margin-bottom: 20px;
421
+ }
422
+
423
+ .detail-section {
424
+ margin-bottom: 20px;
425
+ }
426
+
427
+ .detail-section h4 {
428
+ font-size: 12px;
429
+ text-transform: uppercase;
430
+ letter-spacing: 0.5px;
431
+ color: var(--text-secondary);
432
+ margin-bottom: 8px;
433
+ }
434
+
435
+ .detail-content {
436
+ background: var(--bg);
437
+ border: 1px solid var(--border);
438
+ border-radius: var(--radius);
439
+ padding: 16px;
440
+ font-size: 13px;
441
+ font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
442
+ white-space: pre-wrap;
443
+ word-break: break-word;
444
+ max-height: 400px;
445
+ overflow-y: auto;
446
+ line-height: 1.6;
447
+ }
448
+
449
+ .detail-meta {
450
+ display: grid;
451
+ grid-template-columns: auto 1fr;
452
+ gap: 6px 16px;
453
+ font-size: 13px;
454
+ }
455
+
456
+ .detail-meta dt {
457
+ color: var(--text-secondary);
458
+ }
459
+
460
+ .detail-path {
461
+ display: flex;
462
+ align-items: center;
463
+ gap: 8px;
464
+ background: var(--bg);
465
+ border: 1px solid var(--border);
466
+ border-radius: var(--radius);
467
+ padding: 8px 12px;
468
+ font-size: 12px;
469
+ font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
470
+ color: var(--text-secondary);
471
+ word-break: break-all;
472
+ }
473
+
474
+ .detail-path-text {
475
+ flex: 1;
476
+ }
477
+
478
+ .detail-path-actions {
479
+ display: flex;
480
+ gap: 4px;
481
+ flex-shrink: 0;
482
+ }
483
+
484
+ .detail-actions {
485
+ display: flex;
486
+ gap: 10px;
487
+ margin-top: 24px;
488
+ padding-top: 20px;
489
+ border-top: 1px solid var(--border);
490
+ }
491
+
492
+ /* Import drop zone */
493
+ .drop-zone {
494
+ border: 2px dashed var(--border);
495
+ border-radius: var(--radius);
496
+ padding: 40px;
497
+ text-align: center;
498
+ color: var(--text-secondary);
499
+ font-size: 14px;
500
+ transition: all 0.15s;
501
+ cursor: pointer;
502
+ margin-bottom: 24px;
503
+ }
504
+
505
+ .drop-zone.active {
506
+ border-color: var(--accent);
507
+ background: rgba(99, 102, 241, 0.05);
508
+ color: var(--accent);
509
+ }
510
+
511
+ .drop-zone input {
512
+ display: none;
513
+ }
514
+
515
+ /* Toast */
516
+ .toast {
517
+ position: fixed;
518
+ bottom: 24px;
519
+ right: 24px;
520
+ background: var(--text);
521
+ color: var(--bg);
522
+ padding: 12px 20px;
523
+ border-radius: var(--radius);
524
+ font-size: 13px;
525
+ box-shadow: var(--shadow-lg);
526
+ animation: fadeIn 0.2s ease;
527
+ z-index: 200;
528
+ }
529
+
530
+ @keyframes fadeIn {
531
+ from { opacity: 0; transform: translateY(8px); }
532
+ to { opacity: 1; transform: translateY(0); }
533
+ }
534
+
535
+ /* Empty state */
536
+ .empty-state {
537
+ text-align: center;
538
+ padding: 80px 20px;
539
+ color: var(--text-secondary);
540
+ }
541
+
542
+ .empty-state h3 {
543
+ font-size: 18px;
544
+ color: var(--text);
545
+ margin-bottom: 8px;
546
+ }
547
+
548
+ /* Browse / Registry */
549
+ .source-badge.registry {
550
+ color: var(--source-registry);
551
+ background: rgba(245, 158, 11, 0.12);
552
+ }
553
+
554
+ .browse-card {
555
+ background: var(--surface);
556
+ border: 1px solid var(--border);
557
+ border-left: 3px solid var(--source-registry);
558
+ border-radius: var(--radius);
559
+ padding: 20px;
560
+ cursor: pointer;
561
+ transition: all 0.15s;
562
+ box-shadow: var(--shadow);
563
+ }
564
+
565
+ .browse-card:hover {
566
+ box-shadow: var(--shadow-lg);
567
+ border-color: var(--source-registry);
568
+ }
569
+
570
+ .browse-card.installed {
571
+ border-left-color: var(--source-plugin);
572
+ }
573
+
574
+ .browse-card-header {
575
+ display: flex;
576
+ align-items: flex-start;
577
+ justify-content: space-between;
578
+ margin-bottom: 8px;
579
+ gap: 8px;
580
+ }
581
+
582
+ .browse-card h3 {
583
+ font-size: 15px;
584
+ font-weight: 600;
585
+ }
586
+
587
+ .browse-card p {
588
+ font-size: 13px;
589
+ color: var(--text-secondary);
590
+ margin-bottom: 12px;
591
+ display: -webkit-box;
592
+ -webkit-line-clamp: 2;
593
+ -webkit-box-orient: vertical;
594
+ overflow: hidden;
595
+ }
596
+
597
+ .browse-card-meta {
598
+ display: flex;
599
+ align-items: center;
600
+ gap: 8px;
601
+ flex-wrap: wrap;
602
+ }
603
+
604
+ .status-badge {
605
+ font-size: 10px;
606
+ font-weight: 600;
607
+ text-transform: uppercase;
608
+ letter-spacing: 0.3px;
609
+ padding: 2px 7px;
610
+ border-radius: 4px;
611
+ }
612
+
613
+ .status-badge.installed {
614
+ color: var(--source-plugin);
615
+ background: rgba(45, 212, 191, 0.12);
616
+ }
617
+
618
+ .status-badge.available {
619
+ color: var(--text-secondary);
620
+ background: var(--tag-bg);
621
+ }
622
+
623
+ .category-bar {
624
+ display: flex;
625
+ gap: 6px;
626
+ padding: 10px 32px;
627
+ background: var(--surface);
628
+ border-bottom: 1px solid var(--border);
629
+ overflow-x: auto;
630
+ -webkit-overflow-scrolling: touch;
631
+ }
632
+
633
+ .category-pill {
634
+ padding: 4px 12px;
635
+ border: 1px solid var(--border);
636
+ border-radius: 16px;
637
+ background: none;
638
+ color: var(--text-secondary);
639
+ font-size: 12px;
640
+ cursor: pointer;
641
+ white-space: nowrap;
642
+ transition: all 0.15s;
643
+ }
644
+
645
+ .category-pill:hover {
646
+ border-color: var(--text-secondary);
647
+ color: var(--text);
648
+ }
649
+
650
+ .category-pill.active {
651
+ background: var(--accent);
652
+ color: white;
653
+ border-color: var(--accent);
654
+ }
655
+
656
+ .install-command {
657
+ display: flex;
658
+ align-items: center;
659
+ gap: 8px;
660
+ background: var(--bg);
661
+ border: 1px solid var(--border);
662
+ border-radius: var(--radius);
663
+ padding: 10px 14px;
664
+ font-size: 13px;
665
+ font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
666
+ color: var(--text);
667
+ }
668
+
669
+ .install-command span {
670
+ flex: 1;
671
+ word-break: break-all;
672
+ }
673
+
674
+ .sources-btn {
675
+ border-color: var(--source-registry);
676
+ color: var(--source-registry);
677
+ }
678
+
679
+ .sources-btn:hover {
680
+ background: rgba(245, 158, 11, 0.1);
681
+ }
682
+
683
+ .category-divider {
684
+ width: 1px;
685
+ height: 20px;
686
+ background: var(--border);
687
+ flex-shrink: 0;
688
+ }
689
+
690
+ .sources-list {
691
+ display: flex;
692
+ flex-direction: column;
693
+ gap: 12px;
694
+ margin: 16px 0;
695
+ }
696
+
697
+ .source-item {
698
+ display: flex;
699
+ align-items: center;
700
+ gap: 12px;
701
+ padding: 14px;
702
+ background: var(--bg);
703
+ border: 1px solid var(--border);
704
+ border-radius: var(--radius);
705
+ }
706
+
707
+ .source-info {
708
+ flex: 1;
709
+ display: flex;
710
+ flex-direction: column;
711
+ gap: 2px;
712
+ }
713
+
714
+ .source-info strong {
715
+ font-size: 14px;
716
+ }
717
+
718
+ .source-repo {
719
+ font-size: 11px;
720
+ font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
721
+ color: var(--accent);
722
+ text-decoration: none;
723
+ }
724
+
725
+ .source-repo:hover {
726
+ text-decoration: underline;
727
+ }
728
+
729
+ /* Edit textarea */
730
+ .edit-textarea {
731
+ width: 100%;
732
+ min-height: 400px;
733
+ background: var(--bg);
734
+ color: var(--text);
735
+ border: 1px solid var(--border);
736
+ border-radius: var(--radius);
737
+ padding: 16px;
738
+ font-size: 13px;
739
+ font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
740
+ line-height: 1.6;
741
+ resize: vertical;
742
+ outline: none;
743
+ tab-size: 2;
744
+ }
745
+
746
+ .edit-textarea:focus {
747
+ border-color: var(--accent);
748
+ }
749
+
750
+ /* Sync */
751
+ .sync-btn {
752
+ display: inline-flex;
753
+ align-items: center;
754
+ gap: 6px;
755
+ }
756
+
757
+ .sync-dot {
758
+ width: 8px;
759
+ height: 8px;
760
+ border-radius: 50%;
761
+ display: inline-block;
762
+ flex-shrink: 0;
763
+ }
764
+
765
+ .sync-dot.off {
766
+ background: var(--text-secondary);
767
+ opacity: 0.4;
768
+ }
769
+
770
+ .sync-dot.ok {
771
+ background: #22c55e;
772
+ }
773
+
774
+ .sync-dot.pending {
775
+ background: #f59e0b;
776
+ }
777
+
778
+ .sync-remote-row {
779
+ display: flex;
780
+ gap: 8px;
781
+ align-items: center;
782
+ }
783
+
784
+ .sync-remote-input {
785
+ flex: 1;
786
+ width: auto;
787
+ }
788
+
789
+ .sync-actions-row {
790
+ display: flex;
791
+ gap: 10px;
792
+ align-items: center;
793
+ }
794
+
795
+ .sync-badge {
796
+ font-size: 10px;
797
+ background: rgba(255,255,255,0.25);
798
+ padding: 1px 6px;
799
+ border-radius: 8px;
800
+ min-width: 16px;
801
+ text-align: center;
802
+ }
803
+
804
+ .sync-hint {
805
+ font-size: 12px;
806
+ color: var(--text-secondary);
807
+ margin-top: 8px;
808
+ }
809
+
810
+ .sync-diff-list {
811
+ background: var(--bg);
812
+ border: 1px solid var(--border);
813
+ border-radius: var(--radius);
814
+ padding: 12px 16px;
815
+ font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
816
+ font-size: 13px;
817
+ }
818
+
819
+ .sync-diff-item {
820
+ padding: 2px 0;
821
+ }
822
+
823
+ .sync-diff-item.added {
824
+ color: #22c55e;
825
+ }
826
+
827
+ .sync-diff-item.modified {
828
+ color: #f59e0b;
829
+ }
830
+
831
+ .sync-diff-item.removed {
832
+ color: var(--danger);
833
+ }
834
+
835
+ /* Ghost button */
836
+ .btn-ghost {
837
+ background: transparent;
838
+ border-color: transparent;
839
+ color: var(--text-secondary);
840
+ }
841
+
842
+ .btn-ghost:hover {
843
+ background: var(--tag-bg);
844
+ border-color: transparent;
845
+ color: var(--text);
846
+ }
847
+
848
+ /* Disabled buttons */
849
+ button:disabled, .btn:disabled {
850
+ opacity: 0.5;
851
+ cursor: not-allowed;
852
+ pointer-events: none;
853
+ }
854
+
855
+ /* Responsive - tablet */
856
+ @media (max-width: 768px) {
857
+ .header { padding: 16px 20px; }
858
+ .main { padding: 20px; }
859
+ .skill-grid { grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); }
860
+ .detail-panel { width: 100%; max-width: 100%; }
861
+ .category-bar { gap: 6px; }
862
+ }
863
+
864
+ /* Responsive - mobile */
865
+ @media (max-width: 600px) {
866
+ .header { padding: 16px; }
867
+ .main { padding: 16px; }
868
+ .search-input { width: 160px; }
869
+ .skill-grid { grid-template-columns: 1fr; }
870
+ }