@syke1/mcp-server 1.3.20 → 1.4.1

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.
@@ -123,17 +123,15 @@ body {
123
123
  text-transform: uppercase;
124
124
  }
125
125
 
126
- /* ── License Badge ── */
126
+ /* ── License Badge (inline, next to SSE indicator) ── */
127
127
  .license-badge {
128
- display: flex;
129
- align-items: center;
130
- gap: 8px;
131
- padding: 5px 16px;
132
- border-radius: 20px;
133
- font-size: 11px;
128
+ font-size: 9px;
129
+ letter-spacing: 1.5px;
130
+ padding: 2px 8px;
131
+ border-radius: 3px;
132
+ border: 1px solid var(--border);
133
+ margin-left: 8px;
134
134
  font-weight: 700;
135
- letter-spacing: 2px;
136
- border: 1px solid;
137
135
  transition: all 0.3s;
138
136
  cursor: default;
139
137
  }
@@ -141,50 +139,22 @@ body {
141
139
  .license-badge.free {
142
140
  color: #8899aa;
143
141
  border-color: rgba(136,153,170,0.4);
144
- background: rgba(136,153,170,0.12);
145
142
  }
146
143
 
147
144
  .license-badge.pro {
148
145
  color: #ffd700;
149
146
  border-color: rgba(255,215,0,0.4);
150
- background: rgba(255,215,0,0.08);
151
147
  text-shadow: 0 0 8px rgba(255,215,0,0.3);
152
148
  }
153
149
 
154
150
  .license-badge.trial {
155
151
  color: var(--risk-medium);
156
152
  border-color: rgba(255,159,10,0.4);
157
- background: rgba(255,159,10,0.08);
158
- }
159
-
160
- .license-badge.trial-urgent {
161
- color: var(--risk-high);
162
- border-color: rgba(255,45,85,0.4);
163
- background: rgba(255,45,85,0.08);
164
- animation: license-urgent 1.5s ease-in-out infinite;
165
153
  }
166
154
 
167
155
  .license-badge.expired {
168
156
  color: var(--risk-high);
169
157
  border-color: rgba(255,45,85,0.4);
170
- background: rgba(255,45,85,0.1);
171
- }
172
-
173
- @keyframes license-urgent {
174
- 0%, 100% { opacity: 1; }
175
- 50% { opacity: 0.6; }
176
- }
177
-
178
- .license-plan {
179
- font-weight: 700;
180
- }
181
-
182
- .license-timer {
183
- font-size: 9px;
184
- font-weight: 400;
185
- letter-spacing: 1px;
186
- opacity: 0.85;
187
- font-variant-numeric: tabular-nums;
188
158
  }
189
159
 
190
160
  .top-controls {
@@ -1237,7 +1207,7 @@ main {
1237
1207
  position: fixed;
1238
1208
  bottom: 0;
1239
1209
  left: 0;
1240
- right: 380px;
1210
+ right: var(--right-offset, 380px);
1241
1211
  background: var(--bg-secondary);
1242
1212
  border-top: 1px solid var(--border);
1243
1213
  transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
@@ -2327,7 +2297,7 @@ main {
2327
2297
  position: fixed;
2328
2298
  bottom: 0;
2329
2299
  left: 0;
2330
- right: 380px;
2300
+ right: var(--right-offset, 380px);
2331
2301
  height: 28px;
2332
2302
  background: rgba(5, 10, 24, 0.85);
2333
2303
  border-top: 1px solid rgba(0, 212, 255, 0.1);
@@ -2342,3 +2312,806 @@ main {
2342
2312
  z-index: 50;
2343
2313
  backdrop-filter: blur(8px);
2344
2314
  }
2315
+
2316
+ /* ═══════════════════════════════════════════ */
2317
+ /* SETTINGS PANEL */
2318
+ /* ═══════════════════════════════════════════ */
2319
+ #tab-settings {
2320
+ overflow: hidden;
2321
+ }
2322
+
2323
+ .set-panel {
2324
+ display: flex;
2325
+ flex-direction: column;
2326
+ height: 100%;
2327
+ overflow: hidden;
2328
+ }
2329
+
2330
+ .set-actions {
2331
+ display: flex;
2332
+ gap: 6px;
2333
+ padding: 10px 14px;
2334
+ border-bottom: 1px solid var(--border);
2335
+ flex-shrink: 0;
2336
+ }
2337
+
2338
+ .set-action-btn {
2339
+ flex: 1;
2340
+ padding: 6px 0;
2341
+ background: transparent;
2342
+ color: var(--text-secondary);
2343
+ border: 1px solid var(--border);
2344
+ border-radius: 2px;
2345
+ cursor: pointer;
2346
+ font-size: 9px;
2347
+ font-family: inherit;
2348
+ font-weight: 600;
2349
+ letter-spacing: 2px;
2350
+ transition: all 0.2s;
2351
+ }
2352
+
2353
+ .set-action-btn:hover {
2354
+ color: var(--accent);
2355
+ border-color: var(--accent);
2356
+ box-shadow: var(--glow-cyan);
2357
+ }
2358
+
2359
+ .set-action-btn.set-danger:hover {
2360
+ color: var(--risk-high);
2361
+ border-color: var(--risk-high);
2362
+ box-shadow: var(--glow-red);
2363
+ }
2364
+
2365
+ .set-scroll {
2366
+ flex: 1;
2367
+ overflow-y: auto;
2368
+ padding: 4px 0;
2369
+ }
2370
+
2371
+ .set-scroll::-webkit-scrollbar { width: 4px; }
2372
+ .set-scroll::-webkit-scrollbar-track { background: transparent; }
2373
+ .set-scroll::-webkit-scrollbar-thumb { background: var(--accent-dim); border-radius: 2px; }
2374
+
2375
+ /* Section header */
2376
+ .set-section-hdr {
2377
+ display: flex;
2378
+ align-items: center;
2379
+ gap: 8px;
2380
+ padding: 8px 14px;
2381
+ cursor: pointer;
2382
+ font-size: 10px;
2383
+ font-weight: 700;
2384
+ letter-spacing: 2px;
2385
+ color: var(--accent);
2386
+ border-bottom: 1px solid rgba(26,45,77,0.3);
2387
+ user-select: none;
2388
+ transition: background 0.2s;
2389
+ }
2390
+
2391
+ .set-section-hdr:hover {
2392
+ background: rgba(0,212,255,0.04);
2393
+ }
2394
+
2395
+ .set-arrow {
2396
+ display: inline-block;
2397
+ font-size: 8px;
2398
+ transition: transform 0.25s ease;
2399
+ color: var(--text-secondary);
2400
+ }
2401
+
2402
+ .set-arrow.open {
2403
+ transform: rotate(90deg);
2404
+ }
2405
+
2406
+ .set-rst-btn {
2407
+ margin-left: auto;
2408
+ padding: 2px 8px;
2409
+ background: transparent;
2410
+ color: var(--text-secondary);
2411
+ border: 1px solid var(--border);
2412
+ border-radius: 2px;
2413
+ cursor: pointer;
2414
+ font-size: 8px;
2415
+ font-family: inherit;
2416
+ font-weight: 600;
2417
+ letter-spacing: 1px;
2418
+ transition: all 0.2s;
2419
+ }
2420
+
2421
+ .set-rst-btn:hover {
2422
+ color: var(--risk-medium);
2423
+ border-color: var(--risk-medium);
2424
+ }
2425
+
2426
+ /* Section body */
2427
+ .set-section-body {
2428
+ padding: 6px 14px;
2429
+ border-bottom: 1px solid rgba(26,45,77,0.2);
2430
+ }
2431
+
2432
+ .set-section-body.collapsed {
2433
+ display: none;
2434
+ }
2435
+
2436
+ .set-sub-title {
2437
+ font-size: 9px;
2438
+ font-weight: 600;
2439
+ letter-spacing: 2px;
2440
+ color: var(--text-secondary);
2441
+ margin: 8px 0 4px;
2442
+ padding-top: 6px;
2443
+ border-top: 1px solid rgba(26,45,77,0.3);
2444
+ }
2445
+
2446
+ .set-sub-title:first-child {
2447
+ margin-top: 0;
2448
+ padding-top: 0;
2449
+ border-top: none;
2450
+ }
2451
+
2452
+ /* Individual control row */
2453
+ .set-row {
2454
+ display: flex;
2455
+ align-items: center;
2456
+ gap: 8px;
2457
+ padding: 3px 0;
2458
+ }
2459
+
2460
+ .set-row label {
2461
+ font-size: 10px;
2462
+ color: var(--text-secondary);
2463
+ letter-spacing: 0.5px;
2464
+ min-width: 100px;
2465
+ flex-shrink: 0;
2466
+ }
2467
+
2468
+ .set-row .set-val {
2469
+ font-size: 9px;
2470
+ color: var(--accent);
2471
+ min-width: 48px;
2472
+ text-align: right;
2473
+ font-variant-numeric: tabular-nums;
2474
+ flex-shrink: 0;
2475
+ }
2476
+
2477
+ /* Range slider styling */
2478
+ .set-row input[type="range"] {
2479
+ -webkit-appearance: none;
2480
+ appearance: none;
2481
+ flex: 1;
2482
+ height: 3px;
2483
+ background: var(--border);
2484
+ border-radius: 2px;
2485
+ outline: none;
2486
+ cursor: pointer;
2487
+ }
2488
+
2489
+ .set-row input[type="range"]::-webkit-slider-thumb {
2490
+ -webkit-appearance: none;
2491
+ appearance: none;
2492
+ width: 12px;
2493
+ height: 12px;
2494
+ border-radius: 50%;
2495
+ background: var(--accent);
2496
+ border: 2px solid var(--bg-primary);
2497
+ box-shadow: 0 0 6px rgba(0,212,255,0.5);
2498
+ cursor: pointer;
2499
+ transition: box-shadow 0.2s, transform 0.15s;
2500
+ }
2501
+
2502
+ .set-row input[type="range"]::-webkit-slider-thumb:hover {
2503
+ box-shadow: 0 0 12px rgba(0,212,255,0.8);
2504
+ transform: scale(1.2);
2505
+ }
2506
+
2507
+ .set-row input[type="range"]:active::-webkit-slider-thumb {
2508
+ box-shadow: 0 0 16px rgba(0,212,255,1);
2509
+ transform: scale(1.3);
2510
+ }
2511
+
2512
+ .set-row input[type="range"]::-moz-range-thumb {
2513
+ width: 12px;
2514
+ height: 12px;
2515
+ border-radius: 50%;
2516
+ background: var(--accent);
2517
+ border: 2px solid var(--bg-primary);
2518
+ box-shadow: 0 0 6px rgba(0,212,255,0.5);
2519
+ cursor: pointer;
2520
+ }
2521
+
2522
+ .set-row input[type="range"]::-moz-range-track {
2523
+ height: 3px;
2524
+ background: var(--border);
2525
+ border-radius: 2px;
2526
+ border: none;
2527
+ }
2528
+
2529
+ /* Color picker styling */
2530
+ .set-row input[type="color"] {
2531
+ -webkit-appearance: none;
2532
+ appearance: none;
2533
+ width: 28px;
2534
+ height: 20px;
2535
+ border: 1px solid var(--border);
2536
+ border-radius: 2px;
2537
+ background: transparent;
2538
+ cursor: pointer;
2539
+ padding: 1px;
2540
+ transition: border-color 0.2s, box-shadow 0.2s;
2541
+ }
2542
+
2543
+ .set-row input[type="color"]:hover {
2544
+ border-color: var(--accent);
2545
+ box-shadow: 0 0 8px rgba(0,212,255,0.4);
2546
+ }
2547
+
2548
+ .set-row input[type="color"]::-webkit-color-swatch-wrapper {
2549
+ padding: 0;
2550
+ }
2551
+
2552
+ .set-row input[type="color"]::-webkit-color-swatch {
2553
+ border: none;
2554
+ border-radius: 1px;
2555
+ }
2556
+
2557
+ /* ═══════════════════════════════════════════ */
2558
+ /* FILE TREE PANEL */
2559
+ /* ═══════════════════════════════════════════ */
2560
+
2561
+ /* Tree Resize Handle (identical pattern to #resize-handle) */
2562
+ #tree-resize-handle {
2563
+ width: 8px;
2564
+ cursor: col-resize;
2565
+ background: var(--bg-secondary);
2566
+ position: relative;
2567
+ flex-shrink: 0;
2568
+ z-index: 20;
2569
+ transition: background 0.2s;
2570
+ border-left: 1px solid var(--border);
2571
+ border-right: 1px solid var(--border);
2572
+ }
2573
+
2574
+ #tree-resize-handle::before {
2575
+ content: '';
2576
+ position: absolute;
2577
+ top: 50%;
2578
+ left: 50%;
2579
+ transform: translate(-50%, -50%);
2580
+ width: 2px;
2581
+ height: 48px;
2582
+ border-radius: 2px;
2583
+ background: var(--text-secondary);
2584
+ opacity: 0.5;
2585
+ transition: all 0.2s;
2586
+ }
2587
+
2588
+ #tree-resize-handle:hover {
2589
+ background: rgba(0, 212, 255, 0.08);
2590
+ border-color: var(--accent-dim);
2591
+ }
2592
+
2593
+ #tree-resize-handle:hover::before {
2594
+ background: var(--accent);
2595
+ height: 64px;
2596
+ opacity: 1;
2597
+ box-shadow: var(--glow-cyan);
2598
+ }
2599
+
2600
+ #tree-resize-handle.dragging {
2601
+ background: rgba(0, 212, 255, 0.12);
2602
+ border-color: var(--accent);
2603
+ }
2604
+
2605
+ #tree-resize-handle.dragging::before {
2606
+ background: var(--accent);
2607
+ height: 100%;
2608
+ opacity: 1;
2609
+ box-shadow: var(--glow-cyan);
2610
+ }
2611
+
2612
+ /* File Tree Panel */
2613
+ #file-tree-panel {
2614
+ flex: 0 0 280px;
2615
+ width: 280px;
2616
+ display: flex;
2617
+ flex-direction: column;
2618
+ background: var(--bg-secondary);
2619
+ border-left: 1px solid var(--border);
2620
+ border-right: 1px solid var(--border);
2621
+ overflow: hidden;
2622
+ position: relative;
2623
+ font-family: 'Consolas', 'JetBrains Mono', monospace;
2624
+ }
2625
+
2626
+ #file-tree-panel.hidden {
2627
+ display: none;
2628
+ }
2629
+
2630
+ #file-tree-panel::before {
2631
+ content: '';
2632
+ position: absolute;
2633
+ top: 0; left: -1px;
2634
+ width: 1px;
2635
+ height: 100%;
2636
+ background: linear-gradient(180deg, var(--accent) 0%, transparent 30%, transparent 70%, var(--accent) 100%);
2637
+ opacity: 0.2;
2638
+ }
2639
+
2640
+ /* Tree Header */
2641
+ #tree-header {
2642
+ padding: 10px 12px 8px;
2643
+ border-bottom: 1px solid var(--border);
2644
+ flex-shrink: 0;
2645
+ }
2646
+
2647
+ .tree-title-row {
2648
+ display: flex;
2649
+ align-items: center;
2650
+ justify-content: space-between;
2651
+ margin-bottom: 8px;
2652
+ }
2653
+
2654
+ .tree-title {
2655
+ font-size: 10px;
2656
+ font-weight: 700;
2657
+ color: var(--accent);
2658
+ letter-spacing: 3px;
2659
+ }
2660
+
2661
+ .tree-count {
2662
+ font-size: 9px;
2663
+ color: var(--text-secondary);
2664
+ background: rgba(0,212,255,0.08);
2665
+ border: 1px solid var(--border);
2666
+ border-radius: 2px;
2667
+ padding: 1px 6px;
2668
+ font-variant-numeric: tabular-nums;
2669
+ }
2670
+
2671
+ /* Tree Search Bar */
2672
+ #tree-search-bar {
2673
+ display: flex;
2674
+ gap: 4px;
2675
+ align-items: center;
2676
+ position: relative;
2677
+ }
2678
+
2679
+ #tree-search-input {
2680
+ flex: 1;
2681
+ padding: 4px 8px;
2682
+ background: rgba(0,0,0,0.3);
2683
+ color: var(--accent);
2684
+ border: 1px solid var(--border);
2685
+ border-radius: 2px;
2686
+ font-size: 10px;
2687
+ font-family: inherit;
2688
+ letter-spacing: 1px;
2689
+ outline: none;
2690
+ transition: border-color 0.2s;
2691
+ }
2692
+
2693
+ #tree-search-input::placeholder {
2694
+ color: var(--text-secondary);
2695
+ letter-spacing: 2px;
2696
+ font-size: 9px;
2697
+ }
2698
+
2699
+ #tree-search-input:focus {
2700
+ border-color: var(--accent);
2701
+ box-shadow: var(--glow-cyan);
2702
+ }
2703
+
2704
+ .tree-tool-btn {
2705
+ padding: 3px 8px;
2706
+ background: transparent;
2707
+ color: var(--text-secondary);
2708
+ border: 1px solid var(--border);
2709
+ border-radius: 2px;
2710
+ cursor: pointer;
2711
+ font-size: 9px;
2712
+ font-family: inherit;
2713
+ font-weight: 600;
2714
+ letter-spacing: 1px;
2715
+ transition: all 0.2s;
2716
+ }
2717
+
2718
+ .tree-tool-btn:hover {
2719
+ color: var(--accent);
2720
+ border-color: var(--accent);
2721
+ }
2722
+
2723
+ /* Sort Dropdown Menu */
2724
+ #tree-sort-menu {
2725
+ position: absolute;
2726
+ top: 100%;
2727
+ right: 32px;
2728
+ margin-top: 4px;
2729
+ background: rgba(10,22,40,0.97);
2730
+ border: 1px solid var(--accent-dim);
2731
+ border-radius: 3px;
2732
+ z-index: 100;
2733
+ box-shadow: var(--glow-cyan), 0 8px 24px rgba(0,0,0,0.5);
2734
+ backdrop-filter: blur(8px);
2735
+ min-width: 120px;
2736
+ }
2737
+
2738
+ #tree-sort-menu.hidden { display: none; }
2739
+
2740
+ .tree-sort-option {
2741
+ padding: 6px 12px;
2742
+ font-size: 9px;
2743
+ letter-spacing: 2px;
2744
+ color: var(--text-primary);
2745
+ cursor: pointer;
2746
+ transition: all 0.15s;
2747
+ }
2748
+
2749
+ .tree-sort-option:hover {
2750
+ background: rgba(0,212,255,0.12);
2751
+ color: var(--accent);
2752
+ }
2753
+
2754
+ .tree-sort-option.active {
2755
+ color: var(--accent);
2756
+ background: rgba(0,212,255,0.06);
2757
+ }
2758
+
2759
+ /* Tree Scroll Container */
2760
+ #tree-scroll-container {
2761
+ flex: 1;
2762
+ overflow-y: auto;
2763
+ overflow-x: hidden;
2764
+ }
2765
+
2766
+ #tree-scroll-container::-webkit-scrollbar { width: 4px; }
2767
+ #tree-scroll-container::-webkit-scrollbar-track { background: transparent; }
2768
+ #tree-scroll-container::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
2769
+ #tree-scroll-container::-webkit-scrollbar-thumb:hover { background: var(--accent-dim); }
2770
+
2771
+ /* Tree Content */
2772
+ #tree-content {
2773
+ padding: 6px 0 6px 0;
2774
+ }
2775
+
2776
+ /* ═══════════════════════════════════════════ */
2777
+ /* METRO RAIL TREE (GitKraken-style) */
2778
+ /* ═══════════════════════════════════════════ */
2779
+
2780
+ /* ── Tree Group: wraps sibling nodes, draws vertical rail line ── */
2781
+ .tree-group {
2782
+ position: relative;
2783
+ margin-left: 16px;
2784
+ }
2785
+
2786
+ #tree-content > .tree-group {
2787
+ margin-left: 4px;
2788
+ }
2789
+
2790
+ /* Vertical rail line spanning entire group */
2791
+ .tree-group::before {
2792
+ content: '';
2793
+ position: absolute;
2794
+ left: 11px;
2795
+ top: 14px;
2796
+ bottom: 14px;
2797
+ width: 2px;
2798
+ background: linear-gradient(180deg,
2799
+ rgba(0,212,255,0.08),
2800
+ rgba(0,212,255,0.22) 15%,
2801
+ rgba(0,212,255,0.22) 85%,
2802
+ rgba(0,212,255,0.08)
2803
+ );
2804
+ border-radius: 1px;
2805
+ z-index: 1;
2806
+ }
2807
+
2808
+ /* Subtle glow on the line */
2809
+ .tree-group::after {
2810
+ content: '';
2811
+ position: absolute;
2812
+ left: 9px;
2813
+ top: 14px;
2814
+ bottom: 14px;
2815
+ width: 6px;
2816
+ background: rgba(0,212,255,0.04);
2817
+ border-radius: 3px;
2818
+ z-index: 0;
2819
+ filter: blur(2px);
2820
+ }
2821
+
2822
+ .tree-group.single-child::before,
2823
+ .tree-group.single-child::after {
2824
+ display: none;
2825
+ }
2826
+
2827
+ /* ── Tree Node (file/folder row) ── */
2828
+ .tree-node {
2829
+ display: flex;
2830
+ align-items: center;
2831
+ position: relative;
2832
+ min-height: 30px;
2833
+ padding-left: 30px;
2834
+ padding-right: 8px;
2835
+ cursor: pointer;
2836
+ transition: all 0.15s;
2837
+ font-size: 11px;
2838
+ color: var(--text-primary);
2839
+ border-right: 2px solid transparent;
2840
+ }
2841
+
2842
+ .tree-node:hover {
2843
+ background: rgba(0,212,255,0.06);
2844
+ }
2845
+
2846
+ .tree-node:hover .tree-name {
2847
+ color: var(--accent);
2848
+ }
2849
+
2850
+ .tree-node.selected {
2851
+ background: rgba(0,212,255,0.1);
2852
+ border-right-color: var(--accent);
2853
+ }
2854
+
2855
+ .tree-node.compact {
2856
+ min-height: 24px;
2857
+ }
2858
+
2859
+ /* ── The Dot: sits ON the vertical rail line ── */
2860
+ .tree-dot {
2861
+ position: absolute;
2862
+ left: 5px;
2863
+ top: 50%;
2864
+ transform: translateY(-50%);
2865
+ width: 12px;
2866
+ height: 12px;
2867
+ border-radius: 50%;
2868
+ border: 2.5px solid var(--bg-secondary);
2869
+ z-index: 3;
2870
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
2871
+ }
2872
+
2873
+ /* File dots: filled solid */
2874
+ .tree-node[data-type="file"] .tree-dot {
2875
+ /* background + box-shadow set inline via style attr */
2876
+ }
2877
+
2878
+ /* Folder dots: hollow ring with glow */
2879
+ .tree-node[data-type="folder"] .tree-dot {
2880
+ background: var(--bg-secondary) !important;
2881
+ border-width: 2.5px;
2882
+ }
2883
+
2884
+ /* Hover: dot grows + stronger glow */
2885
+ .tree-node:hover .tree-dot {
2886
+ transform: translateY(-50%) scale(1.35);
2887
+ }
2888
+
2889
+ /* Selected: dot pulses */
2890
+ .tree-node.selected .tree-dot {
2891
+ transform: translateY(-50%) scale(1.4);
2892
+ border-color: var(--bg-primary);
2893
+ }
2894
+
2895
+ /* ── Folder toggle arrow (after dot, before name) ── */
2896
+ .tree-toggle {
2897
+ display: inline-flex;
2898
+ align-items: center;
2899
+ justify-content: center;
2900
+ width: 14px;
2901
+ height: 14px;
2902
+ font-size: 7px;
2903
+ color: var(--text-secondary);
2904
+ transition: transform 0.2s ease, color 0.15s;
2905
+ flex-shrink: 0;
2906
+ user-select: none;
2907
+ margin-right: 2px;
2908
+ }
2909
+
2910
+ .tree-toggle.open {
2911
+ transform: rotate(90deg);
2912
+ }
2913
+
2914
+ .tree-node:hover .tree-toggle {
2915
+ color: var(--accent);
2916
+ }
2917
+
2918
+ /* ── Tree node name ── */
2919
+ .tree-name {
2920
+ flex: 1;
2921
+ overflow: hidden;
2922
+ text-overflow: ellipsis;
2923
+ white-space: nowrap;
2924
+ transition: color 0.15s;
2925
+ }
2926
+
2927
+ .tree-name.folder-name {
2928
+ font-weight: 600;
2929
+ color: var(--text-secondary);
2930
+ letter-spacing: 0.3px;
2931
+ }
2932
+
2933
+ .tree-node:hover .tree-name.folder-name {
2934
+ color: var(--accent);
2935
+ }
2936
+
2937
+ /* Folder file count badge */
2938
+ .tree-folder-count {
2939
+ font-size: 8px;
2940
+ color: var(--text-secondary);
2941
+ margin-left: 6px;
2942
+ padding: 0 5px;
2943
+ background: rgba(0,212,255,0.06);
2944
+ border: 1px solid rgba(26,45,77,0.4);
2945
+ border-radius: 8px;
2946
+ font-variant-numeric: tabular-nums;
2947
+ flex-shrink: 0;
2948
+ opacity: 0.7;
2949
+ }
2950
+
2951
+ /* ── Badges ── */
2952
+ .tree-badge {
2953
+ font-size: 8px;
2954
+ padding: 0 4px;
2955
+ border-radius: 2px;
2956
+ margin-left: 4px;
2957
+ font-weight: 700;
2958
+ letter-spacing: 0.5px;
2959
+ flex-shrink: 0;
2960
+ }
2961
+
2962
+ .tree-badge.badge-deps {
2963
+ color: var(--text-secondary);
2964
+ background: rgba(90,117,153,0.15);
2965
+ }
2966
+
2967
+ .tree-badge.badge-lines {
2968
+ color: var(--text-secondary);
2969
+ background: rgba(90,117,153,0.15);
2970
+ }
2971
+
2972
+ .tree-badge.badge-risk-HIGH {
2973
+ color: var(--risk-high);
2974
+ background: rgba(255,45,85,0.15);
2975
+ }
2976
+
2977
+ .tree-badge.badge-risk-MEDIUM {
2978
+ color: var(--risk-medium);
2979
+ background: rgba(255,159,10,0.15);
2980
+ }
2981
+
2982
+ .tree-badge.badge-risk-LOW {
2983
+ color: var(--risk-low);
2984
+ background: rgba(48,209,88,0.15);
2985
+ }
2986
+
2987
+ .tree-badge.badge-risk-NONE {
2988
+ color: var(--risk-none);
2989
+ background: rgba(58,79,111,0.1);
2990
+ }
2991
+
2992
+ /* Modification status badges */
2993
+ .tree-mod-badge {
2994
+ font-size: 8px;
2995
+ font-weight: 700;
2996
+ padding: 0 5px;
2997
+ border-radius: 2px;
2998
+ margin-left: 4px;
2999
+ letter-spacing: 0.5px;
3000
+ flex-shrink: 0;
3001
+ }
3002
+
3003
+ .tree-mod-badge.mod-M {
3004
+ color: var(--risk-medium);
3005
+ background: rgba(255,159,10,0.2);
3006
+ }
3007
+
3008
+ .tree-mod-badge.mod-A {
3009
+ color: var(--risk-low);
3010
+ background: rgba(48,209,88,0.2);
3011
+ }
3012
+
3013
+ .tree-mod-badge.mod-D {
3014
+ color: var(--risk-high);
3015
+ background: rgba(255,45,85,0.2);
3016
+ }
3017
+
3018
+ /* ── Modified file: white pulse animation ── */
3019
+ @keyframes tree-file-pulse {
3020
+ 0%, 100% {
3021
+ text-shadow: 0 0 6px rgba(255,255,255,0.3);
3022
+ }
3023
+ 50% {
3024
+ text-shadow: 0 0 14px rgba(255,255,255,0.7);
3025
+ }
3026
+ }
3027
+
3028
+ @keyframes tree-dot-pulse {
3029
+ 0%, 100% {
3030
+ transform: translateY(-50%) scale(1);
3031
+ box-shadow: 0 0 8px rgba(255,255,255,0.4);
3032
+ }
3033
+ 50% {
3034
+ transform: translateY(-50%) scale(1.5);
3035
+ box-shadow: 0 0 16px rgba(255,255,255,0.8);
3036
+ }
3037
+ }
3038
+
3039
+ .tree-node.modified {
3040
+ color: #ffffff;
3041
+ animation: tree-file-pulse 1.5s ease-in-out infinite;
3042
+ }
3043
+
3044
+ .tree-node.modified .tree-name {
3045
+ color: #ffffff;
3046
+ font-weight: 700;
3047
+ }
3048
+
3049
+ .tree-node.modified .tree-dot {
3050
+ background: #ffffff !important;
3051
+ border-color: rgba(255,255,255,0.6) !important;
3052
+ animation: tree-dot-pulse 1.5s ease-in-out infinite;
3053
+ }
3054
+
3055
+ /* Folder glow when child is modified */
3056
+ .tree-node.folder-glow .tree-dot {
3057
+ box-shadow: 0 0 10px rgba(255,255,255,0.3) !important;
3058
+ }
3059
+
3060
+ .tree-node.folder-glow .tree-name {
3061
+ color: rgba(255,255,255,0.6);
3062
+ }
3063
+
3064
+ /* ── Rail line glow when group has modifications ── */
3065
+ .tree-group.has-modified::before {
3066
+ background: linear-gradient(180deg,
3067
+ rgba(0,212,255,0.08),
3068
+ rgba(255,255,255,0.3) 15%,
3069
+ rgba(255,255,255,0.3) 85%,
3070
+ rgba(0,212,255,0.08)
3071
+ );
3072
+ }
3073
+
3074
+ /* ── Checkbox styling for SET panel ── */
3075
+ .set-row-checkbox {
3076
+ justify-content: space-between;
3077
+ }
3078
+
3079
+ .set-row-checkbox input[type="checkbox"] {
3080
+ -webkit-appearance: none;
3081
+ appearance: none;
3082
+ width: 32px;
3083
+ height: 16px;
3084
+ border-radius: 8px;
3085
+ background: var(--border);
3086
+ position: relative;
3087
+ cursor: pointer;
3088
+ transition: all 0.2s;
3089
+ flex-shrink: 0;
3090
+ }
3091
+
3092
+ .set-row-checkbox input[type="checkbox"]::before {
3093
+ content: '';
3094
+ position: absolute;
3095
+ top: 2px;
3096
+ left: 2px;
3097
+ width: 12px;
3098
+ height: 12px;
3099
+ border-radius: 50%;
3100
+ background: var(--text-secondary);
3101
+ transition: all 0.2s;
3102
+ }
3103
+
3104
+ .set-row-checkbox input[type="checkbox"]:checked {
3105
+ background: rgba(0,212,255,0.3);
3106
+ border-color: var(--accent);
3107
+ }
3108
+
3109
+ .set-row-checkbox input[type="checkbox"]:checked::before {
3110
+ left: 18px;
3111
+ background: var(--accent);
3112
+ box-shadow: 0 0 6px rgba(0,212,255,0.5);
3113
+ }
3114
+
3115
+ .set-row-checkbox .set-val {
3116
+ display: none;
3117
+ }