dsh-explorer 0.0.0-stage → 0.1.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.
Files changed (37) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +106 -2
  3. package/cordis.patch.yml +5 -0
  4. package/icon.svg +7 -0
  5. package/lib/client.js +859 -0
  6. package/lib/index.js +854 -0
  7. package/package.json +91 -4
  8. package/src/client/ExplorerView.tsx +981 -0
  9. package/src/client/components/ExplorerContextMenu.tsx +157 -0
  10. package/src/client/components/ExplorerDeleteModal.tsx +124 -0
  11. package/src/client/components/ExplorerEmptyContextMenu.tsx +125 -0
  12. package/src/client/components/ExplorerHeader.tsx +81 -0
  13. package/src/client/components/ExplorerOptionsModal.tsx +230 -0
  14. package/src/client/components/ExplorerRow.tsx +258 -0
  15. package/src/client/components/ExplorerSearch.tsx +55 -0
  16. package/src/client/components/TreeNode.tsx +384 -0
  17. package/src/client/css-modules.d.ts +5 -0
  18. package/src/client/explorer.module.css +833 -0
  19. package/src/client/hooks/useKeyboardNav.ts +89 -0
  20. package/src/client/hooks/useLiveSync.ts +81 -0
  21. package/src/client/index.tsx +238 -0
  22. package/src/client/utils/api.ts +251 -0
  23. package/src/client/utils/conversation-draft.ts +644 -0
  24. package/src/client/utils/drag-drop.ts +209 -0
  25. package/src/client/utils/open-tab.ts +69 -0
  26. package/src/client/utils/options.ts +59 -0
  27. package/src/client/utils/vscode-theme.tsx +250 -0
  28. package/src/config.ts +11 -0
  29. package/src/fs-operations.ts +116 -0
  30. package/src/fs-search.ts +116 -0
  31. package/src/fs-tree.ts +155 -0
  32. package/src/fs-watch.ts +179 -0
  33. package/src/git-status.ts +167 -0
  34. package/src/index.ts +177 -0
  35. package/src/path-security.ts +22 -0
  36. package/src/session-path.ts +35 -0
  37. package/src/wire.ts +63 -0
@@ -0,0 +1,833 @@
1
+ .container {
2
+ display: flex;
3
+ flex-direction: column;
4
+ height: 100%;
5
+ width: 100%;
6
+ background-color: var(--dsh-bg-base, #181818);
7
+ color: var(--dsh-fg-base, #cccccc);
8
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
9
+ font-size: var(--dsh-font-size, 13px);
10
+ user-select: none;
11
+ overflow: hidden;
12
+ box-sizing: border-box;
13
+ position: relative;
14
+ }
15
+
16
+ .header {
17
+ display: flex;
18
+ align-items: center;
19
+ justify-content: space-between;
20
+ padding: 8px 10px;
21
+ min-height: 38px;
22
+ font-size: 11.5px;
23
+ font-weight: 600;
24
+ color: var(--dsh-fg-muted, #858585);
25
+ border-bottom: 1px solid var(--dsh-border, rgba(255, 255, 255, 0.08));
26
+ flex-shrink: 0;
27
+ gap: 8px;
28
+ }
29
+
30
+ .headerTitle {
31
+ overflow: hidden;
32
+ text-overflow: ellipsis;
33
+ white-space: nowrap;
34
+ min-width: 0;
35
+ flex: 1;
36
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
37
+ font-size: 11px;
38
+ color: var(--dsh-fg-base, #cccccc);
39
+ letter-spacing: normal;
40
+ }
41
+
42
+ .headerActions {
43
+ display: flex;
44
+ align-items: center;
45
+ gap: 3px;
46
+ flex-shrink: 0;
47
+ }
48
+
49
+ .iconBtn {
50
+ display: flex;
51
+ align-items: center;
52
+ justify-content: center;
53
+ width: 26px;
54
+ height: 26px;
55
+ border-radius: 5px;
56
+ border: none;
57
+ background: transparent;
58
+ color: inherit;
59
+ cursor: pointer;
60
+ opacity: 0.8;
61
+ transition: opacity 0.15s cubic-bezier(0.2, 0, 0, 1), background-color 0.15s cubic-bezier(0.2, 0, 0, 1), transform 0.12s ease;
62
+ }
63
+
64
+ .iconBtn:hover {
65
+ opacity: 1;
66
+ background-color: var(--dsh-bg-hover, rgba(255, 255, 255, 0.1));
67
+ }
68
+
69
+ .iconBtn:active {
70
+ transform: scale(0.92);
71
+ }
72
+
73
+ .iconBtnActive {
74
+ background-color: var(--dsh-bg-active, rgba(255, 255, 255, 0.15));
75
+ opacity: 1;
76
+ }
77
+
78
+ .searchBar {
79
+ padding: 6px 10px;
80
+ border-bottom: 1px solid var(--dsh-border, rgba(255, 255, 255, 0.06));
81
+ background-color: var(--dsh-bg-subtle, rgba(0, 0, 0, 0.15));
82
+ display: flex;
83
+ align-items: center;
84
+ gap: 6px;
85
+ flex-shrink: 0;
86
+ animation: searchSlide 0.16s cubic-bezier(0, 0, 0.2, 1);
87
+ }
88
+
89
+ @keyframes searchSlide {
90
+ from {
91
+ opacity: 0;
92
+ transform: translateY(-6px);
93
+ }
94
+ to {
95
+ opacity: 1;
96
+ transform: translateY(0);
97
+ }
98
+ }
99
+
100
+ .searchInput {
101
+ flex: 1;
102
+ background: var(--dsh-input-bg, rgba(255, 255, 255, 0.06));
103
+ border: 1px solid var(--dsh-border, rgba(255, 255, 255, 0.12));
104
+ border-radius: 4px;
105
+ color: inherit;
106
+ padding: 4px 8px;
107
+ font-size: 12px;
108
+ outline: none;
109
+ transition: border-color 0.15s ease;
110
+ }
111
+
112
+ .searchInput:focus {
113
+ border-color: #007fd4;
114
+ }
115
+
116
+ .clearSearchBtn {
117
+ background: transparent;
118
+ border: none;
119
+ color: inherit;
120
+ cursor: pointer;
121
+ opacity: 0.6;
122
+ font-size: 11px;
123
+ transition: opacity 0.12s ease;
124
+ }
125
+
126
+ .clearSearchBtn:hover {
127
+ opacity: 1;
128
+ }
129
+
130
+ .searchSpinner {
131
+ width: 13px;
132
+ height: 13px;
133
+ border: 2px solid rgba(255, 255, 255, 0.2);
134
+ border-top-color: #007fd4;
135
+ border-radius: 50%;
136
+ animation: searchSpin 0.6s linear infinite;
137
+ flex-shrink: 0;
138
+ }
139
+
140
+ @keyframes searchSpin {
141
+ to {
142
+ transform: rotate(360deg);
143
+ }
144
+ }
145
+
146
+ .matchCountBadge {
147
+ font-size: 11px;
148
+ opacity: 0.7;
149
+ background: var(--dsh-badge-bg, rgba(255, 255, 255, 0.08));
150
+ border-radius: 3px;
151
+ padding: 1px 6px;
152
+ font-variant-numeric: tabular-nums;
153
+ white-space: nowrap;
154
+ }
155
+
156
+ .treeBody {
157
+ flex: 1;
158
+ overflow-y: auto;
159
+ overflow-x: hidden;
160
+ padding: 4px 0;
161
+ outline: none;
162
+ }
163
+
164
+ .row {
165
+ display: flex;
166
+ align-items: center;
167
+ height: var(--dsh-row-height, 24px);
168
+ line-height: var(--dsh-row-height, 24px);
169
+ padding-right: 8px;
170
+ cursor: pointer;
171
+ position: relative;
172
+ transition: background-color 0.12s cubic-bezier(0.2, 0, 0, 1);
173
+ }
174
+
175
+ .row:hover {
176
+ background-color: var(--dsh-row-hover, rgba(255, 255, 255, 0.05));
177
+ }
178
+
179
+ .rowSelected {
180
+ background-color: var(--dsh-row-selected, rgba(0, 122, 204, 0.25)) !important;
181
+ }
182
+
183
+ .rowFocused {
184
+ outline: 1px solid #007fd4;
185
+ outline-offset: -1px;
186
+ }
187
+
188
+ .indentGuide {
189
+ position: absolute;
190
+ top: 0;
191
+ bottom: 0;
192
+ width: 1px;
193
+ background-color: rgba(255, 255, 255, 0.06);
194
+ }
195
+
196
+ .chevron {
197
+ display: inline-flex;
198
+ align-items: center;
199
+ justify-content: center;
200
+ width: var(--dsh-icon-size, 16px);
201
+ height: var(--dsh-icon-size, 16px);
202
+ margin-right: 2px;
203
+ color: inherit;
204
+ opacity: 0.6;
205
+ transition: transform 0.22s cubic-bezier(0.2, 0, 0, 1), opacity 0.15s ease;
206
+ flex-shrink: 0;
207
+ will-change: transform;
208
+ }
209
+
210
+ .chevronExpanded {
211
+ transform: rotate(90deg);
212
+ }
213
+
214
+ .chevronHidden {
215
+ visibility: hidden;
216
+ }
217
+
218
+ /* Motion Collapse: CSS Grid animation for silky smooth folder expanding & collapsing */
219
+ .folderGroup {
220
+ display: flex;
221
+ flex-direction: column;
222
+ }
223
+
224
+ .folderChildren {
225
+ display: grid;
226
+ grid-template-rows: 0fr;
227
+ transition: grid-template-rows 0.22s cubic-bezier(0.2, 0, 0, 1), opacity 0.18s ease;
228
+ opacity: 0;
229
+ overflow: hidden;
230
+ will-change: grid-template-rows, opacity;
231
+ }
232
+
233
+ .folderChildrenOpen {
234
+ grid-template-rows: 1fr;
235
+ opacity: 1;
236
+ }
237
+
238
+ .folderChildrenClosed {
239
+ grid-template-rows: 0fr;
240
+ opacity: 0;
241
+ pointer-events: none;
242
+ }
243
+
244
+ .folderChildrenInner {
245
+ overflow: hidden;
246
+ min-height: 0;
247
+ }
248
+
249
+ .iconWrap {
250
+ display: inline-flex;
251
+ align-items: center;
252
+ justify-content: center;
253
+ width: var(--dsh-icon-size, 18px);
254
+ height: var(--dsh-icon-size, 18px);
255
+ margin-right: 6px;
256
+ flex-shrink: 0;
257
+ }
258
+
259
+ .label {
260
+ flex: 1;
261
+ overflow: hidden;
262
+ text-overflow: ellipsis;
263
+ white-space: nowrap;
264
+ font-size: var(--dsh-font-size, 13px);
265
+ }
266
+
267
+ .labelDimmed {
268
+ opacity: 0.5;
269
+ }
270
+
271
+ .gitBadge {
272
+ font-size: 10px;
273
+ font-weight: 700;
274
+ margin-left: auto;
275
+ margin-right: 4px;
276
+ padding: 1px 5px;
277
+ border-radius: 3px;
278
+ line-height: 1;
279
+ display: inline-flex;
280
+ align-items: center;
281
+ justify-content: center;
282
+ flex-shrink: 0;
283
+ letter-spacing: 0.04em;
284
+ }
285
+
286
+ .gitModified {
287
+ color: #e2c08d !important;
288
+ }
289
+
290
+ .gitUntracked {
291
+ color: #73c991 !important;
292
+ }
293
+
294
+ .gitDeleted {
295
+ color: #e5534b !important;
296
+ }
297
+
298
+ .gitBadge.gitModified {
299
+ background-color: rgba(226, 192, 141, 0.18);
300
+ }
301
+
302
+ .gitBadge.gitUntracked {
303
+ background-color: rgba(115, 201, 145, 0.18);
304
+ }
305
+
306
+ .gitBadge.gitDeleted {
307
+ background-color: rgba(229, 83, 75, 0.18);
308
+ }
309
+
310
+ .hoverActions {
311
+ display: none;
312
+ align-items: center;
313
+ gap: 2px;
314
+ margin-left: 4px;
315
+ flex-shrink: 0;
316
+ animation: actionsFadeIn 0.12s ease;
317
+ }
318
+
319
+ @keyframes actionsFadeIn {
320
+ from {
321
+ opacity: 0;
322
+ transform: translateX(4px);
323
+ }
324
+ to {
325
+ opacity: 1;
326
+ transform: translateX(0);
327
+ }
328
+ }
329
+
330
+ .row:hover .hoverActions {
331
+ display: flex;
332
+ }
333
+
334
+ .actionBtn {
335
+ display: flex;
336
+ align-items: center;
337
+ justify-content: center;
338
+ width: 20px;
339
+ height: 20px;
340
+ border-radius: 3px;
341
+ border: none;
342
+ background: transparent;
343
+ color: inherit;
344
+ cursor: pointer;
345
+ opacity: 0.7;
346
+ padding: 0;
347
+ transition: opacity 0.12s ease, background-color 0.12s ease, transform 0.12s ease;
348
+ }
349
+
350
+ .actionBtn:hover {
351
+ opacity: 1;
352
+ background-color: rgba(255, 255, 255, 0.15);
353
+ transform: scale(1.08);
354
+ }
355
+
356
+ .actionBtn:active {
357
+ transform: scale(0.92);
358
+ }
359
+
360
+ .inlineInput {
361
+ flex: 1;
362
+ background: var(--dsh-input-bg, #252526);
363
+ border: 1px solid #007fd4;
364
+ border-radius: 2px;
365
+ color: inherit;
366
+ padding: 1px 4px;
367
+ font-size: 12px;
368
+ outline: none;
369
+ height: 20px;
370
+ }
371
+
372
+ .contextMenu {
373
+ position: fixed;
374
+ background: var(--dsh-menu-bg, #252526);
375
+ border: 1px solid var(--dsh-border, rgba(255, 255, 255, 0.1));
376
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45);
377
+ border-radius: 6px;
378
+ padding: 4px 0;
379
+ z-index: 10000;
380
+ min-width: 180px;
381
+ font-size: 12px;
382
+ color: var(--dsh-fg-base, #cccccc);
383
+ animation: contextMenuPop 0.12s cubic-bezier(0, 0, 0.2, 1);
384
+ transform-origin: top left;
385
+ }
386
+
387
+ @keyframes contextMenuPop {
388
+ from {
389
+ opacity: 0;
390
+ transform: scale(0.96) translateY(-4px);
391
+ }
392
+ to {
393
+ opacity: 1;
394
+ transform: scale(1) translateY(0);
395
+ }
396
+ }
397
+
398
+ .menuItem {
399
+ display: flex;
400
+ align-items: center;
401
+ justify-content: space-between;
402
+ padding: 5px 12px;
403
+ cursor: pointer;
404
+ transition: background-color 0.1s ease;
405
+ }
406
+
407
+ .menuItem:hover {
408
+ background-color: var(--dsh-menu-hover, #094771);
409
+ color: #ffffff;
410
+ }
411
+
412
+ .menuDivider {
413
+ height: 1px;
414
+ background-color: var(--dsh-border, rgba(255, 255, 255, 0.08));
415
+ margin: 4px 0;
416
+ }
417
+
418
+ .menuShortcut {
419
+ font-size: 10px;
420
+ opacity: 0.6;
421
+ margin-left: 16px;
422
+ }
423
+
424
+ .emptyState {
425
+ padding: 24px 16px;
426
+ text-align: center;
427
+ opacity: 0.6;
428
+ font-size: 12px;
429
+ }
430
+
431
+ /* Motion disable override */
432
+ .noMotion,
433
+ .noMotion * {
434
+ transition: none !important;
435
+ animation: none !important;
436
+ }
437
+
438
+ .noMotion .chevron,
439
+ .noMotion .folderChildren,
440
+ .noMotion .actionBtn,
441
+ .noMotion .hoverActions,
442
+ .noMotion .optionsPopover,
443
+ .noMotion .contextMenu {
444
+ transition: none !important;
445
+ animation: none !important;
446
+ }
447
+
448
+ /* Options Popover */
449
+ .optionsPopover {
450
+ position: absolute;
451
+ top: 36px;
452
+ right: 8px;
453
+ width: 280px;
454
+ max-width: calc(100% - 16px);
455
+ max-height: calc(100% - 48px);
456
+ background-color: var(--dsh-bg-elevated, #202020);
457
+ border: 1px solid var(--dsh-border, rgba(255, 255, 255, 0.14));
458
+ border-radius: 6px;
459
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.6), 0 2px 8px rgba(0, 0, 0, 0.4);
460
+ display: flex;
461
+ flex-direction: column;
462
+ z-index: 1000;
463
+ overflow: hidden;
464
+ animation: popoverFadeIn 0.15s cubic-bezier(0, 0, 0.2, 1);
465
+ }
466
+
467
+ @keyframes popoverFadeIn {
468
+ from {
469
+ opacity: 0;
470
+ transform: translateY(-6px) scale(0.97);
471
+ }
472
+ to {
473
+ opacity: 1;
474
+ transform: translateY(0) scale(1);
475
+ }
476
+ }
477
+
478
+ .optionsHeader {
479
+ display: flex;
480
+ align-items: center;
481
+ justify-content: space-between;
482
+ padding: 8px 12px;
483
+ background-color: rgba(0, 0, 0, 0.25);
484
+ border-bottom: 1px solid var(--dsh-border, rgba(255, 255, 255, 0.08));
485
+ }
486
+
487
+ .optionsHeaderTitle {
488
+ display: flex;
489
+ align-items: center;
490
+ font-size: 11px;
491
+ font-weight: 700;
492
+ letter-spacing: 0.05em;
493
+ color: var(--dsh-fg-muted, #999999);
494
+ }
495
+
496
+ .optionsIconBtn {
497
+ background: transparent;
498
+ border: none;
499
+ color: inherit;
500
+ opacity: 0.7;
501
+ cursor: pointer;
502
+ display: flex;
503
+ align-items: center;
504
+ justify-content: center;
505
+ padding: 3px;
506
+ border-radius: 3px;
507
+ transition: opacity 0.15s ease, background-color 0.15s ease;
508
+ }
509
+
510
+ .optionsIconBtn:hover {
511
+ opacity: 1;
512
+ background-color: rgba(255, 255, 255, 0.1);
513
+ }
514
+
515
+ .optionsBody {
516
+ overflow-y: auto;
517
+ padding: 10px 12px;
518
+ display: flex;
519
+ flex-direction: column;
520
+ gap: 14px;
521
+ }
522
+
523
+ .optionsSection {
524
+ display: flex;
525
+ flex-direction: column;
526
+ gap: 6px;
527
+ }
528
+
529
+ .optionsSectionTitle {
530
+ font-size: 10.5px;
531
+ font-weight: 700;
532
+ text-transform: uppercase;
533
+ letter-spacing: 0.04em;
534
+ color: var(--dsh-fg-muted, #858585);
535
+ margin-bottom: 2px;
536
+ }
537
+
538
+ .optionsRow {
539
+ display: flex;
540
+ align-items: center;
541
+ justify-content: space-between;
542
+ gap: 8px;
543
+ }
544
+
545
+ .optionsLabelWrap {
546
+ display: flex;
547
+ flex-direction: column;
548
+ gap: 1px;
549
+ }
550
+
551
+ .optionsLabel {
552
+ font-size: 12px;
553
+ font-weight: 500;
554
+ color: var(--dsh-fg-base, #cccccc);
555
+ }
556
+
557
+ .optionsSubLabel {
558
+ font-size: 10.5px;
559
+ color: var(--dsh-fg-muted, #808080);
560
+ }
561
+
562
+ .optionsBadge {
563
+ font-size: 11px;
564
+ font-weight: 600;
565
+ padding: 1px 6px;
566
+ border-radius: 3px;
567
+ background-color: rgba(255, 255, 255, 0.08);
568
+ color: var(--dsh-fg-base, #cccccc);
569
+ font-family: monospace;
570
+ }
571
+
572
+ .optionsMiniBtn {
573
+ background: rgba(255, 255, 255, 0.08);
574
+ border: none;
575
+ color: inherit;
576
+ font-size: 10px;
577
+ padding: 1px 5px;
578
+ border-radius: 3px;
579
+ cursor: pointer;
580
+ opacity: 0.8;
581
+ transition: opacity 0.12s ease;
582
+ }
583
+
584
+ .optionsMiniBtn:hover {
585
+ opacity: 1;
586
+ background: rgba(255, 255, 255, 0.16);
587
+ }
588
+
589
+ .optionsSlider {
590
+ width: 100%;
591
+ accent-color: #007fd4;
592
+ cursor: pointer;
593
+ margin-top: 4px;
594
+ height: 4px;
595
+ }
596
+
597
+ .segmentGroup {
598
+ display: flex;
599
+ background: rgba(0, 0, 0, 0.25);
600
+ border-radius: 4px;
601
+ padding: 2px;
602
+ gap: 2px;
603
+ border: 1px solid rgba(255, 255, 255, 0.06);
604
+ }
605
+
606
+ .segmentBtn {
607
+ flex: 1;
608
+ border: none;
609
+ background: transparent;
610
+ color: inherit;
611
+ padding: 4px 6px;
612
+ font-size: 11px;
613
+ border-radius: 3px;
614
+ cursor: pointer;
615
+ text-align: center;
616
+ opacity: 0.75;
617
+ transition: all 0.15s ease;
618
+ }
619
+
620
+ .segmentBtn:hover {
621
+ opacity: 1;
622
+ background: rgba(255, 255, 255, 0.06);
623
+ }
624
+
625
+ .segmentBtnActive {
626
+ background: var(--dsh-bg-active, #007fd4) !important;
627
+ color: #ffffff !important;
628
+ opacity: 1;
629
+ font-weight: 600;
630
+ }
631
+
632
+ .switch {
633
+ position: relative;
634
+ width: 32px;
635
+ height: 18px;
636
+ border-radius: 9px;
637
+ background: rgba(255, 255, 255, 0.16);
638
+ cursor: pointer;
639
+ transition: background 0.2s ease;
640
+ flex-shrink: 0;
641
+ }
642
+
643
+ .switchActive {
644
+ background: #007fd4;
645
+ }
646
+
647
+ .switchKnob {
648
+ position: absolute;
649
+ top: 2px;
650
+ left: 2px;
651
+ width: 14px;
652
+ height: 14px;
653
+ border-radius: 50%;
654
+ background: #ffffff;
655
+ transition: transform 0.2s cubic-bezier(0.2, 0, 0, 1);
656
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
657
+ }
658
+
659
+ .switchKnobActive {
660
+ transform: translateX(14px);
661
+ }
662
+
663
+ .modalOverlay {
664
+ position: absolute;
665
+ inset: 0;
666
+ background-color: rgba(0, 0, 0, 0.65);
667
+ backdrop-filter: blur(2px);
668
+ display: flex;
669
+ align-items: center;
670
+ justify-content: center;
671
+ z-index: 1200;
672
+ padding: 16px;
673
+ animation: modalFadeIn 0.15s cubic-bezier(0, 0, 0.2, 1);
674
+ }
675
+
676
+ @keyframes modalFadeIn {
677
+ from {
678
+ opacity: 0;
679
+ }
680
+ to {
681
+ opacity: 1;
682
+ }
683
+ }
684
+
685
+ .modalCard {
686
+ background-color: var(--dsh-bg-elevated, #202020);
687
+ border: 1px solid var(--dsh-border, rgba(255, 255, 255, 0.14));
688
+ border-radius: 8px;
689
+ width: 100%;
690
+ max-width: 320px;
691
+ box-shadow: 0 16px 40px rgba(0, 0, 0, 0.65), 0 2px 10px rgba(0, 0, 0, 0.45);
692
+ overflow: hidden;
693
+ display: flex;
694
+ flex-direction: column;
695
+ animation: modalCardScale 0.16s cubic-bezier(0.16, 1, 0.3, 1);
696
+ }
697
+
698
+ @keyframes modalCardScale {
699
+ from {
700
+ opacity: 0;
701
+ transform: scale(0.95) translateY(-4px);
702
+ }
703
+ to {
704
+ opacity: 1;
705
+ transform: scale(1) translateY(0);
706
+ }
707
+ }
708
+
709
+ .modalHeader {
710
+ display: flex;
711
+ align-items: center;
712
+ justify-content: space-between;
713
+ padding: 10px 14px;
714
+ background-color: rgba(0, 0, 0, 0.25);
715
+ border-bottom: 1px solid var(--dsh-border, rgba(255, 255, 255, 0.08));
716
+ }
717
+
718
+ .modalTitleWrap {
719
+ display: flex;
720
+ align-items: center;
721
+ gap: 7px;
722
+ font-size: 12px;
723
+ font-weight: 600;
724
+ color: #ff5252;
725
+ letter-spacing: 0.02em;
726
+ }
727
+
728
+ .modalBody {
729
+ padding: 14px;
730
+ display: flex;
731
+ flex-direction: column;
732
+ gap: 10px;
733
+ font-size: 12px;
734
+ color: var(--dsh-fg-base, #cccccc);
735
+ line-height: 1.45;
736
+ }
737
+
738
+ .modalItemPreview {
739
+ display: flex;
740
+ align-items: center;
741
+ gap: 8px;
742
+ padding: 8px 10px;
743
+ background-color: rgba(0, 0, 0, 0.25);
744
+ border: 1px solid rgba(255, 255, 255, 0.08);
745
+ border-radius: 6px;
746
+ }
747
+
748
+ .modalItemInfo {
749
+ display: flex;
750
+ flex-direction: column;
751
+ gap: 2px;
752
+ min-width: 0;
753
+ flex: 1;
754
+ }
755
+
756
+ .modalItemName {
757
+ font-weight: 600;
758
+ color: #ffffff;
759
+ overflow: hidden;
760
+ text-overflow: ellipsis;
761
+ white-space: nowrap;
762
+ }
763
+
764
+ .modalItemPath {
765
+ font-size: 10.5px;
766
+ color: var(--dsh-fg-muted, #858585);
767
+ overflow: hidden;
768
+ text-overflow: ellipsis;
769
+ white-space: nowrap;
770
+ }
771
+
772
+ .modalWarning {
773
+ font-size: 11px;
774
+ color: #e0a443;
775
+ line-height: 1.35;
776
+ }
777
+
778
+ .modalErrorBanner {
779
+ padding: 6px 10px;
780
+ border-radius: 4px;
781
+ background-color: rgba(244, 67, 54, 0.15);
782
+ border: 1px solid rgba(244, 67, 54, 0.3);
783
+ color: #ff8a80;
784
+ font-size: 11.5px;
785
+ }
786
+
787
+ .modalFooter {
788
+ display: flex;
789
+ align-items: center;
790
+ justify-content: flex-end;
791
+ gap: 8px;
792
+ padding: 10px 14px;
793
+ background-color: rgba(0, 0, 0, 0.2);
794
+ border-top: 1px solid var(--dsh-border, rgba(255, 255, 255, 0.06));
795
+ }
796
+
797
+ .modalBtnCancel {
798
+ padding: 5px 12px;
799
+ font-size: 12px;
800
+ font-weight: 500;
801
+ border-radius: 4px;
802
+ border: 1px solid rgba(255, 255, 255, 0.15);
803
+ background: transparent;
804
+ color: var(--dsh-fg-base, #cccccc);
805
+ cursor: pointer;
806
+ transition: all 0.15s ease;
807
+ }
808
+
809
+ .modalBtnCancel:hover {
810
+ background-color: rgba(255, 255, 255, 0.08);
811
+ color: #ffffff;
812
+ }
813
+
814
+ .modalBtnDanger {
815
+ padding: 5px 14px;
816
+ font-size: 12px;
817
+ font-weight: 600;
818
+ border-radius: 4px;
819
+ border: none;
820
+ background-color: #d32f2f;
821
+ color: #ffffff;
822
+ cursor: pointer;
823
+ transition: background-color 0.15s ease, opacity 0.15s ease;
824
+ }
825
+
826
+ .modalBtnDanger:hover {
827
+ background-color: #e53935;
828
+ }
829
+
830
+ .modalBtnDanger:disabled {
831
+ opacity: 0.6;
832
+ cursor: not-allowed;
833
+ }