@rexvane/piweb 0.3.16 → 0.3.18

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 (288) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +8 -11
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +6 -6
  5. package/.next/react-loadable-manifest.json +4 -16
  6. package/.next/required-server-files.js +1 -3
  7. package/.next/required-server-files.json +1 -3
  8. package/.next/routes-manifest.json +0 -20
  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 +4 -7
  20. package/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  21. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -5
  22. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  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/config/route.js +1 -1
  32. package/.next/server/app/api/config/route.js.nft.json +1 -1
  33. package/.next/server/app/api/files/route.js +1 -1
  34. package/.next/server/app/api/files/route.js.nft.json +1 -1
  35. package/.next/server/app/api/git/route.js +2 -2
  36. package/.next/server/app/api/git/route.js.nft.json +1 -1
  37. package/.next/server/app/api/growth/route.js +1 -1
  38. package/.next/server/app/api/growth/route.js.nft.json +1 -1
  39. package/.next/server/app/api/health/route.js +1 -1
  40. package/.next/server/app/api/models/route.js +1 -1
  41. package/.next/server/app/api/models/route.js.nft.json +1 -1
  42. package/.next/server/app/api/pi-settings/route.js +1 -1
  43. package/.next/server/app/api/pi-settings/route.js.nft.json +1 -1
  44. package/.next/server/app/api/plugins/route.js +1 -1
  45. package/.next/server/app/api/plugins/route.js.nft.json +1 -1
  46. package/.next/server/app/api/prompts/route.js +1 -1
  47. package/.next/server/app/api/prompts/route.js.nft.json +1 -1
  48. package/.next/server/app/api/security/route.js +1 -1
  49. package/.next/server/app/api/security/route.js.nft.json +1 -1
  50. package/.next/server/app/api/sessions/[id]/export/route.js +1 -1
  51. package/.next/server/app/api/sessions/[id]/export/route.js.nft.json +1 -1
  52. package/.next/server/app/api/sessions/[id]/route.js +1 -1
  53. package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  54. package/.next/server/app/api/sessions/import/route.js +3 -3
  55. package/.next/server/app/api/sessions/import/route.js.nft.json +1 -1
  56. package/.next/server/app/api/sessions/route.js +1 -1
  57. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  58. package/.next/server/app/api/skills/route.js +2 -2
  59. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  60. package/.next/server/app/api/update/route.js +2 -2
  61. package/.next/server/app/api/update/route.js.nft.json +1 -1
  62. package/.next/server/app/api/version/route.js +1 -1
  63. package/.next/server/app/api/version/route.js.nft.json +1 -1
  64. package/.next/server/app/api/web-auth/route.js +1 -1
  65. package/.next/server/app/api/workspaces/route.js +1 -1
  66. package/.next/server/app/api/workspaces/route.js.nft.json +1 -1
  67. package/.next/server/app/icon.svg/route.js +1 -1
  68. package/.next/server/app/index.html +1 -1
  69. package/.next/server/app/index.rsc +6 -9
  70. package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -7
  71. package/.next/server/app/index.segments/_full.segment.rsc +6 -9
  72. package/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  73. package/.next/server/app/login/page.js +1 -1
  74. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  75. package/.next/server/app/login.html +1 -1
  76. package/.next/server/app/login.rsc +5 -8
  77. package/.next/server/app/login.segments/_full.segment.rsc +5 -8
  78. package/.next/server/app/login.segments/_tree.segment.rsc +2 -5
  79. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +3 -6
  80. package/.next/server/app/page.js +1 -1
  81. package/.next/server/app/page_client-reference-manifest.js +1 -1
  82. package/.next/server/app-paths-manifest.json +8 -11
  83. package/.next/server/chunks/496.js +1 -1
  84. package/.next/server/chunks/532.js +1 -1
  85. package/.next/server/chunks/686.js +4 -8
  86. package/.next/server/middleware-build-manifest.js +1 -1
  87. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  88. package/.next/server/pages/404.html +1 -1
  89. package/.next/server/pages/500.html +1 -1
  90. package/.next/server/server-reference-manifest.json +1 -1
  91. package/.next/static/chunks/2608.ec8ff1f5767c9056.js +1 -0
  92. package/.next/static/chunks/2716.93be8ad5c970c516.js +1 -0
  93. package/.next/static/chunks/4632.112d2e893d48d188.js +1 -0
  94. package/.next/static/chunks/4673.c1fb1580efc6ace7.js +1 -0
  95. package/.next/static/chunks/4686-f4a037d609cea3f2.js +1 -0
  96. package/.next/static/chunks/app/_global-error/page-f77e9ede9808b18e.js +1 -0
  97. package/.next/static/chunks/app/api/agent/[id]/events/route-f77e9ede9808b18e.js +1 -0
  98. package/.next/static/chunks/app/api/agent/[id]/route-f77e9ede9808b18e.js +1 -0
  99. package/.next/static/chunks/app/api/agent/[id]/tree/route-f77e9ede9808b18e.js +1 -0
  100. package/.next/static/chunks/app/api/agent/new/route-f77e9ede9808b18e.js +1 -0
  101. package/.next/static/chunks/app/api/config/route-f77e9ede9808b18e.js +1 -0
  102. package/.next/static/chunks/app/api/files/route-f77e9ede9808b18e.js +1 -0
  103. package/.next/static/chunks/app/api/git/route-f77e9ede9808b18e.js +1 -0
  104. package/.next/static/chunks/app/api/growth/route-f77e9ede9808b18e.js +1 -0
  105. package/.next/static/chunks/app/api/health/route-f77e9ede9808b18e.js +1 -0
  106. package/.next/static/chunks/app/api/models/route-f77e9ede9808b18e.js +1 -0
  107. package/.next/static/chunks/app/api/pi-settings/route-f77e9ede9808b18e.js +1 -0
  108. package/.next/static/chunks/app/api/plugins/route-f77e9ede9808b18e.js +1 -0
  109. package/.next/static/chunks/app/api/prompts/route-f77e9ede9808b18e.js +1 -0
  110. package/.next/static/chunks/app/api/security/route-f77e9ede9808b18e.js +1 -0
  111. package/.next/static/chunks/app/api/sessions/[id]/export/route-f77e9ede9808b18e.js +1 -0
  112. package/.next/static/chunks/app/api/sessions/[id]/route-f77e9ede9808b18e.js +1 -0
  113. package/.next/static/chunks/app/api/sessions/import/route-f77e9ede9808b18e.js +1 -0
  114. package/.next/static/chunks/app/api/sessions/route-f77e9ede9808b18e.js +1 -0
  115. package/.next/static/chunks/app/api/skills/route-f77e9ede9808b18e.js +1 -0
  116. package/.next/static/chunks/app/api/update/route-f77e9ede9808b18e.js +1 -0
  117. package/.next/static/chunks/app/api/version/route-f77e9ede9808b18e.js +1 -0
  118. package/.next/static/chunks/app/api/web-auth/route-f77e9ede9808b18e.js +1 -0
  119. package/.next/static/chunks/app/api/workspaces/route-f77e9ede9808b18e.js +1 -0
  120. package/.next/static/chunks/app/page-b51087831582ee37.js +1 -0
  121. package/.next/static/chunks/next/dist/client/components/builtin/app-error-f77e9ede9808b18e.js +1 -0
  122. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-f77e9ede9808b18e.js +1 -0
  123. package/.next/static/chunks/next/dist/client/components/builtin/not-found-f77e9ede9808b18e.js +1 -0
  124. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-f77e9ede9808b18e.js +1 -0
  125. package/.next/static/chunks/webpack-c31263fd83d75ce6.js +1 -0
  126. package/.next/static/css/0cd968b9b62035b5.css +1 -0
  127. package/.next/static/en03hnPiuro0rnf8QkFEe/_buildManifest.js +1 -0
  128. package/.next/types/routes.d.ts +1 -4
  129. package/.next/types/validator.ts +0 -27
  130. package/README.md +17 -29
  131. package/assets/archive.jpg +0 -0
  132. package/assets/growth-1.jpg +0 -0
  133. package/assets/growth-2.jpg +0 -0
  134. package/assets/import.jpg +0 -0
  135. package/assets/main.jpg +0 -0
  136. package/assets/outline.jpg +0 -0
  137. package/assets/prompts-1.jpg +0 -0
  138. package/assets/prompts-2.jpg +0 -0
  139. package/assets/providers-1.jpg +0 -0
  140. package/assets/providers-2.jpg +0 -0
  141. package/assets/providers-3.jpg +0 -0
  142. package/assets/trace-1.jpg +0 -0
  143. package/assets/trace-2.png +0 -0
  144. package/assets/trace-3.png +0 -0
  145. package/assets/trace-4.png +0 -0
  146. package/assets/viewer-1.jpg +0 -0
  147. package/assets/viewer-2.jpg +0 -0
  148. package/bin/pi.js +50 -0
  149. package/next.config.ts +32 -7
  150. package/package.json +4 -9
  151. package/scripts/launcher.mjs +1 -1
  152. package/scripts/pick-folder.ps1 +2 -11
  153. package/scripts/release.mjs +31 -11
  154. package/scripts/verify-package.mjs +0 -53
  155. package/src/app/api/config/route.ts +1 -4
  156. package/src/app/api/growth/route.ts +14 -14
  157. package/src/app/api/models/route.ts +2 -1
  158. package/src/app/api/security/route.ts +3 -8
  159. package/src/app/api/update/route.ts +2 -8
  160. package/src/app/globals.css +92 -777
  161. package/src/app/layout.tsx +6 -13
  162. package/src/components/AppShell.tsx +229 -521
  163. package/src/components/ChatInput.tsx +26 -153
  164. package/src/components/ChatWindow.tsx +231 -51
  165. package/src/components/ContextMeter.tsx +17 -11
  166. package/src/components/FileViewer.tsx +11 -10
  167. package/src/components/GitPanel.tsx +11 -13
  168. package/src/components/ModelSelector.tsx +6 -19
  169. package/src/components/PiMark.tsx +38 -5
  170. package/src/components/ProjectPanel.tsx +111 -95
  171. package/src/components/PromptPanel.tsx +51 -132
  172. package/src/components/SessionImportSection.tsx +37 -53
  173. package/src/components/SessionSidebar.tsx +57 -159
  174. package/src/components/SettingsPanel.tsx +193 -330
  175. package/src/components/icons.tsx +0 -23
  176. package/src/hooks/useGrowth.ts +123 -156
  177. package/src/hooks/usePiWeb.ts +15 -122
  178. package/src/i18n.tsx +42 -98
  179. package/src/lib/agent-manager.ts +21 -187
  180. package/src/lib/command-validation.ts +1 -9
  181. package/src/lib/growth-service.ts +390 -166
  182. package/src/lib/growth-tracker.ts +64 -264
  183. package/src/lib/growth-turns.ts +31 -1
  184. package/src/lib/models/model-scope.ts +15 -0
  185. package/src/lib/models-service.ts +16 -0
  186. package/src/lib/pi-settings.ts +7 -0
  187. package/src/lib/pi.ts +2 -3
  188. package/src/lib/session-import/claude.ts +2 -13
  189. package/src/lib/session-import/codex.ts +8 -44
  190. package/src/lib/session-import/files.ts +0 -14
  191. package/src/lib/session-import/grok.ts +24 -54
  192. package/src/lib/session-import/index.ts +0 -5
  193. package/src/lib/session-import/types.ts +0 -12
  194. package/src/lib/session-import/writer.ts +3 -8
  195. package/src/lib/skills-service.ts +9 -16
  196. package/src/lib/theme.ts +1 -68
  197. package/src/lib/trajectory.ts +0 -1
  198. package/src/lib/types.ts +27 -36
  199. package/tsconfig.json +2 -1
  200. package/.next/server/app/api/swarm/[id]/route.js +0 -1
  201. package/.next/server/app/api/swarm/[id]/route.js.nft.json +0 -1
  202. package/.next/server/app/api/swarm/[id]/route_client-reference-manifest.js +0 -1
  203. package/.next/server/app/api/swarm/route.js +0 -1
  204. package/.next/server/app/api/swarm/route.js.nft.json +0 -1
  205. package/.next/server/app/api/swarm/route_client-reference-manifest.js +0 -1
  206. package/.next/server/app/api/tests/route.js +0 -2
  207. package/.next/server/app/api/tests/route.js.nft.json +0 -1
  208. package/.next/server/app/api/tests/route_client-reference-manifest.js +0 -1
  209. package/.next/server/chunks/757.js +0 -1
  210. package/.next/server/chunks/775.js +0 -3
  211. package/.next/static/0t1jBUAuVaTFTXxRyIo3q/_buildManifest.js +0 -1
  212. package/.next/static/chunks/2608.43c58236c9cce8e6.js +0 -1
  213. package/.next/static/chunks/2716.4ec42df1d51354c9.js +0 -1
  214. package/.next/static/chunks/4632.62139b565b657aac.js +0 -1
  215. package/.next/static/chunks/4673.7796104395deb8d7.js +0 -1
  216. package/.next/static/chunks/4686-17f21a006739a596.js +0 -1
  217. package/.next/static/chunks/7577.10af9bb661652da8.js +0 -1
  218. package/.next/static/chunks/8866.38ec4ac4ee5a1b74.js +0 -1
  219. package/.next/static/chunks/app/_global-error/page-5148173b3f55e415.js +0 -1
  220. package/.next/static/chunks/app/api/agent/[id]/events/route-5148173b3f55e415.js +0 -1
  221. package/.next/static/chunks/app/api/agent/[id]/route-5148173b3f55e415.js +0 -1
  222. package/.next/static/chunks/app/api/agent/[id]/tree/route-5148173b3f55e415.js +0 -1
  223. package/.next/static/chunks/app/api/agent/new/route-5148173b3f55e415.js +0 -1
  224. package/.next/static/chunks/app/api/config/route-5148173b3f55e415.js +0 -1
  225. package/.next/static/chunks/app/api/files/route-5148173b3f55e415.js +0 -1
  226. package/.next/static/chunks/app/api/git/route-5148173b3f55e415.js +0 -1
  227. package/.next/static/chunks/app/api/growth/route-5148173b3f55e415.js +0 -1
  228. package/.next/static/chunks/app/api/health/route-5148173b3f55e415.js +0 -1
  229. package/.next/static/chunks/app/api/models/route-5148173b3f55e415.js +0 -1
  230. package/.next/static/chunks/app/api/pi-settings/route-5148173b3f55e415.js +0 -1
  231. package/.next/static/chunks/app/api/plugins/route-5148173b3f55e415.js +0 -1
  232. package/.next/static/chunks/app/api/prompts/route-5148173b3f55e415.js +0 -1
  233. package/.next/static/chunks/app/api/security/route-5148173b3f55e415.js +0 -1
  234. package/.next/static/chunks/app/api/sessions/[id]/export/route-5148173b3f55e415.js +0 -1
  235. package/.next/static/chunks/app/api/sessions/[id]/route-5148173b3f55e415.js +0 -1
  236. package/.next/static/chunks/app/api/sessions/import/route-5148173b3f55e415.js +0 -1
  237. package/.next/static/chunks/app/api/sessions/route-5148173b3f55e415.js +0 -1
  238. package/.next/static/chunks/app/api/skills/route-5148173b3f55e415.js +0 -1
  239. package/.next/static/chunks/app/api/swarm/[id]/route-5148173b3f55e415.js +0 -1
  240. package/.next/static/chunks/app/api/swarm/route-5148173b3f55e415.js +0 -1
  241. package/.next/static/chunks/app/api/tests/route-5148173b3f55e415.js +0 -1
  242. package/.next/static/chunks/app/api/update/route-5148173b3f55e415.js +0 -1
  243. package/.next/static/chunks/app/api/version/route-5148173b3f55e415.js +0 -1
  244. package/.next/static/chunks/app/api/web-auth/route-5148173b3f55e415.js +0 -1
  245. package/.next/static/chunks/app/api/workspaces/route-5148173b3f55e415.js +0 -1
  246. package/.next/static/chunks/app/page-14379b8060d5cf07.js +0 -1
  247. package/.next/static/chunks/next/dist/client/components/builtin/app-error-5148173b3f55e415.js +0 -1
  248. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-5148173b3f55e415.js +0 -1
  249. package/.next/static/chunks/next/dist/client/components/builtin/not-found-5148173b3f55e415.js +0 -1
  250. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-5148173b3f55e415.js +0 -1
  251. package/.next/static/chunks/webpack-d1a69ad9edb38b11.js +0 -1
  252. package/.next/static/css/d0a0162cb481abe8.css +0 -1
  253. package/.next/types/app/api/swarm/[id]/route.ts +0 -353
  254. package/.next/types/app/api/swarm/route.ts +0 -353
  255. package/.next/types/app/api/tests/route.ts +0 -353
  256. package/assets/archive.png +0 -0
  257. package/assets/growth-1.png +0 -0
  258. package/assets/growth-2.png +0 -0
  259. package/assets/import.png +0 -0
  260. package/assets/main.png +0 -0
  261. package/assets/outline.png +0 -0
  262. package/assets/prompts-1.png +0 -0
  263. package/assets/prompts-2.png +0 -0
  264. package/assets/providers-1.png +0 -0
  265. package/assets/providers-2.png +0 -0
  266. package/assets/providers-3.png +0 -0
  267. package/assets/trace-1.png +0 -0
  268. package/assets/viewer-1.png +0 -0
  269. package/assets/viewer-2.png +0 -0
  270. package/scripts/managed-niubash-assets.mjs +0 -146
  271. package/scripts/prepare-niubash-packages.mjs +0 -182
  272. package/scripts/run-test-file.mjs +0 -34
  273. package/scripts/smoke-managed-niubash.mjs +0 -62
  274. package/scripts/verify-release-config.mjs +0 -24
  275. package/src/app/api/swarm/[id]/route.ts +0 -28
  276. package/src/app/api/swarm/route.ts +0 -24
  277. package/src/app/api/tests/route.ts +0 -27
  278. package/src/components/SwarmCoordinatorPod.tsx +0 -1021
  279. package/src/components/TestInspectorPod.tsx +0 -549
  280. package/src/lib/delegation.ts +0 -93
  281. package/src/lib/growth-rounds.ts +0 -84
  282. package/src/lib/managed-niubash.ts +0 -231
  283. package/src/lib/runtime-activity.ts +0 -27
  284. package/src/lib/session-import/lock.ts +0 -25
  285. package/src/lib/swarm-service.ts +0 -371
  286. package/src/lib/test-run-service.ts +0 -122
  287. package/src/lib/workflow.ts +0 -55
  288. /package/.next/static/{0t1jBUAuVaTFTXxRyIo3q → en03hnPiuro0rnf8QkFEe}/_ssgManifest.js +0 -0
@@ -1,7 +1,5 @@
1
1
  @import "tailwindcss";
2
2
 
3
- @custom-variant dark (&:where([data-ds-dark-theme], [data-ds-dark-theme] *, .dark, .dark *));
4
-
5
3
  /* ============================================================
6
4
  Pi Web 视觉令牌
7
5
  浅色默认,深色用 body[data-ds-dark-theme]
@@ -223,11 +221,49 @@ textarea::placeholder {
223
221
  }
224
222
  }
225
223
 
224
+ .piweb-conversation-width-handle {
225
+ position: absolute;
226
+ top: 0;
227
+ bottom: 0;
228
+ z-index: 3;
229
+ width: 12px;
230
+ cursor: col-resize;
231
+ touch-action: none;
232
+ }
233
+ .piweb-conversation-width-handle[data-side="left"] {
234
+ left: calc(50% - var(--dsh-chat-content-width) / 2 - 20px);
235
+ }
236
+ .piweb-conversation-width-handle[data-side="right"] {
237
+ right: calc(50% - var(--dsh-chat-content-width) / 2 - 20px);
238
+ }
239
+ .piweb-conversation-width-handle::after {
240
+ content: "";
241
+ position: absolute;
242
+ /* 常显的中间一小段:整条全高竖线会读成边框/分隔线,短抓手才读成"可拖"。
243
+ 热区仍是 12px 全高(cursor: col-resize),手感不受影响。 */
244
+ top: 35%;
245
+ bottom: 35%;
246
+ left: 5px;
247
+ width: 2px;
248
+ border-radius: 2px;
249
+ background: var(--dsw-border-l3);
250
+ opacity: 0.3;
251
+ transition: opacity var(--ds-duration-fast);
252
+ }
253
+ .piweb-conversation-width-handle:hover::after,
254
+ .piweb-conversation-width-handle[data-dragging]::after,
255
+ .piweb-conversation-width-handle:focus-visible::after {
256
+ opacity: 1;
257
+ }
258
+
226
259
  @media (max-width: 840px) {
227
260
  :root {
228
261
  --dsh-chat-content-width: 100%;
229
262
  --dsh-composer-card-max-width: 100%;
230
263
  }
264
+ .piweb-conversation-width-handle {
265
+ display: none;
266
+ }
231
267
 
232
268
  .pi-main > .hairline-b {
233
269
  padding-left: 56px;
@@ -258,14 +294,6 @@ textarea::placeholder {
258
294
  .settings-title {
259
295
  display: none;
260
296
  }
261
-
262
- .settings-row { flex-direction: column; align-items: stretch; gap: 10px; }
263
- .settings-row-control { min-width: 0; }
264
- .settings-row-control > .flex { flex-wrap: wrap; }
265
- .settings-theme-grid, .settings-appearance-mode-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }
266
- .settings-theme-grid > button { min-width: 0; padding: 10px 6px !important; border-radius: 12px !important; }
267
- .settings-theme-grid > button:last-child:nth-child(odd) { grid-column: span 2; }
268
- .settings-appearance-mode-grid > button { min-width: 0; padding: 10px 6px !important; border-radius: 12px !important; }
269
297
  }
270
298
 
271
299
  /* 滚动条 */
@@ -749,6 +777,18 @@ textarea::placeholder {
749
777
  font-size: 13px;
750
778
  line-height: 1.55;
751
779
  }
780
+ .md-code-block {
781
+ position: relative;
782
+ }
783
+ .md-code-copy {
784
+ position: absolute;
785
+ top: 12px;
786
+ right: 12px;
787
+ z-index: 1;
788
+ }
789
+ .md-code-block pre {
790
+ padding-top: 40px;
791
+ }
752
792
  .md table {
753
793
  border-collapse: collapse;
754
794
  margin: 0.7em 0;
@@ -897,36 +937,6 @@ body[data-ds-dark-theme] {
897
937
  font-size: var(--piweb-chat-font-size);
898
938
  line-height: 1.65;
899
939
  }
900
- .pw-user-message-clickable { cursor: text; transition: box-shadow 140ms ease; }
901
- .pw-user-message-clickable:hover { box-shadow: inset 0 0 0 1px var(--dsw-border-l2); }
902
- .pw-user-editor {
903
- display: block;
904
- width: 85%;
905
- padding: 10px 12px 8px;
906
- box-shadow: inset 0 0 0 1px var(--dsw-border-l2);
907
- }
908
- .pw-user-editor-input {
909
- display: block;
910
- width: 100%;
911
- min-height: 28px;
912
- max-height: 320px;
913
- resize: none;
914
- border: 0;
915
- outline: 0;
916
- background: transparent;
917
- color: var(--dsw-label-primary);
918
- font: inherit;
919
- line-height: inherit;
920
- overflow-y: auto;
921
- }
922
- .pw-user-editor-actions { display: flex; justify-content: flex-end; gap: 6px; margin-top: 5px; }
923
- .pw-user-editor-actions button { display: grid; width: 26px; height: 26px; place-items: center; border-radius: 50%; }
924
- .pw-user-editor-cancel { color: var(--dsw-label-secondary); }
925
- .pw-user-editor-cancel:hover { background: var(--dsw-hover); color: var(--dsw-label-primary); }
926
- .pw-user-editor-send { background: var(--dsw-label-primary); color: var(--dsw-bg-base); }
927
- .pw-user-editor-send:hover:not(:disabled) { opacity: .82; }
928
- .pw-user-editor-send:disabled { opacity: .45; cursor: not-allowed; }
929
- .pw-user-editor-actions button:focus-visible { outline: 2px solid var(--dsw-accent); outline-offset: 2px; }
930
940
 
931
941
  /* 消息操作图标行:常显低透明度,悬停变亮(dsh 同款) */
932
942
  .msg-actions {
@@ -1809,6 +1819,48 @@ body[data-pebrel-theme="pebrel"][data-ds-dark-theme] {
1809
1819
  .pw-timeline {
1810
1820
  flex: none;
1811
1821
  }
1822
+ /* 生长时间轴:每轮一根柱,底对齐,超出横向滚动;高度由内联样式给(= 改动行数) */
1823
+ .pw-tl-rail {
1824
+ display: flex;
1825
+ align-items: flex-end;
1826
+ gap: 3px;
1827
+ height: 34px;
1828
+ padding: 6px 10px 2px;
1829
+ overflow-x: auto;
1830
+ scrollbar-width: none;
1831
+ }
1832
+ .pw-tl-rail::-webkit-scrollbar {
1833
+ display: none;
1834
+ }
1835
+ .pw-tl-bar {
1836
+ flex: none;
1837
+ width: 8px;
1838
+ min-height: 3px;
1839
+ border-radius: 2px 2px 1px 1px;
1840
+ opacity: 0.5;
1841
+ transition: opacity var(--ds-duration-fast) var(--ds-ease-in-out);
1842
+ }
1843
+ .pw-tl-bar:hover {
1844
+ opacity: 0.85;
1845
+ }
1846
+ .pw-tl-bar[data-active] {
1847
+ opacity: 1;
1848
+ box-shadow: 0 0 0 1px var(--dsw-sidebar-fill), 0 0 0 2px var(--dsw-label-secondary);
1849
+ }
1850
+ .pw-tl-bar[data-kind="user"] {
1851
+ width: 4px;
1852
+ }
1853
+ .pw-tl-bar[data-running] {
1854
+ height: 14px;
1855
+ border: 1px dashed var(--dsw-label-caption);
1856
+ background: transparent;
1857
+ animation: pw-tl-breathe 1.6s var(--ds-ease-in-out) infinite;
1858
+ }
1859
+ @keyframes pw-tl-breathe {
1860
+ 50% {
1861
+ opacity: 0.2;
1862
+ }
1863
+ }
1812
1864
 
1813
1865
  /* 文件查看器:80vw × 80vh 居中,全屏切 100% */
1814
1866
  .pw-viewer {
@@ -2077,740 +2129,3 @@ body[data-pebrel-theme="pebrel"][data-ds-dark-theme] {
2077
2129
  border-radius: 0;
2078
2130
  }
2079
2131
  }
2080
-
2081
- .pw-workflow-add {
2082
- display: grid;
2083
- width: 29px;
2084
- height: 29px;
2085
- flex: none;
2086
- place-items: center;
2087
- border-radius: 50%;
2088
- background: var(--dsw-hover);
2089
- color: var(--dsw-label-secondary);
2090
- transition: background 140ms ease, color 140ms ease, transform 140ms ease;
2091
- }
2092
- .pw-workflow-add:hover:not(:disabled),
2093
- .pw-workflow-add[aria-expanded="true"] { background: var(--dsw-btn-elevated); color: var(--dsw-label-primary); }
2094
- .pw-workflow-add[aria-expanded="true"] .pw-workflow-plus { transform: rotate(45deg); }
2095
- .pw-workflow-add:focus-visible,
2096
- .pw-workflow-option:focus-visible { outline: 2px solid var(--dsw-accent); outline-offset: 2px; }
2097
- .pw-workflow-add:disabled { opacity: .55; cursor: not-allowed; }
2098
- .pw-workflow-plus { position: relative; width: 14px; height: 14px; transition: transform 140ms ease; }
2099
- .pw-workflow-plus::before,
2100
- .pw-workflow-plus::after {
2101
- position: absolute;
2102
- top: 6px;
2103
- left: 1px;
2104
- width: 12px;
2105
- height: 1.5px;
2106
- border-radius: 1px;
2107
- background: currentColor;
2108
- content: "";
2109
- }
2110
- .pw-workflow-plus::after { transform: rotate(90deg); }
2111
- .pw-workflow-current {
2112
- display: inline-flex;
2113
- align-items: center;
2114
- gap: 5px;
2115
- height: 25px;
2116
- padding: 0 4px 0 7px;
2117
- border: 1px solid color-mix(in srgb, var(--pw-mode-color) 30%, transparent);
2118
- border-radius: 8px;
2119
- background: color-mix(in srgb, var(--pw-mode-color) 12%, transparent);
2120
- color: var(--pw-mode-color);
2121
- font-size: 11.5px;
2122
- font-weight: 600;
2123
- }
2124
- .pw-workflow-current[data-mode="plan"] { --pw-mode-color: var(--dsw-warn); }
2125
- .pw-workflow-current[data-mode="goal"] { --pw-mode-color: var(--dsw-accent); }
2126
- .pw-workflow-current-icon { display: grid; place-items: center; }
2127
- .pw-workflow-current-dismiss {
2128
- display: grid;
2129
- width: 17px;
2130
- height: 17px;
2131
- place-items: center;
2132
- border-radius: 4px;
2133
- color: inherit;
2134
- font-size: 17px;
2135
- font-weight: 400;
2136
- line-height: 1;
2137
- }
2138
- .pw-workflow-current-dismiss:hover:not(:disabled) { background: color-mix(in srgb, var(--pw-mode-color) 20%, transparent); }
2139
- .pw-workflow-current-dismiss:disabled { opacity: .5; cursor: not-allowed; }
2140
- .pw-workflow-current-dismiss:focus-visible { outline: 2px solid var(--pw-mode-color); outline-offset: 2px; }
2141
- .pw-workflow-menu {
2142
- position: absolute;
2143
- bottom: calc(100% + 9px);
2144
- left: 0;
2145
- z-index: 70;
2146
- width: min(380px, calc(100vw - 32px));
2147
- padding: 6px;
2148
- border-radius: 14px;
2149
- }
2150
- .pw-workflow-menu-label {
2151
- padding: 5px 8px 8px;
2152
- color: var(--dsw-label-tertiary);
2153
- font-size: 10.5px;
2154
- font-weight: 600;
2155
- letter-spacing: .03em;
2156
- }
2157
- .pw-workflow-option {
2158
- display: grid;
2159
- grid-template-columns: 18px max-content minmax(0, 1fr) 14px;
2160
- align-items: center;
2161
- gap: 9px;
2162
- width: 100%;
2163
- min-height: 37px;
2164
- padding: 0 8px;
2165
- border-radius: 7px;
2166
- text-align: left;
2167
- transition: background 140ms ease;
2168
- }
2169
- .pw-workflow-option[data-mode="agent"] { --pw-mode-color: var(--dsw-label-tertiary); }
2170
- .pw-workflow-option[data-mode="plan"] { --pw-mode-color: var(--dsw-warn); }
2171
- .pw-workflow-option[data-mode="goal"] { --pw-mode-color: var(--dsw-accent); }
2172
- .pw-workflow-option:hover,
2173
- .pw-workflow-option[aria-checked="true"] { background: var(--dsw-hover); }
2174
- .pw-workflow-option-icon { display: grid; width: 18px; place-items: center; color: var(--pw-mode-color); }
2175
- .pw-workflow-option-name { color: var(--dsw-label-primary); font-size: 12.5px; font-weight: 600; white-space: nowrap; }
2176
- .pw-workflow-option-description { overflow: hidden; color: var(--dsw-label-tertiary); font-size: 11.5px; text-overflow: ellipsis; white-space: nowrap; }
2177
- .pw-workflow-option-check { color: var(--dsw-label-secondary); visibility: hidden; }
2178
- .pw-workflow-option[aria-checked="true"] .pw-workflow-option-check { visibility: visible; }
2179
- .pw-plan-ready {
2180
- display: grid;
2181
- grid-template-columns: minmax(0, 1fr) auto;
2182
- align-items: center;
2183
- gap: 8px 12px;
2184
- margin: 0 0 9px;
2185
- padding: 10px 11px;
2186
- border: 1px solid color-mix(in srgb, var(--dsw-warn) 30%, var(--dsw-border-l2));
2187
- border-radius: 15px;
2188
- background: color-mix(in srgb, var(--dsw-warn) 5%, var(--dsw-bg-elevated));
2189
- animation: pw-mode-enter 220ms cubic-bezier(.2,.7,.2,1) both;
2190
- }
2191
- .pw-plan-ready-content { display: flex; align-items: center; gap: 9px; min-width: 0; }
2192
- .pw-plan-ready-icon {
2193
- display: grid;
2194
- flex: none;
2195
- place-items: center;
2196
- width: 29px;
2197
- height: 29px;
2198
- border-radius: 9px;
2199
- background: color-mix(in srgb, var(--dsw-warn) 13%, transparent);
2200
- color: var(--dsw-warn);
2201
- }
2202
- .pw-plan-ready-copy { display: grid; gap: 2px; min-width: 0; }
2203
- .pw-plan-ready-copy strong { color: var(--dsw-label-primary); font-size: 12px; font-weight: 650; line-height: 1.25; }
2204
- .pw-plan-ready-copy > span { color: var(--dsw-label-tertiary); font-size: 11px; line-height: 1.3; }
2205
- .pw-plan-ready-actions { display: flex; align-items: center; gap: 5px; }
2206
- .pw-plan-ready-actions button { flex: none; min-height: 28px; padding: 5px 9px; border-radius: 9px; font-size: 11.5px; font-weight: 600; white-space: nowrap; }
2207
- .pw-plan-ready-refine { color: var(--dsw-label-secondary); }
2208
- .pw-plan-ready-refine:hover:not(:disabled) { background: var(--dsw-hover); color: var(--dsw-label-primary); }
2209
- .pw-plan-ready-approve {
2210
- display: inline-flex;
2211
- align-items: center;
2212
- gap: 2px;
2213
- background: var(--dsw-accent);
2214
- color: white;
2215
- }
2216
- .pw-plan-ready-approve:hover:not(:disabled) { filter: brightness(1.08); }
2217
- .pw-plan-ready-actions button:disabled { opacity: .55; cursor: not-allowed; }
2218
- .pw-plan-ready-actions button:focus-visible { outline: 2px solid var(--dsw-accent); outline-offset: 2px; }
2219
- .pw-plan-ready-error { grid-column: 1 / -1; margin: 0 0 0 38px; color: var(--dsw-danger); font-size: 11px; }
2220
- .pw-goal-active {
2221
- display: flex;
2222
- align-items: center;
2223
- gap: 6px;
2224
- min-width: 0;
2225
- margin: 0 3px 7px;
2226
- color: var(--dsw-accent);
2227
- font-size: 11.5px;
2228
- }
2229
- .pw-goal-active svg { flex: none; }
2230
- .pw-goal-active-label { flex: none; font-weight: 600; }
2231
- .pw-goal-active-text { overflow: hidden; color: var(--dsw-label-tertiary); text-overflow: ellipsis; white-space: nowrap; }
2232
- @media (max-width: 560px) {
2233
- .pw-plan-ready { grid-template-columns: minmax(0, 1fr); }
2234
- .pw-plan-ready-actions { justify-content: flex-end; }
2235
- }
2236
-
2237
- /* PiWeb workbench skin. Legacy --dsw tokens remain adapters for existing panels. */
2238
- html[data-pebrel-theme="piweb"],
2239
- body[data-pebrel-theme="piweb"] {
2240
- --dsw-bg-base: #f2f5ee;
2241
- --dsw-bg-elevated: #fbfcf8;
2242
- --dsw-sidebar-fill: #e8eee7;
2243
- --dsw-input-major: #fcfdf9;
2244
- --dsw-bubble: #e4f0e9;
2245
- --dsw-hover: rgba(42, 99, 75, .08);
2246
- --dsw-active: rgba(42, 99, 75, .13);
2247
- --dsw-label-primary: #1c2a25;
2248
- --dsw-label-secondary: #43564c;
2249
- --dsw-label-tertiary: #6d8074;
2250
- --dsw-label-caption: #8b9b90;
2251
- --dsw-border-l1: rgba(37, 70, 52, .07);
2252
- --dsw-border-l2: rgba(37, 70, 52, .14);
2253
- --dsw-border-l3: rgba(37, 70, 52, .19);
2254
- --dsw-border-l4: rgba(37, 70, 52, .25);
2255
- --dsw-accent: #2e8067;
2256
- --dsw-accent-soft: rgba(46, 128, 103, .12);
2257
- --dsw-warn: #ac7136;
2258
- --dsw-success: #288067;
2259
- --dsw-danger: #b7504a;
2260
- --dsw-selector: rgba(43, 89, 62, .09);
2261
- --dsw-layer-2: #f5f8f2;
2262
- --dsw-layer-3: #ecf2ea;
2263
- --dsw-btn-elevated: #f7faf5;
2264
- --dsw-btn-floating-hover: #edf4ed;
2265
- --dsw-module-platform: #e8efe8;
2266
- --dsw-border-strong: #729b82;
2267
- --dsw-glass-popover: #fbfdf8;
2268
- --dsw-glass-input: #f7faf5;
2269
- --dsw-glass-modal: #f9fbf7;
2270
- --dsw-elevation-stroke: rgba(37, 70, 52, .14);
2271
- --dsw-elevation-soft: 0 0 0 1px var(--dsw-elevation-stroke), 0 14px 30px rgba(37, 70, 52, .08);
2272
- --dsw-elevation-panel: 0 0 0 1px var(--dsw-elevation-stroke), 0 18px 42px rgba(37, 70, 52, .12);
2273
- --dsw-elevation-prominent: 0 0 0 1px var(--dsw-elevation-stroke), 0 24px 56px rgba(37, 70, 52, .18);
2274
- }
2275
-
2276
- @media (prefers-color-scheme: dark) {
2277
- html[data-pebrel-theme="piweb"]:not([data-ds-light-theme]),
2278
- body[data-pebrel-theme="piweb"]:not([data-ds-light-theme]) {
2279
- --dsw-bg-base: #101816;
2280
- --dsw-bg-elevated: #17221e;
2281
- --dsw-sidebar-fill: #121d19;
2282
- --dsw-input-major: #1b2924;
2283
- --dsw-bubble: #20362c;
2284
- --dsw-hover: rgba(173, 230, 191, .07);
2285
- --dsw-active: rgba(139, 218, 168, .13);
2286
- --dsw-label-primary: #ecf4eb;
2287
- --dsw-label-secondary: #bfd0c2;
2288
- --dsw-label-tertiary: #92aa98;
2289
- --dsw-label-caption: #6e8978;
2290
- --dsw-border-l1: rgba(191, 225, 195, .06);
2291
- --dsw-border-l2: rgba(191, 225, 195, .13);
2292
- --dsw-border-l3: rgba(191, 225, 195, .18);
2293
- --dsw-border-l4: rgba(191, 225, 195, .23);
2294
- --dsw-accent: #84d9ad;
2295
- --dsw-accent-soft: rgba(132, 217, 173, .13);
2296
- --dsw-warn: #e5b36b;
2297
- --dsw-success: #83d3a4;
2298
- --dsw-danger: #ef8b7f;
2299
- --dsw-selector: rgba(176, 225, 188, .09);
2300
- --dsw-layer-2: #203028;
2301
- --dsw-layer-3: #2b3c32;
2302
- --dsw-btn-elevated: #22332a;
2303
- --dsw-btn-floating-hover: #2d4034;
2304
- --dsw-module-platform: #26372d;
2305
- --dsw-border-strong: #5c9370;
2306
- --dsw-glass-popover: #1d2a23;
2307
- --dsw-glass-input: #1b2924;
2308
- --dsw-glass-modal: #1b2821;
2309
- --dsw-elevation-stroke: rgba(191, 225, 195, .13);
2310
- --dsw-elevation-soft: 0 0 0 1px var(--dsw-elevation-stroke), 0 16px 32px rgba(0, 0, 0, .24);
2311
- --dsw-elevation-panel: 0 0 0 1px var(--dsw-elevation-stroke), 0 20px 46px rgba(0, 0, 0, .36);
2312
- --dsw-elevation-prominent: 0 0 0 1px var(--dsw-elevation-stroke), 0 26px 60px rgba(0, 0, 0, .48);
2313
- }
2314
- }
2315
-
2316
- html[data-pebrel-theme="piweb"][data-ds-dark-theme],
2317
- body[data-pebrel-theme="piweb"][data-ds-dark-theme] {
2318
- --dsw-bg-base: #101816;
2319
- --dsw-bg-elevated: #17221e;
2320
- --dsw-sidebar-fill: #121d19;
2321
- --dsw-input-major: #1b2924;
2322
- --dsw-bubble: #20362c;
2323
- --dsw-hover: rgba(173, 230, 191, .07);
2324
- --dsw-active: rgba(139, 218, 168, .13);
2325
- --dsw-label-primary: #ecf4eb;
2326
- --dsw-label-secondary: #bfd0c2;
2327
- --dsw-label-tertiary: #92aa98;
2328
- --dsw-label-caption: #6e8978;
2329
- --dsw-border-l1: rgba(191, 225, 195, .06);
2330
- --dsw-border-l2: rgba(191, 225, 195, .13);
2331
- --dsw-border-l3: rgba(191, 225, 195, .18);
2332
- --dsw-border-l4: rgba(191, 225, 195, .23);
2333
- --dsw-accent: #84d9ad;
2334
- --dsw-accent-soft: rgba(132, 217, 173, .13);
2335
- --dsw-warn: #e5b36b;
2336
- --dsw-success: #83d3a4;
2337
- --dsw-danger: #ef8b7f;
2338
- --dsw-selector: rgba(176, 225, 188, .09);
2339
- --dsw-layer-2: #203028;
2340
- --dsw-layer-3: #2b3c32;
2341
- --dsw-btn-elevated: #22332a;
2342
- --dsw-btn-floating-hover: #2d4034;
2343
- --dsw-module-platform: #26372d;
2344
- --dsw-border-strong: #5c9370;
2345
- --dsw-glass-popover: #1d2a23;
2346
- --dsw-glass-input: #1b2924;
2347
- --dsw-glass-modal: #1b2821;
2348
- --dsw-elevation-stroke: rgba(191, 225, 195, .13);
2349
- --dsw-elevation-soft: 0 0 0 1px var(--dsw-elevation-stroke), 0 16px 32px rgba(0, 0, 0, .24);
2350
- --dsw-elevation-panel: 0 0 0 1px var(--dsw-elevation-stroke), 0 20px 46px rgba(0, 0, 0, .36);
2351
- --dsw-elevation-prominent: 0 0 0 1px var(--dsw-elevation-stroke), 0 26px 60px rgba(0, 0, 0, .48);
2352
- }
2353
-
2354
- .pw-shell {
2355
- --pw-line: color-mix(in srgb, var(--dsw-label-primary) 9%, transparent);
2356
- --pw-grid: color-mix(in srgb, var(--dsw-label-primary) 2.5%, transparent);
2357
- --pw-glow: color-mix(in srgb, var(--dsw-accent) 10%, transparent);
2358
- }
2359
- .pw-sidebar-surface { border-right: 1px solid var(--pw-line); }
2360
- .pw-sidebar {
2361
- background: linear-gradient(165deg, color-mix(in srgb, var(--dsw-sidebar-fill) 88%, var(--dsw-accent) 12%), var(--dsw-sidebar-fill) 52%);
2362
- }
2363
- .pw-sidebar-head {
2364
- min-height: 54px;
2365
- padding: 12px 14px 10px;
2366
- border-bottom: 1px solid var(--pw-line);
2367
- }
2368
- .pw-brand { display: inline-flex; align-items: center; gap: 9px; min-width: 0; }
2369
- .pw-brand-symbol { display: grid; width: 30px; height: 30px; place-items: center; border: 1px solid var(--dsw-border-l3); border-radius: 8px; background: var(--dsw-accent-soft); }
2370
- .pw-brand-name { color: var(--dsw-label-primary); font-size: 16px; font-weight: 700; letter-spacing: -.075em; line-height: 1; }
2371
- .pw-brand-meta { margin-left: 4px; color: var(--dsw-label-caption); font-size: 8px; font-weight: 600; letter-spacing: .1em; white-space: nowrap; }
2372
- .pw-sidebar-new { padding-top: 10px; padding-bottom: 5px; }
2373
- .btn-new-session {
2374
- justify-content: flex-start;
2375
- gap: 8px;
2376
- height: 34px;
2377
- padding: 0 10px;
2378
- border: 1px solid var(--dsw-border-l3);
2379
- border-left: 3px solid var(--dsw-accent);
2380
- border-radius: 10px;
2381
- background: var(--dsw-bg-elevated);
2382
- font-size: 12px;
2383
- font-weight: 650;
2384
- box-shadow: 0 2px 8px color-mix(in srgb, var(--dsw-bg-base) 24%, transparent);
2385
- }
2386
- .btn-new-session:hover { background: var(--dsw-accent-soft); border-color: var(--dsw-accent); }
2387
- .btn-new-session svg { color: var(--dsw-accent); }
2388
- .pw-sidebar-section-head { padding-top: 10px; padding-bottom: 3px; }
2389
- .pw-sidebar-section-head > span:first-child { color: var(--dsw-label-tertiary) !important; font-size: 10px !important; font-weight: 700; letter-spacing: .13em; }
2390
- .pw-sidebar-list { padding-top: 0; }
2391
- .pw-session-row, .pw-workspace-row { min-height: 30px; margin: 1px 0; padding: 4px 7px; border: 1px solid transparent; border-radius: 8px; }
2392
- .pw-workspace-row { min-height: 32px; }
2393
- .pw-session-row[data-selected], .pw-workspace-row[data-current] { border-color: var(--dsw-border-l2); }
2394
- .pw-session-row[data-selected]::before, .pw-workspace-row[data-current]::before {
2395
- position: absolute;
2396
- top: 8px;
2397
- bottom: 8px;
2398
- left: 0;
2399
- width: 2px;
2400
- border-radius: 2px;
2401
- background: var(--dsw-accent);
2402
- content: "";
2403
- }
2404
- .pw-sidebar-footer { border-top: 1px solid var(--pw-line); }
2405
- .pw-sidebar-footer > button { border-radius: 8px; }
2406
- .pw-main { isolation: isolate; background: var(--dsw-bg-base); }
2407
- .pw-main-hero {
2408
- background-image: radial-gradient(circle at 86% 10%, var(--pw-glow), transparent 38%), linear-gradient(var(--pw-grid) 1px, transparent 1px), linear-gradient(90deg, var(--pw-grid) 1px, transparent 1px);
2409
- background-size: auto, 48px 48px, 48px 48px;
2410
- }
2411
- .pw-session-header {
2412
- padding: 11px 24px 12px;
2413
- border-bottom: 1px solid var(--pw-line);
2414
- background: color-mix(in srgb, var(--dsw-bg-base) 88%, transparent);
2415
- backdrop-filter: blur(12px);
2416
- }
2417
- .pw-session-heading { display: flex; flex-direction: column; gap: 2px; }
2418
- .pw-session-eyebrow { color: var(--dsw-accent); font-size: 9px; font-weight: 700; letter-spacing: .13em; line-height: 1.2; }
2419
- .pw-session-title { display: block; color: var(--dsw-label-primary); font-size: 14px; font-weight: 650; line-height: 1.4; }
2420
- .pw-session-composer { padding: 8px 22px 15px; background: linear-gradient(transparent, color-mix(in srgb, var(--dsw-bg-base) 90%, transparent) 32%); }
2421
- .pw-chat-flow { padding-top: 22px; padding-bottom: 18px; }
2422
- .pw-conversation-turn { padding: 0 0 16px; }
2423
- .pw-conversation-turn + .pw-conversation-turn { padding-top: 15px; border-top: 1px solid var(--pw-line); }
2424
- .msg-user-bubble { max-width: 80%; padding: 7px 11px; border: 1px solid var(--dsw-border-l2); border-left: 2px solid var(--dsw-accent); border-radius: 13px 16px 16px 13px; background: var(--dsw-bubble); line-height: 1.5; }
2425
- .pw-user-editor { padding: 8px 10px 6px; }
2426
- .pw-user-editor-input { min-height: 23px; }
2427
- .pw-user-editor-actions { margin-top: 3px; }
2428
- .msg-actions { margin-top: 4px; opacity: .62; }
2429
- .pw-hero { position: relative; overflow: auto; }
2430
- .pw-hero-content { position: relative; padding: 18px 0 26px; animation: pw-hero-enter 420ms cubic-bezier(.2,.7,.2,1) both; }
2431
- .pw-hero-intro { width: 100%; max-width: 540px; margin-inline: auto; }
2432
- .pw-hero-identity { display: flex; align-items: center; gap: 10px; margin-bottom: 16px; color: var(--dsw-accent); font-size: 10px; font-weight: 700; letter-spacing: .12em; }
2433
- .pw-hero-mark { display: grid; width: 39px; height: 39px; place-items: center; border: 1px solid var(--dsw-border-l3); border-radius: 10px; background: var(--dsw-accent-soft); }
2434
- .pw-hero-index { margin-left: auto; color: var(--dsw-label-caption); font-size: 9px; font-weight: 500; letter-spacing: .07em; }
2435
- .pw-hero-title { max-width: 17ch; margin: 0 0 11px; color: var(--dsw-label-primary); font-size: clamp(28px, 3.3vw, 43px); font-weight: 650; letter-spacing: -.075em; line-height: 1.23; }
2436
- .pw-hero-description { margin: 0 0 22px; color: var(--dsw-label-tertiary); font-size: 12.5px; letter-spacing: -.01em; line-height: 1.7; }
2437
- .pw-hero-workspace { margin-bottom: 6px; }
2438
- .hero-chip { height: 31px; padding: 0 10px; border: 1px solid var(--dsw-border-l2); border-radius: 8px; background: var(--dsw-bg-elevated); font-size: 12px; }
2439
- .hero-chip:hover, .hero-chip[data-open="true"] { border-color: var(--dsw-border-l3); background: var(--dsw-hover); }
2440
- .pw-composer-shell { max-width: 540px; margin-inline: auto; transition: max-width 220ms cubic-bezier(.2,.7,.2,1); }
2441
- .pw-composer-shell[data-expanded="true"] { max-width: var(--dsh-composer-card-max-width); }
2442
- .pw-composer {
2443
- --pw-composer-accent: var(--dsw-accent);
2444
- border: 1px solid rgba(226, 232, 240, 0.9);
2445
- border-radius: 24px;
2446
- background: #FFFFFF;
2447
- box-shadow: 10px 14px 28px rgba(166, 178, 198, 0.35),
2448
- -8px -8px 20px rgba(255, 255, 255, 0.95),
2449
- inset 1px 1px 2px rgba(255, 255, 255, 0.9);
2450
- transition: border-color 220ms ease, background-color 220ms ease, box-shadow 220ms ease;
2451
- }
2452
- html[data-ds-dark-theme] .pw-composer {
2453
- border-color: rgba(255, 255, 255, 0.08);
2454
- background: #1c212b;
2455
- box-shadow: 10px 14px 28px rgba(0, 0, 0, 0.45),
2456
- -6px -6px 16px rgba(255, 255, 255, 0.03),
2457
- inset 1px 1px 1px rgba(255, 255, 255, 0.06);
2458
- }
2459
- .pw-composer::after {
2460
- position: absolute;
2461
- right: 22px;
2462
- bottom: -1px;
2463
- left: 22px;
2464
- height: 2px;
2465
- border-radius: 2px;
2466
- background: linear-gradient(90deg, transparent, var(--pw-composer-accent), transparent);
2467
- content: "";
2468
- opacity: 0;
2469
- pointer-events: none;
2470
- transform: scaleX(.55);
2471
- transition: opacity 240ms ease, transform 300ms cubic-bezier(.2,.7,.2,1);
2472
- }
2473
- .pw-composer:focus-within { border-color: color-mix(in srgb, var(--pw-composer-accent) 50%, var(--dsw-border-l3)); box-shadow: var(--dsw-elevation-soft), 0 0 0 3px color-mix(in srgb, var(--pw-composer-accent) 10%, transparent); }
2474
- .pw-composer[data-mode="plan"] { --pw-composer-accent: var(--dsw-warn); }
2475
- .pw-composer[data-mode="goal"] { --pw-composer-accent: var(--dsw-accent); }
2476
- .pw-composer[data-mode="plan"], .pw-composer[data-mode="goal"] {
2477
- border-color: color-mix(in srgb, var(--pw-composer-accent) 38%, var(--dsw-border-l3));
2478
- background-color: color-mix(in srgb, var(--dsw-input-major) 96%, var(--pw-composer-accent) 4%);
2479
- }
2480
- .pw-composer[data-mode="plan"]::after, .pw-composer[data-mode="goal"]::after { opacity: .72; transform: scaleX(1); }
2481
- .pw-composer-body { min-height: 29px; padding: 4px 13px 0; }
2482
- .pw-composer-toolbar { height: 35px; gap: 6px; padding: 1px 10px 4px; container-type: inline-size; }
2483
- .pw-model-selector { flex: 0 1 auto; margin-left: auto; }
2484
- .pw-model-selector .chip { display: flex; }
2485
- .pw-workflow-add { width: 27px; height: 27px; border: 1px solid var(--dsw-border-l2); border-radius: 9px; background: var(--dsw-bg-elevated); }
2486
- .pw-workflow-add:hover:not(:disabled), .pw-workflow-add[aria-expanded="true"] { border-color: var(--dsw-border-l3); background: var(--dsw-accent-soft); color: var(--dsw-accent); }
2487
- .pw-workflow-current { height: 27px; padding-right: 5px; border-radius: 999px; animation: pw-mode-enter 230ms cubic-bezier(.2,.7,.2,1) both; }
2488
- .pw-workflow-menu { border-radius: 15px; border: 1px solid var(--dsw-border-l3); padding: 7px; box-shadow: var(--dsw-elevation-panel); }
2489
- .pw-workflow-menu-label { padding: 5px 9px 8px; font-size: 9px; letter-spacing: .12em; text-transform: uppercase; }
2490
- .pw-workflow-option { min-height: 39px; border-radius: 9px; }
2491
- .pw-workflow-option[aria-checked="true"] { background: var(--dsw-accent-soft); }
2492
- .pw-workflow-option-name { font-size: 12px; }
2493
- .pw-workflow-option-description { font-size: 11px; }
2494
- .btn-primary-circle {
2495
- width: 32px;
2496
- height: 32px;
2497
- margin: 0;
2498
- border-radius: 9999px;
2499
- background: linear-gradient(135deg, #34D399, #059669);
2500
- color: #FFFFFF;
2501
- box-shadow: 4px 6px 12px rgba(16, 185, 129, 0.35),
2502
- -2px -2px 6px rgba(255, 255, 255, 0.8),
2503
- inset 1px 1px 2px rgba(255, 255, 255, 0.5);
2504
- transition: all 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
2505
- }
2506
- .btn-primary-circle:hover:not(:disabled) {
2507
- opacity: 1;
2508
- filter: brightness(1.08);
2509
- transform: translateY(-1px) scale(1.04);
2510
- box-shadow: 6px 8px 16px rgba(16, 185, 129, 0.45), -3px -3px 8px rgba(255, 255, 255, 0.9);
2511
- }
2512
- .btn-primary-circle:active:not(:disabled) {
2513
- transform: translateY(1px) scale(0.96);
2514
- box-shadow: inset 2px 2px 4px rgba(0, 86, 59, 0.45);
2515
- }
2516
- .btn-ghost-circle { margin: 0; border-radius: 12px; transform: none; }
2517
- .popover { border: 1px solid var(--dsw-border-l2); border-radius: 11px; }
2518
- .icon-btn, .rail-btn { border-radius: 8px; }
2519
- .icon-btn:hover, .rail-btn:hover { color: var(--dsw-accent); background: var(--dsw-accent-soft); }
2520
- .btn-outline, .btn-primary-white, .select-chip { border-radius: 9px; }
2521
- @keyframes pw-hero-enter { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }
2522
- @keyframes pw-mode-enter { from { opacity: 0; transform: translateY(4px) scale(.96); } to { opacity: 1; transform: translateY(0) scale(1); } }
2523
- @media (max-width: 840px) {
2524
- .pw-sidebar-surface { border-right: 0; }
2525
- .pw-hero { justify-content: center; padding: 26px 20px; }
2526
- .pw-hero-content { padding-bottom: 20px; }
2527
- .pw-hero-title { font-size: clamp(28px, 8vw, 38px); }
2528
- .pw-hero-description { margin-bottom: 20px; }
2529
- .pw-session-header { padding-left: 56px; padding-right: 12px; }
2530
- .pw-session-composer { padding: 8px 10px 13px; }
2531
- .pw-brand-meta { display: none; }
2532
- }
2533
- @media (prefers-reduced-motion: reduce) {
2534
- .pw-hero-content, .pw-workflow-current { animation: none; }
2535
- .pw-composer, .pw-composer::after, .pw-composer-shell { transition: none; }
2536
- }
2537
-
2538
- /* ============================================================
2539
- Soft Claymorphism Design System Tokens & Classes
2540
- ============================================================ */
2541
-
2542
- :root {
2543
- --clay-bg: #F0F4F8;
2544
- --clay-surface: #FFFFFF;
2545
- --clay-sidebar: #F8FAFC;
2546
- --clay-mint: #10B981;
2547
- --clay-mint-deep: #059669;
2548
- --clay-mint-soft: #ECFDF5;
2549
- --clay-peach: #FB923C;
2550
- --clay-peach-deep: #EA580C;
2551
- --clay-peach-soft: #FFF7ED;
2552
- --clay-sky: #0284C7;
2553
- --clay-sky-deep: #0369A1;
2554
- --clay-sky-soft: #F0F9FF;
2555
- --clay-lavender: #6366F1;
2556
- --clay-lavender-soft: #EEF2FF;
2557
- --clay-slate-text: #0F172A;
2558
- --clay-subtext: #475569;
2559
- --clay-muted: #64748B;
2560
-
2561
- --clay-shadow-card: 12px 14px 28px rgba(166, 178, 198, 0.35),
2562
- -10px -10px 24px rgba(255, 255, 255, 0.95),
2563
- inset 1.5px 1.5px 3px rgba(255, 255, 255, 0.8),
2564
- inset -2px -2px 4px rgba(166, 178, 198, 0.12);
2565
- --clay-shadow-surface: 8px 10px 22px rgba(160, 174, 192, 0.22),
2566
- -8px -8px 20px rgba(255, 255, 255, 0.95);
2567
- --clay-shadow-inset: inset 4px 4px 8px rgba(166, 178, 198, 0.4),
2568
- inset -4px -4px 8px rgba(255, 255, 255, 0.9);
2569
- --clay-shadow-btn: 5px 6px 12px rgba(148, 163, 184, 0.32),
2570
- -4px -4px 10px rgba(255, 255, 255, 0.95),
2571
- inset 1px 1px 2px rgba(255, 255, 255, 0.9),
2572
- inset -1px -1px 2px rgba(100, 116, 139, 0.15);
2573
- --clay-shadow-btn-active: inset 3px 3px 6px rgba(148, 163, 184, 0.4),
2574
- inset -2px -2px 5px rgba(255, 255, 255, 0.85);
2575
- }
2576
-
2577
- html[data-ds-dark-theme],
2578
- body[data-ds-dark-theme],
2579
- html.dark,
2580
- body.dark {
2581
- --clay-bg: #13171F;
2582
- --clay-surface: #1E232D;
2583
- --clay-sidebar: #181C24;
2584
- --clay-slate-text: #F8FAFC;
2585
- --clay-subtext: #CBD5E1;
2586
- --clay-muted: #94A3B8;
2587
- --clay-shadow-card: 12px 14px 28px rgba(0, 0, 0, 0.45),
2588
- -8px -8px 20px rgba(255, 255, 255, 0.04),
2589
- inset 1px 1px 2px rgba(255, 255, 255, 0.1),
2590
- inset -2px -2px 4px rgba(0, 0, 0, 0.4);
2591
- --clay-shadow-surface: 8px 10px 22px rgba(0, 0, 0, 0.4),
2592
- -6px -6px 18px rgba(255, 255, 255, 0.03);
2593
- --clay-shadow-inset: inset 4px 4px 8px rgba(0, 0, 0, 0.5),
2594
- inset -4px -4px 8px rgba(255, 255, 255, 0.04);
2595
- }
2596
-
2597
- .clay-card {
2598
- background: var(--clay-surface);
2599
- color: var(--clay-slate-text);
2600
- border-radius: 1.5rem;
2601
- box-shadow: var(--clay-shadow-card);
2602
- border: 1px solid rgba(255, 255, 255, 0.8);
2603
- transition: all 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
2604
- }
2605
- html[data-ds-dark-theme] .clay-card,
2606
- html.dark .clay-card {
2607
- border-color: rgba(255, 255, 255, 0.08);
2608
- }
2609
-
2610
- .clay-surface {
2611
- background: var(--clay-sidebar);
2612
- color: var(--clay-slate-text);
2613
- border-radius: 1.75rem;
2614
- box-shadow: var(--clay-shadow-surface);
2615
- border: 1px solid rgba(255, 255, 255, 0.9);
2616
- }
2617
- html[data-ds-dark-theme] .clay-surface,
2618
- html.dark .clay-surface {
2619
- border-color: rgba(255, 255, 255, 0.06);
2620
- }
2621
-
2622
- .clay-inset {
2623
- background: #EFF3F8;
2624
- color: var(--clay-slate-text);
2625
- border-radius: 1.25rem;
2626
- box-shadow: var(--clay-shadow-inset);
2627
- border: 1px solid rgba(226, 232, 240, 0.6);
2628
- }
2629
- html[data-ds-dark-theme] .clay-inset,
2630
- html.dark .clay-inset {
2631
- background: #141820;
2632
- border-color: rgba(255, 255, 255, 0.05);
2633
- }
2634
-
2635
- .clay-code-window {
2636
- background-color: #0d1117 !important;
2637
- border-radius: 1.25rem;
2638
- box-shadow: inset 4px 4px 12px rgba(0, 0, 0, 0.6), inset -2px -2px 6px rgba(255, 255, 255, 0.04);
2639
- border: 1px solid rgba(255, 255, 255, 0.12);
2640
- color: #f0f6fc !important;
2641
- }
2642
-
2643
- .clay-btn {
2644
- position: relative;
2645
- border-radius: 9999px;
2646
- transition: all 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
2647
- box-shadow: var(--clay-shadow-btn);
2648
- display: inline-flex;
2649
- align-items: center;
2650
- justify-content: center;
2651
- cursor: pointer;
2652
- user-select: none;
2653
- }
2654
- .clay-btn:hover {
2655
- transform: translateY(-2px) scale(1.02);
2656
- box-shadow: 7px 9px 16px rgba(148, 163, 184, 0.38), -5px -5px 12px rgba(255, 255, 255, 1);
2657
- }
2658
- .clay-btn:active {
2659
- transform: translateY(1px) scale(0.98);
2660
- box-shadow: var(--clay-shadow-btn-active);
2661
- }
2662
-
2663
- .clay-btn-mint, .clay-btn-primary {
2664
- background: linear-gradient(135deg, #34D399, #059669);
2665
- color: #FFFFFF;
2666
- box-shadow: 6px 8px 18px rgba(16, 185, 129, 0.35),
2667
- -4px -4px 12px rgba(255, 255, 255, 0.9),
2668
- inset 1.5px 1.5px 3px rgba(255, 255, 255, 0.6),
2669
- inset -2px -2px 4px rgba(4, 120, 87, 0.35);
2670
- }
2671
- .clay-btn-mint:active, .clay-btn-primary:active {
2672
- box-shadow: inset 3px 3px 6px rgba(0, 86, 59, 0.5);
2673
- transform: translateY(1px) scale(0.98);
2674
- }
2675
-
2676
- .clay-btn-peach {
2677
- background: linear-gradient(135deg, #FB923C, #EA580C);
2678
- color: #FFFFFF;
2679
- box-shadow: 6px 8px 18px rgba(249, 115, 22, 0.35),
2680
- -4px -4px 12px rgba(255, 255, 255, 0.9),
2681
- inset 1.5px 1.5px 3px rgba(255, 255, 255, 0.6),
2682
- inset -2px -2px 4px rgba(194, 65, 12, 0.35);
2683
- }
2684
-
2685
- .clay-btn-soft {
2686
- background-color: #FFFFFF;
2687
- box-shadow: 4px 5px 10px rgba(166, 178, 198, 0.25),
2688
- -4px -4px 8px rgba(255, 255, 255, 0.9);
2689
- transition: all 0.15s ease-out;
2690
- }
2691
- html[data-ds-dark-theme] .clay-btn-soft {
2692
- background-color: #242934;
2693
- box-shadow: 4px 5px 10px rgba(0, 0, 0, 0.4),
2694
- -3px -3px 6px rgba(255, 255, 255, 0.04);
2695
- }
2696
- .clay-btn-soft:active {
2697
- box-shadow: inset 2px 2px 4px rgba(166, 178, 198, 0.35);
2698
- transform: translateY(1px);
2699
- }
2700
-
2701
- .clay-bubble-user {
2702
- background: linear-gradient(145deg, #38BDF8, #0284C7);
2703
- color: #FFFFFF !important;
2704
- border-radius: 1.5rem 1.5rem 0.4rem 1.5rem;
2705
- padding: 12px 18px;
2706
- box-shadow: 6px 8px 18px rgba(2, 132, 199, 0.3),
2707
- -3px -3px 8px rgba(255, 255, 255, 0.7),
2708
- inset 1.5px 1.5px 2px rgba(255, 255, 255, 0.6),
2709
- inset -2px -2px 3px rgba(3, 105, 161, 0.35);
2710
- }
2711
- .clay-bubble-user .md,
2712
- .clay-bubble-user .md p {
2713
- color: #FFFFFF !important;
2714
- }
2715
- .clay-bubble-user .md code {
2716
- background: rgba(255, 255, 255, 0.22) !important;
2717
- color: #FFFFFF !important;
2718
- border-radius: 6px;
2719
- padding: 2px 5px;
2720
- }
2721
- .clay-bubble-user .md pre {
2722
- background: rgba(15, 23, 42, 0.45) !important;
2723
- color: #F8FAFC !important;
2724
- border-radius: 12px;
2725
- padding: 12px;
2726
- }
2727
- .clay-bubble-user .md a {
2728
- color: #E0F2FE !important;
2729
- text-decoration: underline;
2730
- }
2731
-
2732
- .clay-badge {
2733
- border-radius: 9999px;
2734
- box-shadow: 2px 3px 6px rgba(166, 178, 198, 0.25),
2735
- -2px -2px 5px rgba(255, 255, 255, 0.9),
2736
- inset 1px 1px 1px rgba(255, 255, 255, 0.8),
2737
- inset -1px -1px 1px rgba(148, 163, 184, 0.15);
2738
- }
2739
-
2740
- .clay-code-pill {
2741
- background: #F1F5F9;
2742
- border-radius: 0.6rem;
2743
- box-shadow: inset 2px 2px 4px rgba(148, 163, 184, 0.28),
2744
- inset -2px -2px 4px rgba(255, 255, 255, 0.95);
2745
- border: 1px solid rgba(226, 232, 240, 0.8);
2746
- font-family: var(--font-mono);
2747
- }
2748
- html[data-ds-dark-theme] .clay-code-pill {
2749
- background: #141820;
2750
- border-color: rgba(255, 255, 255, 0.08);
2751
- }
2752
-
2753
- /* Ocean Ink uses the same surface tokens as the other selectable themes. */
2754
- html[data-pebrel-theme="ocean-ink"],
2755
- body[data-pebrel-theme="ocean-ink"] {
2756
- --dsw-bg-base: #edf6fa;
2757
- --dsw-bg-elevated: #f9fcfe;
2758
- --dsw-sidebar-fill: #e3f0f6;
2759
- --dsw-input-major: #ffffff;
2760
- --dsw-bubble: #dceef8;
2761
- --dsw-hover: rgba(2, 132, 199, 0.09);
2762
- --dsw-active: rgba(2, 132, 199, 0.16);
2763
- --dsw-label-primary: #183244;
2764
- --dsw-label-secondary: #426074;
2765
- --dsw-label-tertiary: #698699;
2766
- --dsw-label-caption: #879eaa;
2767
- --dsw-border-l1: rgba(30, 83, 112, 0.08);
2768
- --dsw-border-l2: rgba(30, 83, 112, 0.14);
2769
- --dsw-border-l3: rgba(30, 83, 112, 0.2);
2770
- --dsw-border-l4: rgba(30, 83, 112, 0.27);
2771
- --dsw-accent: #0284c7;
2772
- --dsw-accent-soft: rgba(2, 132, 199, 0.14);
2773
- --dsw-success: #0c8b81;
2774
- --dsw-selector: rgba(2, 132, 199, 0.1);
2775
- --dsw-layer-2: #f2f9fc;
2776
- --dsw-layer-3: #e4f1f7;
2777
- --dsw-btn-elevated: #f8fcfe;
2778
- --dsw-btn-floating-hover: #e4f1f7;
2779
- --dsw-module-platform: #e3f0f6;
2780
- --dsw-border-strong: #5e9dbb;
2781
- --dsw-glass-popover: #f9fcfe;
2782
- --dsw-glass-input: #ffffff;
2783
- --dsw-glass-modal: #f9fcfe;
2784
- }
2785
-
2786
- html[data-pebrel-theme="ocean-ink"][data-ds-dark-theme],
2787
- body[data-pebrel-theme="ocean-ink"][data-ds-dark-theme] {
2788
- --dsw-bg-base: #0d1821;
2789
- --dsw-bg-elevated: #142431;
2790
- --dsw-sidebar-fill: #101f2b;
2791
- --dsw-input-major: #192d3b;
2792
- --dsw-bubble: #193748;
2793
- --dsw-hover: rgba(125, 211, 252, 0.1);
2794
- --dsw-active: rgba(56, 189, 248, 0.19);
2795
- --dsw-label-primary: #e8f6fc;
2796
- --dsw-label-secondary: #b7d3e0;
2797
- --dsw-label-tertiary: #87aabb;
2798
- --dsw-label-caption: #648696;
2799
- --dsw-border-l1: rgba(153, 213, 239, 0.07);
2800
- --dsw-border-l2: rgba(153, 213, 239, 0.14);
2801
- --dsw-border-l3: rgba(153, 213, 239, 0.2);
2802
- --dsw-border-l4: rgba(153, 213, 239, 0.27);
2803
- --dsw-accent: #38bdf8;
2804
- --dsw-accent-soft: rgba(56, 189, 248, 0.16);
2805
- --dsw-success: #5ccec0;
2806
- --dsw-selector: rgba(56, 189, 248, 0.12);
2807
- --dsw-layer-2: #192c39;
2808
- --dsw-layer-3: #243d4d;
2809
- --dsw-btn-elevated: #1b3040;
2810
- --dsw-btn-floating-hover: #294455;
2811
- --dsw-module-platform: #172b39;
2812
- --dsw-border-strong: #76acc4;
2813
- --dsw-glass-popover: #192d3b;
2814
- --dsw-glass-input: #192d3b;
2815
- --dsw-glass-modal: #172b39;
2816
- }