fpasoterm 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of fpasoterm might be problematic. Click here for more details.

Files changed (101) hide show
  1. package/CHANGELOG.md +230 -0
  2. package/CONTRIBUTING.md +67 -0
  3. package/INSTALL.ja.md +204 -0
  4. package/INSTALL.md +229 -0
  5. package/LICENSE +21 -0
  6. package/README.ja.md +389 -0
  7. package/README.md +607 -0
  8. package/bin/fpasoterm +2882 -0
  9. package/completions/_fpasoterm +81 -0
  10. package/completions/fpasoterm.bash +55 -0
  11. package/completions/fpasoterm.fish +64 -0
  12. package/completions/fpasoterm.ps1 +47 -0
  13. package/docs/capability-diagnostics.en.md +77 -0
  14. package/docs/capability-diagnostics.ja.md +63 -0
  15. package/docs/completion.en.md +141 -0
  16. package/docs/completion.ja.md +113 -0
  17. package/docs/config.en.md +554 -0
  18. package/docs/config.ja.md +544 -0
  19. package/docs/debugging.en.md +72 -0
  20. package/docs/debugging.ja.md +66 -0
  21. package/docs/diagnostics.en.md +69 -0
  22. package/docs/diagnostics.ja.md +64 -0
  23. package/docs/font-diagnostics.en.md +116 -0
  24. package/docs/font-diagnostics.ja.md +105 -0
  25. package/docs/fpasoterm-plugin.d.ts +51 -0
  26. package/docs/known-issues.en.md +23 -0
  27. package/docs/known-issues.ja.md +23 -0
  28. package/docs/plugins.en.md +266 -0
  29. package/docs/plugins.ja.md +176 -0
  30. package/docs/pr-review.en.md +177 -0
  31. package/docs/pr-review.ja.md +170 -0
  32. package/docs/release-checklist.en.md +72 -0
  33. package/docs/release-checklist.ja.md +71 -0
  34. package/docs/security.en.md +36 -0
  35. package/docs/security.ja.md +31 -0
  36. package/docs/spec.en.md +106 -0
  37. package/docs/spec.ja.md +99 -0
  38. package/docs/sshfs.en.md +28 -0
  39. package/docs/sshfs.ja.md +28 -0
  40. package/docs/sync.en.md +280 -0
  41. package/docs/sync.ja.md +280 -0
  42. package/examples/apply-default-appearance.bat +8 -0
  43. package/examples/apply-default-appearance.ps1 +7 -0
  44. package/examples/apply-default-appearance.sh +7 -0
  45. package/examples/apply-runtime-appearance.bat +8 -0
  46. package/examples/apply-runtime-appearance.ps1 +7 -0
  47. package/examples/apply-runtime-appearance.sh +7 -0
  48. package/examples/config/default-appearance.toml +36 -0
  49. package/examples/config/minimal.toml +30 -0
  50. package/examples/config/profiles.toml +20 -0
  51. package/examples/config/runtime-appearance.toml +24 -0
  52. package/examples/config/sync-folder.toml +17 -0
  53. package/examples/config/tui-compatibility.toml +7 -0
  54. package/examples/config/with-plugins.toml +33 -0
  55. package/examples/plugins/hello.ts +17 -0
  56. package/examples/plugins/status-banner.ts +14 -0
  57. package/examples/plugins/theme.ts +32 -0
  58. package/examples/plugins/welcome-banner.ts +16 -0
  59. package/extra/linux/icons/hicolor/128x128/apps/fpasoterm.png +0 -0
  60. package/extra/linux/icons/hicolor/16x16/apps/fpasoterm.png +0 -0
  61. package/extra/linux/icons/hicolor/192x192/apps/fpasoterm.png +0 -0
  62. package/extra/linux/icons/hicolor/256x256/apps/fpasoterm.png +0 -0
  63. package/extra/linux/icons/hicolor/32x32/apps/fpasoterm.png +0 -0
  64. package/extra/linux/icons/hicolor/48x48/apps/fpasoterm.png +0 -0
  65. package/extra/linux/icons/hicolor/512x512/apps/fpasoterm.png +0 -0
  66. package/extra/linux/icons/hicolor/64x64/apps/fpasoterm.png +0 -0
  67. package/extra/linux/io.github.oyoguhito.fpasoterm.desktop +10 -0
  68. package/extra/logo/fpasoterm.png +0 -0
  69. package/extra/macos/fpasoterm.icns +0 -0
  70. package/extra/windows/fpasoterm.cmd +40 -0
  71. package/extra/windows/fpasoterm.ico +0 -0
  72. package/package.json +81 -0
  73. package/scripts/build-artifacts.js +183 -0
  74. package/scripts/generate-icon.js +251 -0
  75. package/scripts/init-jj-empty-main +41 -0
  76. package/scripts/install-linux-desktop.js +238 -0
  77. package/scripts/run +16 -0
  78. package/scripts/security/scan-secrets.js +89 -0
  79. package/scripts/tests/smoke.js +2476 -0
  80. package/scripts/uninstall-desktop.js +20 -0
  81. package/scripts/uninstall-linux-desktop.js +96 -0
  82. package/scripts/uninstall-windows-path.js +94 -0
  83. package/src/config.js +855 -0
  84. package/src/renderer/confirm.html +71 -0
  85. package/src/renderer/index.html +223 -0
  86. package/src/renderer/renderer.js +4166 -0
  87. package/src/renderer/styles.css +969 -0
  88. package/src/renderer/vendor/addon-fit/addon-fit.js +2 -0
  89. package/src/renderer/vendor/addon-image/LICENSE +19 -0
  90. package/src/renderer/vendor/addon-image/addon-image.js +3 -0
  91. package/src/renderer/vendor/addon-web-links/LICENSE +19 -0
  92. package/src/renderer/vendor/addon-web-links/addon-web-links.js +2 -0
  93. package/src/renderer/vendor/xterm/xterm.css +292 -0
  94. package/src/renderer/vendor/xterm/xterm.js +2 -0
  95. package/src-tauri/Cargo.lock +5253 -0
  96. package/src-tauri/Cargo.toml +29 -0
  97. package/src-tauri/build.rs +140 -0
  98. package/src-tauri/capabilities/default.json +13 -0
  99. package/src-tauri/default-config.toml +128 -0
  100. package/src-tauri/src/main.rs +9347 -0
  101. package/src-tauri/tauri.conf.json +60 -0
@@ -0,0 +1,969 @@
1
+ :root {
2
+ --titlebar-height: 34px;
3
+ --titlebar-background: #1565c0;
4
+ color-scheme: dark;
5
+ background: rgba(0, 0, 0, 0);
6
+ }
7
+
8
+ * {
9
+ box-sizing: border-box;
10
+ }
11
+
12
+ html,
13
+ body {
14
+ width: 100%;
15
+ height: 100%;
16
+ margin: 0;
17
+ background: rgba(0, 0, 0, 0);
18
+ }
19
+
20
+ body {
21
+ display: grid;
22
+ grid-template-rows: var(--titlebar-height) minmax(0, 1fr);
23
+ overflow: hidden;
24
+ color: #e8edf2;
25
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
26
+ }
27
+
28
+ #drag-region {
29
+ position: relative;
30
+ z-index: 10000;
31
+ display: flex;
32
+ align-items: center;
33
+ min-width: 0;
34
+ height: var(--titlebar-height);
35
+ pointer-events: auto;
36
+ background: var(--titlebar-background);
37
+ color: #e8edf2;
38
+ font: 12px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
39
+ line-height: var(--titlebar-height);
40
+ padding: 0 8px 0 10px;
41
+ text-align: left;
42
+ user-select: none;
43
+ app-region: drag;
44
+ -webkit-app-region: drag;
45
+ }
46
+
47
+ #window-title {
48
+ flex: 1 1 auto;
49
+ min-width: 0;
50
+ overflow: hidden;
51
+ text-overflow: ellipsis;
52
+ white-space: nowrap;
53
+ pointer-events: none;
54
+ app-region: drag;
55
+ -webkit-app-region: drag;
56
+ }
57
+
58
+ #ime-status {
59
+ position: fixed;
60
+ z-index: 10025;
61
+ right: 8px;
62
+ bottom: 8px;
63
+ max-width: calc(100vw - 16px);
64
+ padding: 3px 7px;
65
+ overflow: hidden;
66
+ border: 1px solid #f5d76e;
67
+ border-radius: 4px;
68
+ background: rgba(16, 19, 23, 0.94);
69
+ overflow: hidden;
70
+ color: #f5d76e;
71
+ font-weight: 700;
72
+ text-decoration: underline;
73
+ text-decoration-thickness: 2px;
74
+ text-underline-offset: 2px;
75
+ text-overflow: ellipsis;
76
+ white-space: nowrap;
77
+ pointer-events: none;
78
+ app-region: no-drag;
79
+ -webkit-app-region: no-drag;
80
+ }
81
+
82
+ #ime-status[hidden] {
83
+ display: none;
84
+ }
85
+
86
+ #window-controls {
87
+ position: relative;
88
+ display: flex;
89
+ flex: 0 0 auto;
90
+ gap: 6px;
91
+ app-region: no-drag;
92
+ -webkit-app-region: no-drag;
93
+ }
94
+
95
+ #terminal-log-status,
96
+ #sshfs-mount-status {
97
+ margin-left: 6px;
98
+ color: #f5d76e;
99
+ line-height: 24px;
100
+ white-space: nowrap;
101
+ }
102
+
103
+ #terminal-log-status[hidden],
104
+ #sshfs-mount-status[hidden] {
105
+ display: none;
106
+ }
107
+
108
+ #window-controls button {
109
+ width: 24px;
110
+ height: 24px;
111
+ padding: 0;
112
+ border: 1px solid rgba(255, 255, 255, 0.54);
113
+ border-radius: 4px;
114
+ background: rgba(0, 0, 0, 0.18);
115
+ color: #e8edf2;
116
+ font: inherit;
117
+ line-height: 20px;
118
+ app-region: no-drag;
119
+ -webkit-app-region: no-drag;
120
+ }
121
+
122
+ #window-controls button:focus,
123
+ #window-controls button:focus-visible {
124
+ outline: 2px solid #f5d76e;
125
+ outline-offset: 1px;
126
+ border-color: #f5d76e;
127
+ background: rgba(0, 0, 0, 0.42);
128
+ }
129
+
130
+ #window-menu-items[hidden] {
131
+ display: none;
132
+ }
133
+
134
+ #window-menu {
135
+ position: relative;
136
+ display: flex;
137
+ align-items: center;
138
+ height: 24px;
139
+ app-region: no-drag;
140
+ -webkit-app-region: no-drag;
141
+ }
142
+
143
+ #window-menu-toggle {
144
+ width: 28px;
145
+ padding: 0;
146
+ font-size: 16px;
147
+ }
148
+
149
+ #window-menu-items {
150
+ position: absolute;
151
+ top: 28px;
152
+ right: 0;
153
+ z-index: 10020;
154
+ display: grid;
155
+ min-width: 128px;
156
+ max-width: calc(100vw - 12px);
157
+ max-height: calc(100vh - var(--titlebar-height) - 8px);
158
+ gap: 4px;
159
+ padding: 6px;
160
+ overflow-x: hidden;
161
+ overflow-y: auto;
162
+ overscroll-behavior: contain;
163
+ border: 1px solid rgba(255, 255, 255, 0.34);
164
+ border-radius: 6px;
165
+ background: rgba(17, 21, 26, 0.96);
166
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.36);
167
+ app-region: no-drag;
168
+ -webkit-app-region: no-drag;
169
+ }
170
+
171
+ #window-menu-items button {
172
+ width: 100%;
173
+ min-width: 0;
174
+ padding: 0 8px;
175
+ text-align: left;
176
+ white-space: nowrap;
177
+ }
178
+
179
+ .window-menu-submenu {
180
+ display: grid;
181
+ gap: 4px;
182
+ }
183
+
184
+ /* The submenu layout rule otherwise overrides the HTML hidden attribute. */
185
+ .window-menu-submenu[hidden] {
186
+ display: none;
187
+ }
188
+
189
+ #window-menu-items .window-menu-submenu-toggle::after {
190
+ content: ">";
191
+ float: right;
192
+ }
193
+
194
+ #window-menu-items .window-menu-submenu-toggle[aria-expanded="true"]::after {
195
+ content: "v";
196
+ }
197
+
198
+ .window-menu-submenu-items {
199
+ display: grid;
200
+ gap: 4px;
201
+ margin-left: 8px;
202
+ padding-left: 6px;
203
+ border-left: 1px solid rgba(255, 255, 255, 0.24);
204
+ }
205
+
206
+ .window-menu-submenu-items[hidden] {
207
+ display: none;
208
+ }
209
+
210
+ #keybinding-prefix {
211
+ padding: 1px 8px 5px;
212
+ border-bottom: 1px solid rgba(255, 255, 255, 0.24);
213
+ color: #c7d3df;
214
+ font-size: 11px;
215
+ line-height: 16px;
216
+ white-space: nowrap;
217
+ }
218
+
219
+ #window-controls button[hidden] {
220
+ display: none;
221
+ }
222
+
223
+ #window-controls button:hover {
224
+ background: rgba(255, 255, 255, 0.20);
225
+ }
226
+
227
+ #close-window:hover {
228
+ background: rgba(255, 107, 107, 0.42);
229
+ }
230
+
231
+ #terminal {
232
+ position: relative;
233
+ min-width: 0;
234
+ min-height: 0;
235
+ overflow: hidden;
236
+ padding: 0 0 8px;
237
+ background: transparent;
238
+ app-region: no-drag;
239
+ -webkit-app-region: no-drag;
240
+ }
241
+
242
+ #terminal.terminal-error {
243
+ padding: 16px;
244
+ color: #ffb4b4;
245
+ font: 13px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
246
+ white-space: pre-wrap;
247
+ }
248
+
249
+ /* Mirrors marked IME text when a platform WebView keeps it only in xterm's
250
+ * hidden textarea. This is visual-only and never writes to the PTY. */
251
+ #ime-preedit {
252
+ position: fixed;
253
+ z-index: 10010;
254
+ max-width: calc(100vw - 12px);
255
+ overflow: hidden;
256
+ padding: 0 2px;
257
+ border-bottom: 1px solid #f5d76e;
258
+ background: rgba(16, 19, 23, 0.82);
259
+ color: #ffffff;
260
+ pointer-events: none;
261
+ text-overflow: clip;
262
+ white-space: pre;
263
+ }
264
+
265
+ #ime-preedit::before {
266
+ content: "IME ";
267
+ color: #f5d76e;
268
+ font-weight: 700;
269
+ }
270
+
271
+ #ime-preedit[hidden] {
272
+ display: none;
273
+ }
274
+
275
+ .terminal-broadcast-card {
276
+ width: 100%;
277
+ max-width: 100%;
278
+ max-height: calc(100dvh - 32px);
279
+ overflow: auto;
280
+ }
281
+
282
+ /* Keep Broadcast out of body's grid flow. Without this fixed overlay, WebKit on
283
+ * macOS can place the dialog in an implicit grid column beyond the right edge. */
284
+ #terminal-broadcast-dialog {
285
+ position: fixed;
286
+ right: 8px;
287
+ bottom: 8px;
288
+ z-index: 10030;
289
+ width: min(760px, calc(100dvw - 16px));
290
+ max-height: calc(100dvh - var(--titlebar-height) - 16px);
291
+ overflow: visible;
292
+ app-region: no-drag;
293
+ -webkit-app-region: no-drag;
294
+ }
295
+
296
+ #terminal-broadcast-dialog[hidden] {
297
+ display: none;
298
+ }
299
+
300
+ #terminal-broadcast-text {
301
+ width: 100%;
302
+ min-height: 140px;
303
+ resize: vertical;
304
+ border: 1px solid #5a7088;
305
+ border-radius: 4px;
306
+ background: #11151a;
307
+ color: #e8edf2;
308
+ font: 13px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
309
+ padding: 8px;
310
+ }
311
+
312
+ #terminal-broadcast-hint {
313
+ margin-top: 4px;
314
+ color: #aebdca;
315
+ font: 12px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
316
+ }
317
+
318
+ #terminal-broadcast-focus-status {
319
+ margin-top: 4px;
320
+ color: #f5d76e;
321
+ font: 12px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
322
+ }
323
+
324
+ #terminal-broadcast-dialog :is(textarea, select, button, input):focus,
325
+ #terminal-broadcast-dialog :is(textarea, select, button, input):focus-visible,
326
+ #terminal-broadcast-dialog :is(textarea, select, button, input).keyboard-focus {
327
+ outline: 3px solid #f5d76e;
328
+ outline-offset: 2px;
329
+ border-color: #f5d76e;
330
+ background: #314156;
331
+ box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.92), 0 0 0 5px rgba(245, 215, 110, 0.62);
332
+ }
333
+
334
+ #terminal-broadcast-target-list label:focus-within,
335
+ #terminal-broadcast-target-list label.keyboard-focus {
336
+ background: rgba(245, 215, 110, 0.14);
337
+ outline: 3px solid #f5d76e;
338
+ outline-offset: 1px;
339
+ }
340
+
341
+ #terminal-broadcast-control-picker {
342
+ display: flex;
343
+ flex-wrap: wrap;
344
+ align-items: center;
345
+ gap: 8px;
346
+ margin-top: 10px;
347
+ color: #d8e4f0;
348
+ font: 12px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
349
+ }
350
+
351
+ #terminal-broadcast-control-picker label {
352
+ display: flex;
353
+ align-items: center;
354
+ gap: 6px;
355
+ }
356
+
357
+ #terminal-broadcast-control,
358
+ #terminal-broadcast-control-insert {
359
+ height: 24px;
360
+ border: 1px solid #3b4652;
361
+ border-radius: 4px;
362
+ background: #222932;
363
+ color: #e8edf2;
364
+ font: inherit;
365
+ }
366
+
367
+ #terminal-broadcast-control-status {
368
+ color: #f5d76e;
369
+ }
370
+
371
+ #terminal-broadcast-sync-label {
372
+ display: block;
373
+ margin: 10px 0;
374
+ color: #d8e4f0;
375
+ font-size: 12px;
376
+ }
377
+
378
+ #terminal-broadcast-targets {
379
+ margin: 10px 0 0;
380
+ border: 1px solid #5a7088;
381
+ border-radius: 4px;
382
+ color: #d8e4f0;
383
+ }
384
+
385
+ #terminal-broadcast-target-list {
386
+ display: grid;
387
+ gap: 4px;
388
+ max-height: 132px;
389
+ overflow: auto;
390
+ }
391
+
392
+ #terminal-broadcast-target-list label {
393
+ display: flex;
394
+ gap: 7px;
395
+ align-items: center;
396
+ overflow-wrap: anywhere;
397
+ }
398
+
399
+ .terminal-broadcast-target-actions {
400
+ display: flex;
401
+ gap: 8px;
402
+ margin-top: 8px;
403
+ }
404
+
405
+ #terminal-mirror {
406
+ position: fixed;
407
+ top: calc(var(--titlebar-height) + 8px);
408
+ right: 8px;
409
+ left: 8px;
410
+ z-index: 9;
411
+ max-height: min(34vh, 260px);
412
+ margin: 0;
413
+ overflow: auto;
414
+ padding: 8px;
415
+ border: 1px solid #41546a;
416
+ border-radius: 6px;
417
+ background: rgba(10, 14, 18, 0.92);
418
+ color: #d6f6ff;
419
+ font: 12px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
420
+ pointer-events: none;
421
+ white-space: pre-wrap;
422
+ }
423
+
424
+ #terminal-mirror[hidden] {
425
+ display: none;
426
+ }
427
+
428
+ .resize-edge,
429
+ .resize-corner {
430
+ position: fixed;
431
+ z-index: 10001;
432
+ background: rgba(0, 0, 0, 0.001);
433
+ app-region: no-drag;
434
+ -webkit-app-region: no-drag;
435
+ }
436
+
437
+ .resize-edge-top,
438
+ .resize-edge-bottom {
439
+ right: 12px;
440
+ left: 12px;
441
+ height: 6px;
442
+ cursor: ns-resize;
443
+ }
444
+
445
+ .resize-edge-left,
446
+ .resize-edge-right {
447
+ top: var(--titlebar-height);
448
+ bottom: 12px;
449
+ width: 10px;
450
+ cursor: ew-resize;
451
+ }
452
+
453
+ .resize-edge-top {
454
+ top: 0;
455
+ }
456
+
457
+ .resize-edge-right {
458
+ right: 0;
459
+ }
460
+
461
+ .resize-edge-bottom {
462
+ bottom: 0;
463
+ left: 96px;
464
+ height: 4px;
465
+ }
466
+
467
+ .resize-edge-left {
468
+ left: 0;
469
+ bottom: 64px;
470
+ }
471
+
472
+ .resize-corner {
473
+ width: 18px;
474
+ height: 18px;
475
+ }
476
+
477
+ .resize-corner-top-left {
478
+ top: 0;
479
+ left: 0;
480
+ cursor: nwse-resize;
481
+ }
482
+
483
+ .resize-corner-top-right {
484
+ top: 0;
485
+ right: 0;
486
+ cursor: nesw-resize;
487
+ }
488
+
489
+ .resize-corner-bottom-right {
490
+ right: 0;
491
+ bottom: 0;
492
+ cursor: nwse-resize;
493
+ }
494
+
495
+ .resize-corner-bottom-left {
496
+ bottom: 0;
497
+ left: 0;
498
+ display: none;
499
+ cursor: nesw-resize;
500
+ }
501
+
502
+ #diagnostics-panel {
503
+ position: fixed;
504
+ right: 8px;
505
+ bottom: 8px;
506
+ z-index: 10;
507
+ width: min(760px, calc(100vw - 16px));
508
+ height: min(320px, calc(100vh - var(--titlebar-height) - 16px));
509
+ display: grid;
510
+ grid-template-rows: auto 1fr 22px;
511
+ border: 1px solid #3b4652;
512
+ border-radius: 6px;
513
+ background: #171b21;
514
+ }
515
+
516
+ #diagnostics-panel[hidden] {
517
+ display: none;
518
+ }
519
+
520
+ .diagnostics-toolbar {
521
+ display: flex;
522
+ align-items: center;
523
+ justify-content: space-between;
524
+ gap: 8px;
525
+ padding: 4px 8px;
526
+ color: #f5d76e;
527
+ font: 12px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
528
+ cursor: move;
529
+ touch-action: none;
530
+ }
531
+
532
+ .panel-drag-title {
533
+ margin-bottom: 10px;
534
+ color: #f5d76e;
535
+ font: 13px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
536
+ cursor: move;
537
+ touch-action: none;
538
+ }
539
+
540
+ .diagnostics-actions {
541
+ display: flex;
542
+ align-items: center;
543
+ justify-content: flex-end;
544
+ min-width: 0;
545
+ gap: 6px;
546
+ flex-wrap: wrap;
547
+ }
548
+
549
+ #terminal-log-select {
550
+ max-width: min(260px, 28vw);
551
+ height: 22px;
552
+ min-width: 120px;
553
+ border: 1px solid #3b4652;
554
+ border-radius: 4px;
555
+ background: #222932;
556
+ color: #e8edf2;
557
+ font: inherit;
558
+ }
559
+
560
+ #terminal-encoding-select {
561
+ max-width: 112px;
562
+ height: 22px;
563
+ min-width: 86px;
564
+ border: 1px solid #3b4652;
565
+ border-radius: 4px;
566
+ background: #222932;
567
+ color: #e8edf2;
568
+ font: inherit;
569
+ }
570
+
571
+ #terminal-log-search {
572
+ width: min(170px, 20vw);
573
+ height: 22px;
574
+ min-width: 86px;
575
+ padding: 0 6px;
576
+ border: 1px solid #3b4652;
577
+ border-radius: 4px;
578
+ background: #222932;
579
+ color: #e8edf2;
580
+ font: inherit;
581
+ }
582
+
583
+ #terminal-log-search-status {
584
+ min-width: 34px;
585
+ color: #f5d76e;
586
+ text-align: right;
587
+ }
588
+
589
+ #terminal-log-show-selected,
590
+ #terminal-log-search-next,
591
+ #terminal-log-delete-selected,
592
+ #terminal-log-delete-all,
593
+ #terminal-encoding-apply,
594
+ #close-diagnostics {
595
+ height: 22px;
596
+ border: 1px solid #3b4652;
597
+ border-radius: 4px;
598
+ background: #222932;
599
+ color: #e8edf2;
600
+ font: inherit;
601
+ }
602
+
603
+ #diagnostics-panel select:focus,
604
+ #diagnostics-panel input:focus,
605
+ #diagnostics-panel button:focus,
606
+ #diagnostics-panel textarea:focus,
607
+ #diagnostics-panel select:focus-visible,
608
+ #diagnostics-panel input:focus-visible,
609
+ #diagnostics-panel button:focus-visible,
610
+ #diagnostics-panel textarea:focus-visible {
611
+ outline: 3px solid #f5d76e;
612
+ outline-offset: 2px;
613
+ border-color: #f5d76e;
614
+ background: #314156;
615
+ box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.92), 0 0 0 5px rgba(245, 215, 110, 0.62);
616
+ }
617
+
618
+ #diagnostics {
619
+ width: 100%;
620
+ min-width: 0;
621
+ min-height: 0;
622
+ overflow: auto;
623
+ padding: 6px 8px;
624
+ border: 0;
625
+ border-top: 1px solid #252b33;
626
+ border-bottom: 1px solid #252b33;
627
+ background: #171b21;
628
+ color: #f5d76e;
629
+ font: 12px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
630
+ resize: none;
631
+ white-space: pre;
632
+ }
633
+
634
+ #font-glyph-preview,
635
+ #terminal-capability-preview {
636
+ width: 100%;
637
+ min-width: 0;
638
+ min-height: 0;
639
+ margin: 0;
640
+ overflow: auto;
641
+ padding: 10px 12px;
642
+ border-top: 1px solid #252b33;
643
+ border-bottom: 1px solid #252b33;
644
+ background: #171b21;
645
+ color: #e8edf2;
646
+ outline: 0;
647
+ white-space: pre-wrap;
648
+ overflow-wrap: anywhere;
649
+ }
650
+
651
+ #font-glyph-preview:focus,
652
+ #font-glyph-preview:focus-visible,
653
+ #terminal-capability-preview:focus,
654
+ #terminal-capability-preview:focus-visible {
655
+ outline: 3px solid #f5d76e;
656
+ outline-offset: -5px;
657
+ }
658
+
659
+ #diagnostics::selection {
660
+ background: #f5d76e;
661
+ color: #11151a;
662
+ }
663
+
664
+ #terminal-log-confirm[hidden] {
665
+ display: none;
666
+ }
667
+
668
+ #terminal-log-confirm,
669
+ #close-all-confirm,
670
+ #sshfs-manager-dialog,
671
+ #terminal-broadcast-confirm,
672
+ #terminal-url-dialog {
673
+ position: absolute;
674
+ inset: 0;
675
+ z-index: 2;
676
+ display: grid;
677
+ place-items: center;
678
+ padding: 16px;
679
+ background: rgba(10, 14, 18, 0.72);
680
+ }
681
+
682
+ #close-all-confirm[hidden] {
683
+ display: none;
684
+ }
685
+
686
+ #sshfs-manager-dialog[hidden] {
687
+ display: none;
688
+ }
689
+
690
+ #sshfs-manager-dialog {
691
+ /* Keep every form field and error reachable in a short native window. */
692
+ position: fixed;
693
+ top: var(--titlebar-height);
694
+ right: 0;
695
+ bottom: 0;
696
+ left: 0;
697
+ z-index: 10020;
698
+ display: block;
699
+ overflow-x: hidden;
700
+ overflow-y: auto;
701
+ overscroll-behavior: contain;
702
+ }
703
+
704
+ .sshfs-manager-card {
705
+ width: 100%;
706
+ max-width: 680px;
707
+ max-height: none;
708
+ margin: 0 auto 16px;
709
+ }
710
+
711
+ .sshfs-manager-card form {
712
+ display: grid;
713
+ gap: 10px;
714
+ margin-top: 10px;
715
+ }
716
+
717
+ .sshfs-manager-card label {
718
+ display: grid;
719
+ gap: 4px;
720
+ color: #d8e4f0;
721
+ font: 12px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
722
+ }
723
+
724
+ .sshfs-manager-card :is(input, select) {
725
+ width: 100%;
726
+ min-height: 32px;
727
+ border: 1px solid #5a7088;
728
+ border-radius: 4px;
729
+ background: #11151a;
730
+ color: #e8edf2;
731
+ font: inherit;
732
+ padding: 5px 7px;
733
+ }
734
+
735
+ .sshfs-password-control {
736
+ display: grid;
737
+ grid-template-columns: minmax(0, 1fr) auto;
738
+ gap: 6px;
739
+ align-items: center;
740
+ }
741
+
742
+ .sshfs-password-control button {
743
+ min-width: 58px;
744
+ min-height: 32px;
745
+ }
746
+
747
+ .sshfs-local-path-actions {
748
+ display: grid;
749
+ grid-template-columns: auto minmax(0, 1fr);
750
+ gap: 6px;
751
+ align-items: center;
752
+ }
753
+
754
+ #sshfs-manager-local-path {
755
+ min-width: 0;
756
+ overflow-wrap: anywhere;
757
+ color: #a7f3d0;
758
+ font: 12px/1.45 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
759
+ text-decoration: underline;
760
+ cursor: copy;
761
+ }
762
+
763
+ #sshfs-manager-local-path[aria-disabled="true"] {
764
+ color: #94a3b8;
765
+ cursor: default;
766
+ text-decoration: none;
767
+ }
768
+
769
+ .sshfs-manager-card :is(input, select, button):focus,
770
+ .sshfs-manager-card :is(input, select, button):focus-visible {
771
+ outline: 3px solid #f5d76e;
772
+ outline-offset: 2px;
773
+ border-color: #f5d76e;
774
+ }
775
+
776
+ .sshfs-manager-description,
777
+ .sshfs-manager-warning,
778
+ #sshfs-manager-result {
779
+ display: block;
780
+ margin: 8px 0;
781
+ color: #cbd5e1;
782
+ font: 12px/1.45 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
783
+ overflow-wrap: anywhere;
784
+ }
785
+
786
+ .sshfs-manager-warning { color: #f5d76e; }
787
+ #sshfs-manager-result { color: #a7f3d0; }
788
+
789
+ #terminal-broadcast-confirm[hidden] {
790
+ display: none;
791
+ }
792
+
793
+ #terminal-url-dialog[hidden] {
794
+ display: none;
795
+ }
796
+
797
+ #terminal-url-dialog {
798
+ position: fixed;
799
+ inset: 0;
800
+ z-index: 10050;
801
+ app-region: no-drag;
802
+ -webkit-app-region: no-drag;
803
+ }
804
+
805
+ /* Broadcast is a fixed overlay, so its destructive-command confirmation must
806
+ * use a higher fixed layer instead of the ordinary in-panel confirmation layer. */
807
+ #terminal-broadcast-confirm {
808
+ position: fixed;
809
+ inset: 0;
810
+ z-index: 10040;
811
+ app-region: no-drag;
812
+ -webkit-app-region: no-drag;
813
+ }
814
+
815
+ .terminal-log-confirm-card {
816
+ width: min(520px, 100%);
817
+ padding: 12px;
818
+ border: 1px solid #f5d76e;
819
+ border-radius: 6px;
820
+ background: #171b21;
821
+ color: #e8edf2;
822
+ box-shadow: 0 10px 36px rgba(0, 0, 0, 0.48);
823
+ }
824
+
825
+ #terminal-log-confirm-title {
826
+ color: #f5d76e;
827
+ font: 13px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
828
+ }
829
+
830
+ #close-all-confirm-title {
831
+ color: #f5d76e;
832
+ font: 13px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
833
+ }
834
+
835
+ #terminal-broadcast-confirm-title {
836
+ color: #f5d76e;
837
+ font: 13px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
838
+ }
839
+
840
+ #terminal-url-title {
841
+ color: #f5d76e;
842
+ font: 13px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
843
+ }
844
+
845
+ #terminal-log-confirm-message {
846
+ max-height: 140px;
847
+ overflow: auto;
848
+ margin: 8px 0 12px;
849
+ color: #e8edf2;
850
+ white-space: pre-wrap;
851
+ overflow-wrap: anywhere;
852
+ font: 12px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
853
+ }
854
+
855
+ #terminal-broadcast-confirm-message {
856
+ max-height: 180px;
857
+ overflow: auto;
858
+ margin: 8px 0 12px;
859
+ color: #e8edf2;
860
+ white-space: pre-wrap;
861
+ overflow-wrap: anywhere;
862
+ font: 12px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
863
+ }
864
+
865
+ #terminal-url-message {
866
+ max-height: 180px;
867
+ overflow: auto;
868
+ margin: 8px 0 12px;
869
+ color: #e8edf2;
870
+ white-space: pre-wrap;
871
+ overflow-wrap: anywhere;
872
+ font: 12px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
873
+ }
874
+
875
+ .terminal-log-confirm-actions {
876
+ display: flex;
877
+ justify-content: flex-end;
878
+ gap: 8px;
879
+ }
880
+
881
+ #terminal-log-confirm-ok,
882
+ #terminal-log-confirm-cancel,
883
+ #terminal-broadcast-confirm-ok,
884
+ #terminal-broadcast-confirm-cancel,
885
+ #terminal-url-copy,
886
+ #terminal-url-open,
887
+ #terminal-url-cancel {
888
+ height: 24px;
889
+ min-width: 72px;
890
+ border: 1px solid #3b4652;
891
+ border-radius: 4px;
892
+ background: #222932;
893
+ color: #e8edf2;
894
+ font: 12px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
895
+ }
896
+
897
+ #diagnostics-path {
898
+ overflow: hidden;
899
+ padding: 4px 8px;
900
+ color: #b9c2cc;
901
+ font: 11px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
902
+ text-overflow: ellipsis;
903
+ white-space: nowrap;
904
+ }
905
+
906
+ .xterm {
907
+ width: 100%;
908
+ height: 100%;
909
+ }
910
+
911
+ .xterm-viewport,
912
+ .xterm-screen {
913
+ overflow: hidden;
914
+ }
915
+
916
+ /* Kitty image canvases are visual layers; xterm's helper textarea owns input. */
917
+ .xterm-image-layer-top,
918
+ .xterm-image-layer-bottom {
919
+ pointer-events: none !important;
920
+ }
921
+
922
+ .xterm .xterm-accessibility:not(.debug),
923
+ .xterm .xterm-accessibility-tree:not(.debug),
924
+ .xterm .xterm-accessibility-tree:not(.debug) *,
925
+ .xterm .live-region,
926
+ .xterm .xterm-message {
927
+ display: none !important;
928
+ opacity: 0 !important;
929
+ visibility: hidden !important;
930
+ color: transparent !important;
931
+ background: transparent !important;
932
+ pointer-events: none !important;
933
+ }
934
+
935
+ .xterm .xterm-helper-textarea {
936
+ color: transparent !important;
937
+ background: transparent !important;
938
+ caret-color: transparent !important;
939
+ -webkit-text-fill-color: transparent !important;
940
+ text-shadow: none !important;
941
+ }
942
+
943
+ /* Windows WebView renders marked IME text in this xterm-owned element. */
944
+ .xterm .composition-view {
945
+ color: #ffffff !important;
946
+ background: rgba(16, 19, 23, 0.82) !important;
947
+ border-bottom: 1px solid #f5d76e;
948
+ caret-color: transparent !important;
949
+ -webkit-text-fill-color: #ffffff !important;
950
+ text-shadow: none !important;
951
+ }
952
+
953
+ /* The positioned fpasoterm overlay is clearer than xterm's hidden helper. */
954
+ body.ime-preedit-overlay .xterm .composition-view {
955
+ color: transparent !important;
956
+ background: transparent !important;
957
+ border-color: transparent !important;
958
+ -webkit-text-fill-color: transparent !important;
959
+ }
960
+
961
+ .xterm .xterm-char-measure-element {
962
+ position: absolute !important;
963
+ left: -9999em !important;
964
+ top: -9999em !important;
965
+ z-index: -1 !important;
966
+ opacity: 0 !important;
967
+ visibility: hidden !important;
968
+ pointer-events: none !important;
969
+ }