@co0ontty/wand 1.21.11 → 1.21.13

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.
@@ -2522,6 +2522,14 @@
2522
2522
  .topbar-more-item.topbar-more-item-danger { color: var(--danger); }
2523
2523
  .topbar-more-item.topbar-more-item-danger:hover { background: var(--danger-muted); color: var(--danger-hover); }
2524
2524
  .topbar-more-item.hidden { display: none; }
2525
+ .topbar-more-item[disabled] { opacity: 0.5; cursor: not-allowed; }
2526
+ .topbar-more-item[disabled]:hover { background: transparent; color: var(--text-primary); }
2527
+ .topbar-more-divider {
2528
+ height: 1px;
2529
+ margin: 4px 6px;
2530
+ background: var(--border-default);
2531
+ opacity: 0.6;
2532
+ }
2525
2533
 
2526
2534
  /* 桌面端显示所有按钮 */
2527
2535
  .terminal-scale-toggle { display: flex; }
@@ -9185,6 +9193,258 @@
9185
9193
 
9186
9194
  /* .btn-success defined globally in the button system above */
9187
9195
 
9196
+ /* ── Update Card (richer than the generic notification bubble) ── */
9197
+ .notification-bubble.update-card {
9198
+ width: min(360px, calc(100vw - 24px));
9199
+ max-width: min(360px, calc(100vw - 24px));
9200
+ min-width: 0;
9201
+ padding: 14px 14px 12px;
9202
+ border-radius: var(--radius-md);
9203
+ background:
9204
+ radial-gradient(120% 120% at 0% 0%, var(--accent-muted) 0%, transparent 55%),
9205
+ linear-gradient(180deg, var(--bg-elevated) 0%, var(--bg-primary) 100%);
9206
+ border: 1px solid var(--border-strong);
9207
+ box-shadow: var(--shadow-xl), 0 0 0 1px rgba(255,255,255,0.4) inset;
9208
+ overflow: hidden;
9209
+ isolation: isolate;
9210
+ }
9211
+ .update-card-shine {
9212
+ position: absolute;
9213
+ inset: 0;
9214
+ pointer-events: none;
9215
+ background: linear-gradient(115deg,
9216
+ transparent 0%,
9217
+ rgba(255, 255, 255, 0.18) 45%,
9218
+ rgba(255, 255, 255, 0.32) 50%,
9219
+ rgba(255, 255, 255, 0.18) 55%,
9220
+ transparent 100%);
9221
+ background-size: 220% 100%;
9222
+ background-position: 120% 0;
9223
+ mix-blend-mode: overlay;
9224
+ opacity: 0.65;
9225
+ animation: update-card-shine 6s ease-in-out infinite;
9226
+ z-index: 0;
9227
+ }
9228
+ @keyframes update-card-shine {
9229
+ 0% { background-position: 120% 0; }
9230
+ 55% { background-position: -20% 0; }
9231
+ 100% { background-position: -20% 0; }
9232
+ }
9233
+ .update-card.is-success {
9234
+ background:
9235
+ radial-gradient(120% 120% at 0% 0%, var(--success-muted) 0%, transparent 55%),
9236
+ linear-gradient(180deg, var(--bg-elevated) 0%, var(--bg-primary) 100%);
9237
+ border-color: var(--success);
9238
+ box-shadow: var(--shadow-xl), 0 0 0 1px rgba(255,255,255,0.4) inset, var(--shadow-glow-success);
9239
+ }
9240
+ .update-card-header {
9241
+ position: relative;
9242
+ z-index: 1;
9243
+ display: flex;
9244
+ align-items: flex-start;
9245
+ gap: 10px;
9246
+ }
9247
+ .update-card-icon {
9248
+ width: 32px;
9249
+ height: 32px;
9250
+ flex-shrink: 0;
9251
+ border-radius: var(--radius-sm);
9252
+ display: flex;
9253
+ align-items: center;
9254
+ justify-content: center;
9255
+ color: white;
9256
+ background: linear-gradient(135deg, var(--accent) 0%, var(--accent-hover) 100%);
9257
+ box-shadow: 0 4px 12px var(--accent-glow), inset 0 1px 0 rgba(255,255,255,0.35);
9258
+ }
9259
+ .update-card.is-success .update-card-icon {
9260
+ background: linear-gradient(135deg, var(--success) 0%, var(--success-hover) 100%);
9261
+ box-shadow: 0 4px 12px var(--success-glow), inset 0 1px 0 rgba(255,255,255,0.35);
9262
+ }
9263
+ .update-card-heading {
9264
+ flex: 1;
9265
+ min-width: 0;
9266
+ display: flex;
9267
+ flex-direction: column;
9268
+ gap: 2px;
9269
+ }
9270
+ .update-card-title {
9271
+ font-size: 0.88rem;
9272
+ font-weight: 700;
9273
+ color: var(--text-primary);
9274
+ letter-spacing: 0.01em;
9275
+ line-height: 1.25;
9276
+ }
9277
+ .update-card-subtitle {
9278
+ font-size: 0.72rem;
9279
+ color: var(--text-tertiary);
9280
+ line-height: 1.35;
9281
+ }
9282
+ .update-card-close {
9283
+ flex-shrink: 0;
9284
+ width: 24px;
9285
+ height: 24px;
9286
+ border: none;
9287
+ border-radius: var(--radius-sm);
9288
+ background: transparent;
9289
+ color: var(--text-muted);
9290
+ cursor: pointer;
9291
+ display: flex;
9292
+ align-items: center;
9293
+ justify-content: center;
9294
+ padding: 0;
9295
+ transition: background 0.15s, color 0.15s;
9296
+ }
9297
+ .update-card-close:hover {
9298
+ background: var(--bg-tertiary);
9299
+ color: var(--text-primary);
9300
+ }
9301
+
9302
+ .update-card-version {
9303
+ position: relative;
9304
+ z-index: 1;
9305
+ margin: 12px 0 10px;
9306
+ display: flex;
9307
+ align-items: center;
9308
+ gap: 8px;
9309
+ flex-wrap: nowrap;
9310
+ }
9311
+ .update-card-version-chip {
9312
+ font-family: var(--font-mono, ui-monospace, "SF Mono", Menlo, Consolas, monospace);
9313
+ font-size: 0.74rem;
9314
+ font-weight: 600;
9315
+ padding: 3px 10px;
9316
+ border-radius: var(--radius-full);
9317
+ border: 1px solid var(--border-subtle);
9318
+ white-space: nowrap;
9319
+ }
9320
+ .update-card-version-current {
9321
+ color: var(--text-tertiary);
9322
+ background: var(--bg-tertiary);
9323
+ }
9324
+ .update-card-version-latest {
9325
+ color: var(--accent);
9326
+ background: var(--accent-muted);
9327
+ border-color: var(--accent);
9328
+ box-shadow: 0 1px 6px var(--accent-glow);
9329
+ }
9330
+ .update-card.is-success .update-card-version-latest {
9331
+ color: var(--success);
9332
+ background: var(--success-muted);
9333
+ border-color: var(--success);
9334
+ box-shadow: 0 1px 6px var(--success-glow);
9335
+ }
9336
+ .update-card-version-arrow {
9337
+ color: var(--text-muted);
9338
+ flex-shrink: 0;
9339
+ }
9340
+
9341
+ .update-card-progress {
9342
+ position: relative;
9343
+ z-index: 1;
9344
+ height: 0;
9345
+ overflow: hidden;
9346
+ margin: 0;
9347
+ transition: height 0.25s ease, margin 0.25s ease;
9348
+ }
9349
+ .update-card-progress.active {
9350
+ height: 6px;
9351
+ margin: 0 0 10px;
9352
+ }
9353
+ .update-card-progress-track {
9354
+ position: relative;
9355
+ width: 100%;
9356
+ height: 100%;
9357
+ background: var(--bg-tertiary);
9358
+ border-radius: var(--radius-full);
9359
+ overflow: hidden;
9360
+ }
9361
+ .update-card-progress-fill {
9362
+ position: absolute;
9363
+ top: 0;
9364
+ left: -40%;
9365
+ width: 40%;
9366
+ height: 100%;
9367
+ border-radius: var(--radius-full);
9368
+ background: linear-gradient(90deg, var(--accent) 0%, var(--accent-hover) 100%);
9369
+ box-shadow: 0 0 10px var(--accent-glow);
9370
+ animation: update-card-progress-sweep 1.4s cubic-bezier(0.65, 0.05, 0.35, 1) infinite;
9371
+ }
9372
+ @keyframes update-card-progress-sweep {
9373
+ 0% { left: -45%; width: 40%; }
9374
+ 50% { left: 25%; width: 55%; }
9375
+ 100% { left: 105%; width: 40%; }
9376
+ }
9377
+
9378
+ .update-card-status {
9379
+ position: relative;
9380
+ z-index: 1;
9381
+ font-size: 0.72rem;
9382
+ line-height: 1.4;
9383
+ padding: 6px 10px;
9384
+ border-radius: var(--radius-sm);
9385
+ margin-bottom: 10px;
9386
+ background: var(--bg-tertiary);
9387
+ color: var(--text-secondary);
9388
+ border: 1px solid var(--border-subtle);
9389
+ }
9390
+ .update-card-status.error {
9391
+ background: var(--danger-muted);
9392
+ color: var(--danger);
9393
+ border-color: var(--danger);
9394
+ }
9395
+ .update-card-status.success {
9396
+ background: var(--success-muted);
9397
+ color: var(--success);
9398
+ border-color: var(--success);
9399
+ }
9400
+
9401
+ .update-card-actions {
9402
+ position: relative;
9403
+ z-index: 1;
9404
+ display: flex;
9405
+ justify-content: flex-end;
9406
+ gap: 8px;
9407
+ }
9408
+ .update-card-action {
9409
+ font-size: 0.78rem;
9410
+ font-weight: 600;
9411
+ padding: 7px 16px;
9412
+ border-radius: var(--radius-sm);
9413
+ border: 1px solid transparent;
9414
+ cursor: pointer;
9415
+ display: inline-flex;
9416
+ align-items: center;
9417
+ gap: 6px;
9418
+ transition: transform 0.12s ease, filter 0.15s ease, box-shadow 0.15s ease;
9419
+ }
9420
+ .update-card-action-primary {
9421
+ background: linear-gradient(135deg, var(--accent) 0%, var(--accent-hover) 100%);
9422
+ color: white;
9423
+ box-shadow: 0 4px 12px var(--accent-glow), inset 0 1px 0 rgba(255,255,255,0.25);
9424
+ }
9425
+ .update-card-action-primary:hover:not(:disabled) {
9426
+ filter: brightness(1.05);
9427
+ transform: translateY(-1px);
9428
+ box-shadow: 0 6px 16px var(--accent-glow), inset 0 1px 0 rgba(255,255,255,0.3);
9429
+ }
9430
+ .update-card-action-primary:active:not(:disabled) {
9431
+ transform: translateY(0);
9432
+ filter: brightness(0.96);
9433
+ }
9434
+ .update-card-action:disabled {
9435
+ opacity: 0.7;
9436
+ cursor: progress;
9437
+ filter: none;
9438
+ transform: none;
9439
+ }
9440
+ .update-card.is-success .update-card-action-primary {
9441
+ background: linear-gradient(135deg, var(--success) 0%, var(--success-hover) 100%);
9442
+ box-shadow: 0 4px 12px var(--success-glow), inset 0 1px 0 rgba(255,255,255,0.25);
9443
+ }
9444
+ .update-card.is-success .update-card-action-primary:hover:not(:disabled) {
9445
+ box-shadow: 0 6px 16px var(--success-glow), inset 0 1px 0 rgba(255,255,255,0.3);
9446
+ }
9447
+
9188
9448
  /* Restart overlay */
9189
9449
  .restart-overlay {
9190
9450
  position: fixed;
@@ -10610,67 +10870,372 @@
10610
10870
  color: var(--accent);
10611
10871
  }
10612
10872
 
10613
- /* ============================================
10614
- 骨架屏加载效果
10615
- ============================================ */
10616
- .skeleton {
10617
- background: linear-gradient(
10618
- 90deg,
10619
- var(--bg-tertiary) 25%,
10620
- rgba(255, 255, 255, 0.5) 50%,
10621
- var(--bg-tertiary) 75%
10622
- );
10623
- background-size: 200% 100%;
10624
- animation: skeleton-shimmer 1.5s ease-in-out infinite;
10873
+ /* ── File explorer header extras ── */
10874
+ .file-explorer-up,
10875
+ .file-explorer-toggle-hidden {
10876
+ background: none;
10877
+ border: none;
10878
+ cursor: pointer;
10879
+ font-size: 1rem;
10880
+ padding: 4px;
10881
+ width: 28px;
10882
+ height: 28px;
10625
10883
  border-radius: 6px;
10884
+ color: var(--text-muted);
10885
+ display: flex;
10886
+ align-items: center;
10887
+ justify-content: center;
10888
+ transition: background var(--transition-fast), color var(--transition-fast);
10889
+ flex-shrink: 0;
10626
10890
  }
10627
-
10628
- @keyframes skeleton-shimmer {
10629
- 0% { background-position: 200% 0; }
10630
- 100% { background-position: -200% 0; }
10891
+ .file-explorer-up:hover,
10892
+ .file-explorer-toggle-hidden:hover {
10893
+ background: var(--bg-tertiary);
10894
+ color: var(--text-secondary);
10631
10895
  }
10632
-
10633
- .skeleton-text {
10634
- height: 14px;
10635
- margin-bottom: 8px;
10636
- border-radius: 4px;
10896
+ .file-explorer-toggle-hidden.active {
10897
+ color: var(--accent);
10898
+ background: var(--accent-muted);
10637
10899
  }
10638
- .skeleton-text:last-child { width: 60%; }
10639
10900
 
10640
- .skeleton-avatar {
10641
- width: 28px;
10642
- height: 28px;
10643
- border-radius: 50%;
10901
+ /* ── File tree size/meta column ── */
10902
+ .tree-meta {
10903
+ flex-shrink: 0;
10904
+ font-size: 0.6875rem;
10905
+ color: var(--text-muted);
10906
+ font-variant-numeric: tabular-nums;
10907
+ margin-left: 6px;
10908
+ padding-left: 6px;
10909
+ max-width: 70px;
10910
+ overflow: hidden;
10911
+ text-overflow: ellipsis;
10912
+ white-space: nowrap;
10913
+ opacity: 0.85;
10644
10914
  }
10915
+ .tree-item:hover .tree-meta { color: var(--text-secondary); }
10645
10916
 
10646
- .skeleton-btn {
10647
- height: 32px;
10648
- width: 80px;
10649
- border-radius: 16px;
10917
+ /* ── Truncation notice in file tree ── */
10918
+ .tree-truncated {
10919
+ padding: 8px 14px;
10920
+ margin: 4px 6px 8px;
10921
+ font-size: 0.6875rem;
10922
+ color: var(--text-muted);
10923
+ background: var(--bg-secondary);
10924
+ border: 1px dashed var(--border);
10925
+ border-radius: 6px;
10926
+ text-align: center;
10650
10927
  }
10651
10928
 
10652
- /* ============================================
10653
- 状态变化动画
10654
- ============================================ */
10655
- @keyframes fadeInScale {
10656
- from {
10657
- opacity: 0;
10658
- transform: scale(0.95);
10659
- }
10660
- to {
10661
- opacity: 1;
10662
- transform: scale(1);
10663
- }
10929
+ /* ── File context menu (right-click / long-press) ── */
10930
+ .file-context-menu {
10931
+ position: fixed;
10932
+ z-index: 1100;
10933
+ min-width: 200px;
10934
+ padding: 4px;
10935
+ background: var(--bg-primary);
10936
+ border: 1px solid var(--border);
10937
+ border-radius: 10px;
10938
+ box-shadow: 0 12px 36px rgba(0, 0, 0, 0.18);
10939
+ animation: ctx-fade-in 0.12s ease;
10664
10940
  }
10665
-
10666
- @keyframes slideInFromRight {
10667
- from {
10668
- opacity: 0;
10669
- transform: translateX(20px);
10670
- }
10671
- to {
10672
- opacity: 1;
10673
- transform: translateX(0);
10941
+ @keyframes ctx-fade-in {
10942
+ from { opacity: 0; transform: translateY(-4px) scale(0.98); }
10943
+ to { opacity: 1; transform: translateY(0) scale(1); }
10944
+ }
10945
+ .file-context-menu-item {
10946
+ display: flex;
10947
+ align-items: center;
10948
+ gap: 10px;
10949
+ width: 100%;
10950
+ padding: 8px 12px;
10951
+ border: none;
10952
+ background: transparent;
10953
+ color: var(--text-primary);
10954
+ font-size: 0.8125rem;
10955
+ text-align: left;
10956
+ cursor: pointer;
10957
+ border-radius: 6px;
10958
+ transition: background 0.12s;
10959
+ }
10960
+ .file-context-menu-item:hover { background: var(--bg-tertiary); }
10961
+ .file-context-menu-item .ctx-icon { width: 18px; text-align: center; opacity: 0.85; }
10962
+
10963
+ /* ── Mini toast for in-app feedback ── */
10964
+ .wand-mini-toast {
10965
+ position: fixed;
10966
+ bottom: 30px;
10967
+ left: 50%;
10968
+ transform: translate(-50%, 14px);
10969
+ z-index: 1200;
10970
+ padding: 8px 16px;
10971
+ background: rgba(20, 20, 20, 0.92);
10972
+ color: #fff;
10973
+ font-size: 0.8125rem;
10974
+ border-radius: 999px;
10975
+ opacity: 0;
10976
+ transition: opacity 0.18s ease, transform 0.18s ease;
10977
+ pointer-events: none;
10978
+ }
10979
+ .wand-mini-toast.show { opacity: 1; transform: translate(-50%, 0); }
10980
+
10981
+ /* ── Preview toolbar ── */
10982
+ .file-preview-toolbar {
10983
+ display: flex;
10984
+ align-items: center;
10985
+ gap: 4px;
10986
+ flex-shrink: 0;
10987
+ margin-left: 8px;
10988
+ }
10989
+ .file-preview-toolbar-btn {
10990
+ background: none;
10991
+ border: 1px solid transparent;
10992
+ cursor: pointer;
10993
+ padding: 4px 8px;
10994
+ min-width: 32px;
10995
+ height: 28px;
10996
+ border-radius: 6px;
10997
+ color: var(--text-muted);
10998
+ font-size: 0.75rem;
10999
+ display: inline-flex;
11000
+ align-items: center;
11001
+ justify-content: center;
11002
+ transition: background 0.15s, color 0.15s, border-color 0.15s;
11003
+ }
11004
+ .file-preview-toolbar-btn:hover {
11005
+ background: var(--bg-tertiary);
11006
+ color: var(--text-primary);
11007
+ border-color: var(--border);
11008
+ }
11009
+ .file-preview-toolbar-btn.toolbar-active {
11010
+ background: var(--accent-muted);
11011
+ color: var(--accent);
11012
+ border-color: var(--accent);
11013
+ }
11014
+
11015
+ /* ── Code preview wrap mode ── */
11016
+ .code-preview-content pre.wrap {
11017
+ white-space: pre-wrap;
11018
+ word-break: break-word;
11019
+ }
11020
+
11021
+ /* ── Image preview ── */
11022
+ .file-preview-body.kind-image {
11023
+ display: flex;
11024
+ align-items: center;
11025
+ justify-content: center;
11026
+ background:
11027
+ linear-gradient(45deg, rgba(0,0,0,0.04) 25%, transparent 25%, transparent 75%, rgba(0,0,0,0.04) 75%),
11028
+ linear-gradient(45deg, rgba(0,0,0,0.04) 25%, transparent 25%, transparent 75%, rgba(0,0,0,0.04) 75%),
11029
+ var(--bg-primary);
11030
+ background-size: 16px 16px;
11031
+ background-position: 0 0, 8px 8px;
11032
+ }
11033
+ .image-preview-wrapper {
11034
+ width: 100%;
11035
+ height: 100%;
11036
+ display: flex;
11037
+ align-items: center;
11038
+ justify-content: center;
11039
+ overflow: auto;
11040
+ padding: 16px;
11041
+ }
11042
+ .image-preview-img {
11043
+ max-width: 100%;
11044
+ max-height: 100%;
11045
+ object-fit: contain;
11046
+ cursor: zoom-in;
11047
+ transition: transform 0.2s ease;
11048
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.12);
11049
+ border-radius: 4px;
11050
+ background: #fff;
11051
+ }
11052
+ .image-preview-img.zoomed {
11053
+ max-width: none;
11054
+ max-height: none;
11055
+ cursor: zoom-out;
11056
+ transform: scale(1);
11057
+ }
11058
+
11059
+ /* ── PDF preview ── */
11060
+ .file-preview-body.kind-pdf {
11061
+ padding: 0;
11062
+ background: var(--bg-secondary);
11063
+ }
11064
+ .pdf-preview-frame {
11065
+ width: 100%;
11066
+ height: 100%;
11067
+ border: none;
11068
+ background: var(--bg-secondary);
11069
+ }
11070
+
11071
+ /* ── Video / audio preview ── */
11072
+ .file-preview-body.kind-video,
11073
+ .file-preview-body.kind-audio {
11074
+ display: flex;
11075
+ align-items: center;
11076
+ justify-content: center;
11077
+ background: #0d0d0d;
11078
+ }
11079
+ .file-preview-body.kind-audio { background: var(--bg-secondary); }
11080
+ .media-preview-wrapper {
11081
+ display: flex;
11082
+ flex-direction: column;
11083
+ align-items: center;
11084
+ gap: 10px;
11085
+ max-width: 100%;
11086
+ max-height: 100%;
11087
+ padding: 24px;
11088
+ }
11089
+ .media-preview-video {
11090
+ max-width: 100%;
11091
+ max-height: calc(100% - 40px);
11092
+ background: #000;
11093
+ border-radius: 4px;
11094
+ }
11095
+ .media-preview-audio { width: min(420px, 90%); }
11096
+ .media-preview-icon { font-size: 3.5rem; opacity: 0.7; }
11097
+ .media-preview-name {
11098
+ font-weight: 600;
11099
+ color: var(--text-primary);
11100
+ font-size: 1rem;
11101
+ max-width: 100%;
11102
+ overflow: hidden;
11103
+ text-overflow: ellipsis;
11104
+ white-space: nowrap;
11105
+ }
11106
+ .media-preview-meta {
11107
+ color: var(--text-muted);
11108
+ font-size: 0.75rem;
11109
+ font-variant-numeric: tabular-nums;
11110
+ }
11111
+ .file-preview-body.kind-video .media-preview-meta { color: rgba(255,255,255,0.7); }
11112
+
11113
+ /* ── Binary fallback card ── */
11114
+ .file-preview-body.kind-binary {
11115
+ display: flex;
11116
+ align-items: center;
11117
+ justify-content: center;
11118
+ }
11119
+ .binary-preview-card {
11120
+ max-width: 480px;
11121
+ padding: 32px 28px;
11122
+ text-align: center;
11123
+ background: var(--bg-secondary);
11124
+ border: 1px solid var(--border);
11125
+ border-radius: var(--radius-lg);
11126
+ display: flex;
11127
+ flex-direction: column;
11128
+ align-items: center;
11129
+ gap: 10px;
11130
+ }
11131
+ .binary-preview-icon { font-size: 3rem; opacity: 0.6; }
11132
+ .binary-preview-name {
11133
+ font-weight: 600;
11134
+ color: var(--text-primary);
11135
+ font-size: 1rem;
11136
+ word-break: break-all;
11137
+ }
11138
+ .binary-preview-meta {
11139
+ display: flex;
11140
+ gap: 6px;
11141
+ align-items: center;
11142
+ color: var(--text-muted);
11143
+ font-size: 0.75rem;
11144
+ }
11145
+ .binary-preview-path {
11146
+ font-family: var(--font-mono);
11147
+ font-size: 0.75rem;
11148
+ color: var(--text-muted);
11149
+ max-width: 100%;
11150
+ overflow: hidden;
11151
+ text-overflow: ellipsis;
11152
+ white-space: nowrap;
11153
+ }
11154
+ .binary-preview-actions {
11155
+ display: flex;
11156
+ gap: 8px;
11157
+ margin-top: 8px;
11158
+ flex-wrap: wrap;
11159
+ justify-content: center;
11160
+ }
11161
+ .binary-preview-btn {
11162
+ padding: 8px 16px;
11163
+ border-radius: 6px;
11164
+ border: 1px solid var(--border);
11165
+ background: var(--bg-primary);
11166
+ color: var(--text-primary);
11167
+ font-size: 0.8125rem;
11168
+ cursor: pointer;
11169
+ text-decoration: none;
11170
+ transition: background 0.15s, border-color 0.15s, color 0.15s;
11171
+ }
11172
+ .binary-preview-btn:hover {
11173
+ background: var(--accent-muted);
11174
+ border-color: var(--accent);
11175
+ color: var(--accent);
11176
+ }
11177
+
11178
+ /* ============================================
11179
+ 骨架屏加载效果
11180
+ ============================================ */
11181
+ .skeleton {
11182
+ background: linear-gradient(
11183
+ 90deg,
11184
+ var(--bg-tertiary) 25%,
11185
+ rgba(255, 255, 255, 0.5) 50%,
11186
+ var(--bg-tertiary) 75%
11187
+ );
11188
+ background-size: 200% 100%;
11189
+ animation: skeleton-shimmer 1.5s ease-in-out infinite;
11190
+ border-radius: 6px;
11191
+ }
11192
+
11193
+ @keyframes skeleton-shimmer {
11194
+ 0% { background-position: 200% 0; }
11195
+ 100% { background-position: -200% 0; }
11196
+ }
11197
+
11198
+ .skeleton-text {
11199
+ height: 14px;
11200
+ margin-bottom: 8px;
11201
+ border-radius: 4px;
11202
+ }
11203
+ .skeleton-text:last-child { width: 60%; }
11204
+
11205
+ .skeleton-avatar {
11206
+ width: 28px;
11207
+ height: 28px;
11208
+ border-radius: 50%;
11209
+ }
11210
+
11211
+ .skeleton-btn {
11212
+ height: 32px;
11213
+ width: 80px;
11214
+ border-radius: 16px;
11215
+ }
11216
+
11217
+ /* ============================================
11218
+ 状态变化动画
11219
+ ============================================ */
11220
+ @keyframes fadeInScale {
11221
+ from {
11222
+ opacity: 0;
11223
+ transform: scale(0.95);
11224
+ }
11225
+ to {
11226
+ opacity: 1;
11227
+ transform: scale(1);
11228
+ }
11229
+ }
11230
+
11231
+ @keyframes slideInFromRight {
11232
+ from {
11233
+ opacity: 0;
11234
+ transform: translateX(20px);
11235
+ }
11236
+ to {
11237
+ opacity: 1;
11238
+ transform: translateX(0);
10674
11239
  }
10675
11240
  }
10676
11241
 
@@ -11676,6 +12241,202 @@
11676
12241
  cursor: pointer;
11677
12242
  display: inline-block;
11678
12243
  }
12244
+ /* Toggle 行右侧附属操作(如「查看」按钮 + 开关同列) */
12245
+ .settings-toggle-aside {
12246
+ flex: 0 0 auto;
12247
+ display: flex;
12248
+ align-items: center;
12249
+ gap: 10px;
12250
+ }
12251
+
12252
+ /* ── Env preview modal ── */
12253
+ .env-preview-modal {
12254
+ max-width: 720px;
12255
+ }
12256
+ .env-preview-body {
12257
+ display: flex;
12258
+ flex-direction: column;
12259
+ gap: 12px;
12260
+ padding: 18px 24px 8px;
12261
+ min-height: 0;
12262
+ }
12263
+ .env-preview-toolbar {
12264
+ display: flex;
12265
+ align-items: center;
12266
+ justify-content: space-between;
12267
+ gap: 12px;
12268
+ flex-wrap: wrap;
12269
+ }
12270
+ .env-preview-meta {
12271
+ display: inline-flex;
12272
+ align-items: center;
12273
+ gap: 8px;
12274
+ font-size: 0.78rem;
12275
+ color: var(--text-secondary);
12276
+ }
12277
+ .env-preview-pill {
12278
+ display: inline-flex;
12279
+ align-items: center;
12280
+ padding: 2px 10px;
12281
+ border-radius: var(--radius-full);
12282
+ font-size: 0.72rem;
12283
+ font-weight: 600;
12284
+ letter-spacing: 0.02em;
12285
+ border: 1px solid var(--border-subtle);
12286
+ }
12287
+ .env-preview-pill.is-inherit {
12288
+ color: var(--accent);
12289
+ background: var(--accent-muted);
12290
+ border-color: var(--accent);
12291
+ }
12292
+ .env-preview-pill.is-minimal {
12293
+ color: var(--success);
12294
+ background: var(--success-muted);
12295
+ border-color: var(--success);
12296
+ }
12297
+ .env-preview-count {
12298
+ font-size: 0.72rem;
12299
+ color: var(--text-muted);
12300
+ }
12301
+ .env-preview-controls {
12302
+ display: flex;
12303
+ align-items: center;
12304
+ gap: 10px;
12305
+ flex-wrap: wrap;
12306
+ }
12307
+ .env-preview-search {
12308
+ width: 200px;
12309
+ max-width: 100%;
12310
+ padding: 6px 10px;
12311
+ border-radius: var(--radius-sm);
12312
+ border: 1px solid var(--border);
12313
+ background: var(--bg-elevated);
12314
+ font-size: 0.78rem;
12315
+ color: var(--text-primary);
12316
+ }
12317
+ .env-preview-search:focus {
12318
+ outline: none;
12319
+ border-color: var(--border-focus);
12320
+ box-shadow: 0 0 0 3px var(--accent-glow);
12321
+ }
12322
+ .env-preview-reveal {
12323
+ display: inline-flex;
12324
+ align-items: center;
12325
+ gap: 6px;
12326
+ font-size: 0.74rem;
12327
+ color: var(--text-secondary);
12328
+ cursor: pointer;
12329
+ user-select: none;
12330
+ }
12331
+ .env-preview-reveal input {
12332
+ accent-color: var(--accent);
12333
+ cursor: pointer;
12334
+ }
12335
+ .env-preview-list {
12336
+ max-height: min(56vh, 460px);
12337
+ overflow-y: auto;
12338
+ border-radius: var(--radius-sm);
12339
+ border: 1px solid var(--border-subtle);
12340
+ background: var(--bg-elevated);
12341
+ padding: 4px;
12342
+ }
12343
+ .env-preview-list:focus { outline: none; }
12344
+ .env-preview-row {
12345
+ display: grid;
12346
+ grid-template-columns: minmax(0, 220px) minmax(0, 1fr) auto;
12347
+ gap: 12px;
12348
+ align-items: center;
12349
+ padding: 8px 10px;
12350
+ border-radius: var(--radius-xs);
12351
+ font-family: var(--font-mono, ui-monospace, "SF Mono", Menlo, Consolas, monospace);
12352
+ font-size: 0.74rem;
12353
+ transition: background 0.12s;
12354
+ }
12355
+ .env-preview-row:hover {
12356
+ background: var(--bg-tertiary);
12357
+ }
12358
+ .env-preview-row + .env-preview-row {
12359
+ border-top: 1px dashed var(--border-subtle);
12360
+ }
12361
+ .env-preview-name {
12362
+ color: var(--text-primary);
12363
+ font-weight: 600;
12364
+ display: inline-flex;
12365
+ align-items: center;
12366
+ gap: 6px;
12367
+ flex-wrap: wrap;
12368
+ overflow-wrap: anywhere;
12369
+ }
12370
+ .env-preview-row.is-sensitive .env-preview-name {
12371
+ color: var(--warning);
12372
+ }
12373
+ .env-preview-badge {
12374
+ display: inline-flex;
12375
+ align-items: center;
12376
+ padding: 1px 6px;
12377
+ border-radius: var(--radius-full);
12378
+ font-family: inherit;
12379
+ font-size: 0.62rem;
12380
+ font-weight: 600;
12381
+ letter-spacing: 0.04em;
12382
+ background: var(--warning-muted);
12383
+ color: var(--warning);
12384
+ border: 1px solid var(--warning);
12385
+ }
12386
+ .env-preview-badge-runtime {
12387
+ background: var(--info-muted);
12388
+ color: var(--info);
12389
+ border-color: var(--info);
12390
+ }
12391
+ .env-preview-value {
12392
+ color: var(--text-secondary);
12393
+ overflow: hidden;
12394
+ text-overflow: ellipsis;
12395
+ white-space: nowrap;
12396
+ min-width: 0;
12397
+ }
12398
+ .env-preview-value.is-runtime {
12399
+ font-style: italic;
12400
+ color: var(--text-muted);
12401
+ }
12402
+ .env-preview-len {
12403
+ color: var(--text-muted);
12404
+ font-size: 0.68rem;
12405
+ white-space: nowrap;
12406
+ }
12407
+ .env-preview-loading,
12408
+ .env-preview-empty {
12409
+ padding: 24px 8px;
12410
+ text-align: center;
12411
+ color: var(--text-muted);
12412
+ font-size: 0.78rem;
12413
+ }
12414
+ .env-preview-footer {
12415
+ display: flex;
12416
+ align-items: center;
12417
+ justify-content: space-between;
12418
+ gap: 12px;
12419
+ padding: 14px 24px 18px;
12420
+ }
12421
+ .env-preview-hint {
12422
+ font-size: 0.7rem;
12423
+ color: var(--text-muted);
12424
+ flex: 1;
12425
+ min-width: 0;
12426
+ }
12427
+
12428
+ @media (max-width: 640px) {
12429
+ .env-preview-modal { max-width: calc(100vw - 24px); }
12430
+ .env-preview-row {
12431
+ grid-template-columns: 1fr;
12432
+ gap: 4px;
12433
+ }
12434
+ .env-preview-len {
12435
+ justify-self: end;
12436
+ }
12437
+ .env-preview-search { width: 100%; }
12438
+ .env-preview-controls { width: 100%; }
12439
+ }
11679
12440
 
11680
12441
  /* Range 行(音量等) */
11681
12442
  .settings-range-row {