codebee 0.1.69 → 0.1.71

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 (133) hide show
  1. package/CHANGELOG.md +589 -543
  2. package/LICENSE +21 -21
  3. package/README.md +509 -508
  4. package/app/.playwright-cli/console-2026-09-23T08-26-03-635Z.log +88 -0
  5. package/app/.playwright-cli/page-2026-09-23T08-26-03-845Z.yml +126 -0
  6. package/app/.playwright-cli/page-2026-09-23T08-29-44-203Z.png +0 -0
  7. package/app/.playwright-cli/page-2026-09-23T08-35-42-046Z.yml +210 -0
  8. package/app/.playwright-cli/page-2026-09-23T08-36-52-858Z.png +0 -0
  9. package/app/.playwright-cli/page-2026-09-23T08-37-33-938Z.png +0 -0
  10. package/app/.playwright-cli/run-detail-after.png +0 -0
  11. package/app/browser-final-1440.png +0 -0
  12. package/app/browser-final-390.png +0 -0
  13. package/app/browser-google-fallback.png +0 -0
  14. package/app/browser-google-test.png +0 -0
  15. package/app/browser-workbench-1440.png +0 -0
  16. package/app/browser-workbench-390.png +0 -0
  17. package/app/browser-workspace-google.png +0 -0
  18. package/app/browser-workspace-smoke.png +0 -0
  19. package/app/browser-workspace.png +0 -0
  20. package/app/core/acceptance.py +100 -100
  21. package/app/core/aiflavor.py +197 -197
  22. package/app/core/artifacts.py +148 -148
  23. package/app/core/assets.py +110 -110
  24. package/app/core/attachments.py +623 -623
  25. package/app/core/audit.py +30 -0
  26. package/app/core/automation.py +107 -12
  27. package/app/core/backup.py +470 -470
  28. package/app/core/beekeeper.py +183 -183
  29. package/app/core/benchstore.py +95 -0
  30. package/app/core/board.py +209 -209
  31. package/app/core/bookmeta.py +935 -930
  32. package/app/core/bookmeta_catalog.py +180 -180
  33. package/app/core/branching.py +137 -137
  34. package/app/core/builtin_agent.py +1673 -1234
  35. package/app/core/capability.py +144 -144
  36. package/app/core/catalog.py +7 -1
  37. package/app/core/chaptersafe.py +32 -32
  38. package/app/core/cleanup.py +303 -303
  39. package/app/core/compaction.py +201 -201
  40. package/app/core/covergen.py +356 -356
  41. package/app/core/defectretro.py +43 -43
  42. package/app/core/diagnostics.py +114 -114
  43. package/app/core/dispatch.py +190 -173
  44. package/app/core/dispatch_log.py +128 -128
  45. package/app/core/env_scrub.py +85 -85
  46. package/app/core/error_codes.py +11 -2
  47. package/app/core/errorlog.py +137 -137
  48. package/app/core/evalbench.py +720 -0
  49. package/app/core/evaluation.py +174 -174
  50. package/app/core/failure_notify.py +290 -290
  51. package/app/core/flows.py +234 -9
  52. package/app/core/goal_service.py +167 -167
  53. package/app/core/health.py +374 -374
  54. package/app/core/history.py +38 -38
  55. package/app/core/hooks.py +162 -162
  56. package/app/core/jobs.py +22 -1
  57. package/app/core/manager.py +2143 -2122
  58. package/app/core/market_remote.py +10 -0
  59. package/app/core/mcp_client.py +287 -0
  60. package/app/core/mocks.py +64 -64
  61. package/app/core/modelhub.py +185 -2
  62. package/app/core/notify.py +201 -106
  63. package/app/core/novel_quality.py +189 -0
  64. package/app/core/operations.py +228 -228
  65. package/app/core/paihang.py +138 -138
  66. package/app/core/paths.py +4 -0
  67. package/app/core/pipeline.py +426 -28
  68. package/app/core/planner.py +243 -22
  69. package/app/core/plugins.py +525 -0
  70. package/app/core/portguard.py +111 -111
  71. package/app/core/preview.py +293 -293
  72. package/app/core/publish/__init__.py +7 -7
  73. package/app/core/publish/auto.py +367 -367
  74. package/app/core/publish/browser.py +655 -539
  75. package/app/core/publish/fanqie.py +165 -159
  76. package/app/core/publish/flow.py +589 -440
  77. package/app/core/publish/flows-fanqie-calibrated.json +336 -332
  78. package/app/core/publish/ledger.py +229 -203
  79. package/app/core/publish/manager.py +824 -692
  80. package/app/core/publish/qimao.py +146 -141
  81. package/app/core/publish/ws.py +139 -139
  82. package/app/core/redact.py +38 -38
  83. package/app/core/remotesync.py +121 -0
  84. package/app/core/repeat_guard.py +129 -129
  85. package/app/core/router.py +398 -398
  86. package/app/core/runner.py +2142 -2067
  87. package/app/core/selfupdate.py +384 -384
  88. package/app/core/session_log.py +161 -161
  89. package/app/core/sessions.py +312 -312
  90. package/app/core/settings.py +42 -4
  91. package/app/core/settings_schema.py +270 -262
  92. package/app/core/share_page.py +114 -114
  93. package/app/core/skill_scan.py +122 -122
  94. package/app/core/skillpacks/fanqie-novel.md +80 -80
  95. package/app/core/skillpacks/market/character-bible.md +66 -66
  96. package/app/core/skillpacks/market/code-risk-checklist.md +58 -58
  97. package/app/core/skillpacks/market/git-workflow.md +57 -57
  98. package/app/core/skillpacks/market/release-notes.md +72 -72
  99. package/app/core/skillpacks/market/weekly-report.md +71 -71
  100. package/app/core/skillpacks/market/worldview-consistency.md +70 -70
  101. package/app/core/step_runner.py +132 -132
  102. package/app/core/store.py +30 -8
  103. package/app/core/task_compile.py +199 -199
  104. package/app/core/telemetry.py +292 -292
  105. package/app/core/tlsctx.py +64 -64
  106. package/app/core/token_meter.py +147 -147
  107. package/app/core/tracing.py +144 -144
  108. package/app/core/upstream.py +41 -41
  109. package/app/core/usage.py +1035 -862
  110. package/app/core/volumes.py +389 -389
  111. package/app/core/wxdigest.py +858 -858
  112. package/app/core/zentao.py +2614 -2465
  113. package/app/current-browser.png +0 -0
  114. package/app/main.py +316 -17
  115. package/app/mcp_server.py +175 -0
  116. package/app/pet.py +83 -22
  117. package/app/pick_dialog.py +110 -110
  118. package/app/plugins/code-review-helper/.codex-plugin/plugin.json +18 -0
  119. package/app/plugins/code-review-helper/skills/review.md +16 -0
  120. package/app/ui/app.js +1391 -77
  121. package/app/ui/artdiff.js +74 -74
  122. package/app/ui/board.html +162 -162
  123. package/app/ui/board.js +305 -305
  124. package/app/ui/i18n.js +249 -7
  125. package/app/ui/icons/bee.svg +79 -79
  126. package/app/ui/index.html +277 -13
  127. package/app/ui/manifest.json +16 -16
  128. package/app/ui/qrcode.js +2297 -2297
  129. package/app/ui/style.css +845 -12
  130. package/app//344/275/234/345/223/201/344/277/241/346/201/257-/344/270/203/347/214/253.md +18 -0
  131. package/bin/tutti.js +147 -147
  132. package/package.json +47 -46
  133. package/tools/wx_reader.py +261 -261
package/app/ui/style.css CHANGED
@@ -575,6 +575,75 @@ body.side-collapsed #sidebar { border-right: none; padding-left: 0; padding-righ
575
575
  #page-settings { max-width: none; }
576
576
  .subpage { display: flex; flex-direction: column; gap: 20px; }
577
577
 
578
+ /* ---------------- 内置浏览器工作区 ---------------- */
579
+ .browser-shell {
580
+ display: flex; flex-direction: column; min-height: min(760px, calc(100vh - 140px));
581
+ border: 1px solid var(--border); border-radius: 16px; overflow: hidden;
582
+ background: var(--panel); box-shadow: var(--shadow);
583
+ }
584
+ .browser-head { display: flex; align-items: center; gap: 12px; min-height: 48px; padding: 7px 12px 0; background: var(--sidebar); border-bottom: 1px solid var(--border); }
585
+ .browser-tabs { display: flex; align-items: flex-end; gap: 4px; min-width: 0; flex: 1; overflow-x: auto; }
586
+ .browser-tab { display: inline-flex; align-items: center; gap: 7px; min-width: 160px; max-width: 240px; padding: 9px 12px; border: 1px solid transparent; border-bottom: 0; border-radius: 9px 9px 0 0; background: transparent; color: var(--muted); cursor: pointer; font: inherit; font-size: 12.5px; }
587
+ .browser-tab span:not(.browser-tab-close) { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
588
+ .browser-tab.active { color: var(--text); background: var(--panel); border-color: var(--border); }
589
+ .browser-tab:hover { color: var(--text); background: var(--panel2); }
590
+ .browser-tab .ico { width: 14px; height: 14px; flex: none; }
591
+ .browser-tab-close { margin-left: auto; color: var(--muted); font-size: 16px; line-height: 1; opacity: .7; }
592
+ .browser-tab-close:hover { color: var(--bad); opacity: 1; }
593
+ .browser-tab-add { display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px; margin: 0 0 4px 2px; border: 0; border-radius: 7px; background: transparent; color: var(--muted); cursor: pointer; }
594
+ .browser-tab-add:hover { color: var(--text); background: var(--panel2); }
595
+ .browser-status { display: inline-flex; align-items: center; gap: 7px; flex: none; color: var(--muted); font-size: 11px; white-space: nowrap; }
596
+ .browser-status-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--ok); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ok) 14%, transparent); }
597
+ .browser-toolbar { display: flex; align-items: center; gap: 6px; padding: 10px 12px; background: var(--panel); border-bottom: 1px solid var(--border); }
598
+ .browser-toolbar .icon-btn { width: 30px; height: 30px; flex: none; }
599
+ .browser-address-wrap { display: flex; align-items: center; min-width: 0; flex: 1; height: 34px; padding: 0 4px 0 11px; border: 1px solid var(--border-strong); border-radius: 9px; background: var(--panel2); }
600
+ .browser-address-wrap:focus-within { border-color: var(--accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 13%, transparent); }
601
+ .browser-lock { width: 14px; height: 14px; flex: none; color: var(--ok); }
602
+ .browser-address-wrap input { min-width: 0; flex: 1; height: 100%; padding: 0 9px; border: 0; outline: 0; background: transparent; color: var(--text); font: 12.5px var(--mono); }
603
+ .browser-go { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; border: 0; border-radius: 7px; background: transparent; color: var(--muted); cursor: pointer; }
604
+ .browser-go:hover { background: var(--panel); color: var(--accent); }
605
+ .browser-external { flex: none; }
606
+ .browser-shortcuts { display: flex; align-items: center; gap: 7px; padding: 9px 12px; overflow-x: auto; border-bottom: 1px solid var(--border); background: color-mix(in srgb, var(--panel2) 58%, transparent); }
607
+ .browser-shortcut { display: inline-flex; align-items: center; gap: 7px; padding: 5px 9px; border: 1px solid var(--border); border-radius: 7px; background: var(--panel); color: var(--muted); cursor: pointer; font: inherit; font-size: 11.5px; white-space: nowrap; }
608
+ .browser-shortcut:hover { color: var(--text); border-color: var(--border-strong); background: var(--panel2); }
609
+ .shortcut-mark { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; border-radius: 5px; color: #fff; font: 700 10px/1 var(--font-ui); }
610
+ .shortcut-mark.google { background: #4285f4; }.shortcut-mark.github { background: #24292f; }.shortcut-mark.mdn { background: #83d130; font-size: 8px; }.shortcut-mark.preview { background: var(--accent); }
611
+ .browser-stage { position: relative; display: flex; flex: 1; min-height: 420px; background: var(--bg); }
612
+ .browser-frame { display: block; width: 100%; height: 100%; min-height: 420px; flex: 1; border: 0; background: #fff; }
613
+ .browser-frame-error {
614
+ display: flex;
615
+ align-items: center;
616
+ justify-content: center;
617
+ flex-direction: column;
618
+ gap: 8px;
619
+ width: 100%;
620
+ min-height: 360px;
621
+ padding: 32px 22px;
622
+ color: var(--muted);
623
+ background: var(--bg);
624
+ text-align: center;
625
+ }
626
+ .browser-frame-error-mark {
627
+ display: grid;
628
+ place-items: center;
629
+ width: 48px;
630
+ height: 48px;
631
+ border: 1px solid color-mix(in srgb, var(--warn) 40%, var(--border));
632
+ border-radius: 14px;
633
+ color: var(--warn);
634
+ background: color-mix(in srgb, var(--warn) 10%, var(--panel));
635
+ }
636
+ .browser-frame-error-mark .ico { width: 22px; height: 22px; }
637
+ .browser-frame-error h2 { margin: 2px 0 0; color: var(--text); font-size: 18px; }
638
+ .browser-frame-error p { max-width: 520px; margin: 0 0 8px; font-size: 12px; line-height: 1.55; }
639
+ .browser-empty { display: flex; align-items: center; justify-content: center; flex-direction: column; gap: 10px; width: 100%; padding: 48px 22px; text-align: center; color: var(--muted); background: radial-gradient(circle at 50% 30%, color-mix(in srgb, var(--accent) 12%, transparent), transparent 38%), var(--bg); }
640
+ .browser-empty-mark { display: grid; place-items: center; width: 66px; height: 66px; border: 1px solid color-mix(in srgb, var(--accent) 35%, var(--border)); border-radius: 18px; color: var(--accent); background: color-mix(in srgb, var(--accent) 10%, var(--panel)); }
641
+ .browser-empty-mark .ico { width: 30px; height: 30px; }
642
+ .browser-empty h2 { margin: 4px 0 0; color: var(--text); font-size: 20px; }
643
+ .browser-empty p { max-width: 480px; margin: 0 0 8px; font-size: 13px; }
644
+ .browser-foot { display: flex; align-items: center; gap: 10px; min-height: 34px; padding: 7px 12px; border-top: 1px solid var(--border); color: var(--muted); font-size: 11px; }
645
+
646
+
578
647
  /* 左栏的「设置」导航(设置模式下替换任务树) */
579
648
  .side-main { display: flex; flex-direction: column; flex: 1; min-height: 0; }
580
649
  .side-settings { display: none; flex-direction: column; flex: 1; min-height: 0; gap: 2px; overflow-y: auto; overflow-x: hidden; }
@@ -923,15 +992,15 @@ button.small { padding: 4px 10px; font-size: 12px; }
923
992
  }
924
993
  .token-gate .primary { width: 100%; padding: 10px; font-size: 14.5px; }
925
994
 
926
- /* 轻提示 */
995
+ /* 轻提示:视口正中(水平+垂直居中)。贴底时会被详情页输入条遮挡看不见 */
927
996
  .toast {
928
- position: fixed; left: 50%; bottom: 34px; transform: translateX(-50%) translateY(12px);
997
+ position: fixed; left: 50%; top: 50%; transform: translate(-50%, -46%);
929
998
  z-index: 300; max-width: min(460px, calc(100vw - 40px));
930
999
  background: var(--panel); color: var(--text); border: 1px solid var(--border-strong);
931
1000
  border-radius: 10px; box-shadow: var(--shadow); padding: 10px 16px; font-size: 13px;
932
1001
  opacity: 0; pointer-events: none; transition: opacity .2s, transform .2s;
933
1002
  }
934
- .toast.show { opacity: 1; transform: translateX(-50%) translateY(0); }
1003
+ .toast.show { opacity: 1; transform: translate(-50%, -50%); }
935
1004
  .toast.bad { border-color: var(--bad); color: var(--bad); }
936
1005
 
937
1006
  /* 减少动效(无障碍;headless 截图验证也靠它定格最终态) */
@@ -1177,6 +1246,16 @@ body.inspector-open #inspector { display: flex; }
1177
1246
  /* 手机顶栏精简:皮肤入口撤下(皮肤在 设置 → 皮肤),只留明暗图标 */
1178
1247
  #btn-skin { display: none; }
1179
1248
  .page-title { font-size: 14px; }
1249
+ .browser-shell { min-height: calc(100vh - 112px); border-radius: 10px; }
1250
+ .browser-head { padding: 6px 8px 0; }
1251
+ .browser-status { display: none; }
1252
+ .browser-toolbar { padding: 7px; gap: 3px; flex-wrap: wrap; }
1253
+ .browser-toolbar .icon-btn { width: 28px; height: 28px; }
1254
+ .browser-address-wrap { order: 2; flex-basis: 100%; }
1255
+ .browser-external { margin-left: auto; }
1256
+ .browser-stage, .browser-frame { min-height: 360px; }
1257
+ .browser-tab { min-width: 128px; max-width: 180px; padding: 8px 9px; }
1258
+ .browser-foot { font-size: 10px; }
1180
1259
  main { padding: 14px 10px 70px; }
1181
1260
  .panel { padding: 13px; }
1182
1261
  .composer { padding: 16px 14px 13px; }
@@ -1185,7 +1264,6 @@ body.inspector-open #inspector { display: flex; }
1185
1264
  input, select, textarea { font-size: 16px; }
1186
1265
  .detail-head { flex-wrap: wrap; gap: 8px; }
1187
1266
  .detail-head h2 { flex-basis: 100%; order: -1; }
1188
- .toast { bottom: 20px; }
1189
1267
  }
1190
1268
 
1191
1269
  /* ---- 模型画廊 ---- */
@@ -2923,7 +3001,7 @@ main.chat-fill #run-detail.chat-mode {
2923
3001
  #run-detail.chat-mode .rd-pane[data-pane="chat"] { flex: 1; min-height: 380px; height: auto; }
2924
3002
  .rd-chat { display: flex; flex-direction: column; height: 100%; min-height: 0; }
2925
3003
  .rd-chat-flow { flex: 1 1 auto; overflow-y: auto; display: flex; flex-direction: column; gap: 24px;
2926
- max-width: 1000px; width: 100%; margin: 0 auto; padding: 20px 12px 12px;
3004
+ max-width: min(1200px, 100%); width: 100%; margin: 0 auto; padding: 20px 12px 12px;
2927
3005
  scroll-behavior: smooth; }
2928
3006
  .chat-row { display: flex; gap: 12px; align-items: flex-start; }
2929
3007
  .chat-row.me { justify-content: flex-end; }
@@ -2965,7 +3043,7 @@ main.chat-fill #run-detail.chat-mode {
2965
3043
  /* 思考过程块(2026-09-22 用户诉求「把思考过程打印出来」):内置智能体流式抓的
2966
3044
  * 模型思维链。运行中=常开实时块(呼吸点+逐句长出);结束后=折叠摘要可回看。
2967
3045
  * 正文位等宽缩一号、弱化——它是「过程」,不能盖过下面的正式回答。 */
2968
- .chat-think { max-width: 1000px; margin: 0 0 6px; border: 1px dashed var(--border-strong);
3046
+ .chat-think { max-width: min(1200px, 100%); margin: 0 0 6px; border: 1px dashed var(--border-strong);
2969
3047
  border-radius: 10px; background: color-mix(in srgb, var(--muted) 7%, transparent);
2970
3048
  font-size: 12.5px; }
2971
3049
  .chat-think .ct-body { max-height: 240px; overflow: auto; padding: 7px 10px 8px;
@@ -2994,7 +3072,7 @@ details.chat-think[open] > summary { border-bottom: 1px dashed var(--border-stro
2994
3072
  .chat-think .ct-dot, .chat-live-text::after { animation: none; opacity: .6; }
2995
3073
  }
2996
3074
  /* 底部输入条:整块圆角卡片,+ 在左、发送在右(flex 列布局天然钉底) */
2997
- .rd-chat-bar { flex: none; max-width: 1000px; width: calc(100% - 24px); margin: 8px auto 8px;
3075
+ .rd-chat-bar { flex: none; max-width: min(1200px, 100%); width: calc(100% - 24px); margin: 8px auto 8px;
2998
3076
  border: 1px solid var(--border-strong); border-radius: 18px; background: var(--panel);
2999
3077
  padding: 8px 10px 9px; transition: border-color .15s, box-shadow .15s;
3000
3078
  box-shadow: 0 1px 6px color-mix(in srgb, var(--text) 5%, transparent); }
@@ -3256,6 +3334,148 @@ span.imgcap:hover { border-color: var(--accent); color: var(--accent); }
3256
3334
  100% { offset-distance: 100%; opacity: 0; transform: rotate(-4deg); }
3257
3335
  }
3258
3336
 
3337
+ /* ================= CodeBee workbench refresh =================
3338
+ * A quieter Codex-inspired shell: a slim navigation rail, a compact project
3339
+ * browser, and a single centered command surface. Existing page states and
3340
+ * controls keep their original DOM hooks; this layer only changes geometry.
3341
+ */
3342
+ :root {
3343
+ --cb-ink: #18212b;
3344
+ --cb-muted: #71808e;
3345
+ --cb-line: #e2e7eb;
3346
+ --cb-surface: #ffffff;
3347
+ --cb-canvas: #f7f8fa;
3348
+ --cb-rail: #eef1f3;
3349
+ --cb-orange: var(--accent);
3350
+ --cb-orange-soft: color-mix(in srgb, var(--accent) 10%, transparent);
3351
+ }
3352
+
3353
+ html[data-theme="light"][data-skin="ocean"] {
3354
+ --bg: var(--cb-canvas);
3355
+ --sidebar: #f0f2f4;
3356
+ --panel: var(--cb-surface);
3357
+ --panel2: #f4f6f8;
3358
+ --border: var(--cb-line);
3359
+ --border-strong: #cfd7de;
3360
+ --text: var(--cb-ink);
3361
+ --muted: var(--cb-muted);
3362
+ --accent: var(--cb-orange);
3363
+ --accent2: #d95420;
3364
+ --shadow: 0 16px 44px rgba(31, 43, 54, .08);
3365
+ }
3366
+
3367
+ #app { grid-template-columns: 46px 224px minmax(0, 1fr); background: var(--bg); }
3368
+ body.side-collapsed #app { grid-template-columns: 46px 0 minmax(0, 1fr); }
3369
+
3370
+ .side-rail {
3371
+ display: flex; flex-direction: column; align-items: center; gap: 7px;
3372
+ padding: 12px 7px 10px; background: var(--cb-rail); border-right: 1px solid var(--cb-line);
3373
+ }
3374
+ .rail-btn {
3375
+ width: 32px; height: 32px; display: grid; place-items: center; padding: 0;
3376
+ border: 0; border-radius: 9px; background: transparent; color: #84909a; cursor: pointer;
3377
+ transition: color .15s ease, background-color .15s ease, transform .15s ease;
3378
+ }
3379
+ .rail-btn:hover { color: var(--cb-ink); background: rgba(255,255,255,.78); }
3380
+ .rail-btn.active { color: var(--cb-orange); background: #fff; box-shadow: 0 2px 8px rgba(37, 45, 52, .08); }
3381
+ .rail-btn:active { transform: scale(.94); }
3382
+ .rail-btn .ico { width: 17px; height: 17px; }
3383
+ .rail-spacer { flex: 1; }
3384
+
3385
+ #sidebar { padding: 13px 10px 10px; background: var(--sidebar); border-right: 1px solid var(--cb-line); }
3386
+ .brand { min-height: 39px; padding: 4px 8px 12px; gap: 8px; border-bottom: 1px solid var(--cb-line); }
3387
+ .brand-bee { display: grid; place-items: center; width: 21px; height: 21px; color: var(--cb-orange); }
3388
+ .brand-bee .ico { width: 19px; height: 19px; stroke-width: 1.8; }
3389
+ .brand-name { color: var(--cb-ink); font-size: 15px; letter-spacing: .02em; }
3390
+ .brand-caret { width: 13px; height: 13px; margin-left: 1px; color: #95a0a9; transform: rotate(90deg); }
3391
+ .new-task, .side-search { min-height: 35px; border-radius: 8px; }
3392
+ .new-task { margin-top: 10px; color: var(--cb-ink); }
3393
+ .new-task:hover, .side-search:hover { background: #e6eaed; }
3394
+ .side-search { color: var(--cb-muted); }
3395
+ .side-quick { margin: 9px 0 8px; }
3396
+ .qitem { min-height: 34px; border-radius: 8px; }
3397
+ .qitem.active { color: var(--cb-ink); background: #e6eaed; }
3398
+ .side-section.tasks { border-top: 1px solid var(--cb-line); padding-top: 10px; }
3399
+ .side-label { color: #89959e; font-size: 11px; letter-spacing: .06em; text-transform: uppercase; }
3400
+ .stask, .sdir summary { border-radius: 7px; }
3401
+ .stask:hover, .sdir summary:hover { background: #e6eaed; }
3402
+ .stask.active { background: var(--cb-orange-soft); color: var(--cb-ink); }
3403
+ .side-usage { border-top: 1px solid var(--cb-line); border-radius: 8px; }
3404
+ .side-foot { border-top-color: var(--cb-line); }
3405
+
3406
+ #mainwrap { background: var(--cb-canvas); }
3407
+ .topbar { min-height: 56px; padding: 10px 22px; background: rgba(247,248,250,.9); border-bottom: 1px solid var(--cb-line); backdrop-filter: blur(16px); }
3408
+ .page-title { color: var(--cb-ink); font-size: 14px; font-weight: 650; }
3409
+ .top-actions { gap: 6px; }
3410
+ .top-actions .pill { background: transparent; border-color: transparent; color: var(--cb-muted); }
3411
+ .top-actions .pill:hover { background: #e9edf0; border-color: transparent; color: var(--cb-ink); }
3412
+ .top-actions .conn { color: var(--cb-muted); font-size: 11px; }
3413
+ main { padding: 24px 34px 72px; }
3414
+
3415
+ #sub-tasks { min-height: calc(100vh - 112px); justify-content: center; gap: 12px; }
3416
+ .composer { width: min(680px, 100%); max-width: 680px; margin: 0 auto; padding: 14px 0 0; }
3417
+ .hero-row { justify-content: center; margin-bottom: 30px; }
3418
+ .hero { color: var(--cb-ink); font-size: clamp(24px, 3vw, 31px); font-weight: 500 !important; letter-spacing: -.025em !important; text-align: center; }
3419
+ .form { gap: 0; }
3420
+ .cmp-box { overflow: visible; border: 1px solid #d9dfe4; border-radius: 18px; background: var(--cb-surface); box-shadow: 0 10px 28px rgba(41, 53, 63, .08); transition: border-color .16s ease, box-shadow .16s ease; }
3421
+ .cmp-box:focus-within { border-color: color-mix(in srgb, var(--cb-orange) 50%, #d9dfe4); box-shadow: 0 12px 34px rgba(41, 53, 63, .11), 0 0 0 3px rgba(232,108,45,.09); }
3422
+ .cmp-pills { padding: 12px 14px 2px; }
3423
+ .cmp-wd { color: var(--cb-muted); }
3424
+ .cmp-wd .input-row { gap: 5px; }
3425
+ .cmp-wd input { height: 30px; padding: 5px 8px; border: 0; background: transparent; color: var(--cb-muted); font-size: 12px; }
3426
+ .cmp-wd input:focus { box-shadow: none; }
3427
+ .cmp-wd .ico { width: 14px; height: 14px; }
3428
+ .cmp-hint { margin: 0 15px 2px; font-size: 11px; }
3429
+ .cmp-context-note { margin: 6px 16px 0; color: #8a969f; font-size: 11px; }
3430
+ .cmp-context-note .ico { width: 13px; height: 13px; }
3431
+ #f-goal { min-height: 96px; padding: 11px 16px; border: 0; border-radius: 0; background: transparent; color: var(--cb-ink); font-size: 15px; line-height: 1.6; }
3432
+ #f-goal::placeholder { color: #a7b0b7; }
3433
+ #f-goal:focus { box-shadow: none; }
3434
+ .cmp-bar { min-height: 48px; padding: 7px 10px 9px 13px; border-top: 1px solid #edf0f2; }
3435
+ .type-pick, .cmp-sel { color: var(--cb-muted); background: #f4f6f7; border-color: #e1e6e9; }
3436
+ .type-pick:hover, .cmp-sel:hover { color: var(--cb-ink); background: #edf0f2; }
3437
+ .cmp-send { gap: 6px; }
3438
+ .cmp-send .primary.round { width: 34px; height: 34px; background: var(--cb-orange); box-shadow: 0 4px 12px rgba(232,108,45,.24); }
3439
+ .cmp-send .primary.round:hover { background: #d95b20; }
3440
+ .att-strip .ghost { border-color: transparent; color: var(--cb-muted); }
3441
+ .att-strip .ghost:hover { background: #f1f3f5; }
3442
+
3443
+ main .panel.wide { max-width: 1040px; margin-left: auto; margin-right: auto; }
3444
+ .page { max-width: 1120px; }
3445
+ .panel { border-radius: 14px; box-shadow: 0 8px 22px rgba(41,53,63,.05); }
3446
+ .panel-head { border-bottom-color: var(--cb-line); }
3447
+ button.primary { background: var(--cb-orange); box-shadow: 0 3px 10px rgba(232,108,45,.2); }
3448
+ button.primary:hover { filter: brightness(.96); }
3449
+
3450
+ @media (max-width: 860px) {
3451
+ #app { grid-template-columns: 42px minmax(0, 1fr); }
3452
+ #sidebar { position: fixed; z-index: 30; left: 42px; top: 0; bottom: 0; width: 228px; transform: translateX(0); box-shadow: 16px 0 34px rgba(30,40,50,.12); }
3453
+ body.side-collapsed #app { grid-template-columns: 42px minmax(0, 1fr); }
3454
+ body.side-collapsed #sidebar { transform: translateX(-110%); opacity: 0; }
3455
+ main { padding: 20px 16px 58px; }
3456
+ .topbar { padding: 9px 14px; }
3457
+ .top-actions .pill:nth-child(n+3) { display: none; }
3458
+ #sub-tasks { min-height: calc(100vh - 92px); }
3459
+ .hero { font-size: 24px; }
3460
+ }
3461
+
3462
+ @media (max-width: 560px) {
3463
+ .side-rail { padding-left: 5px; padding-right: 5px; }
3464
+ .rail-btn { width: 30px; height: 30px; }
3465
+ .page-title-wrap { display: none; }
3466
+ .topbar { justify-content: space-between; }
3467
+ .top-actions { margin-left: auto; }
3468
+ .cmp-box { border-radius: 15px; }
3469
+ .cmp-pills { padding: 9px 11px 0; }
3470
+ #f-goal { min-height: 116px; font-size: 14px; }
3471
+ .cmp-bar { align-items: flex-end; }
3472
+ .cmp-send .cmp-sel { display: none; }
3473
+ }
3474
+
3475
+ @media (prefers-reduced-motion: reduce) {
3476
+ .rail-btn, .cmp-box, .primary { transition: none; }
3477
+ }
3478
+
3259
3479
  /* 报告里的 md 围栏代码块走 codeBlockHTML(.code-block 行号表格):
3260
3480
  抵消 .report td 的表格边框/内距,避免代码格画成九宫格 */
3261
3481
  .report .code-block td { border: none; }
@@ -4046,11 +4266,13 @@ body.inspector-open #run-detail #rd-log.rd-logdrawer {
4046
4266
  .chat-result .cr-head { display: flex; align-items: center; gap: 8px; font-weight: 600;
4047
4267
  font-size: 13.5px; color: var(--ok); }
4048
4268
  .chat-result.bad .cr-head { color: var(--bad); }
4269
+ .chat-result.partial .cr-head { color: var(--warn); }
4049
4270
  .chat-result.off .cr-head { color: var(--muted); }
4050
4271
  .chat-result .cr-head .ico { width: 16px; height: 16px; flex: none; }
4051
4272
  .chat-result .cr-meta { font-size: 12px; color: var(--muted); margin-top: 5px; }
4052
4273
  .chat-result .cr-err { font-size: 12.5px; color: var(--bad); margin-top: 8px; line-height: 1.5;
4053
4274
  white-space: pre-wrap; overflow-wrap: anywhere; }
4275
+ .chat-result.partial .cr-err { color: var(--warn); }
4054
4276
  .chat-result .cr-files { margin-top: 10px; }
4055
4277
  .chat-result .cr-files-title { font-size: 12px; color: var(--muted); margin-bottom: 6px; }
4056
4278
  .chat-result .cr-steps { margin-top: 10px; font-size: 12.5px; }
@@ -4080,8 +4302,8 @@ main:has(> #page-settings > #sub-runs:not(.hidden)) { padding-bottom: 28px; }
4080
4302
  justify-content: center;
4081
4303
  }
4082
4304
  #sub-tasks .composer {
4083
- width: min(100%, 820px);
4084
- max-width: 820px;
4305
+ width: min(100%, 680px);
4306
+ max-width: 680px;
4085
4307
  margin: clamp(12px, 7vh, 72px) auto 0;
4086
4308
  padding: 0 0 36px;
4087
4309
  overflow: visible;
@@ -4235,9 +4457,14 @@ main:has(> #page-settings > #sub-runs:not(.hidden)) { padding-bottom: 28px; }
4235
4457
  height: 31px;
4236
4458
  box-shadow: none;
4237
4459
  }
4238
- /* 类型只留底部工具栏一个入口(胶囊+下拉菜单):下方快捷 chips 与其内容重复,
4239
- 不再展示;DOM 保留(测试做存在性计数,display:none 不影响)。 */
4240
- #sub-tasks .cmp-quick { display: none; }
4460
+ /* 类型快捷 chips(2026-09-29 按 ZCode 首页构图恢复展示):卡下一排居中
4461
+ ghost pills,点选即定类型;与底部工具栏入口并存,不算重复入口 */
4462
+ #sub-tasks .cmp-quick {
4463
+ display: flex;
4464
+ justify-content: center;
4465
+ flex-wrap: wrap;
4466
+ margin: 16px 0 2px;
4467
+ }
4241
4468
  #sub-tasks .cmp-chip {
4242
4469
  min-height: 28px;
4243
4470
  padding: 4px 10px;
@@ -4774,6 +5001,49 @@ main.chat-fill #run-detail.chat-mode {
4774
5001
  }
4775
5002
  main.chat-fill #run-detail.chat-mode > .rd-main { overflow: hidden; }
4776
5003
 
5004
+ /* Codex 式构图(≥1600px 宽屏):时间线在整窗居中成一窄柱,任务卡脱离栏位
5005
+ 浮在右上留白里(实底+投影),不再占一条停靠列;对话柱宽度自动给浮卡让位,
5006
+ 任何窗宽下都不重叠。<1600px 回落停靠网格,≤980px 维持竖排。 */
5007
+ @media (min-width: 1600px) {
5008
+ main.chat-fill #run-detail.chat-mode {
5009
+ --rd-card-w: clamp(248px, 13.5vw, 284px);
5010
+ --rd-card-gap: clamp(28px, 2.2vw, 40px);
5011
+ display: block;
5012
+ padding-bottom: 6px; /* 输入条往视口底压(默认 20px 呼吸太大) */
5013
+ /* 摘掉玻璃面板的 transform/backdrop-filter:它们会把 fixed 后代的包含块
5014
+ 劫持到工作台上,浮卡就没法贴视口右上角了(模糊在 92% 实底上本就不可见)。
5015
+ transform 还被 cb-rise 入场动画的 fill=both 永久钉住(动画值压过普通声明),
5016
+ 所以动画一并关掉 */
5017
+ transform: none;
5018
+ backdrop-filter: none;
5019
+ animation: none;
5020
+ }
5021
+ /* 输入条往视口底压:4298 的详情态 28px 底距 + 工作台呼吸 + 条自身边距
5022
+ 叠出来 42px 太悬浮;浮卡模式收到 ~22px(同特异性靠文件序靠后取胜) */
5023
+ main:has(> #page-settings > #sub-runs:not(.hidden)) { padding-bottom: 8px; }
5024
+ main.chat-fill #run-detail.chat-mode > .rd-main { height: 100%; }
5025
+ main.chat-fill #run-detail.chat-mode > #rd-railcol {
5026
+ position: fixed;
5027
+ top: 76px; /* topbar 64 + 呼吸 */
5028
+ right: clamp(14px, 1.5vw, 28px);
5029
+ width: var(--rd-card-w);
5030
+ max-height: calc(100vh - 92px);
5031
+ z-index: 40; /* 浮卡层级;日志抽屉(50)展开时盖过它 */
5032
+ }
5033
+ main.chat-fill #run-detail.chat-mode #rd-rail {
5034
+ background: var(--panel); /* 浮卡实底,不透出底下时间线 */
5035
+ box-shadow: 0 18px 44px rgba(6, 18, 35, .16), 0 2px 10px rgba(6, 18, 35, .08);
5036
+ }
5037
+ #run-detail.chat-mode .rd-chat-flow,
5038
+ #run-detail.chat-mode .rd-chat-bar {
5039
+ max-width: min(960px, calc(100% - 2 * (var(--rd-card-w) + var(--rd-card-gap))));
5040
+ }
5041
+ /* 对话模式里按需打开的其它分区(步骤/蜂巢…):右侧整体给浮卡让位 */
5042
+ #run-detail.chat-mode .rd-pane:not([data-pane="chat"]) {
5043
+ padding-right: calc(var(--rd-card-w) + 24px);
5044
+ }
5045
+ }
5046
+
4777
5047
  @media (max-width: 980px) {
4778
5048
  #run-detail,
4779
5049
  main.chat-fill #run-detail.chat-mode {
@@ -5958,6 +6228,13 @@ button.request-busy > * { opacity: .18; }
5958
6228
  .su-spark .ks-line { fill: none; stroke: var(--accent); stroke-width: 1.6;
5959
6229
  stroke-linejoin: round; stroke-linecap: round; }
5960
6230
  .su-spark .ks-area { stroke: none; fill: var(--accent); opacity: .16; }
6231
+ /* 实时更新脉冲:token 数字变化时短暂点亮再淡回(app.js 数字变了才挂 .su-live) */
6232
+ .side-usage.su-live .su-tok { animation: su-live 1.1s ease-out; }
6233
+ @keyframes su-live {
6234
+ 0%, 40% { color: var(--accent); }
6235
+ 100% { }
6236
+ }
6237
+ @media (prefers-reduced-motion: reduce) { .side-usage.su-live .su-tok { animation: none; } }
5961
6238
 
5962
6239
  /* 计数徽章:导航项右侧的灰底数字胶囊;0 时整块收起(不留空位) */
5963
6240
  .nav-badge {
@@ -6177,3 +6454,559 @@ table.fp-xls { border-collapse: collapse; font-family: var(--mono); font-size: 1
6177
6454
  .rd-timeout-row label { color: var(--muted); white-space: nowrap; }
6178
6455
  .rd-timeout-row select { flex: 0 0 auto; min-width: 96px; }
6179
6456
  .rd-timeout-row select:disabled { opacity: .55; cursor: not-allowed; }
6457
+
6458
+ /* ---------------- 禅道·修复记录归档区(追加于文件尾防并行重排) ---------------- */
6459
+ /* 已归档卡:整体降透明度弱化,标题链接维持可点 */
6460
+ .zt-archived { opacity: .62; }
6461
+ .zt-archived .head .name { text-decoration: line-through; text-decoration-thickness: 1px; text-decoration-color: var(--muted); }
6462
+ /* 已归档折叠头:按钮形态(可聚焦),箭头随开合转 90° */
6463
+ button.zt-arch-head {
6464
+ display: flex; align-items: center; gap: 6px; margin: 10px 0 4px;
6465
+ padding: 6px 10px; border: 1px dashed var(--border); border-radius: 10px;
6466
+ background: none; color: var(--muted); font-size: 12.5px; cursor: pointer; width: 100%;
6467
+ }
6468
+ button.zt-arch-head .ico { transition: transform .15s; }
6469
+ button.zt-arch-head.open .ico { transform: rotate(90deg); }
6470
+ button.zt-arch-head:hover { border-color: var(--accent); color: var(--accent); }
6471
+ .zt-arch-list { display: grid; gap: 10px; margin-top: 6px; }
6472
+
6473
+ /* Final layout pass: kept at EOF so legacy skin/component rules cannot undo it. */
6474
+ html[data-theme="light"][data-skin="ocean"] {
6475
+ --bg: #f7f8fa; --sidebar: #f0f2f4; --panel: #fff; --panel2: #f4f6f8;
6476
+ --border: #e2e7eb; --border-strong: #cfd7de; --text: #18212b; --muted: #71808e;
6477
+ --accent: #1f6fd0; --accent2: #5b4fe0; --shadow: 0 16px 44px rgba(31,43,54,.08);
6478
+ }
6479
+ #app { grid-template-columns: 46px 224px minmax(0, 1fr); background: var(--bg); }
6480
+ body.side-collapsed #app { grid-template-columns: 46px 0 minmax(0, 1fr); }
6481
+ .side-rail { display:flex; flex-direction:column; align-items:center; gap:7px; padding:12px 7px 10px; background:#eef1f3; border-right:1px solid #e2e7eb; }
6482
+ .rail-btn { width:32px; height:32px; display:grid; place-items:center; padding:0; border:0; border-radius:9px; background:transparent; color:#84909a; cursor:pointer; transition:color .15s,background-color .15s,transform .15s; }
6483
+ .rail-btn:hover { color:#18212b; background:#fff; }
6484
+ .rail-btn.active { color:var(--accent); background:#fff; box-shadow:0 2px 8px rgba(37,45,52,.08); }
6485
+ .rail-btn:active { transform:scale(.94); }
6486
+ .rail-btn .ico { width:17px; height:17px; }
6487
+ .rail-spacer { flex:1; }
6488
+ #sidebar { padding:13px 10px 10px; background:var(--sidebar); border-right:1px solid #e2e7eb; }
6489
+ .brand { min-height:39px; padding:4px 8px 12px; gap:8px; border-bottom:1px solid #e2e7eb; }
6490
+ .brand-bee { display:grid; place-items:center; width:21px; height:21px; color:var(--accent); }
6491
+ .brand-bee .ico { width:19px; height:19px; stroke-width:1.8; }
6492
+ .brand-name { color:#18212b; font-size:15px; letter-spacing:.02em; }
6493
+ .brand-caret { width:13px; height:13px; margin-left:1px; color:#95a0a9; transform:rotate(90deg); }
6494
+ .new-task, .side-search { min-height:35px; border-radius:8px; }
6495
+ .new-task { margin-top:10px; color:#18212b; }
6496
+ .new-task:hover, .side-search:hover, .stask:hover, .sdir summary:hover { background:#e6eaed; }
6497
+ .side-search { color:#71808e; }
6498
+ .side-quick { margin:9px 0 8px; }
6499
+ .side-section.tasks { border-top:1px solid #e2e7eb; padding-top:10px; }
6500
+ .side-label { color:#89959e; font-size:11px; letter-spacing:.06em; text-transform:uppercase; }
6501
+ .stask.active { background:color-mix(in srgb, var(--accent) 10%, transparent); color:#18212b; }
6502
+ .side-usage { border-top:1px solid #e2e7eb; border-radius:8px; }
6503
+ .side-foot { border-top-color:#e2e7eb; }
6504
+ #mainwrap { background:#f7f8fa; }
6505
+ .topbar { min-height:56px; padding:10px 22px; background:rgba(247,248,250,.9); border-bottom:1px solid #e2e7eb; backdrop-filter:blur(16px); }
6506
+ .page-title { color:#18212b; font-size:14px; font-weight:650; }
6507
+ .top-actions { gap:6px; }
6508
+ .top-actions .pill { background:transparent; border-color:transparent; color:#71808e; }
6509
+ .top-actions .pill:hover { background:#e9edf0; border-color:transparent; color:#18212b; }
6510
+ main { padding:24px 34px 72px; }
6511
+ #sub-tasks { min-height:calc(100vh - 112px); justify-content:center; gap:12px; }
6512
+ .composer { width:min(680px,100%); max-width:680px; margin:0 auto; padding:14px 0 0; }
6513
+ .hero-row { justify-content:center; margin-bottom:18px; }
6514
+ .hero { color:#18212b; font-size:clamp(24px,3vw,31px); font-weight:500 !important; letter-spacing:-.025em !important; text-align:center; }
6515
+ .cmp-box { overflow:visible; border:1px solid #d9dfe4; border-radius:18px; background:#fff; box-shadow:0 10px 28px rgba(41,53,63,.08); }
6516
+ .cmp-box:focus-within { border-color:#e8a17f; box-shadow:0 12px 34px rgba(41,53,63,.11),0 0 0 3px rgba(232,108,45,.09); }
6517
+ .cmp-pills { padding:12px 14px 2px; }
6518
+ .cmp-wd input { height:30px; padding:5px 8px; border:0; background:transparent; color:#71808e; font-size:12px; }
6519
+ .cmp-wd input:focus { box-shadow:none; }
6520
+ .cmp-wd .ico { width:14px; height:14px; }
6521
+ .cmp-hint { margin:0 15px 2px; font-size:11px; }
6522
+ .cmp-context-note { margin:6px 16px 0; color:#8a969f; font-size:11px; }
6523
+ .cmp-context-note .ico { width:13px; height:13px; }
6524
+ #f-goal { min-height:96px; padding:11px 16px; border:0; border-radius:0; background:transparent; color:#18212b; font-size:15px; line-height:1.6; }
6525
+ #f-goal:focus { box-shadow:none; }
6526
+ .cmp-bar { min-height:48px; padding:7px 10px 9px 13px; border-top:1px solid #edf0f2; }
6527
+ .type-pick, .cmp-sel { color:#71808e; background:#f4f6f7; border-color:#e1e6e9; }
6528
+ .type-pick:hover, .cmp-sel:hover { color:#18212b; background:#edf0f2; }
6529
+ .cmp-send { gap:6px; }
6530
+ .cmp-send .primary.round { width:34px; height:34px; background:var(--accent); box-shadow:0 4px 12px color-mix(in srgb, var(--accent) 24%, transparent); }
6531
+ .att-strip .ghost { border-color:transparent; color:#71808e; }
6532
+ .att-strip .ghost:hover { background:#f1f3f5; }
6533
+ main .panel.wide { max-width:1040px; margin-left:auto; margin-right:auto; }
6534
+ button.primary { background:var(--accent); box-shadow:0 3px 10px color-mix(in srgb, var(--accent) 20%, transparent); }
6535
+ button.primary:hover { filter:brightness(.96); }
6536
+ @media (max-width:860px) {
6537
+ #app, body.side-collapsed #app { grid-template-columns:42px minmax(0,1fr); }
6538
+ #sidebar { position:fixed; z-index:30; left:42px; top:0; bottom:0; width:228px; transform:translateX(0); box-shadow:16px 0 34px rgba(30,40,50,.12); }
6539
+ body.side-collapsed #sidebar { transform:translateX(-110%); opacity:0; }
6540
+ main { padding:20px 16px 58px; }
6541
+ .topbar { padding:9px 14px; }
6542
+ #sub-tasks { min-height:calc(100vh - 92px); }
6543
+ .hero { font-size:24px; }
6544
+ }
6545
+ @media (max-width:560px) {
6546
+ .side-rail { padding-left:5px; padding-right:5px; }
6547
+ .rail-btn { width:30px; height:30px; }
6548
+ .page-title-wrap { display:none; }
6549
+ .topbar { justify-content:space-between; }
6550
+ .cmp-box { border-radius:15px; }
6551
+ .cmp-pills { padding:9px 11px 0; }
6552
+ #f-goal { min-height:116px; font-size:14px; }
6553
+ .cmp-send .cmp-sel { display:none; }
6554
+ }
6555
+
6556
+ /* Keep the layout refresh on the existing skin palette. The workbench should
6557
+ inherit ocean/forest/amber/violet/contrast choices instead of imposing a new
6558
+ brand color. */
6559
+ html[data-skin="ocean"][data-theme="light"] {
6560
+ --bg: #fff; --sidebar: #eff5fd; --panel: #fff; --panel2: #f0f6fd;
6561
+ --border: #d7e3f4; --border-strong: #b9cde8; --text: #0c1a2c; --muted: #526983;
6562
+ --accent: #1f6fd0; --accent2: #5b4fe0; --ok: #0d9a72; --warn: #a9761a;
6563
+ --bad: #d23c58; --chip-queued-bg: #f0f6fd; --log-bg: #f4f8fe; --log-text: #33475f;
6564
+ }
6565
+ .brand-bee { display: none; }
6566
+ .brand-name { color: var(--text); }
6567
+ .side-rail { background: var(--sidebar); border-right-color: var(--border); }
6568
+ .rail-btn:hover, .rail-btn.active { background: var(--panel); }
6569
+ .topbar, #mainwrap { background: var(--bg); }
6570
+ .cmp-box { background: var(--panel); border-color: var(--border-strong); }
6571
+ .rail-btn.active { color: var(--accent); }
6572
+ .new-task:hover, .side-search:hover, .stask:hover, .sdir summary:hover { background: var(--panel2); }
6573
+ .stask.active { background: color-mix(in srgb, var(--accent) 10%, transparent); color: var(--text); }
6574
+ .cmp-box:focus-within { border-color: color-mix(in srgb, var(--accent) 50%, var(--border-strong)); box-shadow: 0 12px 34px color-mix(in srgb, var(--accent) 10%, transparent), 0 0 0 3px color-mix(in srgb, var(--accent) 10%, transparent); }
6575
+ .cmp-send .primary.round, button.primary { background: var(--accent); box-shadow: 0 4px 12px color-mix(in srgb, var(--accent) 24%, transparent); }
6576
+ .cmp-send .primary.round:hover, button.primary:hover { background: var(--accent2); }
6577
+ .cmp-context-note, .cmp-wd input, .att-strip .ghost { color: var(--muted); }
6578
+ .hero, .page-title, .new-task { color: var(--text); }
6579
+ html[data-skin="contrast"] .rail-btn.active { box-shadow: none; }
6580
+
6581
+ /* 一级导航已经迁移到最左侧窄轨,项目栏只保留项目与任务内容,避免重复入口。 */
6582
+ .side-quick { display: none; }
6583
+ .side-foot { display: none; }
6584
+
6585
+ /* 项目栏顶部:搜索收进标题行,新任务回归普通命令项。 */
6586
+ .side-main { position: relative; }
6587
+ .brand-row { display: flex; align-items: center; min-height: 39px; padding: 0 10px 0 12px; border-bottom: 1px solid var(--border); }
6588
+ .brand-row .brand { flex: 1 1 auto; width: auto; min-width: 0; padding: 4px 0 12px; border-bottom: 0; }
6589
+ .brand-tool { width: 28px; height: 28px; display: inline-flex; align-items: center; justify-content: center; flex: none; padding: 0; border: 0; background: transparent; color: var(--muted); border-radius: 7px; cursor: pointer; }
6590
+ .brand-tool:hover { color: var(--text); background: var(--panel2); }
6591
+ .brand-tool .ico { width: 15px; height: 15px; }
6592
+ .brand-row .side-search { position: static; min-height: 28px; height: 28px; margin: 0; }
6593
+ .brand-row .side-search .ss-label, .brand-row .side-search .kbd { display: none; }
6594
+ .side-main > .new-task {
6595
+ width: calc(100% - 24px); min-height: 34px; margin: 8px 12px 6px 12px; padding: 7px 9px;
6596
+ background: transparent; color: var(--text); border: 0; border-radius: 8px;
6597
+ box-shadow: none; font-weight: 400; transform: none;
6598
+ }
6599
+ .side-main > .new-task:hover {
6600
+ background: var(--panel2); color: var(--text); box-shadow: none; transform: none;
6601
+ }
6602
+ .side-main > .new-task .kbd { display: none; }
6603
+ .side-main > .new-task .ico { width: 15px; height: 15px; color: var(--muted); }
6604
+ .side-label-row { min-height: 34px; }
6605
+ .side-label-row .foot-btn { display: flex; }
6606
+
6607
+ /* Typography pass: slightly larger working text and clearer hierarchy. */
6608
+ body { font-size: 14px; }
6609
+ #sidebar { font-size: 13px; }
6610
+ .brand-name { font-size: 16px; font-weight: 700; }
6611
+ .new-task { font-size: 14px; }
6612
+ .side-label { font-size: 12px; letter-spacing: .04em; }
6613
+ .sdir summary, .stask { font-size: 13px; }
6614
+ .sdir summary, .stask { line-height: 1.55; }
6615
+ .side-usage { font-size: 12px; }
6616
+ .topbar .page-title { font-size: 15px; }
6617
+ main { font-size: 14px; }
6618
+ #run-list .item { border-color: color-mix(in srgb, var(--border) 72%, transparent); border-radius: 11px; padding: 11px 12px; }
6619
+ #run-list .item .rt .name { font-size: 14px; }
6620
+ #run-list .item .rt .desc { font-size: 12px; }
6621
+ #run-list .item .time { font-size: 12px; }
6622
+ .cmp-context-note, .cmp-hint, .cmp-estimate { font-size: 12px; }
6623
+ #f-goal::placeholder { color: color-mix(in srgb, var(--muted) 78%, #fff); }
6624
+
6625
+ /* Match the reference proportions: 46px rail + 216px project column. */
6626
+ #app { grid-template-columns: 46px 216px minmax(0, 1fr); }
6627
+ body.side-collapsed #app { grid-template-columns: 46px 0 minmax(0, 1fr); }
6628
+ #sidebar { padding: 13px 0 10px; }
6629
+ .brand { width: 100%; padding: 4px 12px 12px; justify-content: flex-start; text-align: left; }
6630
+ .brand {
6631
+ display: flex; align-items: center; gap: 7px; min-height: 39px;
6632
+ margin: 0; border: 0; outline: 0; background: transparent;
6633
+ color: var(--text); font: inherit; cursor: pointer;
6634
+ }
6635
+ .brand:hover { background: transparent; }
6636
+ .brand:focus, .brand:active { border: 0; outline: 0; box-shadow: none; }
6637
+ .brand:focus-visible { outline: 2px solid color-mix(in srgb, var(--accent) 45%, transparent); outline-offset: -2px; }
6638
+ .brand-name { flex: 0 0 auto; }
6639
+ .side-main > .new-task { margin-left: 12px; margin-right: 10px; }
6640
+ .side-section.tasks { padding-left: 12px; padding-right: 10px; }
6641
+ .side-usage { margin-left: 10px; margin-right: 10px; }
6642
+ .side-usage { width: calc(100% - 20px); max-width: calc(100% - 20px); }
6643
+
6644
+ .brand-menu {
6645
+ position: absolute; z-index: 80; top: 47px; left: 8px; width: 204px;
6646
+ padding: 6px; border: 1px solid var(--border-strong); border-radius: 12px;
6647
+ background: var(--panel); box-shadow: 0 14px 32px color-mix(in srgb, var(--text) 16%, transparent);
6648
+ }
6649
+ .brand-menu-item {
6650
+ display: flex; align-items: center; justify-content: space-between; gap: 10px;
6651
+ min-height: 48px; padding: 8px 9px; border-radius: 8px; color: var(--text);
6652
+ font-size: 13px;
6653
+ }
6654
+ .brand-menu-item.selected { background: color-mix(in srgb, var(--panel2) 70%, transparent); }
6655
+ .brand-menu-item b { display: block; font-weight: 600; }
6656
+ .brand-menu-item small { display: block; margin-top: 2px; color: var(--muted); font-size: 11px; }
6657
+ .brand-menu-item > .ico { width: 15px; height: 15px; color: var(--muted); }
6658
+ .brand-caret { transition: transform .15s ease; }
6659
+ .brand[aria-expanded="true"] .brand-caret { transform: rotate(-90deg); }
6660
+
6661
+ /* Stable three-column header: workspace name | notifications | search. */
6662
+ .brand-row {
6663
+ display: grid; grid-template-columns: minmax(0, 1fr) 28px 28px;
6664
+ align-items: center; gap: 2px;
6665
+ }
6666
+ .brand-row > #btn-brand {
6667
+ display: inline-flex !important; width: 100% !important; min-width: 0 !important;
6668
+ flex: none !important; align-items: center; justify-content: flex-start;
6669
+ height: 28px; padding: 0 !important; overflow: visible;
6670
+ }
6671
+ .brand-row > #btn-brand .brand-name {
6672
+ display: inline-block !important; visibility: visible !important;
6673
+ flex: none; white-space: nowrap;
6674
+ }
6675
+ .brand-row > .brand-tool { position: static !important; width: 28px; min-width: 28px; }
6676
+ .side-section.tasks { border-top: 0 !important; margin-top: 0 !important; padding-top: 8px; }
6677
+
6678
+ /* Compact the handoff from the new-chat action to the project list. */
6679
+ .side-main > .new-task { margin-bottom: 2px; }
6680
+ .side-section.tasks { padding-top: 4px; }
6681
+
6682
+ /* The task landing page previously exceeded main's content box by 4px,
6683
+ which made an idle workspace show a permanent vertical scrollbar. */
6684
+ #sub-tasks { min-height: calc(100dvh - 116px); }
6685
+
6686
+ /* The inspector is a fourth top-level grid item (rail | project list | main | inspector).
6687
+ Keep the rail and project column in the grid when the right detail panel opens;
6688
+ the older three-column rule put the inspector on a new row and squeezed the main area. */
6689
+ body.inspector-open #app {
6690
+ grid-template-columns: 46px 216px minmax(0, 1fr) minmax(280px, 340px);
6691
+ }
6692
+ body.side-collapsed.inspector-open #app {
6693
+ grid-template-columns: 46px 0 minmax(0, 1fr) minmax(280px, 340px);
6694
+ }
6695
+
6696
+ /* Shared page rhythm: every secondary workspace uses one readable content axis.
6697
+ The task composer remains its own centered surface; all other pages align
6698
+ headings, cards, tables, and lists to the same content column. */
6699
+ #page-settings > .subpage:not(#sub-tasks) {
6700
+ width: min(1440px, 100%);
6701
+ max-width: 1440px;
6702
+ margin-inline: auto;
6703
+ gap: 16px;
6704
+ }
6705
+ #page-settings > #sub-browser {
6706
+ width: 100%;
6707
+ max-width: none;
6708
+ margin-inline: 0;
6709
+ min-height: 0;
6710
+ }
6711
+ #page-settings > #sub-browser .browser-shell {
6712
+ width: 100%;
6713
+ min-height: calc(100dvh - 116px);
6714
+ }
6715
+ #page-settings > .subpage:not(#sub-tasks) > .panel.wide {
6716
+ width: 100%;
6717
+ max-width: none;
6718
+ margin-inline: 0;
6719
+ }
6720
+ #page-settings > .subpage:not(#sub-tasks) .panel-head {
6721
+ min-height: 38px;
6722
+ margin-bottom: 14px;
6723
+ padding-bottom: 10px;
6724
+ gap: 10px;
6725
+ }
6726
+ #page-settings > .subpage:not(#sub-tasks) .panel-head h2 {
6727
+ font-size: 15px;
6728
+ line-height: 1.35;
6729
+ }
6730
+ #page-settings > .subpage:not(#sub-tasks) .hint {
6731
+ line-height: 1.55;
6732
+ }
6733
+ #page-settings > .subpage:not(#sub-tasks) .cards,
6734
+ #page-settings > .subpage:not(#sub-tasks) .list {
6735
+ min-width: 0;
6736
+ }
6737
+ #page-settings > #sub-overview .ov-title { font-size: 25px; }
6738
+ #page-settings > #sub-overview .ov-row { gap: 12px; }
6739
+ #page-settings > #sub-overview .panel { border-radius: 12px; }
6740
+
6741
+ /* Keep the current skin in charge of focus and action colors. */
6742
+ #sub-tasks .cmp-box:focus-within {
6743
+ border-color: color-mix(in srgb, var(--accent) 50%, var(--border-strong));
6744
+ box-shadow: 0 12px 34px color-mix(in srgb, var(--text) 10%, transparent),
6745
+ 0 0 0 3px color-mix(in srgb, var(--accent) 11%, transparent);
6746
+ }
6747
+ .side-rail, #sidebar { background: var(--sidebar); border-color: var(--border); }
6748
+ #mainwrap, .topbar { background: var(--bg); border-color: var(--border); }
6749
+ .rail-btn:hover, .rail-btn.active { background: var(--panel); }
6750
+ .rail-btn.active, .stask.active, .qitem.active { color: var(--accent); }
6751
+ .stask.active, .qitem.active { background: color-mix(in srgb, var(--accent) 10%, transparent); }
6752
+ .new-task:hover, .side-search:hover, .stask:hover, .sdir summary:hover { background: var(--panel2); }
6753
+ .panel { box-shadow: var(--shadow); }
6754
+ .panel-head { border-bottom-color: var(--border); }
6755
+ button.primary, .cmp-send .primary.round { background: var(--accent); box-shadow: 0 4px 12px color-mix(in srgb, var(--accent) 22%, transparent); }
6756
+ button.primary:hover, .cmp-send .primary.round:hover { background: var(--accent2); }
6757
+
6758
+ /* On small screens the inspector is an overlay. It must not add grid columns
6759
+ after the desktop four-column rule above. */
6760
+ @media (max-width: 900px) {
6761
+ #app, body.side-collapsed #app,
6762
+ body.inspector-open #app, body.side-collapsed.inspector-open #app {
6763
+ grid-template-columns: 42px minmax(0, 1fr);
6764
+ }
6765
+ #page-settings > .subpage:not(#sub-tasks) {
6766
+ width: 100%;
6767
+ max-width: none;
6768
+ }
6769
+ #page-settings > #sub-browser .browser-shell {
6770
+ min-height: calc(100dvh - 112px);
6771
+ }
6772
+ }
6773
+
6774
+ /* Browser console: this is CodeBee's operating surface, so it owns the
6775
+ available canvas instead of inheriting the centered 1040px reading column. */
6776
+ main.browser-page-active {
6777
+ display: flex;
6778
+ flex: 1 1 0;
6779
+ flex-direction: column;
6780
+ min-height: 0;
6781
+ overflow: hidden;
6782
+ padding: 0;
6783
+ }
6784
+ main.browser-page-active > #page-settings {
6785
+ display: flex;
6786
+ flex: 1 1 0;
6787
+ min-height: 0;
6788
+ width: 100%;
6789
+ max-width: none;
6790
+ margin: 0;
6791
+ }
6792
+ main.browser-page-active #page-settings > #sub-browser {
6793
+ display: flex;
6794
+ flex: 1 1 0;
6795
+ width: 100%;
6796
+ max-width: none;
6797
+ min-height: 0;
6798
+ margin: 0;
6799
+ gap: 0;
6800
+ }
6801
+ main.browser-page-active #page-settings > #sub-browser .browser-shell {
6802
+ width: 100%;
6803
+ height: 100%;
6804
+ min-height: 0;
6805
+ border: 0;
6806
+ border-radius: 0;
6807
+ box-shadow: none;
6808
+ }
6809
+ .browser-stage { min-height: 0; }
6810
+ .browser-viewport {
6811
+ display: flex;
6812
+ flex: 1 1 0;
6813
+ min-width: 0;
6814
+ min-height: 0;
6815
+ }
6816
+ .browser-context {
6817
+ display: flex;
6818
+ flex: 0 0 276px;
6819
+ flex-direction: column;
6820
+ gap: 12px;
6821
+ min-height: 0;
6822
+ padding: 15px 14px;
6823
+ overflow-y: auto;
6824
+ border-right: 1px solid var(--border);
6825
+ background: color-mix(in srgb, var(--panel2) 68%, var(--bg));
6826
+ }
6827
+ .browser-context-head,
6828
+ .browser-context-section-head {
6829
+ display: flex;
6830
+ align-items: center;
6831
+ gap: 7px;
6832
+ }
6833
+ .browser-context-kicker {
6834
+ display: inline-flex;
6835
+ align-items: center;
6836
+ gap: 7px;
6837
+ color: var(--text);
6838
+ font-size: 11px;
6839
+ font-weight: 700;
6840
+ letter-spacing: .08em;
6841
+ text-transform: uppercase;
6842
+ }
6843
+ .browser-context-kicker .ico { width: 14px; height: 14px; color: var(--accent); }
6844
+ .browser-context-live {
6845
+ display: inline-flex;
6846
+ align-items: center;
6847
+ gap: 5px;
6848
+ margin-left: auto;
6849
+ color: var(--muted);
6850
+ font-size: 10px;
6851
+ }
6852
+ .browser-context-live i {
6853
+ width: 6px; height: 6px; border-radius: 50%; background: var(--ok);
6854
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--ok) 13%, transparent);
6855
+ }
6856
+ .browser-context-select { display: flex; flex-direction: column; gap: 5px; }
6857
+ .browser-context-select label,
6858
+ .browser-context-section-head { color: var(--muted); font-size: 11px; font-weight: 650; }
6859
+ .browser-context-select select {
6860
+ width: 100%; min-width: 0; height: 34px; padding: 0 9px;
6861
+ border-radius: 8px; font-size: 12px; background: var(--panel);
6862
+ }
6863
+ .browser-task-card {
6864
+ display: flex; flex-direction: column; gap: 8px; min-height: 88px;
6865
+ padding: 11px; border: 1px solid var(--border); border-radius: 10px;
6866
+ background: var(--panel);
6867
+ }
6868
+ .browser-task-title { color: var(--text); font-size: 13px; font-weight: 700; line-height: 1.4; overflow-wrap: anywhere; }
6869
+ .browser-task-meta { display: flex; flex-wrap: wrap; gap: 5px; color: var(--muted); font-size: 10.5px; }
6870
+ .browser-task-meta span { display: inline-flex; align-items: center; gap: 4px; }
6871
+ .browser-task-meta .browser-task-status { color: var(--accent); font-weight: 650; }
6872
+ .browser-task-goal { display: -webkit-box; overflow: hidden; color: var(--muted); font-size: 11px; line-height: 1.45; -webkit-box-orient: vertical; -webkit-line-clamp: 3; }
6873
+ .browser-task-empty { color: var(--muted); font-size: 12px; line-height: 1.5; }
6874
+ .browser-context-actions { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; }
6875
+ .browser-context-actions button:first-child { grid-column: 1 / -1; }
6876
+ .browser-context-actions button { min-width: 0; justify-content: center; }
6877
+ .browser-context-section { padding-top: 12px; border-top: 1px solid var(--border); }
6878
+ .browser-context-section-head { justify-content: space-between; margin-bottom: 8px; color: var(--text); }
6879
+ .browser-context-section-head .icon-btn { width: 22px; height: 22px; }
6880
+ .browser-context-section-head .icon-btn .ico { width: 13px; height: 13px; }
6881
+ .browser-verify-card, .browser-publish-card { color: var(--muted); font-size: 11px; line-height: 1.5; }
6882
+ .browser-verify-line { display: flex; align-items: center; gap: 7px; color: var(--text); }
6883
+ .browser-verify-line .ico { width: 14px; height: 14px; }
6884
+ .browser-verify-line.ok { color: var(--ok); }
6885
+ .browser-verify-line.bad { color: var(--bad); }
6886
+ .browser-verify-command { margin-top: 5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: 10px var(--mono); }
6887
+ .browser-publish-note { margin: -2px 0 8px; color: var(--muted); font-size: 10px; line-height: 1.45; }
6888
+ .browser-publish-platforms { display: grid; gap: 5px; }
6889
+ .browser-publish-platform { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
6890
+ .browser-publish-platform b { color: var(--text); font-weight: 600; }
6891
+ .browser-publish-platform span { color: var(--muted); font-size: 10px; }
6892
+ .browser-empty {
6893
+ align-items: stretch;
6894
+ justify-content: stretch;
6895
+ padding: 0;
6896
+ overflow: auto;
6897
+ text-align: left;
6898
+ }
6899
+ .browser-home-workbench {
6900
+ display: grid;
6901
+ grid-template-rows: auto auto auto minmax(94px, 1fr);
6902
+ gap: 14px;
6903
+ width: 100%;
6904
+ min-height: 100%;
6905
+ padding: clamp(16px, 2vw, 28px);
6906
+ background:
6907
+ linear-gradient(135deg, color-mix(in srgb, var(--accent) 8%, transparent), transparent 42%),
6908
+ radial-gradient(circle at 92% 8%, color-mix(in srgb, var(--accent) 10%, transparent), transparent 28%),
6909
+ var(--bg);
6910
+ }
6911
+ .browser-home-hero {
6912
+ display: grid;
6913
+ grid-template-columns: auto minmax(0, 1fr) auto;
6914
+ align-items: center;
6915
+ gap: 16px;
6916
+ padding: 18px 20px;
6917
+ border: 1px solid var(--border);
6918
+ border-radius: 14px;
6919
+ background: color-mix(in srgb, var(--panel) 88%, transparent);
6920
+ box-shadow: 0 12px 28px color-mix(in srgb, var(--text) 6%, transparent);
6921
+ }
6922
+ .browser-home-copy { min-width: 0; }
6923
+ .browser-home-eyebrow { display: block; margin-bottom: 3px; color: var(--accent); font-size: 10.5px; font-weight: 750; letter-spacing: .1em; text-transform: uppercase; }
6924
+ .browser-home-hero h2 { margin: 0 0 4px; color: var(--text); font-size: clamp(20px, 2vw, 27px); line-height: 1.25; }
6925
+ .browser-home-hero p { max-width: 760px; margin: 0; color: var(--muted); font-size: 12.5px; line-height: 1.55; }
6926
+ .browser-home-mode { display: inline-flex; align-items: center; gap: 6px; padding: 6px 9px; border: 1px solid var(--border); border-radius: 999px; color: var(--muted); background: var(--panel2); font-size: 10.5px; white-space: nowrap; }
6927
+ .browser-home-mode i { width: 6px; height: 6px; border-radius: 50%; background: var(--ok); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ok) 13%, transparent); }
6928
+ .browser-home-current {
6929
+ padding: 14px 16px;
6930
+ border: 1px solid var(--border);
6931
+ border-radius: 12px;
6932
+ background: color-mix(in srgb, var(--panel2) 62%, var(--panel));
6933
+ }
6934
+ .browser-home-section-label { display: block; margin-bottom: 7px; color: var(--muted); font-size: 10px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; }
6935
+ .browser-home-task-row { display: flex; align-items: center; justify-content: space-between; gap: 18px; }
6936
+ .browser-home-task-row > div { min-width: 0; }
6937
+ .browser-home-task-row h3 { margin: 0; overflow: hidden; color: var(--text); font-size: 15px; line-height: 1.35; text-overflow: ellipsis; white-space: nowrap; }
6938
+ .browser-home-task-row p { margin: 3px 0 0; overflow: hidden; color: var(--muted); font-size: 11px; text-overflow: ellipsis; white-space: nowrap; }
6939
+ .browser-home-run { flex: none; max-width: 42%; overflow: hidden; color: var(--accent); font: 10.5px var(--mono); text-overflow: ellipsis; white-space: nowrap; }
6940
+ .browser-home-workflows { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
6941
+ .browser-home-action {
6942
+ display: flex;
6943
+ align-items: center;
6944
+ gap: 13px;
6945
+ min-width: 0;
6946
+ min-height: 86px;
6947
+ padding: 15px 16px;
6948
+ border: 1px solid var(--border);
6949
+ border-radius: 12px;
6950
+ color: var(--text);
6951
+ background: var(--panel);
6952
+ box-shadow: none;
6953
+ cursor: pointer;
6954
+ text-align: left;
6955
+ transition: border-color .15s ease, background-color .15s ease, transform .15s ease;
6956
+ }
6957
+ .browser-home-action:hover:not(:disabled) { border-color: var(--border-strong); background: var(--panel2); transform: translateY(-1px); }
6958
+ .browser-home-action:disabled { cursor: default; opacity: .42; }
6959
+ .browser-home-action > .ico { width: 22px; height: 22px; color: var(--accent); }
6960
+ .browser-home-action > span { display: flex; min-width: 0; flex-direction: column; gap: 3px; }
6961
+ .browser-home-action b { font-size: 13px; font-weight: 700; }
6962
+ .browser-home-action small { overflow: hidden; color: var(--muted); font-size: 10.5px; font-weight: 400; text-overflow: ellipsis; white-space: nowrap; }
6963
+ .browser-home-action.primary { color: #fff; border-color: transparent; background: var(--accent); }
6964
+ .browser-home-action.primary:hover:not(:disabled) { background: var(--accent2); }
6965
+ .browser-home-action.primary > .ico, .browser-home-action.primary small { color: currentColor; }
6966
+ .browser-home-capabilities {
6967
+ display: grid;
6968
+ grid-template-columns: repeat(3, minmax(0, 1fr));
6969
+ gap: 10px;
6970
+ align-content: stretch;
6971
+ }
6972
+ .browser-home-capabilities > div {
6973
+ display: flex;
6974
+ align-items: center;
6975
+ gap: 10px;
6976
+ min-width: 0;
6977
+ padding: 12px 14px;
6978
+ border: 1px solid var(--border);
6979
+ border-radius: 11px;
6980
+ color: var(--muted);
6981
+ background: color-mix(in srgb, var(--panel) 68%, transparent);
6982
+ }
6983
+ .browser-home-capabilities .ico { width: 17px; height: 17px; color: var(--accent); }
6984
+ .browser-home-capabilities span { display: flex; min-width: 0; flex-direction: column; }
6985
+ .browser-home-capabilities b { color: var(--text); font-size: 11px; }
6986
+ .browser-home-capabilities small { overflow: hidden; font-size: 9.5px; text-overflow: ellipsis; white-space: nowrap; }
6987
+
6988
+ @media (max-width: 900px) {
6989
+ main.browser-page-active { overflow-y: auto; }
6990
+ .browser-stage { flex-direction: column; overflow: visible; }
6991
+ .browser-context { flex: 0 0 auto; max-height: 310px; border-right: 0; border-bottom: 1px solid var(--border); }
6992
+ .browser-viewport { min-height: 430px; }
6993
+ .browser-home-workbench { grid-template-rows: auto auto auto auto; padding: 14px; }
6994
+ .browser-home-hero { grid-template-columns: auto minmax(0, 1fr); padding: 15px; }
6995
+ .browser-home-mode { display: none; }
6996
+ .browser-home-capabilities { grid-template-columns: 1fr; }
6997
+ }
6998
+
6999
+ @media (max-width: 560px) {
7000
+ .browser-context { padding: 12px 10px; }
7001
+ .browser-viewport { min-height: 380px; }
7002
+ .browser-home-workbench { padding: 10px; }
7003
+ .browser-home-hero { grid-template-columns: 1fr; gap: 10px; }
7004
+ .browser-home-hero .browser-empty-mark { width: 46px; height: 46px; border-radius: 12px; }
7005
+ .browser-home-hero .browser-empty-mark .ico { width: 22px; height: 22px; }
7006
+ .browser-home-hero h2 { font-size: 19px; }
7007
+ .browser-home-hero p { font-size: 11.5px; }
7008
+ .browser-home-task-row { align-items: flex-start; flex-direction: column; gap: 6px; }
7009
+ .browser-home-run { max-width: 100%; }
7010
+ .browser-home-workflows { grid-template-columns: 1fr; }
7011
+ .browser-home-action { min-height: 72px; }
7012
+ }