@ssebastien/tcmd 0.1.3 → 0.1.4

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 (79) hide show
  1. package/README.md +121 -38
  2. package/bin/tcmd +10 -2
  3. package/bin/tcmd.js +13 -2
  4. package/package.json +4 -3
  5. package/public/index.html +14 -0
  6. package/public/main.js +17501 -0
  7. package/public/style.css +901 -0
  8. package/scripts/serve-web.js +61 -0
  9. package/src/js/tcmd/components/App.html +28 -12
  10. package/src/js/tcmd/components/App.js +135 -85
  11. package/src/js/tcmd/components/App.xml +64 -15
  12. package/src/js/tcmd/components/BookmarkList.html +3 -2
  13. package/src/js/tcmd/components/BookmarkList.js +1 -1
  14. package/src/js/tcmd/components/Breadcrumbs.js +1 -1
  15. package/src/js/tcmd/components/CommandArgRow.html +17 -0
  16. package/src/js/tcmd/components/CommandArgRow.js +86 -26
  17. package/src/js/tcmd/components/CommandArgRow.xml +31 -4
  18. package/src/js/tcmd/components/CommandBar.html +1 -1
  19. package/src/js/tcmd/components/CommandBar.js +3 -3
  20. package/src/js/tcmd/components/CommandItem.html +1 -1
  21. package/src/js/tcmd/components/CommandItem.js +1 -0
  22. package/src/js/tcmd/components/CommandPanel.html +29 -0
  23. package/src/js/tcmd/components/CommandPanel.js +54 -52
  24. package/src/js/tcmd/components/CommandPanel.xml +38 -24
  25. package/src/js/tcmd/components/Confirm.html +1 -1
  26. package/src/js/tcmd/components/EntryDetail.html +7 -7
  27. package/src/js/tcmd/components/EntryDetail.js +1 -1
  28. package/src/js/tcmd/components/FileList.html +5 -1
  29. package/src/js/tcmd/components/FileList.js +2 -1
  30. package/src/js/tcmd/components/FilePreview.html +14 -3
  31. package/src/js/tcmd/components/FilePreview.js +73 -10
  32. package/src/js/tcmd/components/FilePreview.xml +19 -6
  33. package/src/js/tcmd/components/FileRow.html +1 -1
  34. package/src/js/tcmd/components/FileRow.js +10 -3
  35. package/src/js/tcmd/components/FilterBar.html +1 -1
  36. package/src/js/tcmd/components/FilterBar.js +14 -4
  37. package/src/js/tcmd/components/FilterBar.xml +1 -1
  38. package/src/js/tcmd/{tui/frame.js → components/Frame.js} +120 -91
  39. package/src/js/tcmd/components/Help.html +7 -0
  40. package/src/js/tcmd/components/Help.js +109 -0
  41. package/src/js/tcmd/components/Summary.html +1 -1
  42. package/src/js/tcmd/components/Summary.js +1 -6
  43. package/src/js/tcmd/components/icons.js +39 -5
  44. package/src/js/tcmd/components/index.js +3 -4
  45. package/src/js/tcmd/components/rows.js +37 -33
  46. package/src/js/tcmd/core/commands.js +422 -180
  47. package/src/js/tcmd/core/directory.js +145 -95
  48. package/src/js/tcmd/core/fs.js +29 -2
  49. package/src/js/tcmd/core/history.js +58 -0
  50. package/src/js/tcmd/core/index.js +3 -9
  51. package/src/js/tcmd/core/keymap.js +3 -3
  52. package/src/js/tcmd/core/operations.js +108 -15
  53. package/src/js/tcmd/core/pane.js +31 -8
  54. package/src/js/tcmd/core/panel.js +172 -82
  55. package/src/js/tcmd/core/script.js +7 -95
  56. package/src/js/tcmd/core/selection.js +9 -1
  57. package/src/js/tcmd/core/session.js +280 -152
  58. package/src/js/tcmd/index.js +0 -1
  59. package/src/js/tcmd/tui/app.js +26 -5
  60. package/src/js/tcmd/tui/catalogue.js +6 -19
  61. package/src/js/tcmd/tui/index.js +1 -16
  62. package/src/js/tcmd/tui/theme.js +5 -0
  63. package/src/js/tcmd/web/app.js +158 -32
  64. package/src/js/tcmd/web/bookmarks.js +36 -0
  65. package/src/js/tcmd/web/catalogue.js +45 -39
  66. package/src/js/tcmd/web/effects.js +143 -0
  67. package/src/js/tcmd/web/header.html +1 -1
  68. package/src/js/tcmd/web/header.js +15 -11
  69. package/src/js/tcmd/web/main.js +6 -66
  70. package/src/js/tcmd/web/seed.js +3 -3
  71. package/src/js/tcmd/web/server.js +6 -4
  72. package/src/js/tcmd/web/theme.js +1 -0
  73. package/src/js/tcmd/components/CommandPalette.html +0 -7
  74. package/src/js/tcmd/components/CommandPalette.js +0 -58
  75. package/src/js/tcmd/components/CommandPalette.xml +0 -16
  76. package/src/js/tcmd/components/PaletteRow.html +0 -3
  77. package/src/js/tcmd/components/PaletteRow.js +0 -43
  78. package/src/js/tcmd/components/PaletteRow.xml +0 -4
  79. package/src/js/tcmd/tui/help.js +0 -32
@@ -0,0 +1,901 @@
1
+ /* Project: TinyCommand
2
+ * Author: Sebastien Pierre
3
+ * License: BSD
4
+ * Created: 2026-09-27
5
+ *
6
+ * Styling for the web view (`public/index.html`). The class names are the
7
+ * contract between the shared components and `web/theme.js`; layout only, the
8
+ * component logic never reads styles.
9
+ */
10
+
11
+ /* Palette mirrors tui/theme.js DARK: night-blue surfaces, gold accents,
12
+ saturated orange marks. */
13
+ :root {
14
+ --bg: #0d1526;
15
+ --bg-panel: #111b31;
16
+ --bg-raised: #18233d;
17
+ --bg-cursor: #274a9e;
18
+ --bg-cursor-inactive: #1b2a51;
19
+ --bg-marked: #4a2a0c;
20
+ /* The command panel's argument value fields. */
21
+ --bg-field: #1b2a51;
22
+ --border: #33508f;
23
+ --text: #e6ecff;
24
+ --text-dim: #8fa3d9;
25
+ --accent: #ffc233;
26
+ --accent-soft: #2b3f78;
27
+ --dir: #5c8cff;
28
+ --link: #4fc3ff;
29
+ --dev: #b48eff;
30
+ --mark: #ff7a1a;
31
+ --error: #ff4d5e;
32
+ --warning: #ffb020;
33
+ --tip: #a78bfa;
34
+ /* Brand identity bar gradients (kept in sync with tui/theme.js):
35
+ Tiny stays blue, Cmd gold→saturated orange. */
36
+ --brand-tiny-from: #4088ff;
37
+ --brand-tiny-to: #7cd0ff;
38
+ --brand-cmd-from: #ffc233;
39
+ --brand-cmd-to: #ff7a1a;
40
+ }
41
+
42
+ * {
43
+ box-sizing: border-box;
44
+ }
45
+
46
+ html,
47
+ body,
48
+ #app {
49
+ height: 100%;
50
+ margin: 0;
51
+ }
52
+
53
+ body {
54
+ background: var(--bg);
55
+ color: var(--text);
56
+ font: 13px/1.45 ui-monospace, "SF Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace;
57
+ }
58
+
59
+ .app {
60
+ display: flex;
61
+ flex-direction: column;
62
+ height: 100%;
63
+ outline: none;
64
+ }
65
+
66
+ /* Header --------------------------------------------------------------- */
67
+
68
+ .app-header {
69
+ display: flex;
70
+ align-items: baseline;
71
+ flex: none;
72
+ padding: 0.1rem 0.6rem;
73
+ border-bottom: 1px solid var(--border);
74
+ background: var(--bg-panel);
75
+ color: var(--text);
76
+ font-weight: 600;
77
+ white-space: nowrap;
78
+ overflow: hidden;
79
+ text-overflow: ellipsis;
80
+ }
81
+
82
+ /* Right-hand trail: the view mode and version, dimmer than the brand. */
83
+ .app-header-status {
84
+ flex: none;
85
+ margin-left: auto;
86
+ padding-left: 0.75rem;
87
+ color: var(--text-dim);
88
+ font-weight: 400;
89
+ }
90
+
91
+ /* The mode word shimmers like the brand: explorer along the Tiny blues,
92
+ commander along the Cmd oranges. */
93
+ .app-header-mode {
94
+ font-weight: 600;
95
+ }
96
+
97
+ .app-header-mode.mode-explorer {
98
+ background: linear-gradient(90deg, var(--brand-tiny-from), var(--brand-tiny-to));
99
+ -webkit-background-clip: text;
100
+ background-clip: text;
101
+ color: transparent;
102
+ }
103
+
104
+ .app-header-mode.mode-commander {
105
+ background: linear-gradient(90deg, var(--brand-cmd-from), var(--brand-cmd-to));
106
+ -webkit-background-clip: text;
107
+ background-clip: text;
108
+ color: transparent;
109
+ }
110
+
111
+ /* The brand and host give way (ellipsis) instead of pushing the trail off. */
112
+ .app-header > span:not(.app-header-status) {
113
+ min-width: 0;
114
+ overflow: hidden;
115
+ text-overflow: ellipsis;
116
+ }
117
+
118
+ /* Brand: "Tiny" shimmers along a blue gradient, "Cmd" along a brighter
119
+ orange than the mark accent. */
120
+ .app-header .brand-tiny {
121
+ background: linear-gradient(90deg, var(--brand-tiny-from), var(--brand-tiny-to));
122
+ -webkit-background-clip: text;
123
+ background-clip: text;
124
+ color: transparent;
125
+ }
126
+
127
+ .app-header .brand-cmd {
128
+ background: linear-gradient(90deg, var(--brand-cmd-from), var(--brand-cmd-to));
129
+ -webkit-background-clip: text;
130
+ background-clip: text;
131
+ color: transparent;
132
+ }
133
+
134
+ /* Panes ---------------------------------------------------------------- */
135
+
136
+ .panes {
137
+ display: flex;
138
+ flex: 1;
139
+ min-height: 0;
140
+ gap: 1px;
141
+ background: var(--border);
142
+ }
143
+
144
+ .pane {
145
+ display: flex;
146
+ flex: 1 1 0;
147
+ flex-direction: column;
148
+ min-width: 0;
149
+ min-height: 0;
150
+ background: var(--bg-panel);
151
+ border: 1px solid var(--border);
152
+ }
153
+
154
+ .pane.is-active {
155
+ border-color: var(--accent);
156
+ }
157
+
158
+ /* Explorer mode: the middle (current) column carries the extra width, the
159
+ parent and preview columns stay even. */
160
+ .pane.is-major {
161
+ flex-grow: 1.35;
162
+ }
163
+
164
+ .pane-header {
165
+ display: flex;
166
+ align-items: baseline;
167
+ gap: 0.35rem;
168
+ min-width: 0;
169
+ overflow: hidden;
170
+ white-space: nowrap;
171
+ font-size: 12px;
172
+ flex: none;
173
+ min-height: 1.8rem;
174
+ padding: 0 0.45rem;
175
+ border-bottom: 1px solid var(--border);
176
+ }
177
+
178
+ .pane.is-active .pane-header {
179
+ border-bottom-color: var(--accent);
180
+ }
181
+
182
+ .pane-header > div {
183
+ min-width: 0;
184
+ flex: 1;
185
+ }
186
+
187
+ .pane > [data-slot="list"] {
188
+ display: flex;
189
+ flex: 1;
190
+ min-height: 0;
191
+ }
192
+
193
+ /* Breadcrumbs ---------------------------------------------------------- */
194
+
195
+ .breadcrumbs {
196
+ flex: none;
197
+ display: flex;
198
+ align-items: center;
199
+ gap: 0.15rem;
200
+ padding: 0.3rem 0.1rem;
201
+ overflow: hidden;
202
+ white-space: nowrap;
203
+ font-size: 12px;
204
+ }
205
+
206
+ .crumb {
207
+ color: var(--text-dim);
208
+ text-decoration: none;
209
+ }
210
+
211
+ .crumb:hover {
212
+ color: var(--accent);
213
+ }
214
+
215
+ .crumb.is-root {
216
+ color: var(--text-dim);
217
+ }
218
+
219
+ .crumb .crumb-sep {
220
+ color: var(--border);
221
+ }
222
+
223
+ .crumb-sep:empty {
224
+ display: none;
225
+ }
226
+
227
+ /* File list ------------------------------------------------------------ */
228
+
229
+ .file-list {
230
+ flex: 1;
231
+ min-height: 0;
232
+ overflow: auto;
233
+ margin: 0;
234
+ padding: 0.15rem 0;
235
+ }
236
+
237
+ .file-list ul {
238
+ list-style: none;
239
+ padding: 0;
240
+ margin: 0;
241
+ }
242
+
243
+ .file-list p {
244
+ color: var(--text-dim);
245
+ white-space: pre;
246
+ }
247
+
248
+ .file-row {
249
+ display: grid;
250
+ grid-template-columns: 1.1rem minmax(0, 1fr) auto;
251
+ gap: 0.4rem;
252
+ align-items: baseline;
253
+ padding: 0 0.35rem;
254
+ white-space: nowrap;
255
+ cursor: pointer;
256
+ }
257
+
258
+ .file-row:hover {
259
+ background: var(--bg-raised);
260
+ }
261
+
262
+ .file-row.is-current {
263
+ background: var(--bg-cursor);
264
+ }
265
+
266
+ .file-row.is-current[data-active="false"] {
267
+ background: var(--bg-cursor-inactive);
268
+ }
269
+
270
+ .file-row[data-marked="true"]:not(.is-current) {
271
+ background: var(--bg-marked);
272
+ }
273
+
274
+ .marker {
275
+ color: var(--accent);
276
+ white-space: pre;
277
+ }
278
+
279
+ .file-row[data-marked="true"] .marker {
280
+ color: var(--mark);
281
+ }
282
+
283
+ .name {
284
+ overflow: hidden;
285
+ text-overflow: ellipsis;
286
+ }
287
+
288
+ .name.is-dir {
289
+ color: var(--dir);
290
+ font-weight: 600;
291
+ }
292
+
293
+ .file-row[data-kind="link"] .name {
294
+ color: var(--link);
295
+ }
296
+
297
+ .file-row[data-kind="dev"] .name {
298
+ color: var(--dev);
299
+ }
300
+
301
+ .file-row.is-current .name {
302
+ color: var(--text);
303
+ }
304
+
305
+ .file-row[data-marked="true"] .name {
306
+ color: var(--mark);
307
+ }
308
+
309
+ .size {
310
+ color: var(--text-dim);
311
+ font-variant-numeric: tabular-nums;
312
+ }
313
+
314
+ /* Entry detail ---------------------------------------------------------- */
315
+
316
+ .entry-detail {
317
+ border-top: 1px solid var(--border);
318
+ padding: 0.2rem 0.45rem 0;
319
+ }
320
+
321
+ .entry-detail-line {
322
+ display: flex;
323
+ min-width: 0;
324
+ white-space: pre;
325
+ overflow: hidden;
326
+ }
327
+
328
+ .entry-detail-line > span {
329
+ flex: none;
330
+ }
331
+
332
+ .entry-detail-line .entry-detail-spacer {
333
+ flex: 1;
334
+ min-width: 1ch;
335
+ }
336
+
337
+ .entry-detail-sep {
338
+ color: var(--text-dim);
339
+ }
340
+
341
+ .entry-detail-type.is-directory {
342
+ color: var(--dir);
343
+ }
344
+
345
+ .entry-detail-type.is-symlink {
346
+ color: var(--link);
347
+ }
348
+
349
+ .entry-detail-type.is-device {
350
+ color: var(--dev);
351
+ }
352
+
353
+ .entry-detail-mode {
354
+ color: var(--accent);
355
+ }
356
+
357
+ .entry-detail-marked {
358
+ color: var(--mark);
359
+ }
360
+
361
+ /* Summary -------------------------------------------------------------- */
362
+
363
+ .summary {
364
+ flex: none;
365
+ padding: 0.25rem 0.45rem;
366
+ color: var(--text-dim);
367
+ white-space: pre;
368
+ overflow: hidden;
369
+ text-overflow: ellipsis;
370
+ }
371
+
372
+ /* Filter bar ----------------------------------------------------------- */
373
+
374
+ .filter-bar {
375
+ flex: none;
376
+ display: flex;
377
+ align-items: center;
378
+ gap: 0.4rem;
379
+ padding: 0.2rem 0.1rem;
380
+ color: var(--text-dim);
381
+ font-size: 11px;
382
+ }
383
+
384
+ .filter-prompt {
385
+ flex: none;
386
+ color: var(--text-dim);
387
+ }
388
+
389
+ .filter-label {
390
+ flex: 1;
391
+ min-width: 0;
392
+ overflow: hidden;
393
+ text-overflow: ellipsis;
394
+ white-space: nowrap;
395
+ color: var(--accent);
396
+ }
397
+
398
+ .filter-alert {
399
+ flex: none;
400
+ color: var(--error);
401
+ }
402
+
403
+ .filter-input {
404
+ flex: 1;
405
+ min-width: 0;
406
+ background: transparent;
407
+ border: none;
408
+ outline: none;
409
+ color: var(--text);
410
+ font: inherit;
411
+ font-size: 12px;
412
+ }
413
+
414
+ /* Preview -------------------------------------------------------------- */
415
+
416
+ [data-slot="inspector"] {
417
+ display: flex;
418
+ flex: 1 1 0;
419
+ min-width: 0;
420
+ min-height: 0;
421
+ }
422
+
423
+ /* The maximized inspector (`⇧V`): the preview fills the whole pane row. */
424
+ .preview-max {
425
+ display: flex;
426
+ flex: 1 1 0;
427
+ min-width: 0;
428
+ min-height: 0;
429
+ }
430
+
431
+ .preview {
432
+ display: flex;
433
+ flex: 1;
434
+ flex-direction: column;
435
+ min-width: 0;
436
+ min-height: 0;
437
+ padding: 0.35rem 0.5rem;
438
+ background: var(--bg);
439
+ border: 1px solid var(--border);
440
+ }
441
+
442
+ .preview > header {
443
+ color: var(--text);
444
+ border-bottom: 1px solid var(--border);
445
+ padding-bottom: 0.3rem;
446
+ white-space: nowrap;
447
+ overflow: hidden;
448
+ text-overflow: ellipsis;
449
+ }
450
+
451
+ /* The inspector's directory column: breadcrumbs over the listing, laid out
452
+ like a pane header so a previewed directory reads as a pane. */
453
+ .preview > .pane-header {
454
+ flex: none;
455
+ border-bottom: 1px solid var(--border);
456
+ padding-left: 0;
457
+ padding-right: 0;
458
+ }
459
+
460
+ .preview-list {
461
+ display: flex;
462
+ flex: 1;
463
+ min-height: 0;
464
+ }
465
+
466
+ .preview-text,
467
+ .preview-card {
468
+ flex: 1;
469
+ min-height: 0;
470
+ margin: 0;
471
+ overflow: auto;
472
+ white-space: pre-wrap;
473
+ overflow-wrap: anywhere;
474
+ font: inherit;
475
+ font-size: 12px;
476
+ }
477
+
478
+ .preview-card {
479
+ color: var(--text-dim);
480
+ }
481
+
482
+ .preview-actions {
483
+ flex: none;
484
+ /* The rule that separates the shortcuts from the contents above them. */
485
+ border-top: 1px solid var(--border);
486
+ padding-top: 0.35rem;
487
+ color: var(--text-dim);
488
+ font-size: 11px;
489
+ }
490
+
491
+ /* Command bar ---------------------------------------------------------- */
492
+
493
+ .command-bar {
494
+ flex: none;
495
+ display: flex;
496
+ align-items: center;
497
+ justify-content: space-between;
498
+ gap: 0.75rem;
499
+ min-height: 1.9rem;
500
+ padding: 0.25rem 0.6rem;
501
+ border-top: 1px solid var(--border);
502
+ background: var(--bg-panel);
503
+ overflow: hidden;
504
+ }
505
+
506
+ .command-bar-keys {
507
+ display: flex;
508
+ flex-wrap: wrap;
509
+ gap: 0.45rem;
510
+ }
511
+
512
+ .command-key {
513
+ background: var(--bg-raised);
514
+ border: 1px solid var(--border);
515
+ border-radius: 4px;
516
+ color: var(--text-dim);
517
+ cursor: pointer;
518
+ font: inherit;
519
+ font-size: 11px;
520
+ padding: 0.05rem 0.4rem;
521
+ }
522
+
523
+ .command-key:hover {
524
+ color: var(--text);
525
+ border-color: var(--accent-soft);
526
+ }
527
+
528
+ .command-key:disabled {
529
+ background: transparent;
530
+ border-color: transparent;
531
+ cursor: default;
532
+ }
533
+
534
+ button:focus-visible,
535
+ input:focus-visible {
536
+ outline: 1px solid var(--accent);
537
+ outline-offset: 2px;
538
+ }
539
+
540
+ .command-bar .is-error {
541
+ color: var(--error);
542
+ }
543
+
544
+ .command-bar [data-kind="warning"] {
545
+ color: var(--warning);
546
+ }
547
+
548
+ .command-bar [data-kind="tip"] {
549
+ color: var(--tip);
550
+ }
551
+
552
+ /* Confirm -------------------------------------------------------------- */
553
+
554
+ .confirm {
555
+ position: fixed;
556
+ inset: 0;
557
+ z-index: 20;
558
+ display: flex;
559
+ align-items: center;
560
+ justify-content: center;
561
+ background: rgb(0 0 0 / 45%);
562
+ }
563
+
564
+ .confirm p {
565
+ max-width: min(560px, 90vw);
566
+ margin: 0;
567
+ padding: 0.6rem 0.9rem;
568
+ background: var(--bg-panel);
569
+ border: 1px solid var(--error);
570
+ border-radius: 6px;
571
+ pointer-events: auto;
572
+ }
573
+
574
+ /* Modal presentations -------------------------------------------------- */
575
+
576
+ .command-panel,
577
+ .bookmark-list,
578
+ .help,
579
+ .viewer {
580
+ position: fixed;
581
+ inset: 0;
582
+ z-index: 15;
583
+ display: flex;
584
+ align-items: center;
585
+ justify-content: center;
586
+ padding: 1rem;
587
+ background: rgb(0 0 0 / 45%);
588
+ }
589
+
590
+ .help {
591
+ z-index: 30;
592
+ }
593
+
594
+ .command-dialog,
595
+ .bookmark-dialog,
596
+ .help-dialog {
597
+ display: flex;
598
+ flex-direction: column;
599
+ width: min(900px, 95vw);
600
+ max-height: 85vh;
601
+ min-height: 0;
602
+ padding: 0.6rem;
603
+ border: 1px solid var(--accent);
604
+ border-radius: 6px;
605
+ background: var(--bg-panel);
606
+ }
607
+
608
+ .command-dialog {
609
+ height: 72vh;
610
+ }
611
+
612
+ .bookmark-dialog,
613
+ .help-dialog {
614
+ width: min(640px, 95vw);
615
+ }
616
+
617
+ .command-dialog > header,
618
+ .help-dialog > header,
619
+ .bookmark-dialog h2 {
620
+ color: var(--text);
621
+ font: inherit;
622
+ font-weight: 600;
623
+ margin: 0 0 0.4rem;
624
+ }
625
+
626
+ .panel-query-line,
627
+ .panel-value-line,
628
+ .bookmark-dialog > header {
629
+ display: flex;
630
+ align-items: center;
631
+ gap: 0.5rem;
632
+ padding: 0.3rem 0;
633
+ }
634
+
635
+ /* The left pane: the `:` filter over the grouped command list. */
636
+ .panel-command-column {
637
+ display: flex;
638
+ flex-direction: column;
639
+ min-height: 0;
640
+ }
641
+
642
+ .panel-query,
643
+ .panel-value {
644
+ background: transparent;
645
+ border: none;
646
+ color: var(--text);
647
+ font: inherit;
648
+ min-width: 2ch;
649
+ }
650
+
651
+ /* The right pane's header: the selected command's name. */
652
+ .panel-command-name {
653
+ margin: 0;
654
+ padding: 0.3rem 0.6rem;
655
+ color: var(--text);
656
+ font-weight: 600;
657
+ }
658
+
659
+ /* The resolved command, dim, at the foot of the argument pane. */
660
+ .panel-runs {
661
+ margin-top: auto;
662
+ padding: 0.4rem 0.6rem 0.2rem;
663
+ color: var(--text-dim);
664
+ overflow: auto;
665
+ max-height: 20vh;
666
+ border-top: 1px solid var(--border);
667
+ }
668
+
669
+ .panel-runs pre {
670
+ margin: 0;
671
+ white-space: pre-wrap;
672
+ overflow-wrap: anywhere;
673
+ font: inherit;
674
+ }
675
+
676
+ /* The argument pane's rows: an aligned label + boxed value field for an
677
+ argument, and a bordered list of selected paths under a selection. */
678
+ .panel-row[data-type="arg"] .panel-name {
679
+ white-space: pre;
680
+ color: var(--text-dim);
681
+ }
682
+
683
+ .panel-row[data-type="arg"].is-focused .panel-name {
684
+ color: var(--accent);
685
+ }
686
+
687
+ .panel-field {
688
+ display: inline-flex;
689
+ align-items: baseline;
690
+ flex: 1;
691
+ min-width: 0;
692
+ background: var(--bg-field);
693
+ border-radius: 3px;
694
+ padding: 0 0.25rem;
695
+ }
696
+
697
+ .panel-field-bracket {
698
+ color: var(--text-dim);
699
+ }
700
+
701
+ .panel-field-value {
702
+ flex: 1;
703
+ min-width: 0;
704
+ overflow: hidden;
705
+ text-overflow: ellipsis;
706
+ white-space: pre;
707
+ color: var(--text);
708
+ }
709
+
710
+ .panel-field .panel-value {
711
+ flex: 1;
712
+ min-width: 0;
713
+ background: transparent;
714
+ border: none;
715
+ color: var(--text);
716
+ font: inherit;
717
+ }
718
+
719
+ .panel-list-indent {
720
+ white-space: pre;
721
+ }
722
+
723
+ .panel-list-box {
724
+ display: inline-flex;
725
+ align-items: baseline;
726
+ gap: 0.5rem;
727
+ flex: 1;
728
+ min-width: 0;
729
+ border-left: 1px solid var(--border);
730
+ border-right: 1px solid var(--border);
731
+ padding: 0 0.4rem;
732
+ }
733
+
734
+ .panel-row.is-list-top .panel-list-box {
735
+ border-top: 1px solid var(--border);
736
+ border-top-left-radius: 4px;
737
+ border-top-right-radius: 4px;
738
+ }
739
+
740
+ .panel-row.is-list-bottom .panel-list-box {
741
+ border-bottom: 1px solid var(--border);
742
+ border-bottom-left-radius: 4px;
743
+ border-bottom-right-radius: 4px;
744
+ }
745
+
746
+ .panel-query,
747
+ .panel-value,
748
+ .bookmark-query {
749
+ flex: 1;
750
+ min-width: 0;
751
+ background: transparent;
752
+ border: none;
753
+ color: var(--text);
754
+ font: inherit;
755
+ }
756
+
757
+ .panel-columns {
758
+ display: grid;
759
+ grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);
760
+ flex: 1;
761
+ min-height: 0;
762
+ border-top: 1px solid var(--border);
763
+ border-bottom: 1px solid var(--border);
764
+ }
765
+
766
+ .panel-ops,
767
+ .panel-args,
768
+ .bookmark-rows {
769
+ list-style: none;
770
+ margin: 0;
771
+ padding: 0.3rem 0;
772
+ overflow: auto;
773
+ min-height: 0;
774
+ }
775
+
776
+ /* The argument column: an empty state (a TinyCmd action binds no arguments)
777
+ above the rows, with the divider on the column rather than the list so both
778
+ stay visible. */
779
+ .panel-args-column {
780
+ display: flex;
781
+ flex-direction: column;
782
+ min-height: 0;
783
+ border-left: 1px solid var(--border);
784
+ }
785
+
786
+ .panel-args-empty {
787
+ margin: 0;
788
+ padding: 0.3rem 0.6rem;
789
+ color: var(--text-dim);
790
+ font-style: italic;
791
+ }
792
+
793
+ /* File picker sub-mode: the browsed path, its filter, then the entry rows
794
+ (which reuse `.panel-row` through the shared arg-row map). */
795
+ .panel-picker {
796
+ display: flex;
797
+ flex-direction: column;
798
+ gap: 0.15rem;
799
+ padding: 0.3rem 0.6rem;
800
+ border-bottom: 1px solid var(--border);
801
+ }
802
+
803
+ .panel-picker-path {
804
+ margin: 0;
805
+ color: var(--text-dim);
806
+ overflow: hidden;
807
+ text-overflow: ellipsis;
808
+ white-space: nowrap;
809
+ }
810
+
811
+ .panel-picker-line {
812
+ display: flex;
813
+ align-items: center;
814
+ gap: 0.5rem;
815
+ }
816
+
817
+ .panel-picker-query {
818
+ flex: 1;
819
+ min-width: 0;
820
+ background: transparent;
821
+ border: none;
822
+ color: var(--text);
823
+ font: inherit;
824
+ }
825
+
826
+ .panel-row,
827
+ .bookmark-row {
828
+ display: flex;
829
+ align-items: baseline;
830
+ gap: 0.5rem;
831
+ padding: 0.15rem 0.3rem;
832
+ white-space: nowrap;
833
+ cursor: pointer;
834
+ }
835
+
836
+ .panel-row.is-focused,
837
+ .bookmark-row.is-selected {
838
+ background: var(--accent-soft);
839
+ }
840
+
841
+ .panel-marker,
842
+ .bookmark-marker {
843
+ color: var(--accent);
844
+ white-space: pre;
845
+ }
846
+
847
+ .panel-summary,
848
+ .bookmark-path {
849
+ color: var(--text-dim);
850
+ min-width: 0;
851
+ overflow: hidden;
852
+ text-overflow: ellipsis;
853
+ }
854
+
855
+ .panel-row.is-focused .panel-name {
856
+ color: var(--accent);
857
+ }
858
+
859
+ .panel-row[data-risk="destructive"] .panel-name {
860
+ color: var(--error);
861
+ }
862
+
863
+ .panel-row[data-risk="caution"] .panel-name {
864
+ color: var(--warning);
865
+ }
866
+
867
+ .panel-row[data-selected="true"]:not(.is-focused) .panel-name {
868
+ color: var(--mark);
869
+ }
870
+
871
+ .command-dialog > footer,
872
+ .bookmark-dialog > footer,
873
+ .help-dialog > footer,
874
+ .bookmark-target,
875
+ .bookmark-empty {
876
+ color: var(--text-dim);
877
+ padding-top: 0.3rem;
878
+ }
879
+
880
+ .help-dialog pre {
881
+ font: inherit;
882
+ overflow: auto;
883
+ min-height: 0;
884
+ }
885
+
886
+ .viewer > .preview {
887
+ flex: none;
888
+ width: 90%;
889
+ height: 90%;
890
+ }
891
+
892
+ .resize-hint {
893
+ flex: 1;
894
+ display: flex;
895
+ flex-direction: column;
896
+ align-items: center;
897
+ justify-content: center;
898
+ color: var(--text-dim);
899
+ }
900
+
901
+ /* EOF */