feihong-code 7.2.0 → 7.5.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 (249) hide show
  1. package/.github/workflows/ci.yml +180 -140
  2. package/.github/workflows/release.yml +200 -173
  3. package/CHANGELOG.md +94 -115
  4. package/README.md +609 -586
  5. package/dist/agent/completion-engine.js +76 -45
  6. package/dist/agent/completion-engine.js.map +1 -1
  7. package/dist/agent/completion-postprocess.js +109 -0
  8. package/dist/agent/completion-postprocess.js.map +1 -0
  9. package/dist/agent/context-budget.js +121 -0
  10. package/dist/agent/context-budget.js.map +1 -0
  11. package/dist/agent/context-compactor.js +47 -0
  12. package/dist/agent/context-compactor.js.map +1 -1
  13. package/dist/agent/custom-agent.js +52 -52
  14. package/dist/agent/design-to-code.js +40 -40
  15. package/dist/agent/lint.js +121 -0
  16. package/dist/agent/lint.js.map +1 -0
  17. package/dist/agent/multi-agent.js +44 -44
  18. package/dist/agent/orchestrator.js +20 -20
  19. package/dist/agent/prompts.js +54 -54
  20. package/dist/agent/self-correction.js +24 -24
  21. package/dist/agent/self-heal.js +27 -27
  22. package/dist/cli/commands.js +9 -0
  23. package/dist/cli/commands.js.map +1 -1
  24. package/dist/cli/index.js +9 -0
  25. package/dist/cli/index.js.map +1 -1
  26. package/dist/cli/multi-pane-tui.js +217 -0
  27. package/dist/cli/multi-pane-tui.js.map +1 -0
  28. package/dist/cli/run.js +129 -40
  29. package/dist/cli/run.js.map +1 -1
  30. package/dist/cli/tui-run.js +79 -0
  31. package/dist/cli/tui-run.js.map +1 -0
  32. package/dist/cli/tui.js.map +1 -1
  33. package/dist/cli/version.js +1 -1
  34. package/dist/lsp/lsp-client.js +183 -0
  35. package/dist/lsp/lsp-client.js.map +1 -0
  36. package/dist/lsp/lsp-service.js +159 -0
  37. package/dist/lsp/lsp-service.js.map +1 -0
  38. package/dist/plugins/manager.js +50 -2
  39. package/dist/plugins/manager.js.map +1 -1
  40. package/dist/shared/i18n.js +108 -100
  41. package/dist/shared/i18n.js.map +1 -1
  42. package/dist/tools/generator/code-generator.js +40 -40
  43. package/dist/tools/generator/test-generator.js +9 -9
  44. package/dist/tools/shell/exec.js +23 -1
  45. package/dist/tools/shell/exec.js.map +1 -1
  46. package/dist/web/extra-apis.js +440 -0
  47. package/dist/web/extra-apis.js.map +1 -0
  48. package/dist/web/public/css/style.css +1715 -1715
  49. package/dist/web/public/index.html +1242 -1200
  50. package/dist/web/public/js/api.js +555 -496
  51. package/dist/web/public/js/app.js +2210 -2210
  52. package/dist/web/public/js/mock-api.js +234 -234
  53. package/dist/web/public/js/monaco-editor.js +363 -203
  54. package/dist/web/public/js/ui.js +2251 -1981
  55. package/dist/web/public/js/utils.js +214 -214
  56. package/dist/web/public/manifest.json +59 -59
  57. package/dist/web/public/service-worker.js +173 -173
  58. package/dist/web/server.js +97 -45
  59. package/dist/web/server.js.map +1 -1
  60. package/docs/BENCHMARK_REPORT_en.md +386 -329
  61. package/docs/BENCHMARK_REPORT_zh.md +386 -329
  62. package/docs/DPA.md +63 -0
  63. package/docs/DPA/346/225/260/346/215/256/345/244/204/347/220/206/345/215/217/350/256/256/346/250/241/346/235/277_v1.0.md +67 -0
  64. package/docs/SECURITY_WHITEPAPER.md +74 -0
  65. package/docs/SWE_BENCH_REPORT.md +55 -0
  66. package/docs/TECHNICAL_SPEC_en.md +292 -292
  67. package/docs/TECHNICAL_SPEC_zh.md +292 -292
  68. package/docs/UPDATE_NOTES_en.md +159 -159
  69. package/docs/UPDATE_NOTES_zh.md +159 -159
  70. package/docs/UPGRADE_7.2.0.md +309 -0
  71. package/docs/UPGRADE_GUIDE_7_5.md +86 -0
  72. package/docs/geo-feihong-code.html +391 -0
  73. package/docs//345/205/250/351/235/242/345/244/215/347/233/230_50/350/275/256/346/267/261/345/272/246/345/256/241/350/256/241_v7.2.0.md +208 -0
  74. package/docs//345/205/250/351/235/242/345/244/215/347/233/230_6/351/241/271/351/207/215/347/202/271/346/240/270/346/237/245_v7.2.0.md +152 -0
  75. package/docs//345/205/250/351/235/242/345/244/215/347/233/230_/350/277/220/350/241/214/346/227/266/345/256/236/346/265/213/347/211/210_v7.2.0.md +271 -0
  76. package/docs//345/220/210/350/247/204/350/256/244/350/257/201/345/207/206/345/244/207/346/270/205/345/215/225_v7.2.0.md +59 -0
  77. package/docs//345/256/211/345/205/250/347/231/275/347/232/256/344/271/246_v7.2.0.md +82 -0
  78. package/electron/main.js +404 -602
  79. package/package.json +175 -172
  80. package/templates/skills/api-design/SKILL.md +27 -0
  81. package/templates/skills/code-review/SKILL.md +35 -0
  82. package/templates/skills/dependency-upgrade/SKILL.md +29 -0
  83. package/templates/skills/doc-gen/SKILL.md +29 -0
  84. package/templates/skills/git-flow/SKILL.md +26 -0
  85. package/templates/skills/onboarding/SKILL.md +27 -0
  86. package/templates/skills/performance/SKILL.md +29 -0
  87. package/templates/skills/refactor/SKILL.md +28 -0
  88. package/templates/skills/security-audit/SKILL.md +28 -0
  89. package/templates/skills/test-gen/SKILL.md +30 -0
  90. package/tool-schema.json +197 -197
  91. package/dist/hello.js +0 -14
  92. package/dist/hello.js.map +0 -1
  93. package/dist/self-evolve/hook.ts +0 -80
  94. package/dist/self-evolve/manager.d.ts +0 -8
  95. package/dist/web/public/vendor/monaco/vs/abap-D-t0cyap.js +0 -1
  96. package/dist/web/public/vendor/monaco/vs/apex-CcIm7xu6.js +0 -1
  97. package/dist/web/public/vendor/monaco/vs/assets/css.worker-URu8fCFR.js +0 -97
  98. package/dist/web/public/vendor/monaco/vs/assets/editor.worker-lj3bdIIn.js +0 -30
  99. package/dist/web/public/vendor/monaco/vs/assets/editorWebWorkerMain-CA_vMoUU.js +0 -30
  100. package/dist/web/public/vendor/monaco/vs/assets/html.worker-D1SL3iM8.js +0 -474
  101. package/dist/web/public/vendor/monaco/vs/assets/json.worker-CoJx_OPf.js +0 -62
  102. package/dist/web/public/vendor/monaco/vs/assets/ts.worker-BWKtMYOk.js +0 -67722
  103. package/dist/web/public/vendor/monaco/vs/azcli-BA0tQDCg.js +0 -1
  104. package/dist/web/public/vendor/monaco/vs/basic-languages/monaco.contribution.js +0 -1
  105. package/dist/web/public/vendor/monaco/vs/bat-C397hTD6.js +0 -1
  106. package/dist/web/public/vendor/monaco/vs/bicep-DF5aW17k.js +0 -2
  107. package/dist/web/public/vendor/monaco/vs/cameligo-plsz8qhj.js +0 -1
  108. package/dist/web/public/vendor/monaco/vs/clojure-Y2auQMzK.js +0 -1
  109. package/dist/web/public/vendor/monaco/vs/coffee-Bu45yuWE.js +0 -1
  110. package/dist/web/public/vendor/monaco/vs/cpp-CkKPQIni.js +0 -1
  111. package/dist/web/public/vendor/monaco/vs/csharp-CX28MZyh.js +0 -1
  112. package/dist/web/public/vendor/monaco/vs/csp-D8uWnyxW.js +0 -1
  113. package/dist/web/public/vendor/monaco/vs/css-CaeNmE3S.js +0 -3
  114. package/dist/web/public/vendor/monaco/vs/css.worker-CyhWkhHo.js +0 -1
  115. package/dist/web/public/vendor/monaco/vs/cssMode-CV6Ay48H.js +0 -1
  116. package/dist/web/public/vendor/monaco/vs/cypher-DVThT8BS.js +0 -1
  117. package/dist/web/public/vendor/monaco/vs/dart-CmGfCvrO.js +0 -1
  118. package/dist/web/public/vendor/monaco/vs/dockerfile-CZqqYdch.js +0 -1
  119. package/dist/web/public/vendor/monaco/vs/ecl-30fUercY.js +0 -1
  120. package/dist/web/public/vendor/monaco/vs/editor/editor.main.css +0 -1
  121. package/dist/web/public/vendor/monaco/vs/editor/editor.main.js +0 -1
  122. package/dist/web/public/vendor/monaco/vs/editor/editor.worker.js +0 -1
  123. package/dist/web/public/vendor/monaco/vs/editor-KLE6jdfb.js +0 -831
  124. package/dist/web/public/vendor/monaco/vs/editor.js +0 -1
  125. package/dist/web/public/vendor/monaco/vs/editorWorkerHost-fVE1cjcC.js +0 -35
  126. package/dist/web/public/vendor/monaco/vs/elixir-xjPaIfzF.js +0 -1
  127. package/dist/web/public/vendor/monaco/vs/flow9-DqtmStfK.js +0 -1
  128. package/dist/web/public/vendor/monaco/vs/freemarker2-FWreY7v7.js +0 -3
  129. package/dist/web/public/vendor/monaco/vs/fsharp-BOMdg4U1.js +0 -1
  130. package/dist/web/public/vendor/monaco/vs/go-D_hbi-Jt.js +0 -1
  131. package/dist/web/public/vendor/monaco/vs/graphql-CKUU4kLG.js +0 -1
  132. package/dist/web/public/vendor/monaco/vs/handlebars-CZi4pHCH.js +0 -1
  133. package/dist/web/public/vendor/monaco/vs/hcl-DTaboeZW.js +0 -1
  134. package/dist/web/public/vendor/monaco/vs/html-j_7ZTNRU.js +0 -1
  135. package/dist/web/public/vendor/monaco/vs/html.worker-CA3iAimZ.js +0 -1
  136. package/dist/web/public/vendor/monaco/vs/htmlMode-27by_KM4.js +0 -1
  137. package/dist/web/public/vendor/monaco/vs/index-049xrXrp.js +0 -1
  138. package/dist/web/public/vendor/monaco/vs/index-CBVt3dzv.js +0 -5
  139. package/dist/web/public/vendor/monaco/vs/index.js +0 -1
  140. package/dist/web/public/vendor/monaco/vs/ini-CsNwO04R.js +0 -1
  141. package/dist/web/public/vendor/monaco/vs/initialize-DL0l1TGY.js +0 -1
  142. package/dist/web/public/vendor/monaco/vs/java-CI4ZMsH9.js +0 -1
  143. package/dist/web/public/vendor/monaco/vs/javascript-DTJl4Jn1.js +0 -1
  144. package/dist/web/public/vendor/monaco/vs/json.worker-BizpAl9O.js +0 -1
  145. package/dist/web/public/vendor/monaco/vs/jsonMode-DLUiMUrI.js +0 -1
  146. package/dist/web/public/vendor/monaco/vs/julia-BwzEvaQw.js +0 -1
  147. package/dist/web/public/vendor/monaco/vs/kotlin-IUYPiTV8.js +0 -1
  148. package/dist/web/public/vendor/monaco/vs/language/css/css.worker.js +0 -66
  149. package/dist/web/public/vendor/monaco/vs/language/css/monaco.contribution.js +0 -1
  150. package/dist/web/public/vendor/monaco/vs/language/html/html.worker.js +0 -443
  151. package/dist/web/public/vendor/monaco/vs/language/html/monaco.contribution.js +0 -1
  152. package/dist/web/public/vendor/monaco/vs/language/json/json.worker.js +0 -17
  153. package/dist/web/public/vendor/monaco/vs/language/json/monaco.contribution.js +0 -1
  154. package/dist/web/public/vendor/monaco/vs/language/typescript/monaco.contribution.js +0 -1
  155. package/dist/web/public/vendor/monaco/vs/language/typescript/ts.worker.js +0 -67693
  156. package/dist/web/public/vendor/monaco/vs/less-C0eDYdqa.js +0 -2
  157. package/dist/web/public/vendor/monaco/vs/lexon-iON-Kj97.js +0 -1
  158. package/dist/web/public/vendor/monaco/vs/liquid-CLJYelW6.js +0 -1
  159. package/dist/web/public/vendor/monaco/vs/loader.js +0 -1368
  160. package/dist/web/public/vendor/monaco/vs/lspLanguageFeatures-BIkJOWLw.js +0 -2
  161. package/dist/web/public/vendor/monaco/vs/lua-DtygF91M.js +0 -1
  162. package/dist/web/public/vendor/monaco/vs/m3-CsR4AuFi.js +0 -1
  163. package/dist/web/public/vendor/monaco/vs/main-BEx-Fmlo.js +0 -15
  164. package/dist/web/public/vendor/monaco/vs/main-DsK8pnKg.js +0 -3
  165. package/dist/web/public/vendor/monaco/vs/markdown-C_rD0bIw.js +0 -1
  166. package/dist/web/public/vendor/monaco/vs/mdx-CpzZIPHF.js +0 -1
  167. package/dist/web/public/vendor/monaco/vs/mips-CiYP61RB.js +0 -1
  168. package/dist/web/public/vendor/monaco/vs/monaco.contribution-9cKT3C7t.js +0 -1
  169. package/dist/web/public/vendor/monaco/vs/monaco.contribution-BE88ZNGY.js +0 -1
  170. package/dist/web/public/vendor/monaco/vs/monaco.contribution-BPhsneLd.js +0 -1
  171. package/dist/web/public/vendor/monaco/vs/monaco.contribution-BgRy6xDf.js +0 -1
  172. package/dist/web/public/vendor/monaco/vs/msdax-C38-sJlp.js +0 -1
  173. package/dist/web/public/vendor/monaco/vs/mysql-CdtbpvbG.js +0 -1
  174. package/dist/web/public/vendor/monaco/vs/nls/lang/cs.d.ts +0 -1
  175. package/dist/web/public/vendor/monaco/vs/nls/lang/cs.js +0 -9
  176. package/dist/web/public/vendor/monaco/vs/nls/lang/de.d.ts +0 -1
  177. package/dist/web/public/vendor/monaco/vs/nls/lang/de.js +0 -9
  178. package/dist/web/public/vendor/monaco/vs/nls/lang/es.d.ts +0 -1
  179. package/dist/web/public/vendor/monaco/vs/nls/lang/es.js +0 -9
  180. package/dist/web/public/vendor/monaco/vs/nls/lang/fr.d.ts +0 -1
  181. package/dist/web/public/vendor/monaco/vs/nls/lang/fr.js +0 -9
  182. package/dist/web/public/vendor/monaco/vs/nls/lang/it.d.ts +0 -1
  183. package/dist/web/public/vendor/monaco/vs/nls/lang/it.js +0 -9
  184. package/dist/web/public/vendor/monaco/vs/nls/lang/ja.d.ts +0 -1
  185. package/dist/web/public/vendor/monaco/vs/nls/lang/ja.js +0 -9
  186. package/dist/web/public/vendor/monaco/vs/nls/lang/ko.d.ts +0 -1
  187. package/dist/web/public/vendor/monaco/vs/nls/lang/ko.js +0 -9
  188. package/dist/web/public/vendor/monaco/vs/nls/lang/pl.d.ts +0 -1
  189. package/dist/web/public/vendor/monaco/vs/nls/lang/pl.js +0 -9
  190. package/dist/web/public/vendor/monaco/vs/nls/lang/pt-br.d.ts +0 -1
  191. package/dist/web/public/vendor/monaco/vs/nls/lang/pt-br.js +0 -9
  192. package/dist/web/public/vendor/monaco/vs/nls/lang/ru.d.ts +0 -1
  193. package/dist/web/public/vendor/monaco/vs/nls/lang/ru.js +0 -9
  194. package/dist/web/public/vendor/monaco/vs/nls/lang/tr.d.ts +0 -1
  195. package/dist/web/public/vendor/monaco/vs/nls/lang/tr.js +0 -9
  196. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-cn.d.ts +0 -1
  197. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-cn.js +0 -9
  198. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-tw.d.ts +0 -1
  199. package/dist/web/public/vendor/monaco/vs/nls/lang/zh-tw.js +0 -9
  200. package/dist/web/public/vendor/monaco/vs/nls.messages-loader.js +0 -1
  201. package/dist/web/public/vendor/monaco/vs/objective-c-CntZFaHX.js +0 -1
  202. package/dist/web/public/vendor/monaco/vs/pascal-r6kuqfl_.js +0 -1
  203. package/dist/web/public/vendor/monaco/vs/pascaligo-BiXoTmXh.js +0 -1
  204. package/dist/web/public/vendor/monaco/vs/perl-DABw_TcH.js +0 -1
  205. package/dist/web/public/vendor/monaco/vs/pgsql-me_jFXeX.js +0 -1
  206. package/dist/web/public/vendor/monaco/vs/php-D_kh-9LK.js +0 -1
  207. package/dist/web/public/vendor/monaco/vs/pla-VfZjczW0.js +0 -1
  208. package/dist/web/public/vendor/monaco/vs/postiats-BBSzz8Pk.js +0 -1
  209. package/dist/web/public/vendor/monaco/vs/powerquery-Dt-g_2cc.js +0 -1
  210. package/dist/web/public/vendor/monaco/vs/powershell-B-7ap1zc.js +0 -1
  211. package/dist/web/public/vendor/monaco/vs/protobuf-BmtuEB1A.js +0 -2
  212. package/dist/web/public/vendor/monaco/vs/pug-BRpRNeEb.js +0 -1
  213. package/dist/web/public/vendor/monaco/vs/python-CqWUUgfu.js +0 -1
  214. package/dist/web/public/vendor/monaco/vs/qsharp-BzsFaUU9.js +0 -1
  215. package/dist/web/public/vendor/monaco/vs/r-f8dDdrp4.js +0 -1
  216. package/dist/web/public/vendor/monaco/vs/razor-hok5y9Km.js +0 -1
  217. package/dist/web/public/vendor/monaco/vs/redis-fvZQY4PI.js +0 -1
  218. package/dist/web/public/vendor/monaco/vs/redshift-45Et0LQi.js +0 -1
  219. package/dist/web/public/vendor/monaco/vs/restructuredtext-C7UUFKFD.js +0 -1
  220. package/dist/web/public/vendor/monaco/vs/ruby-CZO8zYTz.js +0 -1
  221. package/dist/web/public/vendor/monaco/vs/rust-Bfetafyc.js +0 -1
  222. package/dist/web/public/vendor/monaco/vs/sb-3GYllVck.js +0 -1
  223. package/dist/web/public/vendor/monaco/vs/scala-foMgrKo1.js +0 -1
  224. package/dist/web/public/vendor/monaco/vs/scheme-CHdMtr7p.js +0 -1
  225. package/dist/web/public/vendor/monaco/vs/scss-C1cmLt9V.js +0 -3
  226. package/dist/web/public/vendor/monaco/vs/shell-ClXCKCEW.js +0 -1
  227. package/dist/web/public/vendor/monaco/vs/solidity-MZ6ExpPy.js +0 -1
  228. package/dist/web/public/vendor/monaco/vs/sophia-DWkuSsPQ.js +0 -1
  229. package/dist/web/public/vendor/monaco/vs/sparql-AUGFYSyk.js +0 -1
  230. package/dist/web/public/vendor/monaco/vs/sql-32GpJSV2.js +0 -1
  231. package/dist/web/public/vendor/monaco/vs/st-CuDFIVZ_.js +0 -1
  232. package/dist/web/public/vendor/monaco/vs/swift-t-PfMj7W.js +0 -1
  233. package/dist/web/public/vendor/monaco/vs/systemverilog-Ch4vA8Yt.js +0 -1
  234. package/dist/web/public/vendor/monaco/vs/tcl-D74tq1nH.js +0 -1
  235. package/dist/web/public/vendor/monaco/vs/toggleHighContrast-qGX7E9o7.js +0 -61
  236. package/dist/web/public/vendor/monaco/vs/ts.worker-2QLmBukE.js +0 -1
  237. package/dist/web/public/vendor/monaco/vs/tsMode-B0S_kp2q.js +0 -11
  238. package/dist/web/public/vendor/monaco/vs/twig-C6taOxMV.js +0 -1
  239. package/dist/web/public/vendor/monaco/vs/typescript-_2t_511t.js +0 -1
  240. package/dist/web/public/vendor/monaco/vs/typespec-8OfoLt6R.js +0 -1
  241. package/dist/web/public/vendor/monaco/vs/vb-Dyb2648j.js +0 -1
  242. package/dist/web/public/vendor/monaco/vs/wgsl-BhLXMOR0.js +0 -298
  243. package/dist/web/public/vendor/monaco/vs/workers-BBttULjf.js +0 -1
  244. package/dist/web/public/vendor/monaco/vs/xml-cZjNDqDT.js +0 -1
  245. package/dist/web/public/vendor/monaco/vs/yaml-A1fOIdH6.js +0 -1
  246. package/dist/web/web-config.js +0 -143
  247. package/dist/web/web-config.js.map +0 -1
  248. package/docs/DEPLOYMENT.md +0 -382
  249. package/docs/MODEL_FINETUNING.md +0 -405
@@ -1,1717 +1,1717 @@
1
- :root {
2
- --bg: #f5f7fa;
3
- --card: #ffffff;
4
- --ink: #1f2933;
5
- --ink-2: #475569;
6
- --muted: #6b7785;
7
- --brand: #2563eb;
8
- --brand-soft: #eff4ff;
9
- --ok: #16a34a;
10
- --err: #dc2626;
11
- --warn: #d97706;
12
- --border: #e3e8ef;
13
- --line: #e3e8ef;
14
- --sidebar-width: 56px;
15
- --topbar-height: 48px;
16
- }
17
- .dark {
18
- --bg: #0f172a;
19
- --card: #1e293b;
20
- --ink: #f1f5f9;
21
- --ink-2: #cbd5e1;
22
- --muted: #94a3b8;
23
- --brand: #3b82f6;
24
- --brand-soft: #1e3a8a;
25
- --border: #334155;
26
- --line: #334155;
27
- }
28
- * { box-sizing: border-box; }
29
- body {
30
- margin: 0;
31
- font-family: -apple-system, "Segoe UI", "PingFang SC", "Microsoft YaHei", Roboto, Helvetica, Arial, sans-serif;
32
- background: var(--bg);
33
- color: var(--ink);
34
- height: 100vh;
35
- overflow: hidden;
36
- }
37
-
38
- /* ========== 登录遮罩 ========== */
39
- #loginOverlay {
40
- position: fixed; inset: 0; background: var(--bg); z-index: 50;
41
- display: flex; align-items: center; justify-content: center;
42
- }
43
- #loginOverlay .login-card {
44
- background: var(--card); border: 1px solid var(--border); border-radius: 16px;
45
- padding: 32px; width: 360px; box-shadow: 0 10px 30px rgba(31,41,51,0.08);
46
- }
47
- #loginOverlay h2 { margin: 0 0 4px; font-size: 20px; }
48
- #loginOverlay p { margin: 0 0 20px; color: var(--muted); font-size: 13px; }
49
- #loginOverlay input {
50
- width: 100%; border: 1px solid var(--border); border-radius: 10px;
51
- padding: 10px 12px; font-size: 14px; margin-bottom: 12px; font-family: inherit;
52
- background: var(--card); color: var(--ink);
53
- }
54
- #loginOverlay button {
55
- width: 100%; border: none; background: var(--brand); color: #fff;
56
- border-radius: 10px; padding: 10px; font-size: 14px; cursor: pointer;
57
- }
58
- #loginOverlay .login-status { font-size: 13px; margin-top: 10px; min-height: 18px; }
59
- #loginOverlay .login-status.err { color: var(--err); }
60
-
61
- /* ========== 主布局 ========== */
62
- .app-layout {
63
- display: flex;
64
- flex-direction: column;
65
- height: 100vh;
66
- display: none;
67
- }
68
- .app-layout.show { display: flex; }
69
- /* 已登录状态:提前隐藏登录页,显示应用布局,避免闪烁(感觉像打开两次) */
70
- html.logged-in #loginOverlay { display: none !important; }
71
- html.logged-in .app-layout { display: flex !important; }
72
-
73
- /* ========== 顶部导航栏 ========== */
74
- .topbar {
75
- height: var(--topbar-height);
76
- background: var(--card);
77
- border-bottom: 1px solid var(--border);
78
- display: flex;
79
- align-items: center;
80
- padding: 0 16px;
81
- gap: 12px;
82
- flex-shrink: 0;
83
- }
84
- .topbar-brand {
85
- font-weight: 700;
86
- font-size: 15px;
87
- color: var(--brand);
88
- display: flex;
89
- align-items: center;
90
- gap: 8px;
91
- }
92
- .topbar-brand .logo {
93
- width: 28px;
94
- height: 28px;
95
- background: var(--brand);
96
- color: #fff;
97
- border-radius: 8px;
98
- display: flex;
99
- align-items: center;
100
- justify-content: center;
101
- font-size: 14px;
102
- }
103
- .topbar-nav {
104
- display: flex;
105
- gap: 4px;
106
- margin-left: 24px;
107
- }
108
- .topbar-nav-item {
109
- padding: 6px 12px;
110
- border-radius: 8px;
111
- font-size: 13px;
112
- color: var(--ink-2);
113
- cursor: pointer;
114
- display: flex;
115
- align-items: center;
116
- gap: 6px;
117
- transition: all 0.15s;
118
- }
119
- .topbar-nav-item:hover {
120
- background: var(--bg);
121
- color: var(--ink);
122
- }
123
- .topbar-nav-item.active {
124
- background: var(--brand-soft);
125
- color: var(--brand);
126
- font-weight: 600;
127
- }
128
- .topbar-spacer { flex: 1; }
129
- .topbar-user {
130
- display: flex;
131
- align-items: center;
132
- gap: 10px;
133
- padding: 6px 10px;
134
- border-radius: 10px;
135
- cursor: pointer;
136
- transition: background 0.15s;
137
- }
138
- .topbar-user:hover { background: var(--bg); }
139
- .topbar-avatar {
140
- width: 32px;
141
- height: 32px;
142
- background: var(--brand-soft);
143
- border-radius: 50%;
144
- display: flex;
145
- align-items: center;
146
- justify-content: center;
147
- font-size: 16px;
148
- }
149
- .topbar-phone { font-size: 13px; font-weight: 500; color: var(--ink); }
150
- .lang-switcher { display: flex; align-items: center; gap: 2px; border: 1px solid var(--border); border-radius: 8px; overflow: hidden; }
151
- .lang-btn { padding: 4px 10px; font-size: 12px; cursor: pointer; border: none; background: transparent; color: var(--ink-2); font-weight: 500; transition: all 0.15s; }
152
- .lang-btn.active { background: var(--brand); color: #fff; }
153
- .lang-btn:hover:not(.active) { background: var(--bg); }
154
-
155
- /* ========== 主体内容区 ========== */
156
- /* overflow 必须为 hidden:约束内部 .messages / .sidebar 各自滚动,
157
- 原生 <select> 弹层由浏览器绘制在顶层,不受此裁剪影响。 */
158
- .main-area {
159
- flex: 1;
160
- display: flex;
161
- min-height: 0;
162
- overflow: hidden;
163
- max-width: 1400px;
164
- margin: 0 auto;
165
- width: 100%;
166
- }
167
-
168
- /* ========== 左侧侧边栏 ========== */
169
- .sidebar {
170
- width: 200px;
171
- background: var(--card);
172
- border-right: 1px solid var(--border);
173
- display: flex;
174
- flex-direction: column;
175
- padding: 12px 8px;
176
- gap: 2px;
177
- flex-shrink: 0;
178
- overflow-y: auto;
179
- }
180
- .sidebar-section {
181
- margin-bottom: 8px;
182
- padding-bottom: 8px;
183
- border-bottom: 1px solid var(--border);
184
- }
185
- .sidebar-section-title {
186
- font-size: 11px;
187
- color: var(--muted);
188
- text-transform: uppercase;
189
- letter-spacing: 0.5px;
190
- padding: 4px 8px;
191
- margin-bottom: 4px;
192
- }
193
- .sidebar-icon {
194
- width: 100%;
195
- height: 36px;
196
- border-radius: 8px;
197
- display: flex;
198
- align-items: center;
199
- gap: 10px;
200
- padding: 0 8px;
201
- cursor: pointer;
202
- color: var(--ink-2);
203
- transition: all 0.15s;
204
- position: relative;
205
- font-size: 13px;
206
- }
207
- .sidebar-icon .icon {
208
- font-size: 16px;
209
- width: 20px;
210
- text-align: center;
211
- flex-shrink: 0;
212
- }
213
- .sidebar-icon .label {
214
- flex: 1;
215
- white-space: nowrap;
216
- overflow: hidden;
217
- text-overflow: ellipsis;
218
- }
219
- .sidebar-icon .badge {
220
- font-size: 10px;
221
- padding: 2px 6px;
222
- border-radius: 10px;
223
- background: var(--brand-soft);
224
- color: var(--brand);
225
- font-weight: 600;
226
- flex-shrink: 0;
227
- }
228
- .sidebar-icon:hover {
229
- background: var(--bg);
230
- color: var(--ink);
231
- }
232
- .sidebar-icon.active {
233
- background: var(--brand-soft);
234
- color: var(--brand);
235
- font-weight: 600;
236
- }
237
- .sidebar-icon.active::before {
238
- content: '';
239
- position: absolute;
240
- left: 0;
241
- top: 50%;
242
- transform: translateY(-50%);
243
- width: 3px;
244
- height: 20px;
245
- background: var(--brand);
246
- border-radius: 0 2px 2px 0;
247
- }
248
- .sidebar-spacer { flex: 1; }
249
- .sidebar-pin {
250
- font-size: 10px;
251
- color: var(--warn);
252
- flex-shrink: 0;
253
- }
254
- .task-item {
255
- display: flex;
256
- align-items: center;
257
- gap: 8px;
258
- padding: 8px;
259
- border-radius: 6px;
260
- cursor: pointer;
261
- font-size: 12px;
262
- transition: background 0.15s;
263
- }
264
- .task-item:hover { background: var(--bg); }
265
- .task-item.active { background: var(--brand-soft); }
266
- .task-item .task-icon { font-size: 14px; }
267
- .task-item .task-title {
268
- flex: 1;
269
- white-space: nowrap;
270
- overflow: hidden;
271
- text-overflow: ellipsis;
272
- color: var(--ink-2);
273
- }
274
- .task-item.active .task-title { color: var(--brand); }
275
- .task-item .task-actions {
276
- display: none;
277
- gap: 4px;
278
- font-size: 11px;
279
- }
280
- .task-item:hover .task-actions { display: flex; }
281
- .task-item .task-actions button {
282
- padding: 2px 4px;
283
- border: none;
284
- background: transparent;
285
- cursor: pointer;
286
- border-radius: 4px;
287
- font-size: 10px;
288
- }
289
- .task-item .task-actions button:hover { background: var(--border); }
290
- .task-item .task-actions .delete-btn:hover { background: #fee2e2; color: var(--err); }
291
- .task-pinned { color: var(--warn); }
292
-
293
- /* ========== 中间对话区 ========== */
294
- .chat-area {
295
- flex: 1;
296
- display: flex;
297
- flex-direction: column;
298
- min-width: 0;
299
- background: var(--bg);
300
- }
301
-
302
- /* ========== 任务上下文头部 ========== */
303
- .task-context-header {
304
- display: flex;
305
- align-items: center;
306
- gap: 12px;
307
- padding: 12px 16px;
308
- background: var(--card);
309
- border-bottom: 1px solid var(--border);
310
- flex-shrink: 0;
311
- }
312
- .tch-left { flex: 1; min-width: 0; }
313
- .tch-title { font-size: 15px; font-weight: 700; color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
314
- .tch-sub { font-size: 12px; color: var(--muted); margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
315
- .tch-right { display: flex; align-items: center; gap: 10px; flex-shrink: 0; }
316
- .tch-time { font-size: 12px; color: var(--muted); }
317
-
318
- /* ========== 思维链路线程 ========== */
319
- .messages { flex: 1; overflow-y: auto; display: flex; flex-direction: column; gap: 10px; padding: 16px; padding-right: 4px; }
320
- .step { max-width: 92%; font-size: 13.5px; line-height: 1.6; word-break: break-word; }
321
- .step.created {
322
- align-self: stretch; background: var(--bg); border: 1px dashed var(--border);
323
- border-radius: 10px; padding: 8px 12px; color: var(--muted); font-size: 12.5px;
324
- }
325
- .step.reasoning {
326
- align-self: flex-start; background: var(--card); border: 1px solid var(--border);
327
- border-left: 3px solid var(--brand); border-radius: 10px; padding: 10px 14px;
328
- white-space: pre-wrap; color: var(--ink-2);
329
- }
330
- .step.reasoning .reasoning-head { font-size: 11px; color: var(--brand); font-weight: 600; margin-bottom: 4px; display: flex; align-items: center; gap: 6px; }
331
- .step.toolcall {
332
- align-self: flex-start; background: #fffbeb; border: 1px solid #fde68a;
333
- border-radius: 10px; padding: 8px 12px; color: #92400e; font-size: 12.5px;
334
- }
335
- .dark .step.toolcall { background: #3a2f12; color: #fcd34d; border-color: #5b4a1f; }
336
- .step.toolcall .tc-name { font-weight: 600; }
337
- .step.toolcall .tc-args {
338
- color: var(--muted); font-size: 12px; margin-top: 2px; white-space: pre-wrap; word-break: break-word;
339
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
340
- }
341
- .step.result {
342
- align-self: flex-start; background: var(--card); border: 1px solid var(--border);
343
- border-radius: 10px; padding: 8px 12px; color: var(--ink-2); font-size: 12.5px; max-width: 92%;
344
- }
345
- .step.result .res-head { font-weight: 600; display: flex; align-items: center; gap: 6px; }
346
- .step.result.ok .res-head { color: var(--ok); }
347
- .step.result.fail .res-head { color: var(--err); }
348
- .step.result .res-out {
349
- margin-top: 4px; white-space: pre-wrap; word-break: break-word; max-height: 160px; overflow-y: auto;
350
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 12px; color: var(--muted);
351
- }
352
- .step.note { align-self: stretch; background: var(--bg); border-radius: 8px; padding: 6px 12px; color: var(--muted); font-size: 12px; }
353
- /* 对话流与思维链路分隔标题 */
354
- .conv-divider {
355
- align-self: stretch; text-align: center; font-size: 11px; color: var(--muted);
356
- border-top: 1px solid var(--line); padding-top: 8px; margin-top: 4px;
357
- }
358
- .step.final {
359
- align-self: flex-end; background: var(--ok); color: #fff; border-radius: 12px;
360
- padding: 12px 16px; white-space: pre-wrap; word-break: break-word; max-width: 92%;
361
- position: relative;
362
- }
363
- .step.final .final-head { font-size: 11px; opacity: 0.85; margin-bottom: 4px; font-weight: 600; }
364
- .step.final .final-actions {
365
- position: absolute; top: 8px; right: 8px; display: flex; gap: 4px;
366
- opacity: 0.85; transition: opacity 0.2s;
367
- background: rgba(0,0,0,0.18); border-radius: 8px; padding: 2px 4px;
368
- }
369
- .step.final:hover .final-actions { opacity: 1; background: rgba(0,0,0,0.32); }
370
- .step.final .final-actions button {
371
- background: transparent; border: none; color: #fff;
372
- border-radius: 4px; padding: 3px 7px; font-size: 11px; cursor: pointer;
373
- transition: background 0.15s;
374
- }
375
- .step.final .final-actions button:hover { background: rgba(255,255,255,0.28); }
376
- .step.error {
377
- align-self: flex-end; background: var(--err); color: #fff; border-radius: 12px;
378
- padding: 12px 16px; white-space: pre-wrap; word-break: break-word; max-width: 92%;
379
- }
380
-
381
- /* 对话消息区 */
382
- .conv {
383
- flex: 1;
384
- display: flex;
385
- flex-direction: column;
386
- padding: 16px;
387
- gap: 12px;
388
- overflow: hidden;
389
- }
390
- .messages {
391
- flex: 1;
392
- overflow-y: auto;
393
- display: flex;
394
- flex-direction: column;
395
- gap: 10px;
396
- padding-right: 4px;
397
- }
398
- .msg {
399
- padding: 10px 14px;
400
- border-radius: 12px;
401
- font-size: 13.5px;
402
- line-height: 1.6;
403
- max-width: 85%;
404
- white-space: pre-wrap;
405
- word-break: break-word;
406
- position: relative;
407
- user-select: text;
408
- -webkit-user-select: text;
409
- cursor: text;
410
- }
411
- .msg-actions {
412
- position: absolute;
413
- top: 6px;
414
- right: 6px;
415
- display: none;
416
- gap: 4px;
417
- background: rgba(255,255,255,0.95);
418
- border-radius: 6px;
419
- padding: 2px;
420
- box-shadow: 0 2px 8px rgba(0,0,0,0.1);
421
- }
422
- .msg:hover .msg-actions {
423
- display: flex;
424
- }
425
- .msg-action-btn {
426
- background: none;
427
- border: none;
428
- padding: 4px 8px;
429
- font-size: 12px;
430
- cursor: pointer;
431
- border-radius: 4px;
432
- color: var(--ink-2);
433
- }
434
- .msg-action-btn:hover {
435
- background: var(--brand-soft);
436
- color: var(--brand);
437
- }
438
- .msg.user {
439
- background: var(--brand-soft);
440
- align-self: flex-end;
441
- }
442
- .msg.assistant {
443
- background: var(--card);
444
- border: 1px solid var(--border);
445
- align-self: flex-start;
446
- }
447
- /* ========== 思考过程气泡(Cursor 风格) ========== */
448
- .msg.assistant.thinking-msg {
449
- background: var(--card);
450
- border: 1px solid var(--border);
451
- border-left: 3px solid var(--brand);
452
- position: relative;
453
- padding: 10px 12px;
454
- }
455
- .thinking-header {
456
- display: flex;
457
- align-items: center;
458
- gap: 6px;
459
- cursor: pointer;
460
- user-select: none;
461
- padding: 2px 0;
462
- border-radius: 4px;
463
- transition: background 0.15s;
464
- }
465
- .thinking-header:hover {
466
- background: var(--brand-soft);
467
- }
468
- .thinking-arrow {
469
- font-size: 10px;
470
- color: var(--ink-2);
471
- transition: transform 0.2s;
472
- flex-shrink: 0;
473
- width: 14px;
474
- text-align: center;
475
- }
476
- .thinking-label {
477
- font-size: 12px;
478
- font-weight: 600;
479
- color: var(--ink);
480
- flex-shrink: 0;
481
- }
482
- .thinking-summary {
483
- font-size: 11px;
484
- color: var(--muted);
485
- overflow: hidden;
486
- text-overflow: ellipsis;
487
- white-space: nowrap;
488
- }
489
- .thinking-body {
490
- margin-top: 8px;
491
- border-top: 1px solid var(--line);
492
- padding-top: 6px;
493
- }
494
- .thinking-step {
495
- display: flex;
496
- align-items: flex-start;
497
- gap: 6px;
498
- padding: 3px 0;
499
- font-size: 12px;
500
- color: var(--ink-2);
501
- line-height: 1.5;
502
- }
503
- .thinking-step-icon {
504
- flex-shrink: 0;
505
- width: 16px;
506
- text-align: center;
507
- font-size: 11px;
508
- }
509
- .thinking-step-text {
510
- flex: 1;
511
- word-break: break-word;
512
- }
513
- .thinking-step-text code {
514
- font-size: 11px;
515
- background: var(--brand-soft);
516
- padding: 1px 4px;
517
- border-radius: 3px;
518
- color: var(--brand);
519
- }
520
- .thinking-step-detail {
521
- font-size: 11px;
522
- color: var(--muted);
523
- cursor: pointer;
524
- margin-left: 22px;
525
- padding: 1px 6px;
526
- border-radius: 3px;
527
- background: var(--bg);
528
- display: inline-block;
529
- }
530
- .thinking-step-detail:hover {
531
- background: var(--brand-soft);
532
- }
533
- .thinking-args {
534
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
535
- font-size: 11px;
536
- color: var(--muted);
537
- margin: 4px 0 4px 22px;
538
- padding: 6px 8px;
539
- background: var(--bg);
540
- border-radius: 4px;
541
- overflow-x: auto;
542
- white-space: pre-wrap;
543
- word-break: break-all;
544
- display: none;
545
- }
546
- .thinking-args.show {
547
- display: block;
548
- }
549
- .thinking-reply {
550
- font-size: 13px;
551
- line-height: 1.7;
552
- color: var(--ink);
553
- margin-top: 8px;
554
- padding-top: 8px;
555
- border-top: 1px solid var(--line);
556
- }
557
- /* 思考中状态指示 */
558
- .thinking-indicator {
559
- display: flex;
560
- align-items: center;
561
- gap: 8px;
562
- padding: 4px 0;
563
- font-size: 12px;
564
- color: var(--ink-2);
565
- }
566
- @keyframes pulse-dot {
567
- 0%, 100% { opacity: 1; }
568
- 50% { opacity: 0.3; }
569
- }
570
- .thinking-indicator .dot {
571
- width: 6px;
572
- height: 6px;
573
- border-radius: 50%;
574
- background: var(--brand);
575
- animation: pulse-dot 1.2s infinite;
576
- }
577
- .thinking-indicator .dot:nth-child(2) { animation-delay: 0.2s; }
578
- .thinking-indicator .dot:nth-child(3) { animation-delay: 0.4s; }
579
- .dark .msg.assistant { background: #1e293b; }
580
- .msg.sys {
581
- background: #f1f5f9;
582
- align-self: flex-start;
583
- color: var(--ink-2);
584
- }
585
- .dark .msg.sys { background: #334155; }
586
- .msg .artifact { color: var(--brand); text-decoration: underline; cursor: pointer; }
587
- /* 内部执行过程:默认折叠,避免"一直都在调用/验证"的噪声;点击展开查看思考与工具调用 */
588
- .proc-details {
589
- align-self: stretch; margin-top: 6px; border-top: 1px dashed var(--line);
590
- padding: 8px 0 2px; display: flex; flex-direction: column; gap: 8px;
591
- }
592
- .proc-summary {
593
- cursor: pointer; font-size: 12px; color: var(--muted); user-select: none;
594
- padding: 4px 6px; border-radius: 6px; background: var(--card);
595
- border: 1px solid var(--border); width: fit-content;
596
- }
597
- .proc-summary:hover { color: var(--brand); border-color: var(--brand); }
598
- .proc-details[open] .proc-summary { color: var(--brand); margin-bottom: 6px; }
599
- .final-msg { border-left: 3px solid var(--ok); align-self: flex-start; }
600
- .error-msg { border-left: 3px solid var(--err); align-self: flex-start; color: var(--err); }
601
- .msg .artifact:hover { opacity: 0.8; }
602
-
603
- /* 输入栏 */
604
- .input-area {
605
- padding: 0 16px 16px;
606
- flex-shrink: 0;
607
- }
608
- .input-bar {
609
- border: 1px solid var(--border);
610
- border-radius: 14px;
611
- padding: 12px;
612
- background: var(--card);
613
- box-shadow: 0 4px 12px rgba(0,0,0,0.04);
614
- }
615
- .input-bar textarea {
616
- width: 100%;
617
- border: none;
618
- margin: 0;
619
- min-height: 60px;
620
- resize: none;
621
- background: transparent;
622
- color: var(--ink);
623
- font-size: 14px;
624
- font-family: inherit;
625
- }
626
- .input-bar textarea:focus { outline: none; }
627
- .input-toolbar {
628
- display: flex;
629
- align-items: center;
630
- gap: 8px;
631
- margin-top: 10px;
632
- flex-wrap: wrap;
633
- }
634
- .input-toolbar .spacer { flex: 1; }
635
- .pill {
636
- border: 1px solid var(--border);
637
- border-radius: 8px;
638
- padding: 5px 10px;
639
- font-size: 12.5px;
640
- background: var(--card);
641
- color: var(--ink-2);
642
- cursor: pointer;
643
- user-select: none;
644
- }
645
- .pill:hover { border-color: var(--brand); }
646
- .voice-badge { display: inline-flex; align-items: center; gap: 6px; color: var(--err); font-size: 12px; }
647
-
648
- /* 工作区条 */
649
- .workspace-bar {
650
- display: flex;
651
- align-items: center;
652
- gap: 8px;
653
- padding: 8px 0;
654
- font-size: 13px;
655
- color: var(--muted);
656
- }
657
- .wb-select {
658
- display: flex;
659
- align-items: center;
660
- gap: 6px;
661
- cursor: pointer;
662
- padding: 5px 10px;
663
- border-radius: 8px;
664
- background: var(--bg);
665
- border: 1px solid var(--border);
666
- font-size: 13px;
667
- color: var(--ink);
668
- max-width: 320px;
669
- transition: border-color 0.15s;
670
- }
671
- .wb-select:hover { border-color: var(--brand); }
672
- .wb-icon { font-size: 15px; }
673
- .wb-label {
674
- flex: 1;
675
- white-space: nowrap;
676
- overflow: hidden;
677
- text-overflow: ellipsis;
678
- }
679
- .wb-arrow { font-size: 10px; color: var(--muted); }
680
- .wb-perm {
681
- display: flex;
682
- align-items: center;
683
- gap: 5px;
684
- cursor: pointer;
685
- padding: 5px 10px;
686
- border-radius: 8px;
687
- background: var(--bg);
688
- border: 1px solid var(--border);
689
- font-size: 13px;
690
- color: var(--ink);
691
- transition: border-color 0.15s;
692
- }
693
- .wb-perm:hover { border-color: var(--brand); }
694
-
695
- /* 通话栏 */
696
- .call-bar {
697
- display: flex;
698
- align-items: center;
699
- gap: 10px;
700
- padding: 10px 0;
701
- border-top: 1px solid var(--border);
702
- margin-top: 8px;
703
- }
704
- .call-hint { font-size: 12px; color: var(--muted); text-transform: uppercase; letter-spacing: 0.5px; }
705
- .call-btn {
706
- border: 1px solid var(--border);
707
- background: var(--brand-soft);
708
- color: var(--brand);
709
- border-radius: 8px;
710
- padding: 7px 12px;
711
- cursor: pointer;
712
- font-size: 13px;
713
- font-weight: 600;
714
- }
715
- .call-btn:hover { filter: brightness(0.97); }
716
- .call-btn.hangup { background: #fee2e2; color: var(--err); border-color: #fecaca; }
717
- .call-status { font-size: 12px; color: var(--muted); margin-left: auto; }
718
-
719
- /* 视频通话窗口 */
720
- .video-call-window {
721
- position: fixed;
722
- bottom: 100px;
723
- right: 20px;
724
- width: 240px;
725
- background: var(--card);
726
- border: 1px solid var(--border);
727
- border-radius: 12px;
728
- overflow: hidden;
729
- box-shadow: 0 8px 32px rgba(0,0,0,0.2);
730
- z-index: 100;
731
- }
732
- .video-call-header {
733
- display: flex;
734
- align-items: center;
735
- justify-content: space-between;
736
- padding: 8px 12px;
737
- background: var(--brand);
738
- color: #fff;
739
- font-size: 13px;
740
- font-weight: 600;
741
- }
742
- .video-call-close {
743
- background: none;
744
- border: none;
745
- color: #fff;
746
- cursor: pointer;
747
- font-size: 14px;
748
- padding: 0;
749
- line-height: 1;
750
- }
751
- .video-call-snapshot {
752
- background: rgba(255,255,255,0.2);
753
- border: none;
754
- color: #fff;
755
- cursor: pointer;
756
- font-size: 14px;
757
- padding: 2px 6px;
758
- border-radius: 4px;
759
- line-height: 1;
760
- }
761
- .video-call-snapshot:hover { background: rgba(255,255,255,0.35); }
762
- .video-call-window video {
763
- width: 100%;
764
- display: block;
765
- background: #000;
766
- }
767
-
768
- /* 底部工具栏 */
769
- .chat-footbar {
770
- display: flex;
771
- align-items: center;
772
- justify-content: space-between;
773
- padding: 8px 16px;
774
- background: var(--card);
775
- border-top: 1px solid var(--border);
776
- font-size: 13px;
777
- }
778
- .model-label { font-size: 13px; color: var(--muted); }
779
- .model-select {
780
- padding: 6px 10px;
781
- border: 1px solid var(--border);
782
- border-radius: 8px;
783
- background: var(--card);
784
- color: var(--ink);
785
- font-size: 13px;
786
- }
787
- .ghost-btn {
788
- border: 1px solid var(--border);
789
- background: var(--card);
790
- color: var(--ink-2);
791
- border-radius: 8px;
792
- padding: 6px 9px;
793
- cursor: pointer;
794
- font-size: 14px;
795
- }
796
- .ghost-btn:hover { background: var(--brand-soft); }
797
-
798
- /* 新建任务按钮(侧边栏) */
799
- .new-task-btn {
800
- border: 1px solid var(--border);
801
- background: var(--brand);
802
- color: #fff;
803
- border-radius: 8px;
804
- padding: 3px 8px;
805
- cursor: pointer;
806
- font-size: 11px;
807
- font-weight: 600;
808
- line-height: 1.6;
809
- }
810
- .new-task-btn:hover { opacity: 0.88; }
811
-
812
- /* 新建对话任务弹窗 */
813
- .nt-form { display: flex; flex-direction: column; gap: 12px; margin-top: 4px; }
814
- .nt-label { font-size: 12.5px; font-weight: 600; color: var(--ink-2); display: block; margin-bottom: 4px; }
815
- .nt-form textarea, .nt-form select {
816
- width: 100%; box-sizing: border-box; padding: 8px 10px; font-size: 13px;
817
- border: 1px solid var(--border); border-radius: 10px; background: var(--bg);
818
- color: var(--ink); resize: vertical; font-family: inherit;
819
- }
820
- .nt-form select { cursor: pointer; }
821
- .nt-row { display: flex; gap: 12px; }
822
- .nt-row > div { flex: 1; }
823
- .nt-hint { font-size: 12px; color: var(--muted); }
824
-
825
- /* ========== 右侧面板 ========== */
826
- .right-panel {
827
- width: 320px;
828
- background: var(--card);
829
- border-left: 1px solid var(--border);
830
- display: flex;
831
- flex-direction: column;
832
- flex-shrink: 0;
833
- overflow: hidden;
834
- }
835
- .right-panel.collapsed { width: 0; border: none; }
836
- .right-tabs {
837
- display: flex;
838
- gap: 4px;
839
- padding: 12px 12px 0;
840
- border-bottom: 1px solid var(--line);
841
- }
842
- .right-tab {
843
- padding: 8px 14px;
844
- font-size: 13px;
845
- color: var(--muted);
846
- cursor: pointer;
847
- border-bottom: 2px solid transparent;
848
- }
849
- .right-tab.active { color: var(--brand); border-bottom-color: var(--brand); font-weight: 600; }
850
- .right-body { flex: 1; overflow-y: auto; padding: 12px; }
851
- .preview-panel { display: none; }
852
- .preview-panel.active { display: block; }
853
- .preview-title { font-size: 13px; font-weight: 600; margin-bottom: 8px; color: var(--ink); }
854
- .preview-content {
855
- background: var(--bg);
856
- border: 1px solid var(--border);
857
- border-radius: 10px;
858
- padding: 12px;
859
- font-size: 12.5px;
860
- overflow-x: auto;
861
- }
862
- .preview-content pre { margin: 0; white-space: pre-wrap; word-break: break-word; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; }
863
-
864
- /* 电脑操作面板 */
865
- .computer-controls { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }
866
- .screen-preview {
867
- background: var(--bg);
868
- border: 1px solid var(--border);
869
- border-radius: 8px;
870
- overflow: hidden;
871
- margin-bottom: 12px;
872
- min-height: 150px;
873
- display: flex;
874
- align-items: center;
875
- justify-content: center;
876
- }
877
- .screen-preview img { width: 100%; height: auto; display: block; cursor: crosshair; }
878
- .computer-actions {
879
- background: var(--bg);
880
- border: 1px solid var(--border);
881
- border-radius: 8px;
882
- padding: 10px;
883
- }
884
- .computer-actions .pill {
885
- padding: 5px 10px;
886
- font-size: 12px;
887
- border: 1px solid var(--border);
888
- background: var(--card);
889
- border-radius: 6px;
890
- cursor: pointer;
891
- }
892
- .computer-actions .pill:hover { background: var(--brand-soft); border-color: var(--brand); color: var(--brand); }
893
-
894
- /* 任务详情 */
895
- .detail-ops {
896
- display: grid;
897
- grid-template-columns: 1fr 1fr;
898
- gap: 8px;
899
- margin-bottom: 14px;
900
- }
901
- .detail-ops .secondary {
902
- border: 1px solid var(--border);
903
- background: var(--brand-soft);
904
- color: var(--brand);
905
- border-radius: 8px;
906
- padding: 7px 11px;
907
- cursor: pointer;
908
- font-size: 12.5px;
909
- font-weight: 600;
910
- }
911
- .detail-ops .secondary:hover { filter: brightness(0.97); }
912
- .artifact-list { display: flex; flex-direction: column; gap: 4px; }
913
- .artifact-file {
914
- padding: 6px 8px;
915
- border: 1px solid var(--border);
916
- border-radius: 6px;
917
- font-size: 12.5px;
918
- color: var(--ink-2);
919
- cursor: pointer;
920
- background: var(--bg);
921
- }
922
- .artifact-file:hover { background: var(--brand-soft); color: var(--brand); }
923
-
924
- /* ========== 功能页面 ========== */
925
- .page-view {
926
- flex: 1;
927
- display: none;
928
- flex-direction: column;
929
- padding: 24px;
930
- overflow-y: auto;
931
- }
932
- .page-view.active { display: flex; }
933
- .page-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 20px; }
934
- .page-head h2 { margin: 0; font-size: 20px; }
935
- .page-head .sub { color: var(--muted); font-size: 13px; margin-top: 4px; }
936
- .grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 12px; }
937
- .tile {
938
- border: 1px solid var(--border);
939
- border-radius: 12px;
940
- padding: 16px;
941
- cursor: pointer;
942
- background: var(--card);
943
- transition: all 0.15s;
944
- }
945
- .tile:hover { border-color: var(--brand); box-shadow: 0 6px 18px rgba(37,99,235,0.12); }
946
- .tile .icon { font-size: 24px; }
947
- .tile .title { font-weight: 600; margin: 8px 0 4px; font-size: 14px; }
948
- .tile .desc { color: var(--muted); font-size: 12px; line-height: 1.5; }
949
- .tile .ops { display: flex; gap: 6px; margin-top: 12px; }
950
- .tile .ops button { padding: 6px 12px; font-size: 12px; flex: 1; }
951
- /* 预置指令卡片:带渐变边框,和用户自定义区分 */
952
- .tile.builtin-tile {
953
- background: linear-gradient(135deg, var(--card) 0%, rgba(37,99,235,0.03) 100%);
954
- border: 1px solid var(--brand-soft);
955
- }
956
- .tile.builtin-tile:hover { border-color: var(--brand); box-shadow: 0 6px 18px rgba(37,99,235,0.15); }
957
- .tile.builtin-tile .ops { flex-wrap: wrap; }
958
- .tile.builtin-tile .ops button { flex: 1 1 auto; }
959
-
960
- /* ========== 产品发布故事页面 ========== */
961
- .release-container { max-width: 900px; margin: 0 auto; }
962
- .release-hero {
963
- text-align: center;
964
- padding: 48px 24px;
965
- background: linear-gradient(135deg, var(--brand-soft) 0%, rgba(37,99,235,0.08) 100%);
966
- border-radius: 20px;
967
- margin-bottom: 40px;
968
- }
969
- .release-badge {
970
- display: inline-block;
971
- padding: 6px 16px;
972
- background: var(--brand);
973
- color: #fff;
974
- border-radius: 20px;
975
- font-size: 13px;
976
- font-weight: 600;
977
- margin-bottom: 16px;
978
- }
979
- .release-title {
980
- font-size: 48px;
981
- font-weight: 800;
982
- margin: 0 0 12px;
983
- background: linear-gradient(135deg, var(--brand), #6366f1);
984
- -webkit-background-clip: text;
985
- -webkit-text-fill-color: transparent;
986
- background-clip: text;
987
- }
988
- .release-subtitle {
989
- font-size: 18px;
990
- color: var(--ink-2);
991
- margin: 0 0 8px;
992
- }
993
- .release-tagline {
994
- font-size: 16px;
995
- color: var(--muted);
996
- font-style: italic;
997
- margin: 16px 0 32px;
998
- }
999
- .release-stats {
1000
- display: flex;
1001
- justify-content: center;
1002
- gap: 32px;
1003
- flex-wrap: wrap;
1004
- }
1005
- .stat-item {
1006
- text-align: center;
1007
- }
1008
- .stat-num {
1009
- display: block;
1010
- font-size: 28px;
1011
- font-weight: 700;
1012
- color: var(--brand);
1013
- }
1014
- .stat-label {
1015
- font-size: 12px;
1016
- color: var(--muted);
1017
- }
1018
- .section-title {
1019
- font-size: 28px;
1020
- font-weight: 700;
1021
- margin: 48px 0 24px;
1022
- text-align: center;
1023
- }
1024
- .release-timeline { margin-bottom: 48px; }
1025
- .timeline {
1026
- position: relative;
1027
- padding-left: 40px;
1028
- }
1029
- .timeline::before {
1030
- content: '';
1031
- position: absolute;
1032
- left: 15px;
1033
- top: 0;
1034
- bottom: 0;
1035
- width: 2px;
1036
- background: linear-gradient(to bottom, var(--brand), var(--brand-soft));
1037
- }
1038
- .timeline-item {
1039
- position: relative;
1040
- margin-bottom: 32px;
1041
- }
1042
- .timeline-dot {
1043
- position: absolute;
1044
- left: -32px;
1045
- top: 4px;
1046
- width: 12px;
1047
- height: 12px;
1048
- border-radius: 50%;
1049
- background: var(--brand-soft);
1050
- border: 2px solid var(--brand);
1051
- }
1052
- .timeline-dot.active {
1053
- background: var(--brand);
1054
- box-shadow: 0 0 0 4px rgba(37,99,235,0.2);
1055
- }
1056
- .timeline-date {
1057
- font-size: 13px;
1058
- color: var(--brand);
1059
- font-weight: 600;
1060
- margin-bottom: 4px;
1061
- }
1062
- .timeline-content h3 {
1063
- margin: 0 0 8px;
1064
- font-size: 18px;
1065
- }
1066
- .timeline-content p {
1067
- color: var(--ink-2);
1068
- line-height: 1.6;
1069
- margin: 0 0 8px;
1070
- }
1071
- .timeline-quote {
1072
- font-style: italic;
1073
- color: var(--muted);
1074
- border-left: 3px solid var(--brand-soft);
1075
- padding-left: 12px;
1076
- margin: 12px 0;
1077
- }
1078
- .timeline-tags { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 8px; }
1079
- .tag {
1080
- padding: 4px 10px;
1081
- background: var(--bg);
1082
- border: 1px solid var(--border);
1083
- border-radius: 12px;
1084
- font-size: 11px;
1085
- color: var(--muted);
1086
- }
1087
- .release-team { margin-bottom: 48px; }
1088
- .team-grid {
1089
- display: grid;
1090
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
1091
- gap: 20px;
1092
- }
1093
- .team-card {
1094
- text-align: center;
1095
- padding: 24px;
1096
- background: var(--card);
1097
- border: 1px solid var(--border);
1098
- border-radius: 16px;
1099
- }
1100
- .team-avatar { font-size: 48px; margin-bottom: 12px; }
1101
- .team-card h3 { margin: 0 0 8px; font-size: 16px; }
1102
- .team-card p { color: var(--ink-2); font-size: 13px; line-height: 1.5; margin: 0 0 12px; }
1103
- .team-role {
1104
- font-size: 12px;
1105
- color: var(--brand);
1106
- font-weight: 600;
1107
- }
1108
- .release-challenges { margin-bottom: 48px; }
1109
- .challenges-list { display: flex; flex-direction: column; gap: 16px; }
1110
- .challenge-item {
1111
- display: flex;
1112
- gap: 16px;
1113
- padding: 20px;
1114
- background: var(--card);
1115
- border: 1px solid var(--border);
1116
- border-radius: 12px;
1117
- }
1118
- .challenge-icon { font-size: 28px; flex-shrink: 0; }
1119
- .challenge-item h4 { margin: 0 0 4px; font-size: 15px; }
1120
- .challenge-item p { color: var(--ink-2); font-size: 13px; margin: 0; }
1121
- .release-features { margin-bottom: 48px; }
1122
- .features-grid {
1123
- display: grid;
1124
- grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
1125
- gap: 16px;
1126
- }
1127
- .feature-card {
1128
- text-align: center;
1129
- padding: 24px 16px;
1130
- background: var(--card);
1131
- border: 1px solid var(--border);
1132
- border-radius: 12px;
1133
- transition: all 0.15s;
1134
- }
1135
- .feature-card:hover {
1136
- border-color: var(--brand);
1137
- transform: translateY(-2px);
1138
- box-shadow: 0 8px 24px rgba(37,99,235,0.12);
1139
- }
1140
- .feature-icon { font-size: 32px; margin-bottom: 12px; }
1141
- .feature-card h4 { margin: 0 0 6px; font-size: 14px; }
1142
- .feature-card p { color: var(--muted); font-size: 12px; margin: 0; }
1143
- .release-quote {
1144
- text-align: center;
1145
- padding: 40px 24px;
1146
- background: linear-gradient(135deg, var(--brand-soft), rgba(99,102,241,0.1));
1147
- border-radius: 16px;
1148
- margin-bottom: 48px;
1149
- }
1150
- .release-quote blockquote {
1151
- font-size: 20px;
1152
- font-style: italic;
1153
- color: var(--ink);
1154
- margin: 0 0 16px;
1155
- line-height: 1.6;
1156
- }
1157
- .release-quote cite {
1158
- font-size: 14px;
1159
- color: var(--muted);
1160
- }
1161
- .release-cta {
1162
- text-align: center;
1163
- padding: 48px 24px;
1164
- background: var(--card);
1165
- border: 1px solid var(--border);
1166
- border-radius: 20px;
1167
- }
1168
- .release-cta h2 { margin: 0 0 24px; font-size: 28px; }
1169
- .cta-buttons { display: flex; gap: 16px; justify-content: center; flex-wrap: wrap; margin-bottom: 20px; }
1170
- .cta-btn {
1171
- display: inline-block;
1172
- padding: 12px 28px;
1173
- border-radius: 10px;
1174
- font-size: 15px;
1175
- font-weight: 600;
1176
- text-decoration: none;
1177
- transition: all 0.15s;
1178
- }
1179
- .cta-btn.primary {
1180
- background: var(--brand);
1181
- color: #fff;
1182
- }
1183
- .cta-btn.primary:hover { filter: brightness(1.1); transform: translateY(-1px); }
1184
- .cta-btn.secondary {
1185
- background: transparent;
1186
- color: var(--brand);
1187
- border: 2px solid var(--brand);
1188
- }
1189
- .cta-btn.secondary:hover { background: var(--brand-soft); }
1190
- .cta-sub { color: var(--muted); font-size: 13px; }
1191
-
1192
- /* ========== 通用样式 ========== */
1193
- .card {
1194
- background: var(--card);
1195
- border: 1px solid var(--border);
1196
- border-radius: 16px;
1197
- padding: 20px;
1198
- box-shadow: 0 8px 24px rgba(31,41,51,0.06);
1199
- }
1200
- label { font-size: 13px; color: var(--muted); display: block; margin-bottom: 6px; }
1201
- input[type="text"], textarea, select {
1202
- width: 100%;
1203
- border: 1px solid var(--border);
1204
- border-radius: 10px;
1205
- padding: 10px 12px;
1206
- font-size: 14px;
1207
- font-family: inherit;
1208
- margin-bottom: 12px;
1209
- background: var(--card);
1210
- color: var(--ink);
1211
- }
1212
- textarea { min-height: 80px; resize: vertical; }
1213
- button {
1214
- border: none;
1215
- background: var(--brand);
1216
- color: #fff;
1217
- border-radius: 10px;
1218
- padding: 9px 16px;
1219
- font-size: 14px;
1220
- cursor: pointer;
1221
- }
1222
- button:hover { filter: brightness(1.05); }
1223
- button.secondary { background: #fff; color: var(--ink); border: 1px solid var(--border); }
1224
- button.ghost { background: transparent; color: var(--ink-2); border: 1px solid var(--border); }
1225
- button.danger { background: var(--err); }
1226
- button:disabled { opacity: 0.5; cursor: not-allowed; }
1227
- .row { display: flex; gap: 8px; }
1228
- .row > * { flex: 1; }
1229
- .muted { color: var(--muted); font-size: 12.5px; }
1230
- .empty { color: var(--muted); font-size: 13px; text-align: center; padding: 18px; }
1231
- .badge { display: inline-block; padding: 2px 8px; border-radius: 999px; font-size: 11px; font-weight: 600; }
1232
- .badge.queued { background: #eef2f7; color: var(--muted); }
1233
- .badge.running { background: var(--brand-soft); color: var(--brand); }
1234
- .badge.done { background: #f0fdf4; color: var(--ok); }
1235
- .badge.failed { background: #fef2f2; color: var(--err); }
1236
-
1237
- /* ========== 模态框 ========== */
1238
- .mask {
1239
- position: fixed;
1240
- inset: 0;
1241
- background: rgba(15,23,42,0.45);
1242
- z-index: 60;
1243
- display: none;
1244
- align-items: center;
1245
- justify-content: center;
1246
- }
1247
- .mask.show { display: flex; }
1248
- .modal {
1249
- background: var(--card);
1250
- border-radius: 16px;
1251
- padding: 24px;
1252
- width: 520px;
1253
- max-width: 92vw;
1254
- max-height: 88vh;
1255
- overflow-y: auto;
1256
- box-shadow: 0 20px 60px rgba(0,0,0,0.25);
1257
- }
1258
- .modal h3 { margin: 0 0 6px; font-size: 18px; }
1259
- .modal .hint { color: var(--muted); font-size: 12.5px; margin: 0 0 16px; }
1260
- .modal .footer { display: flex; gap: 8px; justify-content: flex-end; margin-top: 16px; }
1261
- .close-x { float: right; cursor: pointer; color: var(--muted); font-size: 18px; }
1262
-
1263
- /* ========== 下拉菜单 ========== */
1264
- .dropdown { position: relative; }
1265
- .dropdown-menu {
1266
- position: absolute;
1267
- bottom: 100%;
1268
- left: 0;
1269
- margin-bottom: 6px;
1270
- background: var(--card);
1271
- border: 1px solid var(--border);
1272
- border-radius: 12px;
1273
- box-shadow: 0 10px 30px rgba(0,0,0,0.12);
1274
- min-width: 180px;
1275
- display: none;
1276
- z-index: 55;
1277
- padding: 6px 0;
1278
- }
1279
- .dropdown-menu.show { display: block; }
1280
- .dropdown-item { padding: 9px 14px; font-size: 13px; color: var(--ink-2); cursor: pointer; display: flex; align-items: center; gap: 8px; }
1281
- .dropdown-item:hover { background: var(--bg); }
1282
- .dropdown-divider { height: 1px; background: var(--line); margin: 6px 0; }
1283
-
1284
- /* ========== 权限窗口 ========== */
1285
- .perm-section { margin-bottom: 14px; }
1286
- .perm-title { font-size: 13px; font-weight: 600; margin-bottom: 8px; }
1287
- .perm-row { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; font-size: 13px; }
1288
- .perm-row input[type="checkbox"] { width: auto; margin: 0; }
1289
- .perm-row label { margin: 0; color: var(--ink-2); }
1290
-
1291
- /* ========== 智能体选择 ========== */
1292
- .agent-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
1293
- .agent-card { border: 1px solid var(--border); border-radius: 12px; padding: 14px; text-align: center; cursor: pointer; }
1294
- .agent-card:hover, .agent-card.selected { border-color: var(--brand); background: var(--brand-soft); }
1295
- .agent-card .icon { font-size: 24px; }
1296
- .agent-card .title { font-size: 13px; font-weight: 600; margin-top: 6px; }
1297
-
1298
- /* ========== 大模型管理 ========== */
1299
- .model-list { display: flex; flex-direction: column; gap: 8px; margin-bottom: 14px; max-height: 200px; overflow-y: auto; }
1300
- .model-item {
1301
- border: 1px solid var(--border);
1302
- border-radius: 10px;
1303
- padding: 10px 12px;
1304
- display: flex;
1305
- align-items: center;
1306
- gap: 10px;
1307
- background: var(--bg);
1308
- }
1309
- .model-item .mi-name { font-weight: 600; color: var(--ink); font-size: 13px; }
1310
- .model-item .mi-base { font-size: 11px; color: var(--muted); word-break: break-all; }
1311
- .model-item .mi-default { font-size: 11px; color: var(--ok); border: 1px solid #bbf7d0; background: #f0fdf4; border-radius: 6px; padding: 1px 6px; }
1312
- .model-item .mi-actions { margin-left: auto; display: flex; gap: 6px; }
1313
- .model-item .mi-actions button {
1314
- border: 1px solid var(--border);
1315
- background: var(--card);
1316
- color: var(--ink-2);
1317
- border-radius: 6px;
1318
- padding: 4px 8px;
1319
- cursor: pointer;
1320
- font-size: 12px;
1321
- }
1322
- .model-item .mi-actions button:hover { background: var(--brand-soft); }
1323
- .model-item .mi-actions button.danger { color: var(--err); }
1324
- .model-form { border-top: 1px solid var(--line); padding-top: 14px; }
1325
- .form-row { display: flex; gap: 10px; }
1326
- .form-row .form-field { flex: 1; }
1327
- .form-field { margin-bottom: 10px; }
1328
- .form-field label { font-size: 12px; color: var(--muted); display: block; margin-bottom: 5px; }
1329
- .form-field input {
1330
- width: 100%;
1331
- padding: 8px 10px;
1332
- border: 1px solid var(--border);
1333
- border-radius: 8px;
1334
- background: var(--card);
1335
- color: var(--ink);
1336
- font-size: 13px;
1337
- box-sizing: border-box;
1338
- margin: 0;
1339
- }
1340
- .form-actions { display: flex; align-items: center; gap: 10px; margin-top: 4px; }
1341
- .model-form-msg { font-size: 12px; color: var(--ok); }
1342
- .model-form-msg.err { color: var(--err); }
1343
- .primary { background: var(--brand); color: #fff; border: none; border-radius: 8px; padding: 8px 16px; cursor: pointer; font-size: 13px; font-weight: 600; }
1344
- .ghost { background: var(--card); color: var(--ink-2); border: 1px solid var(--border); border-radius: 8px; padding: 8px 16px; cursor: pointer; font-size: 13px; }
1345
- .primary.sm, .ghost.sm { padding: 5px 12px; font-size: 12px; }
1346
-
1347
- /* ========== 设置面板 ========== */
1348
- .settings-layout { display: flex; gap: 0; min-height: 360px; }
1349
- .settings-nav { flex: 0 0 130px; border-right: 1px solid var(--line); padding-right: 8px; }
1350
- .settings-cat { padding: 9px 10px; border-radius: 8px; cursor: pointer; font-size: 13px; color: var(--ink-2); }
1351
- .settings-cat:hover { background: var(--bg); }
1352
- .settings-cat.active { background: var(--brand-soft); color: var(--brand); font-weight: 600; }
1353
- .settings-body { flex: 1; padding: 4px 4px 4px 16px; overflow-y: auto; }
1354
- .settings-item {
1355
- display: flex;
1356
- align-items: center;
1357
- gap: 12px;
1358
- padding: 12px;
1359
- border: 1px solid var(--border);
1360
- border-radius: 10px;
1361
- margin-bottom: 10px;
1362
- cursor: pointer;
1363
- background: var(--card);
1364
- }
1365
- .settings-item:hover { background: var(--brand-soft); }
1366
- .settings-item .si-icon { font-size: 18px; }
1367
- .settings-item .si-main { flex: 1; }
1368
- .settings-item .si-title { font-weight: 600; font-size: 13.5px; color: var(--ink); }
1369
- .settings-item .si-desc { font-size: 12px; color: var(--muted); }
1370
- .settings-item .si-arrow { color: var(--muted); }
1371
-
1372
- /* ========== 设置·大模型管理(简洁卡片风) ========== */
1373
- .model-manage { margin-top: 4px; }
1374
- .mm-list { display: flex; flex-direction: column; gap: 8px; }
1375
- .mm-empty {
1376
- padding: 28px 16px;
1377
- text-align: center;
1378
- color: var(--muted);
1379
- font-size: 13px;
1380
- background: var(--bg);
1381
- border: 1px dashed var(--border);
1382
- border-radius: 10px;
1383
- }
1384
- .mm-empty .mm-empty-icon { font-size: 28px; margin-bottom: 6px; opacity: 0.6; }
1385
- .mm-empty .mm-empty-hint { font-size: 12px; margin-top: 4px; color: var(--muted); }
1386
- .mm-card {
1387
- display: flex;
1388
- flex-direction: column;
1389
- gap: 6px;
1390
- padding: 12px 14px;
1391
- border: 1px solid var(--border);
1392
- border-radius: 10px;
1393
- background: var(--card);
1394
- transition: border-color 0.15s;
1395
- }
1396
- .mm-card:hover { border-color: var(--brand); }
1397
- .mm-card-head { display: flex; align-items: center; gap: 8px; }
1398
- .mm-card-name { font-weight: 600; font-size: 14px; color: var(--ink); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1399
- .mm-default-tag {
1400
- font-size: 11px;
1401
- padding: 1px 7px;
1402
- border-radius: 99px;
1403
- background: var(--brand-soft);
1404
- color: var(--brand);
1405
- font-weight: 500;
1406
- flex: 0 0 auto;
1407
- }
1408
- .mm-card-url {
1409
- font-size: 12px;
1410
- color: var(--muted);
1411
- word-break: break-all;
1412
- display: flex;
1413
- align-items: center;
1414
- gap: 4px;
1415
- }
1416
- .mm-card-url::before { content: '🔗'; font-size: 11px; opacity: 0.7; }
1417
- .mm-card-meta { font-size: 11px; color: var(--muted); }
1418
- .mm-card-actions {
1419
- display: flex;
1420
- gap: 4px;
1421
- justify-content: flex-end;
1422
- margin-top: 2px;
1423
- border-top: 1px solid var(--line);
1424
- padding-top: 8px;
1425
- }
1426
- .mm-act {
1427
- font-size: 12px;
1428
- padding: 4px 10px;
1429
- border-radius: 6px;
1430
- background: transparent;
1431
- border: 1px solid var(--border);
1432
- color: var(--ink-2);
1433
- cursor: pointer;
1434
- transition: all 0.15s;
1435
- }
1436
- .mm-act:hover { background: var(--bg); color: var(--ink); }
1437
- .mm-act-primary { color: var(--brand); border-color: var(--brand-soft); }
1438
- .mm-act-primary:hover { background: var(--brand-soft); }
1439
- .mm-act-danger { color: var(--muted); }
1440
- .mm-act-danger:hover { color: var(--err); background: transparent; }
1441
- /* 分隔 */
1442
- .mm-divider {
1443
- display: flex;
1444
- align-items: center;
1445
- gap: 8px;
1446
- margin: 16px 0 10px;
1447
- font-size: 12px;
1448
- color: var(--muted);
1449
- }
1450
- .mm-divider::before, .mm-divider::after {
1451
- content: '';
1452
- flex: 1;
1453
- height: 1px;
1454
- background: var(--line);
1455
- }
1456
- /* 表单 */
1457
- .mm-form {
1458
- display: flex;
1459
- flex-direction: column;
1460
- gap: 10px;
1461
- padding: 14px;
1462
- border: 1px solid var(--border);
1463
- border-radius: 10px;
1464
- background: var(--bg);
1465
- }
1466
- .mm-form-title { font-size: 13px; font-weight: 600; color: var(--ink); margin-bottom: 2px; }
1467
- .mm-form input, .mm-form textarea {
1468
- margin: 0;
1469
- padding: 8px 10px;
1470
- font-size: 13px;
1471
- border: 1px solid var(--border);
1472
- border-radius: 8px;
1473
- background: var(--card);
1474
- transition: border-color 0.15s;
1475
- }
1476
- .mm-form input:focus, .mm-form textarea:focus {
1477
- outline: none;
1478
- border-color: var(--brand);
1479
- }
1480
- .mm-form textarea { resize: vertical; min-height: 56px; font-family: inherit; }
1481
- .mm-form-actions { display: flex; align-items: center; gap: 8px; margin-top: 2px; }
1482
- .mm-form-actions .mm-form-msg { font-size: 12px; color: var(--muted); margin-left: auto; }
1483
- .mm-form-actions .mm-form-msg.err { color: var(--err); }
1484
-
1485
- /* ========== 用户菜单(右侧侧边栏样式) ========== */
1486
- .bottom-sheet-mask {
1487
- position: fixed;
1488
- inset: 0;
1489
- background: rgba(15,23,42,0.35);
1490
- z-index: 70;
1491
- display: none;
1492
- justify-content: flex-end;
1493
- }
1494
- .bottom-sheet-mask.show { display: flex; }
1495
- .bottom-sheet {
1496
- background: var(--card);
1497
- border-radius: 16px 0 0 16px;
1498
- width: 280px;
1499
- max-width: 85vw;
1500
- max-height: 100vh;
1501
- overflow-y: auto;
1502
- padding: 16px 0;
1503
- box-shadow: -10px 0 40px rgba(0,0,0,0.15);
1504
- transform: translateX(100%);
1505
- transition: transform 0.25s ease;
1506
- }
1507
- .bottom-sheet-mask.show .bottom-sheet { transform: translateX(0); }
1508
- .sheet-header { padding: 8px 20px 16px; display: flex; align-items: center; gap: 12px; border-bottom: 1px solid var(--line); margin-bottom: 6px; }
1509
- .sheet-item { padding: 12px 20px; display: flex; align-items: center; gap: 12px; cursor: pointer; font-size: 14px; color: var(--ink-2); }
1510
- .sheet-item:hover { background: var(--bg); }
1511
- .sheet-item .icon { width: 22px; text-align: center; }
1512
- .sheet-item .right { margin-left: auto; font-size: 12px; color: var(--muted); }
1513
-
1514
- /* ========== 工作区 ========== */
1515
- .workspace-box { border: 1px solid var(--border); border-radius: 10px; padding: 10px; background: var(--bg); }
1516
- .workspace-cwd { font-size: 12px; color: var(--ink-2); word-break: break-all; margin-bottom: 8px; }
1517
- .workspace-input { display: flex; gap: 6px; }
1518
- .workspace-input input { flex: 1; margin: 0; font-size: 12px; padding: 6px 8px; }
1519
- .workspace-input button { padding: 6px 10px; font-size: 12px; }
1520
- .file-tree { margin-top: 8px; display: flex; flex-direction: column; gap: 2px; max-height: 220px; overflow-y: auto; }
1521
- .file-item { padding: 5px 8px; border-radius: 6px; cursor: pointer; font-size: 12px; display: flex; align-items: center; gap: 6px; color: var(--ink-2); }
1522
- .file-item:hover { background: var(--brand-soft); }
1523
- .file-item.dir { font-weight: 500; }
1524
- .file-item.drive-switcher { flex-direction: column; align-items: flex-start; padding: 8px; background: var(--bg); border: 1px dashed var(--border); }
1525
- .drive-option { padding: 3px 10px; margin-top: 4px; border-radius: 4px; font-size: 11px; cursor: pointer; color: var(--ink-2); }
1526
- .drive-option:hover { background: var(--brand-soft); color: var(--brand); }
1527
-
1528
- /* ========== 文件芯片 ========== */
1529
- .file-chip { display: inline-flex; align-items: center; gap: 6px; background: var(--brand-soft); color: var(--brand); padding: 4px 8px; border-radius: 6px; font-size: 12px; cursor: pointer; }
1530
- .file-chip:hover { opacity: 0.85; }
1531
- /* 输入区·待发送附件暂存(点发送时统一上传给 AI) */
1532
- .staged-area {
1533
- display: none;
1534
- flex-wrap: wrap;
1535
- gap: 6px;
1536
- padding: 0 0 8px 0;
1537
- border-bottom: 1px dashed var(--border);
1538
- margin-bottom: 8px;
1539
- }
1540
- .staged-area.show { display: flex; }
1541
- .staged-chip {
1542
- display: inline-flex;
1543
- align-items: center;
1544
- gap: 6px;
1545
- padding: 4px 4px 4px 8px;
1546
- background: var(--brand-soft);
1547
- color: var(--brand);
1548
- border-radius: 6px;
1549
- font-size: 12px;
1550
- max-width: 240px;
1551
- }
1552
- .staged-chip .staged-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 180px; }
1553
- .staged-chip .staged-size { color: var(--muted); font-size: 11px; }
1554
- .staged-chip .staged-remove {
1555
- display: inline-flex;
1556
- align-items: center;
1557
- justify-content: center;
1558
- width: 18px;
1559
- height: 18px;
1560
- border-radius: 50%;
1561
- background: transparent;
1562
- border: none;
1563
- color: var(--brand);
1564
- cursor: pointer;
1565
- font-size: 14px;
1566
- line-height: 1;
1567
- padding: 0;
1568
- }
1569
- .staged-chip .staged-remove:hover { background: rgba(0,0,0,.08); }
1570
- .staged-hint {
1571
- font-size: 11px;
1572
- color: var(--muted);
1573
- align-self: center;
1574
- margin-left: 4px;
1575
- }
1576
-
1577
- /* ========== 截图遮罩 ========== */
1578
- .crop-overlay { position: fixed; inset: 0; z-index: 9999; background: rgba(0,0,0,0.35); cursor: crosshair; }
1579
- .crop-tip { position: fixed; top: 16px; left: 50%; transform: translateX(-50%); background: rgba(0,0,0,0.7); color: #fff; padding: 6px 14px; border-radius: 20px; font-size: 13px; pointer-events: none; }
1580
- .crop-selection { position: fixed; border: 2px dashed #fff; background: rgba(255,255,255,0.12); box-shadow: 0 0 0 9999px rgba(0,0,0,0.25); pointer-events: none; }
1581
-
1582
- /* ========== Toast ========== */
1583
- .toast {
1584
- position: fixed;
1585
- bottom: 24px;
1586
- left: 50%;
1587
- transform: translateX(-50%);
1588
- background: #1f2933;
1589
- color: #fff;
1590
- padding: 10px 18px;
1591
- border-radius: 10px;
1592
- font-size: 13px;
1593
- z-index: 80;
1594
- opacity: 0;
1595
- transition: 0.25s;
1596
- pointer-events: none;
1597
- }
1598
- .toast.show { opacity: 1; }
1599
-
1600
- /* ========== 隐藏文件输入 ========== */
1601
- input[type="file"] { display: none; }
1602
-
1603
- /* ========== 记忆系统 ========== */
1604
- .stat-card { text-align: center; padding: 16px; }
1605
- .stat-label { font-size: 12px; color: var(--muted); margin-bottom: 8px; }
1606
- .stat-value { font-size: 24px; font-weight: 700; color: var(--brand); }
1607
- .stat-date { font-size: 13px; color: var(--ink-2); font-weight: 400; }
1608
- .memory-content { max-height: 60vh; overflow-y: auto; white-space: pre-wrap; font-family: "SF Mono", Monaco, monospace; font-size: 12.5px; line-height: 1.7; }
1609
- .memory-content h1, .memory-content h2, .memory-content h3 { color: var(--brand); margin-top: 0; }
1610
- .memory-content pre { background: var(--bg); padding: 12px; border-radius: 8px; overflow-x: auto; }
1611
- .memory-content code { background: var(--bg); padding: 2px 6px; border-radius: 4px; font-size: 12px; }
1612
-
1613
- /* ========== 欢迎引导弹窗 ========== */
1614
- #welcomeGuideModal .modal { width: 480px; }
1615
- .welcome-guide-header { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; }
1616
- .welcome-guide-header .icon { font-size: 32px; }
1617
- .welcome-guide-header h3 { margin: 0; font-size: 18px; }
1618
- .welcome-guide-header p { margin: 4px 0 0; font-size: 12px; color: var(--muted); }
1619
- .welcome-task-list { display: flex; flex-direction: column; gap: 8px; margin-bottom: 16px; }
1620
- .welcome-task-item {
1621
- display: flex;
1622
- align-items: center;
1623
- gap: 12px;
1624
- padding: 12px;
1625
- border: 1px solid var(--border);
1626
- border-radius: 10px;
1627
- background: var(--bg);
1628
- cursor: pointer;
1629
- transition: all 0.15s;
1630
- }
1631
- .welcome-task-item:hover {
1632
- border-color: var(--brand);
1633
- background: var(--brand-soft);
1634
- }
1635
- .welcome-task-index {
1636
- width: 28px;
1637
- height: 28px;
1638
- border-radius: 50%;
1639
- background: var(--brand);
1640
- color: #fff;
1641
- display: flex;
1642
- align-items: center;
1643
- justify-content: center;
1644
- font-size: 13px;
1645
- font-weight: 700;
1646
- flex-shrink: 0;
1647
- }
1648
- .welcome-task-content { flex: 1; min-width: 0; }
1649
- .welcome-task-title { font-size: 13px; font-weight: 600; color: var(--ink); }
1650
- .welcome-task-desc { font-size: 11px; color: var(--muted); margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
1651
- .welcome-task-run {
1652
- padding: 4px 10px;
1653
- border: 1px solid var(--brand);
1654
- background: transparent;
1655
- color: var(--brand);
1656
- border-radius: 6px;
1657
- font-size: 11px;
1658
- cursor: pointer;
1659
- flex-shrink: 0;
1660
- transition: all 0.15s;
1661
- }
1662
- .welcome-task-run:hover {
1663
- background: var(--brand);
1664
- color: #fff;
1665
- }
1666
- .empty-welcome {
1667
- text-align: center;
1668
- padding: 20px;
1669
- color: var(--muted);
1670
- font-size: 13px;
1671
- }
1672
-
1673
- /* ========== 后端服务断连提示横幅 ========== */
1674
- .backend-offline-banner {
1675
- position: fixed;
1676
- top: 0;
1677
- left: 0;
1678
- right: 0;
1679
- z-index: 10000;
1680
- background: linear-gradient(90deg, #c62828, #e53935);
1681
- color: #fff;
1682
- padding: 9px 20px;
1683
- display: flex;
1684
- align-items: center;
1685
- gap: 10px;
1686
- font-size: 13px;
1687
- font-weight: 500;
1688
- box-shadow: 0 2px 10px rgba(0, 0, 0, 0.25);
1689
- animation: bob-slide-down 0.25s ease;
1690
- }
1691
- .backend-offline-banner .bob-icon { font-size: 16px; flex-shrink: 0; }
1692
- .backend-offline-banner .bob-text { flex: 1; min-width: 0; }
1693
- .backend-offline-banner .bob-reconnect {
1694
- background: rgba(255, 255, 255, 0.18);
1695
- border: 1px solid rgba(255, 255, 255, 0.4);
1696
- color: #fff;
1697
- padding: 3px 12px;
1698
- border-radius: 5px;
1699
- cursor: pointer;
1700
- font-size: 12px;
1701
- font-weight: 500;
1702
- flex-shrink: 0;
1703
- transition: background 0.15s;
1704
- }
1705
- .backend-offline-banner .bob-reconnect:hover {
1706
- background: rgba(255, 255, 255, 0.3);
1707
- }
1708
- .backend-offline-banner .bob-reconnect:active {
1709
- transform: scale(0.96);
1710
- }
1711
- @keyframes bob-slide-down {
1712
- from { transform: translateY(-100%); opacity: 0; }
1713
- to { transform: translateY(0); opacity: 1; }
1714
- }
1
+ :root {
2
+ --bg: #f5f7fa;
3
+ --card: #ffffff;
4
+ --ink: #1f2933;
5
+ --ink-2: #475569;
6
+ --muted: #6b7785;
7
+ --brand: #2563eb;
8
+ --brand-soft: #eff4ff;
9
+ --ok: #16a34a;
10
+ --err: #dc2626;
11
+ --warn: #d97706;
12
+ --border: #e3e8ef;
13
+ --line: #e3e8ef;
14
+ --sidebar-width: 56px;
15
+ --topbar-height: 48px;
16
+ }
17
+ .dark {
18
+ --bg: #0f172a;
19
+ --card: #1e293b;
20
+ --ink: #f1f5f9;
21
+ --ink-2: #cbd5e1;
22
+ --muted: #94a3b8;
23
+ --brand: #3b82f6;
24
+ --brand-soft: #1e3a8a;
25
+ --border: #334155;
26
+ --line: #334155;
27
+ }
28
+ * { box-sizing: border-box; }
29
+ body {
30
+ margin: 0;
31
+ font-family: -apple-system, "Segoe UI", "PingFang SC", "Microsoft YaHei", Roboto, Helvetica, Arial, sans-serif;
32
+ background: var(--bg);
33
+ color: var(--ink);
34
+ height: 100vh;
35
+ overflow: hidden;
36
+ }
37
+
38
+ /* ========== 登录遮罩 ========== */
39
+ #loginOverlay {
40
+ position: fixed; inset: 0; background: var(--bg); z-index: 50;
41
+ display: flex; align-items: center; justify-content: center;
42
+ }
43
+ #loginOverlay .login-card {
44
+ background: var(--card); border: 1px solid var(--border); border-radius: 16px;
45
+ padding: 32px; width: 360px; box-shadow: 0 10px 30px rgba(31,41,51,0.08);
46
+ }
47
+ #loginOverlay h2 { margin: 0 0 4px; font-size: 20px; }
48
+ #loginOverlay p { margin: 0 0 20px; color: var(--muted); font-size: 13px; }
49
+ #loginOverlay input {
50
+ width: 100%; border: 1px solid var(--border); border-radius: 10px;
51
+ padding: 10px 12px; font-size: 14px; margin-bottom: 12px; font-family: inherit;
52
+ background: var(--card); color: var(--ink);
53
+ }
54
+ #loginOverlay button {
55
+ width: 100%; border: none; background: var(--brand); color: #fff;
56
+ border-radius: 10px; padding: 10px; font-size: 14px; cursor: pointer;
57
+ }
58
+ #loginOverlay .login-status { font-size: 13px; margin-top: 10px; min-height: 18px; }
59
+ #loginOverlay .login-status.err { color: var(--err); }
60
+
61
+ /* ========== 主布局 ========== */
62
+ .app-layout {
63
+ display: flex;
64
+ flex-direction: column;
65
+ height: 100vh;
66
+ display: none;
67
+ }
68
+ .app-layout.show { display: flex; }
69
+ /* 已登录状态:提前隐藏登录页,显示应用布局,避免闪烁(感觉像打开两次) */
70
+ html.logged-in #loginOverlay { display: none !important; }
71
+ html.logged-in .app-layout { display: flex !important; }
72
+
73
+ /* ========== 顶部导航栏 ========== */
74
+ .topbar {
75
+ height: var(--topbar-height);
76
+ background: var(--card);
77
+ border-bottom: 1px solid var(--border);
78
+ display: flex;
79
+ align-items: center;
80
+ padding: 0 16px;
81
+ gap: 12px;
82
+ flex-shrink: 0;
83
+ }
84
+ .topbar-brand {
85
+ font-weight: 700;
86
+ font-size: 15px;
87
+ color: var(--brand);
88
+ display: flex;
89
+ align-items: center;
90
+ gap: 8px;
91
+ }
92
+ .topbar-brand .logo {
93
+ width: 28px;
94
+ height: 28px;
95
+ background: var(--brand);
96
+ color: #fff;
97
+ border-radius: 8px;
98
+ display: flex;
99
+ align-items: center;
100
+ justify-content: center;
101
+ font-size: 14px;
102
+ }
103
+ .topbar-nav {
104
+ display: flex;
105
+ gap: 4px;
106
+ margin-left: 24px;
107
+ }
108
+ .topbar-nav-item {
109
+ padding: 6px 12px;
110
+ border-radius: 8px;
111
+ font-size: 13px;
112
+ color: var(--ink-2);
113
+ cursor: pointer;
114
+ display: flex;
115
+ align-items: center;
116
+ gap: 6px;
117
+ transition: all 0.15s;
118
+ }
119
+ .topbar-nav-item:hover {
120
+ background: var(--bg);
121
+ color: var(--ink);
122
+ }
123
+ .topbar-nav-item.active {
124
+ background: var(--brand-soft);
125
+ color: var(--brand);
126
+ font-weight: 600;
127
+ }
128
+ .topbar-spacer { flex: 1; }
129
+ .topbar-user {
130
+ display: flex;
131
+ align-items: center;
132
+ gap: 10px;
133
+ padding: 6px 10px;
134
+ border-radius: 10px;
135
+ cursor: pointer;
136
+ transition: background 0.15s;
137
+ }
138
+ .topbar-user:hover { background: var(--bg); }
139
+ .topbar-avatar {
140
+ width: 32px;
141
+ height: 32px;
142
+ background: var(--brand-soft);
143
+ border-radius: 50%;
144
+ display: flex;
145
+ align-items: center;
146
+ justify-content: center;
147
+ font-size: 16px;
148
+ }
149
+ .topbar-phone { font-size: 13px; font-weight: 500; color: var(--ink); }
150
+ .lang-switcher { display: flex; align-items: center; gap: 2px; border: 1px solid var(--border); border-radius: 8px; overflow: hidden; }
151
+ .lang-btn { padding: 4px 10px; font-size: 12px; cursor: pointer; border: none; background: transparent; color: var(--ink-2); font-weight: 500; transition: all 0.15s; }
152
+ .lang-btn.active { background: var(--brand); color: #fff; }
153
+ .lang-btn:hover:not(.active) { background: var(--bg); }
154
+
155
+ /* ========== 主体内容区 ========== */
156
+ /* overflow 必须为 hidden:约束内部 .messages / .sidebar 各自滚动,
157
+ 原生 <select> 弹层由浏览器绘制在顶层,不受此裁剪影响。 */
158
+ .main-area {
159
+ flex: 1;
160
+ display: flex;
161
+ min-height: 0;
162
+ overflow: hidden;
163
+ max-width: 1400px;
164
+ margin: 0 auto;
165
+ width: 100%;
166
+ }
167
+
168
+ /* ========== 左侧侧边栏 ========== */
169
+ .sidebar {
170
+ width: 200px;
171
+ background: var(--card);
172
+ border-right: 1px solid var(--border);
173
+ display: flex;
174
+ flex-direction: column;
175
+ padding: 12px 8px;
176
+ gap: 2px;
177
+ flex-shrink: 0;
178
+ overflow-y: auto;
179
+ }
180
+ .sidebar-section {
181
+ margin-bottom: 8px;
182
+ padding-bottom: 8px;
183
+ border-bottom: 1px solid var(--border);
184
+ }
185
+ .sidebar-section-title {
186
+ font-size: 11px;
187
+ color: var(--muted);
188
+ text-transform: uppercase;
189
+ letter-spacing: 0.5px;
190
+ padding: 4px 8px;
191
+ margin-bottom: 4px;
192
+ }
193
+ .sidebar-icon {
194
+ width: 100%;
195
+ height: 36px;
196
+ border-radius: 8px;
197
+ display: flex;
198
+ align-items: center;
199
+ gap: 10px;
200
+ padding: 0 8px;
201
+ cursor: pointer;
202
+ color: var(--ink-2);
203
+ transition: all 0.15s;
204
+ position: relative;
205
+ font-size: 13px;
206
+ }
207
+ .sidebar-icon .icon {
208
+ font-size: 16px;
209
+ width: 20px;
210
+ text-align: center;
211
+ flex-shrink: 0;
212
+ }
213
+ .sidebar-icon .label {
214
+ flex: 1;
215
+ white-space: nowrap;
216
+ overflow: hidden;
217
+ text-overflow: ellipsis;
218
+ }
219
+ .sidebar-icon .badge {
220
+ font-size: 10px;
221
+ padding: 2px 6px;
222
+ border-radius: 10px;
223
+ background: var(--brand-soft);
224
+ color: var(--brand);
225
+ font-weight: 600;
226
+ flex-shrink: 0;
227
+ }
228
+ .sidebar-icon:hover {
229
+ background: var(--bg);
230
+ color: var(--ink);
231
+ }
232
+ .sidebar-icon.active {
233
+ background: var(--brand-soft);
234
+ color: var(--brand);
235
+ font-weight: 600;
236
+ }
237
+ .sidebar-icon.active::before {
238
+ content: '';
239
+ position: absolute;
240
+ left: 0;
241
+ top: 50%;
242
+ transform: translateY(-50%);
243
+ width: 3px;
244
+ height: 20px;
245
+ background: var(--brand);
246
+ border-radius: 0 2px 2px 0;
247
+ }
248
+ .sidebar-spacer { flex: 1; }
249
+ .sidebar-pin {
250
+ font-size: 10px;
251
+ color: var(--warn);
252
+ flex-shrink: 0;
253
+ }
254
+ .task-item {
255
+ display: flex;
256
+ align-items: center;
257
+ gap: 8px;
258
+ padding: 8px;
259
+ border-radius: 6px;
260
+ cursor: pointer;
261
+ font-size: 12px;
262
+ transition: background 0.15s;
263
+ }
264
+ .task-item:hover { background: var(--bg); }
265
+ .task-item.active { background: var(--brand-soft); }
266
+ .task-item .task-icon { font-size: 14px; }
267
+ .task-item .task-title {
268
+ flex: 1;
269
+ white-space: nowrap;
270
+ overflow: hidden;
271
+ text-overflow: ellipsis;
272
+ color: var(--ink-2);
273
+ }
274
+ .task-item.active .task-title { color: var(--brand); }
275
+ .task-item .task-actions {
276
+ display: none;
277
+ gap: 4px;
278
+ font-size: 11px;
279
+ }
280
+ .task-item:hover .task-actions { display: flex; }
281
+ .task-item .task-actions button {
282
+ padding: 2px 4px;
283
+ border: none;
284
+ background: transparent;
285
+ cursor: pointer;
286
+ border-radius: 4px;
287
+ font-size: 10px;
288
+ }
289
+ .task-item .task-actions button:hover { background: var(--border); }
290
+ .task-item .task-actions .delete-btn:hover { background: #fee2e2; color: var(--err); }
291
+ .task-pinned { color: var(--warn); }
292
+
293
+ /* ========== 中间对话区 ========== */
294
+ .chat-area {
295
+ flex: 1;
296
+ display: flex;
297
+ flex-direction: column;
298
+ min-width: 0;
299
+ background: var(--bg);
300
+ }
301
+
302
+ /* ========== 任务上下文头部 ========== */
303
+ .task-context-header {
304
+ display: flex;
305
+ align-items: center;
306
+ gap: 12px;
307
+ padding: 12px 16px;
308
+ background: var(--card);
309
+ border-bottom: 1px solid var(--border);
310
+ flex-shrink: 0;
311
+ }
312
+ .tch-left { flex: 1; min-width: 0; }
313
+ .tch-title { font-size: 15px; font-weight: 700; color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
314
+ .tch-sub { font-size: 12px; color: var(--muted); margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
315
+ .tch-right { display: flex; align-items: center; gap: 10px; flex-shrink: 0; }
316
+ .tch-time { font-size: 12px; color: var(--muted); }
317
+
318
+ /* ========== 思维链路线程 ========== */
319
+ .messages { flex: 1; overflow-y: auto; display: flex; flex-direction: column; gap: 10px; padding: 16px; padding-right: 4px; }
320
+ .step { max-width: 92%; font-size: 13.5px; line-height: 1.6; word-break: break-word; }
321
+ .step.created {
322
+ align-self: stretch; background: var(--bg); border: 1px dashed var(--border);
323
+ border-radius: 10px; padding: 8px 12px; color: var(--muted); font-size: 12.5px;
324
+ }
325
+ .step.reasoning {
326
+ align-self: flex-start; background: var(--card); border: 1px solid var(--border);
327
+ border-left: 3px solid var(--brand); border-radius: 10px; padding: 10px 14px;
328
+ white-space: pre-wrap; color: var(--ink-2);
329
+ }
330
+ .step.reasoning .reasoning-head { font-size: 11px; color: var(--brand); font-weight: 600; margin-bottom: 4px; display: flex; align-items: center; gap: 6px; }
331
+ .step.toolcall {
332
+ align-self: flex-start; background: #fffbeb; border: 1px solid #fde68a;
333
+ border-radius: 10px; padding: 8px 12px; color: #92400e; font-size: 12.5px;
334
+ }
335
+ .dark .step.toolcall { background: #3a2f12; color: #fcd34d; border-color: #5b4a1f; }
336
+ .step.toolcall .tc-name { font-weight: 600; }
337
+ .step.toolcall .tc-args {
338
+ color: var(--muted); font-size: 12px; margin-top: 2px; white-space: pre-wrap; word-break: break-word;
339
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
340
+ }
341
+ .step.result {
342
+ align-self: flex-start; background: var(--card); border: 1px solid var(--border);
343
+ border-radius: 10px; padding: 8px 12px; color: var(--ink-2); font-size: 12.5px; max-width: 92%;
344
+ }
345
+ .step.result .res-head { font-weight: 600; display: flex; align-items: center; gap: 6px; }
346
+ .step.result.ok .res-head { color: var(--ok); }
347
+ .step.result.fail .res-head { color: var(--err); }
348
+ .step.result .res-out {
349
+ margin-top: 4px; white-space: pre-wrap; word-break: break-word; max-height: 160px; overflow-y: auto;
350
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 12px; color: var(--muted);
351
+ }
352
+ .step.note { align-self: stretch; background: var(--bg); border-radius: 8px; padding: 6px 12px; color: var(--muted); font-size: 12px; }
353
+ /* 对话流与思维链路分隔标题 */
354
+ .conv-divider {
355
+ align-self: stretch; text-align: center; font-size: 11px; color: var(--muted);
356
+ border-top: 1px solid var(--line); padding-top: 8px; margin-top: 4px;
357
+ }
358
+ .step.final {
359
+ align-self: flex-end; background: var(--ok); color: #fff; border-radius: 12px;
360
+ padding: 12px 16px; white-space: pre-wrap; word-break: break-word; max-width: 92%;
361
+ position: relative;
362
+ }
363
+ .step.final .final-head { font-size: 11px; opacity: 0.85; margin-bottom: 4px; font-weight: 600; }
364
+ .step.final .final-actions {
365
+ position: absolute; top: 8px; right: 8px; display: flex; gap: 4px;
366
+ opacity: 0.85; transition: opacity 0.2s;
367
+ background: rgba(0,0,0,0.18); border-radius: 8px; padding: 2px 4px;
368
+ }
369
+ .step.final:hover .final-actions { opacity: 1; background: rgba(0,0,0,0.32); }
370
+ .step.final .final-actions button {
371
+ background: transparent; border: none; color: #fff;
372
+ border-radius: 4px; padding: 3px 7px; font-size: 11px; cursor: pointer;
373
+ transition: background 0.15s;
374
+ }
375
+ .step.final .final-actions button:hover { background: rgba(255,255,255,0.28); }
376
+ .step.error {
377
+ align-self: flex-end; background: var(--err); color: #fff; border-radius: 12px;
378
+ padding: 12px 16px; white-space: pre-wrap; word-break: break-word; max-width: 92%;
379
+ }
380
+
381
+ /* 对话消息区 */
382
+ .conv {
383
+ flex: 1;
384
+ display: flex;
385
+ flex-direction: column;
386
+ padding: 16px;
387
+ gap: 12px;
388
+ overflow: hidden;
389
+ }
390
+ .messages {
391
+ flex: 1;
392
+ overflow-y: auto;
393
+ display: flex;
394
+ flex-direction: column;
395
+ gap: 10px;
396
+ padding-right: 4px;
397
+ }
398
+ .msg {
399
+ padding: 10px 14px;
400
+ border-radius: 12px;
401
+ font-size: 13.5px;
402
+ line-height: 1.6;
403
+ max-width: 85%;
404
+ white-space: pre-wrap;
405
+ word-break: break-word;
406
+ position: relative;
407
+ user-select: text;
408
+ -webkit-user-select: text;
409
+ cursor: text;
410
+ }
411
+ .msg-actions {
412
+ position: absolute;
413
+ top: 6px;
414
+ right: 6px;
415
+ display: none;
416
+ gap: 4px;
417
+ background: rgba(255,255,255,0.95);
418
+ border-radius: 6px;
419
+ padding: 2px;
420
+ box-shadow: 0 2px 8px rgba(0,0,0,0.1);
421
+ }
422
+ .msg:hover .msg-actions {
423
+ display: flex;
424
+ }
425
+ .msg-action-btn {
426
+ background: none;
427
+ border: none;
428
+ padding: 4px 8px;
429
+ font-size: 12px;
430
+ cursor: pointer;
431
+ border-radius: 4px;
432
+ color: var(--ink-2);
433
+ }
434
+ .msg-action-btn:hover {
435
+ background: var(--brand-soft);
436
+ color: var(--brand);
437
+ }
438
+ .msg.user {
439
+ background: var(--brand-soft);
440
+ align-self: flex-end;
441
+ }
442
+ .msg.assistant {
443
+ background: var(--card);
444
+ border: 1px solid var(--border);
445
+ align-self: flex-start;
446
+ }
447
+ /* ========== 思考过程气泡(Cursor 风格) ========== */
448
+ .msg.assistant.thinking-msg {
449
+ background: var(--card);
450
+ border: 1px solid var(--border);
451
+ border-left: 3px solid var(--brand);
452
+ position: relative;
453
+ padding: 10px 12px;
454
+ }
455
+ .thinking-header {
456
+ display: flex;
457
+ align-items: center;
458
+ gap: 6px;
459
+ cursor: pointer;
460
+ user-select: none;
461
+ padding: 2px 0;
462
+ border-radius: 4px;
463
+ transition: background 0.15s;
464
+ }
465
+ .thinking-header:hover {
466
+ background: var(--brand-soft);
467
+ }
468
+ .thinking-arrow {
469
+ font-size: 10px;
470
+ color: var(--ink-2);
471
+ transition: transform 0.2s;
472
+ flex-shrink: 0;
473
+ width: 14px;
474
+ text-align: center;
475
+ }
476
+ .thinking-label {
477
+ font-size: 12px;
478
+ font-weight: 600;
479
+ color: var(--ink);
480
+ flex-shrink: 0;
481
+ }
482
+ .thinking-summary {
483
+ font-size: 11px;
484
+ color: var(--muted);
485
+ overflow: hidden;
486
+ text-overflow: ellipsis;
487
+ white-space: nowrap;
488
+ }
489
+ .thinking-body {
490
+ margin-top: 8px;
491
+ border-top: 1px solid var(--line);
492
+ padding-top: 6px;
493
+ }
494
+ .thinking-step {
495
+ display: flex;
496
+ align-items: flex-start;
497
+ gap: 6px;
498
+ padding: 3px 0;
499
+ font-size: 12px;
500
+ color: var(--ink-2);
501
+ line-height: 1.5;
502
+ }
503
+ .thinking-step-icon {
504
+ flex-shrink: 0;
505
+ width: 16px;
506
+ text-align: center;
507
+ font-size: 11px;
508
+ }
509
+ .thinking-step-text {
510
+ flex: 1;
511
+ word-break: break-word;
512
+ }
513
+ .thinking-step-text code {
514
+ font-size: 11px;
515
+ background: var(--brand-soft);
516
+ padding: 1px 4px;
517
+ border-radius: 3px;
518
+ color: var(--brand);
519
+ }
520
+ .thinking-step-detail {
521
+ font-size: 11px;
522
+ color: var(--muted);
523
+ cursor: pointer;
524
+ margin-left: 22px;
525
+ padding: 1px 6px;
526
+ border-radius: 3px;
527
+ background: var(--bg);
528
+ display: inline-block;
529
+ }
530
+ .thinking-step-detail:hover {
531
+ background: var(--brand-soft);
532
+ }
533
+ .thinking-args {
534
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
535
+ font-size: 11px;
536
+ color: var(--muted);
537
+ margin: 4px 0 4px 22px;
538
+ padding: 6px 8px;
539
+ background: var(--bg);
540
+ border-radius: 4px;
541
+ overflow-x: auto;
542
+ white-space: pre-wrap;
543
+ word-break: break-all;
544
+ display: none;
545
+ }
546
+ .thinking-args.show {
547
+ display: block;
548
+ }
549
+ .thinking-reply {
550
+ font-size: 13px;
551
+ line-height: 1.7;
552
+ color: var(--ink);
553
+ margin-top: 8px;
554
+ padding-top: 8px;
555
+ border-top: 1px solid var(--line);
556
+ }
557
+ /* 思考中状态指示 */
558
+ .thinking-indicator {
559
+ display: flex;
560
+ align-items: center;
561
+ gap: 8px;
562
+ padding: 4px 0;
563
+ font-size: 12px;
564
+ color: var(--ink-2);
565
+ }
566
+ @keyframes pulse-dot {
567
+ 0%, 100% { opacity: 1; }
568
+ 50% { opacity: 0.3; }
569
+ }
570
+ .thinking-indicator .dot {
571
+ width: 6px;
572
+ height: 6px;
573
+ border-radius: 50%;
574
+ background: var(--brand);
575
+ animation: pulse-dot 1.2s infinite;
576
+ }
577
+ .thinking-indicator .dot:nth-child(2) { animation-delay: 0.2s; }
578
+ .thinking-indicator .dot:nth-child(3) { animation-delay: 0.4s; }
579
+ .dark .msg.assistant { background: #1e293b; }
580
+ .msg.sys {
581
+ background: #f1f5f9;
582
+ align-self: flex-start;
583
+ color: var(--ink-2);
584
+ }
585
+ .dark .msg.sys { background: #334155; }
586
+ .msg .artifact { color: var(--brand); text-decoration: underline; cursor: pointer; }
587
+ /* 内部执行过程:默认折叠,避免"一直都在调用/验证"的噪声;点击展开查看思考与工具调用 */
588
+ .proc-details {
589
+ align-self: stretch; margin-top: 6px; border-top: 1px dashed var(--line);
590
+ padding: 8px 0 2px; display: flex; flex-direction: column; gap: 8px;
591
+ }
592
+ .proc-summary {
593
+ cursor: pointer; font-size: 12px; color: var(--muted); user-select: none;
594
+ padding: 4px 6px; border-radius: 6px; background: var(--card);
595
+ border: 1px solid var(--border); width: fit-content;
596
+ }
597
+ .proc-summary:hover { color: var(--brand); border-color: var(--brand); }
598
+ .proc-details[open] .proc-summary { color: var(--brand); margin-bottom: 6px; }
599
+ .final-msg { border-left: 3px solid var(--ok); align-self: flex-start; }
600
+ .error-msg { border-left: 3px solid var(--err); align-self: flex-start; color: var(--err); }
601
+ .msg .artifact:hover { opacity: 0.8; }
602
+
603
+ /* 输入栏 */
604
+ .input-area {
605
+ padding: 0 16px 16px;
606
+ flex-shrink: 0;
607
+ }
608
+ .input-bar {
609
+ border: 1px solid var(--border);
610
+ border-radius: 14px;
611
+ padding: 12px;
612
+ background: var(--card);
613
+ box-shadow: 0 4px 12px rgba(0,0,0,0.04);
614
+ }
615
+ .input-bar textarea {
616
+ width: 100%;
617
+ border: none;
618
+ margin: 0;
619
+ min-height: 60px;
620
+ resize: none;
621
+ background: transparent;
622
+ color: var(--ink);
623
+ font-size: 14px;
624
+ font-family: inherit;
625
+ }
626
+ .input-bar textarea:focus { outline: none; }
627
+ .input-toolbar {
628
+ display: flex;
629
+ align-items: center;
630
+ gap: 8px;
631
+ margin-top: 10px;
632
+ flex-wrap: wrap;
633
+ }
634
+ .input-toolbar .spacer { flex: 1; }
635
+ .pill {
636
+ border: 1px solid var(--border);
637
+ border-radius: 8px;
638
+ padding: 5px 10px;
639
+ font-size: 12.5px;
640
+ background: var(--card);
641
+ color: var(--ink-2);
642
+ cursor: pointer;
643
+ user-select: none;
644
+ }
645
+ .pill:hover { border-color: var(--brand); }
646
+ .voice-badge { display: inline-flex; align-items: center; gap: 6px; color: var(--err); font-size: 12px; }
647
+
648
+ /* 工作区条 */
649
+ .workspace-bar {
650
+ display: flex;
651
+ align-items: center;
652
+ gap: 8px;
653
+ padding: 8px 0;
654
+ font-size: 13px;
655
+ color: var(--muted);
656
+ }
657
+ .wb-select {
658
+ display: flex;
659
+ align-items: center;
660
+ gap: 6px;
661
+ cursor: pointer;
662
+ padding: 5px 10px;
663
+ border-radius: 8px;
664
+ background: var(--bg);
665
+ border: 1px solid var(--border);
666
+ font-size: 13px;
667
+ color: var(--ink);
668
+ max-width: 320px;
669
+ transition: border-color 0.15s;
670
+ }
671
+ .wb-select:hover { border-color: var(--brand); }
672
+ .wb-icon { font-size: 15px; }
673
+ .wb-label {
674
+ flex: 1;
675
+ white-space: nowrap;
676
+ overflow: hidden;
677
+ text-overflow: ellipsis;
678
+ }
679
+ .wb-arrow { font-size: 10px; color: var(--muted); }
680
+ .wb-perm {
681
+ display: flex;
682
+ align-items: center;
683
+ gap: 5px;
684
+ cursor: pointer;
685
+ padding: 5px 10px;
686
+ border-radius: 8px;
687
+ background: var(--bg);
688
+ border: 1px solid var(--border);
689
+ font-size: 13px;
690
+ color: var(--ink);
691
+ transition: border-color 0.15s;
692
+ }
693
+ .wb-perm:hover { border-color: var(--brand); }
694
+
695
+ /* 通话栏 */
696
+ .call-bar {
697
+ display: flex;
698
+ align-items: center;
699
+ gap: 10px;
700
+ padding: 10px 0;
701
+ border-top: 1px solid var(--border);
702
+ margin-top: 8px;
703
+ }
704
+ .call-hint { font-size: 12px; color: var(--muted); text-transform: uppercase; letter-spacing: 0.5px; }
705
+ .call-btn {
706
+ border: 1px solid var(--border);
707
+ background: var(--brand-soft);
708
+ color: var(--brand);
709
+ border-radius: 8px;
710
+ padding: 7px 12px;
711
+ cursor: pointer;
712
+ font-size: 13px;
713
+ font-weight: 600;
714
+ }
715
+ .call-btn:hover { filter: brightness(0.97); }
716
+ .call-btn.hangup { background: #fee2e2; color: var(--err); border-color: #fecaca; }
717
+ .call-status { font-size: 12px; color: var(--muted); margin-left: auto; }
718
+
719
+ /* 视频通话窗口 */
720
+ .video-call-window {
721
+ position: fixed;
722
+ bottom: 100px;
723
+ right: 20px;
724
+ width: 240px;
725
+ background: var(--card);
726
+ border: 1px solid var(--border);
727
+ border-radius: 12px;
728
+ overflow: hidden;
729
+ box-shadow: 0 8px 32px rgba(0,0,0,0.2);
730
+ z-index: 100;
731
+ }
732
+ .video-call-header {
733
+ display: flex;
734
+ align-items: center;
735
+ justify-content: space-between;
736
+ padding: 8px 12px;
737
+ background: var(--brand);
738
+ color: #fff;
739
+ font-size: 13px;
740
+ font-weight: 600;
741
+ }
742
+ .video-call-close {
743
+ background: none;
744
+ border: none;
745
+ color: #fff;
746
+ cursor: pointer;
747
+ font-size: 14px;
748
+ padding: 0;
749
+ line-height: 1;
750
+ }
751
+ .video-call-snapshot {
752
+ background: rgba(255,255,255,0.2);
753
+ border: none;
754
+ color: #fff;
755
+ cursor: pointer;
756
+ font-size: 14px;
757
+ padding: 2px 6px;
758
+ border-radius: 4px;
759
+ line-height: 1;
760
+ }
761
+ .video-call-snapshot:hover { background: rgba(255,255,255,0.35); }
762
+ .video-call-window video {
763
+ width: 100%;
764
+ display: block;
765
+ background: #000;
766
+ }
767
+
768
+ /* 底部工具栏 */
769
+ .chat-footbar {
770
+ display: flex;
771
+ align-items: center;
772
+ justify-content: space-between;
773
+ padding: 8px 16px;
774
+ background: var(--card);
775
+ border-top: 1px solid var(--border);
776
+ font-size: 13px;
777
+ }
778
+ .model-label { font-size: 13px; color: var(--muted); }
779
+ .model-select {
780
+ padding: 6px 10px;
781
+ border: 1px solid var(--border);
782
+ border-radius: 8px;
783
+ background: var(--card);
784
+ color: var(--ink);
785
+ font-size: 13px;
786
+ }
787
+ .ghost-btn {
788
+ border: 1px solid var(--border);
789
+ background: var(--card);
790
+ color: var(--ink-2);
791
+ border-radius: 8px;
792
+ padding: 6px 9px;
793
+ cursor: pointer;
794
+ font-size: 14px;
795
+ }
796
+ .ghost-btn:hover { background: var(--brand-soft); }
797
+
798
+ /* 新建任务按钮(侧边栏) */
799
+ .new-task-btn {
800
+ border: 1px solid var(--border);
801
+ background: var(--brand);
802
+ color: #fff;
803
+ border-radius: 8px;
804
+ padding: 3px 8px;
805
+ cursor: pointer;
806
+ font-size: 11px;
807
+ font-weight: 600;
808
+ line-height: 1.6;
809
+ }
810
+ .new-task-btn:hover { opacity: 0.88; }
811
+
812
+ /* 新建对话任务弹窗 */
813
+ .nt-form { display: flex; flex-direction: column; gap: 12px; margin-top: 4px; }
814
+ .nt-label { font-size: 12.5px; font-weight: 600; color: var(--ink-2); display: block; margin-bottom: 4px; }
815
+ .nt-form textarea, .nt-form select {
816
+ width: 100%; box-sizing: border-box; padding: 8px 10px; font-size: 13px;
817
+ border: 1px solid var(--border); border-radius: 10px; background: var(--bg);
818
+ color: var(--ink); resize: vertical; font-family: inherit;
819
+ }
820
+ .nt-form select { cursor: pointer; }
821
+ .nt-row { display: flex; gap: 12px; }
822
+ .nt-row > div { flex: 1; }
823
+ .nt-hint { font-size: 12px; color: var(--muted); }
824
+
825
+ /* ========== 右侧面板 ========== */
826
+ .right-panel {
827
+ width: 320px;
828
+ background: var(--card);
829
+ border-left: 1px solid var(--border);
830
+ display: flex;
831
+ flex-direction: column;
832
+ flex-shrink: 0;
833
+ overflow: hidden;
834
+ }
835
+ .right-panel.collapsed { width: 0; border: none; }
836
+ .right-tabs {
837
+ display: flex;
838
+ gap: 4px;
839
+ padding: 12px 12px 0;
840
+ border-bottom: 1px solid var(--line);
841
+ }
842
+ .right-tab {
843
+ padding: 8px 14px;
844
+ font-size: 13px;
845
+ color: var(--muted);
846
+ cursor: pointer;
847
+ border-bottom: 2px solid transparent;
848
+ }
849
+ .right-tab.active { color: var(--brand); border-bottom-color: var(--brand); font-weight: 600; }
850
+ .right-body { flex: 1; overflow-y: auto; padding: 12px; }
851
+ .preview-panel { display: none; }
852
+ .preview-panel.active { display: block; }
853
+ .preview-title { font-size: 13px; font-weight: 600; margin-bottom: 8px; color: var(--ink); }
854
+ .preview-content {
855
+ background: var(--bg);
856
+ border: 1px solid var(--border);
857
+ border-radius: 10px;
858
+ padding: 12px;
859
+ font-size: 12.5px;
860
+ overflow-x: auto;
861
+ }
862
+ .preview-content pre { margin: 0; white-space: pre-wrap; word-break: break-word; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; }
863
+
864
+ /* 电脑操作面板 */
865
+ .computer-controls { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }
866
+ .screen-preview {
867
+ background: var(--bg);
868
+ border: 1px solid var(--border);
869
+ border-radius: 8px;
870
+ overflow: hidden;
871
+ margin-bottom: 12px;
872
+ min-height: 150px;
873
+ display: flex;
874
+ align-items: center;
875
+ justify-content: center;
876
+ }
877
+ .screen-preview img { width: 100%; height: auto; display: block; cursor: crosshair; }
878
+ .computer-actions {
879
+ background: var(--bg);
880
+ border: 1px solid var(--border);
881
+ border-radius: 8px;
882
+ padding: 10px;
883
+ }
884
+ .computer-actions .pill {
885
+ padding: 5px 10px;
886
+ font-size: 12px;
887
+ border: 1px solid var(--border);
888
+ background: var(--card);
889
+ border-radius: 6px;
890
+ cursor: pointer;
891
+ }
892
+ .computer-actions .pill:hover { background: var(--brand-soft); border-color: var(--brand); color: var(--brand); }
893
+
894
+ /* 任务详情 */
895
+ .detail-ops {
896
+ display: grid;
897
+ grid-template-columns: 1fr 1fr;
898
+ gap: 8px;
899
+ margin-bottom: 14px;
900
+ }
901
+ .detail-ops .secondary {
902
+ border: 1px solid var(--border);
903
+ background: var(--brand-soft);
904
+ color: var(--brand);
905
+ border-radius: 8px;
906
+ padding: 7px 11px;
907
+ cursor: pointer;
908
+ font-size: 12.5px;
909
+ font-weight: 600;
910
+ }
911
+ .detail-ops .secondary:hover { filter: brightness(0.97); }
912
+ .artifact-list { display: flex; flex-direction: column; gap: 4px; }
913
+ .artifact-file {
914
+ padding: 6px 8px;
915
+ border: 1px solid var(--border);
916
+ border-radius: 6px;
917
+ font-size: 12.5px;
918
+ color: var(--ink-2);
919
+ cursor: pointer;
920
+ background: var(--bg);
921
+ }
922
+ .artifact-file:hover { background: var(--brand-soft); color: var(--brand); }
923
+
924
+ /* ========== 功能页面 ========== */
925
+ .page-view {
926
+ flex: 1;
927
+ display: none;
928
+ flex-direction: column;
929
+ padding: 24px;
930
+ overflow-y: auto;
931
+ }
932
+ .page-view.active { display: flex; }
933
+ .page-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 20px; }
934
+ .page-head h2 { margin: 0; font-size: 20px; }
935
+ .page-head .sub { color: var(--muted); font-size: 13px; margin-top: 4px; }
936
+ .grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 12px; }
937
+ .tile {
938
+ border: 1px solid var(--border);
939
+ border-radius: 12px;
940
+ padding: 16px;
941
+ cursor: pointer;
942
+ background: var(--card);
943
+ transition: all 0.15s;
944
+ }
945
+ .tile:hover { border-color: var(--brand); box-shadow: 0 6px 18px rgba(37,99,235,0.12); }
946
+ .tile .icon { font-size: 24px; }
947
+ .tile .title { font-weight: 600; margin: 8px 0 4px; font-size: 14px; }
948
+ .tile .desc { color: var(--muted); font-size: 12px; line-height: 1.5; }
949
+ .tile .ops { display: flex; gap: 6px; margin-top: 12px; }
950
+ .tile .ops button { padding: 6px 12px; font-size: 12px; flex: 1; }
951
+ /* 预置指令卡片:带渐变边框,和用户自定义区分 */
952
+ .tile.builtin-tile {
953
+ background: linear-gradient(135deg, var(--card) 0%, rgba(37,99,235,0.03) 100%);
954
+ border: 1px solid var(--brand-soft);
955
+ }
956
+ .tile.builtin-tile:hover { border-color: var(--brand); box-shadow: 0 6px 18px rgba(37,99,235,0.15); }
957
+ .tile.builtin-tile .ops { flex-wrap: wrap; }
958
+ .tile.builtin-tile .ops button { flex: 1 1 auto; }
959
+
960
+ /* ========== 产品发布故事页面 ========== */
961
+ .release-container { max-width: 900px; margin: 0 auto; }
962
+ .release-hero {
963
+ text-align: center;
964
+ padding: 48px 24px;
965
+ background: linear-gradient(135deg, var(--brand-soft) 0%, rgba(37,99,235,0.08) 100%);
966
+ border-radius: 20px;
967
+ margin-bottom: 40px;
968
+ }
969
+ .release-badge {
970
+ display: inline-block;
971
+ padding: 6px 16px;
972
+ background: var(--brand);
973
+ color: #fff;
974
+ border-radius: 20px;
975
+ font-size: 13px;
976
+ font-weight: 600;
977
+ margin-bottom: 16px;
978
+ }
979
+ .release-title {
980
+ font-size: 48px;
981
+ font-weight: 800;
982
+ margin: 0 0 12px;
983
+ background: linear-gradient(135deg, var(--brand), #6366f1);
984
+ -webkit-background-clip: text;
985
+ -webkit-text-fill-color: transparent;
986
+ background-clip: text;
987
+ }
988
+ .release-subtitle {
989
+ font-size: 18px;
990
+ color: var(--ink-2);
991
+ margin: 0 0 8px;
992
+ }
993
+ .release-tagline {
994
+ font-size: 16px;
995
+ color: var(--muted);
996
+ font-style: italic;
997
+ margin: 16px 0 32px;
998
+ }
999
+ .release-stats {
1000
+ display: flex;
1001
+ justify-content: center;
1002
+ gap: 32px;
1003
+ flex-wrap: wrap;
1004
+ }
1005
+ .stat-item {
1006
+ text-align: center;
1007
+ }
1008
+ .stat-num {
1009
+ display: block;
1010
+ font-size: 28px;
1011
+ font-weight: 700;
1012
+ color: var(--brand);
1013
+ }
1014
+ .stat-label {
1015
+ font-size: 12px;
1016
+ color: var(--muted);
1017
+ }
1018
+ .section-title {
1019
+ font-size: 28px;
1020
+ font-weight: 700;
1021
+ margin: 48px 0 24px;
1022
+ text-align: center;
1023
+ }
1024
+ .release-timeline { margin-bottom: 48px; }
1025
+ .timeline {
1026
+ position: relative;
1027
+ padding-left: 40px;
1028
+ }
1029
+ .timeline::before {
1030
+ content: '';
1031
+ position: absolute;
1032
+ left: 15px;
1033
+ top: 0;
1034
+ bottom: 0;
1035
+ width: 2px;
1036
+ background: linear-gradient(to bottom, var(--brand), var(--brand-soft));
1037
+ }
1038
+ .timeline-item {
1039
+ position: relative;
1040
+ margin-bottom: 32px;
1041
+ }
1042
+ .timeline-dot {
1043
+ position: absolute;
1044
+ left: -32px;
1045
+ top: 4px;
1046
+ width: 12px;
1047
+ height: 12px;
1048
+ border-radius: 50%;
1049
+ background: var(--brand-soft);
1050
+ border: 2px solid var(--brand);
1051
+ }
1052
+ .timeline-dot.active {
1053
+ background: var(--brand);
1054
+ box-shadow: 0 0 0 4px rgba(37,99,235,0.2);
1055
+ }
1056
+ .timeline-date {
1057
+ font-size: 13px;
1058
+ color: var(--brand);
1059
+ font-weight: 600;
1060
+ margin-bottom: 4px;
1061
+ }
1062
+ .timeline-content h3 {
1063
+ margin: 0 0 8px;
1064
+ font-size: 18px;
1065
+ }
1066
+ .timeline-content p {
1067
+ color: var(--ink-2);
1068
+ line-height: 1.6;
1069
+ margin: 0 0 8px;
1070
+ }
1071
+ .timeline-quote {
1072
+ font-style: italic;
1073
+ color: var(--muted);
1074
+ border-left: 3px solid var(--brand-soft);
1075
+ padding-left: 12px;
1076
+ margin: 12px 0;
1077
+ }
1078
+ .timeline-tags { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 8px; }
1079
+ .tag {
1080
+ padding: 4px 10px;
1081
+ background: var(--bg);
1082
+ border: 1px solid var(--border);
1083
+ border-radius: 12px;
1084
+ font-size: 11px;
1085
+ color: var(--muted);
1086
+ }
1087
+ .release-team { margin-bottom: 48px; }
1088
+ .team-grid {
1089
+ display: grid;
1090
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
1091
+ gap: 20px;
1092
+ }
1093
+ .team-card {
1094
+ text-align: center;
1095
+ padding: 24px;
1096
+ background: var(--card);
1097
+ border: 1px solid var(--border);
1098
+ border-radius: 16px;
1099
+ }
1100
+ .team-avatar { font-size: 48px; margin-bottom: 12px; }
1101
+ .team-card h3 { margin: 0 0 8px; font-size: 16px; }
1102
+ .team-card p { color: var(--ink-2); font-size: 13px; line-height: 1.5; margin: 0 0 12px; }
1103
+ .team-role {
1104
+ font-size: 12px;
1105
+ color: var(--brand);
1106
+ font-weight: 600;
1107
+ }
1108
+ .release-challenges { margin-bottom: 48px; }
1109
+ .challenges-list { display: flex; flex-direction: column; gap: 16px; }
1110
+ .challenge-item {
1111
+ display: flex;
1112
+ gap: 16px;
1113
+ padding: 20px;
1114
+ background: var(--card);
1115
+ border: 1px solid var(--border);
1116
+ border-radius: 12px;
1117
+ }
1118
+ .challenge-icon { font-size: 28px; flex-shrink: 0; }
1119
+ .challenge-item h4 { margin: 0 0 4px; font-size: 15px; }
1120
+ .challenge-item p { color: var(--ink-2); font-size: 13px; margin: 0; }
1121
+ .release-features { margin-bottom: 48px; }
1122
+ .features-grid {
1123
+ display: grid;
1124
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
1125
+ gap: 16px;
1126
+ }
1127
+ .feature-card {
1128
+ text-align: center;
1129
+ padding: 24px 16px;
1130
+ background: var(--card);
1131
+ border: 1px solid var(--border);
1132
+ border-radius: 12px;
1133
+ transition: all 0.15s;
1134
+ }
1135
+ .feature-card:hover {
1136
+ border-color: var(--brand);
1137
+ transform: translateY(-2px);
1138
+ box-shadow: 0 8px 24px rgba(37,99,235,0.12);
1139
+ }
1140
+ .feature-icon { font-size: 32px; margin-bottom: 12px; }
1141
+ .feature-card h4 { margin: 0 0 6px; font-size: 14px; }
1142
+ .feature-card p { color: var(--muted); font-size: 12px; margin: 0; }
1143
+ .release-quote {
1144
+ text-align: center;
1145
+ padding: 40px 24px;
1146
+ background: linear-gradient(135deg, var(--brand-soft), rgba(99,102,241,0.1));
1147
+ border-radius: 16px;
1148
+ margin-bottom: 48px;
1149
+ }
1150
+ .release-quote blockquote {
1151
+ font-size: 20px;
1152
+ font-style: italic;
1153
+ color: var(--ink);
1154
+ margin: 0 0 16px;
1155
+ line-height: 1.6;
1156
+ }
1157
+ .release-quote cite {
1158
+ font-size: 14px;
1159
+ color: var(--muted);
1160
+ }
1161
+ .release-cta {
1162
+ text-align: center;
1163
+ padding: 48px 24px;
1164
+ background: var(--card);
1165
+ border: 1px solid var(--border);
1166
+ border-radius: 20px;
1167
+ }
1168
+ .release-cta h2 { margin: 0 0 24px; font-size: 28px; }
1169
+ .cta-buttons { display: flex; gap: 16px; justify-content: center; flex-wrap: wrap; margin-bottom: 20px; }
1170
+ .cta-btn {
1171
+ display: inline-block;
1172
+ padding: 12px 28px;
1173
+ border-radius: 10px;
1174
+ font-size: 15px;
1175
+ font-weight: 600;
1176
+ text-decoration: none;
1177
+ transition: all 0.15s;
1178
+ }
1179
+ .cta-btn.primary {
1180
+ background: var(--brand);
1181
+ color: #fff;
1182
+ }
1183
+ .cta-btn.primary:hover { filter: brightness(1.1); transform: translateY(-1px); }
1184
+ .cta-btn.secondary {
1185
+ background: transparent;
1186
+ color: var(--brand);
1187
+ border: 2px solid var(--brand);
1188
+ }
1189
+ .cta-btn.secondary:hover { background: var(--brand-soft); }
1190
+ .cta-sub { color: var(--muted); font-size: 13px; }
1191
+
1192
+ /* ========== 通用样式 ========== */
1193
+ .card {
1194
+ background: var(--card);
1195
+ border: 1px solid var(--border);
1196
+ border-radius: 16px;
1197
+ padding: 20px;
1198
+ box-shadow: 0 8px 24px rgba(31,41,51,0.06);
1199
+ }
1200
+ label { font-size: 13px; color: var(--muted); display: block; margin-bottom: 6px; }
1201
+ input[type="text"], textarea, select {
1202
+ width: 100%;
1203
+ border: 1px solid var(--border);
1204
+ border-radius: 10px;
1205
+ padding: 10px 12px;
1206
+ font-size: 14px;
1207
+ font-family: inherit;
1208
+ margin-bottom: 12px;
1209
+ background: var(--card);
1210
+ color: var(--ink);
1211
+ }
1212
+ textarea { min-height: 80px; resize: vertical; }
1213
+ button {
1214
+ border: none;
1215
+ background: var(--brand);
1216
+ color: #fff;
1217
+ border-radius: 10px;
1218
+ padding: 9px 16px;
1219
+ font-size: 14px;
1220
+ cursor: pointer;
1221
+ }
1222
+ button:hover { filter: brightness(1.05); }
1223
+ button.secondary { background: #fff; color: var(--ink); border: 1px solid var(--border); }
1224
+ button.ghost { background: transparent; color: var(--ink-2); border: 1px solid var(--border); }
1225
+ button.danger { background: var(--err); }
1226
+ button:disabled { opacity: 0.5; cursor: not-allowed; }
1227
+ .row { display: flex; gap: 8px; }
1228
+ .row > * { flex: 1; }
1229
+ .muted { color: var(--muted); font-size: 12.5px; }
1230
+ .empty { color: var(--muted); font-size: 13px; text-align: center; padding: 18px; }
1231
+ .badge { display: inline-block; padding: 2px 8px; border-radius: 999px; font-size: 11px; font-weight: 600; }
1232
+ .badge.queued { background: #eef2f7; color: var(--muted); }
1233
+ .badge.running { background: var(--brand-soft); color: var(--brand); }
1234
+ .badge.done { background: #f0fdf4; color: var(--ok); }
1235
+ .badge.failed { background: #fef2f2; color: var(--err); }
1236
+
1237
+ /* ========== 模态框 ========== */
1238
+ .mask {
1239
+ position: fixed;
1240
+ inset: 0;
1241
+ background: rgba(15,23,42,0.45);
1242
+ z-index: 60;
1243
+ display: none;
1244
+ align-items: center;
1245
+ justify-content: center;
1246
+ }
1247
+ .mask.show { display: flex; }
1248
+ .modal {
1249
+ background: var(--card);
1250
+ border-radius: 16px;
1251
+ padding: 24px;
1252
+ width: 520px;
1253
+ max-width: 92vw;
1254
+ max-height: 88vh;
1255
+ overflow-y: auto;
1256
+ box-shadow: 0 20px 60px rgba(0,0,0,0.25);
1257
+ }
1258
+ .modal h3 { margin: 0 0 6px; font-size: 18px; }
1259
+ .modal .hint { color: var(--muted); font-size: 12.5px; margin: 0 0 16px; }
1260
+ .modal .footer { display: flex; gap: 8px; justify-content: flex-end; margin-top: 16px; }
1261
+ .close-x { float: right; cursor: pointer; color: var(--muted); font-size: 18px; }
1262
+
1263
+ /* ========== 下拉菜单 ========== */
1264
+ .dropdown { position: relative; }
1265
+ .dropdown-menu {
1266
+ position: absolute;
1267
+ bottom: 100%;
1268
+ left: 0;
1269
+ margin-bottom: 6px;
1270
+ background: var(--card);
1271
+ border: 1px solid var(--border);
1272
+ border-radius: 12px;
1273
+ box-shadow: 0 10px 30px rgba(0,0,0,0.12);
1274
+ min-width: 180px;
1275
+ display: none;
1276
+ z-index: 55;
1277
+ padding: 6px 0;
1278
+ }
1279
+ .dropdown-menu.show { display: block; }
1280
+ .dropdown-item { padding: 9px 14px; font-size: 13px; color: var(--ink-2); cursor: pointer; display: flex; align-items: center; gap: 8px; }
1281
+ .dropdown-item:hover { background: var(--bg); }
1282
+ .dropdown-divider { height: 1px; background: var(--line); margin: 6px 0; }
1283
+
1284
+ /* ========== 权限窗口 ========== */
1285
+ .perm-section { margin-bottom: 14px; }
1286
+ .perm-title { font-size: 13px; font-weight: 600; margin-bottom: 8px; }
1287
+ .perm-row { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; font-size: 13px; }
1288
+ .perm-row input[type="checkbox"] { width: auto; margin: 0; }
1289
+ .perm-row label { margin: 0; color: var(--ink-2); }
1290
+
1291
+ /* ========== 智能体选择 ========== */
1292
+ .agent-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
1293
+ .agent-card { border: 1px solid var(--border); border-radius: 12px; padding: 14px; text-align: center; cursor: pointer; }
1294
+ .agent-card:hover, .agent-card.selected { border-color: var(--brand); background: var(--brand-soft); }
1295
+ .agent-card .icon { font-size: 24px; }
1296
+ .agent-card .title { font-size: 13px; font-weight: 600; margin-top: 6px; }
1297
+
1298
+ /* ========== 大模型管理 ========== */
1299
+ .model-list { display: flex; flex-direction: column; gap: 8px; margin-bottom: 14px; max-height: 200px; overflow-y: auto; }
1300
+ .model-item {
1301
+ border: 1px solid var(--border);
1302
+ border-radius: 10px;
1303
+ padding: 10px 12px;
1304
+ display: flex;
1305
+ align-items: center;
1306
+ gap: 10px;
1307
+ background: var(--bg);
1308
+ }
1309
+ .model-item .mi-name { font-weight: 600; color: var(--ink); font-size: 13px; }
1310
+ .model-item .mi-base { font-size: 11px; color: var(--muted); word-break: break-all; }
1311
+ .model-item .mi-default { font-size: 11px; color: var(--ok); border: 1px solid #bbf7d0; background: #f0fdf4; border-radius: 6px; padding: 1px 6px; }
1312
+ .model-item .mi-actions { margin-left: auto; display: flex; gap: 6px; }
1313
+ .model-item .mi-actions button {
1314
+ border: 1px solid var(--border);
1315
+ background: var(--card);
1316
+ color: var(--ink-2);
1317
+ border-radius: 6px;
1318
+ padding: 4px 8px;
1319
+ cursor: pointer;
1320
+ font-size: 12px;
1321
+ }
1322
+ .model-item .mi-actions button:hover { background: var(--brand-soft); }
1323
+ .model-item .mi-actions button.danger { color: var(--err); }
1324
+ .model-form { border-top: 1px solid var(--line); padding-top: 14px; }
1325
+ .form-row { display: flex; gap: 10px; }
1326
+ .form-row .form-field { flex: 1; }
1327
+ .form-field { margin-bottom: 10px; }
1328
+ .form-field label { font-size: 12px; color: var(--muted); display: block; margin-bottom: 5px; }
1329
+ .form-field input {
1330
+ width: 100%;
1331
+ padding: 8px 10px;
1332
+ border: 1px solid var(--border);
1333
+ border-radius: 8px;
1334
+ background: var(--card);
1335
+ color: var(--ink);
1336
+ font-size: 13px;
1337
+ box-sizing: border-box;
1338
+ margin: 0;
1339
+ }
1340
+ .form-actions { display: flex; align-items: center; gap: 10px; margin-top: 4px; }
1341
+ .model-form-msg { font-size: 12px; color: var(--ok); }
1342
+ .model-form-msg.err { color: var(--err); }
1343
+ .primary { background: var(--brand); color: #fff; border: none; border-radius: 8px; padding: 8px 16px; cursor: pointer; font-size: 13px; font-weight: 600; }
1344
+ .ghost { background: var(--card); color: var(--ink-2); border: 1px solid var(--border); border-radius: 8px; padding: 8px 16px; cursor: pointer; font-size: 13px; }
1345
+ .primary.sm, .ghost.sm { padding: 5px 12px; font-size: 12px; }
1346
+
1347
+ /* ========== 设置面板 ========== */
1348
+ .settings-layout { display: flex; gap: 0; min-height: 360px; }
1349
+ .settings-nav { flex: 0 0 130px; border-right: 1px solid var(--line); padding-right: 8px; }
1350
+ .settings-cat { padding: 9px 10px; border-radius: 8px; cursor: pointer; font-size: 13px; color: var(--ink-2); }
1351
+ .settings-cat:hover { background: var(--bg); }
1352
+ .settings-cat.active { background: var(--brand-soft); color: var(--brand); font-weight: 600; }
1353
+ .settings-body { flex: 1; padding: 4px 4px 4px 16px; overflow-y: auto; }
1354
+ .settings-item {
1355
+ display: flex;
1356
+ align-items: center;
1357
+ gap: 12px;
1358
+ padding: 12px;
1359
+ border: 1px solid var(--border);
1360
+ border-radius: 10px;
1361
+ margin-bottom: 10px;
1362
+ cursor: pointer;
1363
+ background: var(--card);
1364
+ }
1365
+ .settings-item:hover { background: var(--brand-soft); }
1366
+ .settings-item .si-icon { font-size: 18px; }
1367
+ .settings-item .si-main { flex: 1; }
1368
+ .settings-item .si-title { font-weight: 600; font-size: 13.5px; color: var(--ink); }
1369
+ .settings-item .si-desc { font-size: 12px; color: var(--muted); }
1370
+ .settings-item .si-arrow { color: var(--muted); }
1371
+
1372
+ /* ========== 设置·大模型管理(简洁卡片风) ========== */
1373
+ .model-manage { margin-top: 4px; }
1374
+ .mm-list { display: flex; flex-direction: column; gap: 8px; }
1375
+ .mm-empty {
1376
+ padding: 28px 16px;
1377
+ text-align: center;
1378
+ color: var(--muted);
1379
+ font-size: 13px;
1380
+ background: var(--bg);
1381
+ border: 1px dashed var(--border);
1382
+ border-radius: 10px;
1383
+ }
1384
+ .mm-empty .mm-empty-icon { font-size: 28px; margin-bottom: 6px; opacity: 0.6; }
1385
+ .mm-empty .mm-empty-hint { font-size: 12px; margin-top: 4px; color: var(--muted); }
1386
+ .mm-card {
1387
+ display: flex;
1388
+ flex-direction: column;
1389
+ gap: 6px;
1390
+ padding: 12px 14px;
1391
+ border: 1px solid var(--border);
1392
+ border-radius: 10px;
1393
+ background: var(--card);
1394
+ transition: border-color 0.15s;
1395
+ }
1396
+ .mm-card:hover { border-color: var(--brand); }
1397
+ .mm-card-head { display: flex; align-items: center; gap: 8px; }
1398
+ .mm-card-name { font-weight: 600; font-size: 14px; color: var(--ink); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1399
+ .mm-default-tag {
1400
+ font-size: 11px;
1401
+ padding: 1px 7px;
1402
+ border-radius: 99px;
1403
+ background: var(--brand-soft);
1404
+ color: var(--brand);
1405
+ font-weight: 500;
1406
+ flex: 0 0 auto;
1407
+ }
1408
+ .mm-card-url {
1409
+ font-size: 12px;
1410
+ color: var(--muted);
1411
+ word-break: break-all;
1412
+ display: flex;
1413
+ align-items: center;
1414
+ gap: 4px;
1415
+ }
1416
+ .mm-card-url::before { content: '🔗'; font-size: 11px; opacity: 0.7; }
1417
+ .mm-card-meta { font-size: 11px; color: var(--muted); }
1418
+ .mm-card-actions {
1419
+ display: flex;
1420
+ gap: 4px;
1421
+ justify-content: flex-end;
1422
+ margin-top: 2px;
1423
+ border-top: 1px solid var(--line);
1424
+ padding-top: 8px;
1425
+ }
1426
+ .mm-act {
1427
+ font-size: 12px;
1428
+ padding: 4px 10px;
1429
+ border-radius: 6px;
1430
+ background: transparent;
1431
+ border: 1px solid var(--border);
1432
+ color: var(--ink-2);
1433
+ cursor: pointer;
1434
+ transition: all 0.15s;
1435
+ }
1436
+ .mm-act:hover { background: var(--bg); color: var(--ink); }
1437
+ .mm-act-primary { color: var(--brand); border-color: var(--brand-soft); }
1438
+ .mm-act-primary:hover { background: var(--brand-soft); }
1439
+ .mm-act-danger { color: var(--muted); }
1440
+ .mm-act-danger:hover { color: var(--err); background: transparent; }
1441
+ /* 分隔 */
1442
+ .mm-divider {
1443
+ display: flex;
1444
+ align-items: center;
1445
+ gap: 8px;
1446
+ margin: 16px 0 10px;
1447
+ font-size: 12px;
1448
+ color: var(--muted);
1449
+ }
1450
+ .mm-divider::before, .mm-divider::after {
1451
+ content: '';
1452
+ flex: 1;
1453
+ height: 1px;
1454
+ background: var(--line);
1455
+ }
1456
+ /* 表单 */
1457
+ .mm-form {
1458
+ display: flex;
1459
+ flex-direction: column;
1460
+ gap: 10px;
1461
+ padding: 14px;
1462
+ border: 1px solid var(--border);
1463
+ border-radius: 10px;
1464
+ background: var(--bg);
1465
+ }
1466
+ .mm-form-title { font-size: 13px; font-weight: 600; color: var(--ink); margin-bottom: 2px; }
1467
+ .mm-form input, .mm-form textarea {
1468
+ margin: 0;
1469
+ padding: 8px 10px;
1470
+ font-size: 13px;
1471
+ border: 1px solid var(--border);
1472
+ border-radius: 8px;
1473
+ background: var(--card);
1474
+ transition: border-color 0.15s;
1475
+ }
1476
+ .mm-form input:focus, .mm-form textarea:focus {
1477
+ outline: none;
1478
+ border-color: var(--brand);
1479
+ }
1480
+ .mm-form textarea { resize: vertical; min-height: 56px; font-family: inherit; }
1481
+ .mm-form-actions { display: flex; align-items: center; gap: 8px; margin-top: 2px; }
1482
+ .mm-form-actions .mm-form-msg { font-size: 12px; color: var(--muted); margin-left: auto; }
1483
+ .mm-form-actions .mm-form-msg.err { color: var(--err); }
1484
+
1485
+ /* ========== 用户菜单(右侧侧边栏样式) ========== */
1486
+ .bottom-sheet-mask {
1487
+ position: fixed;
1488
+ inset: 0;
1489
+ background: rgba(15,23,42,0.35);
1490
+ z-index: 70;
1491
+ display: none;
1492
+ justify-content: flex-end;
1493
+ }
1494
+ .bottom-sheet-mask.show { display: flex; }
1495
+ .bottom-sheet {
1496
+ background: var(--card);
1497
+ border-radius: 16px 0 0 16px;
1498
+ width: 280px;
1499
+ max-width: 85vw;
1500
+ max-height: 100vh;
1501
+ overflow-y: auto;
1502
+ padding: 16px 0;
1503
+ box-shadow: -10px 0 40px rgba(0,0,0,0.15);
1504
+ transform: translateX(100%);
1505
+ transition: transform 0.25s ease;
1506
+ }
1507
+ .bottom-sheet-mask.show .bottom-sheet { transform: translateX(0); }
1508
+ .sheet-header { padding: 8px 20px 16px; display: flex; align-items: center; gap: 12px; border-bottom: 1px solid var(--line); margin-bottom: 6px; }
1509
+ .sheet-item { padding: 12px 20px; display: flex; align-items: center; gap: 12px; cursor: pointer; font-size: 14px; color: var(--ink-2); }
1510
+ .sheet-item:hover { background: var(--bg); }
1511
+ .sheet-item .icon { width: 22px; text-align: center; }
1512
+ .sheet-item .right { margin-left: auto; font-size: 12px; color: var(--muted); }
1513
+
1514
+ /* ========== 工作区 ========== */
1515
+ .workspace-box { border: 1px solid var(--border); border-radius: 10px; padding: 10px; background: var(--bg); }
1516
+ .workspace-cwd { font-size: 12px; color: var(--ink-2); word-break: break-all; margin-bottom: 8px; }
1517
+ .workspace-input { display: flex; gap: 6px; }
1518
+ .workspace-input input { flex: 1; margin: 0; font-size: 12px; padding: 6px 8px; }
1519
+ .workspace-input button { padding: 6px 10px; font-size: 12px; }
1520
+ .file-tree { margin-top: 8px; display: flex; flex-direction: column; gap: 2px; max-height: 220px; overflow-y: auto; }
1521
+ .file-item { padding: 5px 8px; border-radius: 6px; cursor: pointer; font-size: 12px; display: flex; align-items: center; gap: 6px; color: var(--ink-2); }
1522
+ .file-item:hover { background: var(--brand-soft); }
1523
+ .file-item.dir { font-weight: 500; }
1524
+ .file-item.drive-switcher { flex-direction: column; align-items: flex-start; padding: 8px; background: var(--bg); border: 1px dashed var(--border); }
1525
+ .drive-option { padding: 3px 10px; margin-top: 4px; border-radius: 4px; font-size: 11px; cursor: pointer; color: var(--ink-2); }
1526
+ .drive-option:hover { background: var(--brand-soft); color: var(--brand); }
1527
+
1528
+ /* ========== 文件芯片 ========== */
1529
+ .file-chip { display: inline-flex; align-items: center; gap: 6px; background: var(--brand-soft); color: var(--brand); padding: 4px 8px; border-radius: 6px; font-size: 12px; cursor: pointer; }
1530
+ .file-chip:hover { opacity: 0.85; }
1531
+ /* 输入区·待发送附件暂存(点发送时统一上传给 AI) */
1532
+ .staged-area {
1533
+ display: none;
1534
+ flex-wrap: wrap;
1535
+ gap: 6px;
1536
+ padding: 0 0 8px 0;
1537
+ border-bottom: 1px dashed var(--border);
1538
+ margin-bottom: 8px;
1539
+ }
1540
+ .staged-area.show { display: flex; }
1541
+ .staged-chip {
1542
+ display: inline-flex;
1543
+ align-items: center;
1544
+ gap: 6px;
1545
+ padding: 4px 4px 4px 8px;
1546
+ background: var(--brand-soft);
1547
+ color: var(--brand);
1548
+ border-radius: 6px;
1549
+ font-size: 12px;
1550
+ max-width: 240px;
1551
+ }
1552
+ .staged-chip .staged-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 180px; }
1553
+ .staged-chip .staged-size { color: var(--muted); font-size: 11px; }
1554
+ .staged-chip .staged-remove {
1555
+ display: inline-flex;
1556
+ align-items: center;
1557
+ justify-content: center;
1558
+ width: 18px;
1559
+ height: 18px;
1560
+ border-radius: 50%;
1561
+ background: transparent;
1562
+ border: none;
1563
+ color: var(--brand);
1564
+ cursor: pointer;
1565
+ font-size: 14px;
1566
+ line-height: 1;
1567
+ padding: 0;
1568
+ }
1569
+ .staged-chip .staged-remove:hover { background: rgba(0,0,0,.08); }
1570
+ .staged-hint {
1571
+ font-size: 11px;
1572
+ color: var(--muted);
1573
+ align-self: center;
1574
+ margin-left: 4px;
1575
+ }
1576
+
1577
+ /* ========== 截图遮罩 ========== */
1578
+ .crop-overlay { position: fixed; inset: 0; z-index: 9999; background: rgba(0,0,0,0.35); cursor: crosshair; }
1579
+ .crop-tip { position: fixed; top: 16px; left: 50%; transform: translateX(-50%); background: rgba(0,0,0,0.7); color: #fff; padding: 6px 14px; border-radius: 20px; font-size: 13px; pointer-events: none; }
1580
+ .crop-selection { position: fixed; border: 2px dashed #fff; background: rgba(255,255,255,0.12); box-shadow: 0 0 0 9999px rgba(0,0,0,0.25); pointer-events: none; }
1581
+
1582
+ /* ========== Toast ========== */
1583
+ .toast {
1584
+ position: fixed;
1585
+ bottom: 24px;
1586
+ left: 50%;
1587
+ transform: translateX(-50%);
1588
+ background: #1f2933;
1589
+ color: #fff;
1590
+ padding: 10px 18px;
1591
+ border-radius: 10px;
1592
+ font-size: 13px;
1593
+ z-index: 80;
1594
+ opacity: 0;
1595
+ transition: 0.25s;
1596
+ pointer-events: none;
1597
+ }
1598
+ .toast.show { opacity: 1; }
1599
+
1600
+ /* ========== 隐藏文件输入 ========== */
1601
+ input[type="file"] { display: none; }
1602
+
1603
+ /* ========== 记忆系统 ========== */
1604
+ .stat-card { text-align: center; padding: 16px; }
1605
+ .stat-label { font-size: 12px; color: var(--muted); margin-bottom: 8px; }
1606
+ .stat-value { font-size: 24px; font-weight: 700; color: var(--brand); }
1607
+ .stat-date { font-size: 13px; color: var(--ink-2); font-weight: 400; }
1608
+ .memory-content { max-height: 60vh; overflow-y: auto; white-space: pre-wrap; font-family: "SF Mono", Monaco, monospace; font-size: 12.5px; line-height: 1.7; }
1609
+ .memory-content h1, .memory-content h2, .memory-content h3 { color: var(--brand); margin-top: 0; }
1610
+ .memory-content pre { background: var(--bg); padding: 12px; border-radius: 8px; overflow-x: auto; }
1611
+ .memory-content code { background: var(--bg); padding: 2px 6px; border-radius: 4px; font-size: 12px; }
1612
+
1613
+ /* ========== 欢迎引导弹窗 ========== */
1614
+ #welcomeGuideModal .modal { width: 480px; }
1615
+ .welcome-guide-header { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; }
1616
+ .welcome-guide-header .icon { font-size: 32px; }
1617
+ .welcome-guide-header h3 { margin: 0; font-size: 18px; }
1618
+ .welcome-guide-header p { margin: 4px 0 0; font-size: 12px; color: var(--muted); }
1619
+ .welcome-task-list { display: flex; flex-direction: column; gap: 8px; margin-bottom: 16px; }
1620
+ .welcome-task-item {
1621
+ display: flex;
1622
+ align-items: center;
1623
+ gap: 12px;
1624
+ padding: 12px;
1625
+ border: 1px solid var(--border);
1626
+ border-radius: 10px;
1627
+ background: var(--bg);
1628
+ cursor: pointer;
1629
+ transition: all 0.15s;
1630
+ }
1631
+ .welcome-task-item:hover {
1632
+ border-color: var(--brand);
1633
+ background: var(--brand-soft);
1634
+ }
1635
+ .welcome-task-index {
1636
+ width: 28px;
1637
+ height: 28px;
1638
+ border-radius: 50%;
1639
+ background: var(--brand);
1640
+ color: #fff;
1641
+ display: flex;
1642
+ align-items: center;
1643
+ justify-content: center;
1644
+ font-size: 13px;
1645
+ font-weight: 700;
1646
+ flex-shrink: 0;
1647
+ }
1648
+ .welcome-task-content { flex: 1; min-width: 0; }
1649
+ .welcome-task-title { font-size: 13px; font-weight: 600; color: var(--ink); }
1650
+ .welcome-task-desc { font-size: 11px; color: var(--muted); margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
1651
+ .welcome-task-run {
1652
+ padding: 4px 10px;
1653
+ border: 1px solid var(--brand);
1654
+ background: transparent;
1655
+ color: var(--brand);
1656
+ border-radius: 6px;
1657
+ font-size: 11px;
1658
+ cursor: pointer;
1659
+ flex-shrink: 0;
1660
+ transition: all 0.15s;
1661
+ }
1662
+ .welcome-task-run:hover {
1663
+ background: var(--brand);
1664
+ color: #fff;
1665
+ }
1666
+ .empty-welcome {
1667
+ text-align: center;
1668
+ padding: 20px;
1669
+ color: var(--muted);
1670
+ font-size: 13px;
1671
+ }
1672
+
1673
+ /* ========== 后端服务断连提示横幅 ========== */
1674
+ .backend-offline-banner {
1675
+ position: fixed;
1676
+ top: 0;
1677
+ left: 0;
1678
+ right: 0;
1679
+ z-index: 10000;
1680
+ background: linear-gradient(90deg, #c62828, #e53935);
1681
+ color: #fff;
1682
+ padding: 9px 20px;
1683
+ display: flex;
1684
+ align-items: center;
1685
+ gap: 10px;
1686
+ font-size: 13px;
1687
+ font-weight: 500;
1688
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.25);
1689
+ animation: bob-slide-down 0.25s ease;
1690
+ }
1691
+ .backend-offline-banner .bob-icon { font-size: 16px; flex-shrink: 0; }
1692
+ .backend-offline-banner .bob-text { flex: 1; min-width: 0; }
1693
+ .backend-offline-banner .bob-reconnect {
1694
+ background: rgba(255, 255, 255, 0.18);
1695
+ border: 1px solid rgba(255, 255, 255, 0.4);
1696
+ color: #fff;
1697
+ padding: 3px 12px;
1698
+ border-radius: 5px;
1699
+ cursor: pointer;
1700
+ font-size: 12px;
1701
+ font-weight: 500;
1702
+ flex-shrink: 0;
1703
+ transition: background 0.15s;
1704
+ }
1705
+ .backend-offline-banner .bob-reconnect:hover {
1706
+ background: rgba(255, 255, 255, 0.3);
1707
+ }
1708
+ .backend-offline-banner .bob-reconnect:active {
1709
+ transform: scale(0.96);
1710
+ }
1711
+ @keyframes bob-slide-down {
1712
+ from { transform: translateY(-100%); opacity: 0; }
1713
+ to { transform: translateY(0); opacity: 1; }
1714
+ }
1715
1715
 
1716
1716
  /* ========== P2-1: 设计稿转代码 ========== */
1717
1717
  @keyframes spin {
@@ -1726,4 +1726,4 @@
1726
1726
  border-color: var(--accent, #2d5a3d);
1727
1727
  background: var(--card, #f5f5f5);
1728
1728
  }
1729
-
1729
+