@rexvane/piweb 0.3.24 → 0.3.26

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 (285) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +11 -11
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +5 -5
  5. package/.next/react-loadable-manifest.json +13 -20
  6. package/.next/required-server-files.js +2 -1
  7. package/.next/required-server-files.json +2 -1
  8. package/.next/routes-manifest.json +6 -8
  9. package/.next/server/app/_global-error/page.js +2 -2
  10. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  11. package/.next/server/app/_global-error.html +1 -1
  12. package/.next/server/app/_global-error.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/.next/server/app/_not-found/page.js +1 -1
  17. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  18. package/.next/server/app/_not-found.html +1 -1
  19. package/.next/server/app/_not-found.rsc +2 -2
  20. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  21. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  22. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  23. package/.next/server/app/api/agent/[id]/events/route.js +2 -2
  24. package/.next/server/app/api/agent/[id]/events/route.js.nft.json +1 -1
  25. package/.next/server/app/api/agent/[id]/route.js +1 -1
  26. package/.next/server/app/api/agent/[id]/route.js.nft.json +1 -1
  27. package/.next/server/app/api/agent/[id]/tree/route.js +1 -1
  28. package/.next/server/app/api/agent/[id]/tree/route.js.nft.json +1 -1
  29. package/.next/server/app/api/agent/new/route.js +1 -1
  30. package/.next/server/app/api/agent/new/route.js.nft.json +1 -1
  31. package/.next/server/app/api/agent/resources/route.js +1 -0
  32. package/.next/server/app/api/agent/resources/route.js.nft.json +1 -0
  33. package/.next/server/app/api/agent/resources/route_client-reference-manifest.js +1 -0
  34. package/.next/server/app/api/config/route.js +1 -1
  35. package/.next/server/app/api/config/route.js.nft.json +1 -1
  36. package/.next/server/app/api/files/route.js +1 -1
  37. package/.next/server/app/api/files/route.js.nft.json +1 -1
  38. package/.next/server/app/api/fs/route.js +1 -1
  39. package/.next/server/app/api/fs/route.js.nft.json +1 -1
  40. package/.next/server/app/api/git/route.js +4 -4
  41. package/.next/server/app/api/git/route.js.nft.json +1 -1
  42. package/.next/server/app/api/github/route.js +4 -4
  43. package/.next/server/app/api/github/route.js.nft.json +1 -1
  44. package/.next/server/app/api/growth/route.js +1 -1
  45. package/.next/server/app/api/growth/route.js.nft.json +1 -1
  46. package/.next/server/app/api/health/route.js +1 -1
  47. package/.next/server/app/api/models/defaults/route.js +1 -1
  48. package/.next/server/app/api/models/defaults/route.js.nft.json +1 -1
  49. package/.next/server/app/api/models/route.js +1 -1
  50. package/.next/server/app/api/models/route.js.nft.json +1 -1
  51. package/.next/server/app/api/pi-settings/route.js +1 -1
  52. package/.next/server/app/api/pi-settings/route.js.nft.json +1 -1
  53. package/.next/server/app/api/plugins/route.js +1 -1
  54. package/.next/server/app/api/plugins/route.js.nft.json +1 -1
  55. package/.next/server/app/api/prompts/route.js +1 -1
  56. package/.next/server/app/api/prompts/route.js.nft.json +1 -1
  57. package/.next/server/app/api/remote/route.js +4 -3
  58. package/.next/server/app/api/security/route.js +1 -1
  59. package/.next/server/app/api/security/route.js.nft.json +1 -1
  60. package/.next/server/app/api/sessions/[id]/export/route.js +1 -1
  61. package/.next/server/app/api/sessions/[id]/export/route.js.nft.json +1 -1
  62. package/.next/server/app/api/sessions/[id]/route.js +1 -1
  63. package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  64. package/.next/server/app/api/sessions/import/route.js +2 -2
  65. package/.next/server/app/api/sessions/import/route.js.nft.json +1 -1
  66. package/.next/server/app/api/sessions/route.js +1 -1
  67. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  68. package/.next/server/app/api/skills/route.js +2 -2
  69. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  70. package/.next/server/app/api/update/route.js +2 -2
  71. package/.next/server/app/api/update/route.js.nft.json +1 -1
  72. package/.next/server/app/api/version/route.js +1 -1
  73. package/.next/server/app/api/version/route.js.nft.json +1 -1
  74. package/.next/server/app/api/web-auth/route.js +2 -2
  75. package/.next/server/app/api/workspaces/route.js +1 -1
  76. package/.next/server/app/api/workspaces/route.js.nft.json +1 -1
  77. package/.next/server/app/icon.svg/route.js +1 -1
  78. package/.next/server/app/index.html +1 -1
  79. package/.next/server/app/index.rsc +6 -7
  80. package/.next/server/app/index.segments/__PAGE__.segment.rsc +6 -7
  81. package/.next/server/app/index.segments/_full.segment.rsc +6 -7
  82. package/.next/server/app/index.segments/_tree.segment.rsc +2 -3
  83. package/.next/server/app/login/page.js +1 -1
  84. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  85. package/.next/server/app/login.html +1 -1
  86. package/.next/server/app/login.rsc +3 -3
  87. package/.next/server/app/login.segments/_full.segment.rsc +3 -3
  88. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  89. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +3 -3
  90. package/.next/server/app/page.js +1 -1
  91. package/.next/server/app/page.js.nft.json +1 -1
  92. package/.next/server/app/page_client-reference-manifest.js +1 -1
  93. package/.next/server/app-paths-manifest.json +11 -11
  94. package/.next/server/chunks/3924.js +3 -3
  95. package/.next/server/chunks/538.js +1 -1
  96. package/.next/server/chunks/620.js +1 -0
  97. package/.next/server/chunks/6229.js +1 -1
  98. package/.next/server/chunks/7496.js +1 -1
  99. package/.next/server/chunks/7662.js +2 -2
  100. package/.next/server/chunks/8686.js +1 -1
  101. package/.next/server/functions-config-manifest.json +1 -2
  102. package/.next/server/instrumentation.js.nft.json +1 -1
  103. package/.next/server/middleware-build-manifest.js +1 -1
  104. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  105. package/.next/server/pages/404.html +1 -1
  106. package/.next/server/pages/500.html +1 -1
  107. package/.next/server/preview-props.json +3 -3
  108. package/.next/server/server-reference-manifest.json +1 -1
  109. package/.next/static/QJCtqgDKzGS2BdKABd9ch/_buildManifest.js +1 -0
  110. package/.next/static/chunks/2577.86c8538fbf05a8b2.js +1 -0
  111. package/.next/static/chunks/2716.fa561519675a3ff1.js +1 -0
  112. package/.next/static/chunks/2906.8a0e09bb47605cf1.js +1 -0
  113. package/.next/static/chunks/4673.ea36e55005c0f82f.js +1 -0
  114. package/.next/static/chunks/4686-4dc565817a160351.js +1 -0
  115. package/.next/static/chunks/4778.0d2c5d75b791d352.js +1 -0
  116. package/.next/static/chunks/{618.949981da99be7182.js → 618.9a22656b863f242b.js} +2 -2
  117. package/.next/static/chunks/app/_global-error/page-f2d93969c0bcf406.js +1 -0
  118. package/.next/static/chunks/app/api/agent/[id]/events/route-f2d93969c0bcf406.js +1 -0
  119. package/.next/static/chunks/app/api/agent/[id]/route-f2d93969c0bcf406.js +1 -0
  120. package/.next/static/chunks/app/api/agent/[id]/tree/route-f2d93969c0bcf406.js +1 -0
  121. package/.next/static/chunks/app/api/agent/new/route-f2d93969c0bcf406.js +1 -0
  122. package/.next/static/chunks/app/api/agent/resources/route-f2d93969c0bcf406.js +1 -0
  123. package/.next/static/chunks/app/api/config/route-f2d93969c0bcf406.js +1 -0
  124. package/.next/static/chunks/app/api/files/route-f2d93969c0bcf406.js +1 -0
  125. package/.next/static/chunks/app/api/fs/route-f2d93969c0bcf406.js +1 -0
  126. package/.next/static/chunks/app/api/git/route-f2d93969c0bcf406.js +1 -0
  127. package/.next/static/chunks/app/api/github/route-f2d93969c0bcf406.js +1 -0
  128. package/.next/static/chunks/app/api/growth/route-f2d93969c0bcf406.js +1 -0
  129. package/.next/static/chunks/app/api/health/route-f2d93969c0bcf406.js +1 -0
  130. package/.next/static/chunks/app/api/models/defaults/route-f2d93969c0bcf406.js +1 -0
  131. package/.next/static/chunks/app/api/models/route-f2d93969c0bcf406.js +1 -0
  132. package/.next/static/chunks/app/api/pi-settings/route-f2d93969c0bcf406.js +1 -0
  133. package/.next/static/chunks/app/api/plugins/route-f2d93969c0bcf406.js +1 -0
  134. package/.next/static/chunks/app/api/prompts/route-f2d93969c0bcf406.js +1 -0
  135. package/.next/static/chunks/app/api/remote/route-f2d93969c0bcf406.js +1 -0
  136. package/.next/static/chunks/app/api/security/route-f2d93969c0bcf406.js +1 -0
  137. package/.next/static/chunks/app/api/sessions/[id]/export/route-f2d93969c0bcf406.js +1 -0
  138. package/.next/static/chunks/app/api/sessions/[id]/route-f2d93969c0bcf406.js +1 -0
  139. package/.next/static/chunks/app/api/sessions/import/route-f2d93969c0bcf406.js +1 -0
  140. package/.next/static/chunks/app/api/sessions/route-f2d93969c0bcf406.js +1 -0
  141. package/.next/static/chunks/app/api/skills/route-f2d93969c0bcf406.js +1 -0
  142. package/.next/static/chunks/app/api/update/route-f2d93969c0bcf406.js +1 -0
  143. package/.next/static/chunks/app/api/version/route-f2d93969c0bcf406.js +1 -0
  144. package/.next/static/chunks/app/api/web-auth/route-f2d93969c0bcf406.js +1 -0
  145. package/.next/static/chunks/app/api/workspaces/route-f2d93969c0bcf406.js +1 -0
  146. package/.next/static/chunks/app/page-71f2d3b3ed864b3d.js +1 -0
  147. package/.next/static/chunks/next/dist/client/components/builtin/app-error-f2d93969c0bcf406.js +1 -0
  148. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-f2d93969c0bcf406.js +1 -0
  149. package/.next/static/chunks/next/dist/client/components/builtin/not-found-f2d93969c0bcf406.js +1 -0
  150. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-f2d93969c0bcf406.js +1 -0
  151. package/.next/static/chunks/webpack-ffc09b5fcc8aaa6d.js +1 -0
  152. package/.next/static/css/014eb1f21414e615.css +1 -0
  153. package/.next/static/css/56b129a13637fcfd.css +1 -0
  154. package/.next/static/css/7e3caf797e4cb19a.css +1 -0
  155. package/.next/types/app/api/agent/{[id]/side-chat → resources}/route.ts +3 -3
  156. package/.next/types/routes.d.ts +2 -2
  157. package/.next/types/validator.ts +9 -9
  158. package/README.md +1 -1
  159. package/next.config.ts +1 -1
  160. package/package.json +9 -9
  161. package/scripts/apply-global.mjs +87 -0
  162. package/scripts/launcher.mjs +21 -0
  163. package/scripts/testing/prepare-sdk-tools.mjs +19 -0
  164. package/src/app/api/agent/new/route.ts +2 -1
  165. package/src/app/api/agent/resources/route.ts +18 -0
  166. package/src/app/api/models/route.ts +22 -1
  167. package/src/app/api/plugins/route.ts +3 -2
  168. package/src/app/api/prompts/route.ts +3 -2
  169. package/src/app/api/remote/route.ts +22 -4
  170. package/src/app/api/sessions/[id]/export/route.ts +3 -1
  171. package/src/app/api/skills/route.ts +3 -2
  172. package/src/app/globals.css +1002 -1765
  173. package/src/components/AppShell.tsx +128 -93
  174. package/src/components/ChatInput.tsx +177 -98
  175. package/src/components/ChatWindow.tsx +189 -56
  176. package/src/components/ContextMeter.tsx +33 -9
  177. package/src/components/CustomSelect.module.css +142 -0
  178. package/src/components/CustomSelect.tsx +157 -0
  179. package/src/components/DrawerPanel.tsx +1 -1
  180. package/src/components/ExtensionUI.tsx +9 -3
  181. package/src/components/FileViewer.tsx +24 -21
  182. package/src/components/GitPanel.tsx +35 -13
  183. package/src/components/GrowthTree.tsx +6 -2
  184. package/src/components/ImageViewer.tsx +72 -0
  185. package/src/components/MarkdownBlock.tsx +67 -96
  186. package/src/components/ModelSelector.tsx +36 -39
  187. package/src/components/PiMark.tsx +76 -41
  188. package/src/components/PreviewImage.tsx +33 -0
  189. package/src/components/ProjectPanel.tsx +8 -5
  190. package/src/components/PromptPanel.tsx +85 -20
  191. package/src/components/ProviderSetupModal.module.css +12 -11
  192. package/src/components/ProviderSetupModal.tsx +107 -36
  193. package/src/components/RemoteSection.tsx +53 -2
  194. package/src/components/SessionImportSection.tsx +30 -15
  195. package/src/components/SessionSidebar.tsx +72 -62
  196. package/src/components/SettingsPanel.tsx +49 -151
  197. package/src/components/TrajectoryAnalyzer.module.css +26 -11
  198. package/src/components/TrajectoryView.tsx +11 -3
  199. package/src/components/chat/markdown-actions.tsx +23 -0
  200. package/src/components/composer/ComposerFiles.tsx +224 -0
  201. package/src/components/composer/ComposerImages.tsx +59 -127
  202. package/src/hooks/usePiWeb.ts +47 -2
  203. package/src/i18n.tsx +62 -80
  204. package/src/lib/agent-manager.ts +365 -33
  205. package/src/lib/chat/file-path.ts +54 -0
  206. package/src/lib/chat/skill-expansion.ts +51 -0
  207. package/src/lib/extension-ui.ts +25 -1
  208. package/src/lib/font.ts +37 -39
  209. package/src/lib/git-service.ts +4 -2
  210. package/src/lib/growth-turns.ts +3 -1
  211. package/src/lib/model-draft.ts +69 -2
  212. package/src/lib/models-service.ts +53 -3
  213. package/src/lib/pi.ts +2 -2
  214. package/src/lib/remote/assets.json +1 -1
  215. package/src/lib/remote/supervisor.ts +48 -5
  216. package/src/lib/security-service.ts +2 -1
  217. package/src/lib/session-reader.ts +25 -13
  218. package/src/lib/session-retention.ts +11 -8
  219. package/src/lib/skills-service.ts +2 -1
  220. package/src/lib/slash-command-token.ts +14 -0
  221. package/src/lib/trajectory.ts +111 -15
  222. package/src/lib/types.ts +28 -3
  223. package/src/lib/update-service.ts +29 -9
  224. package/src/lib/workspace-store.ts +36 -1
  225. package/.next/server/app/api/agent/[id]/side-chat/route.js +0 -5
  226. package/.next/server/app/api/agent/[id]/side-chat/route.js.nft.json +0 -1
  227. package/.next/server/app/api/agent/[id]/side-chat/route_client-reference-manifest.js +0 -1
  228. package/.next/server/chunks/3421.js +0 -1
  229. package/.next/static/chunks/2716.44fdf1b21454b961.js +0 -1
  230. package/.next/static/chunks/4673.e261707dce391be7.js +0 -1
  231. package/.next/static/chunks/4686-0cd87513f9ea3538.js +0 -1
  232. package/.next/static/chunks/4778.eddd3a5813f85824.js +0 -1
  233. package/.next/static/chunks/7411.5f79671208209b13.js +0 -1
  234. package/.next/static/chunks/8552.25c39ef4c995eba0.js +0 -1
  235. package/.next/static/chunks/app/_global-error/page-cbaaee0d7aacb85a.js +0 -1
  236. package/.next/static/chunks/app/api/agent/[id]/events/route-cbaaee0d7aacb85a.js +0 -1
  237. package/.next/static/chunks/app/api/agent/[id]/route-cbaaee0d7aacb85a.js +0 -1
  238. package/.next/static/chunks/app/api/agent/[id]/side-chat/route-cbaaee0d7aacb85a.js +0 -1
  239. package/.next/static/chunks/app/api/agent/[id]/tree/route-cbaaee0d7aacb85a.js +0 -1
  240. package/.next/static/chunks/app/api/agent/new/route-cbaaee0d7aacb85a.js +0 -1
  241. package/.next/static/chunks/app/api/config/route-cbaaee0d7aacb85a.js +0 -1
  242. package/.next/static/chunks/app/api/files/route-cbaaee0d7aacb85a.js +0 -1
  243. package/.next/static/chunks/app/api/fs/route-cbaaee0d7aacb85a.js +0 -1
  244. package/.next/static/chunks/app/api/git/route-cbaaee0d7aacb85a.js +0 -1
  245. package/.next/static/chunks/app/api/github/route-cbaaee0d7aacb85a.js +0 -1
  246. package/.next/static/chunks/app/api/growth/route-cbaaee0d7aacb85a.js +0 -1
  247. package/.next/static/chunks/app/api/health/route-cbaaee0d7aacb85a.js +0 -1
  248. package/.next/static/chunks/app/api/models/defaults/route-cbaaee0d7aacb85a.js +0 -1
  249. package/.next/static/chunks/app/api/models/route-cbaaee0d7aacb85a.js +0 -1
  250. package/.next/static/chunks/app/api/pi-settings/route-cbaaee0d7aacb85a.js +0 -1
  251. package/.next/static/chunks/app/api/plugins/route-cbaaee0d7aacb85a.js +0 -1
  252. package/.next/static/chunks/app/api/prompts/route-cbaaee0d7aacb85a.js +0 -1
  253. package/.next/static/chunks/app/api/remote/route-cbaaee0d7aacb85a.js +0 -1
  254. package/.next/static/chunks/app/api/security/route-cbaaee0d7aacb85a.js +0 -1
  255. package/.next/static/chunks/app/api/sessions/[id]/export/route-cbaaee0d7aacb85a.js +0 -1
  256. package/.next/static/chunks/app/api/sessions/[id]/route-cbaaee0d7aacb85a.js +0 -1
  257. package/.next/static/chunks/app/api/sessions/import/route-cbaaee0d7aacb85a.js +0 -1
  258. package/.next/static/chunks/app/api/sessions/route-cbaaee0d7aacb85a.js +0 -1
  259. package/.next/static/chunks/app/api/skills/route-cbaaee0d7aacb85a.js +0 -1
  260. package/.next/static/chunks/app/api/update/route-cbaaee0d7aacb85a.js +0 -1
  261. package/.next/static/chunks/app/api/version/route-cbaaee0d7aacb85a.js +0 -1
  262. package/.next/static/chunks/app/api/web-auth/route-cbaaee0d7aacb85a.js +0 -1
  263. package/.next/static/chunks/app/api/workspaces/route-cbaaee0d7aacb85a.js +0 -1
  264. package/.next/static/chunks/app/page-dc3cb41d91c7432e.js +0 -1
  265. package/.next/static/chunks/next/dist/client/components/builtin/app-error-cbaaee0d7aacb85a.js +0 -1
  266. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-cbaaee0d7aacb85a.js +0 -1
  267. package/.next/static/chunks/next/dist/client/components/builtin/not-found-cbaaee0d7aacb85a.js +0 -1
  268. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-cbaaee0d7aacb85a.js +0 -1
  269. package/.next/static/chunks/webpack-2ac3d76b81895f5b.js +0 -1
  270. package/.next/static/css/08815507594e8b8d.css +0 -1
  271. package/.next/static/css/9fc559c2c4ad1d0f.css +0 -1
  272. package/.next/static/css/c6e2227c36ec2fd6.css +0 -1
  273. package/.next/static/css/f15a853af8b5127f.css +0 -1
  274. package/.next/static/lvKCJmjFj8LuqSojRVLRF/_buildManifest.js +0 -1
  275. package/src/app/api/agent/[id]/side-chat/route.ts +0 -77
  276. package/src/components/side-chat/SideChatPanel.module.css +0 -131
  277. package/src/components/side-chat/SideChatPanel.tsx +0 -189
  278. package/src/components/side-chat/icons.tsx +0 -8
  279. package/src/components/side-chat/request-history.ts +0 -29
  280. package/src/components/side-chat/store.ts +0 -248
  281. package/src/lib/chat/stream-settings.ts +0 -192
  282. package/src/lib/side-chat/context.ts +0 -123
  283. package/src/lib/side-chat/service.ts +0 -191
  284. package/src/lib/side-chat/types.ts +0 -61
  285. /package/.next/static/{lvKCJmjFj8LuqSojRVLRF → QJCtqgDKzGS2BdKABd9ch}/_ssgManifest.js +0 -0
@@ -6,64 +6,85 @@
6
6
  ============================================================ */
7
7
 
8
8
  :root {
9
- /* 静态色阶 */
9
+ /* 静态色阶(含 Iconsax 标志色彩虹光晕与鲜红警示) */
10
10
  --dsw-deepseek-400: rgb(103, 158, 254);
11
11
  --dsw-deepseek-450: rgb(86, 134, 254);
12
12
  --dsw-deepseek-500: rgb(65, 118, 230);
13
13
  --dsw-amber-500: rgb(245, 158, 11);
14
14
  --dsw-green-500: rgb(34, 197, 94);
15
- --dsw-red-600: rgb(236, 19, 19);
16
-
17
- /* 别名(浅色) */
15
+ --dsw-red-600: rgb(226, 22, 42);
16
+ --isx-aura-gradient: conic-gradient(
17
+ from 180deg at 50% 50%,
18
+ #02defc 0deg,
19
+ #7ffe00 65deg,
20
+ #fdf301 130deg,
21
+ #f66315 200deg,
22
+ #fc0197 275deg,
23
+ #fe9efb 325deg,
24
+ #02defc 360deg
25
+ );
26
+ --isx-line-gradient: linear-gradient(
27
+ 90deg,
28
+ #02defc 0%,
29
+ #7ffe00 22%,
30
+ #fdf301 44%,
31
+ #f66315 66%,
32
+ #fc0197 84%,
33
+ #fe9efb 100%
34
+ );
35
+ --isx-ease: cubic-bezier(0.22, 1, 0.36, 1);
36
+ --isx-spring: cubic-bezier(0.16, 1, 0.3, 1);
37
+
38
+ /* 别名(Iconsax 浅色:纯净明快、层次分明的加深描边) */
18
39
  --dsw-bg-base: #ffffff;
19
40
  --dsw-bg-elevated: #ffffff;
20
- --dsw-sidebar-fill: rgb(249, 250, 251);
41
+ --dsw-sidebar-fill: #f4f4f6;
21
42
  --dsw-input-major: #ffffff;
22
- --dsw-bubble: rgb(239, 244, 255); /* deepseek-50 近似 */
23
- --dsw-hover: rgba(0, 0, 0, 0.04);
24
- --dsw-active: rgba(0, 0, 0, 0.06);
25
- --dsw-label-primary: rgb(0, 0, 0);
26
- --dsw-label-secondary: rgb(64, 64, 66);
27
- --dsw-label-tertiary: rgb(110, 110, 115);
28
- --dsw-label-caption: rgb(150, 150, 155);
29
- --dsw-border-l1: rgba(0, 0, 0, 0.04);
30
- --dsw-border-l2: rgba(0, 0, 0, 0.1);
31
- --dsw-border-l3: rgba(0, 0, 0, 0.12);
32
- --dsw-border-l4: rgba(0, 0, 0, 0.16);
43
+ --dsw-bubble: #f1f2f5;
44
+ --dsw-hover: rgba(0, 0, 0, 0.05);
45
+ --dsw-active: rgba(0, 0, 0, 0.09);
46
+ --dsw-label-primary: #09090b;
47
+ --dsw-label-secondary: #3f3f46;
48
+ --dsw-label-tertiary: #71717a;
49
+ --dsw-label-caption: #a1a1aa;
50
+ --dsw-border-l1: rgba(0, 0, 0, 0.08);
51
+ --dsw-border-l2: #d1d5db;
52
+ --dsw-border-l3: #9ca3af;
53
+ --dsw-border-l4: #6b7280;
33
54
  --dsw-accent: var(--dsw-deepseek-500);
34
55
  --dsw-accent-soft: rgba(65, 118, 230, 0.1);
35
56
  --dsw-warn: var(--dsw-amber-500);
36
57
  --dsw-success: var(--dsw-green-500);
37
58
  --dsw-danger: var(--dsw-red-600);
38
- --dsw-selector: rgba(0, 0, 0, 0.05);
59
+ --dsw-selector: rgba(0, 0, 0, 0.06);
39
60
 
40
- /* dsh 层级表面 */
61
+ /* 层级表面 */
41
62
  --dsw-layer-2: #ffffff;
42
- --dsw-layer-3: #ffffff;
63
+ --dsw-layer-3: #f4f4f6;
43
64
  --dsw-btn-elevated: #ffffff;
44
- --dsw-btn-floating-hover: rgb(240, 241, 243);
45
- --dsw-module-platform: rgb(238, 239, 241);
46
- --dsw-border-strong: rgb(173, 178, 184); /* neutral-bluish-400 */
65
+ --dsw-btn-floating-hover: #f0f0f3;
66
+ --dsw-module-platform: #f2f2f5;
67
+ --dsw-border-strong: #09090b;
47
68
 
48
69
  /* 玻璃面 */
49
- --dsw-glass-popover: #ffffff;
70
+ --dsw-glass-popover: rgba(255, 255, 255, 0.94);
50
71
  --dsw-glass-input: #ffffff;
51
- --dsw-glass-modal: #ffffff;
52
- --dsw-mask: rgba(0, 0, 0, 0.24);
53
- --dsw-mask-blur: blur(6px);
72
+ --dsw-glass-modal: rgba(255, 255, 255, 0.96);
73
+ --dsw-mask: rgba(0, 0, 0, 0.32);
74
+ --dsw-mask-blur: blur(10px);
54
75
 
55
76
  /* 投影(soft / panel / prominent 三档,描边并入投影实现 0 布局成本发丝线) */
56
77
  --dsw-elevation-stroke: var(--dsw-border-l2);
57
- --dsw-elevation-soft: 0 0 0 0.5px var(--dsw-elevation-stroke), 0 4px 16px rgba(0, 0, 0, 0.03),
78
+ --dsw-elevation-soft: 0 0 0 1px var(--dsw-elevation-stroke), 0 4px 16px rgba(0, 0, 0, 0.03),
58
79
  0 0 24px rgba(0, 0, 0, 0.03);
59
- --dsw-elevation-panel: 0 0 0 0.5px var(--dsw-elevation-stroke), 0 8px 32px rgba(0, 0, 0, 0.08);
60
- --dsw-elevation-prominent: 0 0 0 0.5px var(--dsw-elevation-stroke), 0 16px 48px rgba(0, 0, 0, 0.16);
80
+ --dsw-elevation-panel: 0 0 0 1px var(--dsw-elevation-stroke), 0 10px 34px rgba(0, 0, 0, 0.08);
81
+ --dsw-elevation-prominent: 0 0 0 1px var(--dsw-elevation-stroke), 0 18px 52px rgba(0, 0, 0, 0.18);
61
82
 
62
83
  /* 动效 */
63
- --ds-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
64
- --ds-duration-fast: 0.1s;
65
- --ds-duration-normal: 0.2s;
66
- --ds-duration-slow: 0.3s;
84
+ --ds-ease-in-out: cubic-bezier(0.22, 1, 0.36, 1);
85
+ --ds-duration-fast: 0.16s;
86
+ --ds-duration-normal: 0.25s;
87
+ --ds-duration-slow: 0.32s;
67
88
 
68
89
  /* 字体 */
69
90
  --dsh-content-font-size: 14px;
@@ -79,7 +100,8 @@
79
100
  --piweb-chat-font-xs: calc(var(--piweb-chat-font-size) * 0.82);
80
101
  --font-ui: "Maple Mono CN", ui-monospace, SFMono-Regular, Menlo, Consolas, "PingFang SC",
81
102
  "Microsoft YaHei", monospace;
82
- --font-mono: "Maple Mono CN", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
103
+ /* 代码字体固定系统等宽,不再提供设置项(见 lib/font.ts) */
104
+ --font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
83
105
 
84
106
  /* 内容宽轴(缩短 1/5 保持舒适比例) */
85
107
  --dsh-chat-content-width: clamp(544px, 51.2%, 736px);
@@ -89,77 +111,81 @@
89
111
  @media (prefers-color-scheme: dark) {
90
112
  :root:not([data-ds-light-theme]),
91
113
  body:not([data-ds-light-theme]) {
92
- --dsw-bg-base: rgb(21, 21, 23);
93
- --dsw-bg-elevated: rgb(30, 30, 32);
94
- --dsw-sidebar-fill: rgb(27, 27, 28);
95
- --dsw-input-major: rgb(44, 44, 46);
96
- --dsw-bubble: rgb(38, 40, 46);
114
+ /* Iconsax 柔和曜石黑与护眼银灰(告别刺眼纯白,WCAG AAA 护眼高对比) */
115
+ --dsw-bg-base: #09090c;
116
+ --dsw-bg-elevated: #111116;
117
+ --dsw-sidebar-fill: #0c0c10;
118
+ --dsw-input-major: #131318;
119
+ --dsw-bubble: #17181e;
97
120
  --dsw-hover: rgba(255, 255, 255, 0.05);
98
- --dsw-active: rgba(255, 255, 255, 0.08);
99
- --dsw-label-primary: rgb(249, 250, 251);
100
- --dsw-label-secondary: rgb(207, 211, 214);
101
- --dsw-label-tertiary: rgb(173, 178, 184);
102
- --dsw-label-caption: rgb(129, 133, 140);
103
- --dsw-border-l1: rgba(255, 255, 255, 0.06);
104
- --dsw-border-l2: rgba(255, 255, 255, 0.12);
105
- --dsw-border-l3: rgba(255, 255, 255, 0.16);
106
- --dsw-border-l4: rgba(255, 255, 255, 0.2);
121
+ --dsw-active: rgba(255, 255, 255, 0.09);
122
+ --dsw-label-primary: #e3e4e8;
123
+ --dsw-label-secondary: #9da1ad;
124
+ --dsw-label-tertiary: #6b707e;
125
+ --dsw-label-caption: #4d515e;
126
+ --dsw-border-l1: rgba(255, 255, 255, 0.05);
127
+ --dsw-border-l2: rgba(255, 255, 255, 0.08);
128
+ --dsw-border-l3: rgba(255, 255, 255, 0.12);
129
+ --dsw-border-l4: rgba(255, 255, 255, 0.18);
107
130
  --dsw-accent: var(--dsw-deepseek-400);
108
- --dsw-accent-soft: rgba(103, 158, 254, 0.14);
109
- --dsw-danger: rgb(242, 90, 90);
110
- --dsw-selector: rgba(255, 255, 255, 0.08);
111
- --dsw-layer-2: rgb(44, 44, 46);
112
- --dsw-layer-3: rgb(53, 54, 56);
113
- --dsw-btn-elevated: rgb(67, 69, 74);
114
- --dsw-btn-floating-hover: rgb(53, 54, 56);
115
- --dsw-module-platform: rgb(53, 54, 56);
116
- --dsw-glass-popover: rgb(53, 54, 56);
117
- --dsw-glass-input: rgb(44, 44, 46);
118
- --dsw-glass-modal: rgb(44, 44, 46);
119
- --dsw-mask: rgba(0, 0, 0, 0.5);
131
+ --dsw-accent-soft: rgba(103, 158, 254, 0.15);
132
+ --dsw-danger: rgb(226, 22, 42);
133
+ --dsw-selector: rgba(255, 255, 255, 0.07);
134
+ --dsw-layer-2: #14141a;
135
+ --dsw-layer-3: #1b1c23;
136
+ --dsw-btn-elevated: #15161c;
137
+ --dsw-btn-floating-hover: #1f2028;
138
+ --dsw-module-platform: #15161c;
139
+ --dsw-border-strong: #e3e4e8;
140
+ --dsw-glass-popover: rgba(17, 17, 22, 0.94);
141
+ --dsw-glass-input: #111116;
142
+ --dsw-glass-modal: rgba(15, 15, 20, 0.96);
143
+ --dsw-mask: rgba(0, 0, 0, 0.65);
120
144
  --dsw-elevation-stroke: var(--dsw-border-l2);
121
- --dsw-elevation-soft: 0 0 0 0.5px var(--dsw-elevation-stroke), 0 4px 16px rgba(0, 0, 0, 0.2),
122
- 0 0 24px rgba(0, 0, 0, 0.2);
123
- --dsw-elevation-panel: 0 0 0 0.5px var(--dsw-elevation-stroke), 0 8px 32px rgba(0, 0, 0, 0.4);
124
- --dsw-elevation-prominent: 0 0 0 0.5px var(--dsw-elevation-stroke), 0 16px 48px rgba(0, 0, 0, 0.55);
145
+ --dsw-elevation-soft: 0 0 0 1px var(--dsw-elevation-stroke), 0 4px 18px rgba(0, 0, 0, 0.35),
146
+ 0 0 24px rgba(0, 0, 0, 0.25);
147
+ --dsw-elevation-panel: 0 0 0 1px var(--dsw-elevation-stroke), 0 12px 38px rgba(0, 0, 0, 0.55);
148
+ --dsw-elevation-prominent: 0 0 0 1px var(--dsw-elevation-stroke), 0 20px 56px rgba(0, 0, 0, 0.72);
125
149
  }
126
150
  }
127
151
 
128
152
  html[data-ds-dark-theme],
129
153
  body[data-ds-dark-theme] {
130
- --dsw-bg-base: rgb(21, 21, 23);
131
- --dsw-bg-elevated: rgb(30, 30, 32);
132
- --dsw-sidebar-fill: rgb(27, 27, 28);
133
- --dsw-input-major: rgb(44, 44, 46);
134
- --dsw-bubble: rgb(38, 40, 46);
154
+ /* Iconsax 柔和曜石黑与护眼银灰(告别刺眼纯白,WCAG AAA 护眼高对比) */
155
+ --dsw-bg-base: #09090c;
156
+ --dsw-bg-elevated: #111116;
157
+ --dsw-sidebar-fill: #0c0c10;
158
+ --dsw-input-major: #131318;
159
+ --dsw-bubble: #17181e;
135
160
  --dsw-hover: rgba(255, 255, 255, 0.05);
136
- --dsw-active: rgba(255, 255, 255, 0.08);
137
- --dsw-label-primary: rgb(249, 250, 251);
138
- --dsw-label-secondary: rgb(207, 211, 214);
139
- --dsw-label-tertiary: rgb(173, 178, 184);
140
- --dsw-label-caption: rgb(129, 133, 140);
141
- --dsw-border-l1: rgba(255, 255, 255, 0.06);
142
- --dsw-border-l2: rgba(255, 255, 255, 0.12);
143
- --dsw-border-l3: rgba(255, 255, 255, 0.16);
144
- --dsw-border-l4: rgba(255, 255, 255, 0.2);
161
+ --dsw-active: rgba(255, 255, 255, 0.09);
162
+ --dsw-label-primary: #e3e4e8;
163
+ --dsw-label-secondary: #9da1ad;
164
+ --dsw-label-tertiary: #6b707e;
165
+ --dsw-label-caption: #4d515e;
166
+ --dsw-border-l1: rgba(255, 255, 255, 0.05);
167
+ --dsw-border-l2: rgba(255, 255, 255, 0.08);
168
+ --dsw-border-l3: rgba(255, 255, 255, 0.12);
169
+ --dsw-border-l4: rgba(255, 255, 255, 0.18);
145
170
  --dsw-accent: var(--dsw-deepseek-400);
146
- --dsw-accent-soft: rgba(103, 158, 254, 0.14);
147
- --dsw-danger: rgb(242, 90, 90);
148
- --dsw-selector: rgba(255, 255, 255, 0.08);
149
- --dsw-layer-2: rgb(44, 44, 46);
150
- --dsw-layer-3: rgb(53, 54, 56);
151
- --dsw-btn-elevated: rgb(67, 69, 74);
152
- --dsw-btn-floating-hover: rgb(53, 54, 56);
153
- --dsw-module-platform: rgb(53, 54, 56);
154
- --dsw-glass-popover: rgb(53, 54, 56);
155
- --dsw-glass-input: rgb(44, 44, 46);
156
- --dsw-glass-modal: rgb(44, 44, 46);
157
- --dsw-mask: rgba(0, 0, 0, 0.5);
171
+ --dsw-accent-soft: rgba(103, 158, 254, 0.15);
172
+ --dsw-danger: rgb(226, 22, 42);
173
+ --dsw-selector: rgba(255, 255, 255, 0.07);
174
+ --dsw-layer-2: #14141a;
175
+ --dsw-layer-3: #1b1c23;
176
+ --dsw-btn-elevated: #15161c;
177
+ --dsw-btn-floating-hover: #1f2028;
178
+ --dsw-module-platform: #15161c;
179
+ --dsw-border-strong: #e3e4e8;
180
+ --dsw-glass-popover: rgba(17, 17, 22, 0.94);
181
+ --dsw-glass-input: #111116;
182
+ --dsw-glass-modal: rgba(15, 15, 20, 0.96);
183
+ --dsw-mask: rgba(0, 0, 0, 0.65);
158
184
  --dsw-elevation-stroke: var(--dsw-border-l2);
159
- --dsw-elevation-soft: 0 0 0 0.5px var(--dsw-elevation-stroke), 0 4px 16px rgba(0, 0, 0, 0.2),
160
- 0 0 24px rgba(0, 0, 0, 0.2);
161
- --dsw-elevation-panel: 0 0 0 0.5px var(--dsw-elevation-stroke), 0 8px 32px rgba(0, 0, 0, 0.4);
162
- --dsw-elevation-prominent: 0 0 0 0.5px var(--dsw-elevation-stroke), 0 16px 48px rgba(0, 0, 0, 0.55);
185
+ --dsw-elevation-soft: 0 0 0 1px var(--dsw-elevation-stroke), 0 4px 18px rgba(0, 0, 0, 0.35),
186
+ 0 0 24px rgba(0, 0, 0, 0.25);
187
+ --dsw-elevation-panel: 0 0 0 1px var(--dsw-elevation-stroke), 0 12px 38px rgba(0, 0, 0, 0.55);
188
+ --dsw-elevation-prominent: 0 0 0 1px var(--dsw-elevation-stroke), 0 20px 56px rgba(0, 0, 0, 0.72);
163
189
  }
164
190
 
165
191
  /* 基础 */
@@ -317,7 +343,7 @@ textarea::placeholder {
317
343
  }
318
344
 
319
345
  /* ============================================================
320
- 通用组件样式
346
+ 通用组件样式(Iconsax 组件体系:高对比反转、高斯彩虹光晕、25px 胶囊、弹性微交互)
321
347
  ============================================================ */
322
348
 
323
349
  .icon-btn {
@@ -326,211 +352,296 @@ textarea::placeholder {
326
352
  justify-content: center;
327
353
  width: 28px;
328
354
  height: 28px;
329
- border-radius: 8px;
355
+ border-radius: 10px;
330
356
  color: var(--dsw-label-secondary);
331
- transition: background var(--ds-duration-fast) var(--ds-ease-in-out), color var(--ds-duration-fast)
332
- var(--ds-ease-in-out);
357
+ transition: background 0.22s var(--isx-ease), color 0.22s var(--isx-ease), transform 0.2s var(--isx-ease);
333
358
  }
334
- .icon-btn:hover {
359
+ .icon-btn svg {
360
+ transition: transform 0.22s var(--isx-ease);
361
+ }
362
+ .icon-btn:hover:not(:disabled) {
335
363
  background: var(--dsw-hover);
336
364
  color: var(--dsw-label-primary);
337
365
  }
366
+ .icon-btn:hover:not(:disabled) svg {
367
+ transform: scale(1.14);
368
+ }
369
+ .icon-btn:active:not(:disabled) {
370
+ transform: scale(0.9);
371
+ }
338
372
 
339
373
  .chip {
340
374
  display: inline-flex;
341
375
  align-items: center;
342
376
  gap: 5px;
343
377
  height: 28px;
344
- padding: 0 10px;
345
- border-radius: 24px;
378
+ padding: 0 11px;
379
+ border-radius: 25px;
380
+ border: 1px solid transparent;
346
381
  font-size: 13px;
347
382
  line-height: 20px;
348
383
  font-weight: 500;
349
384
  color: var(--dsw-label-primary);
350
385
  white-space: nowrap;
351
- transition: background var(--ds-duration-fast) var(--ds-ease-in-out), color var(--ds-duration-fast)
352
- var(--ds-ease-in-out);
386
+ transition: background 0.24s var(--isx-ease), color 0.24s var(--isx-ease), border-color 0.24s var(--isx-ease),
387
+ transform 0.2s var(--isx-ease);
353
388
  }
354
- .chip:hover {
389
+ .chip:hover:not(:disabled),
390
+ .chip[data-open="true"] {
355
391
  background: var(--dsw-hover);
392
+ border-color: var(--dsw-border-l3);
356
393
  color: var(--dsw-label-primary);
357
394
  }
395
+ .chip:active:not(:disabled) {
396
+ transform: scale(0.93);
397
+ }
358
398
  .chip .chevron {
359
399
  color: var(--dsw-label-caption);
360
- transition: transform 120ms var(--ds-ease-in-out);
400
+ transition: transform 220ms var(--isx-ease);
361
401
  }
362
402
  .chip[data-open="true"] .chevron {
363
403
  transform: rotate(180deg);
364
404
  }
365
405
 
366
- /* Hero 专属工作区 / 预设芯片(对齐 dsh .workspace:透明底、label-primary 纯白高亮、无外框胶囊) */
406
+ /* Hero 专属工作区 / 预设芯片(Iconsax .button.border 胶囊风格) */
367
407
  .hero-chip {
368
408
  display: inline-flex;
369
409
  align-items: center;
370
410
  gap: 6px;
371
- height: 28px;
372
- padding: 0 8px;
373
- border-radius: 14px;
374
- background: transparent;
411
+ height: 30px;
412
+ padding: 0 12px;
413
+ border-radius: 25px;
414
+ border: 1px solid var(--dsw-border-l2);
415
+ background: var(--dsw-bg-elevated);
375
416
  color: var(--dsw-label-primary);
376
417
  font-size: 13px;
377
418
  line-height: 20px;
378
419
  font-weight: 500;
379
420
  white-space: nowrap;
380
421
  cursor: pointer;
381
- transition: background var(--ds-duration-fast) var(--ds-ease-in-out);
422
+ transition: background 0.25s var(--isx-ease), border-color 0.25s var(--isx-ease),
423
+ transform 0.2s var(--isx-ease);
382
424
  }
383
425
  .hero-chip:hover,
384
426
  .hero-chip[data-open="true"] {
385
427
  background: var(--dsw-hover);
428
+ border-color: var(--dsw-label-primary);
429
+ }
430
+ .hero-chip:active {
431
+ transform: scale(0.92);
386
432
  }
387
433
  .hero-chip .hero-chip-icon {
388
434
  flex: none;
389
435
  color: var(--dsw-label-primary);
436
+ transition: transform 0.25s var(--isx-ease);
437
+ }
438
+ .hero-chip:hover .hero-chip-icon {
439
+ transform: scale(1.12);
390
440
  }
391
441
  .hero-chip .chevron {
392
442
  flex: none;
393
443
  color: var(--dsw-label-caption);
394
- transition: transform 120ms var(--ds-ease-in-out);
444
+ transition: transform 220ms var(--isx-ease);
395
445
  }
396
446
  .hero-chip[data-open="true"] .chevron {
397
447
  transform: rotate(180deg);
398
448
  }
399
449
 
400
- /* 描边按钮(dsh Button.outline:胶囊 r18、透明底、0.5px 边) */
450
+ /* 描边按钮(Iconsax .button.border:胶囊 r25、1.5px 边、悬停点亮主前景色、按压 0.92 缩放) */
401
451
  .btn-outline {
402
452
  display: inline-flex;
403
453
  align-items: center;
404
454
  justify-content: center;
405
455
  gap: 6px;
406
456
  height: 36px;
407
- padding: 0 14px;
408
- border-radius: 18px;
409
- border: 0.5px solid var(--dsw-border-l3);
457
+ padding: 0 15px;
458
+ border-radius: 25px;
459
+ border: 1.5px solid var(--dsw-border-l2);
410
460
  background: transparent;
411
461
  color: var(--dsw-label-primary);
412
462
  font-size: 14px;
413
463
  line-height: 22px;
414
- transition: background var(--ds-duration-fast) var(--ds-ease-in-out);
464
+ transition: background 0.25s var(--isx-ease), border-color 0.25s var(--isx-ease),
465
+ transform 0.2s var(--isx-ease), color 0.25s var(--isx-ease);
415
466
  }
416
- .btn-outline:hover {
467
+ .btn-outline:hover:not(:disabled) {
417
468
  background: var(--dsw-hover);
469
+ border-color: var(--dsw-label-primary);
470
+ }
471
+ .btn-outline:active:not(:disabled) {
472
+ transform: scale(0.92);
418
473
  }
419
474
 
420
- /* 主操作实心按钮(表单保存/确认):前景色填充。名称沿用既有调用点。 */
475
+ /* 主操作实心按钮(表单保存/确认):Iconsax 高对比反转胶囊 + 按压弹性缩放 */
421
476
  .btn-primary-white {
422
477
  display: inline-flex;
423
478
  align-items: center;
424
479
  justify-content: center;
425
480
  gap: 6px;
426
481
  height: 36px;
427
- padding: 0 14px;
428
- border-radius: 18px;
482
+ padding: 0 16px;
483
+ border-radius: 25px;
429
484
  background: var(--dsw-label-primary);
430
485
  color: var(--dsw-bg-base);
431
486
  font-size: 14px;
432
487
  font-weight: 500;
433
488
  line-height: 22px;
434
- transition: opacity var(--ds-duration-fast) var(--ds-ease-in-out);
489
+ transition: opacity 0.2s var(--isx-ease), transform 0.22s var(--isx-ease), box-shadow 0.25s var(--isx-ease);
490
+ }
491
+ .btn-primary-white:hover:not(:disabled) {
492
+ transform: translateY(-1px);
493
+ box-shadow: 0 6px 18px rgba(0, 0, 0, 0.22);
494
+ }
495
+ .btn-primary-white:active:not(:disabled) {
496
+ transform: scale(0.92);
435
497
  }
436
498
  .btn-primary-white:disabled {
437
- opacity: 0.5;
499
+ opacity: 0.45;
438
500
  cursor: default;
439
501
  }
440
502
 
441
- /* 侧栏「新会话」(dsh .newSession:h38 r12 elevated 底) */
503
+ /* 侧栏「新会话」(Iconsax .button-gradient:6 色高斯模糊光晕胶囊 + 内核面 + 悬停流光浮现) */
442
504
  .btn-new-session {
505
+ position: relative;
506
+ isolation: isolate;
507
+ overflow: hidden;
443
508
  display: inline-flex;
444
509
  align-items: center;
445
510
  justify-content: center;
446
- gap: 6px;
447
- height: 38px;
448
- padding: 8px 16px;
449
- border-radius: 12px;
450
- border: 0.5px solid var(--dsw-border-l3);
511
+ gap: 7px;
512
+ height: 40px;
513
+ padding: 8px 18px;
514
+ border-radius: 25px;
515
+ border: 1px solid var(--dsw-border-l3);
451
516
  background: var(--dsw-btn-elevated);
452
517
  color: var(--dsw-label-primary);
453
518
  font-size: 14px;
454
519
  font-weight: 500;
455
520
  line-height: 22px;
456
- transition: background var(--ds-duration-fast) var(--ds-ease-in-out);
521
+ transition: transform 0.25s var(--isx-ease), border-color 0.25s var(--isx-ease),
522
+ box-shadow 0.28s var(--isx-ease);
523
+ }
524
+ .btn-new-session::before {
525
+ content: "";
526
+ position: absolute;
527
+ inset: -14px;
528
+ background: var(--isx-aura-gradient);
529
+ filter: blur(12px);
530
+ opacity: 0.52;
531
+ z-index: -2;
532
+ transition: opacity 0.32s var(--isx-ease), transform 0.55s var(--isx-ease);
533
+ pointer-events: none;
534
+ }
535
+ .btn-new-session::after {
536
+ content: "";
537
+ position: absolute;
538
+ inset: 1.5px;
539
+ border-radius: 24px;
540
+ background: var(--dsw-btn-elevated);
541
+ z-index: -1;
542
+ transition: inset 0.25s var(--isx-ease), background 0.25s var(--isx-ease);
543
+ pointer-events: none;
544
+ }
545
+ .btn-new-session svg {
546
+ transition: transform 0.25s var(--isx-ease);
457
547
  }
458
548
  .btn-new-session:hover {
459
- background: var(--dsw-btn-floating-hover);
549
+ border-color: transparent;
550
+ transform: translateY(-1px);
551
+ box-shadow: 0 6px 22px rgba(2, 222, 252, 0.16), 0 4px 18px rgba(252, 1, 151, 0.14);
552
+ }
553
+ .btn-new-session:hover::before {
554
+ opacity: 0.95;
555
+ transform: rotate(24deg) scale(1.08);
556
+ }
557
+ .btn-new-session:hover svg {
558
+ transform: scale(1.15) rotate(90deg);
559
+ }
560
+ .btn-new-session:active {
561
+ transform: scale(0.92);
460
562
  }
461
563
 
462
- /* 设置行右侧下选芯片(dsh「标准模式 ⌄」:胶囊) */
564
+ /* 设置行右侧下选芯片(Iconsax 描边胶囊) */
463
565
  .select-chip {
464
566
  display: inline-flex;
465
567
  align-items: center;
466
568
  gap: 6px;
467
569
  height: 32px;
468
- padding: 0 12px;
469
- border-radius: 16px;
470
- border: 0.5px solid var(--dsw-border-l2);
570
+ padding: 0 13px;
571
+ border-radius: 25px;
572
+ border: 1.5px solid var(--dsw-border-l2);
471
573
  font-size: 13px;
472
574
  color: var(--dsw-label-primary);
473
- transition: background var(--ds-duration-fast) var(--ds-ease-in-out);
575
+ transition: background 0.24s var(--isx-ease), border-color 0.24s var(--isx-ease),
576
+ transform 0.2s var(--isx-ease);
474
577
  }
475
- .select-chip:hover {
578
+ .select-chip:hover:not(:disabled) {
476
579
  background: var(--dsw-hover);
580
+ border-color: var(--dsw-label-primary);
581
+ }
582
+ .select-chip:active:not(:disabled) {
583
+ transform: scale(0.94);
477
584
  }
478
585
 
479
- /* 页签(dsh:蓝色文字 + 蓝色下划线) */
586
+ /* 页签(Iconsax 风格:激活态高对比文字 + 底部发光短横条) */
480
587
  .tab-underline {
481
588
  position: relative;
482
589
  padding: 6px 2px;
483
590
  font-size: 13.5px;
484
591
  color: var(--dsw-label-tertiary);
485
- transition: color var(--ds-duration-fast) var(--ds-ease-in-out);
592
+ transition: color 0.24s var(--isx-ease);
486
593
  }
487
594
  .tab-underline:hover {
488
595
  color: var(--dsw-label-primary);
489
596
  }
490
597
  .tab-underline[data-active="true"] {
491
- color: var(--dsw-accent);
598
+ color: var(--dsw-label-primary);
492
599
  font-weight: 600;
493
600
  }
494
601
  .tab-underline::after {
495
602
  content: "";
496
603
  position: absolute;
497
- left: 0;
498
- right: 0;
604
+ left: 50%;
605
+ width: 0;
499
606
  bottom: -1px;
500
607
  height: 2px;
501
608
  border-radius: 2px;
502
- background: transparent;
609
+ background: var(--dsw-label-primary);
610
+ transform: translateX(-50%);
611
+ transition: width 0.26s var(--isx-ease);
503
612
  }
504
613
  .tab-underline[data-active="true"]::after {
505
- background: var(--dsw-accent);
614
+ width: 100%;
506
615
  }
507
616
 
508
617
  .settings-tab-underline {
509
618
  position: relative;
510
- padding: 6px 2px 10px;
619
+ padding: 6px 4px 10px;
511
620
  font-size: 13.5px;
512
621
  color: var(--dsw-label-tertiary);
513
- transition: color var(--ds-duration-fast) var(--ds-ease-in-out);
622
+ transition: color 0.24s var(--isx-ease), transform 0.2s var(--isx-ease);
514
623
  }
515
624
  .settings-tab-underline:hover {
516
625
  color: var(--dsw-label-primary);
517
626
  }
518
627
  .settings-tab-underline[data-active="true"] {
519
628
  color: var(--dsw-label-primary);
520
- font-weight: 500;
629
+ font-weight: 600;
521
630
  }
522
631
  .settings-tab-underline::after {
523
632
  content: "";
524
633
  position: absolute;
525
- left: 0;
526
- right: 0;
634
+ left: 50%;
635
+ width: 0;
527
636
  bottom: -1px;
528
637
  height: 2px;
529
638
  border-radius: 2px;
530
- background: transparent;
639
+ background: var(--dsw-label-primary);
640
+ transform: translateX(-50%);
641
+ transition: width 0.26s var(--isx-ease);
531
642
  }
532
643
  .settings-tab-underline[data-active="true"]::after {
533
- background: var(--dsw-label-primary);
644
+ width: 22px;
534
645
  }
535
646
  /* 应用外壳占满「实际可见」的高度。100vh 在手机浏览器里是工具栏收起时的大视口:
536
647
  地址栏在底部的浏览器(如手机 Edge)里,最下面的输入框正好被工具栏盖住、页面又不滚动,
@@ -544,10 +655,28 @@ textarea::placeholder {
544
655
  height: 100dvh;
545
656
  }
546
657
  }
547
- /* 右侧抽屉的入口条:未选中项悬停给底色(设置页的同款下划线 tab 没有底色) */
658
+ /* 右侧抽屉的入口条:未选中项悬停给底色,选中项下划线渐变点亮 */
659
+ .drawer-tab {
660
+ transition: background 0.22s var(--isx-ease), color 0.22s var(--isx-ease);
661
+ }
662
+ .drawer-tab svg {
663
+ transition: transform 0.22s var(--isx-ease), color 0.22s var(--isx-ease);
664
+ }
548
665
  .drawer-tab:hover:not([data-active="true"]) {
549
666
  background: var(--dsw-hover);
550
667
  }
668
+ .drawer-tab:hover svg,
669
+ .drawer-tab[data-active="true"] svg {
670
+ transform: scale(1.16);
671
+ color: var(--dsw-label-primary);
672
+ }
673
+ .drawer-tab[data-active="true"]::after {
674
+ background: var(--isx-line-gradient) !important;
675
+ width: 28px !important;
676
+ }
677
+ .drawer-tab:active {
678
+ transform: scale(0.95);
679
+ }
551
680
 
552
681
  .btn-primary-circle {
553
682
  display: inline-flex;
@@ -556,18 +685,26 @@ textarea::placeholder {
556
685
  width: 34px;
557
686
  height: 34px;
558
687
  border-radius: 999px;
559
- background: var(--dsw-accent);
560
- color: #fff;
688
+ background: var(--dsw-label-primary);
689
+ color: var(--dsw-bg-base);
561
690
  transform: translateY(-2px);
562
691
  flex: none;
563
692
  margin-top: -3px;
564
693
  margin-bottom: -3px;
565
- transition: opacity var(--ds-duration-fast) var(--ds-ease-in-out), transform var(--ds-duration-fast)
566
- var(--ds-ease-in-out);
694
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.16);
695
+ transition: opacity 0.2s var(--isx-ease), transform 0.24s var(--isx-ease), box-shadow 0.26s var(--isx-ease);
696
+ }
697
+ .btn-primary-circle:hover:not(:disabled) {
698
+ transform: translateY(-2px) scale(1.07);
699
+ box-shadow: 0 0 16px rgba(2, 222, 252, 0.36), 0 0 22px rgba(252, 1, 151, 0.24);
700
+ }
701
+ .btn-primary-circle:active:not(:disabled) {
702
+ transform: translateY(-2px) scale(0.9);
567
703
  }
568
704
  .btn-primary-circle:disabled {
569
- opacity: 0.4;
705
+ opacity: 0.35;
570
706
  cursor: default;
707
+ box-shadow: none;
571
708
  }
572
709
  /* 运行中有草稿时的幽灵停止钮(发送钮左侧),悬停变警示色 */
573
710
  .btn-ghost-circle {
@@ -578,59 +715,196 @@ textarea::placeholder {
578
715
  height: 30px;
579
716
  border-radius: 999px;
580
717
  color: var(--dsw-label-secondary);
581
- border: 0.5px solid var(--dsw-border-l2);
718
+ border: 1.5px solid var(--dsw-border-l2);
582
719
  background: transparent;
583
720
  transform: translateY(-2px);
584
721
  flex: none;
585
722
  margin-top: -3px;
586
723
  margin-bottom: -3px;
724
+ transition: color 0.22s var(--isx-ease), border-color 0.22s var(--isx-ease), transform 0.2s var(--isx-ease);
587
725
  }
588
726
  .btn-ghost-circle:hover {
589
727
  color: var(--dsw-danger);
590
728
  border-color: var(--dsw-danger);
729
+ transform: translateY(-2px) scale(1.06);
730
+ }
731
+ .btn-ghost-circle:active {
732
+ transform: translateY(-2px) scale(0.9);
733
+ }
734
+
735
+ /* 运行中停止按钮(Iconsax 红色高反差呼吸光晕) */
736
+ .btn-primary-circle.isx-btn-stop,
737
+ .btn-primary-circle[data-streaming="true"] {
738
+ background: rgb(226, 22, 42);
739
+ color: #ffffff;
740
+ box-shadow: 0 0 16px rgba(226, 22, 42, 0.45), 0 0 28px rgba(226, 22, 42, 0.25);
741
+ animation: isx-stop-breathe 2s ease-in-out infinite;
742
+ }
743
+ @keyframes isx-stop-breathe {
744
+ 0%, 100% {
745
+ transform: translateY(-2px) scale(1);
746
+ box-shadow: 0 0 14px rgba(226, 22, 42, 0.4);
747
+ }
748
+ 50% {
749
+ transform: translateY(-2px) scale(1.06);
750
+ box-shadow: 0 0 22px rgba(226, 22, 42, 0.65), 0 0 32px rgba(226, 22, 42, 0.35);
751
+ }
752
+ }
753
+ .btn-primary-circle.isx-btn-stop:hover:not(:disabled),
754
+ .btn-primary-circle[data-streaming="true"]:hover:not(:disabled) {
755
+ background: rgb(240, 30, 52);
756
+ transform: translateY(-2px) scale(1.1);
757
+ box-shadow: 0 0 24px rgba(226, 22, 42, 0.75);
758
+ }
759
+ .btn-ghost-circle.isx-btn-stop {
760
+ color: rgb(226, 22, 42);
761
+ border-color: rgba(226, 22, 42, 0.4);
762
+ background: rgba(226, 22, 42, 0.08);
763
+ transition: all 0.24s var(--isx-ease);
764
+ }
765
+ .btn-ghost-circle.isx-btn-stop:hover {
766
+ color: #ffffff;
767
+ background: rgb(226, 22, 42);
768
+ border-color: rgb(226, 22, 42);
769
+ box-shadow: 0 0 16px rgba(226, 22, 42, 0.55);
591
770
  }
592
771
 
593
- /* 排队中的消息:输入卡上方一列(Claude Code 的 queued messages 位置) */
772
+ /* 排队中的消息:高质感浮动拟态胶囊 dock(Iconsax 拟态卡片 + 呼吸入场) */
594
773
  .pw-queue {
595
774
  display: flex;
596
- flex-direction: column;
597
- gap: 3px;
598
- margin: 0 14px 8px;
775
+ align-items: center;
776
+ justify-content: space-between;
777
+ gap: 12px;
778
+ margin: 0 14px 10px;
779
+ padding: 8px 14px;
780
+ border-radius: 16px;
781
+ background: var(--dsw-bg-elevated);
782
+ border: 1px solid var(--dsw-border-l2);
783
+ box-shadow: 0 4px 18px rgba(0, 0, 0, 0.09);
784
+ backdrop-filter: blur(12px);
599
785
  font-size: 12.5px;
786
+ animation: pw-queue-in 0.22s var(--isx-ease);
787
+ }
788
+ @keyframes pw-queue-in {
789
+ from {
790
+ opacity: 0;
791
+ transform: translateY(6px);
792
+ }
793
+ to {
794
+ opacity: 1;
795
+ transform: translateY(0);
796
+ }
797
+ }
798
+ .pw-queue-list {
799
+ display: flex;
800
+ flex-direction: column;
801
+ gap: 4px;
802
+ min-width: 0;
803
+ flex: 1;
600
804
  }
601
805
  .pw-queue-row {
602
806
  display: flex;
603
807
  align-items: center;
604
808
  gap: 8px;
605
809
  min-width: 0;
606
- color: var(--dsw-label-secondary);
810
+ color: var(--dsw-label-primary);
607
811
  }
608
812
  .pw-queue-tag {
813
+ display: inline-flex;
814
+ align-items: center;
815
+ gap: 4.5px;
609
816
  flex: none;
610
- font-size: 10.5px;
611
- line-height: 16px;
612
- padding: 0 6px;
613
- border-radius: 4px;
817
+ font-size: 11px;
818
+ font-weight: 600;
819
+ line-height: 18px;
820
+ padding: 1px 8px;
821
+ border-radius: 999px;
614
822
  text-transform: capitalize;
615
- color: var(--dsw-label-tertiary);
616
- border: 0.5px solid var(--dsw-border-l2);
823
+ border: 1px solid var(--dsw-border-l2);
824
+ background: var(--dsw-selector);
825
+ color: var(--dsw-label-secondary);
826
+ }
827
+ .pw-queue-tag-steer {
828
+ background: rgba(245, 158, 11, 0.12);
829
+ color: var(--dsw-warn);
830
+ border-color: rgba(245, 158, 11, 0.28);
831
+ }
832
+ .pw-queue-tag-queue {
833
+ background: var(--dsw-accent-soft);
834
+ color: var(--dsw-accent);
835
+ border-color: rgba(65, 118, 230, 0.25);
836
+ }
837
+ .pw-queue-dot {
838
+ width: 5px;
839
+ height: 5px;
840
+ border-radius: 999px;
841
+ background: currentColor;
617
842
  }
618
843
  .pw-queue-text {
619
844
  min-width: 0;
620
845
  overflow: hidden;
621
846
  text-overflow: ellipsis;
622
847
  white-space: nowrap;
848
+ font-size: 13px;
849
+ font-weight: 500;
850
+ color: var(--dsw-label-primary);
623
851
  }
624
852
  .pw-queue-foot {
625
853
  display: flex;
626
- gap: 12px;
627
- margin-top: 1px;
628
- padding-left: 2px;
629
- font-size: 11.5px;
630
- color: var(--dsw-label-caption);
854
+ align-items: center;
855
+ gap: 6px;
856
+ flex: none;
631
857
  }
632
- .pw-queue-foot button:hover {
633
- color: var(--dsw-label-secondary);
858
+ .pw-queue-btn {
859
+ display: inline-flex;
860
+ align-items: center;
861
+ gap: 5px;
862
+ height: 28px;
863
+ padding: 0 11px;
864
+ border-radius: 999px;
865
+ font-size: 12px;
866
+ font-weight: 500;
867
+ cursor: pointer;
868
+ transition: all 0.2s var(--isx-ease);
869
+ }
870
+ .pw-queue-btn-pull {
871
+ background: var(--dsw-hover);
872
+ border: 1px solid var(--dsw-border-l2);
873
+ color: var(--dsw-label-primary);
874
+ }
875
+ .pw-queue-btn-pull:hover {
876
+ background: var(--dsw-label-primary);
877
+ color: var(--dsw-bg-base);
878
+ border-color: var(--dsw-label-primary);
879
+ transform: translateY(-1px);
880
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);
881
+ }
882
+ .pw-queue-kbd {
883
+ display: inline-flex;
884
+ align-items: center;
885
+ justify-content: center;
886
+ width: 16px;
887
+ height: 16px;
888
+ border-radius: 4px;
889
+ background: var(--dsw-selector);
890
+ font-size: 11px;
891
+ font-weight: 700;
892
+ font-family: var(--font-mono);
893
+ line-height: 1;
894
+ }
895
+ .pw-queue-btn-pull:hover .pw-queue-kbd {
896
+ background: rgba(255, 255, 255, 0.2);
897
+ color: inherit;
898
+ }
899
+ .pw-queue-btn-drop {
900
+ background: transparent;
901
+ border: 1px solid transparent;
902
+ color: var(--dsw-label-tertiary);
903
+ }
904
+ .pw-queue-btn-drop:hover {
905
+ background: rgba(239, 68, 68, 0.1);
906
+ color: var(--dsw-danger);
907
+ border-color: rgba(239, 68, 68, 0.2);
634
908
  }
635
909
  /* 运行中输入卡下方的按键提示 */
636
910
  .pw-busy-hint {
@@ -641,1528 +915,263 @@ textarea::placeholder {
641
915
  }
642
916
 
643
917
  .hairline-t {
644
- border-top: 0.5px solid var(--dsw-border-l2);
918
+ border-top: 1px solid var(--dsw-border-l2);
645
919
  }
646
920
  .hairline-b {
647
- border-bottom: 0.5px solid var(--dsw-border-l2);
921
+ border-bottom: 1px solid var(--dsw-border-l2);
648
922
  }
649
923
  .hairline-r {
650
- border-right: 0.5px solid var(--dsw-border-l2);
924
+ border-right: 1px solid var(--dsw-border-l2);
651
925
  }
652
926
 
653
- /* 侧栏收起导轨按钮(dsh rail:36×36 控件盒、12px 圆角) */
927
+ /* 侧栏收起导轨按钮(Iconsax .con-menu-mini:38×38 描边圆角方盒,悬停点亮主前景色边框 + 图标放大) */
654
928
  .rail-btn {
655
929
  display: inline-flex;
656
930
  align-items: center;
657
931
  justify-content: center;
658
- width: 36px;
659
- height: 36px;
660
- border-radius: 12px;
932
+ width: 38px;
933
+ height: 38px;
934
+ border-radius: 14px;
935
+ border: 1px solid var(--dsw-border-l2);
936
+ background: var(--dsw-bg-elevated);
661
937
  color: var(--dsw-label-secondary);
662
- transition: background var(--ds-duration-fast) var(--ds-ease-in-out), color var(--ds-duration-fast)
663
- var(--ds-ease-in-out);
938
+ transition: background 0.25s var(--isx-ease), color 0.25s var(--isx-ease),
939
+ border-color 0.25s var(--isx-ease), transform 0.22s var(--isx-ease);
940
+ }
941
+ .rail-btn svg {
942
+ transition: transform 0.25s var(--isx-ease);
664
943
  }
665
944
  .rail-btn:hover {
666
945
  background: var(--dsw-hover);
946
+ border-color: var(--dsw-label-primary);
667
947
  color: var(--dsw-label-primary);
948
+ transform: translateY(-1px);
949
+ }
950
+ .rail-btn:hover svg {
951
+ transform: scale(1.16);
952
+ }
953
+ .rail-btn:active {
954
+ transform: scale(0.9);
668
955
  }
669
956
 
670
- /* 状态点(对齐 dsh StateDot) */
671
- .state-dot {
957
+ /* ============================================================
958
+ Iconsax 标志性交互组件类(.isx-menu-item / .isx-search / .isx-composer / .isx-card)
959
+ ============================================================ */
960
+
961
+ /* 1. 菜单与会话列表项(Iconsax .menu-item-big:悬停/选中整行黑白反转填充 + 文字右移 4px + 图标放大 1.18x + 右侧 2×14 竖条) */
962
+ .isx-menu-item {
672
963
  position: relative;
673
- width: 8px;
674
- height: 8px;
675
- border-radius: 999px;
676
- flex: none;
964
+ border-radius: 12px;
965
+ transition: background 0.24s var(--isx-ease), color 0.24s var(--isx-ease),
966
+ padding-left 0.24s var(--isx-ease), transform 0.2s var(--isx-ease);
677
967
  }
678
- .state-dot.running {
679
- background: var(--dsw-deepseek-450);
680
- animation: dot-breathe 1s ease-in-out infinite;
968
+ .isx-menu-item::after {
969
+ content: "";
970
+ position: absolute;
971
+ right: 7px;
972
+ top: 50%;
973
+ width: 2px;
974
+ height: 0;
975
+ border-radius: 5px;
976
+ background: var(--dsw-bg-base);
977
+ transform: translateY(-50%);
978
+ opacity: 0;
979
+ transition: height 0.24s var(--isx-ease), opacity 0.24s var(--isx-ease);
980
+ pointer-events: none;
681
981
  }
682
- .state-dot.pending {
683
- background: var(--dsw-warn);
684
- box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.1);
982
+ .isx-menu-item > svg,
983
+ .isx-menu-item .isx-menu-icon {
984
+ transition: transform 0.24s var(--isx-ease), color 0.24s var(--isx-ease);
685
985
  }
686
- .state-dot.done {
687
- background: var(--dsw-success);
986
+ .isx-menu-item .isx-menu-shift {
987
+ transition: transform 0.24s var(--isx-ease);
688
988
  }
689
- @keyframes dot-breathe {
690
- 0%,
691
- 100% {
692
- opacity: 1;
693
- }
694
- 50% {
695
- opacity: 0.45;
696
- }
989
+ .isx-menu-item:hover:not(:disabled):not([data-no-invert="true"]),
990
+ .isx-menu-item[data-active="true"] {
991
+ background: var(--dsw-label-primary) !important;
992
+ color: var(--dsw-bg-base) !important;
697
993
  }
698
-
699
- /* 下拉/浮层(玻璃态:半透明层色 + backdrop blur + 发丝线) */
700
- .popover {
701
- background: var(--dsw-glass-popover);
702
- padding: 6px;
703
- border-radius: 16px;
704
- box-shadow: var(--dsw-elevation-prominent);
705
- border: 0.5px solid var(--dsw-border-l1);
706
- overflow: hidden;
994
+ .isx-menu-item:hover:not(:disabled):not([data-no-invert="true"]) > svg,
995
+ .isx-menu-item:hover:not(:disabled):not([data-no-invert="true"]) .isx-menu-icon,
996
+ .isx-menu-item[data-active="true"] > svg,
997
+ .isx-menu-item[data-active="true"] .isx-menu-icon {
998
+ transform: scale(1.18);
999
+ color: var(--dsw-bg-base) !important;
707
1000
  }
708
-
709
- /* 居中遮罩层(dsh Modal.mask:遮罩色 + blur) */
710
- .modal-mask {
711
- background: var(--dsw-mask);
712
- backdrop-filter: var(--dsw-mask-blur);
713
- -webkit-backdrop-filter: var(--dsw-mask-blur);
1001
+ .isx-menu-item:hover:not(:disabled):not([data-no-invert="true"]) .isx-menu-shift,
1002
+ .isx-menu-item[data-active="true"] .isx-menu-shift {
1003
+ transform: translateX(4px);
714
1004
  }
715
-
716
- /* 玻璃卡(设置弹窗) */
717
- .glass-modal {
718
- background: var(--dsw-glass-modal);
1005
+ .isx-menu-item:hover:not(:disabled):not([data-no-invert="true"]) .isx-menu-sub,
1006
+ .isx-menu-item[data-active="true"] .isx-menu-sub {
1007
+ color: var(--dsw-bg-base) !important;
1008
+ opacity: 0.72;
719
1009
  }
720
-
721
- /* markdown 内容(字号独立可调:对话字体设置驱动,缺省跟界面字体) */
722
- .md {
723
- min-width: 0;
724
- overflow-wrap: break-word;
725
- font-size: var(--piweb-chat-font-size);
726
- line-height: 1.65;
1010
+ .isx-menu-item:hover:not(:disabled):not([data-no-invert="true"])::after,
1011
+ .isx-menu-item[data-active="true"]::after {
1012
+ height: 14px;
1013
+ opacity: 1;
727
1014
  }
728
- .md > *:first-child {
729
- margin-top: 0;
730
- }
731
- .md > *:last-child {
732
- margin-bottom: 0;
733
- }
734
- .md p {
735
- margin: 0.5em 0;
736
- }
737
- .md h1,
738
- .md h2,
739
- .md h3,
740
- .md h4 {
741
- margin: 1em 0 0.4em;
742
- font-weight: 600;
743
- line-height: 1.35;
744
- }
745
- .md h1 {
746
- font-size: 1.35em;
747
- }
748
- .md h2 {
749
- font-size: 1.22em;
750
- }
751
- .md h3 {
752
- font-size: 1.1em;
753
- }
754
- .md ul,
755
- .md ol {
756
- margin: 0.5em 0;
757
- padding-left: 1.5em;
758
- }
759
- .md li {
760
- margin: 0.2em 0;
761
- }
762
- .md a {
763
- color: var(--dsw-accent);
764
- text-decoration: none;
765
- }
766
- .md a:hover {
767
- text-decoration: underline;
768
- }
769
- .md blockquote {
770
- margin: 0.6em 0;
771
- padding: 0.1em 0 0.1em 0.9em;
772
- border-left: 3px solid var(--dsw-border-l3);
773
- color: var(--dsw-label-secondary);
774
- }
775
- .md code {
776
- font-family: var(--font-mono);
777
- font-size: 0.9em;
778
- background: var(--dsw-selector);
779
- border-radius: 5px;
780
- padding: 0.1em 0.35em;
781
- }
782
- .md pre {
783
- margin: 0.7em 0;
784
- padding: 12px 14px;
785
- border-radius: 12px;
786
- background: var(--dsw-selector);
787
- overflow-x: auto;
788
- border: 0.5px solid var(--dsw-border-l1);
789
- }
790
- .md pre code {
791
- background: none;
792
- padding: 0;
793
- font-size: 13px;
794
- line-height: 1.55;
795
- }
796
- .md-code-block {
797
- position: relative;
798
- }
799
- .md-code-copy {
800
- position: absolute;
801
- top: 12px;
802
- right: 12px;
803
- z-index: 1;
804
- }
805
- .md-code-block pre {
806
- padding-top: 40px;
807
- }
808
- .md table {
809
- border-collapse: collapse;
810
- margin: 0.7em 0;
811
- width: 100%;
812
- font-size: 0.95em;
813
- }
814
- .md th,
815
- .md td {
816
- border: 0.5px solid var(--dsw-border-l2);
817
- padding: 5px 10px;
818
- text-align: left;
819
- }
820
- .md th {
821
- background: var(--dsw-hover);
822
- }
823
- .md hr {
824
- border: none;
825
- border-top: 0.5px solid var(--dsw-border-l2);
826
- margin: 1em 0;
827
- }
828
-
829
- /* ---------- 流式正文:稳定块 + 未闭合代码围栏的纯文本尾巴共用一个 .md 容器 ---------- */
830
- .pw-stream {
831
- display: flow-root;
832
- }
833
- /* 打字光标模式下尾巴外面包了一层:包层不能改变原有排版,
834
- .md > *:first-child/:last-child 的边距归零要透传到最后那个内容元素上 */
835
- .pw-stream > .pw-stream-tail:first-child > :first-child {
836
- margin-top: 0;
837
- }
838
- .pw-stream > .pw-stream-tail:last-child > :last-child {
839
- margin-bottom: 0;
840
- }
841
- /* 渐显样式:只让尾巴里新出现的元素柔和淡入。
842
- 动画若挂在容器全部直接子级上,块升级(段落从尾巴进入稳定块)会重建 DOM,
843
- 已经显示过的内容就把入场动画重播一遍——那正是输出时「闪烁几下」的来源;
844
- 收窄到 .pw-stream-tail 内部后,升级进来的块不再带动画,视觉无缝。 */
845
- .pw-stream[data-stream-style="fade"] .pw-stream-tail > * {
846
- animation: pw-stream-enter 240ms ease-out both;
847
- }
848
- @keyframes pw-stream-enter {
849
- from {
850
- opacity: 0;
851
- transform: translateY(2px);
852
- }
853
- to {
854
- opacity: 1;
855
- transform: none;
856
- }
857
- }
858
-
859
- /* 打字光标:挂在尾巴最后一个元素的行内末尾(不会另起一行)。
860
- 代码块和列表是块级容器,挂在外层会落到下一行,改挂到代码文字 / 最后一项的末尾 */
861
- .pw-stream-caret .pw-stream-tail > :last-child:not(.md-code-block, ul, ol)::after,
862
- .pw-stream-caret .pw-stream-tail > .md-code-block:last-child code::after,
863
- .pw-stream-caret .pw-stream-tail > :is(ul, ol):last-child > li:last-child::after {
864
- content: "";
865
- display: inline-block;
866
- width: 2px;
867
- height: 1.05em;
868
- margin-left: 2px;
869
- vertical-align: -0.18em;
870
- border-radius: 1px;
871
- background: var(--dsw-accent);
872
- animation: pw-stream-caret 1.1s steps(2, start) infinite;
873
- }
874
- @keyframes pw-stream-caret {
875
- 50% {
876
- opacity: 0;
877
- }
878
- }
879
-
880
- @media (prefers-reduced-motion: reduce) {
881
- .pw-stream[data-stream-style="fade"] .pw-stream-tail > * {
882
- animation: none;
883
- }
884
- .pw-stream-caret .pw-stream-tail > :last-child:not(.md-code-block, ul, ol)::after,
885
- .pw-stream-caret .pw-stream-tail > .md-code-block:last-child code::after,
886
- .pw-stream-caret .pw-stream-tail > :is(ul, ol):last-child > li:last-child::after {
887
- animation: none;
888
- }
889
- }
890
-
891
- /* ---------- 代码高亮(highlight.js):VS Code 式的分类着色,配色跟 Pi 自己的主题走 ---------- */
892
- :root {
893
- --hl-comment: rgb(130, 136, 146);
894
- --hl-keyword: rgb(160, 70, 200);
895
- --hl-string: rgb(30, 130, 90);
896
- --hl-number: rgb(190, 100, 20);
897
- --hl-func: rgb(55, 100, 220);
898
- --hl-type: rgb(20, 130, 150);
899
- --hl-attr: rgb(140, 90, 30);
900
- --hl-tag: rgb(200, 50, 90);
901
- --hl-regex: rgb(200, 60, 40);
902
- --hl-meta: rgb(120, 110, 40);
903
- --hl-punct: var(--dsw-label-tertiary);
904
- --hl-variable: rgb(30, 100, 170);
905
- }
906
- html[data-ds-dark-theme],
907
- body[data-ds-dark-theme] {
908
- --hl-comment: rgb(120, 128, 140);
909
- --hl-keyword: rgb(200, 150, 255);
910
- --hl-string: rgb(150, 210, 165);
911
- --hl-number: rgb(240, 175, 110);
912
- --hl-func: rgb(140, 185, 255);
913
- --hl-type: rgb(100, 200, 210);
914
- --hl-attr: rgb(220, 195, 130);
915
- --hl-tag: rgb(240, 130, 150);
916
- --hl-regex: rgb(235, 130, 110);
917
- --hl-meta: rgb(200, 190, 120);
918
- --hl-punct: var(--dsw-label-tertiary);
919
- --hl-variable: rgb(150, 200, 250);
920
- }
921
- .hljs {
922
- color: var(--dsw-label-secondary);
923
- }
924
- .hljs-comment,
925
- .hljs-quote {
926
- color: var(--hl-comment);
927
- font-style: italic;
928
- }
929
- .hljs-keyword,
930
- .hljs-selector-tag,
931
- .hljs-literal,
932
- .hljs-doctag,
933
- .hljs-section,
934
- .hljs-strong {
935
- color: var(--hl-keyword);
936
- }
937
- .hljs-strong {
938
- font-weight: 600;
939
- }
940
- .hljs-string,
941
- .hljs-addition,
942
- .hljs-symbol,
943
- .hljs-bullet,
944
- .hljs-link {
945
- color: var(--hl-string);
946
- }
947
- .hljs-number,
948
- .hljs-template-variable,
949
- .hljs-selector-class,
950
- .hljs-selector-id,
951
- .hljs-selector-pseudo {
952
- color: var(--hl-number);
953
- }
954
- .hljs-title,
955
- .hljs-title.function_,
956
- .hljs-title.class_,
957
- .hljs-title.class_.inherited__,
958
- .hljs-name,
959
- .hljs-code {
960
- color: var(--hl-func);
961
- }
962
- .hljs-type,
963
- .hljs-built_in,
964
- .hljs-builtin-name,
965
- .hljs-class .hljs-title {
966
- color: var(--hl-type);
967
- }
968
- .hljs-attr,
969
- .hljs-attribute,
970
- .hljs-property {
971
- color: var(--hl-attr);
972
- }
973
- .hljs-tag,
974
- .hljs-selector-attr,
975
- .hljs-deletion {
976
- color: var(--hl-tag);
977
- }
978
- .hljs-regexp,
979
- .hljs-subst,
980
- .hljs-char.escape_ {
981
- color: var(--hl-regex);
982
- }
983
- .hljs-meta,
984
- .hljs-meta .hljs-keyword,
985
- .hljs-meta .hljs-string,
986
- .hljs-formula {
987
- color: var(--hl-meta);
988
- }
989
- .hljs-variable,
990
- .hljs-variable.language_,
991
- .hljs-params,
992
- .hljs-operator {
993
- color: var(--hl-variable);
994
- }
995
- .hljs-punctuation {
996
- color: var(--hl-punct);
997
- }
998
- .hljs-emphasis {
999
- font-style: italic;
1000
- }
1001
- .hljs-deletion {
1002
- background: none;
1003
- }
1004
- .hljs-addition {
1005
- background: none;
1006
- }
1007
-
1008
- /* 消息气泡 */
1009
- .msg-user-bubble {
1010
- background: var(--dsw-input-major);
1011
- border-radius: 18px;
1012
- padding: 10px 16px;
1013
- display: inline-block;
1014
- max-width: 85%;
1015
- font-size: var(--piweb-chat-font-size);
1016
- line-height: 1.65;
1017
- }
1018
-
1019
- /* 消息操作图标行:常显低透明度,悬停变亮(dsh 同款) */
1020
- .msg-actions {
1021
- display: flex;
1022
- align-items: center;
1023
- gap: 6px;
1024
- margin-top: 6px;
1025
- opacity: 0.45;
1026
- transition: opacity var(--ds-duration-fast) var(--ds-ease-in-out);
1027
- }
1028
- .msg-actions:hover {
1029
- opacity: 1;
1030
- }
1031
-
1032
- /* 操作行时钟(dsh MessageIconActions timeStart/timeEnd):
1033
- 次级字号 + 三级标签色;用户行时钟在图标左侧留 12px 间距 */
1034
- .msg-clock {
1035
- font-size: var(--dsh-content-font-size-secondary, 13px);
1036
- line-height: calc(24px + var(--dsh-content-font-delta, 0px));
1037
- color: var(--dsw-label-tertiary);
1038
- }
1039
- .msg-clock-start {
1040
- padding-right: 12px;
1041
- }
1042
-
1043
- /* ============================================================
1044
- 对话过程(Pi 版)
1045
- 叙述句 = 阶段标题(基线对齐,主色);其下是「小图标 + 一行摘要」的步骤列表;
1046
- 进行中的思考 / 命令用闪光渐变的英文状态词;回合结束后思考与命令折成一行摘要;
1047
- 编辑文件保留 diff;末尾 π 记号做工作指示。没有连线。
1048
- ============================================================ */
1049
- :root {
1050
- --pw-danger-soft: rgba(236, 19, 19, 0.12);
1051
- /* 闪光高光:浅色主题下比强调色更亮更淡,深色主题下接近白 */
1052
- --pw-shimmer-hi: rgb(150, 190, 255);
1053
- }
1054
- html[data-ds-dark-theme],
1055
- body[data-ds-dark-theme] {
1056
- --pw-danger-soft: rgba(242, 90, 90, 0.16);
1057
- --pw-shimmer-hi: rgb(225, 236, 255);
1058
- }
1059
-
1060
- .pw-turn {
1061
- display: flex;
1062
- flex-direction: column;
1063
- gap: 1px;
1064
- padding: 6px 0 2px;
1065
- }
1066
- .pw-run {
1067
- display: flex;
1068
- flex-direction: column;
1069
- gap: 1px;
1070
- }
1071
-
1072
- /* 步骤:左侧 16px 图标列 + 内容 */
1073
- .pw-step {
1074
- display: flex;
1075
- align-items: flex-start;
1076
- gap: 10px;
1077
- min-height: 26px;
1078
- animation: pw-in 160ms var(--ds-ease-in-out, ease-out) both;
1079
- }
1080
- @keyframes pw-in {
1081
- from {
1082
- opacity: 0;
1083
- transform: translateY(2px);
1084
- }
1085
- to {
1086
- opacity: 1;
1087
- transform: none;
1088
- }
1089
- }
1090
- .pw-icon {
1091
- flex: none;
1092
- width: 16px;
1093
- height: 26px;
1094
- display: inline-flex;
1095
- align-items: center;
1096
- justify-content: center;
1097
- color: var(--dsw-label-caption);
1098
- }
1099
- .pw-step[data-tone="live"] .pw-icon {
1100
- color: var(--dsw-accent);
1101
- animation: dot-breathe 1.4s ease-in-out infinite;
1102
- }
1103
- .pw-step[data-tone="fail"] .pw-icon {
1104
- color: var(--dsw-danger);
1105
- }
1106
- .pw-step[data-tone="warn"] .pw-icon {
1107
- color: var(--dsw-warn);
1108
- }
1109
- .pw-step[data-kind="retry"] .pw-icon {
1110
- animation: pw-rotate 1.2s linear infinite;
1111
- }
1112
- @keyframes pw-rotate {
1113
- to {
1114
- transform: rotate(360deg);
1115
- }
1116
- }
1117
- /* π 记号:工作指示的图标 */
1118
- .pw-pi {
1119
- font-family: var(--font-mono);
1120
- font-size: 15px;
1121
- font-weight: 600;
1122
- line-height: 1;
1123
- transform: translateY(-1px);
1124
- color: var(--dsw-accent);
1125
- }
1126
- .pw-body {
1127
- min-width: 0;
1128
- flex: 1;
1129
- }
1130
-
1131
- /* 一行摘要 */
1132
- .pw-line {
1133
- display: flex;
1134
- align-items: center;
1135
- gap: 6px;
1136
- min-height: 26px;
1137
- line-height: 26px;
1138
- font-size: var(--piweb-chat-font-m);
1139
- color: var(--dsw-label-tertiary);
1140
- }
1141
- button.pw-line {
1142
- width: 100%;
1143
- text-align: left;
1144
- background: none;
1145
- border: 0;
1146
- padding: 0;
1147
- cursor: pointer;
1148
- font: inherit;
1149
- font-size: var(--piweb-chat-font-m);
1150
- }
1151
- button.pw-line:hover {
1152
- color: var(--dsw-label-secondary);
1153
- }
1154
- .pw-verb {
1155
- flex: none;
1156
- }
1157
- .pw-verb[data-failed="true"] {
1158
- color: var(--dsw-danger);
1159
- }
1160
- .pw-arg {
1161
- min-width: 0;
1162
- flex: 0 1 auto;
1163
- overflow: hidden;
1164
- text-overflow: ellipsis;
1165
- white-space: nowrap;
1166
- font-family: var(--font-mono);
1167
- font-size: var(--piweb-chat-font-s);
1168
- color: var(--dsw-label-secondary);
1169
- }
1170
- .pw-gist {
1171
- min-width: 0;
1172
- flex: 1;
1173
- overflow: hidden;
1174
- text-overflow: ellipsis;
1175
- white-space: nowrap;
1176
- }
1177
- .pw-meta {
1178
- flex: none;
1179
- font-size: var(--piweb-chat-font-t);
1180
- color: var(--dsw-label-caption);
1181
- white-space: nowrap;
1182
- }
1183
- .pw-line .pw-chev {
1184
- flex: none;
1185
- color: var(--dsw-label-caption);
1186
- transition: transform 120ms var(--ds-ease-in-out, ease);
1187
- }
1188
- .pw-line[aria-expanded="true"] .pw-chev {
1189
- transform: rotate(90deg);
1190
- }
1191
- .pw-summary strong {
1192
- font-weight: 600;
1193
- color: var(--dsw-label-secondary);
1194
- }
1195
- .pw-run[data-open] > .pw-step:not(:first-child) {
1196
- margin-left: 4px;
1197
- }
1198
-
1199
- /* 闪光渐变(进行中的思考 / 命令 / 状态词) */
1200
- .pw-shimmer {
1201
- flex: none;
1202
- /* DeepSeek 式的蓝色渐变闪光:强调色为底,高光扫过 */
1203
- background: linear-gradient(90deg, var(--dsw-accent) 0%, var(--pw-shimmer-hi) 35%, var(--dsw-accent) 70%);
1204
- background-size: 220% 100%;
1205
- -webkit-background-clip: text;
1206
- background-clip: text;
1207
- color: transparent;
1208
- animation: pw-shimmer 2.2s linear infinite;
1209
- }
1210
- @keyframes pw-shimmer {
1211
- from {
1212
- background-position: 120% 0;
1213
- }
1214
- to {
1215
- background-position: -100% 0;
1216
- }
1217
- }
1218
-
1219
- /* 进行中的思考尾巴:两行截断 */
1220
- .pw-tail {
1221
- margin: -4px 0 5px;
1222
- font-size: var(--piweb-chat-font-s);
1223
- line-height: 1.5;
1224
- color: var(--dsw-label-caption);
1225
- word-break: break-word;
1226
- display: -webkit-box;
1227
- -webkit-line-clamp: 2;
1228
- -webkit-box-orient: vertical;
1229
- overflow: hidden;
1230
- }
1231
-
1232
- /* ⎿ 结果预览 */
1233
- .pw-result {
1234
- display: flex;
1235
- align-items: flex-start;
1236
- gap: 6px;
1237
- margin: -4px 0 5px;
1238
- font-family: var(--font-mono);
1239
- font-size: var(--piweb-chat-font-t);
1240
- line-height: 1.55;
1241
- color: var(--dsw-label-tertiary);
1242
- }
1243
- .pw-result[role="button"] {
1244
- cursor: pointer;
1245
- }
1246
- .pw-rail {
1247
- flex: none;
1248
- width: 14px;
1249
- text-align: center;
1250
- color: var(--dsw-label-caption);
1251
- user-select: none;
1252
- }
1253
- .pw-lines {
1254
- min-width: 0;
1255
- flex: 1;
1256
- white-space: pre-wrap;
1257
- word-break: break-word;
1258
- }
1259
- .pw-lines > div {
1260
- overflow: hidden;
1261
- text-overflow: ellipsis;
1262
- white-space: pre;
1263
- }
1264
- .pw-lines .pw-head {
1265
- color: var(--dsw-label-tertiary);
1266
- }
1267
- .pw-lines .pw-more {
1268
- color: var(--dsw-label-caption);
1269
- }
1270
- .pw-result[role="button"]:hover .pw-more {
1271
- text-decoration: underline;
1272
- }
1273
- .pw-result[data-failed="true"],
1274
- .pw-result[data-failed="true"] .pw-rail,
1275
- .pw-result[data-failed="true"] .pw-head {
1276
- color: var(--dsw-danger);
1277
- }
1278
-
1279
- /* diff 与完整输出 */
1280
- .pw-diff {
1281
- margin: -2px 0 6px 20px;
1282
- max-height: 420px;
1283
- overflow: auto;
1284
- border-radius: 10px;
1285
- padding: 6px 8px;
1286
- background: var(--dsw-markdown-code-block, var(--dsw-hover));
1287
- }
1288
- .pw-output {
1289
- margin: 0 0 6px 20px;
1290
- max-height: 360px;
1291
- overflow: auto;
1292
- border-radius: 10px;
1293
- padding: 8px 12px;
1294
- background: var(--dsw-markdown-code-block, var(--dsw-hover));
1295
- font-family: var(--font-mono);
1296
- font-size: var(--piweb-chat-font-t);
1297
- line-height: 1.55;
1298
- color: var(--dsw-label-secondary);
1299
- white-space: pre-wrap;
1300
- word-break: break-word;
1301
- }
1302
- .pw-output.pw-think-full {
1303
- font-family: inherit;
1304
- color: var(--dsw-label-tertiary);
1305
- }
1306
- .pw-output .cmdline {
1307
- color: var(--dsw-label-tertiary);
1308
- margin-bottom: 6px;
1309
- padding-bottom: 6px;
1310
- border-bottom: 0.5px solid var(--dsw-border-l2);
1311
- white-space: pre-wrap;
1312
- word-break: break-all;
1313
- }
1314
- .pw-output .cmdline::before {
1315
- content: "$ ";
1316
- color: var(--dsw-label-caption);
1317
- }
1318
- button.pw-more {
1319
- display: block;
1320
- margin-top: 4px;
1321
- font: inherit;
1322
- font-family: var(--font-mono);
1323
- font-size: var(--piweb-chat-font-t);
1324
- color: var(--dsw-label-caption);
1325
- cursor: pointer;
1326
- background: none;
1327
- border: 0;
1328
- padding: 0;
1329
- text-align: left;
1330
- }
1331
- button.pw-more:hover {
1332
- color: var(--dsw-label-secondary);
1333
- text-decoration: underline;
1334
- }
1335
-
1336
- /* 叙述:阶段标题,基线对齐(步骤的图标列自然形成缩进) */
1337
- .pw-narr {
1338
- margin: 7px 0 3px;
1339
- font-size: var(--piweb-chat-font-l);
1340
- line-height: 1.65;
1341
- color: var(--dsw-label-primary);
1342
- }
1343
- .pw-turn > .pw-narr:first-child {
1344
- margin-top: 1px;
1345
- }
1346
- .pw-narr[data-error="true"] {
1347
- color: var(--dsw-danger);
1348
- }
1349
- .pw-narr .md p {
1350
- margin: 0;
1351
- }
1352
- .pw-narr .md p + p {
1353
- margin-top: 0.5em;
1354
- }
1355
- .pw-narr .md pre {
1356
- margin: 0.5em 0;
1357
- }
1358
-
1359
- /* 错误 / 中止 / 上下文注入 */
1360
- .pw-warn-text {
1361
- min-width: 0;
1362
- flex: 1;
1363
- overflow: hidden;
1364
- text-overflow: ellipsis;
1365
- white-space: nowrap;
1366
- color: var(--dsw-warn);
1367
- }
1368
- .pw-step[data-kind="context"] .pw-line,
1369
- .pw-step[data-kind="abort"] .pw-line {
1370
- color: var(--dsw-label-caption);
1371
- font-size: var(--piweb-chat-font-s);
1372
- }
1373
-
1374
- /* ============================================================
1375
- Pebrel 主题(https://github.com/Kuddev/pebrel)
1376
- 四对亮暗主题 + Pebrel 原生深色(亮色回落 SilverLight)。
1377
- 每对内亮/暗跟随系统(data-ds-dark-theme 由 theme.ts 同步)。
1378
- 注意:本段必须位于文件末尾,靠源顺序赢得与旧 dsh 暗色块的平级覆盖。
1379
- ============================================================ */
1380
-
1381
- /* ---------- 亮色:Pebrel 通用浅色基 ---------- */
1382
- html[data-pebrel-theme],
1383
- body[data-pebrel-theme] {
1384
- --dsw-bg-base: #ffffff;
1385
- --dsw-bg-elevated: #ffffff;
1386
- --dsw-input-major: #ffffff;
1387
- --dsw-bubble: rgba(100, 116, 139, 0.05);
1388
- --dsw-hover: rgba(100, 116, 139, 0.13);
1389
- --dsw-active: rgba(100, 116, 139, 0.2);
1390
- --dsw-label-primary: #334155;
1391
- --dsw-label-secondary: #64748b;
1392
- --dsw-label-tertiary: #94a3b8;
1393
- --dsw-label-caption: #a3adbb;
1394
- --dsw-border-l1: rgba(51, 65, 85, 0.08);
1395
- --dsw-border-l2: rgba(51, 65, 85, 0.12);
1396
- --dsw-border-l3: rgba(51, 65, 85, 0.16);
1397
- --dsw-border-l4: rgba(51, 65, 85, 0.24);
1398
- --dsw-warn: #d97706;
1399
- --dsw-success: #548c9e;
1400
- --dsw-danger: #b23a48;
1401
- --dsw-selector: rgba(100, 116, 139, 0.08);
1402
- --dsw-layer-2: #ffffff;
1403
- --dsw-layer-3: #f5f5f6;
1404
- --dsw-btn-elevated: #ffffff;
1405
- --dsw-btn-floating-hover: rgba(100, 116, 139, 0.13);
1406
- --dsw-module-platform: #f5f5f6;
1407
- --dsw-border-strong: #64748b;
1408
- --dsw-glass-popover: #ffffff;
1409
- --dsw-glass-input: #ffffff;
1410
- --dsw-glass-modal: #ffffff;
1411
- --dsw-mask: rgba(15, 23, 42, 0.22);
1412
- --dsw-elevation-stroke: var(--dsw-border-l2);
1413
- }
1414
-
1415
- /* 银钢(SilverLight;Pebrel 亮色回落同此) */
1416
- html[data-pebrel-theme="silver-steel"],
1417
- html[data-pebrel-theme="pebrel"],
1418
- body[data-pebrel-theme="silver-steel"],
1419
- body[data-pebrel-theme="pebrel"] {
1420
- --dsw-sidebar-fill: #f3f4f6;
1421
- --dsw-accent: rgb(73, 80, 87);
1422
- --dsw-accent-soft: rgba(73, 80, 87, 0.12);
1423
- }
1424
-
1425
- /* 石灰(LimestoneLight) */
1426
- html[data-pebrel-theme="limestone-coal"],
1427
- body[data-pebrel-theme="limestone-coal"] {
1428
- --dsw-sidebar-fill: #f0efeb;
1429
- --dsw-layer-3: #f0efeb;
1430
- --dsw-module-platform: #f0efeb;
1431
- --dsw-accent: rgb(88, 85, 76);
1432
- --dsw-accent-soft: rgba(88, 85, 76, 0.12);
1433
- }
1434
-
1435
- /* 亚麻(LinenLight) */
1436
- html[data-pebrel-theme="linen-moss"],
1437
- body[data-pebrel-theme="linen-moss"] {
1438
- --dsw-sidebar-fill: #f2f2ec;
1439
- --dsw-layer-3: #f2f2ec;
1440
- --dsw-module-platform: #f2f2ec;
1441
- --dsw-accent: rgb(95, 99, 95);
1442
- --dsw-accent-soft: rgba(95, 99, 95, 0.12);
1443
- }
1444
-
1445
- /* 纸墨(Paper,完整浅色皮肤) */
1446
- html[data-pebrel-theme="nord-paper"],
1447
- body[data-pebrel-theme="nord-paper"] {
1448
- --dsw-bg-base: #fcfbf9;
1449
- --dsw-bg-elevated: #f5f4f0;
1450
- --dsw-sidebar-fill: #f5f4f0;
1451
- --dsw-input-major: #fcfbf9;
1452
- --dsw-bubble: rgba(140, 138, 128, 0.08);
1453
- --dsw-hover: #ebeae5;
1454
- --dsw-active: rgba(43, 90, 56, 0.18);
1455
- --dsw-label-primary: #1a1a1a;
1456
- --dsw-label-secondary: #474646;
1457
- --dsw-label-tertiary: #8c8a80;
1458
- --dsw-label-caption: #a8a49a;
1459
- --dsw-border-l1: #eceae4;
1460
- --dsw-border-l2: #e0dfd5;
1461
- --dsw-border-l3: #d5d3c9;
1462
- --dsw-border-l4: #c1beb5;
1463
- --dsw-accent: #2b5a38;
1464
- --dsw-accent-soft: rgba(43, 90, 56, 0.18);
1465
- --dsw-warn: #a85a20;
1466
- --dsw-success: #2b5a38;
1467
- --dsw-danger: #a33a3a;
1468
- --dsw-selector: #ebeae5;
1469
- --dsw-layer-2: #fcfbf9;
1470
- --dsw-layer-3: #f5f4f0;
1471
- --dsw-btn-elevated: #fcfbf9;
1472
- --dsw-btn-floating-hover: #ebeae5;
1473
- --dsw-module-platform: #f0efe9;
1474
- --dsw-border-strong: #8c8a80;
1475
- --dsw-glass-popover: #fcfbf9;
1476
- --dsw-glass-input: #fcfbf9;
1477
- --dsw-glass-modal: #f5f4f0;
1478
- --dsw-mask: rgba(26, 26, 26, 0.19);
1479
- }
1480
-
1481
- /* ---------- 暗色:Pebrel 通用深色基 ---------- */
1482
- html[data-pebrel-theme][data-ds-dark-theme],
1483
- body[data-pebrel-theme][data-ds-dark-theme] {
1484
- --dsw-label-primary: #e2e8f0;
1485
- --dsw-label-secondary: #b9c3cf;
1486
- --dsw-label-tertiary: #94a3b8;
1487
- --dsw-label-caption: #64748b;
1488
- --dsw-bubble: rgba(255, 255, 255, 0.05);
1489
- --dsw-hover: rgba(203, 213, 225, 0.14);
1490
- --dsw-active: rgba(203, 213, 225, 0.21);
1491
- --dsw-border-l1: rgba(203, 213, 225, 0.08);
1492
- --dsw-border-l2: rgba(203, 213, 225, 0.12);
1493
- --dsw-border-l3: rgba(203, 213, 225, 0.16);
1494
- --dsw-border-l4: rgba(203, 213, 225, 0.24);
1495
- --dsw-warn: #f59e0b;
1496
- --dsw-success: #7db2c2;
1497
- --dsw-danger: #c44a58;
1498
- --dsw-selector: rgba(203, 213, 225, 0.08);
1499
- --dsw-border-strong: #94a3b8;
1500
- --dsw-mask: rgba(2, 6, 23, 0.5);
1501
- --dsw-elevation-stroke: var(--dsw-border-l2);
1502
- }
1503
-
1504
- /* 钢(SteelDark) */
1505
- html[data-pebrel-theme="silver-steel"][data-ds-dark-theme],
1506
- body[data-pebrel-theme="silver-steel"][data-ds-dark-theme] {
1507
- --dsw-bg-base: #16181e;
1508
- --dsw-bg-elevated: #1e2129;
1509
- --dsw-sidebar-fill: #16181e;
1510
- --dsw-input-major: #1a1c24;
1511
- --dsw-layer-2: #1e2129;
1512
- --dsw-layer-3: #343a48;
1513
- --dsw-btn-elevated: #1e2129;
1514
- --dsw-btn-floating-hover: rgba(203, 213, 225, 0.14);
1515
- --dsw-module-platform: #1e2129;
1516
- --dsw-glass-popover: #1e2129;
1517
- --dsw-glass-input: #1a1c24;
1518
- --dsw-glass-modal: #1e2129;
1519
- --dsw-accent: #94a3b8;
1520
- --dsw-accent-soft: rgba(148, 163, 184, 0.15);
1521
- }
1522
-
1523
- /* 煤(CoalDark,金棕点缀) */
1524
- html[data-pebrel-theme="limestone-coal"][data-ds-dark-theme],
1525
- body[data-pebrel-theme="limestone-coal"][data-ds-dark-theme] {
1526
- --dsw-bg-base: #161616;
1527
- --dsw-bg-elevated: #1e1e1e;
1528
- --dsw-sidebar-fill: #161616;
1529
- --dsw-input-major: #171717;
1530
- --dsw-layer-2: #1e1e1e;
1531
- --dsw-layer-3: #383836;
1532
- --dsw-btn-elevated: #1e1e1e;
1533
- --dsw-btn-floating-hover: rgba(203, 213, 225, 0.14);
1534
- --dsw-module-platform: #1e1e1e;
1535
- --dsw-glass-popover: #1e1e1e;
1536
- --dsw-glass-input: #171717;
1537
- --dsw-glass-modal: #1e1e1e;
1538
- --dsw-accent: #d4d4d4;
1539
- --dsw-accent-soft: rgba(212, 212, 212, 0.14);
1540
- --dsw-warn: #ceb27e;
1541
- }
1542
-
1543
- /* 苔(MossDark) */
1544
- html[data-pebrel-theme="linen-moss"][data-ds-dark-theme],
1545
- body[data-pebrel-theme="linen-moss"][data-ds-dark-theme] {
1546
- --dsw-bg-base: #191c19;
1547
- --dsw-bg-elevated: #212521;
1548
- --dsw-sidebar-fill: #191c19;
1549
- --dsw-input-major: #1e211e;
1550
- --dsw-layer-2: #212521;
1551
- --dsw-layer-3: #363d36;
1552
- --dsw-btn-elevated: #212521;
1553
- --dsw-btn-floating-hover: rgba(203, 213, 225, 0.14);
1554
- --dsw-module-platform: #212521;
1555
- --dsw-glass-popover: #212521;
1556
- --dsw-glass-input: #1e211e;
1557
- --dsw-glass-modal: #212521;
1558
- --dsw-accent: #a3b3a3;
1559
- --dsw-accent-soft: rgba(163, 179, 163, 0.15);
1560
- }
1561
-
1562
- /* 北欧(Nord,完整深色皮肤) */
1563
- html[data-pebrel-theme="nord-paper"][data-ds-dark-theme],
1564
- body[data-pebrel-theme="nord-paper"][data-ds-dark-theme] {
1565
- --dsw-bg-base: #2e3440;
1566
- --dsw-bg-elevated: #3b4252;
1567
- --dsw-sidebar-fill: #2e3440;
1568
- --dsw-input-major: #3b4252;
1569
- --dsw-bubble: #3b4252;
1570
- --dsw-hover: rgba(255, 255, 255, 0.06);
1571
- --dsw-active: rgba(136, 192, 208, 0.18);
1572
- --dsw-label-primary: #e5e9f0;
1573
- --dsw-label-secondary: #c0c7d3;
1574
- --dsw-label-tertiary: #7b8294;
1575
- --dsw-label-caption: #6f7688;
1576
- --dsw-border-l1: rgba(255, 255, 255, 0.05);
1577
- --dsw-border-l2: rgba(255, 255, 255, 0.06);
1578
- --dsw-border-l3: #434c5e;
1579
- --dsw-border-l4: #4c566a;
1580
- --dsw-accent: #88c0d0;
1581
- --dsw-accent-soft: rgba(136, 192, 208, 0.18);
1582
- --dsw-warn: #ebcb8b;
1583
- --dsw-success: #a3be8c;
1584
- --dsw-danger: #bf616a;
1585
- --dsw-selector: rgba(255, 255, 255, 0.06);
1586
- --dsw-layer-2: #3b4252;
1587
- --dsw-layer-3: #434c5e;
1588
- --dsw-btn-elevated: #3b4252;
1589
- --dsw-btn-floating-hover: #434c5e;
1590
- --dsw-module-platform: #3b4252;
1591
- --dsw-border-strong: #7b8294;
1592
- --dsw-glass-popover: #3b4252;
1593
- --dsw-glass-input: #3b4252;
1594
- --dsw-glass-modal: #3b4252;
1595
- --dsw-mask: rgba(2, 6, 23, 0.36);
1596
- }
1597
-
1598
- /* Pebrel 原生(Nebula,深色专属) */
1599
- html[data-pebrel-theme="pebrel"][data-ds-dark-theme],
1600
- body[data-pebrel-theme="pebrel"][data-ds-dark-theme] {
1601
- --dsw-bg-base: #222630;
1602
- --dsw-bg-elevated: #2b303b;
1603
- --dsw-sidebar-fill: #222630;
1604
- --dsw-input-major: #0f111a;
1605
- --dsw-layer-2: #2b303b;
1606
- --dsw-layer-3: #414858;
1607
- --dsw-btn-elevated: #2b303b;
1608
- --dsw-btn-floating-hover: rgba(203, 213, 225, 0.14);
1609
- --dsw-module-platform: #2b303b;
1610
- --dsw-glass-popover: #2b303b;
1611
- --dsw-glass-input: #0f111a;
1612
- --dsw-glass-modal: #2b303b;
1613
- --dsw-accent: #52a8ff;
1614
- --dsw-accent-soft: rgba(82, 168, 255, 0.15);
1615
- }
1616
-
1617
- /* 操作按钮进行中反馈(如分支) */
1618
- @keyframes piweb-spin-kf {
1619
- to {
1620
- transform: rotate(360deg);
1621
- }
1622
- }
1623
- .piweb-spin {
1624
- animation: piweb-spin-kf 0.8s linear infinite;
1625
- }
1626
- /* 连接测试阶段节点的呼吸态(照 Nebula 连接卡片的流动感,PiWeb 化为脉冲) */
1627
- @keyframes piweb-pulse-kf {
1628
- 0%,
1629
- 100% {
1630
- opacity: 1;
1631
- }
1632
- 50% {
1633
- opacity: 0.3;
1634
- }
1635
- }
1636
- .piweb-pulse {
1637
- animation: piweb-pulse-kf 1.1s ease-in-out infinite;
1638
- }
1639
- /* 流式正文末尾的光标:像终端一样告诉用户“还在写” */
1640
- @keyframes stream-cursor-kf {
1641
- 0%,
1642
- 49% {
1643
- opacity: 1;
1644
- }
1645
- 50%,
1646
- 100% {
1647
- opacity: 0;
1648
- }
1649
- }
1650
- .stream-cursor {
1651
- display: inline-block;
1652
- width: 2px;
1653
- height: 1em;
1654
- margin-left: 2px;
1655
- vertical-align: -0.15em;
1656
- background: var(--dsw-accent);
1657
- animation: stream-cursor-kf 1s steps(1) infinite;
1658
- }
1659
-
1660
- /* ============================================================
1661
- 项目生长:项目栏 / 项目树 / 时间轴 / 文件查看器 / 整文件 diff
1662
- ============================================================ */
1663
-
1664
- /* 分段开关(本步 / 本会话、变更 / 内容 / 渲染) */
1665
- .pw-seg {
1666
- display: inline-flex;
1667
- flex: none;
1668
- padding: 2px;
1669
- border-radius: 8px;
1670
- background: var(--dsw-hover);
1671
- gap: 1px;
1672
- }
1673
- .pw-seg > button {
1674
- height: 20px;
1675
- padding: 0 8px;
1676
- border-radius: 6px;
1677
- font-size: 11.5px;
1678
- line-height: 20px;
1679
- color: var(--dsw-label-tertiary);
1680
- white-space: nowrap;
1681
- transition: background var(--ds-duration-fast) var(--ds-ease-in-out), color var(--ds-duration-fast) var(--ds-ease-in-out);
1682
- }
1683
- .pw-seg > button[data-active="true"] {
1684
- background: var(--dsw-bg-elevated);
1685
- color: var(--dsw-label-primary);
1686
- box-shadow: 0 0 0 0.5px var(--dsw-border-l2), 0 1px 2px rgba(0, 0, 0, 0.06);
1687
- }
1688
- /* 小胶囊开关(只看变更 / 跟随 / 折叠未改动) */
1689
- .pw-chip {
1690
- flex: none;
1691
- height: 20px;
1692
- padding: 0 8px;
1693
- border-radius: 999px;
1694
- border: 0.5px solid var(--dsw-border-l3);
1695
- font-size: 11px;
1696
- line-height: 19px;
1697
- color: var(--dsw-label-tertiary);
1698
- white-space: nowrap;
1699
- transition: background var(--ds-duration-fast) var(--ds-ease-in-out), color var(--ds-duration-fast) var(--ds-ease-in-out), border-color var(--ds-duration-fast) var(--ds-ease-in-out);
1700
- }
1701
- .pw-chip:hover {
1702
- background: var(--dsw-hover);
1703
- color: var(--dsw-label-primary);
1704
- }
1705
- .pw-chip[data-active="true"] {
1706
- background: var(--dsw-accent-soft);
1707
- border-color: transparent;
1708
- color: var(--dsw-accent);
1709
- }
1710
- .pw-chip:disabled {
1711
- opacity: 0.4;
1712
- pointer-events: none;
1713
- }
1714
-
1715
- @media (prefers-reduced-motion: reduce) {
1716
- * {
1717
- transition: none !important;
1718
- animation: none !important;
1719
- }
1720
- }
1721
-
1722
- .piweb-conversation-width-handle {
1723
- position: absolute;
1724
- top: 0;
1725
- bottom: 0;
1726
- z-index: 3;
1727
- width: 12px;
1728
- cursor: col-resize;
1729
- touch-action: none;
1730
- }
1731
- .piweb-conversation-width-handle[data-side="left"] {
1732
- left: calc(50% - var(--dsh-chat-content-width) / 2 - 20px);
1733
- }
1734
- .piweb-conversation-width-handle[data-side="right"] {
1735
- right: calc(50% - var(--dsh-chat-content-width) / 2 - 20px);
1736
- }
1737
- .piweb-conversation-width-handle::after {
1738
- content: "";
1739
- position: absolute;
1740
- /* 常显的中间一小段:整条全高竖线会读成边框/分隔线,短抓手才读成"可拖"。
1741
- 热区仍是 12px 全高(cursor: col-resize),手感不受影响。 */
1742
- top: 35%;
1743
- bottom: 35%;
1744
- left: 5px;
1745
- width: 2px;
1746
- border-radius: 2px;
1747
- background: var(--dsw-border-l3);
1748
- opacity: 0.3;
1749
- transition: opacity var(--ds-duration-fast);
1750
- }
1751
- .piweb-conversation-width-handle:hover::after,
1752
- .piweb-conversation-width-handle[data-dragging]::after,
1753
- .piweb-conversation-width-handle:focus-visible::after {
1754
- opacity: 1;
1755
- }
1756
-
1757
- @media (max-width: 840px) {
1758
- :root {
1759
- --dsh-chat-content-width: 100%;
1760
- --dsh-composer-card-max-width: 100%;
1761
- }
1762
- .piweb-conversation-width-handle {
1763
- display: none;
1764
- }
1765
-
1766
- .pi-main > .hairline-b {
1767
- padding-left: 56px;
1768
- padding-right: 12px;
1769
- }
1770
-
1771
- .settings-dialog {
1772
- width: calc(100vw - 16px) !important;
1773
- max-width: none !important;
1774
- height: calc(100vh - 16px) !important;
1775
- flex-direction: column;
1776
- border-radius: 22px !important;
1777
- }
1778
-
1779
- .settings-nav {
1780
- width: 100% !important;
1781
- flex-direction: row !important;
1782
- overflow-x: auto;
1783
- padding: 10px !important;
1784
- border-bottom: 0.5px solid var(--dsw-border-l2);
1785
- }
1786
-
1787
- .settings-nav > button {
1788
- flex: none;
1789
- height: 36px;
1790
- }
1791
-
1792
- .settings-title {
1793
- display: none;
1794
- }
1795
- }
1796
-
1797
- /* 滚动条 */
1798
- ::-webkit-scrollbar {
1799
- width: 10px;
1800
- height: 10px;
1801
- }
1802
- ::-webkit-scrollbar-thumb {
1803
- background: var(--dsw-active);
1804
- border-radius: 8px;
1805
- border: 2.5px solid transparent;
1806
- background-clip: content-box;
1807
- }
1808
- ::-webkit-scrollbar-thumb:hover {
1809
- background: var(--dsw-border-l3);
1810
- border: 2px solid transparent;
1811
- background-clip: content-box;
1812
- }
1813
- ::-webkit-scrollbar-track {
1814
- background: transparent;
1815
- }
1816
-
1817
- /* ============================================================
1818
- 通用组件样式
1819
- ============================================================ */
1820
-
1821
- .icon-btn {
1822
- display: inline-flex;
1823
- align-items: center;
1824
- justify-content: center;
1825
- width: 28px;
1826
- height: 28px;
1827
- border-radius: 8px;
1828
- color: var(--dsw-label-secondary);
1829
- transition: background var(--ds-duration-fast) var(--ds-ease-in-out), color var(--ds-duration-fast)
1830
- var(--ds-ease-in-out);
1831
- }
1832
- .icon-btn:hover {
1833
- background: var(--dsw-hover);
1834
- color: var(--dsw-label-primary);
1835
- }
1836
-
1837
- .chip {
1838
- display: inline-flex;
1839
- align-items: center;
1840
- gap: 5px;
1841
- height: 28px;
1842
- padding: 0 10px;
1843
- border-radius: 24px;
1844
- font-size: 13px;
1845
- line-height: 20px;
1846
- font-weight: 500;
1847
- color: var(--dsw-label-primary);
1848
- white-space: nowrap;
1849
- transition: background var(--ds-duration-fast) var(--ds-ease-in-out), color var(--ds-duration-fast)
1850
- var(--ds-ease-in-out);
1851
- }
1852
- .chip:hover {
1853
- background: var(--dsw-hover);
1854
- color: var(--dsw-label-primary);
1855
- }
1856
- .chip .chevron {
1857
- color: var(--dsw-label-caption);
1858
- transition: transform 120ms var(--ds-ease-in-out);
1859
- }
1860
- .chip[data-open="true"] .chevron {
1861
- transform: rotate(180deg);
1862
- }
1863
-
1864
- /* Hero 专属工作区 / 预设芯片(对齐 dsh .workspace:透明底、label-primary 纯白高亮、无外框胶囊) */
1865
- .hero-chip {
1866
- display: inline-flex;
1867
- align-items: center;
1868
- gap: 6px;
1869
- height: 28px;
1870
- padding: 0 8px;
1871
- border-radius: 14px;
1872
- background: transparent;
1873
- color: var(--dsw-label-primary);
1874
- font-size: 13px;
1875
- line-height: 20px;
1876
- font-weight: 500;
1877
- white-space: nowrap;
1878
- cursor: pointer;
1879
- transition: background var(--ds-duration-fast) var(--ds-ease-in-out);
1015
+ /* 会话行内嵌的更多按钮(⋯)在父行反转时自适应反色 */
1016
+ .isx-menu-item:hover:not(:disabled) .icon-btn,
1017
+ .isx-menu-item[data-active="true"] .icon-btn {
1018
+ color: var(--dsw-bg-base);
1880
1019
  }
1881
- .hero-chip:hover,
1882
- .hero-chip[data-open="true"] {
1883
- background: var(--dsw-hover);
1020
+ .isx-menu-item:hover:not(:disabled) .icon-btn:hover,
1021
+ .isx-menu-item[data-active="true"] .icon-btn:hover {
1022
+ background: rgba(128, 128, 128, 0.25);
1023
+ color: var(--dsw-bg-base);
1884
1024
  }
1885
- .hero-chip .hero-chip-icon {
1886
- flex: none;
1887
- color: var(--dsw-label-primary);
1025
+ /* 危险操作菜单项(Iconsax --red 鲜红反转) */
1026
+ .isx-menu-item[data-danger="true"]:hover:not(:disabled) {
1027
+ background: var(--dsw-danger) !important;
1028
+ color: #ffffff !important;
1888
1029
  }
1889
- .hero-chip .chevron {
1890
- flex: none;
1891
- color: var(--dsw-label-caption);
1892
- transition: transform 120ms var(--ds-ease-in-out);
1030
+ .isx-menu-item[data-danger="true"]:hover:not(:disabled) > svg,
1031
+ .isx-menu-item[data-danger="true"]:hover:not(:disabled) .isx-menu-icon {
1032
+ color: #ffffff !important;
1893
1033
  }
1894
- .hero-chip[data-open="true"] .chevron {
1895
- transform: rotate(180deg);
1034
+ .isx-menu-item[data-danger="true"]:hover:not(:disabled)::after {
1035
+ background: #ffffff;
1896
1036
  }
1897
1037
 
1898
- /* 描边按钮(dsh Button.outline:胶囊 r18、透明底、0.5px 边) */
1899
- .btn-outline {
1900
- display: inline-flex;
1901
- align-items: center;
1902
- justify-content: center;
1903
- gap: 6px;
1904
- height: 36px;
1905
- padding: 0 14px;
1906
- border-radius: 18px;
1907
- border: 0.5px solid var(--dsw-border-l3);
1908
- background: transparent;
1909
- color: var(--dsw-label-primary);
1910
- font-size: 14px;
1911
- line-height: 22px;
1912
- transition: background var(--ds-duration-fast) var(--ds-ease-in-out);
1913
- }
1914
- .btn-outline:hover {
1915
- background: var(--dsw-hover);
1038
+ /* 2. 搜索框(Iconsax .con-search:聚焦点亮主色描边 + 放大镜旋转 90deg 放大 1.1x + 输入文字右移) */
1039
+ .isx-search {
1040
+ position: relative;
1041
+ border-radius: 14px;
1042
+ border: 1.5px solid var(--dsw-border-l2);
1043
+ background: var(--dsw-bg-elevated);
1044
+ transition: border-color 0.25s var(--isx-ease), background 0.25s var(--isx-ease),
1045
+ box-shadow 0.25s var(--isx-ease);
1916
1046
  }
1917
-
1918
- /* 主操作实心按钮(表单保存/确认):前景色填充。名称沿用既有调用点。 */
1919
- .btn-primary-white {
1920
- display: inline-flex;
1921
- align-items: center;
1922
- justify-content: center;
1923
- gap: 6px;
1924
- height: 36px;
1925
- padding: 0 14px;
1926
- border-radius: 18px;
1927
- background: var(--dsw-label-primary);
1928
- color: var(--dsw-bg-base);
1929
- font-size: 14px;
1930
- font-weight: 500;
1931
- line-height: 22px;
1932
- transition: opacity var(--ds-duration-fast) var(--ds-ease-in-out);
1047
+ .isx-search:hover {
1048
+ border-color: var(--dsw-border-l3);
1933
1049
  }
1934
- .btn-primary-white:disabled {
1935
- opacity: 0.5;
1936
- cursor: default;
1050
+ .isx-search:focus-within {
1051
+ border-color: var(--dsw-label-primary);
1937
1052
  }
1938
-
1939
- /* 侧栏「新会话」(dsh .newSession:h38 r12 elevated 底) */
1940
- .btn-new-session {
1941
- display: inline-flex;
1942
- align-items: center;
1943
- justify-content: center;
1944
- gap: 6px;
1945
- height: 38px;
1946
- padding: 8px 16px;
1947
- border-radius: 12px;
1948
- border: 0.5px solid var(--dsw-border-l3);
1949
- background: var(--dsw-btn-elevated);
1950
- color: var(--dsw-label-primary);
1951
- font-size: 14px;
1952
- font-weight: 500;
1953
- line-height: 22px;
1954
- transition: background var(--ds-duration-fast) var(--ds-ease-in-out);
1053
+ .isx-search > svg:first-of-type,
1054
+ .isx-search .isx-search-icon {
1055
+ transition: transform 0.3s var(--isx-ease), color 0.25s var(--isx-ease);
1955
1056
  }
1956
- .btn-new-session:hover {
1957
- background: var(--dsw-btn-floating-hover);
1057
+ .isx-search:focus-within > svg:first-of-type,
1058
+ .isx-search:focus-within .isx-search-icon {
1059
+ transform: rotate(90deg) scale(1.1);
1060
+ color: var(--dsw-label-primary) !important;
1958
1061
  }
1959
-
1960
- /* 设置行右侧下选芯片(dsh「标准模式 ⌄」:胶囊) */
1961
- .select-chip {
1962
- display: inline-flex;
1963
- align-items: center;
1964
- gap: 6px;
1965
- height: 32px;
1966
- padding: 0 12px;
1967
- border-radius: 16px;
1968
- border: 0.5px solid var(--dsw-border-l2);
1969
- font-size: 13px;
1970
- color: var(--dsw-label-primary);
1971
- transition: background var(--ds-duration-fast) var(--ds-ease-in-out);
1062
+ .isx-search input {
1063
+ transition: padding-left 0.25s var(--isx-ease);
1972
1064
  }
1973
- .select-chip:hover {
1974
- background: var(--dsw-hover);
1065
+ .isx-search:focus-within input {
1066
+ padding-left: 4px;
1975
1067
  }
1976
1068
 
1977
- /* 页签(dsh:蓝色文字 + 蓝色下划线) */
1978
- .tab-underline {
1069
+ /* 3. 主输入卡 Composer(Iconsax .con-input + 底部发光短横条 ::after) */
1070
+ .isx-composer {
1979
1071
  position: relative;
1980
- padding: 6px 2px;
1981
- font-size: 13.5px;
1982
- color: var(--dsw-label-tertiary);
1983
- transition: color var(--ds-duration-fast) var(--ds-ease-in-out);
1984
- }
1985
- .tab-underline:hover {
1986
- color: var(--dsw-label-primary);
1987
- }
1988
- .tab-underline[data-active="true"] {
1989
- color: var(--dsw-accent);
1990
- font-weight: 600;
1072
+ border-radius: 24px !important;
1073
+ border: 1.5px solid var(--dsw-border-l2);
1074
+ background: var(--dsw-glass-input);
1075
+ box-shadow: var(--dsw-elevation-panel);
1076
+ transition: border-color 0.28s var(--isx-ease), box-shadow 0.28s var(--isx-ease),
1077
+ transform 0.25s var(--isx-ease);
1991
1078
  }
1992
- .tab-underline::after {
1079
+ .isx-composer::after {
1993
1080
  content: "";
1994
1081
  position: absolute;
1995
- left: 0;
1996
- right: 0;
1997
1082
  bottom: -1px;
1083
+ left: 34px;
1084
+ width: 22px;
1998
1085
  height: 2px;
1999
1086
  border-radius: 2px;
2000
- background: transparent;
1087
+ background: var(--dsw-label-primary);
1088
+ opacity: 0.55;
1089
+ transition: width 0.32s var(--isx-ease), opacity 0.28s var(--isx-ease), background 0.28s var(--isx-ease);
1090
+ pointer-events: none;
2001
1091
  }
2002
- .tab-underline[data-active="true"]::after {
2003
- background: var(--dsw-accent);
1092
+ .isx-composer:hover {
1093
+ border-color: var(--dsw-border-l3);
2004
1094
  }
2005
-
2006
- .settings-tab-underline {
2007
- position: relative;
2008
- padding: 6px 2px 10px;
2009
- font-size: 13.5px;
2010
- color: var(--dsw-label-tertiary);
2011
- transition: color var(--ds-duration-fast) var(--ds-ease-in-out);
1095
+ .isx-composer:focus-within {
1096
+ border-color: var(--dsw-label-primary);
2012
1097
  }
2013
- .settings-tab-underline:hover {
2014
- color: var(--dsw-label-primary);
1098
+ .isx-composer:focus-within::after {
1099
+ width: 58px;
1100
+ opacity: 1;
1101
+ background: var(--isx-line-gradient);
2015
1102
  }
2016
- .settings-tab-underline[data-active="true"] {
2017
- color: var(--dsw-label-primary);
2018
- font-weight: 500;
1103
+
1104
+ /* 4. 展示与设置卡片(Iconsax .sec11 .card:20px 圆角 + 1px 描边 + 左下角 20×2px 标志短横条) */
1105
+ .isx-card {
1106
+ position: relative;
1107
+ border-radius: 20px;
1108
+ border: 1px solid var(--dsw-border-l2);
1109
+ background: var(--dsw-bg-elevated);
1110
+ transition: border-color 0.25s var(--isx-ease), background 0.25s var(--isx-ease),
1111
+ transform 0.24s var(--isx-ease), box-shadow 0.25s var(--isx-ease);
2019
1112
  }
2020
- .settings-tab-underline::after {
1113
+ .isx-card::after {
2021
1114
  content: "";
2022
1115
  position: absolute;
2023
- left: 0;
2024
- right: 0;
2025
1116
  bottom: -1px;
1117
+ left: 26px;
1118
+ width: 20px;
2026
1119
  height: 2px;
2027
1120
  border-radius: 2px;
2028
- background: transparent;
2029
- }
2030
- .settings-tab-underline[data-active="true"]::after {
2031
- background: var(--dsw-label-primary);
2032
- }
2033
- /* 应用外壳占满「实际可见」的高度。100vh 在手机浏览器里是工具栏收起时的大视口:
2034
- 地址栏在底部的浏览器(如手机 Edge)里,最下面的输入框正好被工具栏盖住、页面又不滚动,
2035
- 看起来就是没有输入框。dvh 是实际可见高度,不认它的老浏览器退回 100vh。
2036
- 兜底必须放进 @supports:写成两行 height,构建时的 CSS 压缩会只留后一行,老浏览器就没了高度。 */
2037
- .pw-app-shell {
2038
- height: 100vh;
2039
- }
2040
- @supports (height: 100dvh) {
2041
- .pw-app-shell {
2042
- height: 100dvh;
2043
- }
2044
- }
2045
- /* 右侧抽屉的入口条:未选中项悬停给底色(设置页的同款下划线 tab 没有底色) */
2046
- .drawer-tab:hover:not([data-active="true"]) {
2047
- background: var(--dsw-hover);
2048
- }
2049
-
2050
- .btn-primary-circle {
2051
- display: inline-flex;
2052
- align-items: center;
2053
- justify-content: center;
2054
- width: 34px;
2055
- height: 34px;
2056
- border-radius: 999px;
2057
- background: var(--dsw-accent);
2058
- color: #fff;
2059
- transform: translateY(-2px);
2060
- flex: none;
2061
- margin-top: -3px;
2062
- margin-bottom: -3px;
2063
- transition: opacity var(--ds-duration-fast) var(--ds-ease-in-out), transform var(--ds-duration-fast)
2064
- var(--ds-ease-in-out);
2065
- }
2066
- .btn-primary-circle:disabled {
2067
- opacity: 0.4;
2068
- cursor: default;
2069
- }
2070
- /* 运行中有草稿时的幽灵停止钮(发送钮左侧),悬停变警示色 */
2071
- .btn-ghost-circle {
2072
- display: inline-flex;
2073
- align-items: center;
2074
- justify-content: center;
2075
- width: 30px;
2076
- height: 30px;
2077
- border-radius: 999px;
2078
- color: var(--dsw-label-secondary);
2079
- border: 0.5px solid var(--dsw-border-l2);
2080
- background: transparent;
2081
- transform: translateY(-2px);
2082
- flex: none;
2083
- margin-top: -3px;
2084
- margin-bottom: -3px;
2085
- }
2086
- .btn-ghost-circle:hover {
2087
- color: var(--dsw-danger);
2088
- border-color: var(--dsw-danger);
2089
- }
2090
-
2091
- /* 排队中的消息:输入卡上方一列(Claude Code 的 queued messages 位置) */
2092
- .pw-queue {
2093
- display: flex;
2094
- flex-direction: column;
2095
- gap: 3px;
2096
- margin: 0 14px 8px;
2097
- font-size: 12.5px;
2098
- }
2099
- .pw-queue-row {
2100
- display: flex;
2101
- align-items: center;
2102
- gap: 8px;
2103
- min-width: 0;
2104
- color: var(--dsw-label-secondary);
2105
- }
2106
- .pw-queue-tag {
2107
- flex: none;
2108
- font-size: 10.5px;
2109
- line-height: 16px;
2110
- padding: 0 6px;
2111
- border-radius: 4px;
2112
- text-transform: capitalize;
2113
- color: var(--dsw-label-tertiary);
2114
- border: 0.5px solid var(--dsw-border-l2);
2115
- }
2116
- .pw-queue-text {
2117
- min-width: 0;
2118
- overflow: hidden;
2119
- text-overflow: ellipsis;
2120
- white-space: nowrap;
2121
- }
2122
- .pw-queue-foot {
2123
- display: flex;
2124
- gap: 12px;
2125
- margin-top: 1px;
2126
- padding-left: 2px;
2127
- font-size: 11.5px;
2128
- color: var(--dsw-label-caption);
2129
- }
2130
- .pw-queue-foot button:hover {
2131
- color: var(--dsw-label-secondary);
2132
- }
2133
- /* 运行中输入卡下方的按键提示 */
2134
- .pw-busy-hint {
2135
- margin: 6px 14px 0;
2136
- font-size: 11.5px;
2137
- line-height: 16px;
2138
- color: var(--dsw-label-caption);
2139
- }
2140
-
2141
- .hairline-t {
2142
- border-top: 0.5px solid var(--dsw-border-l2);
1121
+ background: var(--dsw-label-primary);
1122
+ opacity: 0.38;
1123
+ transition: width 0.28s var(--isx-ease), opacity 0.28s var(--isx-ease);
1124
+ pointer-events: none;
2143
1125
  }
2144
- .hairline-b {
2145
- border-bottom: 0.5px solid var(--dsw-border-l2);
1126
+ .isx-card:hover:not(:disabled),
1127
+ .isx-card[aria-pressed="true"],
1128
+ .isx-card[data-active="true"] {
1129
+ border-color: var(--dsw-label-primary);
2146
1130
  }
2147
- .hairline-r {
2148
- border-right: 0.5px solid var(--dsw-border-l2);
1131
+ .isx-card:hover:not(:disabled)::after,
1132
+ .isx-card[aria-pressed="true"]::after,
1133
+ .isx-card[data-active="true"]::after {
1134
+ width: 36px;
1135
+ opacity: 1;
2149
1136
  }
2150
1137
 
2151
- /* 侧栏收起导轨按钮(dsh rail:36×36 控件盒、12px 圆角) */
2152
- .rail-btn {
2153
- display: inline-flex;
2154
- align-items: center;
2155
- justify-content: center;
2156
- width: 36px;
2157
- height: 36px;
1138
+ /* 5. 上下文进度环按钮(Iconsax .card-percent 悬停放大与描边点亮) */
1139
+ .isx-ring-btn {
2158
1140
  border-radius: 12px;
2159
- color: var(--dsw-label-secondary);
2160
- transition: background var(--ds-duration-fast) var(--ds-ease-in-out), color var(--ds-duration-fast)
2161
- var(--ds-ease-in-out);
1141
+ border: 1px solid transparent;
1142
+ transition: background 0.24s var(--isx-ease), border-color 0.24s var(--isx-ease),
1143
+ transform 0.24s var(--isx-ease);
2162
1144
  }
2163
- .rail-btn:hover {
1145
+ .isx-ring-btn:hover {
2164
1146
  background: var(--dsw-hover);
2165
- color: var(--dsw-label-primary);
1147
+ border-color: var(--dsw-border-l3);
1148
+ transform: scale(1.06);
1149
+ }
1150
+ .isx-ring-btn:active {
1151
+ transform: scale(0.92);
1152
+ }
1153
+
1154
+ /* 6. 双端点装饰分割线(Iconsax .line-dots) */
1155
+ .line-dots {
1156
+ position: relative;
1157
+ height: 1px;
1158
+ background: var(--dsw-border-l2);
1159
+ }
1160
+ .line-dots::before,
1161
+ .line-dots::after {
1162
+ content: "";
1163
+ position: absolute;
1164
+ top: -1.5px;
1165
+ width: 4px;
1166
+ height: 4px;
1167
+ border-radius: 999px;
1168
+ background: var(--dsw-border-l4);
1169
+ }
1170
+ .line-dots::before {
1171
+ left: 0;
1172
+ }
1173
+ .line-dots::after {
1174
+ right: 0;
2166
1175
  }
2167
1176
 
2168
1177
  /* 状态点(对齐 dsh StateDot) */
@@ -2174,8 +1183,9 @@ body[data-pebrel-theme="pebrel"][data-ds-dark-theme] {
2174
1183
  flex: none;
2175
1184
  }
2176
1185
  .state-dot.running {
2177
- background: var(--dsw-deepseek-450);
2178
- animation: dot-breathe 1s ease-in-out infinite;
1186
+ background: #02defc;
1187
+ box-shadow: 0 0 8px rgba(2, 222, 252, 0.7);
1188
+ animation: isx-dot-ripple 1.6s var(--isx-ease) infinite;
2179
1189
  }
2180
1190
  .state-dot.pending {
2181
1191
  background: var(--dsw-warn);
@@ -2184,6 +1194,20 @@ body[data-pebrel-theme="pebrel"][data-ds-dark-theme] {
2184
1194
  .state-dot.done {
2185
1195
  background: var(--dsw-success);
2186
1196
  }
1197
+ @keyframes isx-dot-ripple {
1198
+ 0% {
1199
+ transform: scale(0.9);
1200
+ box-shadow: 0 0 4px rgba(2, 222, 252, 0.6), 0 0 0 0 rgba(2, 222, 252, 0.4);
1201
+ }
1202
+ 50% {
1203
+ transform: scale(1.15);
1204
+ box-shadow: 0 0 10px rgba(2, 222, 252, 0.9), 0 0 0 4px rgba(2, 222, 252, 0);
1205
+ }
1206
+ 100% {
1207
+ transform: scale(0.9);
1208
+ box-shadow: 0 0 4px rgba(2, 222, 252, 0.6), 0 0 0 0 rgba(2, 222, 252, 0);
1209
+ }
1210
+ }
2187
1211
  @keyframes dot-breathe {
2188
1212
  0%,
2189
1213
  100% {
@@ -2194,14 +1218,27 @@ body[data-pebrel-theme="pebrel"][data-ds-dark-theme] {
2194
1218
  }
2195
1219
  }
2196
1220
 
2197
- /* 下拉/浮层(玻璃态:半透明层色 + backdrop blur + 发丝线) */
1221
+ /* 下拉/浮层(Iconsax 玻璃浮层:20px 圆角 + 1px 清晰描边 + 弹性入场动画) */
2198
1222
  .popover {
2199
1223
  background: var(--dsw-glass-popover);
1224
+ backdrop-filter: blur(18px);
1225
+ -webkit-backdrop-filter: blur(18px);
2200
1226
  padding: 6px;
2201
- border-radius: 16px;
1227
+ border-radius: 20px;
2202
1228
  box-shadow: var(--dsw-elevation-prominent);
2203
- border: 0.5px solid var(--dsw-border-l1);
1229
+ border: 1px solid var(--dsw-border-l2);
2204
1230
  overflow: hidden;
1231
+ animation: isx-popover-in 0.2s var(--isx-spring) both;
1232
+ }
1233
+ @keyframes isx-popover-in {
1234
+ from {
1235
+ opacity: 0;
1236
+ transform: translateY(4px) scale(0.97);
1237
+ }
1238
+ to {
1239
+ opacity: 1;
1240
+ transform: none;
1241
+ }
2205
1242
  }
2206
1243
 
2207
1244
  /* 居中遮罩层(dsh Modal.mask:遮罩色 + blur) */
@@ -2214,6 +1251,9 @@ body[data-pebrel-theme="pebrel"][data-ds-dark-theme] {
2214
1251
  /* 玻璃卡(设置弹窗) */
2215
1252
  .glass-modal {
2216
1253
  background: var(--dsw-glass-modal);
1254
+ backdrop-filter: blur(20px);
1255
+ -webkit-backdrop-filter: blur(20px);
1256
+ border: 1px solid var(--dsw-border-l2);
2217
1257
  }
2218
1258
 
2219
1259
  /* markdown 内容(字号独立可调:对话字体设置驱动,缺省跟界面字体) */
@@ -2264,12 +1304,46 @@ body[data-pebrel-theme="pebrel"][data-ds-dark-theme] {
2264
1304
  .md a:hover {
2265
1305
  text-decoration: underline;
2266
1306
  }
1307
+ /* 外部链接标记:一眼看出「点了会离开本站」。站内链接不加,免得正文到处是符号 */
1308
+ .md-external-mark {
1309
+ display: inline-block;
1310
+ margin-left: 1px;
1311
+ font-size: 0.85em;
1312
+ opacity: 0.6;
1313
+ vertical-align: 0.06em;
1314
+ }
1315
+ .md-external:hover .md-external-mark {
1316
+ opacity: 1;
1317
+ }
1318
+ /* 行内代码里的文件路径:可点击时用主题色标出(只变色,不加下划线,保持版面安静) */
1319
+ .md .md-file-path {
1320
+ font-family: inherit;
1321
+ font-size: inherit;
1322
+ color: var(--dsw-accent);
1323
+ background: inherit;
1324
+ border: none;
1325
+ border-radius: 5px;
1326
+ padding: inherit;
1327
+ cursor: pointer;
1328
+ text-align: left;
1329
+ }
1330
+ .md .md-file-path:hover {
1331
+ color: var(--dsw-accent-hover, var(--dsw-accent));
1332
+ background: var(--dsw-accent-soft);
1333
+ }
2267
1334
  .md blockquote {
2268
1335
  margin: 0.6em 0;
2269
1336
  padding: 0.1em 0 0.1em 0.9em;
2270
1337
  border-left: 3px solid var(--dsw-border-l3);
2271
1338
  color: var(--dsw-label-secondary);
2272
1339
  }
1340
+ /* 引用块的左侧竖线用主题强调色,与普通缩进正文区分开 */
1341
+ .md blockquote {
1342
+ border-left-color: var(--dsw-accent);
1343
+ background: var(--dsw-accent-soft);
1344
+ border-radius: 0 8px 8px 0;
1345
+ padding: 0.5em 0.9em;
1346
+ }
2273
1347
  .md code {
2274
1348
  font-family: var(--font-mono);
2275
1349
  font-size: 0.9em;
@@ -2280,43 +1354,89 @@ body[data-pebrel-theme="pebrel"][data-ds-dark-theme] {
2280
1354
  .md pre {
2281
1355
  margin: 0.7em 0;
2282
1356
  padding: 12px 14px;
2283
- border-radius: 12px;
2284
- background: var(--dsw-selector);
1357
+ border-radius: 14px;
1358
+ background: var(--dsw-bg-elevated);
2285
1359
  overflow-x: auto;
2286
- border: 0.5px solid var(--dsw-border-l1);
1360
+ border: 1px solid var(--dsw-border-l2);
2287
1361
  }
2288
1362
  .md pre code {
2289
1363
  background: none;
2290
1364
  padding: 0;
2291
1365
  font-size: 13px;
2292
- line-height: 1.55;
1366
+ line-height: 1.6;
2293
1367
  }
2294
1368
  .md-code-block {
2295
1369
  position: relative;
1370
+ margin: 0.85em 0;
1371
+ border-radius: 16px;
1372
+ border: 1px solid var(--dsw-border-l2);
1373
+ background: var(--dsw-bg-elevated);
1374
+ overflow: hidden;
1375
+ box-shadow: 0 4px 18px rgba(0, 0, 0, 0.1);
1376
+ transition: border-color 0.25s var(--isx-ease), box-shadow 0.25s var(--isx-ease);
1377
+ }
1378
+ .md-code-block:hover {
1379
+ border-color: var(--dsw-border-l3);
1380
+ box-shadow: 0 6px 24px rgba(0, 0, 0, 0.16);
2296
1381
  }
2297
1382
  .md-code-copy {
2298
1383
  position: absolute;
2299
- top: 12px;
2300
- right: 12px;
2301
- z-index: 1;
1384
+ top: 8px;
1385
+ right: 10px;
1386
+ z-index: 2;
1387
+ }
1388
+ .md-code-copy .icon-btn {
1389
+ width: 26px;
1390
+ height: 26px;
1391
+ border-radius: 8px;
1392
+ background: var(--dsw-hover);
1393
+ border: 1px solid var(--dsw-border-l1);
1394
+ backdrop-filter: blur(8px);
1395
+ }
1396
+ .md-code-copy .icon-btn:hover {
1397
+ background: var(--dsw-label-primary);
1398
+ color: var(--dsw-bg-base);
1399
+ border-color: var(--dsw-label-primary);
2302
1400
  }
2303
1401
  .md-code-block pre {
2304
- padding-top: 40px;
1402
+ margin: 0;
1403
+ padding: 14px 16px;
1404
+ padding-top: 38px;
1405
+ background: transparent;
1406
+ border: 0;
1407
+ border-radius: 0;
2305
1408
  }
2306
1409
  .md table {
2307
- border-collapse: collapse;
2308
- margin: 0.7em 0;
1410
+ border-collapse: separate;
1411
+ border-spacing: 0;
1412
+ margin: 0.8em 0;
2309
1413
  width: 100%;
2310
1414
  font-size: 0.95em;
1415
+ border-radius: 14px;
1416
+ border: 1px solid var(--dsw-border-l2);
1417
+ overflow: hidden;
2311
1418
  }
2312
1419
  .md th,
2313
1420
  .md td {
2314
- border: 0.5px solid var(--dsw-border-l2);
2315
- padding: 5px 10px;
1421
+ border-bottom: 1px solid var(--dsw-border-l1);
1422
+ border-right: 1px solid var(--dsw-border-l1);
1423
+ padding: 7px 12px;
2316
1424
  text-align: left;
2317
1425
  }
1426
+ .md tr:last-child td {
1427
+ border-bottom: 0;
1428
+ }
1429
+ .md th:last-child,
1430
+ .md td:last-child {
1431
+ border-right: 0;
1432
+ }
2318
1433
  .md th {
2319
1434
  background: var(--dsw-hover);
1435
+ font-weight: 600;
1436
+ color: var(--dsw-label-primary);
1437
+ }
1438
+ .md tr:hover td {
1439
+ background: var(--dsw-hover);
2320
1440
  }
2321
1441
  .md hr {
2322
1442
  border: none;
@@ -2328,7 +1448,7 @@ body[data-pebrel-theme="pebrel"][data-ds-dark-theme] {
2328
1448
  .pw-stream {
2329
1449
  display: flow-root;
2330
1450
  }
2331
- /* 打字光标模式下尾巴外面包了一层:包层不能改变原有排版,
1451
+ /* 尾巴外面包了一层 .pw-stream-tail:包层不能改变原有排版,
2332
1452
  .md > *:first-child/:last-child 的边距归零要透传到最后那个内容元素上 */
2333
1453
  .pw-stream > .pw-stream-tail:first-child > :first-child {
2334
1454
  margin-top: 0;
@@ -2336,55 +1456,6 @@ body[data-pebrel-theme="pebrel"][data-ds-dark-theme] {
2336
1456
  .pw-stream > .pw-stream-tail:last-child > :last-child {
2337
1457
  margin-bottom: 0;
2338
1458
  }
2339
- /* 渐显样式:只让尾巴里新出现的元素柔和淡入。
2340
- 动画若挂在容器全部直接子级上,块升级(段落从尾巴进入稳定块)会重建 DOM,
2341
- 已经显示过的内容就把入场动画重播一遍——那正是输出时「闪烁几下」的来源;
2342
- 收窄到 .pw-stream-tail 内部后,升级进来的块不再带动画,视觉无缝。 */
2343
- .pw-stream[data-stream-style="fade"] .pw-stream-tail > * {
2344
- animation: pw-stream-enter 240ms ease-out both;
2345
- }
2346
- @keyframes pw-stream-enter {
2347
- from {
2348
- opacity: 0;
2349
- transform: translateY(2px);
2350
- }
2351
- to {
2352
- opacity: 1;
2353
- transform: none;
2354
- }
2355
- }
2356
-
2357
- /* 打字光标:挂在尾巴最后一个元素的行内末尾(不会另起一行)。
2358
- 代码块和列表是块级容器,挂在外层会落到下一行,改挂到代码文字 / 最后一项的末尾 */
2359
- .pw-stream-caret .pw-stream-tail > :last-child:not(.md-code-block, ul, ol)::after,
2360
- .pw-stream-caret .pw-stream-tail > .md-code-block:last-child code::after,
2361
- .pw-stream-caret .pw-stream-tail > :is(ul, ol):last-child > li:last-child::after {
2362
- content: "";
2363
- display: inline-block;
2364
- width: 2px;
2365
- height: 1.05em;
2366
- margin-left: 2px;
2367
- vertical-align: -0.18em;
2368
- border-radius: 1px;
2369
- background: var(--dsw-accent);
2370
- animation: pw-stream-caret 1.1s steps(2, start) infinite;
2371
- }
2372
- @keyframes pw-stream-caret {
2373
- 50% {
2374
- opacity: 0;
2375
- }
2376
- }
2377
-
2378
- @media (prefers-reduced-motion: reduce) {
2379
- .pw-stream[data-stream-style="fade"] .pw-stream-tail > * {
2380
- animation: none;
2381
- }
2382
- .pw-stream-caret .pw-stream-tail > :last-child:not(.md-code-block, ul, ol)::after,
2383
- .pw-stream-caret .pw-stream-tail > .md-code-block:last-child code::after,
2384
- .pw-stream-caret .pw-stream-tail > :is(ul, ol):last-child > li:last-child::after {
2385
- animation: none;
2386
- }
2387
- }
2388
1459
 
2389
1460
  /* ---------- 代码高亮(highlight.js):VS Code 式的分类着色,配色跟 Pi 自己的主题走 ---------- */
2390
1461
  :root {
@@ -2503,25 +1574,44 @@ body[data-ds-dark-theme] {
2503
1574
  background: none;
2504
1575
  }
2505
1576
 
2506
- /* 消息气泡 */
1577
+ /* 消息气泡(Iconsax 圆角描边卡风格) */
2507
1578
  .msg-user-bubble {
2508
1579
  background: var(--dsw-input-major);
2509
- border-radius: 18px;
1580
+ border: 1px solid var(--dsw-border-l2);
1581
+ border-radius: 20px 20px 6px 20px;
2510
1582
  padding: 10px 16px;
2511
1583
  display: inline-block;
2512
1584
  max-width: 85%;
2513
1585
  font-size: var(--piweb-chat-font-size);
2514
1586
  line-height: 1.65;
1587
+ transition: border-color 0.25s var(--isx-ease), box-shadow 0.25s var(--isx-ease);
1588
+ }
1589
+ .msg-user-bubble:hover {
1590
+ border-color: var(--dsw-border-l3);
1591
+ }
1592
+
1593
+ /* 技能调用行:与「上下文注入」同款小字次级色,技能名用强调色区分。
1594
+ pi 把 /skill:name 展开成用户消息,但界面上它是本轮的一次技能调用(不是用户发言),
1595
+ 所以放在过程步骤里,与工具行同一套排版。 */
1596
+ .pw-step[data-kind="skill"] .pw-line {
1597
+ font-size: var(--piweb-chat-font-s);
1598
+ }
1599
+ .pw-skill-name {
1600
+ font-family: var(--font-mono);
1601
+ color: var(--dsw-accent);
1602
+ overflow: hidden;
1603
+ text-overflow: ellipsis;
1604
+ white-space: nowrap;
2515
1605
  }
2516
1606
 
2517
- /* 消息操作图标行:常显低透明度,悬停变亮(dsh 同款) */
1607
+ /* 消息操作图标行:常显低透明度,悬停变亮,纯净无框 */
2518
1608
  .msg-actions {
2519
- display: flex;
1609
+ display: inline-flex;
2520
1610
  align-items: center;
2521
- gap: 6px;
1611
+ gap: 4px;
2522
1612
  margin-top: 6px;
2523
1613
  opacity: 0.45;
2524
- transition: opacity var(--ds-duration-fast) var(--ds-ease-in-out);
1614
+ transition: opacity 0.2s var(--isx-ease);
2525
1615
  }
2526
1616
  .msg-actions:hover {
2527
1617
  opacity: 1;
@@ -2593,13 +1683,29 @@ body[data-ds-dark-theme] {
2593
1683
  align-items: center;
2594
1684
  justify-content: center;
2595
1685
  color: var(--dsw-label-caption);
1686
+ transition: transform 0.24s var(--isx-ease), color 0.24s var(--isx-ease);
1687
+ }
1688
+ .pw-step:hover .pw-icon {
1689
+ color: var(--dsw-label-primary);
1690
+ transform: scale(1.14);
2596
1691
  }
2597
1692
  .pw-step[data-tone="live"] .pw-icon {
2598
- color: var(--dsw-accent);
2599
- animation: dot-breathe 1.4s ease-in-out infinite;
1693
+ color: var(--dsw-label-primary);
1694
+ animation: isx-icon-pulse 1.8s var(--isx-ease) infinite;
1695
+ }
1696
+ @keyframes isx-icon-pulse {
1697
+ 0%, 100% {
1698
+ transform: scale(1);
1699
+ filter: drop-shadow(0 0 4px rgba(2, 222, 252, 0.4)) drop-shadow(0 0 8px rgba(252, 1, 151, 0.2));
1700
+ }
1701
+ 50% {
1702
+ transform: scale(1.18);
1703
+ filter: drop-shadow(0 0 8px rgba(2, 222, 252, 0.75)) drop-shadow(0 0 16px rgba(252, 1, 151, 0.5));
1704
+ }
2600
1705
  }
2601
1706
  .pw-step[data-tone="fail"] .pw-icon {
2602
1707
  color: var(--dsw-danger);
1708
+ filter: drop-shadow(0 0 6px rgba(226, 22, 42, 0.45));
2603
1709
  }
2604
1710
  .pw-step[data-tone="warn"] .pw-icon {
2605
1711
  color: var(--dsw-warn);
@@ -2612,21 +1718,33 @@ body[data-ds-dark-theme] {
2612
1718
  transform: rotate(360deg);
2613
1719
  }
2614
1720
  }
2615
- /* π 记号:工作指示的图标 */
1721
+ /* π 记号:工作指示的图标(Iconsax 天体律动脉冲) */
2616
1722
  .pw-pi {
1723
+ display: inline-block;
2617
1724
  font-family: var(--font-mono);
2618
1725
  font-size: 15px;
2619
1726
  font-weight: 600;
2620
1727
  line-height: 1;
2621
1728
  transform: translateY(-1px);
2622
- color: var(--dsw-accent);
1729
+ color: var(--dsw-label-primary);
1730
+ animation: isx-pi-glow 2.2s ease-in-out infinite;
1731
+ }
1732
+ @keyframes isx-pi-glow {
1733
+ 0%, 100% {
1734
+ filter: drop-shadow(0 0 2px rgba(2, 222, 252, 0.25));
1735
+ transform: translateY(-1px) scale(1);
1736
+ }
1737
+ 50% {
1738
+ filter: drop-shadow(0 0 8px rgba(2, 222, 252, 0.7)) drop-shadow(0 0 14px rgba(252, 1, 151, 0.4));
1739
+ transform: translateY(-1px) scale(1.12);
1740
+ }
2623
1741
  }
2624
1742
  .pw-body {
2625
1743
  min-width: 0;
2626
1744
  flex: 1;
2627
1745
  }
2628
1746
 
2629
- /* 一行摘要 */
1747
+ /* 一行摘要(Iconsax 折叠行风格:悬停微位移 + 圆角胶囊底 + 箭头旋转) */
2630
1748
  .pw-line {
2631
1749
  display: flex;
2632
1750
  align-items: center;
@@ -2637,17 +1755,23 @@ body[data-ds-dark-theme] {
2637
1755
  color: var(--dsw-label-tertiary);
2638
1756
  }
2639
1757
  button.pw-line {
2640
- width: 100%;
1758
+ width: calc(100% + 12px);
1759
+ margin: 0 -6px;
1760
+ padding: 0 6px;
1761
+ border-radius: 8px;
2641
1762
  text-align: left;
2642
1763
  background: none;
2643
1764
  border: 0;
2644
- padding: 0;
2645
1765
  cursor: pointer;
2646
1766
  font: inherit;
2647
1767
  font-size: var(--piweb-chat-font-m);
1768
+ transition: background 0.22s var(--isx-ease), color 0.22s var(--isx-ease),
1769
+ padding-left 0.22s var(--isx-ease);
2648
1770
  }
2649
1771
  button.pw-line:hover {
2650
- color: var(--dsw-label-secondary);
1772
+ background: var(--dsw-hover);
1773
+ color: var(--dsw-label-primary);
1774
+ padding-left: 10px;
2651
1775
  }
2652
1776
  .pw-verb {
2653
1777
  flex: none;
@@ -2681,10 +1805,14 @@ button.pw-line:hover {
2681
1805
  .pw-line .pw-chev {
2682
1806
  flex: none;
2683
1807
  color: var(--dsw-label-caption);
2684
- transition: transform 120ms var(--ds-ease-in-out, ease);
1808
+ transition: transform 240ms var(--isx-ease), color 200ms var(--isx-ease);
1809
+ }
1810
+ button.pw-line:hover .pw-chev {
1811
+ color: var(--dsw-label-primary);
2685
1812
  }
2686
1813
  .pw-line[aria-expanded="true"] .pw-chev {
2687
1814
  transform: rotate(90deg);
1815
+ color: var(--dsw-label-primary);
2688
1816
  }
2689
1817
  .pw-summary strong {
2690
1818
  font-weight: 600;
@@ -2694,27 +1822,41 @@ button.pw-line:hover {
2694
1822
  margin-left: 4px;
2695
1823
  }
2696
1824
 
2697
- /* 闪光渐变(进行中的思考 / 命令 / 状态词) */
1825
+ .pw-step[data-tone="live"] .pw-arg {
1826
+ color: var(--dsw-label-primary);
1827
+ font-weight: 500;
1828
+ }
1829
+
1830
+ /* 闪光渐变(进行中的思考 / 命令 / 状态词:Iconsax 6 色高反差金属流光) */
2698
1831
  .pw-shimmer {
2699
1832
  flex: none;
2700
- /* DeepSeek 式的蓝色渐变闪光:强调色为底,高光扫过 */
2701
- background: linear-gradient(90deg, var(--dsw-accent) 0%, var(--pw-shimmer-hi) 35%, var(--dsw-accent) 70%);
2702
- background-size: 220% 100%;
1833
+ background: linear-gradient(
1834
+ 90deg,
1835
+ var(--dsw-label-secondary) 0%,
1836
+ var(--dsw-label-primary) 18%,
1837
+ #02defc 38%,
1838
+ #ffffff 50%,
1839
+ #fc0197 62%,
1840
+ var(--dsw-label-primary) 82%,
1841
+ var(--dsw-label-secondary) 100%
1842
+ );
1843
+ background-size: 260% 100%;
2703
1844
  -webkit-background-clip: text;
2704
1845
  background-clip: text;
2705
1846
  color: transparent;
2706
- animation: pw-shimmer 2.2s linear infinite;
1847
+ font-weight: 500;
1848
+ animation: pw-shimmer 2s linear infinite;
2707
1849
  }
2708
1850
  @keyframes pw-shimmer {
2709
1851
  from {
2710
- background-position: 120% 0;
1852
+ background-position: 130% 0;
2711
1853
  }
2712
1854
  to {
2713
- background-position: -100% 0;
1855
+ background-position: -130% 0;
2714
1856
  }
2715
1857
  }
2716
1858
 
2717
- /* 进行中的思考尾巴:两行截断 */
1859
+ /* 进行中的思考尾巴:两行截断(无框无边线) */
2718
1860
  .pw-tail {
2719
1861
  margin: -4px 0 5px;
2720
1862
  font-size: var(--piweb-chat-font-s);
@@ -2774,22 +1916,24 @@ button.pw-line:hover {
2774
1916
  color: var(--dsw-danger);
2775
1917
  }
2776
1918
 
2777
- /* diff 与完整输出 */
1919
+ /* diff 与完整输出(Iconsax 14px 圆角描边面板) */
2778
1920
  .pw-diff {
2779
- margin: -2px 0 6px 20px;
1921
+ margin: 2px 0 8px 20px;
2780
1922
  max-height: 420px;
2781
1923
  overflow: auto;
2782
- border-radius: 10px;
2783
- padding: 6px 8px;
2784
- background: var(--dsw-markdown-code-block, var(--dsw-hover));
1924
+ border-radius: 14px;
1925
+ border: 1px solid var(--dsw-border-l2);
1926
+ padding: 8px 10px;
1927
+ background: var(--dsw-markdown-code-block, var(--dsw-bg-elevated));
2785
1928
  }
2786
1929
  .pw-output {
2787
- margin: 0 0 6px 20px;
1930
+ margin: 2px 0 8px 20px;
2788
1931
  max-height: 360px;
2789
1932
  overflow: auto;
2790
- border-radius: 10px;
2791
- padding: 8px 12px;
2792
- background: var(--dsw-markdown-code-block, var(--dsw-hover));
1933
+ border-radius: 14px;
1934
+ border: 1px solid var(--dsw-border-l2);
1935
+ padding: 10px 14px;
1936
+ background: var(--dsw-markdown-code-block, var(--dsw-bg-elevated));
2793
1937
  font-family: var(--font-mono);
2794
1938
  font-size: var(--piweb-chat-font-t);
2795
1939
  line-height: 1.55;
@@ -2805,7 +1949,7 @@ button.pw-line:hover {
2805
1949
  color: var(--dsw-label-tertiary);
2806
1950
  margin-bottom: 6px;
2807
1951
  padding-bottom: 6px;
2808
- border-bottom: 0.5px solid var(--dsw-border-l2);
1952
+ border-bottom: 1px solid var(--dsw-border-l2);
2809
1953
  white-space: pre-wrap;
2810
1954
  word-break: break-all;
2811
1955
  }
@@ -3159,51 +2303,62 @@ body[data-pebrel-theme="pebrel"][data-ds-dark-theme] {
3159
2303
  项目生长:项目栏 / 项目树 / 时间轴 / 文件查看器 / 整文件 diff
3160
2304
  ============================================================ */
3161
2305
 
3162
- /* 分段开关(本步 / 本会话、变更 / 内容 / 渲染) */
2306
+ /* 分段开关(本步 / 本会话、变更 / 内容 / 渲染:Iconsax 胶囊切换) */
3163
2307
  .pw-seg {
3164
2308
  display: inline-flex;
3165
2309
  flex: none;
3166
2310
  padding: 2px;
3167
- border-radius: 8px;
3168
- background: var(--dsw-hover);
3169
- gap: 1px;
2311
+ border-radius: 10px;
2312
+ border: 1px solid var(--dsw-border-l2);
2313
+ background: var(--dsw-bg-elevated);
2314
+ gap: 2px;
3170
2315
  }
3171
2316
  .pw-seg > button {
3172
2317
  height: 20px;
3173
- padding: 0 8px;
3174
- border-radius: 6px;
2318
+ padding: 0 9px;
2319
+ border-radius: 7px;
3175
2320
  font-size: 11.5px;
3176
2321
  line-height: 20px;
3177
2322
  color: var(--dsw-label-tertiary);
3178
2323
  white-space: nowrap;
3179
- transition: background var(--ds-duration-fast) var(--ds-ease-in-out), color var(--ds-duration-fast) var(--ds-ease-in-out);
2324
+ transition: background 0.22s var(--isx-ease), color 0.22s var(--isx-ease), transform 0.18s var(--isx-ease);
3180
2325
  }
3181
- .pw-seg > button[data-active="true"] {
3182
- background: var(--dsw-bg-elevated);
2326
+ .pw-seg > button:hover:not([data-active="true"]) {
3183
2327
  color: var(--dsw-label-primary);
3184
- box-shadow: 0 0 0 0.5px var(--dsw-border-l2), 0 1px 2px rgba(0, 0, 0, 0.06);
2328
+ background: var(--dsw-hover);
2329
+ }
2330
+ .pw-seg > button[data-active="true"] {
2331
+ background: var(--dsw-label-primary);
2332
+ color: var(--dsw-bg-base);
2333
+ font-weight: 500;
3185
2334
  }
3186
- /* 小胶囊开关(只看变更 / 跟随 / 折叠未改动) */
2335
+ /* 小胶囊开关(只看变更 / 跟随 / 折叠未改动 / 本轮变更徽章) */
3187
2336
  .pw-chip {
3188
2337
  flex: none;
3189
- height: 20px;
3190
- padding: 0 8px;
2338
+ height: 22px;
2339
+ padding: 0 9px;
3191
2340
  border-radius: 999px;
3192
- border: 0.5px solid var(--dsw-border-l3);
2341
+ border: 1px solid var(--dsw-border-l2);
3193
2342
  font-size: 11px;
3194
- line-height: 19px;
3195
- color: var(--dsw-label-tertiary);
2343
+ line-height: 20px;
2344
+ color: var(--dsw-label-secondary);
3196
2345
  white-space: nowrap;
3197
- transition: background var(--ds-duration-fast) var(--ds-ease-in-out), color var(--ds-duration-fast) var(--ds-ease-in-out), border-color var(--ds-duration-fast) var(--ds-ease-in-out);
2346
+ transition: background 0.22s var(--isx-ease), color 0.22s var(--isx-ease),
2347
+ border-color 0.22s var(--isx-ease), transform 0.2s var(--isx-ease);
3198
2348
  }
3199
- .pw-chip:hover {
2349
+ .pw-chip:hover:not(:disabled) {
3200
2350
  background: var(--dsw-hover);
2351
+ border-color: var(--dsw-label-primary);
3201
2352
  color: var(--dsw-label-primary);
2353
+ transform: translateY(-0.5px);
2354
+ }
2355
+ .pw-chip:active:not(:disabled) {
2356
+ transform: scale(0.92);
3202
2357
  }
3203
2358
  .pw-chip[data-active="true"] {
3204
- background: var(--dsw-accent-soft);
3205
- border-color: transparent;
3206
- color: var(--dsw-accent);
2359
+ background: var(--dsw-label-primary);
2360
+ border-color: var(--dsw-label-primary);
2361
+ color: var(--dsw-bg-base);
3207
2362
  }
3208
2363
  .pw-chip:disabled {
3209
2364
  opacity: 0.4;
@@ -3267,6 +2422,70 @@ body[data-pebrel-theme="pebrel"][data-ds-dark-theme] {
3267
2422
  }
3268
2423
  }
3269
2424
 
2425
+ /* 文件牌堆与扇形卡片(多文件折叠与竖直向上弧度展开) */
2426
+ .pw-file-fan-container {
2427
+ position: relative;
2428
+ flex: none;
2429
+ }
2430
+ .pw-file-card {
2431
+ background: var(--dsw-bg-elevated) !important;
2432
+ border: 1px solid var(--dsw-border-l2) !important;
2433
+ border-radius: 10px !important;
2434
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08);
2435
+ transition: transform 320ms cubic-bezier(0.2, 0.8, 0.2, 1), box-shadow 0.2s var(--isx-ease), border-color 0.2s var(--isx-ease);
2436
+ }
2437
+ .pw-file-card:hover,
2438
+ .pw-file-card[data-lifted="true"] {
2439
+ border-color: var(--dsw-border-l3) !important;
2440
+ box-shadow: 0 4px 14px rgba(0, 0, 0, 0.16) !important;
2441
+ }
2442
+ .pw-file-card .pw-ref-close {
2443
+ opacity: 0.6;
2444
+ }
2445
+ .pw-file-card:hover .pw-ref-close,
2446
+ .pw-file-card:focus-within .pw-ref-close {
2447
+ opacity: 1;
2448
+ }
2449
+
2450
+ /* 牌堆与扇形操作按钮(收起/清空:不透明高对比实体胶囊,彻底避免被聊天背景文字穿透) */
2451
+ .pw-deck-action-btn {
2452
+ display: inline-flex;
2453
+ align-items: center;
2454
+ gap: 5px;
2455
+ height: 28px;
2456
+ padding: 0 12px;
2457
+ border-radius: 999px;
2458
+ font-size: 12px;
2459
+ font-weight: 500;
2460
+ color: var(--dsw-label-primary);
2461
+ background: var(--dsw-bg-elevated);
2462
+ border: 1px solid var(--dsw-border-l2);
2463
+ box-shadow: 0 4px 14px rgba(0, 0, 0, 0.22);
2464
+ backdrop-filter: blur(16px);
2465
+ cursor: pointer;
2466
+ white-space: nowrap;
2467
+ transition: all 0.2s var(--isx-ease);
2468
+ }
2469
+ .pw-deck-action-btn:hover:not(:disabled) {
2470
+ background: var(--dsw-label-primary);
2471
+ color: var(--dsw-bg-base);
2472
+ border-color: var(--dsw-label-primary);
2473
+ transform: translateY(-1px);
2474
+ box-shadow: 0 6px 18px rgba(0, 0, 0, 0.28);
2475
+ }
2476
+ .pw-deck-action-btn:active:not(:disabled) {
2477
+ transform: scale(0.94);
2478
+ }
2479
+ .pw-deck-action-btn:disabled {
2480
+ opacity: 0.45;
2481
+ cursor: not-allowed;
2482
+ }
2483
+ .pw-deck-action-btn.pw-deck-action-clear:hover:not(:disabled) {
2484
+ background: rgba(239, 68, 68, 0.15);
2485
+ color: var(--dsw-danger);
2486
+ border-color: rgba(239, 68, 68, 0.35);
2487
+ }
2488
+
3270
2489
  /* 输入卡待发送图片:平铺缩略图 / 牌堆 / 扇形(src/components/composer/ComposerImages.tsx) */
3271
2490
  .pw-image-thumb {
3272
2491
  position: relative;
@@ -3348,6 +2567,22 @@ body[data-pebrel-theme="pebrel"][data-ds-dark-theme] {
3348
2567
  .pw-image-delete:disabled {
3349
2568
  opacity: 0.4;
3350
2569
  }
2570
+ /* 聊天图片可点击,保持原图尺寸和排版;预览与输入附件共用同一套放大预览。 */
2571
+ .pw-chat-image-preview {
2572
+ display: inline-block;
2573
+ max-width: 100%;
2574
+ padding: 0;
2575
+ border: 0;
2576
+ background: transparent;
2577
+ cursor: zoom-in;
2578
+ vertical-align: top;
2579
+ }
2580
+ .pw-chat-image-preview > img { display: block; }
2581
+ .pw-chat-image-preview:focus-visible {
2582
+ outline: 2px solid var(--dsw-accent);
2583
+ outline-offset: 3px;
2584
+ border-radius: 12px;
2585
+ }
3351
2586
  /* 放大预览 */
3352
2587
  .pw-lightbox {
3353
2588
  position: fixed;
@@ -3486,14 +2721,15 @@ body[data-pebrel-theme="pebrel"][data-ds-dark-theme] {
3486
2721
  align-items: center;
3487
2722
  gap: 4px;
3488
2723
  padding-right: 8px;
3489
- border-radius: 6px;
2724
+ border-radius: 8px;
3490
2725
  cursor: pointer;
3491
2726
  white-space: nowrap;
3492
2727
  color: var(--dsw-label-primary);
3493
- transition: background var(--ds-duration-fast) var(--ds-ease-in-out);
2728
+ transition: background 0.18s var(--isx-ease), transform 0.18s var(--isx-ease);
3494
2729
  }
3495
2730
  .pw-tree-row:hover {
3496
2731
  background: var(--dsw-hover);
2732
+ transform: translateX(2px);
3497
2733
  }
3498
2734
  .pw-tree-row[data-selected],
3499
2735
  .pw-tree-row[data-focused] {
@@ -3563,13 +2799,13 @@ body[data-pebrel-theme="pebrel"][data-ds-dark-theme] {
3563
2799
  flex: none;
3564
2800
  min-width: 14px;
3565
2801
  height: 14px;
3566
- padding: 0 3px;
3567
- border-radius: 4px;
3568
- border: 0.5px solid;
2802
+ padding: 0 4px;
2803
+ border-radius: 999px;
2804
+ border: 1px solid;
3569
2805
  font-size: 10px;
3570
- line-height: 13px;
2806
+ line-height: 12px;
3571
2807
  text-align: center;
3572
- font-weight: 600;
2808
+ font-weight: 700;
3573
2809
  font-variant-numeric: tabular-nums;
3574
2810
  }
3575
2811
  .pw-tree-actions {
@@ -3662,12 +2898,13 @@ body[data-pebrel-theme="pebrel"][data-ds-dark-theme] {
3662
2898
  flex: none;
3663
2899
  width: 8px;
3664
2900
  min-height: 3px;
3665
- border-radius: 2px 2px 1px 1px;
3666
- opacity: 0.5;
3667
- transition: opacity var(--ds-duration-fast) var(--ds-ease-in-out);
2901
+ border-radius: 4px 4px 1px 1px;
2902
+ opacity: 0.55;
2903
+ transition: opacity 0.2s var(--isx-ease), transform 0.2s var(--isx-ease), box-shadow 0.2s var(--isx-ease);
3668
2904
  }
3669
2905
  .pw-tl-bar:hover {
3670
- opacity: 0.85;
2906
+ opacity: 0.95;
2907
+ transform: scaleY(1.15);
3671
2908
  }
3672
2909
  .pw-tl-bar[data-active] {
3673
2910
  opacity: 1;