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,5 +1,55 @@
1
- /* profile view */
2
- .pf-hero{background:linear-gradient(135deg,#FAFAF8 0%,#FFF1F0 40%,#EFF6FF 100%);border-bottom:1px solid var(--border,#E5E7EB)}
1
+ /*
2
+ * @file profile.css
3
+ * @description Profile SPA view styles (.pf-* prefix) — hero, tabs, cards,
4
+ * wallet, memory, agents, extensions, packages, knowledge, generator, and
5
+ * edit panels. Consumes theme.css tokens so it flips with dark/light mode.
6
+ * @version-history
7
+ * v1.1.0 — 2026-06-02 — Phase 3a: tokenize hero/cta/callout gradients, card/tab/
8
+ * stat/input surfaces, feedback banners, and undefined-var drift (via theme.css
9
+ * alias layer) for dark mode. pf-gen-* badge contrast deferred to 3b.
10
+ * v1.2.0 — 2026-06-02 — Component unification (#3): remove .pf .modal* override
11
+ * (drift) so profile modals use canonical theme.css .modal styling.
12
+ * v1.3.0 — 2026-06-02 — Component unification (#4 buttons): remove .pf .btn-primary
13
+ * override (profile buttons now use canonical theme.css .btn-primary) and delete
14
+ * dead .kpkg-btn* family (0 call sites).
15
+ * v1.4.0 — 2026-06-02 — Component unification (#4 pkg-card + #5 inputs): pkg-card
16
+ * actions use canonical btn-* (per-button rules removed); remove .pf .input-field
17
+ * base+focus override so profile inputs use canonical .input-field (kept
18
+ * select/textarea behavior + sentence-case .form-row label).
19
+ * v1.5.0 — 2026-06-02 — Component unification (#6 stat cards): remove .pf .stat-card
20
+ * box override + dead .pf-hero .num/.label + .wl-stat/.wl-val/.wl-label +
21
+ * .wl-val-success/-danger; profile node-stats + wallet tiles use canonical
22
+ * .stat-card / .stat-card-value(.mono/.success/.danger) / .stat-card-label.
23
+ * v1.6.0 — 2026-06-02 — Component unification (#11 status dots): remove
24
+ * .peer-dot, .pn-status-dot, and .ext-status-dot (the last had hardcoded
25
+ * #4ade80/#9ca3af, a dark-mode bug); these dots now use canonical <StatusDot>.
26
+ * v1.7.0 — 2026-06-02 — Component unification (#13 tables): tokenize the
27
+ * hardcoded accent rgbas in .pf .consent-table / .audit-table — cell border
28
+ * rgba(232,86,74,.06) and row-hover rgba(232,86,74,.04) → var(--accent-subtle)
29
+ * (a dark-mode bug: frozen light accent), and .dw-expiring-icon #f59e0b →
30
+ * var(--warn). consent/audit tables left as bespoke .pf tables (checkbox
31
+ * column, per-cell badges/recipient cells) — not migrated to <DataTable>.
32
+ * v1.8.0 — 2026-06-02 — Component unification (#23 collapsible): tokenize the
33
+ * hardcoded hex fallbacks in the chevron/expand toggle CSS — .pf .expand-btn
34
+ * and .pf .scope-advanced-toggle border/color var(--border,#E5E7EB) /
35
+ * var(--accent,#E8564A) → bare tokens (a dark-mode bug: frozen light hex). The
36
+ * toggles themselves are left in place (expanded markup wired into view state);
37
+ * canonical /components/Collapsible.js added for new collapsible sections.
38
+ * v1.9.0 — 2026-06-02 — Component unification (#25 pill base): tokenize the
39
+ * .pf .vis-pill radius (raw 9999px → var(--radius-full)) so it tracks the new
40
+ * canonical .pill shape primitive in theme.css. Shape kept declared on
41
+ * .pf .vis-pill (not delegated to bare .pill) to avoid the (0,2,0)-beats-(0,1,0)
42
+ * specificity trap; its colors were already token-based (success/info/purple
43
+ * -bg/-fg) and unchanged.
44
+ * v1.10.0 — 2026-06-02 — Component unification (#26 recipient badge): tokenize the
45
+ * .badge-label / .badge-{wildcard,ghii,organism,domain,node,gaii} colors onto
46
+ * the new theme-invariant --badge-*-bg / --badge-fg tokens (theme.css). Removes
47
+ * hardcoded #8b5cf6/#f97316/#6b7280/#3b82f6 and the dead light-only fallbacks
48
+ * var(--success,#22c55e)/var(--danger,#ef4444). Appearance unchanged (values
49
+ * resolve identically; swatches deliberately do not flip in dark). Shared shape
50
+ * was already factored onto .badge-label — kept as-is.
51
+ */
52
+ .pf-hero{background:var(--pf-hero-gradient);border-bottom:1px solid var(--border,#E5E7EB)}
3
53
  .pf-hero-inner{max-width:1000px;margin:0 auto;padding:2rem 1.5rem 0}
4
54
  .pf{max-width:1000px;margin:0 auto;padding:1.5rem 1.5rem 2rem;position:relative;z-index:1}
5
55
  .pf .bg-aurora{position:fixed;top:0;left:0;width:100%;height:100%;z-index:0;pointer-events:none}
@@ -17,23 +67,23 @@
17
67
  .pf-hero-inner .profile-info .ghii,.pf .profile-info .ghii{color:var(--accent,#E8564A);font-family:var(--font-mono,monospace);font-size:.81rem;font-weight:500}
18
68
  .pf-hero-inner .profile-info .meta,.pf .profile-info .meta{color:var(--text-dim,#9CA3AF);font-size:.78rem;margin-top:2px}
19
69
  .pf-hero-inner .stats-bar,.pf .stats-bar{display:flex;gap:10px;margin-bottom:1.5rem;flex-wrap:wrap}
20
- .pf-hero-inner .stat-card,.pf .stat-card{background:#FFFFFF;border:1px solid var(--border,#E5E7EB);border-radius:10px;padding:12px 20px;min-width:100px;text-align:center;box-shadow:0 1px 3px rgba(0,0,0,.04)}
21
- .pf-hero-inner .stat-card .num,.pf .stat-card .num{font-size:1.4rem;font-weight:800;color:#1A1A2E}
22
- .pf-hero-inner .stat-card .num.heart,.pf .stat-card .num.heart{color:#E8564A}
23
- .pf-hero-inner .stat-card .num.blue,.pf .stat-card .num.blue{color:#3B82F6}
24
- .pf-hero-inner .stat-card .num.purple,.pf .stat-card .num.purple{color:#8B5CF6}
25
- .pf-hero-inner .stat-card .num.mint,.pf .stat-card .num.mint{color:#34D399}
26
- .pf-hero-inner .stat-card .label,.pf .stat-card .label{font-size:.65rem;font-weight:600;color:var(--text-dim,#9CA3AF);text-transform:uppercase;letter-spacing:.5px;margin-top:2px}
70
+ /* .pf .stat-card box override + dead .pf-hero-inner .stat-card .num/.label (0 sites)
71
+ removed — profile stat cards (node-stats, wallet) use canonical theme.css
72
+ .stat-card / .stat-card-value / .stat-card-label. Unified 2026-06-02 (#6). */
27
73
  .pf-hero-inner .tabs,.pf .tabs{display:flex;gap:6px 8px;margin-bottom:0;flex-wrap:wrap;padding:0 0 1.5rem}
28
- .pf-hero-inner .tab,.pf .tab{padding:.45rem .9rem;cursor:pointer;color:var(--text-dim,#6B7280);font-weight:500;font-size:.8rem;border:1px solid var(--border,#E5E7EB);border-radius:999px;transition:all .15s;background:#FFFFFF;white-space:nowrap}
29
- .pf-hero-inner .tab:hover,.pf .tab:hover{color:var(--text,#1A1A2E);border-color:#9CA3AF;background:#F9FAFB}
74
+ .pf-hero-inner .tab,.pf .tab{padding:.45rem .9rem;cursor:pointer;color:var(--text-dim,#6B7280);font-weight:500;font-size:.8rem;border:1px solid var(--border,#E5E7EB);border-radius:999px;transition:all .15s;background:var(--bg-card);white-space:nowrap}
75
+ .pf-hero-inner .tab:hover,.pf .tab:hover{color:var(--text,#1A1A2E);border-color:var(--text-muted);background:var(--bg-surface)}
30
76
  .pf-hero-inner .tab.active,.pf .tab.active{color:#fff;background:var(--accent,#E8564A);border-color:var(--accent,#E8564A);font-weight:600}
31
77
  .pf .section-title{font-size:1.15rem;font-weight:700;margin-bottom:.4rem;color:var(--accent,#E8564A)}
32
78
  .pf .section-desc{color:var(--text-dim,#6B7280);font-size:.85rem;margin-bottom:1.25rem;line-height:1.5;max-width:700px}
33
- .pf .card{background:#FFFFFF;border:1px solid var(--border,#E5E7EB);border-radius:12px;padding:1.25rem;margin-bottom:.75rem;transition:border-color .2s}
79
+ .pf .card{background:var(--bg-card);border:1px solid var(--border,#E5E7EB);border-radius:12px;padding:1.25rem;margin-bottom:.75rem;transition:border-color .2s}
34
80
  .pf .card:hover{border-color:var(--accent,#E8564A)}
81
+ /* Card variant="glass" (GlassCard, #22) must beat the aggressive .pf .card defaults
82
+ so it keeps the former .pf-glass-card look (surface bg, 8px radius, 16px pad, no hover). */
83
+ .pf .card.card-glass{background:var(--surface);border-radius:8px;padding:16px;margin-bottom:1rem;box-shadow:none}
84
+ .pf .card.card-glass:hover{border-color:var(--border);box-shadow:none;transform:none}
35
85
  .pf .card-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:.5rem}
36
- .pf .card-title{font-weight:600;font-size:1rem;color:#1A1A2E}
86
+ .pf .card-title{font-weight:600;font-size:1rem;color:var(--text)}
37
87
  .pf .card-subtitle{color:var(--text-dim,#6B7280);font-size:.8rem}
38
88
  .pf .badge{display:inline-block;padding:.15rem .5rem;border-radius:6px;font-size:.7rem;font-weight:700;letter-spacing:.03em}
39
89
  .pf .badge-success{background:rgba(34,197,94,.15);color:var(--success,#22c55e)}
@@ -90,9 +140,9 @@
90
140
  .pf .wallet-request .wr-submit:hover{opacity:.9}
91
141
  .pf .wallet-request .wr-submit:disabled{opacity:.5;cursor:not-allowed}
92
142
  .pf .wallet-lifetime{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:.5rem;margin-top:.5rem}
93
- .pf .wallet-lifetime .wl-stat{background:#FFFFFF;border:1px solid var(--border,#E5E7EB);border-radius:10px;padding:.75rem;text-align:center;box-shadow:0 1px 3px rgba(0,0,0,.04)}
94
- .pf .wallet-lifetime .wl-stat .wl-val{font-size:1.1rem;font-weight:700;font-family:monospace}
95
- .pf .wallet-lifetime .wl-stat .wl-label{font-size:.7rem;color:var(--text-dim,#6B7280);text-transform:uppercase;margin-top:.1rem}
143
+ /* .wl-stat/.wl-val/.wl-label removed — wallet lifetime tiles use canonical
144
+ .stat-card / .stat-card-value.mono(.success/.danger) / .stat-card-label.
145
+ Unified 2026-06-02 (#6). (.pf .wallet-lifetime grid wrapper kept.) */
96
146
  .pf .wallet-balance-copy{display:inline-block;margin-left:.5rem;font-size:.7rem;padding:2px 8px;background:rgba(232,86,74,.15);border:1px solid rgba(232,86,74,.3);border-radius:4px;color:var(--text,#1A1A2E);cursor:pointer;vertical-align:middle}
97
147
  .pf .wallet-balance-copy:hover{background:rgba(232,86,74,.25)}
98
148
  .pf .mem-item{display:flex;justify-content:space-between;align-items:center;padding:.5rem 0;border-bottom:1px solid rgba(232,86,74,.08);font-size:.85rem;cursor:pointer;gap:.5rem}
@@ -104,7 +154,7 @@
104
154
  .pf .mem-vis{font-size:.7rem}
105
155
  .pf .shield-icon{font-size:.85rem;cursor:pointer;opacity:.6;transition:opacity .2s}
106
156
  .pf .shield-icon:hover{opacity:1}
107
- .pf .key-rules-box{background:#F9FAFB;border:1px solid rgba(139,92,246,.3);border-radius:8px;padding:.75rem;margin-top:.75rem;margin-bottom:.5rem}
157
+ .pf .key-rules-box{background:var(--bg-surface);border:1px solid rgba(139,92,246,.3);border-radius:8px;padding:.75rem;margin-top:.75rem;margin-bottom:.5rem}
108
158
  .pf .mem-detail{background:rgba(0,0,0,.04);border:1px solid rgba(232,86,74,.1);border-radius:8px;padding:1rem;margin-top:.5rem;font-size:.85rem}
109
159
  .pf .mem-detail pre{white-space:pre-wrap;word-break:break-all;font-family:monospace;color:var(--text,#1A1A2E);font-size:.8rem}
110
160
  .pf .mem-detail .mem-actions{display:flex;gap:.5rem;margin-top:.75rem;flex-wrap:wrap}
@@ -127,18 +177,12 @@
127
177
  .pf .mem-discover-preview pre{white-space:pre-wrap;word-break:break-all;font-family:monospace;font-size:.75rem;color:var(--text,#1A1A2E);max-height:300px;overflow-y:auto;margin:0}
128
178
  .pf .peer-card{display:flex;justify-content:space-between;align-items:center}
129
179
  .pf .peer-status{display:flex;align-items:center;gap:.4rem}
130
- .pf .peer-dot{width:8px;height:8px;border-radius:50%}
131
- .pf .peer-dot.alive{background:var(--success,#22c55e)}
132
- .pf .peer-dot.dead{background:var(--danger,#ef4444)}
180
+ /* .peer-dot removed — peer status uses canonical <StatusDot>. Unified 2026-06-02 (#11). */
133
181
  .pf .pn-card{background:var(--bg-card,#FFFFFF);border:1px solid var(--border,#E5E7EB);border-radius:var(--radius,12px);margin-bottom:.75rem;transition:border-color .2s;overflow:hidden}
134
182
  .pf .pn-card:hover{border-color:var(--accent,#E8564A)}
135
183
  .pf .pn-header{display:flex;justify-content:space-between;align-items:center;padding:1rem 1.25rem;cursor:pointer;user-select:none}
136
184
  .pf .pn-header-left{display:flex;align-items:center;gap:.75rem}
137
- .pf .pn-status-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}
138
- .pf .pn-status-dot.online{background:var(--success,#22c55e);box-shadow:0 0 6px rgba(34,197,94,.4)}
139
- .pf .pn-status-dot.offline{background:var(--danger,#ef4444)}
140
- .pf .pn-status-dot.degraded{background:var(--warn,#f59e0b)}
141
- .pf .pn-status-dot.detached{background:var(--text-dim,#6B7280)}
185
+ /* .pn-status-dot removed — node status uses canonical <StatusDot>. Unified 2026-06-02 (#11). */
142
186
  .pf .pn-name{font-weight:600;font-family:monospace;font-size:.9rem}
143
187
  .pf .pn-badges{display:flex;gap:.4rem;align-items:center}
144
188
  .pf .pn-quick{font-size:.8rem;color:var(--text-dim,#6B7280);padding:0 1.25rem .75rem}
@@ -162,14 +206,14 @@
162
206
  .pf .pn-setup li{margin-bottom:.3rem;color:var(--text-dim,#6B7280)}
163
207
  .pf .pn-detach-btn{margin-top:.75rem;padding:6px 16px;background:transparent;color:var(--danger,#ef4444);border:1px solid var(--danger,#ef4444);border-radius:6px;cursor:pointer;font-size:.8rem;font-weight:600;transition:all .2s}
164
208
  .pf .pn-detach-btn:hover{background:rgba(239,68,68,.15)}
165
- .pf .agent-cta{background:linear-gradient(135deg,#FFF1F0,#EFF6FF);border:1px solid var(--border,#E5E7EB);border-radius:var(--radius,12px);padding:1.5rem;margin-bottom:1.5rem}
209
+ .pf .agent-cta{background:var(--pf-cta-gradient);border:1px solid var(--border,#E5E7EB);border-radius:var(--radius,12px);padding:1.5rem;margin-bottom:1.5rem}
166
210
  .pf .agent-cta h3{color:var(--accent,#E8564A);margin-bottom:.5rem;font-size:1.05rem}
167
211
  .pf .agent-cta p{font-size:.9rem;color:var(--text-dim,#6B7280);margin-bottom:.75rem}
168
- .pf .agent-prompt-box{position:relative;background:#F9FAFB;border:1.5px solid var(--border,#E5E7EB);border-radius:10px;padding:1rem;font-family:monospace;font-size:.8rem;color:#374151;white-space:pre-wrap;word-break:break-all;line-height:1.5;margin-bottom:1rem;max-height:300px;overflow-y:auto}
212
+ .pf .agent-prompt-box{position:relative;background:var(--bg-surface);border:1.5px solid var(--border,#E5E7EB);border-radius:10px;padding:1rem;font-family:monospace;font-size:.8rem;color:var(--text-dim);white-space:pre-wrap;word-break:break-all;line-height:1.5;margin-bottom:1rem;max-height:300px;overflow-y:auto}
169
213
  .pf .copy-prompt-btn{background:var(--accent-dark,#D4493F);color:#fff;border:none;border-radius:6px;padding:6px 14px;cursor:pointer;font-size:.8rem;font-weight:600;transition:all .2s}
170
214
  .pf .copy-prompt-btn:hover{background:var(--accent,#E8564A)}
171
- .pf .expand-btn{background:none;border:1px solid var(--border,#E5E7EB);color:var(--accent,#E8564A);border-radius:8px;padding:8px 16px;cursor:pointer;font-size:.85rem;font-weight:600;transition:all .2s;display:inline-flex;align-items:center;gap:6px}
172
- .pf .expand-btn:hover{border-color:var(--accent,#E8564A);color:var(--accent,#E8564A)}
215
+ .pf .expand-btn{background:none;border:1px solid var(--border);color:var(--accent);border-radius:8px;padding:8px 16px;cursor:pointer;font-size:.85rem;font-weight:600;transition:all .2s;display:inline-flex;align-items:center;gap:6px}
216
+ .pf .expand-btn:hover{border-color:var(--accent);color:var(--accent)}
173
217
  .pf .platform-instructions{display:none;margin-top:1rem}
174
218
  .pf .platform-instructions.expanded{display:block}
175
219
  .pf .platform-tabs{display:flex;gap:.25rem;flex-wrap:wrap;margin-bottom:1rem}
@@ -190,8 +234,9 @@
190
234
  .pf .sub-tab.active{color:var(--accent,#E8564A);border-color:var(--accent,#E8564A);background:rgba(232,86,74,.1)}
191
235
  .pf .action-bar{display:flex;justify-content:space-between;align-items:center;gap:.75rem;margin-bottom:1rem;flex-wrap:wrap}
192
236
  .pf .search-bar{display:flex;gap:.5rem;flex:1;max-width:500px}
193
- .pf .input-field{width:100%;padding:10px 14px;background:#F9FAFB;border:1.5px solid var(--border,#E5E7EB);border-radius:10px;color:#1A1A2E;font-size:.85rem;font-family:inherit;transition:all .15s;outline:none}
194
- .pf .input-field:focus{border-color:var(--accent,#E8564A);box-shadow:0 0 0 3px rgba(232,86,74,.1)}
237
+ /* .pf .input-field base+focus override removed — profile inputs use canonical
238
+ theme.css .input-field (tokenized focus ring, theme-flips). Unified 2026-06-02 (#5).
239
+ Keep only the select/textarea behavior extensions canonical lacks. */
195
240
  .pf select.input-field{cursor:pointer}
196
241
  .pf textarea.input-field{resize:vertical;min-height:60px}
197
242
  .pf .create-form{background:var(--bg-card,#FFFFFF);border:1px solid var(--border,#E5E7EB);border-radius:var(--radius,12px);padding:1.25rem;margin-bottom:1rem}
@@ -204,10 +249,9 @@
204
249
  .pf .file-dropzone.has-file{border-color:var(--accent,#E8564A);background:rgba(232,86,74,.04)}
205
250
  .pf .file-dropzone-empty{display:flex;flex-direction:column;align-items:center;gap:.4rem;color:var(--text-dim,#6B7280);font-size:.9rem}
206
251
  .pf .file-upload-list{display:flex;flex-direction:column;gap:.5rem;margin:.75rem 0}
207
- .pf .file-upload-item{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;background:rgba(255,255,255,.03);border:1px solid var(--border,rgba(232,86,74,.15));border-radius:8px}
208
- .pf .btn-primary{background:linear-gradient(135deg,var(--accent,#E8564A),var(--accent-dark,#D4493F));color:#fff;border:none;border-radius:6px;padding:8px 16px;cursor:pointer;font-size:.85rem;font-weight:600;transition:all .2s}
209
- .pf .btn-primary:hover{transform:translateY(-1px);box-shadow:0 4px 12px rgba(232,86,74,.3)}
210
- /* Button overrides removed — use theme.css btn-primary/btn-outline/btn-ghost/btn-danger-solid classes.
252
+ .pf .file-upload-item{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;background:var(--bg-surface);border:1px solid var(--border,rgba(232,86,74,.15));border-radius:8px}
253
+ /* Button overrides removed — profile uses canonical theme.css btn-primary / btn-outline /
254
+ btn-ghost / btn-danger-solid classes directly (incl. btn-primary, unified 2026-06-02).
211
255
  See docs/frontend-development-guide.md "Banned Patterns" for the rationale. */
212
256
  .pf .card-expanded{border-color:var(--accent,#E8564A)}
213
257
  .pf .card-clickable{cursor:pointer;user-select:none}
@@ -216,7 +260,7 @@
216
260
  .pf .card-detail{margin-top:.75rem;padding-top:.75rem;border-top:1px solid rgba(232,86,74,.1)}
217
261
  .pf .card-actions{display:flex;gap:.5rem;flex-wrap:wrap;margin-top:.5rem}
218
262
  .pf .detail-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:.5rem}
219
- .pf .detail-item{display:flex;flex-direction:column;gap:.15rem;padding:.4rem .6rem;background:rgba(255,255,255,.02);border-radius:6px}
263
+ .pf .detail-item{display:flex;flex-direction:column;gap:.15rem;padding:.4rem .6rem;background:var(--bg-surface);border-radius:6px}
220
264
  .pf .detail-label{font-size:.7rem;color:var(--text-dim,#6B7280);text-transform:uppercase;letter-spacing:.05em}
221
265
  .pf .detail-value{font-size:.85rem;color:var(--text,#1A1A2E);word-break:break-all}
222
266
  .pf .detail-value.mono{font-family:monospace;font-size:.8rem}
@@ -259,9 +303,11 @@
259
303
  .pf .brd-member-remove:hover{color:var(--danger,#ef4444)}
260
304
  .pf .brd-member-add{display:flex;gap:.5rem;align-items:center}
261
305
  .pf .brd-member-add .input-field{flex:1}
262
- .pf .modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.7);display:flex;align-items:center;justify-content:center;z-index:1000;backdrop-filter:blur(4px)}
263
- .pf .modal{background:var(--bg,#FFFFFF);border:1px solid var(--border,#E5E7EB);border-radius:var(--radius,12px);padding:2rem;max-width:500px;width:90%;max-height:80vh;overflow-y:auto}
264
- .pf .modal h3{color:var(--accent,#E8564A);margin-bottom:1rem}
306
+ /* Modal overlay/box/title are canonical in theme.css (.modal-overlay / .modal /
307
+ .modal-header). The former .pf .modal* overrides were drift (hardcoded rgba
308
+ scrim, blur(4px), 1px border, --bg/--radius, accent-red title) — removed so
309
+ profile modals match the rest of the app. Width modifiers (.pf .scope-modal,
310
+ .pf .ext-modal-narrow) still layer on top of the canonical .modal base. */
265
311
  .pf .star-rating{display:flex;gap:.25rem}
266
312
  .pf .star{font-size:1.5rem;cursor:pointer;color:var(--text-dim,#6B7280);transition:color .15s}
267
313
  .pf .star:hover,.pf .star.active{color:var(--warn,#f59e0b)}
@@ -270,8 +316,8 @@
270
316
  .pf .audit-day-btn.active{color:var(--accent,#E8564A);border-color:var(--accent,#E8564A);background:rgba(232,86,74,.1)}
271
317
  .pf .consent-table,.pf .audit-table{width:100%;border-collapse:collapse;font-size:.85rem}
272
318
  .pf .consent-table th,.pf .audit-table th{text-align:left;padding:.5rem .6rem;color:var(--text-dim,#6B7280);font-size:.75rem;text-transform:uppercase;letter-spacing:.03em;border-bottom:1px solid var(--border,#E5E7EB)}
273
- .pf .consent-table td,.pf .audit-table td{padding:.5rem .6rem;border-bottom:1px solid rgba(232,86,74,.06)}
274
- .pf .consent-table tr:hover,.pf .audit-table tr:hover{background:rgba(232,86,74,.04)}
319
+ .pf .consent-table td,.pf .audit-table td{padding:.5rem .6rem;border-bottom:1px solid var(--accent-subtle)}
320
+ .pf .consent-table tr:hover,.pf .audit-table tr:hover{background:var(--accent-subtle)}
275
321
  .pf .revoke-btn{padding:4px 10px;border-radius:6px;border:1px solid var(--danger,#ef4444);background:transparent;color:var(--danger,#ef4444);cursor:pointer;font-size:.75rem;font-weight:600;transition:all .2s}
276
322
  .pf .revoke-btn:hover{background:rgba(239,68,68,.15)}
277
323
  @media(max-width:600px){
@@ -291,7 +337,7 @@
291
337
  .pf .scope-summary .scope-manage-btn {margin-left:auto;background:none;border:1px solid var(--border,#E5E7EB);color:var(--accent,#E8564A);border-radius:6px;padding:3px 10px;cursor:pointer;font-size:.72rem;font-weight:600;transition:all .2s}
292
338
  .pf .scope-summary .scope-manage-btn:hover {border-color:var(--accent,#E8564A);color:var(--accent,#E8564A)}
293
339
  .pf .scope-readonly-list {display:flex;flex-wrap:wrap;gap:.35rem;margin-top:.5rem}
294
- .pf .scope-readonly-list .scope-tag {font-size:.68rem;background:rgba(232,86,74,.08);color:var(--text-dim,#6B7280);padding:.12rem .4rem;border-radius:4px}
340
+ .pf .scope-readonly-list .scope-tag {font-size:.68rem;background:var(--accent-subtle);color:var(--text-dim,#6B7280);padding:.12rem .4rem;border-radius:4px}
295
341
  .pf .scope-modal {max-width:560px}
296
342
  .pf .scope-modal h3 {margin-bottom:.25rem}
297
343
  .pf .scope-modal .scope-agent-info {color:var(--text-dim,#6B7280);font-size:.8rem;margin-bottom:1.25rem;font-family:monospace}
@@ -299,9 +345,9 @@
299
345
  .pf .scope-tpl-btn {flex:1;min-width:100px;padding:.6rem .75rem;background:var(--bg-card,#FFFFFF);border:1px solid var(--border,#E5E7EB);border-radius:8px;cursor:pointer;color:var(--text-dim,#6B7280);font-size:.8rem;font-weight:600;transition:all .2s;text-align:center}
300
346
  .pf .scope-tpl-btn:hover {color:var(--text,#1A1A2E);border-color:var(--accent,#E8564A)}
301
347
  .pf .scope-tpl-btn.active {color:var(--accent,#E8564A);border-color:var(--accent,#E8564A);background:rgba(232,86,74,.1)}
302
- .pf .scope-advanced-toggle {background:none;border:1px solid var(--border,#E5E7EB);color:var(--accent,#E8564A);border-radius:8px;padding:6px 14px;cursor:pointer;font-size:.8rem;font-weight:600;transition:all .2s;display:inline-flex;align-items:center;gap:6px;margin-bottom:1rem}
303
- .pf .scope-advanced-toggle:hover {border-color:var(--accent,#E8564A);color:var(--accent,#E8564A)}
304
- .pf .scope-domain {background:#F9FAFB;border:1px solid rgba(232,86,74,.1);border-radius:8px;padding:.75rem;margin-bottom:.5rem}
348
+ .pf .scope-advanced-toggle {background:none;border:1px solid var(--border);color:var(--accent);border-radius:8px;padding:6px 14px;cursor:pointer;font-size:.8rem;font-weight:600;transition:all .2s;display:inline-flex;align-items:center;gap:6px;margin-bottom:1rem}
349
+ .pf .scope-advanced-toggle:hover {border-color:var(--accent);color:var(--accent)}
350
+ .pf .scope-domain {background:var(--bg-surface);border:1px solid rgba(232,86,74,.1);border-radius:8px;padding:.75rem;margin-bottom:.5rem}
305
351
  .pf .scope-domain-header {display:flex;align-items:center;gap:.5rem;margin-bottom:.5rem;cursor:pointer}
306
352
  .pf .scope-domain-header .domain-label {font-weight:600;font-size:.85rem;color:var(--text,#1A1A2E)}
307
353
  .pf .scope-domain-header .domain-toggle {font-size:.65rem;color:var(--text-dim,#6B7280)}
@@ -324,9 +370,7 @@
324
370
  .pf .ext-comp-tag{font-size:.7rem;padding:2px 8px;border-radius:6px;background:var(--bg-dim,#F3F4F6)}
325
371
  .pf .ext-card-footer{display:flex;justify-content:space-between;align-items:center}
326
372
  .pf .ext-status{font-size:.8rem;display:flex;align-items:center;gap:6px}
327
- .pf .ext-status-dot{width:8px;height:8px;border-radius:50%;display:inline-block}
328
- .pf .ext-status-dot.active{background:#4ade80}
329
- .pf .ext-status-dot.inactive{background:#9ca3af}
373
+ /* .ext-status-dot removed — extension status uses canonical <StatusDot> (was hardcoded #4ade80/#9ca3af). Unified 2026-06-02 (#11). */
330
374
  .pf .ext-card-actions{display:flex;gap:.5rem}
331
375
  .pf .ext-card-actions button{font-size:.75rem;padding:4px 10px;border-radius:6px;border:1px solid var(--border,#E5E7EB);background:transparent;color:var(--text-dim,#6B7280);cursor:pointer;transition:all .15s}
332
376
  .pf .ext-card-actions button:hover{background:var(--bg-dim,#F3F4F6)}
@@ -381,22 +425,18 @@
381
425
  .pf .pkg-card-desc{font-size:.85rem;color:var(--text-dim,#6B7280);margin-bottom:.75rem;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
382
426
  .pf .pkg-card-meta{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap;font-size:.8rem;color:var(--muted,#888);margin-bottom:.5rem}
383
427
  .pf .pkg-card-footer{display:flex;justify-content:space-between;align-items:center;margin-top:.5rem}
384
- .pf .pkg-card-actions{display:flex;gap:.5rem}
385
- .pf .pkg-card-actions button{font-size:.75rem;padding:4px 10px;border-radius:6px;border:1px solid var(--border,#E5E7EB);background:transparent;color:var(--text-dim,#6B7280);cursor:pointer;transition:all .15s}
386
- .pf .pkg-card-actions button:hover{background:var(--bg-dim,#F3F4F6)}
387
- .pf .pkg-card-actions button.danger{border-color:rgba(239,68,68,0.3);color:#f87171}
388
- .pf .pkg-card-actions button.danger:hover{background:rgba(239,68,68,0.15)}
389
- .pf .pkg-card-actions button.primary{background:var(--accent,#E8564A);color:#fff;border-color:var(--accent,#E8564A)}
390
- .pf .pkg-card-actions button.primary:hover{opacity:.9}
428
+ .pf .pkg-card-actions{display:flex;gap:.5rem;flex-wrap:wrap}
429
+ /* Per-button styling removed — pkg-card actions use canonical btn-outline / btn-primary /
430
+ btn-danger + btn-sm (theme.css), fixing the hardcoded #f87171 danger. Unified 2026-06-02 (#4). */
391
431
  .pf .pkg-tag{font-size:.7rem;padding:2px 8px;border-radius:6px;background:var(--bg-dim,#F3F4F6);color:var(--text-dim,#6B7280)}
392
432
  .pf .pkg-badge{display:inline-block;padding:2px 8px;border-radius:6px;font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.3px}
393
- .pf .pkg-badge-active{background:rgba(74,222,128,0.15);color:#4ade80}
394
- .pf .pkg-badge-installed{background:rgba(74,222,128,0.15);color:#4ade80}
395
- .pf .pkg-badge-inactive{background:rgba(156,163,175,0.15);color:#9ca3af}
396
- .pf .pkg-badge-error{background:rgba(239,68,68,0.15);color:#f87171}
397
- .pf .pkg-badge-featured{background:rgba(251,191,36,0.15);color:#fbbf24}
398
- .pf .pkg-badge-published{background:rgba(74,222,128,0.15);color:#4ade80}
399
- .pf .pkg-badge-draft{background:rgba(156,163,175,0.15);color:#9ca3af}
433
+ .pf .pkg-badge-active{background:var(--success-bg);color:var(--success-fg)}
434
+ .pf .pkg-badge-installed{background:var(--success-bg);color:var(--success-fg)}
435
+ .pf .pkg-badge-inactive{background:var(--bg-surface);color:var(--text-dim)}
436
+ .pf .pkg-badge-error{background:var(--danger-bg);color:var(--danger-fg)}
437
+ .pf .pkg-badge-featured{background:var(--warn-bg);color:var(--warn-fg)}
438
+ .pf .pkg-badge-published{background:var(--success-bg);color:var(--success-fg)}
439
+ .pf .pkg-badge-draft{background:var(--bg-surface);color:var(--text-dim)}
400
440
  .pf .pkg-empty{color:var(--muted,#888);font-size:.85rem;text-align:center;padding:2rem 0}
401
441
  .pf .pkg-stats{display:flex;gap:.5rem;align-items:center;font-size:.8rem;color:var(--muted,#888)}
402
442
  .pf .pkg-section-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem}
@@ -416,12 +456,8 @@
416
456
  .kpkg-action-bar{background:var(--bg-card,#FFFFFF);border:1px solid var(--border,#E5E7EB);border-radius:12px;padding:1.25rem}
417
457
  .kpkg-action-buttons{display:flex;gap:.75rem;flex-wrap:wrap;margin-bottom:.75rem}
418
458
  .kpkg-action-desc{color:var(--muted,#888);font-size:.85rem;margin:0}
419
- .kpkg-btn{padding:.5rem 1rem;border-radius:8px;border:1px solid var(--border,#E5E7EB);cursor:pointer;font-size:.85rem;font-weight:500;transition:all .15s ease}
420
- .kpkg-btn-primary{background:var(--accent,#6366F1);color:#fff;border-color:var(--accent,#6366F1)}
421
- .kpkg-btn-primary:hover{opacity:.9}
422
- .kpkg-btn-primary:disabled{opacity:.5;cursor:not-allowed}
423
- .kpkg-btn-secondary{background:transparent;color:var(--text,#e0e0e0)}
424
- .kpkg-btn-secondary:hover{background:var(--surface-hover,#252540)}
459
+ /* .kpkg-btn* removed — dead CSS (0 call sites); knowledge tab uses canonical
460
+ btn-outline / btn-danger-solid. Unified 2026-06-02. */
425
461
  .kpkg-import-box{background:var(--bg-card,#FFFFFF);border:1px solid var(--border,#E5E7EB);border-radius:12px;padding:1.25rem}
426
462
  .kpkg-import-box h3{margin:0 0 .75rem}
427
463
  .kpkg-import-textarea{width:100%;min-height:80px;background:var(--bg,#F9FAFB);color:var(--text,#e0e0e0);border:1px solid var(--border,#E5E7EB);border-radius:8px;padding:.75rem;font-family:monospace;font-size:.8rem;resize:vertical;box-sizing:border-box}
@@ -444,14 +480,14 @@
444
480
  .kpkg-preview-summary{color:var(--muted,#888);font-size:.85rem;margin:.75rem 0}
445
481
  .kpkg-toggle{display:flex;align-items:center;gap:.5rem;font-size:.85rem;cursor:pointer;margin:.5rem 0}
446
482
  .kpkg-badge{display:inline-block;padding:.15rem .5rem;border-radius:4px;font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px}
447
- .kpkg-badge-type{background:rgba(108,92,231,.2);color:#a29bfe}
448
- .kpkg-badge-synthesis{background:rgba(0,206,209,.2);color:#00ced1}
449
- .kpkg-badge-public{background:rgba(46,204,113,.2);color:#2ecc71}
450
- .kpkg-badge-private{background:rgba(231,76,60,.2);color:#e74c3c}
451
- .kpkg-badge-owner{background:rgba(243,156,18,.2);color:#f39c12}
452
- .kpkg-badge-draft{background:rgba(149,165,166,.2);color:#95a5a6}
453
- .kpkg-badge-review{background:rgba(243,156,18,.2);color:#f39c12}
454
- .kpkg-badge-published{background:rgba(46,204,113,.2);color:#2ecc71}
483
+ .kpkg-badge-type{background:var(--purple-bg);color:var(--purple-fg)}
484
+ .kpkg-badge-synthesis{background:var(--info-bg);color:var(--info-fg)}
485
+ .kpkg-badge-public{background:var(--success-bg);color:var(--success-fg)}
486
+ .kpkg-badge-private{background:var(--danger-bg);color:var(--danger-fg)}
487
+ .kpkg-badge-owner{background:var(--warn-bg);color:var(--warn-fg)}
488
+ .kpkg-badge-draft{background:var(--bg-surface);color:var(--text-dim)}
489
+ .kpkg-badge-review{background:var(--warn-bg);color:var(--warn-fg)}
490
+ .kpkg-badge-published{background:var(--success-bg);color:var(--success-fg)}
455
491
  .kpkg-section{background:var(--bg-card,#FFFFFF);border:1px solid var(--border,#E5E7EB);border-radius:12px;padding:1.25rem}
456
492
  .kpkg-section h3{margin:0 0 .75rem}
457
493
  .kpkg-empty{color:var(--muted,#888);font-size:.85rem;text-align:center;padding:1.5rem 0}
@@ -465,17 +501,14 @@
465
501
  .kpkg-card-info{display:flex;align-items:center;gap:1rem;font-size:.8rem;color:var(--muted,#888);margin-bottom:.5rem}
466
502
  .kpkg-card-author{font-style:italic}
467
503
  .kpkg-card-tags{display:flex;gap:.35rem;flex-wrap:wrap;margin-bottom:.5rem}
468
- .kpkg-tag{display:inline-block;padding:.1rem .4rem;background:rgba(255,255,255,.05);border-radius:3px;font-size:.7rem;color:var(--muted,#888)}
504
+ .kpkg-tag{display:inline-block;padding:.1rem .4rem;background:var(--bg-surface);border-radius:3px;font-size:.7rem;color:var(--muted,#888)}
469
505
  .kpkg-card-stats{font-size:.8rem;color:var(--muted,#888)}
470
506
  .kpkg-card-actions{display:flex;gap:.5rem;flex-wrap:wrap;margin-top:.5rem}
471
- .kpkg-btn-sm{padding:.25rem .6rem;font-size:.75rem}
472
- .kpkg-btn-danger{background:rgba(231,76,60,.15);color:#e74c3c;border-color:rgba(231,76,60,.4)}
473
- .kpkg-btn-danger:hover{background:rgba(231,76,60,.3)}
474
- .kpkg-btn-danger:disabled{opacity:.5;cursor:not-allowed}
507
+ /* .kpkg-btn-sm / .kpkg-btn-danger removed — dead CSS (0 call sites). Unified 2026-06-02. */
475
508
  .kpkg-detail{margin-top:.75rem;padding-top:.75rem;border-top:1px solid var(--border,#E5E7EB)}
476
509
  .kpkg-detail-synthesis{color:var(--muted,#888);font-size:.85rem;font-style:italic;margin:0 0 .75rem}
477
510
  .kpkg-detail-entries h4{margin:0 0 .5rem;font-size:.85rem;color:var(--accent,#E8564A)}
478
- .kpkg-detail-entry{background:rgba(255,255,255,.02);border:1px solid var(--border,#E5E7EB);border-radius:6px;padding:.6rem;margin-bottom:.5rem}
511
+ .kpkg-detail-entry{background:var(--bg-surface);border:1px solid var(--border,#E5E7EB);border-radius:6px;padding:.6rem;margin-bottom:.5rem}
479
512
  .kpkg-detail-entry-header{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap;margin-bottom:.25rem}
480
513
  .kpkg-vis-pill{border:1px solid;border-radius:4px;padding:2px 8px;font-size:.7rem;font-weight:600;cursor:pointer;transition:opacity .15s;line-height:1.3}
481
514
  .kpkg-vis-pill:hover{opacity:.75}
@@ -539,9 +572,9 @@
539
572
 
540
573
  .pf-gen-new-project { max-width: 700px; }
541
574
  .pf-gen-subtitle { color: var(--muted); margin-bottom: 1rem; }
542
- .pf-gen-hint { color: #92400E; font-size: 0.85em; margin: 0 0 8px; padding: 8px 12px; background: #FEF3C7; border: 1px solid #FDE68A; border-radius: 6px; }
575
+ .pf-gen-hint { color: var(--warn-fg); font-size: 0.85em; margin: 0 0 8px; padding: 8px 12px; background: var(--warn-bg); border: 1px solid var(--warn-border); border-radius: 6px; }
543
576
  .pf-gen-description {
544
- width: 100%; background: #FFFFFF; border: 1px solid var(--border,#E5E7EB); border-radius: 8px;
577
+ width: 100%; background: var(--bg-card); border: 1px solid var(--border,#E5E7EB); border-radius: 8px;
545
578
  color: var(--text); padding: 12px; font-family: inherit; font-size: 0.95em; resize: vertical;
546
579
  }
547
580
  .pf-gen-actions { display: flex; gap: 8px; margin-top: 14px; padding-top: 10px; }
@@ -584,13 +617,13 @@
584
617
  .pf-gen-type-badge {
585
618
  font-size: 0.7em; padding: 1px 6px; border-radius: 3px; font-weight: 600; text-transform: uppercase;
586
619
  }
587
- .pf-gen-type-badge.type-csm { background: rgba(34,197,94,0.12); color: #16a34a; }
588
- .pf-gen-type-badge.type-msm { background: rgba(245,158,11,0.12); color: #b45309; }
589
- .pf-gen-type-badge.type-extension { background: rgba(168,85,247,0.12); color: #7c3aed; }
590
- .pf-gen-type-badge.type-app { background: rgba(59,130,246,0.12); color: #2563eb; }
591
- .pf-gen-type-badge.type-memory { background: rgba(107,114,128,0.12); color: #4b5563; }
592
- .pf-gen-type-badge.type-translation { background: rgba(6,182,212,0.12); color: #0891b2; }
593
- .pf-gen-type-badge.type-cortex { background: rgba(155,89,182,0.12); color: #9b59b6; }
620
+ .pf-gen-type-badge.type-csm { background: var(--success-bg); color: var(--success-fg); }
621
+ .pf-gen-type-badge.type-msm { background: var(--warn-bg); color: var(--warn-fg); }
622
+ .pf-gen-type-badge.type-extension { background: var(--purple-bg); color: var(--purple-fg); }
623
+ .pf-gen-type-badge.type-app { background: var(--info-bg); color: var(--info-fg); }
624
+ .pf-gen-type-badge.type-memory { background: var(--bg-surface); color: var(--text-dim); }
625
+ .pf-gen-type-badge.type-translation { background: var(--info-bg); color: var(--info-fg); }
626
+ .pf-gen-type-badge.type-cortex { background: var(--purple-bg); color: var(--purple-fg); }
594
627
 
595
628
  /* Editable project name */
596
629
  .pf-gen-name-editable { margin: 0; flex: 1; cursor: pointer; border-bottom: 1px dashed transparent; transition: border-color 0.2s; }
@@ -621,11 +654,11 @@
621
654
  .pf-gen-status-badge {
622
655
  font-size: 0.75em; padding: 2px 8px; border-radius: 10px; font-weight: 500;
623
656
  }
624
- .pf-gen-status-badge.status-done { background: rgba(34,197,94,0.12); color: #16a34a; }
625
- .pf-gen-status-badge.status-errors { background: rgba(239,68,68,0.12); color: #dc2626; }
657
+ .pf-gen-status-badge.status-done { background: var(--success-bg); color: var(--success-fg); }
658
+ .pf-gen-status-badge.status-errors { background: var(--danger-bg); color: var(--danger-fg); }
626
659
  .pf-gen-status-badge.status-waiting_user,
627
- .pf-gen-status-badge.status-waiting_agent { background: rgba(245,158,11,0.12); color: #b45309; }
628
- .pf-gen-status-badge.status-prompt_ready { background: rgba(59,130,246,0.12); color: #2563eb; }
660
+ .pf-gen-status-badge.status-waiting_agent { background: var(--warn-bg); color: var(--warn-fg); }
661
+ .pf-gen-status-badge.status-prompt_ready { background: var(--info-bg); color: var(--info-fg); }
629
662
 
630
663
  .pf-gen-mode-toggle { display: flex; gap: 4px; margin-bottom: 16px; }
631
664
 
@@ -633,28 +666,28 @@
633
666
  .pf-gen-section label { display: block; font-size: 0.8em; color: var(--muted); text-transform: uppercase; margin-bottom: 4px; }
634
667
 
635
668
  .pf-gen-prompt-box {
636
- background: #F9FAFB; border: 1px solid var(--border,#E5E7EB); border-radius: 6px;
669
+ background: var(--bg-surface); border: 1px solid var(--border,#E5E7EB); border-radius: 6px;
637
670
  padding: 10px; font-size: 0.82em; color: var(--text-dim,#4B5563); white-space: pre-wrap;
638
671
  max-height: 200px; overflow-y: auto; margin-bottom: 8px; font-family: monospace;
639
672
  }
640
673
 
641
674
  .pf-gen-result-area {
642
- width: 100%; background: #FFFFFF; border: 1px solid var(--border,#E5E7EB); border-radius: 6px;
675
+ width: 100%; background: var(--bg-card); border: 1px solid var(--border,#E5E7EB); border-radius: 6px;
643
676
  color: var(--text); padding: 10px; font-family: monospace; font-size: 0.85em; resize: vertical;
644
677
  }
645
678
 
646
679
  .pf-gen-errors {
647
- background: #FEF2F2; border: 1px solid #FECACA; border-radius: 6px;
680
+ background: var(--danger-bg); border: 1px solid var(--danger-border); border-radius: 6px;
648
681
  padding: 12px; margin-top: 12px;
649
682
  }
650
- .pf-gen-errors label { color: #dc2626; }
683
+ .pf-gen-errors label { color: var(--danger-fg); }
651
684
  .pf-gen-errors ul { margin: 8px 0; padding-left: 20px; font-size: 0.85em; }
652
- .pf-gen-errors li { margin-bottom: 4px; color: #991b1b; }
653
- .pf-gen-error-line { color: #dc2626; font-size: 0.85em; margin: 2px 0; }
685
+ .pf-gen-errors li { margin-bottom: 4px; color: var(--danger-fg); }
686
+ .pf-gen-error-line { color: var(--danger-fg); font-size: 0.85em; margin: 2px 0; }
654
687
 
655
688
  .pf-gen-settings-collection { max-width: 700px; }
656
689
  .pf-gen-settings-collection input { width: 100%; padding: 8px 10px; border: 1px solid var(--border,#E5E7EB); border-radius: 6px; background: var(--card,#fff); color: var(--text); font-size: 0.9em; }
657
- .pf-gen-required { color: #dc2626; font-weight: 700; }
690
+ .pf-gen-required { color: var(--danger-fg); font-weight: 700; }
658
691
  .pf-gen-notice { color: var(--muted); font-style: italic; padding: 12px 0; }
659
692
 
660
693
  .pf-gen-agent-status { margin-top: 8px; color: var(--muted); font-style: italic; }
@@ -676,7 +709,7 @@
676
709
  .pf-gen-listener-count { color: var(--text, #1A1A2E); }
677
710
  .pf-gen-listener-sync { color: var(--text-dim, #6B7280); font-size: 0.9em; }
678
711
  .pf-gen-listener-actions { display: flex; gap: 4px; }
679
- .pf-gen-agent-prompt-panel { margin-bottom: 12px; padding: 14px; background: #F9FAFB; border: 1px solid var(--border, #E5E7EB); border-radius: 8px; }
712
+ .pf-gen-agent-prompt-panel { margin-bottom: 12px; padding: 14px; background: var(--bg-surface); border: 1px solid var(--border, #E5E7EB); border-radius: 8px; }
680
713
  .pf-gen-agent-prompt-panel .pf-gen-subtitle { color: var(--text-dim, #6B7280); font-size: 0.85em; margin: 0 0 10px; }
681
714
  .pf-gen-agent-prompt-panel .btn { background: var(--accent, #E8564A); color: #fff; border: none; font-weight: 600; }
682
715
  .pf-gen-agent-prompt-panel .btn:hover { opacity: 0.9; }
@@ -685,12 +718,12 @@
685
718
  .pf-gen-activity-log { margin-top: 16px; border-top: 1px solid var(--border); padding-top: 12px; }
686
719
  .pf-gen-log-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; }
687
720
  .pf-gen-log-header label { font-size: 0.8em; text-transform: uppercase; color: var(--muted); font-weight: 600; }
688
- .pf-gen-log-filter { background: #FFFFFF; border: 1px solid var(--border,#E5E7EB); border-radius: 6px; color: var(--text); font-size: 0.8em; padding: 4px 8px; }
721
+ .pf-gen-log-filter { background: var(--bg-card); border: 1px solid var(--border,#E5E7EB); border-radius: 6px; color: var(--text); font-size: 0.8em; padding: 4px 8px; }
689
722
  .pf-gen-log-entries { max-height: 150px; overflow-y: auto; font-family: monospace; font-size: 0.8em; }
690
723
  .pf-gen-log-empty { color: var(--muted); font-style: italic; padding: 8px 0; }
691
724
  .pf-gen-log-entry { padding: 2px 0; display: flex; gap: 8px; }
692
725
  .pf-gen-log-time { color: var(--text-dim,#6B7280); flex-shrink: 0; }
693
- .pf-gen-log-comp { color: #7c3aed; flex-shrink: 0; }
726
+ .pf-gen-log-comp { color: var(--purple-fg); flex-shrink: 0; }
694
727
  .pf-gen-log-msg { color: var(--muted); }
695
728
 
696
729
  /* Lifecycle Toolbar (Phase 5) */
@@ -707,7 +740,7 @@
707
740
  /* Remove Panel (Phase 5) */
708
741
  .pf-gen-remove-panel {
709
742
  padding: 12px 16px; margin-bottom: 12px;
710
- background: #FEF2F2; border: 1px solid #FECACA; border-radius: 8px;
743
+ background: var(--danger-bg); border: 1px solid var(--danger-border); border-radius: 8px;
711
744
  }
712
745
  .pf-gen-remove-list { display: flex; flex-direction: column; gap: 4px; }
713
746
  .pf-gen-remove-item { display: flex; align-items: center; gap: 8px; font-size: 0.85em; cursor: pointer; padding: 4px 0; }
@@ -716,21 +749,21 @@
716
749
  /* Edit Service Panel (Phase 6) */
717
750
  .pf-gen-edit-panel {
718
751
  padding: 12px 16px; margin-bottom: 12px;
719
- background: #F0F9FF; border: 1px solid #BAE6FD; border-radius: 8px;
752
+ background: var(--info-bg); border: 1px solid var(--info-border); border-radius: 8px;
720
753
  }
721
754
  .pf-gen-edit-panel h4 { margin: 0 0 8px; }
722
755
 
723
756
  .pf-gen-impact-list { display: flex; flex-direction: column; gap: 8px; margin-top: 8px; }
724
- .pf-gen-impact-item { padding: 8px 12px; border-radius: 6px; border: 1px solid var(--border, #E5E7EB); background: #FFFFFF; }
757
+ .pf-gen-impact-item { padding: 8px 12px; border-radius: 6px; border: 1px solid var(--border, #E5E7EB); background: var(--bg-card); }
725
758
  .pf-gen-impact-item.impact-root { border-left: 3px solid #ef4444; }
726
759
  .pf-gen-impact-item.impact-update { border-left: 3px solid #f59e0b; }
727
760
  .pf-gen-impact-item.impact-none { border-left: 3px solid #d1d5db; opacity: 0.7; }
728
761
 
729
762
  .pf-gen-impact-header { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; }
730
763
  .pf-gen-impact-badge { font-size: 0.7em; padding: 1px 6px; border-radius: 3px; font-weight: 700; text-transform: uppercase; }
731
- .pf-gen-impact-badge.impact-root { background: rgba(239,68,68,0.12); color: #dc2626; }
732
- .pf-gen-impact-badge.impact-update { background: rgba(245,158,11,0.12); color: #b45309; }
733
- .pf-gen-impact-badge.impact-none { background: rgba(107,114,128,0.12); color: #6b7280; }
764
+ .pf-gen-impact-badge.impact-root { background: var(--danger-bg); color: var(--danger-fg); }
765
+ .pf-gen-impact-badge.impact-update { background: var(--warn-bg); color: var(--warn-fg); }
766
+ .pf-gen-impact-badge.impact-none { background: var(--bg-surface); color: var(--text-dim); }
734
767
  .pf-gen-impact-label { font-weight: 600; font-size: 0.9em; }
735
768
  .pf-gen-impact-reason { font-size: 0.82em; color: var(--muted); }
736
769
 
@@ -764,9 +797,9 @@
764
797
  .pf-gen-diag-table td { padding: 5px 8px; border-bottom: 1px solid rgba(0,0,0,0.04); }
765
798
  .pf-gen-diag-table tr.diag-active td:first-child { font-weight: 600; }
766
799
 
767
- .pf-gen-live-active { color: #16a34a; font-weight: 500; }
768
- .pf-gen-live-installed { color: #b45309; }
769
- .pf-gen-live-missing { color: #9ca3af; }
800
+ .pf-gen-live-active { color: var(--success-fg); font-weight: 500; }
801
+ .pf-gen-live-installed { color: var(--warn-fg); }
802
+ .pf-gen-live-missing { color: var(--text-muted); }
770
803
  .pf-gen-diag-action { color: var(--muted); font-size: 0.9em; }
771
804
 
772
805
  @media(max-width:700px) {
@@ -818,58 +851,48 @@
818
851
  .input-field.input-sm { padding: .4rem .6rem; font-size: .85rem; }
819
852
 
820
853
  /* ── Recipient/Type Badge Labels ── */
854
+ /* Shared shape lives on .badge-label; each .badge-* only sets its swatch.
855
+ All colors come from the theme-invariant --badge-* tokens (theme.css) so no
856
+ hardcoded hex / dead light-only fallback remains; appearance is unchanged
857
+ (these saturated swatches deliberately do not flip in dark mode). */
821
858
  .pf .badge-label {
822
859
  display: inline-block;
823
860
  font-size: .7rem;
824
861
  padding: 2px 6px;
825
862
  border-radius: 4px;
826
- color: #fff;
863
+ color: var(--badge-fg);
827
864
  font-weight: 600;
828
865
  letter-spacing: .02em;
829
866
  }
830
- .pf .badge-wildcard { background: var(--danger, #ef4444); }
831
- .pf .badge-ghii { background: #8b5cf6; }
832
- .pf .badge-organism { background: var(--success, #22c55e); }
833
- .pf .badge-domain { background: #f97316; }
834
- .pf .badge-node { background: #6b7280; }
835
- .pf .badge-gaii { background: #3b82f6; }
867
+ .pf .badge-wildcard { background: var(--badge-wildcard-bg); }
868
+ .pf .badge-ghii { background: var(--badge-ghii-bg); }
869
+ .pf .badge-organism { background: var(--badge-organism-bg); }
870
+ .pf .badge-domain { background: var(--badge-domain-bg); }
871
+ .pf .badge-node { background: var(--badge-node-bg); }
872
+ .pf .badge-gaii { background: var(--badge-gaii-bg); }
836
873
 
837
874
  /* ── Visibility Pill (shared: memory-tab, knowledge-tab) ── */
875
+ /* Shape mirrors the canonical .pill base in theme.css; kept declared here (not
876
+ delegated) because the scoped `.pf .vis-pill` (0,2,0) would beat a bare `.pill`
877
+ (0,1,0) anyway — the specificity trap. Radius now uses the same --radius-full
878
+ token as .pill (9999px) so the two stay in lockstep. Colors below are already
879
+ token-based and flip in dark mode. */
838
880
  .pf .vis-pill {
839
881
  border: none; cursor: pointer; padding: 2px 8px;
840
- border-radius: 9999px; font-size: .7rem; font-weight: 600;
882
+ border-radius: var(--radius-full); font-size: .7rem; font-weight: 600;
841
883
  transition: opacity 0.15s;
842
884
  }
843
885
  .pf .vis-pill:hover { opacity: 0.8; }
844
- .pf .vis-public { background: rgba(74, 222, 128, .15); color: #4ade80; }
845
- .pf .vis-owner { background: rgba(96, 165, 250, .15); color: #60a5fa; }
846
- .pf .vis-group { background: rgba(16, 185, 129, .15); color: var(--success, #10b981); }
847
- .pf .vis-private { background: rgba(192, 132, 252, .15); color: #c084fc; }
848
- .pf .vis-protected { background: rgba(96, 165, 250, .15); color: #60a5fa; }
849
-
850
- /* ── Toggle Switch (shared: notifications-tab, email-tab) ── */
851
- .pf-toggle { display: flex; align-items: center; gap: 10px; cursor: pointer; }
852
- .pf-toggle-input { position: absolute; opacity: 0; width: 0; height: 0; }
853
- .pf-toggle-slider {
854
- position: relative; display: inline-block; width: 44px; height: 24px;
855
- background: #D1D5DB; border-radius: 12px; transition: background 0.2s;
856
- }
857
- .pf-toggle-slider::after {
858
- content: ''; position: absolute; top: 2px; left: 2px;
859
- width: 20px; height: 20px; border-radius: 50%; background: #fff;
860
- transition: transform 0.2s; box-shadow: 0 1px 3px rgba(0,0,0,0.15);
861
- }
862
- .pf-toggle-input:checked + .pf-toggle-slider { background: var(--success, #22c55e); }
863
- .pf-toggle-input:checked + .pf-toggle-slider::after { transform: translateX(20px); }
864
- .pf-toggle-label { font-size: .85rem; color: var(--text, #1A1A2E); }
865
-
866
- /* ── Glass Card (shared: email-tab, notifications-tab) ── */
867
- .pf-glass-card {
868
- padding: 16px; border-radius: 8px;
869
- background: var(--surface, #F9FAFB);
870
- border: 1px solid var(--border, #E5E7EB);
871
- margin-bottom: 1rem;
872
- }
886
+ .pf .vis-public { background: var(--success-bg); color: var(--success-fg); }
887
+ .pf .vis-owner { background: var(--info-bg); color: var(--info-fg); }
888
+ .pf .vis-group { background: var(--success-bg); color: var(--success-fg); }
889
+ .pf .vis-private { background: var(--purple-bg); color: var(--purple-fg); }
890
+ .pf .vis-protected { background: var(--info-bg); color: var(--info-fg); }
891
+
892
+ /* Toggle Switch moved to theme.css .toggle* (canonical /components/ToggleSwitch.js, #14). */
893
+
894
+ /* Glass Card removed (#22): GlassCard now delegates to the canonical
895
+ /components/Card.js (variant="glass" → .card-glass in theme.css). */
873
896
 
874
897
  /* ── Generator: live status on type badge (replaces dots) ── */
875
898
  .pf-gen-type-badge.live-active { border-right: 3px solid var(--success, #22c55e); padding-right: 6px; }
@@ -1136,7 +1159,7 @@
1136
1159
  .pf .dw-checkbox-col { width: 30px; }
1137
1160
  .pf .dw-code-accent { font-family: var(--font-mono, monospace); font-size: .8rem; color: var(--love3); }
1138
1161
  .pf .dw-recipient-cell { display: flex; gap: 4px; align-items: center; }
1139
- .pf .dw-expiring-icon { color: #f59e0b; font-size: .7rem; margin-right: 4px; }
1162
+ .pf .dw-expiring-icon { color: var(--warn); font-size: .7rem; margin-right: 4px; }
1140
1163
  .pf .dw-consent-card { margin-bottom: 1rem; padding: 1rem; border-color: var(--love1); }
1141
1164
  .pf .dw-section-title { margin: 1rem 0 .75rem; }
1142
1165
  .pf .dw-section-heading { color: var(--love1, #E8564A); margin: 1.5rem 0 .75rem; }
@@ -1185,7 +1208,7 @@
1185
1208
  .pf .ext-modal-section { margin-top: 1rem; }
1186
1209
  .pf .ext-radio-row { display: flex; gap: 1rem; margin: .5rem 0; }
1187
1210
  .pf .ext-modal-textarea { width: 100%; font-family: monospace; font-size: 13px; }
1188
- .pf .ext-lib-entry { margin-bottom: .75rem; padding: .75rem; background: #F9FAFB; border: 1px solid #E5E7EB; border-radius: 8px; }
1211
+ .pf .ext-lib-entry { margin-bottom: .75rem; padding: .75rem; background: var(--bg-surface); border: 1px solid var(--border); border-radius: 8px; }
1189
1212
  .pf .ext-lib-entry-input { width: 100%; margin-bottom: .5rem; }
1190
1213
  .pf .ext-lib-entry-code { width: 100%; font-family: monospace; font-size: 13px; }
1191
1214
  .pf .ext-modal-footer { display: flex; justify-content: flex-end; gap: 1rem; margin-top: 1.5rem; }
@@ -1211,16 +1234,15 @@
1211
1234
  .pf .pf-badge-xs { font-size: .6rem; }
1212
1235
  .pf .pf-sharing-box { margin-bottom: .75rem; padding: .5rem .75rem; border: 1px solid rgba(232,86,74,.15); border-radius: 8px; background: rgba(232,86,74,.04); }
1213
1236
  .pf .pf-sharing-heading { margin: 0 0 .5rem; font-size: .8rem; }
1214
- .pf .vis-owner { background: rgba(107, 114, 128, .15); color: #6b7280; }
1237
+ .pf .vis-owner { background: var(--bg-surface); color: var(--text-dim); }
1215
1238
 
1216
1239
  /* ══ Refactored inline styles (2026-03-17) ══════════════ */
1217
1240
 
1218
1241
  /* ── Node Stats tab ── */
1219
1242
  .pf .stat-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: .75rem; margin-bottom: 1.5rem; }
1220
1243
  .pf .stat-grid-sm { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: .75rem; margin-bottom: 1rem; }
1221
- .pf .stat-card { text-align: center; padding: 1rem; }
1222
- .pf .stat-value { font-size: 1.5rem; font-weight: 700; }
1223
- .pf .stat-label { font-size: .75rem; color: var(--muted); margin-top: .25rem; }
1244
+ /* .pf .stat-card/.stat-value/.stat-label removed — node-stats uses canonical
1245
+ .stat-card / .stat-card-value / .stat-card-label. Unified 2026-06-02 (#6). */
1224
1246
  .pf .stat-two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; margin-bottom: 1.5rem; }
1225
1247
  .pf .stat-section-h3 { color: var(--love1); margin: 1.5rem 0 .75rem; font-size: 1rem; }
1226
1248
  .pf .stat-panel-h4 { color: var(--love1); margin: 0 0 .75rem; font-size: .9rem; }
@@ -1262,10 +1284,13 @@
1262
1284
  .pf .access-mcp-url { font-family: monospace; font-size: .85rem; color: var(--love3); }
1263
1285
  .pf .access-mcp-desc { font-size: .75rem; color: var(--muted); margin-top: .3rem; }
1264
1286
  .pf .access-fed-add { margin-top: .5rem; }
1287
+ .pf .access-pat-token { font-family: monospace; font-size: .8rem; word-break: break-all; background: var(--bg-dim); padding: .4rem .6rem; border-radius: 6px; flex: 1; }
1288
+ .pf .access-pat-prompt-row { margin-top: .5rem; }
1289
+ .pf .access-pat-scope-row { align-items: center; gap: .5rem; margin: .2rem 0; }
1290
+ .pf .access-pat-scope-domain { display: inline-block; min-width: 5rem; font-weight: 600; font-size: .8rem; color: var(--muted); }
1265
1291
 
1266
1292
  /* ── Wallet tab ── */
1267
- .pf .wl-val-success { color: var(--success, #22c55e); }
1268
- .pf .wl-val-danger { color: var(--danger, #ef4444); }
1293
+ /* .wl-val-success/-danger removed — wallet uses canonical .stat-card-value.success/.danger. (#6) */
1269
1294
  .pf .wallet-input-w { width: 120px; }
1270
1295
  .pf .wallet-reason-field { flex: 1; min-width: 150px; }
1271
1296
 
@@ -1426,7 +1451,7 @@
1426
1451
  .pf .pf-lp-stat-green { color: var(--success, #22c55e); }
1427
1452
  .pf .pf-federation-badge {
1428
1453
  display: inline-flex; align-items: center; gap: 5px;
1429
- font-size: .75rem; color: #6366F1; background: #EEF0FF;
1454
+ font-size: .75rem; color: var(--info-fg); background: var(--info-bg);
1430
1455
  padding: 3px 10px; border-radius: 20px; font-weight: 500; margin-top: 6px;
1431
1456
  }
1432
1457
  .pf .pf-fed-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--success, #22c55e); }
@@ -1448,7 +1473,7 @@
1448
1473
  }
1449
1474
  .pf .pf-onboard-card:hover { border-color: var(--accent, #E8564A); box-shadow: 0 4px 12px rgba(0,0,0,.06); transform: translateY(-1px); }
1450
1475
  .pf .pf-onboard-card.highlight { border-color: var(--accent, #E8564A); background: var(--accent-soft, #FFF0EE); }
1451
- .pf .pf-onboard-card.highlight:hover { background: #FFE8E5; }
1476
+ .pf .pf-onboard-card.highlight:hover { background: var(--accent-subtle); }
1452
1477
  .pf .pf-onboard-icon { font-size: 24px; margin-bottom: 8px; display: block; }
1453
1478
  .pf .pf-onboard-title { font-size: .93rem; font-weight: 600; margin-bottom: 4px; }
1454
1479
  .pf .pf-onboard-desc { font-size: .81rem; color: var(--text-dim, #6B7280); line-height: 1.5; }
@@ -1461,7 +1486,7 @@
1461
1486
 
1462
1487
  /* --- Knowledge Callout (new user, after hero) --- */
1463
1488
  .pf .pf-knowledge-callout {
1464
- background: linear-gradient(135deg, #EEF0FF, #F8F0FF);
1489
+ background: var(--pf-callout-gradient);
1465
1490
  border-radius: 12px; padding: 16px 20px;
1466
1491
  display: flex; align-items: flex-start; gap: 14px;
1467
1492
  border: 1px solid rgba(99,102,241,.15); cursor: pointer;
@@ -1482,7 +1507,7 @@
1482
1507
  /* --- Knowledge Button (active user) --- */
1483
1508
  .pf .pf-knowledge-btn {
1484
1509
  display: flex; align-items: center; gap: 12px;
1485
- background: linear-gradient(135deg, #EEF0FF, #F8F0FF);
1510
+ background: var(--pf-callout-gradient);
1486
1511
  border: 1px solid rgba(99,102,241,.15);
1487
1512
  border-radius: 12px; padding: 14px 20px;
1488
1513
  cursor: pointer; transition: all .2s;
@@ -1687,7 +1712,7 @@
1687
1712
  .pf .pf-view-item-vis.pf-vis-private { background: var(--accent-soft, #FFF0EE); color: var(--accent, #E8564A); }
1688
1713
  .pf .pf-view-item-vis.pf-vis-public { background: rgba(34,197,94,.1); color: var(--success, #22c55e); }
1689
1714
  .pf .pf-view-item-vis.pf-vis-group { background: rgba(16,185,129,.1); color: var(--success, #10b981); }
1690
- .pf .pf-view-item-vis.pf-vis-shared { background: #EEF0FF; color: #6366F1; }
1715
+ .pf .pf-view-item-vis.pf-vis-shared { background: var(--info-bg); color: var(--info-fg); }
1691
1716
 
1692
1717
  /* Agent status dots in panels */
1693
1718
  .pf .pf-agent-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--text-dim, #9CA3AF); }
@@ -1912,3 +1937,66 @@
1912
1937
  .pf-gen-debug-body { grid-template-columns: 1fr; }
1913
1938
  .pf-gen-debug-tree { border-right: none; border-bottom: 1px solid var(--border); padding-right: 0; padding-bottom: var(--sp-2); max-height: 200px; }
1914
1939
  }
1940
+
1941
+ /* ───── Persistent profile sidebar nav (replaces the tier-adaptive menu) ─────
1942
+ * Theme-token driven (no hardcoded colors). Desktop = sticky left sidebar +
1943
+ * content column; mobile (<=900px) = off-canvas drawer toggled by .pf-mnav-toggle. */
1944
+ .pf-shell { display: flex; align-items: flex-start; gap: 0; position: relative; }
1945
+
1946
+ .pf-sidebar {
1947
+ width: 240px; flex: 0 0 240px;
1948
+ position: sticky; top: var(--nav-height, 56px);
1949
+ max-height: calc(100vh - var(--nav-height, 56px));
1950
+ overflow-y: auto;
1951
+ padding: 0.75rem 0.5rem 2rem;
1952
+ border-right: 1px solid var(--border);
1953
+ }
1954
+ .pf-side-identity { display: flex; align-items: center; gap: 0.6rem; padding: 0.4rem 0.6rem 0.8rem; }
1955
+ .pf-side-avatar { width: 34px; height: 34px; border-radius: var(--radius-full, 999px); flex: 0 0 auto; background: linear-gradient(135deg, var(--accent), var(--accent-deep, var(--accent))); }
1956
+ .pf-side-id-name { font-weight: 700; font-size: 0.95rem; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1957
+
1958
+ .pf-side-group { margin-top: 0.4rem; }
1959
+ .pf-side-group-title { font-size: 0.68rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--text-dim); padding: 0.55rem 0.7rem 0.25rem; }
1960
+ .pf-side-item {
1961
+ display: flex; align-items: center; gap: 0.6rem; width: 100%;
1962
+ padding: 0.5rem 0.7rem; border: none; background: none; color: var(--text);
1963
+ cursor: pointer; font: inherit; font-size: 0.9rem; text-align: left;
1964
+ border-radius: var(--radius-sm, 8px);
1965
+ }
1966
+ .pf-side-item:hover { background: var(--bg-hover, var(--bg-dim)); }
1967
+ .pf-side-item--active { background: var(--accent-faint, var(--bg-dim)); color: var(--accent); font-weight: 700; }
1968
+ .pf-side-ico { width: 1.3rem; text-align: center; flex: 0 0 auto; }
1969
+ .pf-side-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1970
+ .pf-side-badge { margin-left: auto; font-size: 0.68rem; background: var(--bg-dim); color: var(--text-dim); padding: 0.05rem 0.45rem; border-radius: var(--radius-full, 999px); }
1971
+
1972
+ .pf-content { flex: 1 1 auto; min-width: 0; padding: 1.25rem 1.5rem; }
1973
+ .pf-content-head { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 1rem; }
1974
+ .pf-back-btn { background: none; border: 1px solid var(--border); color: var(--text-dim); border-radius: var(--radius-sm, 8px); padding: 0.3rem 0.7rem; cursor: pointer; font: inherit; font-size: 0.85rem; }
1975
+ .pf-back-btn:hover { background: var(--bg-hover, var(--bg-dim)); }
1976
+ .pf-back-current { font-weight: 700; font-size: 1.05rem; color: var(--text); }
1977
+ .pf-content-body { min-width: 0; }
1978
+
1979
+ .pf-mnav-toggle { display: none; }
1980
+ .pf-scrim { display: none; }
1981
+
1982
+ @media (max-width: 900px) {
1983
+ .pf-shell { display: block; }
1984
+ .pf-mnav-toggle {
1985
+ display: inline-flex; align-items: center; gap: 0.4rem; margin: 0.5rem 0 0.75rem;
1986
+ padding: 0.45rem 0.85rem; border: 1px solid var(--border); background: var(--card);
1987
+ color: var(--text); border-radius: var(--radius-sm, 8px); cursor: pointer; font: inherit; font-weight: 600;
1988
+ }
1989
+ .pf-sidebar {
1990
+ position: fixed; top: var(--nav-height, 56px); left: 0; bottom: 0; width: 264px; max-height: none;
1991
+ background: var(--card); z-index: 50; transform: translateX(-100%); transition: transform 0.22s ease;
1992
+ box-shadow: var(--shadow-lg, 0 8px 30px rgba(0,0,0,.2));
1993
+ }
1994
+ .pf-shell--open .pf-sidebar { transform: translateX(0); }
1995
+ .pf-shell--open .pf-scrim {
1996
+ display: block; position: fixed; inset: var(--nav-height, 56px) 0 0;
1997
+ background: var(--overlay-scrim, rgba(0,0,0,.35)); z-index: 45;
1998
+ }
1999
+ /* Screen space is valuable on mobile — minimal side margins. */
2000
+ .pf { padding: 0.6rem 0.35rem 1.5rem; }
2001
+ .pf-content { padding: 0.5rem 0.35rem 1.5rem; }
2002
+ }