@rexvane/piweb 0.3.15 → 0.3.16

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 (230) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +9 -6
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +6 -6
  5. package/.next/react-loadable-manifest.json +16 -4
  6. package/.next/routes-manifest.json +20 -0
  7. package/.next/server/app/_global-error/page.js +2 -2
  8. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/_global-error.html +1 -1
  10. package/.next/server/app/_global-error.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/server/app/_not-found/page.js +1 -1
  15. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  16. package/.next/server/app/_not-found.html +1 -1
  17. package/.next/server/app/_not-found.rsc +7 -4
  18. package/.next/server/app/_not-found.segments/_full.segment.rsc +7 -4
  19. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -2
  20. package/.next/server/app/_not-found.segments/_tree.segment.rsc +5 -2
  21. package/.next/server/app/api/agent/[id]/events/route.js +2 -2
  22. package/.next/server/app/api/agent/[id]/events/route.js.nft.json +1 -1
  23. package/.next/server/app/api/agent/[id]/route.js +1 -1
  24. package/.next/server/app/api/agent/[id]/route.js.nft.json +1 -1
  25. package/.next/server/app/api/agent/[id]/tree/route.js +1 -1
  26. package/.next/server/app/api/agent/[id]/tree/route.js.nft.json +1 -1
  27. package/.next/server/app/api/agent/new/route.js +1 -1
  28. package/.next/server/app/api/agent/new/route.js.nft.json +1 -1
  29. package/.next/server/app/api/config/route.js +1 -1
  30. package/.next/server/app/api/config/route.js.nft.json +1 -1
  31. package/.next/server/app/api/files/route.js +1 -1
  32. package/.next/server/app/api/files/route.js.nft.json +1 -1
  33. package/.next/server/app/api/git/route.js +2 -2
  34. package/.next/server/app/api/git/route.js.nft.json +1 -1
  35. package/.next/server/app/api/growth/route.js +1 -1
  36. package/.next/server/app/api/growth/route.js.nft.json +1 -1
  37. package/.next/server/app/api/health/route.js +1 -1
  38. package/.next/server/app/api/models/route.js +1 -1
  39. package/.next/server/app/api/models/route.js.nft.json +1 -1
  40. package/.next/server/app/api/pi-settings/route.js +1 -1
  41. package/.next/server/app/api/pi-settings/route.js.nft.json +1 -1
  42. package/.next/server/app/api/plugins/route.js +1 -1
  43. package/.next/server/app/api/plugins/route.js.nft.json +1 -1
  44. package/.next/server/app/api/prompts/route.js +1 -1
  45. package/.next/server/app/api/prompts/route.js.nft.json +1 -1
  46. package/.next/server/app/api/security/route.js +1 -1
  47. package/.next/server/app/api/security/route.js.nft.json +1 -1
  48. package/.next/server/app/api/sessions/[id]/export/route.js +1 -1
  49. package/.next/server/app/api/sessions/[id]/export/route.js.nft.json +1 -1
  50. package/.next/server/app/api/sessions/[id]/route.js +1 -1
  51. package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  52. package/.next/server/app/api/sessions/import/route.js +3 -3
  53. package/.next/server/app/api/sessions/import/route.js.nft.json +1 -1
  54. package/.next/server/app/api/sessions/route.js +1 -1
  55. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  56. package/.next/server/app/api/skills/route.js +2 -2
  57. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  58. package/.next/server/app/api/swarm/[id]/route.js +1 -0
  59. package/.next/server/app/api/swarm/[id]/route.js.nft.json +1 -0
  60. package/.next/server/app/api/swarm/[id]/route_client-reference-manifest.js +1 -0
  61. package/.next/server/app/api/swarm/route.js +1 -0
  62. package/.next/server/app/api/swarm/route.js.nft.json +1 -0
  63. package/.next/server/app/api/swarm/route_client-reference-manifest.js +1 -0
  64. package/.next/server/app/api/tests/route.js +2 -0
  65. package/.next/server/app/api/tests/route.js.nft.json +1 -0
  66. package/.next/server/app/api/tests/route_client-reference-manifest.js +1 -0
  67. package/.next/server/app/api/update/route.js +2 -2
  68. package/.next/server/app/api/update/route.js.nft.json +1 -1
  69. package/.next/server/app/api/version/route.js +1 -1
  70. package/.next/server/app/api/version/route.js.nft.json +1 -1
  71. package/.next/server/app/api/web-auth/route.js +1 -1
  72. package/.next/server/app/api/workspaces/route.js +1 -1
  73. package/.next/server/app/api/workspaces/route.js.nft.json +1 -1
  74. package/.next/server/app/icon.svg/route.js +1 -1
  75. package/.next/server/app/index.html +1 -1
  76. package/.next/server/app/index.rsc +9 -6
  77. package/.next/server/app/index.segments/__PAGE__.segment.rsc +7 -4
  78. package/.next/server/app/index.segments/_full.segment.rsc +9 -6
  79. package/.next/server/app/index.segments/_tree.segment.rsc +5 -2
  80. package/.next/server/app/login/page.js +1 -1
  81. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  82. package/.next/server/app/login.html +1 -1
  83. package/.next/server/app/login.rsc +8 -5
  84. package/.next/server/app/login.segments/_full.segment.rsc +8 -5
  85. package/.next/server/app/login.segments/_tree.segment.rsc +5 -2
  86. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +6 -3
  87. package/.next/server/app/page.js +1 -1
  88. package/.next/server/app/page_client-reference-manifest.js +1 -1
  89. package/.next/server/app-paths-manifest.json +9 -6
  90. package/.next/server/chunks/496.js +1 -1
  91. package/.next/server/chunks/532.js +1 -1
  92. package/.next/server/chunks/686.js +6 -2
  93. package/.next/server/chunks/757.js +1 -0
  94. package/.next/server/chunks/775.js +3 -0
  95. package/.next/server/middleware-build-manifest.js +1 -1
  96. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  97. package/.next/server/pages/404.html +1 -1
  98. package/.next/server/pages/500.html +1 -1
  99. package/.next/server/server-reference-manifest.json +1 -1
  100. package/.next/static/0t1jBUAuVaTFTXxRyIo3q/_buildManifest.js +1 -0
  101. package/.next/static/chunks/2608.43c58236c9cce8e6.js +1 -0
  102. package/.next/static/chunks/{2716.a9e808190a4e2424.js → 2716.4ec42df1d51354c9.js} +1 -1
  103. package/.next/static/chunks/4632.62139b565b657aac.js +1 -0
  104. package/.next/static/chunks/{4673.d3d0a7f2599080fb.js → 4673.7796104395deb8d7.js} +1 -1
  105. package/.next/static/chunks/4686-17f21a006739a596.js +1 -0
  106. package/.next/static/chunks/7577.10af9bb661652da8.js +1 -0
  107. package/.next/static/chunks/8866.38ec4ac4ee5a1b74.js +1 -0
  108. package/.next/static/chunks/app/_global-error/page-5148173b3f55e415.js +1 -0
  109. package/.next/static/chunks/app/api/agent/[id]/events/route-5148173b3f55e415.js +1 -0
  110. package/.next/static/chunks/app/api/agent/[id]/route-5148173b3f55e415.js +1 -0
  111. package/.next/static/chunks/app/api/agent/[id]/tree/route-5148173b3f55e415.js +1 -0
  112. package/.next/static/chunks/app/api/agent/new/route-5148173b3f55e415.js +1 -0
  113. package/.next/static/chunks/app/api/config/route-5148173b3f55e415.js +1 -0
  114. package/.next/static/chunks/app/api/files/route-5148173b3f55e415.js +1 -0
  115. package/.next/static/chunks/app/api/git/route-5148173b3f55e415.js +1 -0
  116. package/.next/static/chunks/app/api/growth/route-5148173b3f55e415.js +1 -0
  117. package/.next/static/chunks/app/api/health/route-5148173b3f55e415.js +1 -0
  118. package/.next/static/chunks/app/api/models/route-5148173b3f55e415.js +1 -0
  119. package/.next/static/chunks/app/api/pi-settings/route-5148173b3f55e415.js +1 -0
  120. package/.next/static/chunks/app/api/plugins/route-5148173b3f55e415.js +1 -0
  121. package/.next/static/chunks/app/api/prompts/route-5148173b3f55e415.js +1 -0
  122. package/.next/static/chunks/app/api/security/route-5148173b3f55e415.js +1 -0
  123. package/.next/static/chunks/app/api/sessions/[id]/export/route-5148173b3f55e415.js +1 -0
  124. package/.next/static/chunks/app/api/sessions/[id]/route-5148173b3f55e415.js +1 -0
  125. package/.next/static/chunks/app/api/sessions/import/route-5148173b3f55e415.js +1 -0
  126. package/.next/static/chunks/app/api/sessions/route-5148173b3f55e415.js +1 -0
  127. package/.next/static/chunks/app/api/skills/route-5148173b3f55e415.js +1 -0
  128. package/.next/static/chunks/app/api/swarm/[id]/route-5148173b3f55e415.js +1 -0
  129. package/.next/static/chunks/app/api/swarm/route-5148173b3f55e415.js +1 -0
  130. package/.next/static/chunks/app/api/tests/route-5148173b3f55e415.js +1 -0
  131. package/.next/static/chunks/app/api/update/route-5148173b3f55e415.js +1 -0
  132. package/.next/static/chunks/app/api/version/route-5148173b3f55e415.js +1 -0
  133. package/.next/static/chunks/app/api/web-auth/route-5148173b3f55e415.js +1 -0
  134. package/.next/static/chunks/app/api/workspaces/route-5148173b3f55e415.js +1 -0
  135. package/.next/static/chunks/app/page-14379b8060d5cf07.js +1 -0
  136. package/.next/static/chunks/next/dist/client/components/builtin/app-error-5148173b3f55e415.js +1 -0
  137. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-5148173b3f55e415.js +1 -0
  138. package/.next/static/chunks/next/dist/client/components/builtin/not-found-5148173b3f55e415.js +1 -0
  139. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-5148173b3f55e415.js +1 -0
  140. package/.next/static/chunks/webpack-d1a69ad9edb38b11.js +1 -0
  141. package/.next/static/css/d0a0162cb481abe8.css +1 -0
  142. package/.next/types/app/api/swarm/[id]/route.ts +353 -0
  143. package/.next/types/app/api/swarm/route.ts +353 -0
  144. package/.next/types/app/api/tests/route.ts +353 -0
  145. package/.next/types/routes.d.ts +4 -1
  146. package/.next/types/validator.ts +27 -0
  147. package/README.md +10 -0
  148. package/package.json +4 -3
  149. package/scripts/pick-folder.ps1 +11 -2
  150. package/scripts/release.mjs +11 -31
  151. package/scripts/run-test-file.mjs +34 -0
  152. package/scripts/verify-release-config.mjs +24 -0
  153. package/src/app/api/config/route.ts +4 -1
  154. package/src/app/api/security/route.ts +8 -3
  155. package/src/app/api/swarm/[id]/route.ts +28 -0
  156. package/src/app/api/swarm/route.ts +24 -0
  157. package/src/app/api/tests/route.ts +27 -0
  158. package/src/app/api/update/route.ts +8 -2
  159. package/src/app/globals.css +777 -0
  160. package/src/app/layout.tsx +13 -6
  161. package/src/components/AppShell.tsx +505 -199
  162. package/src/components/ChatInput.tsx +153 -26
  163. package/src/components/ChatWindow.tsx +46 -40
  164. package/src/components/ContextMeter.tsx +11 -17
  165. package/src/components/FileViewer.tsx +1 -1
  166. package/src/components/GitPanel.tsx +13 -11
  167. package/src/components/ModelSelector.tsx +19 -6
  168. package/src/components/PiMark.tsx +5 -38
  169. package/src/components/ProjectPanel.tsx +1 -0
  170. package/src/components/PromptPanel.tsx +132 -51
  171. package/src/components/SessionImportSection.tsx +17 -17
  172. package/src/components/SessionSidebar.tsx +159 -57
  173. package/src/components/SettingsPanel.tsx +330 -193
  174. package/src/components/SwarmCoordinatorPod.tsx +1021 -0
  175. package/src/components/TestInspectorPod.tsx +549 -0
  176. package/src/components/icons.tsx +23 -0
  177. package/src/hooks/usePiWeb.ts +112 -8
  178. package/src/i18n.tsx +59 -3
  179. package/src/lib/agent-manager.ts +180 -12
  180. package/src/lib/command-validation.ts +9 -1
  181. package/src/lib/delegation.ts +93 -0
  182. package/src/lib/managed-niubash.ts +8 -4
  183. package/src/lib/pi.ts +3 -2
  184. package/src/lib/runtime-activity.ts +27 -0
  185. package/src/lib/session-import/index.ts +5 -0
  186. package/src/lib/session-import/lock.ts +25 -0
  187. package/src/lib/session-import/writer.ts +8 -3
  188. package/src/lib/skills-service.ts +16 -9
  189. package/src/lib/swarm-service.ts +371 -0
  190. package/src/lib/test-run-service.ts +122 -0
  191. package/src/lib/theme.ts +68 -1
  192. package/src/lib/trajectory.ts +1 -0
  193. package/src/lib/types.ts +14 -0
  194. package/src/lib/workflow.ts +55 -0
  195. package/.next/static/DdBwPYoHBKtaJ97QIr6Co/_buildManifest.js +0 -1
  196. package/.next/static/chunks/2608.ec8ff1f5767c9056.js +0 -1
  197. package/.next/static/chunks/4632.0ed92ae42905ce40.js +0 -1
  198. package/.next/static/chunks/4686-7d694def920ff093.js +0 -1
  199. package/.next/static/chunks/app/_global-error/page-f77e9ede9808b18e.js +0 -1
  200. package/.next/static/chunks/app/api/agent/[id]/events/route-f77e9ede9808b18e.js +0 -1
  201. package/.next/static/chunks/app/api/agent/[id]/route-f77e9ede9808b18e.js +0 -1
  202. package/.next/static/chunks/app/api/agent/[id]/tree/route-f77e9ede9808b18e.js +0 -1
  203. package/.next/static/chunks/app/api/agent/new/route-f77e9ede9808b18e.js +0 -1
  204. package/.next/static/chunks/app/api/config/route-f77e9ede9808b18e.js +0 -1
  205. package/.next/static/chunks/app/api/files/route-f77e9ede9808b18e.js +0 -1
  206. package/.next/static/chunks/app/api/git/route-f77e9ede9808b18e.js +0 -1
  207. package/.next/static/chunks/app/api/growth/route-f77e9ede9808b18e.js +0 -1
  208. package/.next/static/chunks/app/api/health/route-f77e9ede9808b18e.js +0 -1
  209. package/.next/static/chunks/app/api/models/route-f77e9ede9808b18e.js +0 -1
  210. package/.next/static/chunks/app/api/pi-settings/route-f77e9ede9808b18e.js +0 -1
  211. package/.next/static/chunks/app/api/plugins/route-f77e9ede9808b18e.js +0 -1
  212. package/.next/static/chunks/app/api/prompts/route-f77e9ede9808b18e.js +0 -1
  213. package/.next/static/chunks/app/api/security/route-f77e9ede9808b18e.js +0 -1
  214. package/.next/static/chunks/app/api/sessions/[id]/export/route-f77e9ede9808b18e.js +0 -1
  215. package/.next/static/chunks/app/api/sessions/[id]/route-f77e9ede9808b18e.js +0 -1
  216. package/.next/static/chunks/app/api/sessions/import/route-f77e9ede9808b18e.js +0 -1
  217. package/.next/static/chunks/app/api/sessions/route-f77e9ede9808b18e.js +0 -1
  218. package/.next/static/chunks/app/api/skills/route-f77e9ede9808b18e.js +0 -1
  219. package/.next/static/chunks/app/api/update/route-f77e9ede9808b18e.js +0 -1
  220. package/.next/static/chunks/app/api/version/route-f77e9ede9808b18e.js +0 -1
  221. package/.next/static/chunks/app/api/web-auth/route-f77e9ede9808b18e.js +0 -1
  222. package/.next/static/chunks/app/api/workspaces/route-f77e9ede9808b18e.js +0 -1
  223. package/.next/static/chunks/app/page-9a5440047c5a415c.js +0 -1
  224. package/.next/static/chunks/next/dist/client/components/builtin/app-error-f77e9ede9808b18e.js +0 -1
  225. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-f77e9ede9808b18e.js +0 -1
  226. package/.next/static/chunks/next/dist/client/components/builtin/not-found-f77e9ede9808b18e.js +0 -1
  227. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-f77e9ede9808b18e.js +0 -1
  228. package/.next/static/chunks/webpack-42c5aae79b0e5d8c.js +0 -1
  229. package/.next/static/css/b2d35abc828d4713.css +0 -1
  230. /package/.next/static/{DdBwPYoHBKtaJ97QIr6Co → 0t1jBUAuVaTFTXxRyIo3q}/_ssgManifest.js +0 -0
@@ -1,5 +1,7 @@
1
1
  @import "tailwindcss";
2
2
 
3
+ @custom-variant dark (&:where([data-ds-dark-theme], [data-ds-dark-theme] *, .dark, .dark *));
4
+
3
5
  /* ============================================================
4
6
  Pi Web 视觉令牌
5
7
  浅色默认,深色用 body[data-ds-dark-theme]
@@ -256,6 +258,14 @@ textarea::placeholder {
256
258
  .settings-title {
257
259
  display: none;
258
260
  }
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; }
259
269
  }
260
270
 
261
271
  /* 滚动条 */
@@ -887,6 +897,36 @@ body[data-ds-dark-theme] {
887
897
  font-size: var(--piweb-chat-font-size);
888
898
  line-height: 1.65;
889
899
  }
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; }
890
930
 
891
931
  /* 消息操作图标行:常显低透明度,悬停变亮(dsh 同款) */
892
932
  .msg-actions {
@@ -2037,3 +2077,740 @@ body[data-pebrel-theme="pebrel"][data-ds-dark-theme] {
2037
2077
  border-radius: 0;
2038
2078
  }
2039
2079
  }
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
+ }