aimeat 1.16.2 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/dist/.env.example +6 -1
  2. package/dist/locales/en.json +166 -4
  3. package/dist/locales/fi.json +166 -4
  4. package/dist/public/components/Card.js +17 -3
  5. package/dist/public/components/Collapsible.js +39 -0
  6. package/dist/public/components/CopyButton.js +55 -24
  7. package/dist/public/components/DataTable.js +57 -0
  8. package/dist/public/components/EmptyState.js +28 -0
  9. package/dist/public/components/KeyValueRow.js +37 -0
  10. package/dist/public/components/Modal.js +22 -5
  11. package/dist/public/components/Pagination.js +70 -0
  12. package/dist/public/components/SearchBar.js +44 -0
  13. package/dist/public/components/StatusDot.js +29 -0
  14. package/dist/public/components/TagList.js +53 -0
  15. package/dist/public/components/ToggleSwitch.js +28 -0
  16. package/dist/public/components/index.js +41 -1
  17. package/dist/public/css/components/tags.css +24 -0
  18. package/dist/public/css/style-testbed.css +135 -0
  19. package/dist/public/css/theme.css +556 -34
  20. package/dist/public/css/views/admin-agent-integration.css +2 -33
  21. package/dist/public/css/views/admin.css +730 -686
  22. package/dist/public/css/views/agents-detail.css +402 -14
  23. package/dist/public/css/views/help.css +2 -1
  24. package/dist/public/css/views/hobbies.css +53 -33
  25. package/dist/public/css/views/marketplace.css +73 -60
  26. package/dist/public/css/views/openclaw.css +12 -6
  27. package/dist/public/css/views/portal-classic.css +34 -26
  28. package/dist/public/css/views/portal-dev.css +41 -32
  29. package/dist/public/css/views/portal.css +14 -18
  30. package/dist/public/css/views/profile.css +252 -164
  31. package/dist/public/css/views/public-knowledge-viewer.css +18 -6
  32. package/dist/public/css/views/scheduler.css +100 -0
  33. package/dist/public/js/format.js +41 -0
  34. package/dist/public/js/services/agent-tasks.js +14 -1
  35. package/dist/public/js/services/generator-spec-validate.js +5 -1
  36. package/dist/public/js/services/schedules.js +53 -0
  37. package/dist/public/js/style-testbed.js +170 -0
  38. package/dist/public/js/theme.js +114 -0
  39. package/dist/public/spa.html +74 -16
  40. package/dist/public/style-testbed.html +420 -0
  41. package/dist/public/views/admin/agent-integration-tab.js +23 -38
  42. package/dist/public/views/admin/agent-tasks-tab.js +14 -21
  43. package/dist/public/views/admin/chat-instances-tab.js +1 -1
  44. package/dist/public/views/admin/config-tab.js +7 -2
  45. package/dist/public/views/admin/cortex-tab.js +20 -14
  46. package/dist/public/views/admin/csm-tab.js +22 -18
  47. package/dist/public/views/admin/directory-tab.js +3 -3
  48. package/dist/public/views/admin/email-tab.js +23 -28
  49. package/dist/public/views/admin/federation-tab.js +15 -5
  50. package/dist/public/views/admin/generator-debug-tab.js +10 -8
  51. package/dist/public/views/admin/genesis-tab.js +4 -4
  52. package/dist/public/views/admin/ghii-tab.js +3 -3
  53. package/dist/public/views/admin/knowledge-tab.js +15 -5
  54. package/dist/public/views/admin/matching-tab.js +3 -3
  55. package/dist/public/views/admin/memory-tab.js +16 -20
  56. package/dist/public/views/admin/msm-tab.js +30 -17
  57. package/dist/public/views/admin/overview-tab.js +7 -7
  58. package/dist/public/views/admin/packages-tab.js +10 -9
  59. package/dist/public/views/admin/portal-tab.js +14 -4
  60. package/dist/public/views/admin/prompts-tab.js +5 -5
  61. package/dist/public/views/admin/push-tab.js +15 -4
  62. package/dist/public/views/admin/realtime-tab.js +3 -3
  63. package/dist/public/views/admin/services-tab.js +18 -27
  64. package/dist/public/views/admin/shared.js +48 -58
  65. package/dist/public/views/admin/sharing-groups-tab.js +5 -10
  66. package/dist/public/views/admin/stats-tab.js +3 -3
  67. package/dist/public/views/guides.js +9 -13
  68. package/dist/public/views/help.js +3 -24
  69. package/dist/public/views/hobbies.js +47 -41
  70. package/dist/public/views/marketplace.js +42 -34
  71. package/dist/public/views/openclaw.js +0 -1
  72. package/dist/public/views/portal-classic.js +4 -15
  73. package/dist/public/views/portal-dev.js +28 -30
  74. package/dist/public/views/portal.js +16 -21
  75. package/dist/public/views/portfolio.js +11 -12
  76. package/dist/public/views/profile/access-tab.js +250 -1
  77. package/dist/public/views/profile/agents/agent-card.js +75 -4
  78. package/dist/public/views/profile/agents/tab-activity.js +15 -13
  79. package/dist/public/views/profile/agents/tab-agent-config.js +60 -6
  80. package/dist/public/views/profile/agents/tab-integration.js +37 -60
  81. package/dist/public/views/profile/agents/tab-messages.js +10 -1
  82. package/dist/public/views/profile/agents/tab-quality.js +25 -19
  83. package/dist/public/views/profile/agents/tab-schedules.js +110 -0
  84. package/dist/public/views/profile/agents-activity-subtab.js +4 -4
  85. package/dist/public/views/profile/agents-services-subtab.js +5 -4
  86. package/dist/public/views/profile/agents-tab.js +141 -37
  87. package/dist/public/views/profile/agents-tasks-subtab.js +221 -26
  88. package/dist/public/views/profile/calibrator-batch.js +5 -11
  89. package/dist/public/views/profile/calibrator-tab.js +4 -9
  90. package/dist/public/views/profile/chat-sessions-tab.js +9 -5
  91. package/dist/public/views/profile/email-tab.js +2 -2
  92. package/dist/public/views/profile/extensions-tab.js +27 -22
  93. package/dist/public/views/profile/federation-tab.js +4 -1
  94. package/dist/public/views/profile/foundry-detail.js +22 -23
  95. package/dist/public/views/profile/foundry-tab.js +12 -13
  96. package/dist/public/views/profile/generator-dashboard/DebugPanel.js +4 -7
  97. package/dist/public/views/profile/generator-dashboard/use-dashboard-core.js +4 -1
  98. package/dist/public/views/profile/generator-dashboard/use-edit-mode.js +3 -2
  99. package/dist/public/views/profile/generator-detail.js +26 -30
  100. package/dist/public/views/profile/generator-tab.js +5 -5
  101. package/dist/public/views/profile/knowledge-tab.js +12 -12
  102. package/dist/public/views/profile/landing-page.js +100 -149
  103. package/dist/public/views/profile/memory-tab.js +15 -11
  104. package/dist/public/views/profile/node-stats-tab.js +3 -3
  105. package/dist/public/views/profile/nodes-tab.js +10 -3
  106. package/dist/public/views/profile/notifications-tab.js +3 -3
  107. package/dist/public/views/profile/packages-tab.js +14 -14
  108. package/dist/public/views/profile/scheduler-tab.js +340 -0
  109. package/dist/public/views/profile/services-tab.js +1 -1
  110. package/dist/public/views/profile/shared.js +16 -12
  111. package/dist/public/views/profile/wallet-tab.js +27 -50
  112. package/dist/public/views/profile/work-tab.js +29 -31
  113. package/dist/public/views/profile.js +24 -0
  114. package/dist/public/views/public-knowledge-viewer.js +9 -18
  115. package/dist/src/auth/middleware.d.ts +3 -2
  116. package/dist/src/auth/middleware.d.ts.map +1 -1
  117. package/dist/src/auth/middleware.js +78 -3
  118. package/dist/src/auth/middleware.js.map +1 -1
  119. package/dist/src/cli/init-wizard.d.ts.map +1 -1
  120. package/dist/src/cli/init-wizard.js +13 -1
  121. package/dist/src/cli/init-wizard.js.map +1 -1
  122. package/dist/src/config.d.ts +6 -0
  123. package/dist/src/config.d.ts.map +1 -1
  124. package/dist/src/config.js +12 -1
  125. package/dist/src/config.js.map +1 -1
  126. package/dist/src/generated/api-types.d.ts +708 -8
  127. package/dist/src/generated/api-types.d.ts.map +1 -1
  128. package/dist/src/mcp/agent-schedules.d.ts +23 -0
  129. package/dist/src/mcp/agent-schedules.d.ts.map +1 -0
  130. package/dist/src/mcp/agent-schedules.js +175 -0
  131. package/dist/src/mcp/agent-schedules.js.map +1 -0
  132. package/dist/src/mcp/annotations.d.ts.map +1 -1
  133. package/dist/src/mcp/annotations.js +6 -0
  134. package/dist/src/mcp/annotations.js.map +1 -1
  135. package/dist/src/mcp/catalog/definitions.d.ts.map +1 -1
  136. package/dist/src/mcp/catalog/definitions.js +55 -0
  137. package/dist/src/mcp/catalog/definitions.js.map +1 -1
  138. package/dist/src/mcp/catalog/scopes.d.ts.map +1 -1
  139. package/dist/src/mcp/catalog/scopes.js +12 -0
  140. package/dist/src/mcp/catalog/scopes.js.map +1 -1
  141. package/dist/src/mcp/catalog/surfaces.d.ts.map +1 -1
  142. package/dist/src/mcp/catalog/surfaces.js +2 -0
  143. package/dist/src/mcp/catalog/surfaces.js.map +1 -1
  144. package/dist/src/mcp/index.d.ts.map +1 -1
  145. package/dist/src/mcp/index.js +2 -0
  146. package/dist/src/mcp/index.js.map +1 -1
  147. package/dist/src/models/agent-task-schemas.d.ts +6 -0
  148. package/dist/src/models/agent-task-schemas.d.ts.map +1 -1
  149. package/dist/src/models/agent-task-schemas.js +6 -0
  150. package/dist/src/models/agent-task-schemas.js.map +1 -1
  151. package/dist/src/models/schemas.d.ts +1 -0
  152. package/dist/src/models/schemas.d.ts.map +1 -1
  153. package/dist/src/models/schemas.js +4 -0
  154. package/dist/src/models/schemas.js.map +1 -1
  155. package/dist/src/routes/access-tokens.d.ts +17 -0
  156. package/dist/src/routes/access-tokens.d.ts.map +1 -0
  157. package/dist/src/routes/access-tokens.js +164 -0
  158. package/dist/src/routes/access-tokens.js.map +1 -0
  159. package/dist/src/routes/agent-tasks.d.ts +2 -0
  160. package/dist/src/routes/agent-tasks.d.ts.map +1 -1
  161. package/dist/src/routes/agent-tasks.js +118 -23
  162. package/dist/src/routes/agent-tasks.js.map +1 -1
  163. package/dist/src/routes/agents.d.ts.map +1 -1
  164. package/dist/src/routes/agents.js +46 -0
  165. package/dist/src/routes/agents.js.map +1 -1
  166. package/dist/src/routes/ai.d.ts +6 -9
  167. package/dist/src/routes/ai.d.ts.map +1 -1
  168. package/dist/src/routes/ai.js +26 -175
  169. package/dist/src/routes/ai.js.map +1 -1
  170. package/dist/src/routes/apps.d.ts.map +1 -1
  171. package/dist/src/routes/apps.js +104 -34
  172. package/dist/src/routes/apps.js.map +1 -1
  173. package/dist/src/routes/auth.d.ts.map +1 -1
  174. package/dist/src/routes/auth.js +77 -4
  175. package/dist/src/routes/auth.js.map +1 -1
  176. package/dist/src/routes/cortex.d.ts +2 -1
  177. package/dist/src/routes/cortex.d.ts.map +1 -1
  178. package/dist/src/routes/cortex.js +13 -8
  179. package/dist/src/routes/cortex.js.map +1 -1
  180. package/dist/src/routes/extensions.d.ts.map +1 -1
  181. package/dist/src/routes/extensions.js +85 -51
  182. package/dist/src/routes/extensions.js.map +1 -1
  183. package/dist/src/routes/generator.d.ts.map +1 -1
  184. package/dist/src/routes/generator.js +109 -43
  185. package/dist/src/routes/generator.js.map +1 -1
  186. package/dist/src/routes/ghii.d.ts.map +1 -1
  187. package/dist/src/routes/ghii.js +34 -13
  188. package/dist/src/routes/ghii.js.map +1 -1
  189. package/dist/src/routes/libs.d.ts +15 -0
  190. package/dist/src/routes/libs.d.ts.map +1 -1
  191. package/dist/src/routes/libs.js +178 -55
  192. package/dist/src/routes/libs.js.map +1 -1
  193. package/dist/src/routes/portal.d.ts.map +1 -1
  194. package/dist/src/routes/portal.js +1 -0
  195. package/dist/src/routes/portal.js.map +1 -1
  196. package/dist/src/routes/schedules.d.ts +33 -0
  197. package/dist/src/routes/schedules.d.ts.map +1 -0
  198. package/dist/src/routes/schedules.js +380 -0
  199. package/dist/src/routes/schedules.js.map +1 -0
  200. package/dist/src/server-bootstrap/config-init.js +2 -2
  201. package/dist/src/server-bootstrap/config-init.js.map +1 -1
  202. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  203. package/dist/src/server-bootstrap/routes-loader.js +7 -0
  204. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  205. package/dist/src/server-bootstrap/service-init.d.ts.map +1 -1
  206. package/dist/src/server-bootstrap/service-init.js +2 -1
  207. package/dist/src/server-bootstrap/service-init.js.map +1 -1
  208. package/dist/src/services/access-token.d.ts +28 -0
  209. package/dist/src/services/access-token.d.ts.map +1 -0
  210. package/dist/src/services/access-token.js +37 -0
  211. package/dist/src/services/access-token.js.map +1 -0
  212. package/dist/src/services/ai-completion.d.ts +83 -0
  213. package/dist/src/services/ai-completion.d.ts.map +1 -0
  214. package/dist/src/services/ai-completion.js +187 -0
  215. package/dist/src/services/ai-completion.js.map +1 -0
  216. package/dist/src/services/config-schema.d.ts.map +1 -1
  217. package/dist/src/services/config-schema.js +3 -0
  218. package/dist/src/services/config-schema.js.map +1 -1
  219. package/dist/src/services/generator-prompt-seeds.d.ts.map +1 -1
  220. package/dist/src/services/generator-prompt-seeds.js +6 -3
  221. package/dist/src/services/generator-prompt-seeds.js.map +1 -1
  222. package/dist/src/services/generator-prompts/spec-validate.d.ts.map +1 -1
  223. package/dist/src/services/generator-prompts/spec-validate.js +6 -2
  224. package/dist/src/services/generator-prompts/spec-validate.js.map +1 -1
  225. package/dist/src/services/generator-registration.d.ts +12 -4
  226. package/dist/src/services/generator-registration.d.ts.map +1 -1
  227. package/dist/src/services/generator-registration.js +71 -0
  228. package/dist/src/services/generator-registration.js.map +1 -1
  229. package/dist/src/services/generator-validate.d.ts +10 -0
  230. package/dist/src/services/generator-validate.d.ts.map +1 -1
  231. package/dist/src/services/generator-validate.js +180 -36
  232. package/dist/src/services/generator-validate.js.map +1 -1
  233. package/dist/src/services/owner-session.d.ts +43 -0
  234. package/dist/src/services/owner-session.d.ts.map +1 -0
  235. package/dist/src/services/owner-session.js +175 -0
  236. package/dist/src/services/owner-session.js.map +1 -0
  237. package/dist/src/services/schedule-constraints.d.ts +65 -0
  238. package/dist/src/services/schedule-constraints.d.ts.map +1 -0
  239. package/dist/src/services/schedule-constraints.js +106 -0
  240. package/dist/src/services/schedule-constraints.js.map +1 -0
  241. package/dist/src/services/scheduler.d.ts +34 -0
  242. package/dist/src/services/scheduler.d.ts.map +1 -1
  243. package/dist/src/services/scheduler.js +266 -22
  244. package/dist/src/services/scheduler.js.map +1 -1
  245. package/dist/src/services/skill-bundle/generator.js +19 -0
  246. package/dist/src/services/skill-bundle/generator.js.map +1 -1
  247. package/dist/src/storage/interface.d.ts +48 -4
  248. package/dist/src/storage/interface.d.ts.map +1 -1
  249. package/dist/src/storage/interface.js.map +1 -1
  250. package/dist/src/storage/providers/mongodb/index.d.ts +31 -0
  251. package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
  252. package/dist/src/storage/providers/mongodb/index.js +187 -9
  253. package/dist/src/storage/providers/mongodb/index.js.map +1 -1
  254. package/dist/src/storage/providers/sqlite/index.d.ts +31 -0
  255. package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
  256. package/dist/src/storage/providers/sqlite/index.js +131 -8
  257. package/dist/src/storage/providers/sqlite/index.js.map +1 -1
  258. package/dist/src/storage/providers/sqlite/repos/agent-task.d.ts.map +1 -1
  259. package/dist/src/storage/providers/sqlite/repos/agent-task.js +6 -4
  260. package/dist/src/storage/providers/sqlite/repos/agent-task.js.map +1 -1
  261. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  262. package/dist/src/storage/providers/sqlite/schema.js +79 -8
  263. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  264. package/dist/src/storage/repositories/pat.repository.d.ts +40 -0
  265. package/dist/src/storage/repositories/pat.repository.d.ts.map +1 -0
  266. package/dist/src/storage/repositories/pat.repository.js +14 -0
  267. package/dist/src/storage/repositories/pat.repository.js.map +1 -0
  268. package/dist/src/storage/repositories/scheduler.repository.d.ts +2 -0
  269. package/dist/src/storage/repositories/scheduler.repository.d.ts.map +1 -1
  270. package/dist/src/storage/repositories/session.repository.d.ts +51 -0
  271. package/dist/src/storage/repositories/session.repository.d.ts.map +1 -1
  272. package/dist/src/storage/repositories/session.repository.js +12 -0
  273. package/dist/src/storage/repositories/session.repository.js.map +1 -1
  274. package/dist/src/utils/env-config.d.ts.map +1 -1
  275. package/dist/src/utils/env-config.js +25 -1
  276. package/dist/src/utils/env-config.js.map +1 -1
  277. package/dist/src/utils/env-validator.d.ts.map +1 -1
  278. package/dist/src/utils/env-validator.js +4 -0
  279. package/dist/src/utils/env-validator.js.map +1 -1
  280. package/package.json +1 -1
  281. package/prisma/schema.prisma +48 -0
@@ -1,7 +1,40 @@
1
+ /**
2
+ * @file marketplace.css
3
+ * @description Styles for the marketplace SPA view (.mk- scoped) — listing cards,
4
+ * browse/search forms, status badges, instance selector, and pagination.
5
+ * @version-history
6
+ * v1.1.0 — 2026-06-02 — Phase 5: tokenize for dark mode (bare color literals → theme tokens)
7
+ * v1.2.0 — 2026-06-02 — Component unification (#4 buttons): remove .mk-btn* family;
8
+ * marketplace buttons use canonical theme.css .btn-primary / .btn-outline / .btn-sm.
9
+ * v1.3.0 — 2026-06-02 — Component unification (#5 inputs): remove .mk-form-input/
10
+ * -textarea/-select; fields use canonical .input-field (kept mk-form-group/-label/-grid).
11
+ * v1.4.0 — 2026-06-02 — Component unification (#6 stat cards): remove .mk-stat*;
12
+ * stats use canonical .stat-grid / .stat-card / .stat-card-value.accent / .stat-card-label.
13
+ * v1.5.0 — 2026-06-02 — Component unification (#19): tokenize .mk-alert-success/-error
14
+ * (hardcoded rgba/#ef4444 → --success/-danger -bg/-fg/-border) — dark-mode fix.
15
+ * v1.6.0 — 2026-06-02 — Component unification (#15 headers): tokenize .mk-page-title
16
+ * gradient (hardcoded #E8564A → var(--accent-deep)); now token-equivalent to
17
+ * canonical theme.css .page-title/.page-subtitle (candidates for future deletion).
18
+ * v1.7.0 — 2026-06-02 — Component unification (#18 category cards): remove .mk-category-card/
19
+ * -icon/-name/-count; tiles use canonical theme.css .category-card (kept .mk-categories-grid
20
+ * wrapper — 160px columns differ from hobbies' 200px). Removed hardcoded hover #E8564A and
21
+ * rgba(0,0,0,0.06) shadow (now tokenized in the canonical class) — dark-mode fix.
22
+ * v1.8.0 — 2026-06-02 — Component unification (#17 pagination): tokenize
23
+ * .mk-pagination a.active background (hardcoded rgba(232,86,74,0.06) →
24
+ * var(--accent-subtle)) — dark-mode fix. Markup left in place (scoped .mk-,
25
+ * prev/"Page X"/next shape); canonical Pagination/LoadMore added in theme.css.
26
+ * v1.9.0 — 2026-06-02 — Component unification (#16 tags): tokenize .mk-tag and
27
+ * .mk-price-badge (hardcoded rgba(232,86,74,0.06)/0.2 + #E8564A →
28
+ * var(--accent-subtle) / var(--accent-border) / var(--accent)) — dark-mode fix.
29
+ * Markup left as .mk-tag (rounded-20px pill, bespoke vs canonical .tag-pill).
30
+ */
31
+
1
32
  /* marketplace view — scoped under .mk- */
33
+ /* mk-page-title is token-equivalent to the canonical theme.css .page-title
34
+ (candidate for future deletion → use .page-title). */
2
35
  .mk-page-title {
3
36
  font-size: 1.8rem; font-weight: 700;
4
- background: linear-gradient(135deg, var(--accent), #E8564A);
37
+ background: linear-gradient(135deg, var(--accent), var(--accent-deep));
5
38
  -webkit-background-clip: text; -webkit-text-fill-color: transparent;
6
39
  background-clip: text; margin-bottom: 8px;
7
40
  }
@@ -9,11 +42,11 @@
9
42
  .mk-section-heading { font-size: 1.1rem; color: var(--text); margin-bottom: 16px; }
10
43
 
11
44
  .mk-card {
12
- background: #FFFFFF; border: 1px solid #E5E7EB;
45
+ background: var(--bg-card); border: 1px solid var(--border);
13
46
  border-radius: 16px; padding: 24px; margin-bottom: 16px;
14
47
  transition: background 0.2s, border-color 0.2s, box-shadow 0.2s;
15
48
  }
16
- .mk-card:hover { background: #F3F4F6; border-color: #E8564A; box-shadow: 0 2px 8px rgba(0,0,0,0.06); }
49
+ .mk-card:hover { background: var(--bg-surface); border-color: #E8564A; box-shadow: 0 2px 8px rgba(0,0,0,0.06); }
17
50
  .mk-card-clickable { text-decoration: none; display: block; cursor: pointer; }
18
51
  .mk-card-title { font-size: 1.1rem; font-weight: 600; color: var(--text); margin-bottom: 8px; }
19
52
  .mk-card-meta { color: var(--text-dim); font-size: 0.85rem; margin-bottom: 8px; }
@@ -25,89 +58,69 @@
25
58
  .mk-tags { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0; }
26
59
  .mk-tag {
27
60
  display: inline-block; padding: 4px 12px;
28
- background: rgba(232,86,74,0.06); border: 1px solid rgba(232,86,74,0.2);
29
- border-radius: 20px; font-size: 0.8rem; color: #E8564A; white-space: nowrap;
61
+ background: var(--accent-subtle); border: 1px solid var(--accent-border);
62
+ border-radius: 20px; font-size: 0.8rem; color: var(--accent); white-space: nowrap;
30
63
  }
31
64
 
32
65
  .mk-price-badge {
33
66
  display: inline-flex; align-items: center; gap: 4px;
34
- padding: 6px 14px; background: rgba(232,86,74,0.06);
35
- border: 1px solid rgba(232,86,74,0.2); border-radius: 20px;
36
- font-size: 0.9rem; font-weight: 600; color: #E8564A;
67
+ padding: 6px 14px; background: var(--accent-subtle);
68
+ border: 1px solid var(--accent-border); border-radius: 20px;
69
+ font-size: 0.9rem; font-weight: 600; color: var(--accent);
37
70
  }
38
71
 
39
72
  .mk-status-badge {
40
73
  display: inline-block; padding: 3px 10px; border-radius: 12px;
41
74
  font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.03em;
42
75
  }
43
- .mk-status-active { background: rgba(34,197,94,0.1); border: 1px solid rgba(34,197,94,0.3); color: var(--success); }
44
- .mk-status-sold { background: rgba(99,102,241,0.1); border: 1px solid rgba(99,102,241,0.3); color: #818cf8; }
45
- .mk-status-pending { background: rgba(234,179,8,0.1); border: 1px solid rgba(234,179,8,0.3); color: #eab308; }
46
- .mk-status-delivered { background: rgba(34,197,94,0.1); border: 1px solid rgba(34,197,94,0.3); color: var(--success); }
47
- .mk-status-completed { background: rgba(99,102,241,0.1); border: 1px solid rgba(99,102,241,0.3); color: #818cf8; }
48
- .mk-status-delisted { background: rgba(239,68,68,0.1); border: 1px solid rgba(239,68,68,0.3); color: #ef4444; }
49
-
50
- .mk-stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 12px; margin-bottom: 32px; }
51
- .mk-stat-card { background: #FFFFFF; border: 1px solid #E5E7EB; border-radius: 10px; padding: 16px; text-align: center; }
52
- .mk-stat-value { font-size: 1.5rem; font-weight: 700; color: var(--accent); }
53
- .mk-stat-label { font-size: 0.78rem; color: var(--text-muted, #6b6b8a); margin-top: 4px; }
76
+ .mk-status-active { background: var(--success-bg); border: 1px solid var(--success-border); color: var(--success-fg); }
77
+ .mk-status-sold { background: var(--info-bg); border: 1px solid var(--info-border); color: var(--info-fg); }
78
+ .mk-status-pending { background: var(--warn-bg); border: 1px solid var(--warn-border); color: var(--warn-fg); }
79
+ .mk-status-delivered { background: var(--success-bg); border: 1px solid var(--success-border); color: var(--success-fg); }
80
+ .mk-status-completed { background: var(--info-bg); border: 1px solid var(--info-border); color: var(--info-fg); }
81
+ .mk-status-delisted { background: var(--danger-bg); border: 1px solid var(--danger-border); color: var(--danger-fg); }
82
+
83
+ /* .mk-stat* removed — marketplace stats use canonical .stat-grid / .stat-card /
84
+ .stat-card-value.accent / .stat-card-label. Unified 2026-06-02 (#6). */
54
85
 
86
+ /* Grid wrapper kept per-view: marketplace uses 160px min-width columns (hobbies 200px). */
55
87
  .mk-categories-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 12px; margin-bottom: 32px; }
56
- .mk-category-card {
57
- background: #FFFFFF; border: 1px solid #E5E7EB;
58
- border-radius: 16px; padding: 20px; text-align: center; text-decoration: none;
59
- transition: all 0.2s; cursor: pointer;
60
- }
61
- .mk-category-card:hover { background: #F3F4F6; border-color: #E8564A; box-shadow: 0 2px 8px rgba(0,0,0,0.06); }
62
- .mk-category-icon { font-size: 2rem; margin-bottom: 8px; }
63
- .mk-category-name { font-size: 0.95rem; font-weight: 600; color: var(--text); }
64
- .mk-category-count { font-size: 0.78rem; color: var(--text-muted, #6b6b8a); margin-top: 4px; }
88
+ /* .mk-category-card/-icon/-name/-count removed — marketplace category tiles use
89
+ canonical theme.css .category-card / -icon / -name / -count. The former rules were
90
+ token-equivalent (border-radius:16px === var(--radius)); the hover #E8564A and
91
+ rgba(0,0,0,0.06) shadow are now tokenized (var(--accent)/var(--shadow-md)).
92
+ Unified 2026-06-02 (#18). */
65
93
 
66
94
  .mk-empty-state { text-align: center; padding: 48px 16px; }
67
95
  .mk-empty-icon { font-size: 3rem; margin-bottom: 16px; opacity: 0.4; }
68
96
  .mk-empty-text { color: var(--text-dim); font-size: 1rem; }
69
97
 
70
98
  .mk-alert { padding: 12px 16px; border-radius: 10px; margin-bottom: 16px; font-size: 0.9rem; }
71
- .mk-alert-success { background: rgba(34,197,94,0.1); border: 1px solid rgba(34,197,94,0.3); color: var(--success); }
72
- .mk-alert-error { background: rgba(239,68,68,0.1); border: 1px solid rgba(239,68,68,0.3); color: #ef4444; }
73
- .mk-alert-info { background: #F3F4F6; border: 1px solid #E5E7EB; color: var(--text-dim); }
74
-
75
- .mk-btn {
76
- display: inline-flex; align-items: center; justify-content: center;
77
- padding: 10px 24px; border: none; border-radius: 10px;
78
- font-size: 0.9rem; font-weight: 600; cursor: pointer; transition: all 0.2s; text-decoration: none;
79
- }
80
- .mk-btn-primary { background: linear-gradient(135deg, var(--accent), #E8564A); color: #fff; }
81
- .mk-btn-primary:hover { opacity: 0.9; box-shadow: 0 2px 8px rgba(232,86,74,0.2); }
82
- .mk-btn-secondary { background: #F3F4F6; border: 1px solid #E5E7EB; color: var(--text); }
83
- .mk-btn-secondary:hover { background: #E5E7EB; border-color: var(--accent); color: var(--accent); }
84
- .mk-btn-sm { padding: 6px 14px; font-size: 0.8rem; }
99
+ .mk-alert-success { background: var(--success-bg); border: 1px solid var(--success-border); color: var(--success-fg); }
100
+ .mk-alert-error { background: var(--danger-bg); border: 1px solid var(--danger-border); color: var(--danger-fg); }
101
+ .mk-alert-info { background: var(--bg-surface); border: 1px solid var(--border); color: var(--text-dim); }
102
+
103
+ /* .mk-btn* removed — marketplace uses canonical theme.css .btn-primary / .btn-outline /
104
+ .btn-sm (anchor-safe). Unified 2026-06-02 (#4 buttons). */
85
105
 
86
106
  .mk-form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
87
107
  .mk-form-group { margin-bottom: 16px; }
88
108
  .mk-form-label { display: block; font-size: 0.85rem; color: var(--text-dim); margin-bottom: 6px; font-weight: 500; }
89
- .mk-form-input, .mk-form-textarea, .mk-form-select {
90
- width: 100%; padding: 10px 14px;
91
- background: #FFFFFF; border: 1px solid #E5E7EB;
92
- border-radius: 10px; color: #1A1A2E; font-size: 0.9rem;
93
- font-family: system-ui, -apple-system, 'Segoe UI', sans-serif; transition: border-color 0.2s;
94
- }
95
- .mk-form-input:focus, .mk-form-textarea:focus, .mk-form-select:focus { outline: none; border-color: var(--accent); }
96
- .mk-form-textarea { min-height: 80px; resize: vertical; }
97
- .mk-form-select { appearance: auto; }
109
+ /* .mk-form-input/-textarea/-select removed — marketplace form fields use canonical
110
+ theme.css .input-field (tokenized, focus ring, var(--font)). Unified 2026-06-02 (#5). */
98
111
 
99
112
  .mk-pagination { display: flex; gap: 8px; justify-content: center; margin-top: 24px; }
100
113
  .mk-pagination a {
101
- padding: 8px 16px; background: #FFFFFF;
102
- border: 1px solid #E5E7EB; border-radius: 10px;
114
+ padding: 8px 16px; background: var(--bg-card);
115
+ border: 1px solid var(--border); border-radius: 10px;
103
116
  color: var(--text); text-decoration: none; font-size: 0.85rem; cursor: pointer;
104
117
  }
105
118
  .mk-pagination a:hover { border-color: var(--accent); color: var(--accent); }
106
- .mk-pagination a.active { border-color: var(--accent); color: var(--accent); background: rgba(232,86,74,0.06); }
119
+ .mk-pagination a.active { border-color: var(--accent); color: var(--accent); background: var(--accent-subtle); }
107
120
 
108
121
  .mk-stars { color: #eab308; font-size: 1.1rem; letter-spacing: 2px; }
109
122
 
110
- .mk-nav { display: flex; gap: 12px; flex-wrap: wrap; margin-bottom: 24px; padding-bottom: 16px; border-bottom: 1px solid #E5E7EB; }
123
+ .mk-nav { display: flex; gap: 12px; flex-wrap: wrap; margin-bottom: 24px; padding-bottom: 16px; border-bottom: 1px solid var(--border); }
111
124
  .mk-nav a {
112
125
  color: var(--text-dim); text-decoration: none; font-size: 0.85rem;
113
126
  cursor: pointer; transition: color 0.2s; padding: 4px 8px; border-radius: 6px;
@@ -116,15 +129,15 @@
116
129
 
117
130
  /* Instance selector */
118
131
  .mk-instance-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 16px; margin: 24px 0; }
119
- .mk-instance-card { background: #FFFFFF; border: 1px solid #E5E7EB; border-radius: 12px; padding: 20px; cursor: pointer; transition: border-color 0.2s, transform 0.1s; }
132
+ .mk-instance-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: 12px; padding: 20px; cursor: pointer; transition: border-color 0.2s, transform 0.1s; }
120
133
  .mk-instance-card:hover { border-color: var(--accent, #06b6d4); transform: translateY(-2px); }
121
134
  .mk-instance-name { font-size: 1.2rem; font-weight: 600; color: var(--text); margin-bottom: 4px; }
122
135
  .mk-instance-meta { font-size: 0.85rem; color: var(--text-dim, #94a3b8); }
123
136
  .mk-visibility-badge { display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: 0.75rem; font-weight: 500; }
124
- .mk-vis-public { background: rgba(34,197,94,0.15); color: #22c55e; }
125
- .mk-vis-password { background: rgba(234,179,8,0.15); color: #eab308; }
126
- .mk-vis-invite { background: rgba(129,140,248,0.15); color: #818cf8; }
127
- .mk-vis-group { background: rgba(16,185,129,0.15); color: #10b981; }
137
+ .mk-vis-public { background: var(--success-bg); color: var(--success-fg); }
138
+ .mk-vis-password { background: var(--warn-bg); color: var(--warn-fg); }
139
+ .mk-vis-invite { background: var(--info-bg); color: var(--info-fg); }
140
+ .mk-vis-group { background: var(--success-bg); color: var(--success-fg); }
128
141
  .mk-back-link { cursor: pointer; color: var(--accent, #06b6d4); margin-bottom: 16px; display: inline-block; }
129
142
 
130
143
  @media (max-width: 600px) {
@@ -1,28 +1,34 @@
1
+ /*
2
+ * @file openclaw.css
3
+ * @description Styles for the OpenClaw view (scoped under .oc-). Hero, info cards, code blocks, tool tables, scenario cards, and CTA section.
4
+ * @version-history
5
+ * v1.1.0 — 2026-06-02 — Phase 5: tokenize for dark mode (replace bare light-only literals with flipping theme tokens)
6
+ */
1
7
  /* openclaw view — scoped under .oc- */
2
8
  .oc-container { position: relative; z-index: 1; max-width: 860px; margin: 0 auto; padding: 2rem 1.5rem 4rem; }
3
9
  .oc-hero { text-align: center; padding: 3rem 0 2rem; }
4
10
  .oc-hero h1 { font-size: 2.2rem; font-weight: 800; background: linear-gradient(135deg, var(--accent), var(--purple)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; margin-bottom: .75rem; }
5
11
  .oc-hero p { font-size: 1.1rem; color: var(--text-dim); max-width: 600px; margin: 0 auto; }
6
12
  .oc-section { margin: 3rem 0; }
7
- .oc-section h2 { font-size: 1.5rem; font-weight: 700; color: var(--text); margin-bottom: 1rem; padding-bottom: .5rem; border-bottom: 1px solid #E5E7EB; }
13
+ .oc-section h2 { font-size: 1.5rem; font-weight: 700; color: var(--text); margin-bottom: 1rem; padding-bottom: .5rem; border-bottom: 1px solid var(--border); }
8
14
  .oc-section h3 { font-size: 1.15rem; font-weight: 600; color: var(--purple); margin: 1.5rem 0 .5rem; }
9
15
  .oc-section p, .oc-section li { color: var(--text); font-size: .95rem; margin-bottom: .5rem; }
10
16
  .oc-section ul, .oc-section ol { padding-left: 1.5rem; }
11
17
  .oc-card-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 1rem; margin: 1.5rem 0; }
12
- .oc-info-card { background: var(--card-bg); border: 1px solid #E5E7EB; border-radius: var(--radius); padding: 1.25rem; transition: background .2s; }
18
+ .oc-info-card { background: var(--card-bg); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.25rem; transition: background .2s; }
13
19
  .oc-info-card:hover { background: var(--card-bg-hover); }
14
20
  .oc-info-card .icon { font-size: 1.8rem; margin-bottom: .5rem; }
15
21
  .oc-info-card h4 { font-size: 1rem; font-weight: 700; color: var(--text); margin-bottom: .25rem; }
16
22
  .oc-info-card p { font-size: .85rem; color: var(--text-muted); margin: 0; }
17
- .oc-code-block { background: #F3F4F6; border: 1px solid #E5E7EB; border-radius: var(--radius-sm); padding: 1rem 1.25rem; font-family: var(--font-mono); font-size: .85rem; color: #6D28D9; overflow-x: auto; white-space: pre; margin: 1rem 0; position: relative; }
23
+ .oc-code-block { background: var(--code-bg); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 1rem 1.25rem; font-family: var(--font-mono); font-size: .85rem; color: var(--purple); overflow-x: auto; white-space: pre; margin: 1rem 0; position: relative; }
18
24
  .oc-code-block .label { position: absolute; top: .5rem; right: .75rem; font-size: .7rem; color: var(--text-muted); font-family: var(--font); text-transform: uppercase; letter-spacing: .05em; }
19
25
  .oc-tool-table { width: 100%; border-collapse: collapse; margin: 1rem 0; font-size: .85rem; }
20
- .oc-tool-table th { text-align: left; padding: .6rem .75rem; font-weight: 700; color: var(--text); border-bottom: 2px solid #E5E7EB; font-size: .8rem; text-transform: uppercase; letter-spacing: .03em; }
21
- .oc-tool-table td { padding: .5rem .75rem; border-bottom: 1px solid #F3F4F6; vertical-align: top; }
26
+ .oc-tool-table th { text-align: left; padding: .6rem .75rem; font-weight: 700; color: var(--text); border-bottom: 2px solid var(--border); font-size: .8rem; text-transform: uppercase; letter-spacing: .03em; }
27
+ .oc-tool-table td { padding: .5rem .75rem; border-bottom: 1px solid var(--bg-surface); vertical-align: top; }
22
28
  .oc-tool-table tr:hover td { background: rgba(232,86,74,0.04); }
23
29
  .oc-tool-name { color: var(--purple); font-family: monospace; font-weight: 600; white-space: nowrap; }
24
30
  .oc-tool-params { color: var(--text-muted); font-family: monospace; font-size: .8rem; }
25
- .oc-scenario { background: var(--card-bg); border: 1px solid #E5E7EB; border-radius: var(--radius); padding: 1.5rem; margin: 1rem 0; }
31
+ .oc-scenario { background: var(--card-bg); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.5rem; margin: 1rem 0; }
26
32
  .oc-scenario h4 { color: var(--accent); font-size: 1rem; margin-bottom: .5rem; }
27
33
  .oc-scenario .flow { color: var(--text-dim); font-size: .9rem; }
28
34
  .oc-scenario .flow code { color: var(--purple); background: rgba(109,40,217,.08); padding: .1rem .4rem; border-radius: 4px; }
@@ -1,3 +1,11 @@
1
+ /*
2
+ * @file portal-classic.css
3
+ * @description Styles for the classic portal landing view (scoped under .cl) — hero,
4
+ * welcome board, cards grid, mega-prompt, and economy footer.
5
+ * @version-history
6
+ * v1.1.0 — 2026-06-02 — Phase 5: tokenize for dark mode (replace bare light-only
7
+ * surface/border/text literals with theme tokens that flip between light/dark)
8
+ */
1
9
  /* portal-classic view — scoped under .cl */
2
10
  /* ── Hero Section ── */
3
11
  .cl-hero {
@@ -29,7 +37,7 @@
29
37
  border: 1px solid rgba(124, 58, 237, 0.15);
30
38
  border-radius: 10px;
31
39
  font-size: 0.82rem;
32
- color: #6D28D9;
40
+ color: var(--purple);
33
41
  margin-bottom: 1.5rem;
34
42
  max-width: 720px;
35
43
  margin-left: auto;
@@ -39,7 +47,7 @@
39
47
  /* ── Welcome Board ── */
40
48
  .cl-welcome-section {
41
49
  background: rgba(232, 86, 74, 0.06);
42
- border: 1px solid #E5E7EB;
50
+ border: 1px solid var(--border);
43
51
  border-radius: 16px;
44
52
  padding: 1.5rem;
45
53
  margin-bottom: 2rem;
@@ -62,9 +70,9 @@
62
70
  .cl-board-list {
63
71
  max-height: 200px;
64
72
  overflow-y: auto;
65
- border: 1px solid #E5E7EB;
73
+ border: 1px solid var(--border);
66
74
  border-radius: 10px;
67
- background: #FFFFFF;
75
+ background: var(--bg-card);
68
76
  }
69
77
  .cl-board-empty {
70
78
  padding: 1rem;
@@ -75,7 +83,7 @@
75
83
  }
76
84
  .cl-board-msg {
77
85
  padding: 0.6rem 0.85rem;
78
- border-bottom: 1px solid #F3F4F6;
86
+ border-bottom: 1px solid var(--border);
79
87
  font-size: 0.88rem;
80
88
  color: var(--text, #374151);
81
89
  line-height: 1.5;
@@ -101,8 +109,8 @@
101
109
  .cl-memory-input {
102
110
  flex: 1;
103
111
  padding: 0.85rem 1rem;
104
- background: #FFFFFF;
105
- border: 1px solid #E5E7EB;
112
+ background: var(--bg-card);
113
+ border: 1px solid var(--border);
106
114
  border-radius: 10px;
107
115
  color: var(--text, #1A1A2E);
108
116
  font-size: 0.95rem;
@@ -114,7 +122,7 @@
114
122
  .cl-memory-input:focus {
115
123
  border-color: var(--accent, #E8564A);
116
124
  box-shadow: 0 0 0 3px rgba(232, 86, 74, 0.15);
117
- background: #FFFFFF;
125
+ background: var(--bg-card);
118
126
  }
119
127
  .cl-memory-input::placeholder { color: var(--text-muted, #9CA3AF); }
120
128
  .cl-welcome-result {
@@ -194,15 +202,15 @@
194
202
 
195
203
  /* ── Card ── */
196
204
  .cl-card {
197
- background: #FFFFFF;
198
- border: 1px solid #E5E7EB;
205
+ background: var(--bg-card);
206
+ border: 1px solid var(--border);
199
207
  border-radius: 16px;
200
208
  overflow: hidden;
201
209
  transition: background 0.35s ease, border-color 0.35s ease, box-shadow 0.35s ease, transform 0.35s ease;
202
210
  cursor: pointer;
203
211
  }
204
212
  .cl-card:hover {
205
- background: #FFFFFF;
213
+ background: var(--bg-card);
206
214
  border-color: rgba(232, 86, 74, 0.4);
207
215
  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.06), 0 8px 32px rgba(0, 0, 0, 0.04);
208
216
  transform: translateY(-2px);
@@ -248,7 +256,7 @@
248
256
  align-items: center;
249
257
  justify-content: center;
250
258
  flex-shrink: 0;
251
- background: #F3F4F6;
259
+ background: var(--bg-surface);
252
260
  color: var(--text-dim, #6B7280);
253
261
  font-size: 0.75rem;
254
262
  transition: transform 0.3s ease, background 0.3s ease, color 0.3s ease;
@@ -272,7 +280,7 @@
272
280
 
273
281
  .cl-card-desc {
274
282
  font-size: 0.92rem;
275
- color: #6B7280;
283
+ color: var(--text-dim);
276
284
  line-height: 1.7;
277
285
  margin-bottom: 1.25rem;
278
286
  }
@@ -287,7 +295,7 @@
287
295
  border-color: rgba(99, 102, 241, 0.15);
288
296
  }
289
297
  .cl-group-agents.expanded {
290
- border-color: #6366f1;
298
+ border-color: var(--purple);
291
299
  box-shadow: 0 4px 24px rgba(99, 102, 241, 0.1), 0 8px 32px rgba(0, 0, 0, 0.06);
292
300
  }
293
301
  .cl-group-builders .cl-card-icon {
@@ -314,8 +322,8 @@
314
322
  min-height: 200px;
315
323
  max-height: 400px;
316
324
  padding: 1rem;
317
- background: #F3F4F6;
318
- border: 1px solid #E5E7EB;
325
+ background: var(--code-bg);
326
+ border: 1px solid var(--border);
319
327
  border-radius: 10px;
320
328
  color: var(--text, #374151);
321
329
  font-family: 'Courier New', monospace;
@@ -363,7 +371,7 @@
363
371
  .cl-prompt-steps {
364
372
  margin-top: 0.75rem;
365
373
  font-size: 0.82rem;
366
- color: #6B7280;
374
+ color: var(--text-dim);
367
375
  line-height: 1.7;
368
376
  }
369
377
  .cl-prompt-steps ol { padding-left: 1.2rem; }
@@ -396,14 +404,14 @@
396
404
  transform: translateY(-1px);
397
405
  }
398
406
  .cl-launcher-cta.secondary {
399
- background: #F3F4F6;
400
- border-color: #E5E7EB;
407
+ background: var(--bg-surface);
408
+ border-color: var(--border);
401
409
  font-weight: 600;
402
410
  font-size: 0.85rem;
403
411
  padding: 0.45rem 1rem;
404
412
  }
405
413
  .cl-launcher-cta.secondary:hover {
406
- background: #E5E7EB;
414
+ background: var(--border);
407
415
  border-color: rgba(251, 191, 36, 0.3);
408
416
  }
409
417
 
@@ -419,11 +427,11 @@
419
427
  font-weight: 700;
420
428
  font-size: 0.95rem;
421
429
  margin-bottom: 0.5rem;
422
- color: #374151;
430
+ color: var(--text-dim);
423
431
  }
424
432
  .cl-return-motivation {
425
433
  font-size: 0.85rem;
426
- color: #6B7280;
434
+ color: var(--text-dim);
427
435
  margin-bottom: 0.5rem;
428
436
  }
429
437
 
@@ -439,20 +447,20 @@
439
447
  font-weight: 700;
440
448
  font-size: 0.95rem;
441
449
  margin-bottom: 0.5rem;
442
- color: #374151;
450
+ color: var(--text-dim);
443
451
  }
444
452
  .cl-connect-desc {
445
453
  font-size: 0.88rem;
446
- color: #6B7280;
454
+ color: var(--text-dim);
447
455
  margin-bottom: 0.75rem;
448
456
  }
449
457
  .cl-connect-link {
450
- color: #7C3AED;
458
+ color: var(--purple);
451
459
  text-decoration: underline;
452
460
  text-underline-offset: 2px;
453
461
  font-size: 0.9rem;
454
462
  }
455
- .cl-connect-link:hover { color: #6D28D9; }
463
+ .cl-connect-link:hover { color: var(--purple); }
456
464
 
457
465
  /* ── Morsels economy footer ── */
458
466
  .cl-morsels-economy {
@@ -1,4 +1,16 @@
1
- /* portal-dev view — scoped under .dev-portal */
1
+ /*
2
+ * @file portal-dev.css
3
+ * @description "For Developers" portal view styles (.dv-* prefix) — animated
4
+ * background layers, onboarding steps, platform/goal cards, prompt output,
5
+ * capability tabs. Consumes theme.css tokens so it flips with dark/light.
6
+ * @version-history
7
+ * v1.1.0 — 2026-06-02 — Phase 4: tokenize card/panel/border/text/bg-layer/code
8
+ * surfaces (#FFFFFF/#E5E7EB/#F3F4F6/#6B7280) for dark mode.
9
+ * v1.2.0 — 2026-06-02 — Component unification (#6 stat cards): remove .dv-stat*/
10
+ * .dv-num/.dv-label; dev-portal stats use canonical .stat-card family.
11
+ * v1.3.0 — 2026-06-02 — Component unification (#11): remove .dv-dot (had a
12
+ * hardcoded #22c55e); node-badge dot uses canonical <StatusDot>.
13
+ */
2
14
  /* ── Dev Portal root vars ── */
3
15
  :root {
4
16
  --love1: #E8564A;
@@ -11,24 +23,24 @@
11
23
  /* ── Background system ── */
12
24
  .dv-bg-layer { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 0; pointer-events: none; transition: opacity .8s ease; }
13
25
  .dv-bg-hidden { opacity: 0; }
14
- .dv-bg-hearts { background: #F3F4F6; }
26
+ .dv-bg-hearts { background: var(--bg); }
15
27
  .dv-heart-particle { position: absolute; bottom: -60px; opacity: 0; font-size: 1.2rem; animation: dv-floatUp linear infinite; filter: drop-shadow(0 0 6px rgba(232,86,74,.2)); }
16
28
  @keyframes dv-floatUp { 0% { transform: translateY(0) rotate(0deg) scale(1); opacity: 0; } 10% { opacity: .7; } 90% { opacity: .7; } 100% { transform: translateY(-110vh) rotate(720deg) scale(.3); opacity: 0; } }
17
- .dv-bg-aurora { background: #F3F4F6; }
29
+ .dv-bg-aurora { background: var(--bg); }
18
30
  .dv-aurora-wave { position: absolute; width: 200%; height: 60%; left: -50%; border-radius: 50%; filter: blur(80px); opacity: .12; animation: dv-auroraShift 8s ease-in-out infinite alternate; }
19
31
  .dv-aurora-wave:nth-child(1) { top: 10%; background: linear-gradient(90deg, #E8564A, #D44A3F, #F06B5E, #E8564A); animation-duration: 8s; }
20
32
  .dv-aurora-wave:nth-child(2) { top: 30%; background: linear-gradient(90deg, #E8564A, #B8403A, #E8564A, #D44A3F); animation-duration: 12s; animation-delay: -4s; }
21
33
  .dv-aurora-wave:nth-child(3) { top: 55%; background: linear-gradient(90deg, #D44A3F, #E8564A, #F06B5E, #B8403A); animation-duration: 10s; animation-delay: -2s; }
22
34
  @keyframes dv-auroraShift { 0% { transform: translateX(-20%) scaleY(1); } 50% { transform: translateX(10%) scaleY(1.3); } 100% { transform: translateX(-10%) scaleY(.8); } }
23
- .dv-bg-sparkle { background: #F3F4F6; }
35
+ .dv-bg-sparkle { background: var(--bg); }
24
36
  .dv-sparkle { position: absolute; width: 3px; height: 3px; border-radius: 50%; background: #E8564A; animation: dv-sparkleAnim ease-in-out infinite; }
25
37
  @keyframes dv-sparkleAnim { 0%, 100% { opacity: 0; transform: scale(0); } 50% { opacity: 1; transform: scale(1); box-shadow: 0 0 8px 2px var(--love1), 0 0 20px 4px var(--love4); } }
26
38
  .dv-nebula-blob { position: absolute; border-radius: 50%; filter: blur(100px); opacity: .08; animation: dv-nebulaFloat 15s ease-in-out infinite alternate; }
27
39
  @keyframes dv-nebulaFloat { 0% { transform: translate(0,0) scale(1); } 100% { transform: translate(40px,-30px) scale(1.2); } }
28
40
 
29
41
  /* BG selector */
30
- .dv-bg-selector { position: fixed; bottom: 1.5rem; right: 1.5rem; z-index: 200; display: flex; gap: .5rem; background: #FFFFFF; border: 1px solid #E5E7EB; border-radius: 30px; padding: .4rem .6rem; box-shadow: 0 2px 8px rgba(0,0,0,0.06); }
31
- .dv-bg-btn { width: 36px; height: 36px; border-radius: 50%; border: 2px solid transparent; cursor: pointer; transition: all .25s; display: flex; align-items: center; justify-content: center; font-size: .9rem; background: #F3F4F6; }
42
+ .dv-bg-selector { position: fixed; bottom: 1.5rem; right: 1.5rem; z-index: 200; display: flex; gap: .5rem; background: var(--bg-card); border: 1px solid var(--border); border-radius: 30px; padding: .4rem .6rem; box-shadow: 0 2px 8px rgba(0,0,0,0.06); }
43
+ .dv-bg-btn { width: 36px; height: 36px; border-radius: 50%; border: 2px solid transparent; cursor: pointer; transition: all .25s; display: flex; align-items: center; justify-content: center; font-size: .9rem; background: var(--bg-surface); }
32
44
  .dv-bg-btn:hover { border-color: var(--love1); transform: scale(1.15); }
33
45
  .dv-bg-btn.active { border-color: var(--love1); box-shadow: 0 0 12px rgba(232,86,74,.2); }
34
46
 
@@ -38,19 +50,16 @@
38
50
  .dv-container h2 { font-size: 1.3rem; font-weight: 600; margin-bottom: .75rem; color: var(--love1); }
39
51
  .dv-container h3 { font-size: 1.1rem; font-weight: 600; margin-bottom: .5rem; }
40
52
  .dv-subtitle { color: var(--love4, #E8564A); font-size: .95rem; margin-bottom: 2rem; }
41
- .dv-node-badge { display: inline-flex; align-items: center; gap: .5rem; background: #FFFFFF; border: 1px solid #E5E7EB; border-radius: 8px; padding: .4rem .8rem; font-size: .85rem; font-family: monospace; margin-bottom: 1.5rem; }
42
- .dv-dot { width: 8px; height: 8px; border-radius: 50%; background: #22c55e; display: inline-block; }
53
+ .dv-node-badge { display: inline-flex; align-items: center; gap: .5rem; background: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; padding: .4rem .8rem; font-size: .85rem; font-family: monospace; margin-bottom: 1.5rem; }
54
+ /* .dv-dot removed — node-badge dot uses canonical <StatusDot>. Unified 2026-06-02 (#11). */
43
55
 
44
- /* Stats */
45
- .dv-stats { display: flex; gap: 1rem; margin-bottom: 2rem; flex-wrap: wrap; }
46
- .dv-stat { background: #FFFFFF; border: 1px solid #E5E7EB; border-radius: 12px; padding: .75rem 1rem; flex: 1; min-width: 120px; text-align: center; }
47
- .dv-num { font-size: 1.5rem; font-weight: 700; color: var(--love1); }
48
- .dv-label { font-size: .75rem; color: #6B7280; text-transform: uppercase; letter-spacing: .05em; }
56
+ /* Stats — .dv-stat*/.dv-num/.dv-label removed; dev-portal stats use canonical
57
+ .stat-grid / .stat-card / .stat-card-value.accent / .stat-card-label. Unified 2026-06-02 (#6). */
49
58
 
50
59
  /* Mode notice */
51
60
  .dv-mode-notice { border-radius: 12px; padding: 1rem 1.5rem; margin-bottom: 1.5rem; font-size: .9rem; display: flex; align-items: flex-start; gap: .75rem; }
52
- .dv-mode-notice-anon { background: rgba(124,58,237,.06); border: 1px solid rgba(124,58,237,.15); }
53
- .dv-mode-notice-user { background: rgba(34,197,94,.06); border: 1px solid rgba(34,197,94,.15); }
61
+ .dv-mode-notice-anon { background: var(--purple-bg); border: 1px solid var(--purple-border); }
62
+ .dv-mode-notice-user { background: var(--success-bg); border: 1px solid var(--success-border); }
54
63
  .dv-notice-icon { font-size: 1.3rem; flex-shrink: 0; }
55
64
 
56
65
  /* Steps */
@@ -62,57 +71,57 @@
62
71
 
63
72
  /* Platform grid */
64
73
  .dv-platforms { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: .75rem; margin-bottom: 1rem; }
65
- .dv-platform-card { background: #FFFFFF; border: 2px solid #E5E7EB; border-radius: 12px; padding: 1rem; text-align: center; cursor: pointer; transition: all .15s; }
74
+ .dv-platform-card { background: var(--bg-card); border: 2px solid var(--border); border-radius: 12px; padding: 1rem; text-align: center; cursor: pointer; transition: all .15s; }
66
75
  .dv-platform-card:hover { border-color: var(--love1); transform: translateY(-2px); box-shadow: 0 4px 20px rgba(232,86,74,.08); }
67
76
  .dv-platform-card.selected { border-color: var(--love1); background: rgba(232,86,74,.06); box-shadow: 0 0 20px rgba(232,86,74,.1); }
68
77
  .dv-platform-name { font-weight: 600; font-size: .9rem; }
69
- .dv-platform-vendor { color: #6B7280; font-size: .75rem; }
78
+ .dv-platform-vendor { color: var(--text-dim); font-size: .75rem; }
70
79
 
71
80
  /* Variants */
72
81
  .dv-variants { display: flex; flex-wrap: wrap; gap: .5rem; margin-bottom: 1rem; }
73
- .dv-variant-btn { background: #FFFFFF; border: 2px solid #E5E7EB; border-radius: 8px; padding: .4rem .8rem; cursor: pointer; color: var(--text, #1A1A2E); font-size: .85rem; transition: all .15s; font-family: inherit; }
82
+ .dv-variant-btn { background: var(--bg-card); border: 2px solid var(--border); border-radius: 8px; padding: .4rem .8rem; cursor: pointer; color: var(--text, #1A1A2E); font-size: .85rem; transition: all .15s; font-family: inherit; }
74
83
  .dv-variant-btn:hover { border-color: var(--love1); }
75
84
  .dv-variant-btn.selected { border-color: var(--love1); background: rgba(232,86,74,.06); }
76
- .dv-variant-note { font-size: .8rem; color: #6B7280; margin-top: .25rem; }
85
+ .dv-variant-note { font-size: .8rem; color: var(--text-dim); margin-top: .25rem; }
77
86
 
78
87
  /* Panel */
79
- .dv-panel { background: #FFFFFF; border-radius: 12px; padding: 1.5rem; margin-bottom: 1.5rem; border: 1px solid #E5E7EB; }
88
+ .dv-panel { background: var(--bg-card); border-radius: 12px; padding: 1.5rem; margin-bottom: 1.5rem; border: 1px solid var(--border); }
80
89
 
81
90
  /* Prompt output */
82
91
  .dv-prompt-output { position: relative; }
83
- .dv-prompt-text { background: #F3F4F6; border: 1px solid #E5E7EB; border-radius: 8px; padding: 1rem; font-family: monospace; font-size: .8rem; white-space: pre-wrap; word-break: break-word; max-height: 500px; overflow-y: auto; line-height: 1.5; color: var(--text, #1A1A2E); }
92
+ .dv-prompt-text { background: var(--code-bg); border: 1px solid var(--border); border-radius: 8px; padding: 1rem; font-family: monospace; font-size: .8rem; white-space: pre-wrap; word-break: break-word; max-height: 500px; overflow-y: auto; line-height: 1.5; color: var(--text, #1A1A2E); }
84
93
  .dv-copy-btn { position: absolute; top: .5rem; right: .5rem; background: linear-gradient(135deg, var(--love1), var(--love2)); color: #fff; border: none; border-radius: 6px; padding: .4rem .8rem; cursor: pointer; font-weight: 600; font-size: .8rem; z-index: 1; transition: all .2s; font-family: inherit; }
85
94
  .dv-copy-btn:hover { background: linear-gradient(135deg, var(--love3), var(--love1)); box-shadow: 0 2px 12px rgba(232,86,74,.2); }
86
95
  .dv-copy-btn.copied { background: #22c55e; }
87
96
 
88
97
  /* Goals */
89
98
  .dv-goals { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: .5rem; margin-bottom: 1rem; }
90
- .dv-goal-card { background: #FFFFFF; border: 2px solid #E5E7EB; border-radius: 8px; padding: .75rem; cursor: pointer; transition: all .15s; font-size: .85rem; }
99
+ .dv-goal-card { background: var(--bg-card); border: 2px solid var(--border); border-radius: 8px; padding: .75rem; cursor: pointer; transition: all .15s; font-size: .85rem; }
91
100
  .dv-goal-card:hover { border-color: var(--love1); }
92
101
  .dv-goal-card.selected { border-color: var(--love1); background: rgba(232,86,74,.06); }
93
102
  .dv-goal-icon { font-size: 1.3rem; margin-bottom: .25rem; }
94
103
 
95
104
  /* Cap tabs */
96
- .dv-cap-tabs { display: flex; gap: 0; margin-bottom: 0; border-bottom: 2px solid #E5E7EB; }
97
- .dv-cap-tab { flex: 1; padding: .75rem 1rem; text-align: center; cursor: pointer; background: transparent; border: none; color: #6B7280; font-size: .9rem; font-weight: 600; transition: all .2s; border-bottom: 3px solid transparent; margin-bottom: -2px; position: relative; font-family: inherit; }
105
+ .dv-cap-tabs { display: flex; gap: 0; margin-bottom: 0; border-bottom: 2px solid var(--border); }
106
+ .dv-cap-tab { flex: 1; padding: .75rem 1rem; text-align: center; cursor: pointer; background: transparent; border: none; color: var(--text-dim); font-size: .9rem; font-weight: 600; transition: all .2s; border-bottom: 3px solid transparent; margin-bottom: -2px; position: relative; font-family: inherit; }
98
107
  .dv-cap-tab:hover { color: var(--text, #1A1A2E); background: rgba(232,86,74,.04); }
99
108
  .dv-cap-tab.active { color: var(--love1); border-bottom-color: var(--love1); background: rgba(232,86,74,.06); }
100
109
  .dv-cap-tab.unavail { opacity: .45; cursor: default; }
101
- .dv-cap-tab.unavail:hover { background: transparent; color: #6B7280; }
110
+ .dv-cap-tab.unavail:hover { background: transparent; color: var(--text-dim); }
102
111
  .dv-tab-icon { font-size: 1.2rem; display: block; margin-bottom: .15rem; }
103
112
  .dv-tab-label { font-size: .8rem; display: block; }
104
113
  .dv-tab-rec { position: absolute; top: 2px; right: 6px; font-size: .55rem; background: #22c55e; color: #fff; padding: 1px 5px; border-radius: 8px; text-transform: uppercase; letter-spacing: .05em; }
105
- .dv-unavail-notice { text-align: center; padding: 2rem 1rem; color: #6B7280; font-size: .9rem; }
114
+ .dv-unavail-notice { text-align: center; padding: 2rem 1rem; color: var(--text-dim); font-size: .9rem; }
106
115
  .dv-unavail-icon { font-size: 2rem; margin-bottom: .5rem; }
107
116
 
108
117
  /* Instructions */
109
- .dv-instructions { background: #FFFFFF; border-radius: 12px; padding: 1.5rem; border: 1px solid #E5E7EB; }
118
+ .dv-instructions { background: var(--bg-card); border-radius: 12px; padding: 1.5rem; border: 1px solid var(--border); }
110
119
  .dv-instructions ol { margin-left: 1.5rem; margin-bottom: .75rem; }
111
120
  .dv-instructions li { margin-bottom: .5rem; }
112
- .dv-instructions code { background: #F3F4F6; padding: .15rem .4rem; border-radius: 4px; font-size: .85rem; font-family: monospace; }
121
+ .dv-instructions code { background: var(--code-bg); padding: .15rem .4rem; border-radius: 4px; font-size: .85rem; font-family: monospace; }
113
122
 
114
123
  /* Upload */
115
- .dv-upload-area { border: 2px dashed #E5E7EB; border-radius: 12px; padding: 1.5rem; text-align: center; margin-top: 1rem; transition: all .2s; }
124
+ .dv-upload-area { border: 2px dashed var(--border); border-radius: 12px; padding: 1.5rem; text-align: center; margin-top: 1rem; transition: all .2s; }
116
125
  .dv-upload-area:hover { border-color: var(--love1); }
117
126
  .dv-upload-area.dragover { border-color: var(--love1); background: rgba(232,86,74,.04); }
118
127
  .dv-upload-btn { background: linear-gradient(135deg, var(--love1), var(--love2)); color: #fff; border: none; border-radius: 8px; padding: .5rem 1.2rem; cursor: pointer; font-weight: 600; font-size: .9rem; transition: all .2s; font-family: inherit; }
@@ -120,15 +129,15 @@
120
129
  .dv-upload-btn:disabled { opacity: .5; cursor: not-allowed; }
121
130
 
122
131
  /* Share URL */
123
- .dv-share-url { display: flex; align-items: center; gap: .5rem; background: #F3F4F6; border: 1px solid #22c55e; border-radius: 8px; padding: .6rem 1rem; margin-top: .75rem; font-family: monospace; font-size: .85rem; }
132
+ .dv-share-url { display: flex; align-items: center; gap: .5rem; background: var(--bg-surface); border: 1px solid var(--success); border-radius: 8px; padding: .6rem 1rem; margin-top: .75rem; font-family: monospace; font-size: .85rem; }
124
133
  .dv-share-url input { flex: 1; background: none; border: none; color: var(--text, #1A1A2E); font-family: monospace; font-size: .85rem; outline: none; }
125
134
  .dv-share-url .dv-copy-btn { position: static; background: #22c55e; color: #fff; padding: .3rem .6rem; font-size: .8rem; }
126
135
 
127
136
  /* App list */
128
137
  .dv-app-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: .75rem; margin-top: 1rem; }
129
- .dv-app-item { background: #FFFFFF; border-radius: 8px; padding: 1rem; border: 1px solid #E5E7EB; }
138
+ .dv-app-item { background: var(--bg-card); border-radius: 8px; padding: 1rem; border: 1px solid var(--border); }
130
139
  .dv-app-name { font-weight: 600; margin-bottom: .25rem; }
131
- .dv-app-meta { font-size: .75rem; color: #6B7280; }
140
+ .dv-app-meta { font-size: .75rem; color: var(--text-dim); }
132
141
  .dv-app-item a { color: var(--love1, #E8564A); }
133
142
 
134
143
  @media (max-width: 600px) {