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
@@ -4,6 +4,18 @@
4
4
  * Uses agd- prefix to avoid collisions with other profile styles.
5
5
  * All colors use CSS variables from theme.css.
6
6
  * @version-history
7
+ * v1.9.0 -- 2026-06-02 -- Component unification (#24 search bar): tokenize the
8
+ * hardcoded hex fallbacks in .pf-agd-search-input (var(--border, #E5E7EB) ->
9
+ * var(--border); var(--card-bg, #FFFFFF) -> var(--card); var(--text, #1A1A2E)
10
+ * -> var(--text)) so the task search input flips in dark mode. Markup left in
11
+ * place (view-scoped task filter state; not migrated to canonical SearchBar).
12
+ * v1.8.0 -- 2026-06-02 -- Component unification (#21 key/value rows): tokenize the
13
+ * hardcoded hex fallbacks in .pf-agd-info-label/.pf-agd-info-value
14
+ * (var(--text-dim, #6B7280) -> var(--text-dim); var(--text, #1A1A2E) ->
15
+ * var(--text)) so the agent-detail info rows flip in dark mode. Markup left
16
+ * in place (borderless look differs from canonical .kv-row).
17
+ * v1.7.0 -- 2026-06-02 -- Component unification (#6 stat cards): remove .agd-stat*/
18
+ * .pf-agd-stat*; agent activity/quality stats use canonical .stat-card family.
7
19
  * v1.0.0 -- 2026-05-21 -- Initial creation for Agent Dashboard Phase 1
8
20
  * v1.1.0 -- 2026-05-22 -- Add capability badge styles for Capabilities sub-tab
9
21
  * v1.2.0 -- 2026-05-22 -- Add Activity sub-tab styles (stats cards, chart, jobs, event log)
@@ -27,6 +39,16 @@
27
39
  * v2.12.0 -- 2026-05-31 -- Add deliverable rating control styles (star picker, current-rating row, rate modal fields)
28
40
  * v2.13.0 -- 2026-05-31 -- Add Quality-tab "Rate deliverables" pending-list row styles
29
41
  * v2.14.0 -- 2026-06-01 -- Add Tasks-tab max-concurrent-tasks config row styles
42
+ * v2.15.0 -- 2026-06-01 -- Blur-title eye is now hover-only (revealed on task-row hover/focus) to de-clutter the list; blurred rows keep their eye visible
43
+ * v2.16.0 -- 2026-06-01 -- Add Tasks-tab triage UI styles (bucket segments + counts, search bar, time chips, per-task triage buttons)
44
+ * v2.17.0 -- 2026-06-01 -- Add per-task memory entries list styles (expanded task)
45
+ * v2.18.0 -- 2026-06-01 -- Per-task memory entries are collapsible with pretty-printed JSON bodies
46
+ * v2.19.0 -- 2026-06-01 -- Structured JSON view for memory values (key/value rows, indented nested blocks, type colours)
47
+ * v2.20.0 -- 2026-06-01 -- Tab bar wraps (flex-wrap) instead of horizontal scroll so all 10 tabs stay visible on two rows
48
+ * v2.21.0 -- 2026-06-02 -- Unseen-change badges: collapsed-card mini-badge (pf-agd-change-badge) + per-tab number badges (pf-agd-tab-badge)
49
+ * v2.22.0 -- 2026-06-02 -- Add divider line above the tab bar (border-top + spacing) so tabs don't blend with the status row above
50
+ * v2.23.0 -- 2026-06-02 -- Compact .md-body styles for agent message bubbles (Markdown-rendered outbound replies)
51
+ * v2.24.0 -- 2026-06-02 -- Compact .md-body styles for Markdown-rendered non-JSON task memory values (pf-agd-task-memory-md)
30
52
  * v2.11.0 -- 2026-05-31 -- Widen the solo pop-out window (and pf-agd-solo max-width) so the agent card matches the list-view width and the full tab bar fits
31
53
  * v2.12.0 -- 2026-05-31 -- Add completed-task deliverable styles (pf-agd-deliverable*) linking a task to its agent-memory output key
32
54
  * v2.13.0 -- 2026-05-31 -- Add per-task blur-title toggle styles (pf-agd-blur-toggle, pf-agd-task-title--blurred) for hiding sensitive titles in screen recordings
@@ -267,7 +289,7 @@
267
289
  margin-top: 0.15rem;
268
290
  }
269
291
  .pf .agd-task-actions ,
270
- .pf .pf-agd-task-actions { display: flex; gap: 0.5rem; margin-top: 0.5rem; }
292
+ .pf .pf-agd-task-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; margin-top: 0.5rem; }
271
293
 
272
294
  .pf .agd-event-log ,
273
295
  .pf .pf-agd-event-log { max-height: 200px; overflow-y: auto; margin-top: 0.5rem; }
@@ -570,15 +592,9 @@
570
592
 
571
593
  /* ── Activity sub-tab ── */
572
594
 
573
- /* Activity stats cards */
574
- .pf .agd-stats-grid ,
575
- .pf .pf-agd-stats-grid { display: flex; gap: 8px; margin-bottom: 16px; }
576
- .pf .agd-stat-card ,
577
- .pf .pf-agd-stat-card { flex: 1; background: var(--card-bg, #FFFFFF); border: 1px solid var(--border, #E5E7EB); border-radius: 8px; padding: 12px; text-align: center; }
578
- .pf .agd-stat-value ,
579
- .pf .pf-agd-stat-value { font-size: 1.5rem; font-weight: 600; color: var(--text, #1A1A2E); }
580
- .pf .agd-stat-label ,
581
- .pf .pf-agd-stat-label { font-size: 0.75rem; color: var(--text-muted, #9CA3AF); }
595
+ /* Activity stats cards — .agd-stat*/.pf-agd-stat* removed; agent activity/quality
596
+ stats use canonical .stat-grid / .stat-card / .stat-card-value / .stat-card-label.
597
+ Unified 2026-06-02 (#6). */
582
598
 
583
599
  /* Activity chart area */
584
600
  .pf .agd-chart-container ,
@@ -1699,9 +1715,19 @@
1699
1715
 
1700
1716
  .pf .pf-agd-tabs {
1701
1717
  display: flex;
1718
+ /* Wrap to a second row instead of scrolling horizontally: with 10 tabs the
1719
+ bar no longer fits one line on the card width. TABS (agent-card.js) is
1720
+ ordered by owner usage frequency so the most-used tabs land on the top row
1721
+ and the rarely-touched setup tabs fall to the second. */
1722
+ flex-wrap: wrap;
1702
1723
  gap: 0;
1724
+ row-gap: 2px;
1725
+ /* Divider above the bar too, so the tabs read as their own block and don't
1726
+ blend into the status row (Polling | Last seen | Today: N done) above. */
1727
+ border-top: 1px solid var(--border, #E5E7EB);
1728
+ margin-top: 0.5rem;
1729
+ padding-top: 0.25rem;
1703
1730
  border-bottom: 1px solid var(--border, #E5E7EB);
1704
- overflow-x: auto;
1705
1731
  }
1706
1732
  .pf .pf-agd-tab {
1707
1733
  padding: 0.5rem 0.875rem;
@@ -1726,6 +1752,47 @@
1726
1752
  min-height: 150px;
1727
1753
  }
1728
1754
 
1755
+ /* ── Unseen-change badges ──
1756
+ Collapsed-card mini-badge (total new across Tasks/Messages/Memory) + per-tab
1757
+ number badges. Both use the accent colour so "something changed" reads at a
1758
+ glance. Counts come from the localStorage last-seen baseline (agents-tab.js). */
1759
+ .pf .pf-agd-change-badge {
1760
+ display: inline-flex;
1761
+ align-items: center;
1762
+ justify-content: center;
1763
+ min-width: 18px;
1764
+ height: 18px;
1765
+ padding: 0 5px;
1766
+ margin-left: 6px;
1767
+ border-radius: 9px;
1768
+ background: var(--accent, #E8564A);
1769
+ color: #fff;
1770
+ font-size: 0.68rem;
1771
+ font-weight: 700;
1772
+ line-height: 1;
1773
+ flex-shrink: 0;
1774
+ }
1775
+ .pf .pf-agd-tab {
1776
+ /* allow the inline count badge to sit beside the label */
1777
+ display: inline-flex;
1778
+ align-items: center;
1779
+ gap: 5px;
1780
+ }
1781
+ .pf .pf-agd-tab-badge {
1782
+ display: inline-flex;
1783
+ align-items: center;
1784
+ justify-content: center;
1785
+ min-width: 16px;
1786
+ height: 16px;
1787
+ padding: 0 4px;
1788
+ border-radius: 8px;
1789
+ background: var(--accent, #E8564A);
1790
+ color: #fff;
1791
+ font-size: 0.62rem;
1792
+ font-weight: 700;
1793
+ line-height: 1;
1794
+ }
1795
+
1729
1796
  /* ── README tab (rendered from agents.<name>.readme markdown) ── */
1730
1797
  .pf .pf-agd-readme {
1731
1798
  /* Comfortable reading width that still fits ~80-col ASCII art in code fences. */
@@ -1793,6 +1860,75 @@
1793
1860
  color: var(--text, #1A1A2E);
1794
1861
  }
1795
1862
 
1863
+ /* ── Markdown inside agent (outbound) message bubbles ──
1864
+ Agent replies render through the shared Markdown component. The README
1865
+ .md-body rules are scoped to .pf-agd-readme only, so message bubbles need
1866
+ their own compact variant: no outer margins (the bubble padding handles
1867
+ spacing), modest headings, bordered code chips (the bubble surface is grey,
1868
+ so a plain grey code background would blend). */
1869
+ .pf .pf-agd-msg-bubble .md-body > :first-child { margin-top: 0; }
1870
+ .pf .pf-agd-msg-bubble .md-body > :last-child { margin-bottom: 0; }
1871
+ .pf .pf-agd-msg-bubble .md-body p { margin: 0.35rem 0; }
1872
+ .pf .pf-agd-msg-bubble .md-body h1,
1873
+ .pf .pf-agd-msg-bubble .md-body h2,
1874
+ .pf .pf-agd-msg-bubble .md-body h3,
1875
+ .pf .pf-agd-msg-bubble .md-body h4 {
1876
+ margin: 0.5rem 0 0.25rem;
1877
+ line-height: 1.3;
1878
+ font-size: 0.95rem;
1879
+ }
1880
+ .pf .pf-agd-msg-bubble .md-body h1 { font-size: 1.05rem; }
1881
+ .pf .pf-agd-msg-bubble .md-body h2 { font-size: 1rem; }
1882
+ .pf .pf-agd-msg-bubble .md-body ul,
1883
+ .pf .pf-agd-msg-bubble .md-body ol { margin: 0.35rem 0; padding-left: 1.4rem; }
1884
+ .pf .pf-agd-msg-bubble .md-body li { margin: 0.15rem 0; }
1885
+ .pf .pf-agd-msg-bubble .md-body a { color: var(--accent, #E8564A); }
1886
+ .pf .pf-agd-msg-bubble .md-body blockquote {
1887
+ margin: 0.4rem 0;
1888
+ padding: 0.2rem 0.6rem;
1889
+ border-left: 3px solid var(--border, #E5E7EB);
1890
+ color: var(--text-dim, #6B7280);
1891
+ }
1892
+ .pf .pf-agd-msg-bubble .md-body .md-code {
1893
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
1894
+ font-size: 0.8rem;
1895
+ background: var(--card, #FFFFFF);
1896
+ border: 1px solid var(--border, #E5E7EB);
1897
+ padding: 0.02rem 0.3rem;
1898
+ border-radius: 4px;
1899
+ }
1900
+ .pf .pf-agd-msg-bubble .md-body .md-pre {
1901
+ margin: 0.45rem 0;
1902
+ padding: 0.6rem;
1903
+ background: var(--card, #FFFFFF);
1904
+ border: 1px solid var(--border, #E5E7EB);
1905
+ border-radius: 6px;
1906
+ overflow-x: auto;
1907
+ }
1908
+ .pf .pf-agd-msg-bubble .md-body .md-pre .md-code {
1909
+ display: block;
1910
+ white-space: pre;
1911
+ background: none;
1912
+ border: none;
1913
+ padding: 0;
1914
+ tab-size: 4;
1915
+ font-size: 0.78rem;
1916
+ line-height: 1.35;
1917
+ color: var(--text, #1A1A2E);
1918
+ }
1919
+ .pf .pf-agd-msg-bubble .md-body table {
1920
+ border-collapse: collapse;
1921
+ margin: 0.4rem 0;
1922
+ font-size: 0.8rem;
1923
+ }
1924
+ .pf .pf-agd-msg-bubble .md-body th,
1925
+ .pf .pf-agd-msg-bubble .md-body td {
1926
+ border: 1px solid var(--border, #E5E7EB);
1927
+ padding: 0.25rem 0.5rem;
1928
+ text-align: left;
1929
+ }
1930
+ .pf .pf-agd-msg-bubble .md-body th { background: var(--card-bg-alt, #F3F4F6); }
1931
+
1796
1932
  /* ── Integration tab: Onboarding checklist ── */
1797
1933
 
1798
1934
  .pf .pf-agd-checklist {
@@ -1859,11 +1995,11 @@
1859
1995
  .pf .pf-agd-info-label {
1860
1996
  font-weight: 500;
1861
1997
  min-width: 120px;
1862
- color: var(--text-dim, #6B7280);
1998
+ color: var(--text-dim);
1863
1999
  flex-shrink: 0;
1864
2000
  }
1865
2001
  .pf .pf-agd-info-value {
1866
- color: var(--text, #1A1A2E);
2002
+ color: var(--text);
1867
2003
  word-break: break-all;
1868
2004
  }
1869
2005
 
@@ -2545,11 +2681,19 @@
2545
2681
  font-size: 0.95rem;
2546
2682
  line-height: 1;
2547
2683
  cursor: pointer;
2548
- opacity: 0.45;
2684
+ /* Hidden by default to keep the task list uncluttered; revealed when the row
2685
+ is hovered or the button is focused. opacity (not display) so the title
2686
+ never shifts when the eye appears. A row whose title is currently hidden
2687
+ keeps its eye visible (see --on) so the hidden state stays discoverable. */
2688
+ opacity: 0;
2549
2689
  transition: opacity 0.15s ease;
2550
2690
  }
2691
+ .pf .pf-agd-task-item:hover .pf-agd-blur-toggle { opacity: 0.55; }
2551
2692
  .pf .pf-agd-blur-toggle:hover { opacity: 0.9; }
2693
+ .pf .pf-agd-blur-toggle:focus-visible { opacity: 0.9; }
2694
+ /* A blurred (hidden-title) row shows its 🙈 at all times, hover or not. */
2552
2695
  .pf .pf-agd-blur-toggle--on { opacity: 0.85; }
2696
+ .pf .pf-agd-task-item:hover .pf-agd-blur-toggle--on { opacity: 0.95; }
2553
2697
 
2554
2698
  .pf .pf-agd-task-title--blurred {
2555
2699
  filter: blur(5px);
@@ -2934,3 +3078,247 @@
2934
3078
  color: var(--text-muted, #9CA3AF);
2935
3079
  font-size: 0.75rem;
2936
3080
  }
3081
+
3082
+ /* ── Tasks-tab triage: bucket segments + search + time chips ── */
3083
+ .pf .pf-agd-bucket-bar {
3084
+ display: flex;
3085
+ align-items: center;
3086
+ gap: 0.25rem;
3087
+ border-bottom: 1px solid var(--border, #E5E7EB);
3088
+ margin: 0.25rem 0 0.75rem;
3089
+ }
3090
+ .pf .pf-agd-bucket {
3091
+ background: none;
3092
+ border: none;
3093
+ border-bottom: 2px solid transparent;
3094
+ padding: 0.35rem 0.75rem;
3095
+ font-size: 0.85rem;
3096
+ color: var(--text-dim, #6B7280);
3097
+ cursor: pointer;
3098
+ transition: color 0.15s, border-color 0.15s;
3099
+ }
3100
+ .pf .pf-agd-bucket:hover { color: var(--text, #1A1A2E); }
3101
+ .pf .pf-agd-bucket--active {
3102
+ color: var(--accent, #E8564A);
3103
+ border-bottom-color: var(--accent, #E8564A);
3104
+ font-weight: 600;
3105
+ }
3106
+ .pf .pf-agd-bucket-count {
3107
+ display: inline-block;
3108
+ min-width: 1.1rem;
3109
+ font-size: 0.7rem;
3110
+ color: var(--text-muted, #9CA3AF);
3111
+ }
3112
+ .pf .pf-agd-bucket--active .pf-agd-bucket-count { color: var(--accent, #E8564A); }
3113
+ .pf .pf-agd-bucket-spacer { flex: 1; }
3114
+ .pf .pf-agd-search-toggle {
3115
+ background: none;
3116
+ border: none;
3117
+ cursor: pointer;
3118
+ font-size: 0.95rem;
3119
+ padding: 0.25rem 0.4rem;
3120
+ opacity: 0.6;
3121
+ border-radius: 6px;
3122
+ }
3123
+ .pf .pf-agd-search-toggle:hover { opacity: 1; }
3124
+ .pf .pf-agd-search-toggle--on { opacity: 1; background: var(--bg-dim, #F3F4F6); }
3125
+
3126
+ .pf .pf-agd-search-bar {
3127
+ display: flex;
3128
+ align-items: center;
3129
+ flex-wrap: wrap;
3130
+ gap: 0.5rem;
3131
+ margin-bottom: 0.75rem;
3132
+ }
3133
+ .pf .pf-agd-search-input {
3134
+ flex: 1;
3135
+ min-width: 12rem;
3136
+ padding: 0.35rem 0.6rem;
3137
+ border: 1px solid var(--border);
3138
+ border-radius: 8px;
3139
+ background: var(--card);
3140
+ color: var(--text);
3141
+ font-size: 0.85rem;
3142
+ }
3143
+ .pf .pf-agd-time-chips { display: flex; gap: 0.25rem; }
3144
+ .pf .pf-agd-time-chip {
3145
+ background: var(--bg-dim, #F3F4F6);
3146
+ border: 1px solid var(--border, #E5E7EB);
3147
+ border-radius: 999px;
3148
+ padding: 0.15rem 0.6rem;
3149
+ font-size: 0.75rem;
3150
+ color: var(--text-dim, #6B7280);
3151
+ cursor: pointer;
3152
+ }
3153
+ .pf .pf-agd-time-chip--on {
3154
+ background: var(--accent, #E8564A);
3155
+ border-color: var(--accent, #E8564A);
3156
+ color: #fff;
3157
+ }
3158
+
3159
+ /* Triage buttons pushed to the right of the task action row */
3160
+ .pf .pf-agd-task-actions-spacer { flex: 1; }
3161
+
3162
+ /* Per-task memory entries (expanded task) -- collapsible per entry */
3163
+ .pf .pf-agd-task-memory { margin: 0.5rem 0; }
3164
+ .pf .pf-agd-task-memory-list {
3165
+ display: flex;
3166
+ flex-direction: column;
3167
+ gap: 0.3rem;
3168
+ margin-top: 0.4rem;
3169
+ }
3170
+ .pf .pf-agd-task-memory-entry {
3171
+ border: 1px solid var(--border, #E5E7EB);
3172
+ border-radius: 8px;
3173
+ background: var(--card-bg, #FFFFFF);
3174
+ overflow: hidden;
3175
+ }
3176
+ .pf .pf-agd-task-memory-head {
3177
+ display: flex;
3178
+ align-items: center;
3179
+ gap: 0.4rem;
3180
+ width: 100%;
3181
+ background: none;
3182
+ border: none;
3183
+ cursor: pointer;
3184
+ text-align: left;
3185
+ padding: 0.4rem 0.55rem;
3186
+ font-size: 0.78rem;
3187
+ }
3188
+ .pf .pf-agd-task-memory-head:hover { background: var(--bg-dim, #F3F4F6); }
3189
+ .pf .pf-agd-task-memory-caret {
3190
+ color: var(--text-muted, #9CA3AF);
3191
+ font-size: 0.65rem;
3192
+ flex-shrink: 0;
3193
+ }
3194
+ .pf .pf-agd-task-memory-key {
3195
+ color: var(--text-dim, #6B7280);
3196
+ font-family: var(--font-mono, monospace);
3197
+ overflow: hidden;
3198
+ text-overflow: ellipsis;
3199
+ white-space: nowrap;
3200
+ flex: 1;
3201
+ min-width: 0;
3202
+ }
3203
+ .pf .pf-agd-task-memory-badge {
3204
+ flex-shrink: 0;
3205
+ font-size: 0.62rem;
3206
+ font-weight: 600;
3207
+ letter-spacing: 0.5px;
3208
+ color: var(--accent, #E8564A);
3209
+ border: 1px solid var(--accent, #E8564A);
3210
+ border-radius: 4px;
3211
+ padding: 0.02rem 0.3rem;
3212
+ }
3213
+ .pf .pf-agd-task-memory-body {
3214
+ padding: 0.5rem 0.6rem;
3215
+ border-top: 1px solid var(--border, #E5E7EB);
3216
+ background: var(--bg-dim, #F3F4F6);
3217
+ color: var(--text, #1A1A2E);
3218
+ font-size: 0.75rem;
3219
+ line-height: 1.5;
3220
+ max-height: 340px;
3221
+ overflow: auto;
3222
+ }
3223
+ /* Raw (non-JSON) memory value: keep formatting, wrap long lines. */
3224
+ .pf .pf-agd-task-memory-raw {
3225
+ margin: 0;
3226
+ white-space: pre-wrap;
3227
+ word-break: break-word;
3228
+ font-family: var(--font-mono, monospace);
3229
+ }
3230
+
3231
+ /* Markdown-rendered non-JSON memory values (e.g. an agent's latest_output).
3232
+ Compact, mirroring the message-bubble .md-body variant. The memory body
3233
+ background is grey (--bg-dim), so code chips get a border + light fill for
3234
+ contrast. */
3235
+ .pf .pf-agd-task-memory-md .md-body > :first-child { margin-top: 0; }
3236
+ .pf .pf-agd-task-memory-md .md-body > :last-child { margin-bottom: 0; }
3237
+ .pf .pf-agd-task-memory-md .md-body p { margin: 0.3rem 0; }
3238
+ .pf .pf-agd-task-memory-md .md-body h1,
3239
+ .pf .pf-agd-task-memory-md .md-body h2,
3240
+ .pf .pf-agd-task-memory-md .md-body h3,
3241
+ .pf .pf-agd-task-memory-md .md-body h4 {
3242
+ margin: 0.45rem 0 0.2rem;
3243
+ line-height: 1.3;
3244
+ font-size: 0.85rem;
3245
+ }
3246
+ .pf .pf-agd-task-memory-md .md-body h1 { font-size: 0.95rem; }
3247
+ .pf .pf-agd-task-memory-md .md-body h2 { font-size: 0.9rem; }
3248
+ .pf .pf-agd-task-memory-md .md-body ul,
3249
+ .pf .pf-agd-task-memory-md .md-body ol { margin: 0.3rem 0; padding-left: 1.3rem; }
3250
+ .pf .pf-agd-task-memory-md .md-body li { margin: 0.12rem 0; }
3251
+ .pf .pf-agd-task-memory-md .md-body a { color: var(--accent, #E8564A); }
3252
+ .pf .pf-agd-task-memory-md .md-body blockquote {
3253
+ margin: 0.35rem 0;
3254
+ padding: 0.15rem 0.55rem;
3255
+ border-left: 3px solid var(--border, #E5E7EB);
3256
+ color: var(--text-dim, #6B7280);
3257
+ }
3258
+ .pf .pf-agd-task-memory-md .md-body .md-code {
3259
+ font-family: var(--font-mono, ui-monospace, Menlo, Consolas, monospace);
3260
+ font-size: 0.72rem;
3261
+ background: var(--card-bg, #FFFFFF);
3262
+ border: 1px solid var(--border, #E5E7EB);
3263
+ padding: 0.02rem 0.3rem;
3264
+ border-radius: 4px;
3265
+ }
3266
+ .pf .pf-agd-task-memory-md .md-body .md-pre {
3267
+ margin: 0.4rem 0;
3268
+ padding: 0.55rem;
3269
+ background: var(--card-bg, #FFFFFF);
3270
+ border: 1px solid var(--border, #E5E7EB);
3271
+ border-radius: 6px;
3272
+ overflow-x: auto;
3273
+ }
3274
+ .pf .pf-agd-task-memory-md .md-body .md-pre .md-code {
3275
+ display: block;
3276
+ white-space: pre;
3277
+ background: none;
3278
+ border: none;
3279
+ padding: 0;
3280
+ tab-size: 4;
3281
+ font-size: 0.72rem;
3282
+ line-height: 1.35;
3283
+ color: var(--text, #1A1A2E);
3284
+ }
3285
+ .pf .pf-agd-task-memory-md .md-body table {
3286
+ border-collapse: collapse;
3287
+ margin: 0.35rem 0;
3288
+ font-size: 0.72rem;
3289
+ }
3290
+ .pf .pf-agd-task-memory-md .md-body th,
3291
+ .pf .pf-agd-task-memory-md .md-body td {
3292
+ border: 1px solid var(--border, #E5E7EB);
3293
+ padding: 0.2rem 0.45rem;
3294
+ text-align: left;
3295
+ }
3296
+ .pf .pf-agd-task-memory-md .md-body th { background: var(--card-bg, #FFFFFF); }
3297
+
3298
+ /* Structured JSON view: key/value rows, nested blocks indented with a guide line. */
3299
+ .pf .pf-agd-json-block { display: flex; flex-direction: column; gap: 0.05rem; }
3300
+ .pf .pf-agd-json-row {
3301
+ display: flex;
3302
+ gap: 0.45rem;
3303
+ align-items: baseline;
3304
+ padding: 0.05rem 0;
3305
+ }
3306
+ .pf .pf-agd-json-row--nested { display: block; }
3307
+ .pf .pf-agd-json-row--nested > .pf-agd-json-block {
3308
+ margin: 0.1rem 0 0.2rem 0.3rem;
3309
+ padding-left: 0.65rem;
3310
+ border-left: 1px solid var(--border, #E5E7EB);
3311
+ }
3312
+ .pf .pf-agd-json-key {
3313
+ font-weight: 600;
3314
+ color: var(--text-dim, #6B7280);
3315
+ font-family: var(--font-mono, monospace);
3316
+ white-space: nowrap;
3317
+ flex-shrink: 0;
3318
+ }
3319
+ .pf .pf-agd-json-key::after { content: ':'; color: var(--text-muted, #9CA3AF); font-weight: 400; }
3320
+ .pf .pf-agd-json-str { color: var(--text, #1A1A2E); word-break: break-word; }
3321
+ .pf .pf-agd-json-num { color: var(--info, #3B82F6); font-family: var(--font-mono, monospace); }
3322
+ .pf .pf-agd-json-bool { color: var(--accent, #E8564A); font-family: var(--font-mono, monospace); }
3323
+ .pf .pf-agd-json-null,
3324
+ .pf .pf-agd-json-empty { color: var(--text-muted, #9CA3AF); font-style: italic; }
@@ -4,6 +4,7 @@
4
4
  * DM Sans body text, JetBrains Mono for the prompt code block.
5
5
  * @version-history
6
6
  * v1.0.0 — 2026-03-23 — Initial implementation
7
+ * v1.1.0 — 2026-06-02 — Copied-state selector .hlp-copied → .copied (CopyButton component migration)
7
8
  */
8
9
 
9
10
  /* ── Container ── */
@@ -114,7 +115,7 @@
114
115
  }
115
116
 
116
117
  /* ── Copied state ── */
117
- .hlp-copy-btn.hlp-copied {
118
+ .hlp-copy-btn.copied {
118
119
  background: linear-gradient(135deg, #10B981, #059669);
119
120
  box-shadow: 0 4px 12px rgba(16, 185, 129, 0.25);
120
121
  }
@@ -1,67 +1,87 @@
1
+ /**
2
+ * @file hobbies.css
3
+ * @description Styles for the Hobbies directory view (home, search, profile, join, me, matches). All classes scoped under the .hb- prefix.
4
+ * @version-history
5
+ * v1.1.0 — 2026-06-02 — Phase 5: tokenize for dark mode (replaced bare light-only color literals with theme tokens)
6
+ * v1.2.0 — 2026-06-02 — Component unification (#4 buttons): remove .hb-btn* family;
7
+ * hobbies buttons use canonical theme.css .btn-primary / .btn-outline / .btn-danger / .btn-sm.
8
+ * v1.3.0 — 2026-06-02 — Component unification (#5 inputs): remove .hb-form-input/
9
+ * -textarea/-select; fields use canonical .input-field (kept hb-form-group/-label/-hint).
10
+ * v1.4.0 — 2026-06-02 — Component unification (#6 stat cards): remove .hb-stat*;
11
+ * stats use canonical .stat-grid / .stat-card / .stat-card-value.accent / .stat-card-label.
12
+ * v1.5.0 — 2026-06-02 — Component unification (#19): tokenize .hb-alert-success/-error
13
+ * (hardcoded rgba/#ef4444 → --success/-danger -bg/-fg/-border) — dark-mode fix.
14
+ * v1.6.0 — 2026-06-02 — Component unification (#15 headers): tokenize .hb-page-title
15
+ * gradient (hardcoded #E8564A → var(--accent-deep)); now token-equivalent to
16
+ * canonical theme.css .page-title/.page-subtitle (candidates for future deletion).
17
+ * v1.7.0 — 2026-06-02 — Component unification (#18 category cards): remove .hb-category-card/
18
+ * -icon/-name/-count; tiles use canonical theme.css .category-card (kept .hb-categories-grid
19
+ * wrapper — 200px columns differ from marketplace's 160px). Removed hardcoded hover #E8564A
20
+ * and rgba(0,0,0,0.06) shadow (now tokenized in the canonical class) — dark-mode fix.
21
+ * v1.8.0 — 2026-06-02 — Component unification (#17 pagination): tokenize
22
+ * .hb-pagination .active background (hardcoded rgba(232,86,74,0.06) →
23
+ * var(--accent-subtle)) — dark-mode fix. Numbered markup left in place (scoped
24
+ * .hb-, different UI from the canonical prev/page/next Pagination).
25
+ * v1.9.0 — 2026-06-02 — Component unification (#16 tags): tokenize .hb-tag
26
+ * (rgba(232,86,74,0.06)/0.2 + #E8564A → --accent-subtle/--accent-border/--accent)
27
+ * and .hb-tag-shared (rgba(34,197,94,.12)/.3 → --success-bg/-border/-fg) —
28
+ * dark-mode fix. Markup left as .hb-tag (rounded-20px pill, bespoke vs .tag-pill).
29
+ */
1
30
  /* hobbies view — scoped under .hb */
2
31
  .hb-wrap { position: relative; z-index: 1; max-width: 900px; margin: 0 auto; padding: 24px 16px 80px; }
3
- .hb-nav { display: flex; align-items: center; justify-content: space-between; padding: 12px 0; margin-bottom: 24px; border-bottom: 1px solid #E5E7EB; }
32
+ .hb-nav { display: flex; align-items: center; justify-content: space-between; padding: 12px 0; margin-bottom: 24px; border-bottom: 1px solid var(--border); }
4
33
  .hb-nav-brand { color: var(--accent); font-weight: 700; font-size: 1rem; cursor: pointer; letter-spacing: .05em; }
5
34
  .hb-nav-brand:hover { color: #E8564A; }
6
35
  .hb-nav-links { display: flex; gap: 16px; align-items: center; }
7
36
  .hb-nav-links a { color: var(--text-dim); text-decoration: none; font-size: .85rem; cursor: pointer; transition: color .2s; }
8
37
  .hb-nav-links a:hover { color: var(--accent); }
9
38
  .hb-lang-toggle { display: flex; margin-left: 8px; }
10
- .hb-lang-btn { padding: 4px 10px; border: 1px solid #E5E7EB; background: transparent; color: var(--text-muted); cursor: pointer; font-size: .75rem; font-weight: 700; transition: all .2s; }
39
+ .hb-lang-btn { padding: 4px 10px; border: 1px solid var(--border); background: transparent; color: var(--text-muted); cursor: pointer; font-size: .75rem; font-weight: 700; transition: all .2s; }
11
40
  .hb-lang-btn:first-child { border-radius: 4px 0 0 4px; }
12
41
  .hb-lang-btn:last-child { border-radius: 0 4px 4px 0; }
13
42
  .hb-lang-btn.active { background: var(--accent); color: #fff; border-color: var(--accent); }
14
- .hb-page-title { font-size: 1.8rem; font-weight: 700; background: linear-gradient(135deg, var(--accent), #E8564A); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; margin-bottom: 8px; }
43
+ /* hb-page-title is token-equivalent to canonical theme.css .page-title (candidate for future deletion → use .page-title). */
44
+ .hb-page-title { font-size: 1.8rem; font-weight: 700; background: linear-gradient(135deg, var(--accent), var(--accent-deep)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; margin-bottom: 8px; }
15
45
  .hb-page-subtitle { color: var(--text-dim); font-size: 1rem; margin-bottom: 32px; }
16
- .hb-card { background: #FFFFFF; border: 1px solid #E5E7EB; border-radius: var(--radius); padding: 24px; margin-bottom: 16px; transition: background .2s, border-color .2s, box-shadow .2s; }
17
- .hb-card:hover { background: #F3F4F6; border-color: #E8564A; box-shadow: 0 2px 8px rgba(0,0,0,0.06); }
46
+ .hb-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); padding: 24px; margin-bottom: 16px; transition: background .2s, border-color .2s, box-shadow .2s; }
47
+ .hb-card:hover { background: var(--bg-surface); border-color: #E8564A; box-shadow: 0 2px 8px rgba(0,0,0,0.06); }
18
48
  .hb-card-link { display: block; text-decoration: none; color: inherit; cursor: pointer; }
19
49
  .hb-card-title { font-size: 1.1rem; font-weight: 600; color: var(--text); margin-bottom: 8px; }
20
50
  .hb-card-meta { color: var(--text-dim); font-size: .85rem; margin-bottom: 8px; }
21
51
  .hb-tags { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0; }
22
- .hb-tag { display: inline-block; padding: 4px 12px; background: rgba(232,86,74,0.06); border: 1px solid rgba(232,86,74,0.2); border-radius: 20px; font-size: .8rem; color: #E8564A; white-space: nowrap; }
23
- .hb-tag-shared { background: rgba(34,197,94,.12); border-color: rgba(34,197,94,.3); color: var(--success); }
24
- .hb-btn { display: inline-flex; align-items: center; justify-content: center; padding: 10px 24px; border: none; border-radius: var(--radius-sm); font-size: .9rem; font-weight: 600; cursor: pointer; transition: all .2s; text-decoration: none; }
25
- .hb-btn-primary { background: linear-gradient(135deg, var(--accent), #E8564A); color: #fff; }
26
- .hb-btn-primary:hover { opacity: .9; box-shadow: 0 2px 8px rgba(232,86,74,0.2); }
27
- .hb-btn-secondary { background: #F3F4F6; border: 1px solid #E5E7EB; color: var(--text); }
28
- .hb-btn-secondary:hover { background: #E5E7EB; border-color: var(--accent); color: var(--accent); }
29
- .hb-btn-danger { background: rgba(239,68,68,.15); border: 1px solid rgba(239,68,68,.3); color: #ef4444; }
30
- .hb-btn-danger:hover { background: rgba(239,68,68,.25); }
31
- .hb-btn-sm { padding: 6px 14px; font-size: .8rem; }
52
+ .hb-tag { display: inline-block; padding: 4px 12px; background: var(--accent-subtle); border: 1px solid var(--accent-border); border-radius: 20px; font-size: .8rem; color: var(--accent); white-space: nowrap; }
53
+ .hb-tag-shared { background: var(--success-bg); border-color: var(--success-border); color: var(--success-fg); }
54
+ /* .hb-btn* removed — hobbies uses canonical theme.css .btn-primary / .btn-outline /
55
+ .btn-danger (tokenized) / .btn-sm (anchor-safe). Unified 2026-06-02 (#4 buttons). */
32
56
  .hb-form-group { margin-bottom: 16px; }
33
57
  .hb-form-label { display: block; font-size: .85rem; color: var(--text-dim); margin-bottom: 6px; font-weight: 500; }
34
- .hb-form-input, .hb-form-textarea, .hb-form-select { width: 100%; padding: 10px 14px; background: #FFFFFF; border: 1px solid #E5E7EB; border-radius: var(--radius-sm); color: #1A1A2E; font-size: .9rem; font-family: var(--font); transition: border-color .2s; }
35
- .hb-form-input:focus, .hb-form-textarea:focus, .hb-form-select:focus { outline: none; border-color: var(--accent); }
36
- .hb-form-textarea { min-height: 80px; resize: vertical; }
37
- .hb-form-select { appearance: auto; }
58
+ /* .hb-form-input/-textarea/-select removed — hobbies form fields use canonical
59
+ theme.css .input-field (focus ring added). Unified 2026-06-02 (#5). */
38
60
  .hb-form-hint { font-size: .78rem; color: var(--text-muted); margin-top: 4px; }
39
- .hb-stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 12px; margin-bottom: 32px; }
40
- .hb-stat-card { background: #FFFFFF; border: 1px solid #E5E7EB; border-radius: var(--radius-sm); padding: 16px; text-align: center; }
41
- .hb-stat-value { font-size: 1.5rem; font-weight: 700; color: var(--accent); }
42
- .hb-stat-label { font-size: .78rem; color: var(--text-muted); margin-top: 4px; }
61
+ /* .hb-stat* removed — hobbies stats use canonical .stat-grid / .stat-card /
62
+ .stat-card-value.accent / .stat-card-label. Unified 2026-06-02 (#6). */
63
+ /* Grid wrapper kept per-view: hobbies uses 200px min-width columns (marketplace 160px). */
43
64
  .hb-categories-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 12px; margin-bottom: 32px; }
44
- .hb-category-card { background: #FFFFFF; border: 1px solid #E5E7EB; border-radius: var(--radius); padding: 20px; text-align: center; cursor: pointer; transition: all .2s; }
45
- .hb-category-card:hover { background: #F3F4F6; border-color: #E8564A; box-shadow: 0 2px 8px rgba(0,0,0,0.06); }
46
- .hb-category-icon { font-size: 2rem; margin-bottom: 8px; }
47
- .hb-category-name { font-size: .95rem; font-weight: 600; color: var(--text); }
48
- .hb-category-count { font-size: .78rem; color: var(--text-muted); margin-top: 4px; }
65
+ /* .hb-category-card/-icon/-name/-count removed — hobbies interest tiles use canonical
66
+ theme.css .category-card / -icon / -name / -count. The former rules were token-
67
+ equivalent; the hover #E8564A and rgba(0,0,0,0.06) shadow are now tokenized
68
+ (var(--accent)/var(--shadow-md)) — dark-mode fix. Unified 2026-06-02 (#18). */
49
69
  .hb-empty { text-align: center; padding: 48px 16px; }
50
70
  .hb-empty-icon { font-size: 3rem; margin-bottom: 16px; opacity: .4; }
51
71
  .hb-empty-text { color: var(--text-dim); font-size: 1rem; }
52
72
  .hb-alert { padding: 12px 16px; border-radius: var(--radius-sm); margin-bottom: 16px; font-size: .9rem; }
53
- .hb-alert-success { background: rgba(34,197,94,.1); border: 1px solid rgba(34,197,94,.3); color: var(--success); }
54
- .hb-alert-error { background: rgba(239,68,68,.1); border: 1px solid rgba(239,68,68,.3); color: #ef4444; }
73
+ .hb-alert-success { background: var(--success-bg); border: 1px solid var(--success-border); color: var(--success-fg); }
74
+ .hb-alert-error { background: var(--danger-bg); border: 1px solid var(--danger-border); color: var(--danger-fg); }
55
75
  .hb-facets { margin-bottom: 24px; }
56
76
  .hb-facet-group { margin-bottom: 12px; }
57
77
  .hb-facet-label { font-size: .78rem; color: var(--text-muted); text-transform: uppercase; letter-spacing: .05em; margin-bottom: 6px; }
58
78
  .hb-facet-items { display: flex; flex-wrap: wrap; gap: 6px; }
59
- .hb-facet-item { padding: 4px 10px; background: #F3F4F6; border: 1px solid #E5E7EB; border-radius: 20px; font-size: .78rem; color: var(--text-dim); cursor: pointer; transition: all .2s; }
79
+ .hb-facet-item { padding: 4px 10px; background: var(--bg-surface); border: 1px solid var(--border); border-radius: 20px; font-size: .78rem; color: var(--text-dim); cursor: pointer; transition: all .2s; }
60
80
  .hb-facet-item:hover { border-color: var(--accent); color: var(--accent); }
61
81
  .hb-pagination { display: flex; gap: 8px; justify-content: center; margin-top: 24px; }
62
- .hb-pagination a { padding: 8px 16px; background: #FFFFFF; border: 1px solid #E5E7EB; border-radius: var(--radius-sm); color: var(--text); text-decoration: none; font-size: .85rem; cursor: pointer; }
82
+ .hb-pagination a { padding: 8px 16px; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-sm); color: var(--text); text-decoration: none; font-size: .85rem; cursor: pointer; }
63
83
  .hb-pagination a:hover { border-color: var(--accent); color: var(--accent); }
64
- .hb-pagination .active { border-color: var(--accent); color: var(--accent); background: rgba(232,86,74,0.06); }
84
+ .hb-pagination .active { border-color: var(--accent); color: var(--accent); background: var(--accent-subtle); }
65
85
  .hb-profile-header { display: flex; align-items: center; gap: 16px; margin-bottom: 24px; }
66
86
  .hb-profile-avatar { font-size: 2.5rem; }
67
87
  .hb-profile-name { font-size: 1.5rem; font-weight: 700; color: var(--text); }