pinokiod 3.271.0 → 3.273.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.
Files changed (55) hide show
  1. package/kernel/ansi_stream_tracker.js +115 -0
  2. package/kernel/api/app/index.js +422 -0
  3. package/kernel/api/htmlmodal/index.js +94 -0
  4. package/kernel/app_launcher/index.js +115 -0
  5. package/kernel/app_launcher/platform/base.js +276 -0
  6. package/kernel/app_launcher/platform/linux.js +229 -0
  7. package/kernel/app_launcher/platform/macos.js +163 -0
  8. package/kernel/app_launcher/platform/unsupported.js +34 -0
  9. package/kernel/app_launcher/platform/windows.js +247 -0
  10. package/kernel/bin/conda-meta.js +93 -0
  11. package/kernel/bin/conda.js +2 -4
  12. package/kernel/bin/index.js +2 -4
  13. package/kernel/index.js +7 -0
  14. package/kernel/shell.js +212 -1
  15. package/package.json +1 -1
  16. package/server/index.js +491 -6
  17. package/server/public/common.js +224 -741
  18. package/server/public/create-launcher.js +754 -0
  19. package/server/public/htmlmodal.js +292 -0
  20. package/server/public/logs.js +715 -0
  21. package/server/public/resizeSync.js +117 -0
  22. package/server/public/style.css +653 -8
  23. package/server/public/tab-idle-notifier.js +34 -59
  24. package/server/public/tab-link-popover.js +7 -10
  25. package/server/public/terminal-settings.js +723 -9
  26. package/server/public/terminal_input_utils.js +72 -0
  27. package/server/public/terminal_key_caption.js +187 -0
  28. package/server/public/urldropdown.css +120 -3
  29. package/server/public/xterm-inline-bridge.js +116 -0
  30. package/server/socket.js +29 -0
  31. package/server/views/agents.ejs +1 -2
  32. package/server/views/app.ejs +55 -28
  33. package/server/views/bookmarklet.ejs +1 -1
  34. package/server/views/bootstrap.ejs +1 -0
  35. package/server/views/connect.ejs +1 -2
  36. package/server/views/create.ejs +63 -0
  37. package/server/views/editor.ejs +36 -4
  38. package/server/views/index.ejs +1 -2
  39. package/server/views/index2.ejs +1 -2
  40. package/server/views/init/index.ejs +36 -28
  41. package/server/views/install.ejs +20 -22
  42. package/server/views/layout.ejs +2 -8
  43. package/server/views/logs.ejs +155 -0
  44. package/server/views/mini.ejs +0 -18
  45. package/server/views/net.ejs +2 -2
  46. package/server/views/network.ejs +1 -2
  47. package/server/views/network2.ejs +1 -2
  48. package/server/views/old_network.ejs +1 -2
  49. package/server/views/pro.ejs +26 -23
  50. package/server/views/prototype/index.ejs +30 -34
  51. package/server/views/screenshots.ejs +1 -2
  52. package/server/views/settings.ejs +1 -20
  53. package/server/views/shell.ejs +59 -66
  54. package/server/views/terminal.ejs +118 -73
  55. package/server/views/tools.ejs +1 -2
@@ -164,9 +164,6 @@ aside .tab.submenu {
164
164
  padding-left: 25px !important;
165
165
  box-sizing: border-box;
166
166
  }
167
- #genlog, #downloadlogs {
168
- cursor: pointer;
169
- }
170
167
  .url-bar {
171
168
  font-family: verdana;
172
169
  font-size: 12px;
@@ -1056,9 +1053,8 @@ body.columns .containers {
1056
1053
  font-family: "SpaceMono", monospace !important;
1057
1054
  font-family: "SourceCode", monospace !important;
1058
1055
  */
1059
- font-family: "RobotoMono", monospace !important;
1060
- font-weight: 400 !important;
1061
- font-style: normal !important;
1056
+ font-weight: 400;
1057
+ font-style: normal;
1062
1058
 
1063
1059
  }
1064
1060
  .xterm {
@@ -1186,6 +1182,33 @@ header .runner .btn {
1186
1182
  margin-left: auto;
1187
1183
  margin-right: 0;
1188
1184
  }
1185
+ .terminal-runner-utilities {
1186
+ margin-left: auto;
1187
+ display: flex;
1188
+ align-items: center;
1189
+ gap: 10px;
1190
+ flex-wrap: wrap;
1191
+ justify-content: flex-end;
1192
+ min-width: 0;
1193
+ }
1194
+ .terminal-runner-utilities .terminal-config {
1195
+ margin-left: 0;
1196
+ }
1197
+ .terminal-runner-utilities .btn {
1198
+ margin-right: 0;
1199
+ }
1200
+ .terminal-keyboard-button {
1201
+ display: inline-flex;
1202
+ align-items: center;
1203
+ gap: 6px;
1204
+ white-space: nowrap;
1205
+ }
1206
+ .terminal-resize-button {
1207
+ display: inline-flex;
1208
+ align-items: center;
1209
+ gap: 6px;
1210
+ white-space: nowrap;
1211
+ }
1189
1212
  .terminal-config .terminal-config-button,
1190
1213
  .terminal-config .btn {
1191
1214
  margin-right: 0;
@@ -1326,9 +1349,9 @@ body.dark .terminal-config-menu .terminal-config-help {
1326
1349
  }
1327
1350
  body.dark .terminal-config-menu .terminal-config-select,
1328
1351
  body.dark .terminal-config-menu .terminal-config-input {
1329
- background: rgba(255, 255, 255, 0.08);
1352
+ background: white;
1330
1353
  border-color: rgba(255, 255, 255, 0.16);
1331
- color: #ffffff;
1354
+ color: black;
1332
1355
  }
1333
1356
  body.dark .terminal-config-menu .terminal-config-color-input {
1334
1357
  background: rgba(255, 255, 255, 0.08);
@@ -1342,6 +1365,146 @@ body.dark .terminal-config-menu .terminal-config-input:focus {
1342
1365
  .terminal-config-open .terminal-config-menu {
1343
1366
  display: block;
1344
1367
  }
1368
+ .terminal-keyboard-backdrop {
1369
+ position: fixed;
1370
+ inset: 0;
1371
+ background: rgba(0, 0, 0, 0.45);
1372
+ z-index: 1000000;
1373
+ display: none;
1374
+ backdrop-filter: blur(2px);
1375
+ }
1376
+ .terminal-keyboard-backdrop:not([hidden]) {
1377
+ display: block;
1378
+ }
1379
+ .terminal-keyboard-modal {
1380
+ position: fixed;
1381
+ left: 50%;
1382
+ top: calc(32px + env(safe-area-inset-top));
1383
+ transform: translateX(-50%);
1384
+ width: min(520px, calc(100% - 32px));
1385
+ background: #ffffff;
1386
+ border-radius: 16px;
1387
+ padding: 18px;
1388
+ box-sizing: border-box;
1389
+ /*
1390
+ padding-bottom: calc(18px + env(safe-area-inset-bottom));
1391
+ */
1392
+ box-shadow: 0 24px 60px rgba(0, 0, 0, 0.35);
1393
+ z-index: 1000001;
1394
+ display: none;
1395
+ }
1396
+ .terminal-keyboard-modal:not([hidden]) {
1397
+ display: flex;
1398
+ flex-direction: column;
1399
+ gap: 12px;
1400
+ }
1401
+ body.dark .terminal-keyboard-modal {
1402
+ background: rgba(21, 22, 23, 0.98);
1403
+ color: rgba(255, 255, 255, 0.92);
1404
+ box-shadow: 0 24px 60px rgba(0, 0, 0, 0.7);
1405
+ }
1406
+ body.terminal-keyboard-open {
1407
+ overflow: hidden;
1408
+ }
1409
+ .terminal-keyboard-header {
1410
+ display: flex;
1411
+ align-items: center;
1412
+ justify-content: space-between;
1413
+ gap: 10px;
1414
+ }
1415
+ .terminal-keyboard-title {
1416
+ font-size: 16px;
1417
+ font-weight: 600;
1418
+ }
1419
+ .terminal-keyboard-form {
1420
+ display: flex;
1421
+ flex-direction: column;
1422
+ gap: 12px;
1423
+ margin: 0 !important;
1424
+ }
1425
+ .terminal-keyboard-textarea {
1426
+ width: 100%;
1427
+ min-height: 120px;
1428
+ resize: vertical;
1429
+ font-size: 14px;
1430
+ font-family: inherit;
1431
+ padding: 10px 12px;
1432
+ border-radius: 10px;
1433
+ border: 1px solid rgba(0, 0, 0, 0.18);
1434
+ background: rgba(0, 0, 0, 0.02);
1435
+ color: inherit;
1436
+ }
1437
+ body.dark .terminal-keyboard-textarea {
1438
+ border-color: rgba(255, 255, 255, 0.2);
1439
+ background: rgba(255, 255, 255, 0.06);
1440
+ color: inherit;
1441
+ }
1442
+ .terminal-keyboard-options {
1443
+ display: flex;
1444
+ flex-wrap: wrap;
1445
+ gap: 10px 20px;
1446
+ }
1447
+ .terminal-keyboard-option {
1448
+ display: inline-flex;
1449
+ align-items: center;
1450
+ gap: 6px;
1451
+ font-size: 12px;
1452
+ color: #4a4f56;
1453
+ }
1454
+ .terminal-keyboard-option input {
1455
+ margin: 0;
1456
+ }
1457
+ body.dark .terminal-keyboard-option {
1458
+ color: rgba(255, 255, 255, 0.8);
1459
+ }
1460
+ .terminal-keyboard-status {
1461
+ font-size: 12px;
1462
+ min-height: 1em;
1463
+ color: #5c677d;
1464
+ opacity: 0;
1465
+ transition: opacity 0.2s ease;
1466
+ }
1467
+ .terminal-keyboard-status.visible {
1468
+ opacity: 1;
1469
+ }
1470
+ .terminal-keyboard-status[data-tone='error'] {
1471
+ color: #e35858;
1472
+ }
1473
+ .terminal-keyboard-status[data-tone='success'] {
1474
+ color: #3ab97a;
1475
+ }
1476
+ body.dark .terminal-keyboard-status {
1477
+ color: rgba(255, 255, 255, 0.7);
1478
+ }
1479
+ body.dark .terminal-keyboard-status[data-tone='error'] {
1480
+ color: #ff8686;
1481
+ }
1482
+ body.dark .terminal-keyboard-status[data-tone='success'] {
1483
+ color: #8be28b;
1484
+ }
1485
+ .terminal-keyboard-actions {
1486
+ display: flex;
1487
+ justify-content: space-between;
1488
+ align-items: center;
1489
+ gap: 12px;
1490
+ flex-wrap: wrap;
1491
+ }
1492
+ .terminal-keyboard-actions-left,
1493
+ .terminal-keyboard-actions-right {
1494
+ display: inline-flex;
1495
+ align-items: center;
1496
+ gap: 8px;
1497
+ flex-wrap: wrap;
1498
+ }
1499
+ .terminal-keyboard-direct-button {
1500
+ white-space: nowrap;
1501
+ }
1502
+ @media (max-width: 640px) {
1503
+ .terminal-keyboard-modal {
1504
+ width: calc(100% - 16px);
1505
+ top: calc(16px + env(safe-area-inset-top));
1506
+ }
1507
+ }
1345
1508
  body.dark .memory {
1346
1509
  background: rgba(0,0,0,0.8);
1347
1510
  border-left: 5px solid white;
@@ -2847,3 +3010,485 @@ header.navheader.transitioning {
2847
3010
  .shutdown i.fa-stop:hover {
2848
3011
  color: crimson;
2849
3012
  }
3013
+
3014
+ #logs-root {
3015
+ --logs-pane-height: auto;
3016
+ --logs-sidebar-width: 320px;
3017
+ --logs-sidebar-min-width: 220px;
3018
+ --logs-sidebar-max-width: 560px;
3019
+ position: relative;
3020
+ }
3021
+ .logs-page {
3022
+ display: flex;
3023
+ gap: 0;
3024
+ align-items: stretch;
3025
+ min-height: 0;
3026
+ height: var(--logs-pane-height, auto);
3027
+ overflow: hidden;
3028
+ }
3029
+ .logs-sidebar {
3030
+ flex: 0 0 var(--logs-sidebar-width, 320px);
3031
+ width: var(--logs-sidebar-width, 320px);
3032
+ min-width: var(--logs-sidebar-min-width, 220px);
3033
+ max-width: var(--logs-sidebar-max-width, 560px);
3034
+ padding: 20px;
3035
+ box-sizing: border-box;
3036
+ display: flex;
3037
+ flex-direction: column;
3038
+ gap: 16px;
3039
+ background: rgba(0,0,0,0.02);
3040
+ max-height: var(--logs-pane-height, none);
3041
+ min-height: 0;
3042
+ overflow: auto;
3043
+ }
3044
+ #logs-root.logs-sidebar-collapsed .logs-sidebar {
3045
+ flex: 0 0 0;
3046
+ width: 0;
3047
+ min-width: 0;
3048
+ max-width: 0;
3049
+ opacity: 0;
3050
+ pointer-events: none;
3051
+ border: none;
3052
+ padding: 0;
3053
+ margin: 0;
3054
+ }
3055
+ #logs-root.logs-sidebar-collapsed .logs-tree-wrapper {
3056
+ border-width: 0;
3057
+ }
3058
+ body.dark .logs-sidebar {
3059
+ border-color: var(--dark-thin);
3060
+ background: rgba(255,255,255,0.04);
3061
+ }
3062
+ .logs-sidebar-header h2 {
3063
+ margin: 4px 0 0;
3064
+ font-size: 22px;
3065
+ }
3066
+ .logs-workspace-chip {
3067
+ display: inline-flex;
3068
+ align-items: center;
3069
+ gap: 6px;
3070
+ margin-top: 6px;
3071
+ padding: 4px 10px;
3072
+ border-radius: 999px;
3073
+ background: rgba(127, 91, 243, 0.12);
3074
+ color: rgba(127, 91, 243, 0.9);
3075
+ font-size: 12px;
3076
+ font-weight: 600;
3077
+ }
3078
+ body.dark .logs-workspace-chip {
3079
+ background: rgba(255,255,255,0.12);
3080
+ color: rgba(255,255,255,0.85);
3081
+ }
3082
+ .logs-sidebar-eyebrow {
3083
+ margin: 0;
3084
+ text-transform: uppercase;
3085
+ font-size: 12px;
3086
+ letter-spacing: 0.08em;
3087
+ color: rgba(0,0,0,0.5);
3088
+ }
3089
+ body.dark .logs-sidebar-eyebrow {
3090
+ color: rgba(255,255,255,0.6);
3091
+ }
3092
+ .logs-root-path {
3093
+ font-family: 'JetBrains Mono', 'SFMono-Regular', Consolas, monospace;
3094
+ font-size: 12px;
3095
+ margin-top: 8px;
3096
+ display: flex;
3097
+ align-items: center;
3098
+ gap: 6px;
3099
+ color: rgba(0,0,0,0.7);
3100
+ }
3101
+ body.dark .logs-root-path {
3102
+ color: rgba(255,255,255,0.7);
3103
+ }
3104
+ .logs-zip-actions {
3105
+ display: flex;
3106
+ flex-direction: column;
3107
+ gap: 10px;
3108
+ }
3109
+ .logs-zip-status {
3110
+ font-size: 13px;
3111
+ color: rgba(0,0,0,0.6);
3112
+ }
3113
+ .logs-zip-status.is-error {
3114
+ color: #c0392b;
3115
+ }
3116
+ body.dark .logs-zip-status {
3117
+ color: rgba(255,255,255,0.6);
3118
+ }
3119
+ body.dark .logs-zip-status.is-error {
3120
+ color: #ff8373;
3121
+ }
3122
+ .logs-primary-button,
3123
+ .logs-secondary-button,
3124
+ .logs-flat-button {
3125
+ border: none;
3126
+ border-radius: 10px;
3127
+ padding: 10px 14px;
3128
+ font-weight: 600;
3129
+ display: inline-flex;
3130
+ align-items: center;
3131
+ gap: 8px;
3132
+ cursor: pointer;
3133
+ justify-content: center;
3134
+ transition: background 0.2s ease, color 0.2s ease;
3135
+ }
3136
+ .logs-primary-button {
3137
+ background: var(--light-link-color);
3138
+ color: white;
3139
+ }
3140
+ body.dark .logs-primary-button {
3141
+ background: rgba(255,255,255,0.15);
3142
+ }
3143
+ .logs-primary-button:disabled,
3144
+ .logs-secondary-button:disabled,
3145
+ .logs-flat-button:disabled {
3146
+ opacity: 0.6;
3147
+ cursor: not-allowed;
3148
+ }
3149
+ .logs-secondary-button {
3150
+ border: 1px solid var(--light-thin);
3151
+ background: transparent;
3152
+ color: inherit;
3153
+ text-decoration: none;
3154
+ }
3155
+ body.dark .logs-secondary-button {
3156
+ border-color: var(--dark-thin);
3157
+ }
3158
+ .logs-flat-button {
3159
+ background: rgba(0,0,0,0.04);
3160
+ }
3161
+ body.dark .logs-flat-button {
3162
+ background: rgba(255,255,255,0.08);
3163
+ }
3164
+ .logs-flat-button.is-busy::after {
3165
+ content: '\f110';
3166
+ font-family: 'Font Awesome 6 Free';
3167
+ font-weight: 900;
3168
+ animation: spin 1s linear infinite;
3169
+ margin-left: 6px;
3170
+ }
3171
+ @keyframes spin {
3172
+ from { transform: rotate(0deg); }
3173
+ to { transform: rotate(360deg); }
3174
+ }
3175
+ .logs-tree-toolbar {
3176
+ display: flex;
3177
+ flex-direction: column;
3178
+ gap: 6px;
3179
+ }
3180
+ .logs-tree-hint {
3181
+ margin: 0;
3182
+ font-size: 12px;
3183
+ color: rgba(0,0,0,0.5);
3184
+ }
3185
+ body.dark .logs-tree-hint {
3186
+ color: rgba(255,255,255,0.6);
3187
+ }
3188
+ .logs-tree-wrapper {
3189
+ flex: 1;
3190
+ border: 1px solid var(--light-thin);
3191
+ border-radius: 14px;
3192
+ padding: 10px;
3193
+ overflow: hidden;
3194
+ background: white;
3195
+ }
3196
+ body.dark .logs-tree-wrapper {
3197
+ border-color: var(--dark-thin);
3198
+ background: rgba(255,255,255,0.02);
3199
+ }
3200
+ .logs-tree {
3201
+ max-height: 100%;
3202
+ overflow-y: auto;
3203
+ font-size: 14px;
3204
+ }
3205
+ .logs-branch {
3206
+ margin: 0;
3207
+ }
3208
+ .logs-branch-summary {
3209
+ display: flex;
3210
+ align-items: center;
3211
+ gap: 8px;
3212
+ padding: 4px 6px;
3213
+ cursor: pointer;
3214
+ border-radius: 8px;
3215
+ list-style: none;
3216
+ }
3217
+ .logs-branch-summary::-webkit-details-marker {
3218
+ display: none;
3219
+ }
3220
+ .logs-branch.is-open .logs-branch-chevron {
3221
+ transform: rotate(90deg);
3222
+ }
3223
+ .logs-branch-chevron {
3224
+ width: 14px;
3225
+ text-align: center;
3226
+ color: rgba(0,0,0,0.4);
3227
+ transition: transform 0.2s ease;
3228
+ }
3229
+ body.dark .logs-branch-chevron {
3230
+ color: rgba(255,255,255,0.4);
3231
+ }
3232
+ .logs-branch-icon {
3233
+ color: rgba(127, 91, 243, 0.9);
3234
+ }
3235
+ body.dark .logs-branch-icon {
3236
+ color: rgba(255,255,255,0.7);
3237
+ }
3238
+ .logs-children {
3239
+ margin-left: 18px;
3240
+ padding-left: 12px;
3241
+ border-left: 1px solid rgba(0,0,0,0.08);
3242
+ }
3243
+ body.dark .logs-children {
3244
+ border-color: rgba(255,255,255,0.08);
3245
+ }
3246
+ .logs-tree-message {
3247
+ font-size: 12px;
3248
+ padding: 4px 0;
3249
+ color: rgba(0,0,0,0.6);
3250
+ }
3251
+ .logs-tree-message.is-error {
3252
+ color: #c0392b;
3253
+ }
3254
+ body.dark .logs-tree-message {
3255
+ color: rgba(255,255,255,0.6);
3256
+ }
3257
+ body.dark .logs-tree-message.is-error {
3258
+ color: #ff8373;
3259
+ }
3260
+ .logs-file {
3261
+ width: 100%;
3262
+ border: none;
3263
+ background: none;
3264
+ text-align: left;
3265
+ padding: 4px 6px;
3266
+ border-radius: 8px;
3267
+ display: flex;
3268
+ align-items: center;
3269
+ gap: 8px;
3270
+ cursor: pointer;
3271
+ font-size: 14px;
3272
+ }
3273
+ .logs-file:hover,
3274
+ .logs-file.is-active {
3275
+ background: rgba(127, 91, 243, 0.1);
3276
+ }
3277
+ body.dark .logs-file:hover,
3278
+ body.dark .logs-file.is-active {
3279
+ background: rgba(127, 91, 243, 0.2);
3280
+ }
3281
+ .logs-file-icon {
3282
+ color: rgba(0,0,0,0.5);
3283
+ }
3284
+ body.dark .logs-file-icon {
3285
+ color: rgba(255,255,255,0.5);
3286
+ }
3287
+ .logs-file-meta {
3288
+ margin-left: auto;
3289
+ font-size: 12px;
3290
+ color: rgba(0,0,0,0.5);
3291
+ }
3292
+ body.dark .logs-file-meta {
3293
+ color: rgba(255,255,255,0.5);
3294
+ }
3295
+ .logs-main {
3296
+ flex: 1;
3297
+ min-width: 0;
3298
+ min-height: 0;
3299
+ max-height: var(--logs-pane-height, none);
3300
+ overflow: auto;
3301
+ display: flex;
3302
+ flex-direction: column;
3303
+ }
3304
+ #logs-root.logs-sidebar-collapsed .logs-main {
3305
+ max-height: var(--logs-pane-height, none);
3306
+ }
3307
+ .logs-viewer-panel {
3308
+ padding: 0;
3309
+ display: flex;
3310
+ flex-direction: column;
3311
+ flex: 1;
3312
+ min-height: 0;
3313
+ }
3314
+ body.dark .logs-viewer-panel {
3315
+ background: rgba(255,255,255,0.03);
3316
+ }
3317
+ .logs-page--error {
3318
+ align-items: center;
3319
+ justify-content: center;
3320
+ height: auto;
3321
+ min-height: 320px;
3322
+ }
3323
+ .logs-empty-state {
3324
+ border: 1px dashed var(--light-thin);
3325
+ border-radius: 16px;
3326
+ padding: 40px;
3327
+ text-align: center;
3328
+ max-width: 540px;
3329
+ margin: 0 auto;
3330
+ }
3331
+ body.dark .logs-empty-state {
3332
+ border-color: var(--dark-thin);
3333
+ background: rgba(255,255,255,0.02);
3334
+ }
3335
+ .logs-empty-icon {
3336
+ font-size: 42px;
3337
+ color: rgba(0,0,0,0.4);
3338
+ margin-bottom: 12px;
3339
+ }
3340
+ body.dark .logs-empty-icon {
3341
+ color: rgba(255,255,255,0.5);
3342
+ }
3343
+ .logs-empty-actions {
3344
+ display: flex;
3345
+ justify-content: center;
3346
+ gap: 12px;
3347
+ margin-top: 20px;
3348
+ }
3349
+ .logs-resizer {
3350
+ flex: 0 0 12px;
3351
+ margin: 0 6px;
3352
+ cursor: col-resize;
3353
+ display: flex;
3354
+ align-items: center;
3355
+ justify-content: center;
3356
+ position: relative;
3357
+ touch-action: none;
3358
+ }
3359
+ .logs-resizer::before {
3360
+ content: '';
3361
+ width: 4px;
3362
+ border-radius: 999px;
3363
+ background: rgba(0,0,0,0.15);
3364
+ height: 60%;
3365
+ }
3366
+ body.dark .logs-resizer::before {
3367
+ background: rgba(255,255,255,0.25);
3368
+ }
3369
+ #logs-root.logs-sidebar-collapsed .logs-resizer::before {
3370
+ display: none;
3371
+ }
3372
+ .logs-resizer-toggle {
3373
+ position: absolute;
3374
+ top: 8px;
3375
+ left: 50%;
3376
+ transform: translate(-50%, 0);
3377
+ width: 28px;
3378
+ height: 28px;
3379
+ border: none;
3380
+ background: rgba(0,0,0,0.05);
3381
+ color: rgba(0,0,0,0.6);
3382
+ display: inline-flex;
3383
+ align-items: center;
3384
+ justify-content: center;
3385
+ pointer-events: auto;
3386
+ cursor: pointer;
3387
+ transition: background 0.2s ease, color 0.2s ease;
3388
+ }
3389
+ .logs-resizer:hover .logs-resizer-toggle {
3390
+ background: rgba(127, 91, 243, 0.12);
3391
+ color: var(--light-link-color);
3392
+ }
3393
+ body.dark .logs-resizer-toggle {
3394
+ background: rgba(255,255,255,0.08);
3395
+ color: rgba(255,255,255,0.75);
3396
+ }
3397
+ body.dark .logs-resizer:hover .logs-resizer-toggle {
3398
+ background: rgba(255,255,255,0.18);
3399
+ color: rgba(255,255,255,0.95);
3400
+ }
3401
+ #logs-root.logs-sidebar-collapsed .logs-resizer {
3402
+ margin-left: 12px;
3403
+ }
3404
+ #logs-root.logs-sidebar-collapsed .logs-resizer-toggle i {
3405
+ transform: rotate(180deg);
3406
+ }
3407
+ .logs-viewer-header {
3408
+ padding: 16px;
3409
+ border-bottom: 1px solid var(--light-thin);
3410
+ display: flex;
3411
+ justify-content: space-between;
3412
+ gap: 16px;
3413
+ flex-wrap: wrap;
3414
+ }
3415
+ body.dark .logs-viewer-header {
3416
+ border-color: var(--dark-thin);
3417
+ }
3418
+ .logs-viewer-eyebrow {
3419
+ margin: 0;
3420
+ text-transform: uppercase;
3421
+ font-size: 12px;
3422
+ letter-spacing: 0.08em;
3423
+ color: rgba(0,0,0,0.5);
3424
+ }
3425
+ body.dark .logs-viewer-eyebrow {
3426
+ color: rgba(255,255,255,0.6);
3427
+ }
3428
+ .logs-viewer-path {
3429
+ font-family: 'JetBrains Mono', 'SFMono-Regular', Consolas, monospace;
3430
+ font-size: 13px;
3431
+ word-break: break-all;
3432
+ }
3433
+ .logs-viewer-controls {
3434
+ display: flex;
3435
+ align-items: center;
3436
+ gap: 10px;
3437
+ }
3438
+ .logs-autoscroll-toggle {
3439
+ display: inline-flex;
3440
+ align-items: center;
3441
+ gap: 6px;
3442
+ font-size: 13px;
3443
+ cursor: pointer;
3444
+ }
3445
+ .logs-autoscroll-toggle input {
3446
+ accent-color: #7f5bf3;
3447
+ }
3448
+ .logs-viewer-status {
3449
+ padding: 8px 16px;
3450
+ font-size: 13px;
3451
+ color: rgba(0,0,0,0.6);
3452
+ border-bottom: 1px solid var(--light-thin);
3453
+ }
3454
+ body.dark .logs-viewer-status {
3455
+ color: rgba(255,255,255,0.7);
3456
+ border-color: var(--dark-thin);
3457
+ }
3458
+ .logs-viewer-output {
3459
+ flex: 1;
3460
+ margin: 0;
3461
+ padding: 16px;
3462
+ font-family: 'JetBrains Mono', 'SFMono-Regular', Consolas, monospace;
3463
+ font-size: 13px;
3464
+ white-space: pre-wrap;
3465
+ word-break: break-word;
3466
+ overflow-y: auto;
3467
+ background: rgba(0,0,0,0.02);
3468
+ }
3469
+ body.dark .logs-viewer-output {
3470
+ background: rgba(0,0,0,0.3);
3471
+ color: rgba(255,255,255,0.85);
3472
+ }
3473
+ #status-window {
3474
+ display: none !important;
3475
+ }
3476
+
3477
+ @media (max-width: 1200px) {
3478
+ .logs-page {
3479
+ flex-direction: column;
3480
+ }
3481
+ .logs-sidebar {
3482
+ width: 100%;
3483
+ }
3484
+ }
3485
+ @media (max-width: 720px) {
3486
+ .logs-viewer-header {
3487
+ flex-direction: column;
3488
+ align-items: flex-start;
3489
+ }
3490
+ .logs-viewer-controls {
3491
+ width: 100%;
3492
+ justify-content: space-between;
3493
+ }
3494
+ }