aimeat 2.1.0 → 2.3.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 (1300) hide show
  1. package/README.md +110 -84
  2. package/dist/.env.example +57 -16
  3. package/dist/locales/en.json +277 -369
  4. package/dist/locales/fi.json +281 -373
  5. package/dist/public/components/ContactCard.js +30 -5
  6. package/dist/public/components/ContactPicker.js +3 -2
  7. package/dist/public/components/ImageDeliverable.js +2 -1
  8. package/dist/public/components/JsonView.js +1 -0
  9. package/dist/public/components/LinkPreview.js +1 -1
  10. package/dist/public/components/NotificationBell.js +6 -4
  11. package/dist/public/components/UsageChart.js +2 -1
  12. package/dist/public/cortex-bundled/aimeat-charts.js +158 -10
  13. package/dist/public/cortex-bundled/aimeat-charts.yaml +1 -1
  14. package/dist/public/cortex-bundled/aimeat-dag.js +515 -173
  15. package/dist/public/cortex-bundled/aimeat-dag.yaml +1 -1
  16. package/dist/public/cortex-bundled/aimeat-i18n.js +6 -1
  17. package/dist/public/cortex-bundled/aimeat-i18n.yaml +1 -1
  18. package/dist/public/cortex-bundled/aimeat-surface.js +577 -0
  19. package/dist/public/cortex-bundled/aimeat-surface.yaml +107 -0
  20. package/dist/public/cortex-bundled/aimeat-viewport.js +405 -0
  21. package/dist/public/cortex-bundled/aimeat-viewport.yaml +100 -0
  22. package/dist/public/css/theme.css +1516 -1432
  23. package/dist/public/css/views/app-grant.css +95 -36
  24. package/dist/public/css/views/help.css +28 -0
  25. package/dist/public/css/views/inbox.css +1 -1
  26. package/dist/public/css/views/landing.css +20 -0
  27. package/dist/public/css/views/members.css +40 -10
  28. package/dist/public/css/views/portal-dev.css +64 -45
  29. package/dist/public/css/views/profile.css +17 -0
  30. package/dist/public/js/api.js +1 -0
  31. package/dist/public/js/app-sandbox.js +1 -0
  32. package/dist/public/js/components/auth-image.js +3 -1
  33. package/dist/public/js/i18n.js +3 -1
  34. package/dist/public/js/presence-store.js +3 -1
  35. package/dist/public/js/recents.js +2 -0
  36. package/dist/public/js/services/agent-activity.js +2 -1
  37. package/dist/public/js/services/agent-directives.js +2 -1
  38. package/dist/public/js/services/agent-integration.js +2 -1
  39. package/dist/public/js/services/agent-messages.js +2 -1
  40. package/dist/public/js/services/agent-tasks.js +2 -1
  41. package/dist/public/js/services/agents.js +3 -2
  42. package/dist/public/js/services/calibrator.js +2 -1
  43. package/dist/public/js/services/consent.js +2 -1
  44. package/dist/public/js/services/contacts.js +2 -1
  45. package/dist/public/js/services/cortex.js +5 -4
  46. package/dist/public/js/services/ecosystem.js +2 -1
  47. package/dist/public/js/services/knowledge.js +2 -1
  48. package/dist/public/js/services/ledger.js +2 -1
  49. package/dist/public/js/services/living.js +10 -9
  50. package/dist/public/js/services/memory.js +2 -1
  51. package/dist/public/js/services/messages.js +53 -8
  52. package/dist/public/js/services/nodes.js +3 -2
  53. package/dist/public/js/services/notebook-plan.js +2 -1
  54. package/dist/public/js/services/notebook.js +6 -5
  55. package/dist/public/js/services/offers.js +6 -5
  56. package/dist/public/js/services/organisms.js +26 -25
  57. package/dist/public/js/services/organisms.prompts.js +3 -2
  58. package/dist/public/js/services/organisms.shared.js +2 -1
  59. package/dist/public/js/services/organisms.workspace-gen.js +3 -2
  60. package/dist/public/js/services/packages.js +1 -0
  61. package/dist/public/js/services/schedules.js +2 -1
  62. package/dist/public/js/services/security.js +3 -2
  63. package/dist/public/js/services/skills.js +1 -0
  64. package/dist/public/js/services/tracked-responses.js +4 -3
  65. package/dist/public/js/services/unfurl.js +4 -4
  66. package/dist/public/js/services/work.js +2 -1
  67. package/dist/public/js/site.js +74 -0
  68. package/dist/public/js/swallowed.js +69 -0
  69. package/dist/public/js/theme.js +2 -1
  70. package/dist/public/js/utils.js +3 -1
  71. package/dist/public/lib/VENDORED.md +7 -3
  72. package/dist/public/lib/aimeat-daisyui-bridge.css +39 -2
  73. package/dist/public/lib/aimeat-game/board.css +262 -0
  74. package/dist/public/lib/aimeat-game/progress.css +406 -0
  75. package/dist/public/lib/aimeat-game/shell.css +388 -0
  76. package/dist/public/lib/aimeat-game.css +394 -0
  77. package/dist/public/lib/aimeat-theme.css +538 -0
  78. package/dist/public/lib/fonts/LICENSE.md +11 -4
  79. package/dist/public/lib/fonts/fraunces-var-latin-ext.woff2 +0 -0
  80. package/dist/public/lib/fonts/fraunces-var-latin.woff2 +0 -0
  81. package/dist/public/lib/fonts/inter-var-latin-ext.woff2 +0 -0
  82. package/dist/public/lib/fonts/inter-var-latin.woff2 +0 -0
  83. package/dist/public/lib/fonts/jetbrains-mono-var-latin-ext.woff2 +0 -0
  84. package/dist/public/lib/fonts/jetbrains-mono-var-latin.woff2 +0 -0
  85. package/dist/public/lib/fonts/space-grotesk-var-latin-ext.woff2 +0 -0
  86. package/dist/public/lib/fonts/space-grotesk-var-latin.woff2 +0 -0
  87. package/dist/public/lib/pdfjs@6/pdf.min.mjs +29 -0
  88. package/dist/public/lib/pdfjs@6/pdf.worker.min.mjs +29 -0
  89. package/dist/public/lib/samples/theme-check.html +92 -0
  90. package/dist/public/lib/samples/themes-boot.js +20 -0
  91. package/dist/public/lib/samples/themes.html +154 -0
  92. package/dist/public/lib/samples/themes.js +60 -0
  93. package/dist/public/privacy.fi.html +1 -1
  94. package/dist/public/privacy.html +1 -1
  95. package/dist/public/spa.html +885 -793
  96. package/dist/public/sw.js +4 -2
  97. package/dist/public/views/admin/agent-integration-tab.js +7 -6
  98. package/dist/public/views/admin/ai-usage-tab.js +2 -1
  99. package/dist/public/views/admin/cortex-tab.js +2 -1
  100. package/dist/public/views/admin/economy-tab.js +0 -1
  101. package/dist/public/views/admin/email-tab.js +4 -2
  102. package/dist/public/views/admin/federation-tab.js +3 -2
  103. package/dist/public/views/admin/feedback-tab.js +2 -1
  104. package/dist/public/views/admin/knowledge-tab.js +2 -1
  105. package/dist/public/views/admin/messages-tab.js +2 -1
  106. package/dist/public/views/admin/msm-tab.js +2 -1
  107. package/dist/public/views/admin/packages-tab.js +3 -2
  108. package/dist/public/views/admin/portal-tab.js +7 -2
  109. package/dist/public/views/admin/push-tab.js +9 -4
  110. package/dist/public/views/admin/stats-tab.js +2 -1
  111. package/dist/public/views/admin/usage-tab.js +4 -3
  112. package/dist/public/views/admin.js +6 -4
  113. package/dist/public/views/agent-solo.js +4 -3
  114. package/dist/public/views/app-grant.js +105 -32
  115. package/dist/public/views/business.js +139 -55
  116. package/dist/public/views/command-palette.js +5 -3
  117. package/dist/public/views/companies.js +3 -2
  118. package/dist/public/views/doc-solo.js +2 -1
  119. package/dist/public/views/help.js +95 -15
  120. package/dist/public/views/how-it-works.js +41 -8
  121. package/dist/public/views/invite-accept.js +3 -2
  122. package/dist/public/views/landing-activity.js +3 -2
  123. package/dist/public/views/landing-node-totals.js +2 -1
  124. package/dist/public/views/landing.js +75 -152
  125. package/dist/public/views/members.js +29 -2
  126. package/dist/public/views/my-company.js +9 -7
  127. package/dist/public/views/my-company.payments.js +2 -1
  128. package/dist/public/views/portal-classic.js +2 -1
  129. package/dist/public/views/portal-dev.js +64 -35
  130. package/dist/public/views/portal-dev.panels.js +39 -2
  131. package/dist/public/views/portal-dev.upload.js +25 -196
  132. package/dist/public/views/portal.components.js +4 -3
  133. package/dist/public/views/portfolio.js +5 -4
  134. package/dist/public/views/profile/access-tab/access-tokens.js +2 -1
  135. package/dist/public/views/profile/access-tab/agent-defaults.js +3 -1
  136. package/dist/public/views/profile/access-tab/connected-apps.js +152 -7
  137. package/dist/public/views/profile/access-tab/sharing-groups.js +4 -1
  138. package/dist/public/views/profile/access-tab.js +3 -1
  139. package/dist/public/views/profile/agents/agent-card.js +6 -5
  140. package/dist/public/views/profile/agents/tab-activity.js +10 -8
  141. package/dist/public/views/profile/agents/tab-agent-config.js +3 -1
  142. package/dist/public/views/profile/agents/tab-contracts.js +2 -1
  143. package/dist/public/views/profile/agents/tab-data-access.js +10 -7
  144. package/dist/public/views/profile/agents/tab-helpers.js +5 -0
  145. package/dist/public/views/profile/agents/tab-integration.js +12 -9
  146. package/dist/public/views/profile/agents/tab-messages.js +6 -4
  147. package/dist/public/views/profile/agents/tab-quality.js +3 -2
  148. package/dist/public/views/profile/agents/tab-usage.js +5 -3
  149. package/dist/public/views/profile/agents/task-item.js +12 -7
  150. package/dist/public/views/profile/agents-activity-subtab.js +5 -2
  151. package/dist/public/views/profile/agents-capabilities-subtab.js +4 -2
  152. package/dist/public/views/profile/agents-messages-subtab.js +5 -2
  153. package/dist/public/views/profile/agents-services-subtab.js +1 -0
  154. package/dist/public/views/profile/agents-tab.js +11 -7
  155. package/dist/public/views/profile/appdev-tab.js +3 -2
  156. package/dist/public/views/profile/apps-tab.js +10 -8
  157. package/dist/public/views/profile/boards-tab.js +5 -4
  158. package/dist/public/views/profile/calibrator-batch.helpers.js +3 -2
  159. package/dist/public/views/profile/calibrator-batch.js +3 -1
  160. package/dist/public/views/profile/calibrator-llm-editor.js +3 -2
  161. package/dist/public/views/profile/calibrator-tab.js +5 -4
  162. package/dist/public/views/profile/capabilities-tab.js +2 -1
  163. package/dist/public/views/profile/chat-sessions-tab.js +6 -3
  164. package/dist/public/views/profile/contacts-tab.js +2 -1
  165. package/dist/public/views/profile/data-wallet-tab.js +5 -4
  166. package/dist/public/views/profile/discover-tab.js +4 -1
  167. package/dist/public/views/profile/ecosystem-tab.automation.js +13 -9
  168. package/dist/public/views/profile/ecosystem-tab.cards.js +3 -2
  169. package/dist/public/views/profile/ecosystem-tab.js +10 -7
  170. package/dist/public/views/profile/email-tab.js +2 -1
  171. package/dist/public/views/profile/extensions-tab.js +7 -6
  172. package/dist/public/views/profile/extensions-tab.maturity.js +6 -2
  173. package/dist/public/views/profile/extensions-tab.prompts.js +24 -0
  174. package/dist/public/views/profile/federation-tab.js +2 -1
  175. package/dist/public/views/profile/inbox-tab/components.js +30 -11
  176. package/dist/public/views/profile/inbox-tab/helpers.js +15 -1
  177. package/dist/public/views/profile/inbox-tab/use-thread-ux.js +30 -3
  178. package/dist/public/views/profile/inbox-tab.js +33 -30
  179. package/dist/public/views/profile/inline-panels.js +5 -4
  180. package/dist/public/views/profile/knowledge-tab.js +15 -13
  181. package/dist/public/views/profile/landing-page.cards.js +14 -9
  182. package/dist/public/views/profile/landing-page.helpers.js +5 -2
  183. package/dist/public/views/profile/landing-page.js +11 -7
  184. package/dist/public/views/profile/landing-page.modals.js +8 -5
  185. package/dist/public/views/profile/libraries-tab.js +10 -2
  186. package/dist/public/views/profile/living-tab.js +3 -2
  187. package/dist/public/views/profile/mcp-tab.js +4 -2
  188. package/dist/public/views/profile/memory-tab/browse-view.js +3 -2
  189. package/dist/public/views/profile/memory-tab/components.js +4 -3
  190. package/dist/public/views/profile/memory-tab/entries-view.js +3 -2
  191. package/dist/public/views/profile/memory-tab.js +18 -16
  192. package/dist/public/views/profile/nodes-tab.js +2 -1
  193. package/dist/public/views/profile/notebook-card.js +4 -3
  194. package/dist/public/views/profile/notebook-tab.js +7 -5
  195. package/dist/public/views/profile/notifications-tab.js +9 -5
  196. package/dist/public/views/profile/offers-tab.js +5 -4
  197. package/dist/public/views/profile/openrouter-settings.js +5 -4
  198. package/dist/public/views/profile/organisms/activity-panel.js +2 -1
  199. package/dist/public/views/profile/organisms/agents.js +2 -1
  200. package/dist/public/views/profile/organisms/document.js +13 -12
  201. package/dist/public/views/profile/organisms/helpers.js +2 -1
  202. package/dist/public/views/profile/organisms/home.js +7 -6
  203. package/dist/public/views/profile/organisms/invite-panel.js +1 -1
  204. package/dist/public/views/profile/organisms/members.js +7 -6
  205. package/dist/public/views/profile/organisms/mindmap.js +1 -1
  206. package/dist/public/views/profile/organisms/panels.js +4 -3
  207. package/dist/public/views/profile/organisms/participants-panel.js +11 -10
  208. package/dist/public/views/profile/organisms/readme-panel.js +1 -0
  209. package/dist/public/views/profile/organisms/sources-panel.js +2 -1
  210. package/dist/public/views/profile/organisms/workspace/doc-space.js +2 -1
  211. package/dist/public/views/profile/organisms/workspace/model.js +1 -0
  212. package/dist/public/views/profile/organisms/workspace-apps.js +4 -2
  213. package/dist/public/views/profile/organisms/workspace-comments.js +3 -2
  214. package/dist/public/views/profile/organisms/workspace-list.js +5 -4
  215. package/dist/public/views/profile/organisms/workspace.js +19 -16
  216. package/dist/public/views/profile/organisms-tab.js +20 -12
  217. package/dist/public/views/profile/packages-tab.js +6 -4
  218. package/dist/public/views/profile/portfolio-tab.js +1 -1
  219. package/dist/public/views/profile/scheduler-calendar.js +2 -1
  220. package/dist/public/views/profile/scheduler-tab.js +2 -1
  221. package/dist/public/views/profile/security-tab.js +2 -1
  222. package/dist/public/views/profile/services-tab.js +4 -3
  223. package/dist/public/views/profile/wallet-tab.js +106 -36
  224. package/dist/public/views/profile/work-tab.js +3 -2
  225. package/dist/public/views/profile/workflows-form.js +2 -1
  226. package/dist/public/views/profile/workflows-tab.js +3 -2
  227. package/dist/public/views/public-workspace-viewer.js +7 -4
  228. package/dist/scripts/build-sdk-libs.d.ts.map +1 -1
  229. package/dist/scripts/build-sdk-libs.js +4 -0
  230. package/dist/scripts/build-sdk-libs.js.map +1 -1
  231. package/dist/scripts/check-openapi.d.ts +2 -0
  232. package/dist/scripts/check-openapi.d.ts.map +1 -0
  233. package/dist/scripts/check-openapi.js +139 -0
  234. package/dist/scripts/check-openapi.js.map +1 -0
  235. package/dist/scripts/check-silent-catch.d.ts +2 -0
  236. package/dist/scripts/check-silent-catch.d.ts.map +1 -0
  237. package/dist/scripts/check-silent-catch.js +159 -0
  238. package/dist/scripts/check-silent-catch.js.map +1 -0
  239. package/dist/scripts/embed-viewport.d.ts +23 -0
  240. package/dist/scripts/embed-viewport.d.ts.map +1 -0
  241. package/dist/scripts/embed-viewport.js +116 -0
  242. package/dist/scripts/embed-viewport.js.map +1 -0
  243. package/dist/src/auth/jwt.d.ts +2 -0
  244. package/dist/src/auth/jwt.d.ts.map +1 -1
  245. package/dist/src/auth/jwt.js +15 -3
  246. package/dist/src/auth/jwt.js.map +1 -1
  247. package/dist/src/auth/keypair.d.ts.map +1 -1
  248. package/dist/src/auth/keypair.js +3 -0
  249. package/dist/src/auth/keypair.js.map +1 -1
  250. package/dist/src/auth/middleware.d.ts +2 -0
  251. package/dist/src/auth/middleware.d.ts.map +1 -1
  252. package/dist/src/auth/middleware.js +33 -14
  253. package/dist/src/auth/middleware.js.map +1 -1
  254. package/dist/src/auth/node-keys.d.ts.map +1 -1
  255. package/dist/src/auth/node-keys.js +59 -16
  256. package/dist/src/auth/node-keys.js.map +1 -1
  257. package/dist/src/auth/sse-domain-scopes.d.ts +50 -0
  258. package/dist/src/auth/sse-domain-scopes.d.ts.map +1 -0
  259. package/dist/src/auth/sse-domain-scopes.js +111 -0
  260. package/dist/src/auth/sse-domain-scopes.js.map +1 -0
  261. package/dist/src/cli/config-import.d.ts.map +1 -1
  262. package/dist/src/cli/config-import.js +3 -1
  263. package/dist/src/cli/config-import.js.map +1 -1
  264. package/dist/src/cli/connect/auth.d.ts.map +1 -1
  265. package/dist/src/cli/connect/auth.js +1 -0
  266. package/dist/src/cli/connect/auth.js.map +1 -1
  267. package/dist/src/cli/connect/config.d.ts.map +1 -1
  268. package/dist/src/cli/connect/config.js +3 -1
  269. package/dist/src/cli/connect/config.js.map +1 -1
  270. package/dist/src/cli/connect/keychain.d.ts.map +1 -1
  271. package/dist/src/cli/connect/keychain.js +6 -2
  272. package/dist/src/cli/connect/keychain.js.map +1 -1
  273. package/dist/src/cli/connect/mcp/local-server.d.ts.map +1 -1
  274. package/dist/src/cli/connect/mcp/local-server.js +9 -2
  275. package/dist/src/cli/connect/mcp/local-server.js.map +1 -1
  276. package/dist/src/cli/connect/mcp/tools/agent-tasks.d.ts.map +1 -1
  277. package/dist/src/cli/connect/mcp/tools/agent-tasks.js +4 -1
  278. package/dist/src/cli/connect/mcp/tools/agent-tasks.js.map +1 -1
  279. package/dist/src/cli/connect/mcp/tools/core.d.ts.map +1 -1
  280. package/dist/src/cli/connect/mcp/tools/core.js +14 -3
  281. package/dist/src/cli/connect/mcp/tools/core.js.map +1 -1
  282. package/dist/src/cli/connect/mcp/tools/workspaces.d.ts +3 -0
  283. package/dist/src/cli/connect/mcp/tools/workspaces.d.ts.map +1 -1
  284. package/dist/src/cli/connect/mcp/tools/workspaces.js +6 -2
  285. package/dist/src/cli/connect/mcp/tools/workspaces.js.map +1 -1
  286. package/dist/src/cli/connect/task-runner.d.ts.map +1 -1
  287. package/dist/src/cli/connect/task-runner.js +11 -4
  288. package/dist/src/cli/connect/task-runner.js.map +1 -1
  289. package/dist/src/cli/connect/tool-call-defs-core.d.ts.map +1 -1
  290. package/dist/src/cli/connect/tool-call-defs-core.js +13 -1
  291. package/dist/src/cli/connect/tool-call-defs-core.js.map +1 -1
  292. package/dist/src/cli/connect/tool-call-helpers.d.ts.map +1 -1
  293. package/dist/src/cli/connect/tool-call-helpers.js +1 -0
  294. package/dist/src/cli/connect/tool-call-helpers.js.map +1 -1
  295. package/dist/src/cli/connect/tunnel-client.d.ts.map +1 -1
  296. package/dist/src/cli/connect/tunnel-client.js +26 -8
  297. package/dist/src/cli/connect/tunnel-client.js.map +1 -1
  298. package/dist/src/cli/federation-join.d.ts.map +1 -1
  299. package/dist/src/cli/federation-join.js +7 -3
  300. package/dist/src/cli/federation-join.js.map +1 -1
  301. package/dist/src/cli/init-wizard/presets.d.ts.map +1 -1
  302. package/dist/src/cli/init-wizard/presets.js +21 -0
  303. package/dist/src/cli/init-wizard/presets.js.map +1 -1
  304. package/dist/src/cli/init-wizard/steps-advanced.d.ts.map +1 -1
  305. package/dist/src/cli/init-wizard/steps-advanced.js +2 -0
  306. package/dist/src/cli/init-wizard/steps-advanced.js.map +1 -1
  307. package/dist/src/cli/init-wizard/steps-operator.d.ts.map +1 -1
  308. package/dist/src/cli/init-wizard/steps-operator.js +10 -0
  309. package/dist/src/cli/init-wizard/steps-operator.js.map +1 -1
  310. package/dist/src/commerce/__tests__/x402-registry.test.d.ts +2 -0
  311. package/dist/src/commerce/__tests__/x402-registry.test.d.ts.map +1 -0
  312. package/dist/src/commerce/__tests__/x402-registry.test.js +105 -0
  313. package/dist/src/commerce/__tests__/x402-registry.test.js.map +1 -0
  314. package/dist/src/commerce/evm-address.d.ts +21 -0
  315. package/dist/src/commerce/evm-address.d.ts.map +1 -0
  316. package/dist/src/commerce/evm-address.js +94 -0
  317. package/dist/src/commerce/evm-address.js.map +1 -0
  318. package/dist/src/commerce/invoice-handler.d.ts +5 -0
  319. package/dist/src/commerce/invoice-handler.d.ts.map +1 -0
  320. package/dist/src/commerce/invoice-handler.js +41 -0
  321. package/dist/src/commerce/invoice-handler.js.map +1 -0
  322. package/dist/src/commerce/money.d.ts +18 -5
  323. package/dist/src/commerce/money.d.ts.map +1 -1
  324. package/dist/src/commerce/money.js +27 -6
  325. package/dist/src/commerce/money.js.map +1 -1
  326. package/dist/src/commerce/payable-book.d.ts +31 -0
  327. package/dist/src/commerce/payable-book.d.ts.map +1 -0
  328. package/dist/src/commerce/payable-book.js +27 -0
  329. package/dist/src/commerce/payable-book.js.map +1 -0
  330. package/dist/src/commerce/payment-handlers.d.ts.map +1 -1
  331. package/dist/src/commerce/payment-handlers.js +8 -4
  332. package/dist/src/commerce/payment-handlers.js.map +1 -1
  333. package/dist/src/commerce/sellable-resolvers.d.ts +6 -6
  334. package/dist/src/commerce/sellable-resolvers.d.ts.map +1 -1
  335. package/dist/src/commerce/sellable-resolvers.js +17 -4
  336. package/dist/src/commerce/sellable-resolvers.js.map +1 -1
  337. package/dist/src/commerce/session-service.js +2 -2
  338. package/dist/src/commerce/session-service.js.map +1 -1
  339. package/dist/src/commerce/stripe-handler.d.ts +33 -0
  340. package/dist/src/commerce/stripe-handler.d.ts.map +1 -0
  341. package/dist/src/commerce/stripe-handler.js +108 -0
  342. package/dist/src/commerce/stripe-handler.js.map +1 -0
  343. package/dist/src/commerce/types.d.ts +10 -12
  344. package/dist/src/commerce/types.d.ts.map +1 -1
  345. package/dist/src/commerce/x402-facilitator.d.ts +64 -13
  346. package/dist/src/commerce/x402-facilitator.d.ts.map +1 -1
  347. package/dist/src/commerce/x402-facilitator.js +72 -19
  348. package/dist/src/commerce/x402-facilitator.js.map +1 -1
  349. package/dist/src/commerce/x402-handler.d.ts +13 -7
  350. package/dist/src/commerce/x402-handler.d.ts.map +1 -1
  351. package/dist/src/commerce/x402-handler.js +23 -10
  352. package/dist/src/commerce/x402-handler.js.map +1 -1
  353. package/dist/src/commerce/x402.d.ts +11 -6
  354. package/dist/src/commerce/x402.d.ts.map +1 -1
  355. package/dist/src/commerce/x402.js +10 -7
  356. package/dist/src/commerce/x402.js.map +1 -1
  357. package/dist/src/config-types.d.ts +78 -0
  358. package/dist/src/config-types.d.ts.map +1 -1
  359. package/dist/src/config.d.ts.map +1 -1
  360. package/dist/src/config.js +70 -1
  361. package/dist/src/config.js.map +1 -1
  362. package/dist/src/data/app-templates/shells.d.ts +11 -3
  363. package/dist/src/data/app-templates/shells.d.ts.map +1 -1
  364. package/dist/src/data/app-templates/shells.js +87 -6
  365. package/dist/src/data/app-templates/shells.js.map +1 -1
  366. package/dist/src/data/app-templates.js +2 -2
  367. package/dist/src/data/app-templates.js.map +1 -1
  368. package/dist/src/data/library-packs/cortex.d.ts.map +1 -1
  369. package/dist/src/data/library-packs/cortex.js +108 -5
  370. package/dist/src/data/library-packs/cortex.js.map +1 -1
  371. package/dist/src/data/library-packs/sdk.d.ts +4 -0
  372. package/dist/src/data/library-packs/sdk.d.ts.map +1 -1
  373. package/dist/src/data/library-packs/sdk.js +78 -8
  374. package/dist/src/data/library-packs/sdk.js.map +1 -1
  375. package/dist/src/data/library-packs/vendored.d.ts.map +1 -1
  376. package/dist/src/data/library-packs/vendored.js +171 -6
  377. package/dist/src/data/library-packs/vendored.js.map +1 -1
  378. package/dist/src/generated/api-types.d.ts +949 -44
  379. package/dist/src/generated/api-types.d.ts.map +1 -1
  380. package/dist/src/index-connect.d.ts.map +1 -1
  381. package/dist/src/index-connect.js +4 -1
  382. package/dist/src/index-connect.js.map +1 -1
  383. package/dist/src/index-start.d.ts.map +1 -1
  384. package/dist/src/index-start.js +10 -6
  385. package/dist/src/index-start.js.map +1 -1
  386. package/dist/src/mcp/agent-tasks.d.ts +4 -0
  387. package/dist/src/mcp/agent-tasks.d.ts.map +1 -1
  388. package/dist/src/mcp/agent-tasks.js +20 -2
  389. package/dist/src/mcp/agent-tasks.js.map +1 -1
  390. package/dist/src/mcp/app-template-proposals.d.ts.map +1 -1
  391. package/dist/src/mcp/app-template-proposals.js +2 -1
  392. package/dist/src/mcp/app-template-proposals.js.map +1 -1
  393. package/dist/src/mcp/apps.d.ts.map +1 -1
  394. package/dist/src/mcp/apps.js +4 -3
  395. package/dist/src/mcp/apps.js.map +1 -1
  396. package/dist/src/mcp/capabilities.d.ts +7 -1
  397. package/dist/src/mcp/capabilities.d.ts.map +1 -1
  398. package/dist/src/mcp/capabilities.js +8 -4
  399. package/dist/src/mcp/capabilities.js.map +1 -1
  400. package/dist/src/mcp/catalog/definitions/commerce.d.ts.map +1 -1
  401. package/dist/src/mcp/catalog/definitions/commerce.js +4 -2
  402. package/dist/src/mcp/catalog/definitions/commerce.js.map +1 -1
  403. package/dist/src/mcp/catalog/definitions/discovery-work-boards.d.ts.map +1 -1
  404. package/dist/src/mcp/catalog/definitions/discovery-work-boards.js +4 -3
  405. package/dist/src/mcp/catalog/definitions/discovery-work-boards.js.map +1 -1
  406. package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.js +1 -1
  407. package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.js.map +1 -1
  408. package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.d.ts.map +1 -1
  409. package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.js +3 -2
  410. package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.js.map +1 -1
  411. package/dist/src/mcp/catalog/output-schemas.d.ts +6 -1
  412. package/dist/src/mcp/catalog/output-schemas.d.ts.map +1 -1
  413. package/dist/src/mcp/catalog/output-schemas.js +6 -1
  414. package/dist/src/mcp/catalog/output-schemas.js.map +1 -1
  415. package/dist/src/mcp/catalog/scopes.d.ts +0 -1
  416. package/dist/src/mcp/catalog/scopes.d.ts.map +1 -1
  417. package/dist/src/mcp/catalog/scopes.js +2 -11
  418. package/dist/src/mcp/catalog/scopes.js.map +1 -1
  419. package/dist/src/mcp/catalog/surfaces.d.ts +1 -7
  420. package/dist/src/mcp/catalog/surfaces.d.ts.map +1 -1
  421. package/dist/src/mcp/catalog/surfaces.js +10 -16
  422. package/dist/src/mcp/catalog/surfaces.js.map +1 -1
  423. package/dist/src/mcp/commerce.d.ts.map +1 -1
  424. package/dist/src/mcp/commerce.js +50 -6
  425. package/dist/src/mcp/commerce.js.map +1 -1
  426. package/dist/src/mcp/core-storage.d.ts +23 -0
  427. package/dist/src/mcp/core-storage.d.ts.map +1 -0
  428. package/dist/src/mcp/core-storage.js +157 -0
  429. package/dist/src/mcp/core-storage.js.map +1 -0
  430. package/dist/src/mcp/core.d.ts +16 -0
  431. package/dist/src/mcp/core.d.ts.map +1 -1
  432. package/dist/src/mcp/core.js +78 -121
  433. package/dist/src/mcp/core.js.map +1 -1
  434. package/dist/src/mcp/dm-messages.d.ts +4 -0
  435. package/dist/src/mcp/dm-messages.d.ts.map +1 -1
  436. package/dist/src/mcp/dm-messages.js +43 -2
  437. package/dist/src/mcp/dm-messages.js.map +1 -1
  438. package/dist/src/mcp/exchange-run.d.ts +28 -0
  439. package/dist/src/mcp/exchange-run.d.ts.map +1 -1
  440. package/dist/src/mcp/exchange-run.js +58 -37
  441. package/dist/src/mcp/exchange-run.js.map +1 -1
  442. package/dist/src/mcp/exchange.d.ts.map +1 -1
  443. package/dist/src/mcp/exchange.js +12 -9
  444. package/dist/src/mcp/exchange.js.map +1 -1
  445. package/dist/src/mcp/extensions.d.ts.map +1 -1
  446. package/dist/src/mcp/extensions.js +66 -108
  447. package/dist/src/mcp/extensions.js.map +1 -1
  448. package/dist/src/mcp/index.d.ts +5 -0
  449. package/dist/src/mcp/index.d.ts.map +1 -1
  450. package/dist/src/mcp/index.js +24 -9
  451. package/dist/src/mcp/index.js.map +1 -1
  452. package/dist/src/mcp/knowledge.d.ts.map +1 -1
  453. package/dist/src/mcp/knowledge.js +1 -0
  454. package/dist/src/mcp/knowledge.js.map +1 -1
  455. package/dist/src/mcp/memory-namespace-hints.d.ts +33 -0
  456. package/dist/src/mcp/memory-namespace-hints.d.ts.map +1 -0
  457. package/dist/src/mcp/memory-namespace-hints.js +60 -0
  458. package/dist/src/mcp/memory-namespace-hints.js.map +1 -0
  459. package/dist/src/mcp/oauth.d.ts +3 -0
  460. package/dist/src/mcp/oauth.d.ts.map +1 -1
  461. package/dist/src/mcp/oauth.js +13 -8
  462. package/dist/src/mcp/oauth.js.map +1 -1
  463. package/dist/src/mcp/workspaces.d.ts +5 -0
  464. package/dist/src/mcp/workspaces.d.ts.map +1 -1
  465. package/dist/src/mcp/workspaces.js +12 -7
  466. package/dist/src/mcp/workspaces.js.map +1 -1
  467. package/dist/src/middleware/cors.d.ts.map +1 -1
  468. package/dist/src/middleware/cors.js +3 -1
  469. package/dist/src/middleware/cors.js.map +1 -1
  470. package/dist/src/middleware/subdomain.d.ts +4 -0
  471. package/dist/src/middleware/subdomain.d.ts.map +1 -1
  472. package/dist/src/middleware/subdomain.js +23 -2
  473. package/dist/src/middleware/subdomain.js.map +1 -1
  474. package/dist/src/models/agent-task-schemas.d.ts +25 -3
  475. package/dist/src/models/agent-task-schemas.d.ts.map +1 -1
  476. package/dist/src/models/agent-task-schemas.js +16 -0
  477. package/dist/src/models/agent-task-schemas.js.map +1 -1
  478. package/dist/src/models/app-tool-schemas.d.ts +553 -1
  479. package/dist/src/models/app-tool-schemas.d.ts.map +1 -1
  480. package/dist/src/models/app-tool-schemas.js +97 -1
  481. package/dist/src/models/app-tool-schemas.js.map +1 -1
  482. package/dist/src/models/odps-schemas.d.ts +305 -0
  483. package/dist/src/models/odps-schemas.d.ts.map +1 -0
  484. package/dist/src/models/odps-schemas.js +182 -0
  485. package/dist/src/models/odps-schemas.js.map +1 -0
  486. package/dist/src/models/offer-schemas.d.ts +357 -2
  487. package/dist/src/models/offer-schemas.d.ts.map +1 -1
  488. package/dist/src/models/offer-schemas.js +37 -0
  489. package/dist/src/models/offer-schemas.js.map +1 -1
  490. package/dist/src/models/schemas.d.ts +6 -3
  491. package/dist/src/models/schemas.d.ts.map +1 -1
  492. package/dist/src/models/schemas.js +10 -1
  493. package/dist/src/models/schemas.js.map +1 -1
  494. package/dist/src/models/webhook-schemas.d.ts +8 -8
  495. package/dist/src/routes/admin-config.d.ts.map +1 -1
  496. package/dist/src/routes/admin-config.js +4 -1
  497. package/dist/src/routes/admin-config.js.map +1 -1
  498. package/dist/src/routes/admin-extensions.d.ts.map +1 -1
  499. package/dist/src/routes/admin-extensions.js +2 -1
  500. package/dist/src/routes/admin-extensions.js.map +1 -1
  501. package/dist/src/routes/admin-monitoring.js +14 -5
  502. package/dist/src/routes/admin-monitoring.js.map +1 -1
  503. package/dist/src/routes/admin-security.d.ts.map +1 -1
  504. package/dist/src/routes/admin-security.js +4 -1
  505. package/dist/src/routes/admin-security.js.map +1 -1
  506. package/dist/src/routes/admin.d.ts.map +1 -1
  507. package/dist/src/routes/admin.js +6 -4
  508. package/dist/src/routes/admin.js.map +1 -1
  509. package/dist/src/routes/agent-activity.d.ts.map +1 -1
  510. package/dist/src/routes/agent-activity.js +4 -1
  511. package/dist/src/routes/agent-activity.js.map +1 -1
  512. package/dist/src/routes/agent-directives.d.ts +3 -10
  513. package/dist/src/routes/agent-directives.d.ts.map +1 -1
  514. package/dist/src/routes/agent-directives.js +7 -12
  515. package/dist/src/routes/agent-directives.js.map +1 -1
  516. package/dist/src/routes/agent-integration.d.ts.map +1 -1
  517. package/dist/src/routes/agent-integration.js +3 -1
  518. package/dist/src/routes/agent-integration.js.map +1 -1
  519. package/dist/src/routes/agent-messages.d.ts.map +1 -1
  520. package/dist/src/routes/agent-messages.js +5 -2
  521. package/dist/src/routes/agent-messages.js.map +1 -1
  522. package/dist/src/routes/agent-onboarding.d.ts.map +1 -1
  523. package/dist/src/routes/agent-onboarding.js +19 -6
  524. package/dist/src/routes/agent-onboarding.js.map +1 -1
  525. package/dist/src/routes/agent-skills-discovery.d.ts.map +1 -1
  526. package/dist/src/routes/agent-skills-discovery.js +2 -1
  527. package/dist/src/routes/agent-skills-discovery.js.map +1 -1
  528. package/dist/src/routes/agent-tasks/completion.js +1 -1
  529. package/dist/src/routes/agent-tasks/completion.js.map +1 -1
  530. package/dist/src/routes/agent-tasks/create-read.d.ts +4 -0
  531. package/dist/src/routes/agent-tasks/create-read.d.ts.map +1 -1
  532. package/dist/src/routes/agent-tasks/create-read.js +23 -2
  533. package/dist/src/routes/agent-tasks/create-read.js.map +1 -1
  534. package/dist/src/routes/agent-tasks/lifecycle.d.ts.map +1 -1
  535. package/dist/src/routes/agent-tasks/lifecycle.js +38 -9
  536. package/dist/src/routes/agent-tasks/lifecycle.js.map +1 -1
  537. package/dist/src/routes/agents/management.d.ts.map +1 -1
  538. package/dist/src/routes/agents/management.js +4 -1
  539. package/dist/src/routes/agents/management.js.map +1 -1
  540. package/dist/src/routes/agents/offers.d.ts +2 -0
  541. package/dist/src/routes/agents/offers.d.ts.map +1 -1
  542. package/dist/src/routes/agents/offers.js +0 -0
  543. package/dist/src/routes/agents/offers.js.map +1 -1
  544. package/dist/src/routes/agents/profile-metadata.d.ts.map +1 -1
  545. package/dist/src/routes/agents/profile-metadata.js +2 -1
  546. package/dist/src/routes/agents/profile-metadata.js.map +1 -1
  547. package/dist/src/routes/app-grants.d.ts +13 -0
  548. package/dist/src/routes/app-grants.d.ts.map +1 -1
  549. package/dist/src/routes/app-grants.js +124 -29
  550. package/dist/src/routes/app-grants.js.map +1 -1
  551. package/dist/src/routes/appdev-overview.d.ts.map +1 -1
  552. package/dist/src/routes/appdev-overview.js +2 -1
  553. package/dist/src/routes/appdev-overview.js.map +1 -1
  554. package/dist/src/routes/apps/catalogue-admin.d.ts.map +1 -1
  555. package/dist/src/routes/apps/catalogue-admin.js +2 -1
  556. package/dist/src/routes/apps/catalogue-admin.js.map +1 -1
  557. package/dist/src/routes/apps/drafts.d.ts +3 -0
  558. package/dist/src/routes/apps/drafts.d.ts.map +1 -1
  559. package/dist/src/routes/apps/drafts.js +65 -2
  560. package/dist/src/routes/apps/drafts.js.map +1 -1
  561. package/dist/src/routes/apps/fork-manage.d.ts.map +1 -1
  562. package/dist/src/routes/apps/fork-manage.js +6 -3
  563. package/dist/src/routes/apps/fork-manage.js.map +1 -1
  564. package/dist/src/routes/apps/helpers.d.ts.map +1 -1
  565. package/dist/src/routes/apps/helpers.js +5 -1
  566. package/dist/src/routes/apps/helpers.js.map +1 -1
  567. package/dist/src/routes/apps/publish.d.ts +2 -0
  568. package/dist/src/routes/apps/publish.d.ts.map +1 -1
  569. package/dist/src/routes/apps/publish.js +25 -5
  570. package/dist/src/routes/apps/publish.js.map +1 -1
  571. package/dist/src/routes/apps/read.d.ts.map +1 -1
  572. package/dist/src/routes/apps/read.js +2 -1
  573. package/dist/src/routes/apps/read.js.map +1 -1
  574. package/dist/src/routes/auth.d.ts.map +1 -1
  575. package/dist/src/routes/auth.js +2 -1
  576. package/dist/src/routes/auth.js.map +1 -1
  577. package/dist/src/routes/boards.js +1 -1
  578. package/dist/src/routes/boards.js.map +1 -1
  579. package/dist/src/routes/bootstrap.d.ts.map +1 -1
  580. package/dist/src/routes/bootstrap.js +8 -3
  581. package/dist/src/routes/bootstrap.js.map +1 -1
  582. package/dist/src/routes/capabilities.d.ts.map +1 -1
  583. package/dist/src/routes/capabilities.js +4 -3
  584. package/dist/src/routes/capabilities.js.map +1 -1
  585. package/dist/src/routes/commerce-acp.js +1 -1
  586. package/dist/src/routes/commerce-acp.js.map +1 -1
  587. package/dist/src/routes/commerce-ucp.d.ts +2 -3
  588. package/dist/src/routes/commerce-ucp.d.ts.map +1 -1
  589. package/dist/src/routes/commerce-ucp.js +6 -12
  590. package/dist/src/routes/commerce-ucp.js.map +1 -1
  591. package/dist/src/routes/commerce.d.ts +7 -1
  592. package/dist/src/routes/commerce.d.ts.map +1 -1
  593. package/dist/src/routes/commerce.js +175 -5
  594. package/dist/src/routes/commerce.js.map +1 -1
  595. package/dist/src/routes/csm.d.ts.map +1 -1
  596. package/dist/src/routes/csm.js +3 -1
  597. package/dist/src/routes/csm.js.map +1 -1
  598. package/dist/src/routes/ecosystem-apps.d.ts.map +1 -1
  599. package/dist/src/routes/ecosystem-apps.js +7 -6
  600. package/dist/src/routes/ecosystem-apps.js.map +1 -1
  601. package/dist/src/routes/exchange-market.d.ts +6 -2
  602. package/dist/src/routes/exchange-market.d.ts.map +1 -1
  603. package/dist/src/routes/exchange-market.js +163 -33
  604. package/dist/src/routes/exchange-market.js.map +1 -1
  605. package/dist/src/routes/exchange.d.ts +10 -1
  606. package/dist/src/routes/exchange.d.ts.map +1 -1
  607. package/dist/src/routes/exchange.js +349 -11
  608. package/dist/src/routes/exchange.js.map +1 -1
  609. package/dist/src/routes/extensions/actions.d.ts +2 -0
  610. package/dist/src/routes/extensions/actions.d.ts.map +1 -1
  611. package/dist/src/routes/extensions/actions.js +65 -8
  612. package/dist/src/routes/extensions/actions.js.map +1 -1
  613. package/dist/src/routes/extensions/crud.d.ts.map +1 -1
  614. package/dist/src/routes/extensions/crud.js +36 -3
  615. package/dist/src/routes/extensions/crud.js.map +1 -1
  616. package/dist/src/routes/extensions/entitlement-gate.d.ts +44 -7
  617. package/dist/src/routes/extensions/entitlement-gate.d.ts.map +1 -1
  618. package/dist/src/routes/extensions/entitlement-gate.js +22 -130
  619. package/dist/src/routes/extensions/entitlement-gate.js.map +1 -1
  620. package/dist/src/routes/extensions/internal-pass.d.ts +23 -0
  621. package/dist/src/routes/extensions/internal-pass.d.ts.map +1 -0
  622. package/dist/src/routes/extensions/internal-pass.js +70 -0
  623. package/dist/src/routes/extensions/internal-pass.js.map +1 -0
  624. package/dist/src/routes/extensions/manifest.d.ts +10 -0
  625. package/dist/src/routes/extensions/manifest.d.ts.map +1 -1
  626. package/dist/src/routes/extensions/manifest.js +136 -5
  627. package/dist/src/routes/extensions/manifest.js.map +1 -1
  628. package/dist/src/routes/extensions/metered-response.d.ts +37 -0
  629. package/dist/src/routes/extensions/metered-response.d.ts.map +1 -0
  630. package/dist/src/routes/extensions/metered-response.js +60 -0
  631. package/dist/src/routes/extensions/metered-response.js.map +1 -0
  632. package/dist/src/routes/extensions/pacing.d.ts +62 -0
  633. package/dist/src/routes/extensions/pacing.d.ts.map +1 -0
  634. package/dist/src/routes/extensions/pacing.js +45 -0
  635. package/dist/src/routes/extensions/pacing.js.map +1 -0
  636. package/dist/src/routes/extensions/paywall.d.ts +16 -0
  637. package/dist/src/routes/extensions/paywall.d.ts.map +1 -1
  638. package/dist/src/routes/extensions/paywall.js +170 -21
  639. package/dist/src/routes/extensions/paywall.js.map +1 -1
  640. package/dist/src/routes/extensions/priced-binding.d.ts +50 -0
  641. package/dist/src/routes/extensions/priced-binding.d.ts.map +1 -0
  642. package/dist/src/routes/extensions/priced-binding.js +46 -0
  643. package/dist/src/routes/extensions/priced-binding.js.map +1 -0
  644. package/dist/src/routes/federation-genesis.d.ts.map +1 -1
  645. package/dist/src/routes/federation-genesis.js +14 -5
  646. package/dist/src/routes/federation-genesis.js.map +1 -1
  647. package/dist/src/routes/federation-peer/introduce.d.ts.map +1 -1
  648. package/dist/src/routes/federation-peer/introduce.js +3 -1
  649. package/dist/src/routes/federation-peer/introduce.js.map +1 -1
  650. package/dist/src/routes/federation-peer/lifecycle.d.ts.map +1 -1
  651. package/dist/src/routes/federation-peer/lifecycle.js +3 -2
  652. package/dist/src/routes/federation-peer/lifecycle.js.map +1 -1
  653. package/dist/src/routes/federation-peer/peers.d.ts.map +1 -1
  654. package/dist/src/routes/federation-peer/peers.js +5 -3
  655. package/dist/src/routes/federation-peer/peers.js.map +1 -1
  656. package/dist/src/routes/federation-peer/policy-book.d.ts.map +1 -1
  657. package/dist/src/routes/federation-peer/policy-book.js +2 -1
  658. package/dist/src/routes/federation-peer/policy-book.js.map +1 -1
  659. package/dist/src/routes/federation-peer/promotion.d.ts.map +1 -1
  660. package/dist/src/routes/federation-peer/promotion.js +4 -1
  661. package/dist/src/routes/federation-peer/promotion.js.map +1 -1
  662. package/dist/src/routes/federation-settlements.js +2 -2
  663. package/dist/src/routes/federation-settlements.js.map +1 -1
  664. package/dist/src/routes/federation-sync/catalogue-trust.js +5 -3
  665. package/dist/src/routes/federation-sync/catalogue-trust.js.map +1 -1
  666. package/dist/src/routes/federation-sync/messaging.js +5 -3
  667. package/dist/src/routes/federation-sync/messaging.js.map +1 -1
  668. package/dist/src/routes/federation-sync/routing.d.ts.map +1 -1
  669. package/dist/src/routes/federation-sync/routing.js +7 -5
  670. package/dist/src/routes/federation-sync/routing.js.map +1 -1
  671. package/dist/src/routes/flags.d.ts.map +1 -1
  672. package/dist/src/routes/flags.js +3 -1
  673. package/dist/src/routes/flags.js.map +1 -1
  674. package/dist/src/routes/ghii/register-login.js +1 -1
  675. package/dist/src/routes/ghii/register-login.js.map +1 -1
  676. package/dist/src/routes/instances/install.d.ts.map +1 -1
  677. package/dist/src/routes/instances/install.js +2 -1
  678. package/dist/src/routes/instances/install.js.map +1 -1
  679. package/dist/src/routes/instances/manage.d.ts.map +1 -1
  680. package/dist/src/routes/instances/manage.js +2 -1
  681. package/dist/src/routes/instances/manage.js.map +1 -1
  682. package/dist/src/routes/knowledge/packages-core.d.ts.map +1 -1
  683. package/dist/src/routes/knowledge/packages-core.js +2 -1
  684. package/dist/src/routes/knowledge/packages-core.js.map +1 -1
  685. package/dist/src/routes/knowledge/sharing.d.ts.map +1 -1
  686. package/dist/src/routes/knowledge/sharing.js +2 -1
  687. package/dist/src/routes/knowledge/sharing.js.map +1 -1
  688. package/dist/src/routes/library-packs.d.ts.map +1 -1
  689. package/dist/src/routes/library-packs.js +10 -3
  690. package/dist/src/routes/library-packs.js.map +1 -1
  691. package/dist/src/routes/libs.d.ts +9 -0
  692. package/dist/src/routes/libs.d.ts.map +1 -1
  693. package/dist/src/routes/libs.js +11 -2
  694. package/dist/src/routes/libs.js.map +1 -1
  695. package/dist/src/routes/matches.d.ts.map +1 -1
  696. package/dist/src/routes/matches.js +7 -3
  697. package/dist/src/routes/matches.js.map +1 -1
  698. package/dist/src/routes/memory/bulk.d.ts.map +1 -1
  699. package/dist/src/routes/memory/bulk.js +3 -1
  700. package/dist/src/routes/memory/bulk.js.map +1 -1
  701. package/dist/src/routes/memory/crud.d.ts.map +1 -1
  702. package/dist/src/routes/memory/crud.js +14 -2
  703. package/dist/src/routes/memory/crud.js.map +1 -1
  704. package/dist/src/routes/memory/federation.d.ts.map +1 -1
  705. package/dist/src/routes/memory/federation.js +5 -0
  706. package/dist/src/routes/memory/federation.js.map +1 -1
  707. package/dist/src/routes/memory/key.d.ts.map +1 -1
  708. package/dist/src/routes/memory/key.js +9 -4
  709. package/dist/src/routes/memory/key.js.map +1 -1
  710. package/dist/src/routes/messages.d.ts.map +1 -1
  711. package/dist/src/routes/messages.js +2 -1
  712. package/dist/src/routes/messages.js.map +1 -1
  713. package/dist/src/routes/msm.d.ts.map +1 -1
  714. package/dist/src/routes/msm.js +3 -1
  715. package/dist/src/routes/msm.js.map +1 -1
  716. package/dist/src/routes/oauth-login.d.ts.map +1 -1
  717. package/dist/src/routes/oauth-login.js +1 -0
  718. package/dist/src/routes/oauth-login.js.map +1 -1
  719. package/dist/src/routes/openrouter.js +2 -2
  720. package/dist/src/routes/openrouter.js.map +1 -1
  721. package/dist/src/routes/organisms/crud.d.ts +3 -0
  722. package/dist/src/routes/organisms/crud.d.ts.map +1 -1
  723. package/dist/src/routes/organisms/crud.js +8 -4
  724. package/dist/src/routes/organisms/crud.js.map +1 -1
  725. package/dist/src/routes/organisms/gates.d.ts.map +1 -1
  726. package/dist/src/routes/organisms/gates.js +3 -2
  727. package/dist/src/routes/organisms/gates.js.map +1 -1
  728. package/dist/src/routes/organisms/intake.d.ts.map +1 -1
  729. package/dist/src/routes/organisms/intake.js +13 -1
  730. package/dist/src/routes/organisms/intake.js.map +1 -1
  731. package/dist/src/routes/organisms/shared.d.ts.map +1 -1
  732. package/dist/src/routes/organisms/shared.js +7 -3
  733. package/dist/src/routes/organisms/shared.js.map +1 -1
  734. package/dist/src/routes/organisms/workspace-ops.d.ts.map +1 -1
  735. package/dist/src/routes/organisms/workspace-ops.js +6 -5
  736. package/dist/src/routes/organisms/workspace-ops.js.map +1 -1
  737. package/dist/src/routes/organisms/workspace-read.d.ts.map +1 -1
  738. package/dist/src/routes/organisms/workspace-read.js +11 -4
  739. package/dist/src/routes/organisms/workspace-read.js.map +1 -1
  740. package/dist/src/routes/owners.d.ts.map +1 -1
  741. package/dist/src/routes/owners.js +37 -12
  742. package/dist/src/routes/owners.js.map +1 -1
  743. package/dist/src/routes/personal.js +3 -1
  744. package/dist/src/routes/personal.js.map +1 -1
  745. package/dist/src/routes/portal.d.ts +6 -1
  746. package/dist/src/routes/portal.d.ts.map +1 -1
  747. package/dist/src/routes/portal.js +75 -10
  748. package/dist/src/routes/portal.js.map +1 -1
  749. package/dist/src/routes/portfolio.d.ts.map +1 -1
  750. package/dist/src/routes/portfolio.js +5 -1
  751. package/dist/src/routes/portfolio.js.map +1 -1
  752. package/dist/src/routes/prompts.d.ts.map +1 -1
  753. package/dist/src/routes/prompts.js +36 -2
  754. package/dist/src/routes/prompts.js.map +1 -1
  755. package/dist/src/routes/public-events.d.ts.map +1 -1
  756. package/dist/src/routes/public-events.js +4 -1
  757. package/dist/src/routes/public-events.js.map +1 -1
  758. package/dist/src/routes/public-stats.d.ts +7 -0
  759. package/dist/src/routes/public-stats.d.ts.map +1 -1
  760. package/dist/src/routes/public-stats.js +57 -17
  761. package/dist/src/routes/public-stats.js.map +1 -1
  762. package/dist/src/routes/schedules.d.ts +3 -0
  763. package/dist/src/routes/schedules.d.ts.map +1 -1
  764. package/dist/src/routes/schedules.js +14 -1
  765. package/dist/src/routes/schedules.js.map +1 -1
  766. package/dist/src/routes/sse.d.ts +7 -0
  767. package/dist/src/routes/sse.d.ts.map +1 -1
  768. package/dist/src/routes/sse.js +36 -6
  769. package/dist/src/routes/sse.js.map +1 -1
  770. package/dist/src/routes/stats.d.ts.map +1 -1
  771. package/dist/src/routes/stats.js +5 -1
  772. package/dist/src/routes/stats.js.map +1 -1
  773. package/dist/src/routes/storage-files.d.ts +15 -0
  774. package/dist/src/routes/storage-files.d.ts.map +1 -1
  775. package/dist/src/routes/storage-files.js +69 -51
  776. package/dist/src/routes/storage-files.js.map +1 -1
  777. package/dist/src/routes/subdomains.d.ts +13 -0
  778. package/dist/src/routes/subdomains.d.ts.map +1 -1
  779. package/dist/src/routes/subdomains.js +106 -8
  780. package/dist/src/routes/subdomains.js.map +1 -1
  781. package/dist/src/routes/unfurl.d.ts.map +1 -1
  782. package/dist/src/routes/unfurl.js +13 -3
  783. package/dist/src/routes/unfurl.js.map +1 -1
  784. package/dist/src/routes/upload.d.ts +22 -0
  785. package/dist/src/routes/upload.d.ts.map +1 -1
  786. package/dist/src/routes/upload.js +204 -34
  787. package/dist/src/routes/upload.js.map +1 -1
  788. package/dist/src/routes/wallet.d.ts +3 -0
  789. package/dist/src/routes/wallet.d.ts.map +1 -1
  790. package/dist/src/routes/wallet.js +6 -1
  791. package/dist/src/routes/wallet.js.map +1 -1
  792. package/dist/src/routes/webmcp.d.ts +8 -0
  793. package/dist/src/routes/webmcp.d.ts.map +1 -1
  794. package/dist/src/routes/webmcp.js +97 -46
  795. package/dist/src/routes/webmcp.js.map +1 -1
  796. package/dist/src/routes/wellknown.d.ts.map +1 -1
  797. package/dist/src/routes/wellknown.js +1 -0
  798. package/dist/src/routes/wellknown.js.map +1 -1
  799. package/dist/src/schemas/knowledge-package.d.ts +1 -1
  800. package/dist/src/server-bootstrap/config-init.d.ts.map +1 -1
  801. package/dist/src/server-bootstrap/config-init.js +2 -0
  802. package/dist/src/server-bootstrap/config-init.js.map +1 -1
  803. package/dist/src/server-bootstrap/routes-loader.d.ts +4 -2
  804. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  805. package/dist/src/server-bootstrap/routes-loader.js +11 -22
  806. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  807. package/dist/src/server-bootstrap/service-init.js +3 -1
  808. package/dist/src/server-bootstrap/service-init.js.map +1 -1
  809. package/dist/src/server-bootstrap/static-files.d.ts +4 -0
  810. package/dist/src/server-bootstrap/static-files.d.ts.map +1 -1
  811. package/dist/src/server-bootstrap/static-files.js +14 -1
  812. package/dist/src/server-bootstrap/static-files.js.map +1 -1
  813. package/dist/src/services/agent-statistics.d.ts.map +1 -1
  814. package/dist/src/services/agent-statistics.js +4 -1
  815. package/dist/src/services/agent-statistics.js.map +1 -1
  816. package/dist/src/services/app-agent-deploy.d.ts.map +1 -1
  817. package/dist/src/services/app-agent-deploy.js +4 -1
  818. package/dist/src/services/app-agent-deploy.js.map +1 -1
  819. package/dist/src/services/app-agent-surface.d.ts +78 -0
  820. package/dist/src/services/app-agent-surface.d.ts.map +1 -0
  821. package/dist/src/services/app-agent-surface.js +74 -0
  822. package/dist/src/services/app-agent-surface.js.map +1 -0
  823. package/dist/src/services/app-tool-names.d.ts +15 -0
  824. package/dist/src/services/app-tool-names.d.ts.map +1 -0
  825. package/dist/src/services/app-tool-names.js +24 -0
  826. package/dist/src/services/app-tool-names.js.map +1 -0
  827. package/dist/src/services/appdev-overview.d.ts.map +1 -1
  828. package/dist/src/services/appdev-overview.js +3 -2
  829. package/dist/src/services/appdev-overview.js.map +1 -1
  830. package/dist/src/services/attachment-duplication.js +3 -3
  831. package/dist/src/services/attachment-duplication.js.map +1 -1
  832. package/dist/src/services/build-app-prompt.d.ts +19 -0
  833. package/dist/src/services/build-app-prompt.d.ts.map +1 -1
  834. package/dist/src/services/build-app-prompt.js +97 -11
  835. package/dist/src/services/build-app-prompt.js.map +1 -1
  836. package/dist/src/services/build-extension-prompt.d.ts +40 -0
  837. package/dist/src/services/build-extension-prompt.d.ts.map +1 -0
  838. package/dist/src/services/build-extension-prompt.js +253 -0
  839. package/dist/src/services/build-extension-prompt.js.map +1 -0
  840. package/dist/src/services/cache-cleanup.d.ts.map +1 -1
  841. package/dist/src/services/cache-cleanup.js +2 -1
  842. package/dist/src/services/cache-cleanup.js.map +1 -1
  843. package/dist/src/services/call-timing.d.ts +51 -0
  844. package/dist/src/services/call-timing.d.ts.map +1 -0
  845. package/dist/src/services/call-timing.js +92 -0
  846. package/dist/src/services/call-timing.js.map +1 -0
  847. package/dist/src/services/capability-invoke.d.ts +8 -1
  848. package/dist/src/services/capability-invoke.d.ts.map +1 -1
  849. package/dist/src/services/capability-invoke.js +24 -2
  850. package/dist/src/services/capability-invoke.js.map +1 -1
  851. package/dist/src/services/catalogue-sync.d.ts.map +1 -1
  852. package/dist/src/services/catalogue-sync.js +1 -0
  853. package/dist/src/services/catalogue-sync.js.map +1 -1
  854. package/dist/src/services/component-registrar.d.ts.map +1 -1
  855. package/dist/src/services/component-registrar.js +22 -6
  856. package/dist/src/services/component-registrar.js.map +1 -1
  857. package/dist/src/services/config-loader.d.ts.map +1 -1
  858. package/dist/src/services/config-loader.js +6 -1
  859. package/dist/src/services/config-loader.js.map +1 -1
  860. package/dist/src/services/config-schema.d.ts.map +1 -1
  861. package/dist/src/services/config-schema.js +7 -0
  862. package/dist/src/services/config-schema.js.map +1 -1
  863. package/dist/src/services/connect-tunnel.d.ts.map +1 -1
  864. package/dist/src/services/connect-tunnel.js +17 -6
  865. package/dist/src/services/connect-tunnel.js.map +1 -1
  866. package/dist/src/services/consent.d.ts.map +1 -1
  867. package/dist/src/services/consent.js +3 -1
  868. package/dist/src/services/consent.js.map +1 -1
  869. package/dist/src/services/consul-config.d.ts.map +1 -1
  870. package/dist/src/services/consul-config.js +7 -2
  871. package/dist/src/services/consul-config.js.map +1 -1
  872. package/dist/src/services/contacts.js +4 -2
  873. package/dist/src/services/contacts.js.map +1 -1
  874. package/dist/src/services/core-jobs.js +1 -1
  875. package/dist/src/services/core-jobs.js.map +1 -1
  876. package/dist/src/services/db/agent-messages-overview-db-service.d.ts.map +1 -1
  877. package/dist/src/services/db/agent-messages-overview-db-service.js +2 -1
  878. package/dist/src/services/db/agent-messages-overview-db-service.js.map +1 -1
  879. package/dist/src/services/db/agent-quality-overview-db-service.d.ts.map +1 -1
  880. package/dist/src/services/db/agent-quality-overview-db-service.js +2 -1
  881. package/dist/src/services/db/agent-quality-overview-db-service.js.map +1 -1
  882. package/dist/src/services/db/messages-inbox-db-service.d.ts.map +1 -1
  883. package/dist/src/services/db/messages-inbox-db-service.js +3 -2
  884. package/dist/src/services/db/messages-inbox-db-service.js.map +1 -1
  885. package/dist/src/services/db/messaging-db-service.d.ts.map +1 -1
  886. package/dist/src/services/db/messaging-db-service.js +3 -2
  887. package/dist/src/services/db/messaging-db-service.js.map +1 -1
  888. package/dist/src/services/db/wallet-tab-db-service.d.ts +3 -3
  889. package/dist/src/services/doc-images.d.ts.map +1 -1
  890. package/dist/src/services/doc-images.js +7 -4
  891. package/dist/src/services/doc-images.js.map +1 -1
  892. package/dist/src/services/draft-token.d.ts +22 -2
  893. package/dist/src/services/draft-token.d.ts.map +1 -1
  894. package/dist/src/services/draft-token.js +52 -3
  895. package/dist/src/services/draft-token.js.map +1 -1
  896. package/dist/src/services/ecosystem-automation-notify.d.ts.map +1 -1
  897. package/dist/src/services/ecosystem-automation-notify.js +10 -4
  898. package/dist/src/services/ecosystem-automation-notify.js.map +1 -1
  899. package/dist/src/services/ecosystem-automation.d.ts.map +1 -1
  900. package/dist/src/services/ecosystem-automation.js +3 -2
  901. package/dist/src/services/ecosystem-automation.js.map +1 -1
  902. package/dist/src/services/ecosystem-events.js +1 -1
  903. package/dist/src/services/ecosystem-events.js.map +1 -1
  904. package/dist/src/services/entitlement-merge.d.ts +50 -0
  905. package/dist/src/services/entitlement-merge.d.ts.map +1 -0
  906. package/dist/src/services/entitlement-merge.js +116 -0
  907. package/dist/src/services/entitlement-merge.js.map +1 -0
  908. package/dist/src/services/entitlement-money.d.ts.map +1 -1
  909. package/dist/src/services/entitlement-money.js +4 -1
  910. package/dist/src/services/entitlement-money.js.map +1 -1
  911. package/dist/src/services/exchange-market.d.ts +88 -10
  912. package/dist/src/services/exchange-market.d.ts.map +1 -1
  913. package/dist/src/services/exchange-market.js +104 -11
  914. package/dist/src/services/exchange-market.js.map +1 -1
  915. package/dist/src/services/exchange-odps.d.ts +58 -0
  916. package/dist/src/services/exchange-odps.d.ts.map +1 -0
  917. package/dist/src/services/exchange-odps.js +400 -0
  918. package/dist/src/services/exchange-odps.js.map +1 -0
  919. package/dist/src/services/exchange-projection.d.ts +67 -0
  920. package/dist/src/services/exchange-projection.d.ts.map +1 -0
  921. package/dist/src/services/exchange-projection.js +629 -0
  922. package/dist/src/services/exchange-projection.js.map +1 -0
  923. package/dist/src/services/exchange-proposals.d.ts.map +1 -1
  924. package/dist/src/services/exchange-proposals.js +6 -2
  925. package/dist/src/services/exchange-proposals.js.map +1 -1
  926. package/dist/src/services/extension-files.d.ts +64 -0
  927. package/dist/src/services/extension-files.d.ts.map +1 -0
  928. package/dist/src/services/extension-files.js +88 -0
  929. package/dist/src/services/extension-files.js.map +1 -0
  930. package/dist/src/services/extension-purchase.d.ts +36 -0
  931. package/dist/src/services/extension-purchase.d.ts.map +1 -0
  932. package/dist/src/services/extension-purchase.js +110 -0
  933. package/dist/src/services/extension-purchase.js.map +1 -0
  934. package/dist/src/services/extension-runtime.d.ts +56 -1
  935. package/dist/src/services/extension-runtime.d.ts.map +1 -1
  936. package/dist/src/services/extension-runtime.js +73 -4
  937. package/dist/src/services/extension-runtime.js.map +1 -1
  938. package/dist/src/services/extension-secrets.d.ts +8 -0
  939. package/dist/src/services/extension-secrets.d.ts.map +1 -1
  940. package/dist/src/services/extension-secrets.js +14 -0
  941. package/dist/src/services/extension-secrets.js.map +1 -1
  942. package/dist/src/services/federation-availability.d.ts.map +1 -1
  943. package/dist/src/services/federation-availability.js +1 -0
  944. package/dist/src/services/federation-availability.js.map +1 -1
  945. package/dist/src/services/federation-book.js +15 -7
  946. package/dist/src/services/federation-book.js.map +1 -1
  947. package/dist/src/services/federation-helpers.d.ts.map +1 -1
  948. package/dist/src/services/federation-helpers.js +1 -0
  949. package/dist/src/services/federation-helpers.js.map +1 -1
  950. package/dist/src/services/federation.d.ts.map +1 -1
  951. package/dist/src/services/federation.js +8 -6
  952. package/dist/src/services/federation.js.map +1 -1
  953. package/dist/src/services/file-refs.d.ts +105 -0
  954. package/dist/src/services/file-refs.d.ts.map +1 -0
  955. package/dist/src/services/file-refs.js +106 -0
  956. package/dist/src/services/file-refs.js.map +1 -0
  957. package/dist/src/services/gate-expiry.d.ts.map +1 -1
  958. package/dist/src/services/gate-expiry.js +2 -1
  959. package/dist/src/services/gate-expiry.js.map +1 -1
  960. package/dist/src/services/genesis-sync.d.ts.map +1 -1
  961. package/dist/src/services/genesis-sync.js +9 -4
  962. package/dist/src/services/genesis-sync.js.map +1 -1
  963. package/dist/src/services/handbooks/commerce.d.ts +13 -0
  964. package/dist/src/services/handbooks/commerce.d.ts.map +1 -0
  965. package/dist/src/services/handbooks/commerce.js +60 -0
  966. package/dist/src/services/handbooks/commerce.js.map +1 -0
  967. package/dist/src/services/handbooks/index.d.ts +1 -0
  968. package/dist/src/services/handbooks/index.d.ts.map +1 -1
  969. package/dist/src/services/handbooks/index.js +2 -2
  970. package/dist/src/services/handbooks/index.js.map +1 -1
  971. package/dist/src/services/hooks.d.ts.map +1 -1
  972. package/dist/src/services/hooks.js +2 -0
  973. package/dist/src/services/hooks.js.map +1 -1
  974. package/dist/src/services/invitations.d.ts.map +1 -1
  975. package/dist/src/services/invitations.js +2 -0
  976. package/dist/src/services/invitations.js.map +1 -1
  977. package/dist/src/services/living-author.d.ts.map +1 -1
  978. package/dist/src/services/living-author.js +4 -1
  979. package/dist/src/services/living-author.js.map +1 -1
  980. package/dist/src/services/living-pulse.js +18 -6
  981. package/dist/src/services/living-pulse.js.map +1 -1
  982. package/dist/src/services/mailbox-notification.d.ts.map +1 -1
  983. package/dist/src/services/mailbox-notification.js +1 -0
  984. package/dist/src/services/mailbox-notification.js.map +1 -1
  985. package/dist/src/services/match-notification.d.ts.map +1 -1
  986. package/dist/src/services/match-notification.js +2 -1
  987. package/dist/src/services/match-notification.js.map +1 -1
  988. package/dist/src/services/matching.d.ts.map +1 -1
  989. package/dist/src/services/matching.js +5 -2
  990. package/dist/src/services/matching.js.map +1 -1
  991. package/dist/src/services/memory-replication.d.ts.map +1 -1
  992. package/dist/src/services/memory-replication.js +3 -1
  993. package/dist/src/services/memory-replication.js.map +1 -1
  994. package/dist/src/services/message-broadcast.d.ts.map +1 -1
  995. package/dist/src/services/message-broadcast.js +2 -1
  996. package/dist/src/services/message-broadcast.js.map +1 -1
  997. package/dist/src/services/message-delivery.d.ts.map +1 -1
  998. package/dist/src/services/message-delivery.js +9 -4
  999. package/dist/src/services/message-delivery.js.map +1 -1
  1000. package/dist/src/services/metered-access.d.ts +148 -0
  1001. package/dist/src/services/metered-access.d.ts.map +1 -0
  1002. package/dist/src/services/metered-access.js +128 -0
  1003. package/dist/src/services/metered-access.js.map +1 -0
  1004. package/dist/src/services/metered-entitlements.d.ts +147 -5
  1005. package/dist/src/services/metered-entitlements.d.ts.map +1 -1
  1006. package/dist/src/services/metered-entitlements.js +251 -30
  1007. package/dist/src/services/metered-entitlements.js.map +1 -1
  1008. package/dist/src/services/metered-settlement.d.ts +45 -0
  1009. package/dist/src/services/metered-settlement.d.ts.map +1 -0
  1010. package/dist/src/services/metered-settlement.js +117 -0
  1011. package/dist/src/services/metered-settlement.js.map +1 -0
  1012. package/dist/src/services/network-policy.d.ts.map +1 -1
  1013. package/dist/src/services/network-policy.js +6 -2
  1014. package/dist/src/services/network-policy.js.map +1 -1
  1015. package/dist/src/services/notebook-classify.d.ts.map +1 -1
  1016. package/dist/src/services/notebook-classify.js +7 -2
  1017. package/dist/src/services/notebook-classify.js.map +1 -1
  1018. package/dist/src/services/notebook-plan.d.ts.map +1 -1
  1019. package/dist/src/services/notebook-plan.js +4 -1
  1020. package/dist/src/services/notebook-plan.js.map +1 -1
  1021. package/dist/src/services/notify.d.ts.map +1 -1
  1022. package/dist/src/services/notify.js +6 -3
  1023. package/dist/src/services/notify.js.map +1 -1
  1024. package/dist/src/services/openrouter.d.ts.map +1 -1
  1025. package/dist/src/services/openrouter.js +1 -0
  1026. package/dist/src/services/openrouter.js.map +1 -1
  1027. package/dist/src/services/organism-export.d.ts.map +1 -1
  1028. package/dist/src/services/organism-export.js +4 -1
  1029. package/dist/src/services/organism-export.js.map +1 -1
  1030. package/dist/src/services/organism-import.d.ts.map +1 -1
  1031. package/dist/src/services/organism-import.js +5 -1
  1032. package/dist/src/services/organism-import.js.map +1 -1
  1033. package/dist/src/services/owner-memory.d.ts +14 -1
  1034. package/dist/src/services/owner-memory.d.ts.map +1 -1
  1035. package/dist/src/services/owner-memory.js +8 -14
  1036. package/dist/src/services/owner-memory.js.map +1 -1
  1037. package/dist/src/services/perf-trace.js +3 -1
  1038. package/dist/src/services/perf-trace.js.map +1 -1
  1039. package/dist/src/services/personal-tunnel.js +14 -8
  1040. package/dist/src/services/personal-tunnel.js.map +1 -1
  1041. package/dist/src/services/presence.d.ts.map +1 -1
  1042. package/dist/src/services/presence.js +11 -5
  1043. package/dist/src/services/presence.js.map +1 -1
  1044. package/dist/src/services/protected-resource.d.ts +60 -0
  1045. package/dist/src/services/protected-resource.d.ts.map +1 -0
  1046. package/dist/src/services/protected-resource.js +137 -0
  1047. package/dist/src/services/protected-resource.js.map +1 -0
  1048. package/dist/src/services/realtime-manager.d.ts.map +1 -1
  1049. package/dist/src/services/realtime-manager.js +8 -5
  1050. package/dist/src/services/realtime-manager.js.map +1 -1
  1051. package/dist/src/services/safe-zip.d.ts.map +1 -1
  1052. package/dist/src/services/safe-zip.js +4 -1
  1053. package/dist/src/services/safe-zip.js.map +1 -1
  1054. package/dist/src/services/scheduler-extension-job.js +2 -2
  1055. package/dist/src/services/scheduler-extension-job.js.map +1 -1
  1056. package/dist/src/services/scheduler.js +13 -7
  1057. package/dist/src/services/scheduler.js.map +1 -1
  1058. package/dist/src/services/security-incident.d.ts.map +1 -1
  1059. package/dist/src/services/security-incident.js +7 -2
  1060. package/dist/src/services/security-incident.js.map +1 -1
  1061. package/dist/src/services/site-sync.d.ts.map +1 -1
  1062. package/dist/src/services/site-sync.js +1 -0
  1063. package/dist/src/services/site-sync.js.map +1 -1
  1064. package/dist/src/services/site.d.ts +1 -1
  1065. package/dist/src/services/site.d.ts.map +1 -1
  1066. package/dist/src/services/site.js +29 -8
  1067. package/dist/src/services/site.js.map +1 -1
  1068. package/dist/src/services/structure-overview.d.ts.map +1 -1
  1069. package/dist/src/services/structure-overview.js +4 -1
  1070. package/dist/src/services/structure-overview.js.map +1 -1
  1071. package/dist/src/services/structure-snapshot.d.ts.map +1 -1
  1072. package/dist/src/services/structure-snapshot.js +3 -2
  1073. package/dist/src/services/structure-snapshot.js.map +1 -1
  1074. package/dist/src/services/sync-scheduler.js +3 -2
  1075. package/dist/src/services/sync-scheduler.js.map +1 -1
  1076. package/dist/src/services/task-files.d.ts +51 -0
  1077. package/dist/src/services/task-files.d.ts.map +1 -0
  1078. package/dist/src/services/task-files.js +58 -0
  1079. package/dist/src/services/task-files.js.map +1 -0
  1080. package/dist/src/services/tracked-response.js +1 -1
  1081. package/dist/src/services/tracked-response.js.map +1 -1
  1082. package/dist/src/services/trust-broadcast.d.ts.map +1 -1
  1083. package/dist/src/services/trust-broadcast.js +1 -0
  1084. package/dist/src/services/trust-broadcast.js.map +1 -1
  1085. package/dist/src/services/upload-token.d.ts +29 -0
  1086. package/dist/src/services/upload-token.d.ts.map +1 -1
  1087. package/dist/src/services/upload-token.js +37 -0
  1088. package/dist/src/services/upload-token.js.map +1 -1
  1089. package/dist/src/services/upload-zip.d.ts +9 -0
  1090. package/dist/src/services/upload-zip.d.ts.map +1 -1
  1091. package/dist/src/services/upload-zip.js +19 -81
  1092. package/dist/src/services/upload-zip.js.map +1 -1
  1093. package/dist/src/services/web-bot-auth.d.ts.map +1 -1
  1094. package/dist/src/services/web-bot-auth.js +1 -0
  1095. package/dist/src/services/web-bot-auth.js.map +1 -1
  1096. package/dist/src/services/workflow/engine-steps.d.ts.map +1 -1
  1097. package/dist/src/services/workflow/engine-steps.js +12 -6
  1098. package/dist/src/services/workflow/engine-steps.js.map +1 -1
  1099. package/dist/src/services/workspace-export.d.ts.map +1 -1
  1100. package/dist/src/services/workspace-export.js +5 -2
  1101. package/dist/src/services/workspace-export.js.map +1 -1
  1102. package/dist/src/services/workspace-import.d.ts.map +1 -1
  1103. package/dist/src/services/workspace-import.js +2 -1
  1104. package/dist/src/services/workspace-import.js.map +1 -1
  1105. package/dist/src/services/workspace-meta.d.ts +15 -0
  1106. package/dist/src/services/workspace-meta.d.ts.map +1 -1
  1107. package/dist/src/services/workspace-meta.js +17 -0
  1108. package/dist/src/services/workspace-meta.js.map +1 -1
  1109. package/dist/src/services/workspace-provision.d.ts +3 -0
  1110. package/dist/src/services/workspace-provision.d.ts.map +1 -1
  1111. package/dist/src/services/workspace-provision.js +5 -3
  1112. package/dist/src/services/workspace-provision.js.map +1 -1
  1113. package/dist/src/services/workspace-versions.d.ts.map +1 -1
  1114. package/dist/src/services/workspace-versions.js +0 -0
  1115. package/dist/src/services/workspace-versions.js.map +1 -1
  1116. package/dist/src/storage/providers/postgres-kysely/db-types.d.ts +5 -0
  1117. package/dist/src/storage/providers/postgres-kysely/db-types.d.ts.map +1 -1
  1118. package/dist/src/storage/providers/postgres-kysely/helpers.d.ts +11 -0
  1119. package/dist/src/storage/providers/postgres-kysely/helpers.d.ts.map +1 -1
  1120. package/dist/src/storage/providers/postgres-kysely/helpers.js +14 -0
  1121. package/dist/src/storage/providers/postgres-kysely/helpers.js.map +1 -1
  1122. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.d.ts +2 -1
  1123. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.d.ts.map +1 -1
  1124. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.js +16 -0
  1125. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.js.map +1 -1
  1126. package/dist/src/storage/providers/postgres-kysely/methods/capabilities.js +3 -3
  1127. package/dist/src/storage/providers/postgres-kysely/methods/capabilities.js.map +1 -1
  1128. package/dist/src/storage/providers/postgres-kysely/methods/ecosystem.js +3 -3
  1129. package/dist/src/storage/providers/postgres-kysely/methods/ecosystem.js.map +1 -1
  1130. package/dist/src/storage/providers/postgres-kysely/methods/federation.d.ts.map +1 -1
  1131. package/dist/src/storage/providers/postgres-kysely/methods/federation.js +12 -10
  1132. package/dist/src/storage/providers/postgres-kysely/methods/federation.js.map +1 -1
  1133. package/dist/src/storage/providers/postgres-kysely/methods/identity.d.ts.map +1 -1
  1134. package/dist/src/storage/providers/postgres-kysely/methods/identity.js +26 -12
  1135. package/dist/src/storage/providers/postgres-kysely/methods/identity.js.map +1 -1
  1136. package/dist/src/storage/providers/postgres-kysely/methods/marketplace.js +5 -5
  1137. package/dist/src/storage/providers/postgres-kysely/methods/marketplace.js.map +1 -1
  1138. package/dist/src/storage/providers/postgres-kysely/methods/memory.d.ts +2 -0
  1139. package/dist/src/storage/providers/postgres-kysely/methods/memory.d.ts.map +1 -1
  1140. package/dist/src/storage/providers/postgres-kysely/methods/memory.js +12 -1
  1141. package/dist/src/storage/providers/postgres-kysely/methods/memory.js.map +1 -1
  1142. package/dist/src/storage/providers/postgres-kysely/methods/node-ext-escrow.d.ts +9 -0
  1143. package/dist/src/storage/providers/postgres-kysely/methods/node-ext-escrow.d.ts.map +1 -1
  1144. package/dist/src/storage/providers/postgres-kysely/methods/node-ext-escrow.js +31 -27
  1145. package/dist/src/storage/providers/postgres-kysely/methods/node-ext-escrow.js.map +1 -1
  1146. package/dist/src/storage/providers/postgres-kysely/methods/organisms.d.ts.map +1 -1
  1147. package/dist/src/storage/providers/postgres-kysely/methods/organisms.js +15 -15
  1148. package/dist/src/storage/providers/postgres-kysely/methods/organisms.js.map +1 -1
  1149. package/dist/src/storage/providers/postgres-kysely/methods/otk.js +3 -3
  1150. package/dist/src/storage/providers/postgres-kysely/methods/otk.js.map +1 -1
  1151. package/dist/src/storage/providers/postgres-kysely/methods/packages.d.ts.map +1 -1
  1152. package/dist/src/storage/providers/postgres-kysely/methods/packages.js +4 -14
  1153. package/dist/src/storage/providers/postgres-kysely/methods/packages.js.map +1 -1
  1154. package/dist/src/storage/providers/postgres-kysely/methods/template-listings.d.ts.map +1 -1
  1155. package/dist/src/storage/providers/postgres-kysely/methods/template-listings.js +11 -10
  1156. package/dist/src/storage/providers/postgres-kysely/methods/template-listings.js.map +1 -1
  1157. package/dist/src/storage/providers/postgres-kysely/methods/wallet.d.ts.map +1 -1
  1158. package/dist/src/storage/providers/postgres-kysely/methods/wallet.js +3 -1
  1159. package/dist/src/storage/providers/postgres-kysely/methods/wallet.js.map +1 -1
  1160. package/dist/src/storage/providers/postgres-kysely/migrate.d.ts.map +1 -1
  1161. package/dist/src/storage/providers/postgres-kysely/migrate.js +3 -0
  1162. package/dist/src/storage/providers/postgres-kysely/migrate.js.map +1 -1
  1163. package/dist/src/storage/providers/postgres-kysely/migrations/0012_unique_live_app_grant.sql +29 -0
  1164. package/dist/src/storage/providers/postgres-kysely/migrations/0013_ghii_password_lockout.sql +12 -0
  1165. package/dist/src/storage/providers/postgres-kysely/migrations/0014_transaction_initiator.sql +6 -0
  1166. package/dist/src/storage/providers/postgres-kysely/migrations/0015_app_grant_spend_cap.sql +5 -0
  1167. package/dist/src/storage/providers/sqlite/methods/apps.d.ts +4 -1
  1168. package/dist/src/storage/providers/sqlite/methods/apps.d.ts.map +1 -1
  1169. package/dist/src/storage/providers/sqlite/methods/apps.js +19 -2
  1170. package/dist/src/storage/providers/sqlite/methods/apps.js.map +1 -1
  1171. package/dist/src/storage/providers/sqlite/methods/community.d.ts.map +1 -1
  1172. package/dist/src/storage/providers/sqlite/methods/community.js +6 -1
  1173. package/dist/src/storage/providers/sqlite/methods/community.js.map +1 -1
  1174. package/dist/src/storage/providers/sqlite/methods/governance.d.ts +1 -0
  1175. package/dist/src/storage/providers/sqlite/methods/governance.d.ts.map +1 -1
  1176. package/dist/src/storage/providers/sqlite/methods/governance.js +4 -1
  1177. package/dist/src/storage/providers/sqlite/methods/governance.js.map +1 -1
  1178. package/dist/src/storage/providers/sqlite/methods/identity-nodes.d.ts.map +1 -1
  1179. package/dist/src/storage/providers/sqlite/methods/identity-nodes.js +9 -2
  1180. package/dist/src/storage/providers/sqlite/methods/identity-nodes.js.map +1 -1
  1181. package/dist/src/storage/providers/sqlite/methods/owner.d.ts +5 -0
  1182. package/dist/src/storage/providers/sqlite/methods/owner.d.ts.map +1 -1
  1183. package/dist/src/storage/providers/sqlite/methods/owner.js +8 -0
  1184. package/dist/src/storage/providers/sqlite/methods/owner.js.map +1 -1
  1185. package/dist/src/storage/providers/sqlite/methods/work.d.ts.map +1 -1
  1186. package/dist/src/storage/providers/sqlite/methods/work.js +4 -2
  1187. package/dist/src/storage/providers/sqlite/methods/work.js.map +1 -1
  1188. package/dist/src/storage/providers/sqlite/repos/community.d.ts.map +1 -1
  1189. package/dist/src/storage/providers/sqlite/repos/community.js +6 -1
  1190. package/dist/src/storage/providers/sqlite/repos/community.js.map +1 -1
  1191. package/dist/src/storage/providers/sqlite/repos/identity.d.ts +3 -0
  1192. package/dist/src/storage/providers/sqlite/repos/identity.d.ts.map +1 -1
  1193. package/dist/src/storage/providers/sqlite/repos/identity.js +13 -4
  1194. package/dist/src/storage/providers/sqlite/repos/identity.js.map +1 -1
  1195. package/dist/src/storage/providers/sqlite/repos/work.d.ts.map +1 -1
  1196. package/dist/src/storage/providers/sqlite/repos/work.js +4 -2
  1197. package/dist/src/storage/providers/sqlite/repos/work.js.map +1 -1
  1198. package/dist/src/storage/providers/sqlite/schema-tables-1.d.ts.map +1 -1
  1199. package/dist/src/storage/providers/sqlite/schema-tables-1.js +1 -0
  1200. package/dist/src/storage/providers/sqlite/schema-tables-1.js.map +1 -1
  1201. package/dist/src/storage/providers/sqlite/schema-tables-2.d.ts.map +1 -1
  1202. package/dist/src/storage/providers/sqlite/schema-tables-2.js +2 -0
  1203. package/dist/src/storage/providers/sqlite/schema-tables-2.js.map +1 -1
  1204. package/dist/src/storage/providers/sqlite/schema.d.ts +3 -0
  1205. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  1206. package/dist/src/storage/providers/sqlite/schema.js +34 -1
  1207. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  1208. package/dist/src/storage/repositories/app-grant.repository.d.ts +10 -2
  1209. package/dist/src/storage/repositories/app-grant.repository.d.ts.map +1 -1
  1210. package/dist/src/storage/repositories/memory.repository.d.ts +14 -0
  1211. package/dist/src/storage/repositories/memory.repository.d.ts.map +1 -1
  1212. package/dist/src/storage/repositories-impl/memory-repository.d.ts +8 -1
  1213. package/dist/src/storage/repositories-impl/memory-repository.d.ts.map +1 -1
  1214. package/dist/src/storage/repositories-impl/memory-repository.js +15 -4
  1215. package/dist/src/storage/repositories-impl/memory-repository.js.map +1 -1
  1216. package/dist/src/storage/types/agents-messaging.d.ts +19 -0
  1217. package/dist/src/storage/types/agents-messaging.d.ts.map +1 -1
  1218. package/dist/src/storage/types/agents-messaging.js.map +1 -1
  1219. package/dist/src/storage/types/auth.d.ts +9 -0
  1220. package/dist/src/storage/types/auth.d.ts.map +1 -1
  1221. package/dist/src/storage/types/commerce.d.ts +13 -0
  1222. package/dist/src/storage/types/commerce.d.ts.map +1 -1
  1223. package/dist/src/storage/types/organisms-federation.d.ts +29 -0
  1224. package/dist/src/storage/types/organisms-federation.d.ts.map +1 -1
  1225. package/dist/src/utils/app-agent-discovery.d.ts +31 -0
  1226. package/dist/src/utils/app-agent-discovery.d.ts.map +1 -0
  1227. package/dist/src/utils/app-agent-discovery.js +96 -0
  1228. package/dist/src/utils/app-agent-discovery.js.map +1 -0
  1229. package/dist/src/utils/app-badge.d.ts.map +1 -1
  1230. package/dist/src/utils/app-badge.js +7 -3
  1231. package/dist/src/utils/app-badge.js.map +1 -1
  1232. package/dist/src/utils/app-protect.d.ts.map +1 -1
  1233. package/dist/src/utils/app-protect.js +1 -0
  1234. package/dist/src/utils/app-protect.js.map +1 -1
  1235. package/dist/src/utils/env-validator.d.ts.map +1 -1
  1236. package/dist/src/utils/env-validator.js +5 -1
  1237. package/dist/src/utils/env-validator.js.map +1 -1
  1238. package/dist/src/utils/gaii.d.ts +50 -0
  1239. package/dist/src/utils/gaii.d.ts.map +1 -1
  1240. package/dist/src/utils/gaii.js +66 -0
  1241. package/dist/src/utils/gaii.js.map +1 -1
  1242. package/dist/src/utils/url-validator.d.ts.map +1 -1
  1243. package/dist/src/utils/url-validator.js +4 -1
  1244. package/dist/src/utils/url-validator.js.map +1 -1
  1245. package/dist/src/utils/version.d.ts.map +1 -1
  1246. package/dist/src/utils/version.js +1 -0
  1247. package/dist/src/utils/version.js.map +1 -1
  1248. package/dist/static/app-catalog/_template.html +6 -5
  1249. package/dist/static/app-catalog/js/cortex.js +3 -1
  1250. package/dist/static/app-catalog/js/detail.js +411 -36
  1251. package/dist/static/app-catalog/js/i18n-data.js +279 -3
  1252. package/dist/static/app-catalog/js/main.js +28 -37
  1253. package/dist/static/app-catalog/js/monetize.js +204 -16
  1254. package/dist/static/app-catalog/js/odps.js +489 -0
  1255. package/dist/static/app-catalog/js/render.js +3 -0
  1256. package/dist/static/app-catalog/js/workcopy.js +198 -0
  1257. package/dist/static/app-catalog/styles/app-catalog.css +60 -0
  1258. package/dist/static/app-catalog.html +1450 -137
  1259. package/dist/static/sdk-libs/agents/index.js +45 -7
  1260. package/dist/static/sdk-libs/auth/cluster.js +97 -0
  1261. package/dist/static/sdk-libs/auth/index.js +25 -1
  1262. package/dist/static/sdk-libs/auth/locale.js +151 -0
  1263. package/dist/static/sdk-libs/auth/modal.js +11 -2
  1264. package/dist/static/sdk-libs/auth/palette.js +172 -0
  1265. package/dist/static/sdk-libs/auth/pill.js +37 -6
  1266. package/dist/static/sdk-libs/auth/session.js +7 -3
  1267. package/dist/static/sdk-libs/auth/theme.js +61 -20
  1268. package/dist/static/sdk-libs/data/index.js +70 -8
  1269. package/dist/static/sdk-libs/dist/aimeat-agents.js +41 -8
  1270. package/dist/static/sdk-libs/dist/aimeat-auth.js +423 -22
  1271. package/dist/static/sdk-libs/dist/aimeat-data.js +50 -8
  1272. package/dist/static/sdk-libs/dist/aimeat-exchange.js +675 -0
  1273. package/dist/static/sdk-libs/dist/aimeat-game.js +1555 -0
  1274. package/dist/static/sdk-libs/dist/aimeat-live.js +54 -2
  1275. package/dist/static/sdk-libs/dist/aimeat-markdown.js +32 -1
  1276. package/dist/static/sdk-libs/dist/aimeat-webmcp.js +46 -0
  1277. package/dist/static/sdk-libs/exchange/browse.js +81 -0
  1278. package/dist/static/sdk-libs/exchange/client.js +131 -0
  1279. package/dist/static/sdk-libs/exchange/contracts.js +228 -0
  1280. package/dist/static/sdk-libs/exchange/demand.js +106 -0
  1281. package/dist/static/sdk-libs/exchange/earnings.js +39 -0
  1282. package/dist/static/sdk-libs/exchange/format.js +51 -0
  1283. package/dist/static/sdk-libs/exchange/index.js +70 -0
  1284. package/dist/static/sdk-libs/exchange/odps-completeness.js +177 -0
  1285. package/dist/static/sdk-libs/exchange/sell.js +253 -0
  1286. package/dist/static/sdk-libs/game/board.js +331 -0
  1287. package/dist/static/sdk-libs/game/dom.js +223 -0
  1288. package/dist/static/sdk-libs/game/i18n.js +201 -0
  1289. package/dist/static/sdk-libs/game/index.js +72 -0
  1290. package/dist/static/sdk-libs/game/markers.js +150 -0
  1291. package/dist/static/sdk-libs/game/menu.js +260 -0
  1292. package/dist/static/sdk-libs/game/overlay.js +193 -0
  1293. package/dist/static/sdk-libs/game/progress.js +280 -0
  1294. package/dist/static/sdk-libs/game/score.js +134 -0
  1295. package/dist/static/sdk-libs/game/screen.js +120 -0
  1296. package/dist/static/sdk-libs/game/units.js +55 -0
  1297. package/dist/static/sdk-libs/live/index.js +71 -4
  1298. package/dist/static/sdk-libs/markdown/index.js +49 -1
  1299. package/dist/static/sdk-libs/webmcp/index.js +63 -0
  1300. package/package.json +7 -2
@@ -1,1432 +1,1516 @@
1
- /* ═══════════════════════════════════════════════════════
2
- @file theme.css
3
- @description AIMEAT Unified Theme — single source of truth for all portal
4
- CSS variables (tokens), base styles, animations, and shared components.
5
- Defines the light theme in :root, a dark override in [data-theme="dark"],
6
- and a drift-alias layer so undefined-but-referenced vars resolve.
7
- @structure :root tokens, drift aliases, [data-theme="dark"] override,
8
- base/reset, animations, topnav, buttons, cards, badges, inputs, modal,
9
- toast, alert.
10
- @usage Loaded first in spa.html <head>; the theme is toggled by /js/theme.js
11
- which flips the data-theme attribute on <html>.
12
- @version-history
13
- v1.24.0 — 2026-07-21 — App-shell scroll model: html/body no longer scroll (height:100%;
14
- overflow:hidden); #app is a full-viewport (100dvh) flex column with the topnav as a fixed-height
15
- row and .page-content as the sole overflow-y:auto scroll region. Removes the ~nav-height phantom
16
- overscroll and stops view content sliding under the (formerly sticky, now in-frame) header. Coupled
17
- offset fixes: .pf-sidebar/.adm-sidebar stick to top:0 of the region and cap at 100dvh−nav-height.
18
- v1.23.1 — 2026-07-20Mobile: pin .notif-dropdown to fixed viewport insets under 560px (the
19
- 320px, right:0-anchored panel ran off the LEFT edge — the bell sits mid-right of the bar — and
20
- got clipped by body{overflow-x:hidden}); long notif titles/bodies wrap (overflow-wrap:anywhere).
21
- v1.23.0 — 2026-07-18Notification bell inline actions: split .notif-item into a clickable
22
- .notif-item-main + an actions row; add .notif-actions/.notif-action-btn/.notif-reply*/.notif-result.
23
- v1.22.0 2026-07-17 UI-unification foundation: extend the spacing scale (--sp-5=20/--sp-6=24/
24
- --sp-8=32/--sp-12=48) and add a font-size scale (--text-xs..--text-xl) so views stop hardcoding
25
- padding:24px / font-size:0.85rem inline; add .muted/.text-dim/.text-faint/.meta text utilities
26
- (there was no muted/meta utility class, so ~8 views invented .xx-muted and ~30 invented .xx-*-meta).
27
- Additive only no existing rule changed, so appearance is preserved until views adopt them.
28
- v1.21.0 — 2026-07-06 Toast variants + mobile width: add --toast-info-bg/--toast-warn-bg tokens +
29
- .toast-info/.toast-warn classes (call sites pass 'info'/'warning' kinds; they previously fell into the
30
- truthy-isError red path). .toast width fit-content max-content: anchored at left:50%, fit-content
31
- shrink-to-fit capped the pill at 50vw (a skinny tower on phones); max-width min(92vw, 40rem) now rules.
32
- v1.20.0 2026-07-03 Toast legibility: .toast max-width 420px min(92vw, 40rem) (was hard-capped
33
- narrow on wide screens so longer messages wrapped into a tall skinny "tower"), plus line-height 1.45,
34
- centered text, overflow-wrap:anywhere (guards long GAIIs/URLs) and a --shadow-xl lift. One class fixes
35
- every toast pathway. Appearance of short toasts unchanged (still a compact pill via width:fit-content).
36
- v1.19.0 2026-06-10 Controls get their own surface: new --control-bg/--control-border tokens
37
- (light: white + gray-300; dark: raised #262934 + #4A4E5A). .btn-outline/.btn-ghost drop
38
- background:transparent (they melted into the page as "framed text") and .input-field drops
39
- background:var(--bg) (fields were LITERALLY the page color) all three now use the control
40
- tokens, buttons additionally get --shadow-sm so they read as pressable.
41
- v1.18.0 — 2026-06-02 — Component unification (#10 third toast pathway): tokenize the shared .toast color literals. Added a theme-invariant --toast-success-bg (green-500 #22C55E @ .95, the legacy toast green — deliberately NOT --success emerald, which would shift the hue), --toast-danger-bg (= --danger #EF4444 @ .95) and --toast-fg (white), same rationale as the badge palette. The base .toast and the .toast.error/.toast-error/.toast-success modifiers now reference these tokens instead of raw rgba()/#fff. Appearance-preserving: identical resolved values; solid saturated pills intentionally do not flip in dark mode. profile.js keeps its own showToast pathway (distinct .pf.toast-container wrapper + .toast.error markup) — left as a convergence candidate, NOT migrated, to avoid changing DOM/behavior.
42
- v1.17.0 — 2026-06-02Component unification (#26 recipient badge): add a theme-invariant --badge-*-bg palette (wildcard→danger, ghii→purple, organism→success, gaii→blue; domain #F97316 / node #6B7280 kept as own invariant swatches as they have no palette match) + --badge-fg white, so the profile .badge-* recipient classifier can drop its hardcoded hex (#8b5cf6/#f97316/#6b7280/#3b82f6) and dead light-only fallbacks (var(--success,#22c55e)/var(--danger,#ef4444)). Appearance-preserving: values resolve identically and these solid swatches intentionally do not flip in dark mode.
43
- v1.16.0 — 2026-06-02 — Component unification (#25 pill base): add a canonical token-only .pill shape primitive (inline-flex chip, --radius-full, compact padding, small bold text, pointer + opacity hover) — shape only, no colors; tints come from caller classes. Mirrors the shape the profile .vis-pill already used. The scoped .pf .vis-pill keeps its own shape declaration (the (0,2,0)-beats-bare-.pill specificity trap) but its radius was retokenized to the same --radius-full so the two stay in lockstep.
44
- v1.15.0 — 2026-06-02 — Component unification (#23 collapsible): add canonical .collapsible / .collapsible-header / .collapsible-chevron (chevron rotates 180° via .open) / .collapsible-body block, backing /components/Collapsible.js. All colors are theme tokens so it flips in dark mode. Establishes the canonical expand/collapse section for the hand-rolled toggles (.expand-btn + .pf-chevron, .scope-advanced-toggle, .pkv-entry-arrow); those bespoke toggles are left in place where their expanded markup is wired into view state.
45
- v1.14.0 — 2026-06-02 — Component unification (#24 search bar): add canonical .search-bar (flex row, gap, flex:1) + .search-bar-input (flex:1) shell, backing /components/SearchBar.js. The input reuses .input-field for all visuals, so the shell only owns layout. Consolidates the hand-rolled search inputs (.pkv-search / .cap-search-input / .pf-agd-search-input) and the profile .search-bar + .input-field combo; the profile-scoped .pf .search-bar (max-width) coexists.
46
- v1.13.0 — 2026-06-02 — Component unification (#21 key/value rows): add canonical .kv-row / .kv-label / .kv-value (flex space-between, muted label, emphasized value, --border-subtle divider, last-child no border; .kv-value.mono for monospace ids/amounts), backing /components/KeyValueRow.js. Extracted as the common look of the admin .adm-erow/.adm-hrow and profile .pf-agd-info-row families. Existing per-view classes left in place where their look differs.
47
- v1.12.0 — 2026-06-02 — Component unification (#13 tables): add canonical .data-table block (full-width collapsed table, uppercase muted header divided by --border, cells by --border-subtle, --bg-surface hover, .mono cell) + generic .scrollable wrapper, backing /components/DataTable.js. Extracted as the common look of .adm table + .pf .consent-table so both converge on tokens that flip in dark mode.
48
- v1.11.0 — 2026-06-02 — Component unification (#16 tags): add --accent-border token (translucent accent hairline, light rgba(232,86,74,0.2) / dark rgba(255,111,98,0.30)) so tag/badge clones (mk-tag, hb-tag) can replace their hardcoded rgba(232,86,74,0.2) borders and flip in dark mode.
49
- v1.10.0 — 2026-06-02 — Component unification (#17 pagination): add canonical .pagination (prev / "Page X / Y" / next, token-based) + .pagination-info + .load-more (centered load-more wrapper), backing /components/Pagination.js. Consolidates the .adm-mem-pagination shape and the centered load-more wrapper. The numbered .hb-pagination variant is intentionally left in place (different UI).
50
- v1.9.0 — 2026-06-02 — Component unification (#18 category cards): add canonical .category-card / -icon / -name / -count (token-based, anchor- and div-safe) so the marketplace .mk-category-* and hobbies .hb-category-* clones converge. Tokenized the formerly hardcoded hover colors (#E8564A var(--accent); 0 2px 8px rgba(0,0,0,0.06) var(--shadow-md)) dark-mode fix. Per-view *-categories-grid wrappers kept (column density differs).
51
- v1.8.0 — 2026-06-02 — Component unification (#11 status dots): add canonical .status-dot base + semantic token modifiers (online/active/healthy/live success; warn/degraded/syncing/pending warn; error/offline/dead/down danger; idle/inactive/detached/muted → text-muted), backing /components/StatusDot.js, so per-view dots (.peer-dot/.pn-status-dot/.ext-status-dot/.dv-dot/.live-dot) converge. Tokenized away hardcoded hex in the former .ext-status-dot (#4ade80/#9ca3af) so dots flip in dark mode.
52
- v1.7.0 — 2026-06-02 — Component unification (#15 headers): add canonical .section-title/.section-desc (in-page accent header, lifted generic from .pf) + .page-title/.page-subtitle (top-of-view gradient header), all token-based, so per-view title/subtitle clones (mk-/hb-/cl-welcome-/adm-page-title) can converge.
53
- v1.6.0 — 2026-06-02 — Component unification (#22): add .card-glass modifier (Card variant="glass") reproducing the former profile .pf-glass-card appearance, fully tokenized (--surface / --border), so profile's GlassCard folds into the canonical Card.
54
- v1.5.0 — 2026-06-02 — Component unification (#6 stat cards): add canonical .stat-card-value tone (.accent/.success/.danger) + .mono modifiers and a .stat-grid wrapper, so per-view stat clones (mk-stat/hb-stat/dv-stat/wl-stat/...) converge onto .stat-card without losing accent-tint / earned-spent / monospace semantics.
55
- v1.4.0 — 2026-06-02 — Component unification (#5 inputs): add canonical textarea.input-field (resize/min-height) + select.input-field (cursor) so .input-field works on all field types and views can drop per-view form-input/textarea/select clones (mk-form/hb-form/...).
56
- v1.3.0 — 2026-06-02 — Component unification (#4): make canonical .btn-* anchor-safe (text-decoration:none) so views can drop their per-view <a>-button clones (mk-btn/hb-btn/...) and use the canonical classes.
57
- v1.2.0 — 2026-06-02 — Tokenize shell component literals (semantic tints, scrollbar, overlay scrim, morsel pill, lang-btn active, input focus) so the whole shell flips for dark mode.
58
- v1.1.0 — 2026-06-02 — Add dark theme override + drift-alias layer + .theme-toggle-btn.
59
- v1.0.0 — priorLight theme tokens, base styles, shared components.
60
- ═══════════════════════════════════════════════════════ */
61
-
62
- /* ── Reset ── */
63
- *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
64
-
65
- /* ── Root Variables ── */
66
- :root {
67
- /* Background */
68
- --bg: #FAFAF8;
69
- --bg-surface: #F3F4F6;
70
- --bg-card: #FFFFFF;
71
- --bg-elevated: #FFFFFF;
72
-
73
- /* Cards & Surfaces */
74
- --card-bg: #FFFFFF;
75
- --card-bg-hover: #FFFFFF;
76
- --card-bg-solid: #FFFFFF;
77
- --card-bg-alt: #F3F4F6;
78
- --card-border: #E5E7EB;
79
-
80
- /* Accent (coral heart) */
81
- --accent: #E8564A;
82
- --accent-bright: #FF6B6B;
83
- --accent-deep: #E8564A;
84
- --accent-glow: rgba(232, 86, 74, 0.3);
85
- --accent-subtle: rgba(232, 86, 74, 0.06);
86
- --accent-border: rgba(232, 86, 74, 0.2); /* translucent accent hairline for tag/badge edges */
87
-
88
- /* Love palette (profile gradients — now coral-based) */
89
- --love1: #E8564A;
90
- --love2: #FF6B6B;
91
- --love3: #FF8A80;
92
- --love4: #FF6B6B;
93
- --love5: #E8564A;
94
-
95
- /* Text */
96
- --text: #1A1A2E;
97
- --text-bright: #1A1A2E;
98
- --text-dim: #6B7280;
99
- --text-muted: #9CA3AF;
100
-
101
- /* Semantic colors */
102
- --success: #10B981;
103
- --warn: #F59E0B;
104
- --danger: #EF4444;
105
- --purple: #8B5CF6;
106
-
107
- /* Accent palette */
108
- --blue: #3B82F6;
109
- --mint: #34D399;
110
- --teal: #06B6D4;
111
- --pink: #F472B6;
112
- --orange: #FB923C;
113
- --yellow: #FBBF24;
114
-
115
- /* Recipient badge palette (profile permission-recipient classifier:
116
- wildcard/ghii/organism/domain/node/gaii). Theme-INVARIANT on purpose —
117
- these are saturated solid swatches carrying white text in both themes, so
118
- they are defined only here and NOT re-overridden in [data-theme="dark"].
119
- Four map onto existing palette tokens (identical values); domain/node have
120
- no palette match and are kept as their own invariant swatches rather than
121
- borrowed from --orange/--text-dim (which differ / flip in dark). */
122
- --badge-wildcard-bg: var(--danger); /* #EF4444 */
123
- --badge-ghii-bg: var(--purple); /* #8B5CF6 */
124
- --badge-organism-bg: var(--success); /* #10B981 */
125
- --badge-domain-bg: #F97316; /* no palette match ( --orange #FB923C) */
126
- --badge-node-bg: #6B7280; /* invariant gray (≠ --text-dim, which flips dark) */
127
- --badge-gaii-bg: var(--blue); /* #3B82F6 */
128
- --badge-fg: #FFFFFF; /* white text on every saturated swatch */
129
-
130
- /* Toast palette (floating notification pill). Theme-INVARIANT on purpose,
131
- same rationale as the badge palette above: saturated solid fills carrying
132
- white text read correctly on any background in both themes, so they are
133
- defined only here and NOT re-overridden in [data-theme="dark"].
134
- NOTE: --toast-success-bg is green-500 (#22C55E), the legacy toast green —
135
- it is deliberately NOT --success (emerald #10B981); swapping would shift
136
- the hue. --toast-danger-bg equals --danger at the legacy 0.95 alpha. */
137
- --toast-success-bg: rgba(34, 197, 94, 0.95);
138
- --toast-danger-bg: rgba(239, 68, 68, 0.95); /* = --danger #EF4444 @ .95 */
139
- --toast-info-bg: rgba(59, 130, 246, 0.95); /* = --blue #3B82F6 @ .95 */
140
- --toast-warn-bg: rgba(245, 158, 11, 0.95); /* amber-500; pairs with dark fg */
141
- --toast-fg: #FFFFFF;
142
- --toast-warn-fg: #1A1A2E; /* white fails contrast on amber */
143
-
144
- /* Borders */
145
- --border: #E5E7EB;
146
- --border-subtle: #F3F4F6;
147
- --border-focus: #E8564A;
148
-
149
- /* Radii */
150
- --radius: 16px;
151
- --radius-sm: 10px;
152
- --radius-xs: 6px;
153
- --radius-xl: 20px;
154
- --radius-full: 9999px;
155
-
156
- /* Typography */
157
- --font: 'DM Sans', system-ui, -apple-system, 'Segoe UI', sans-serif;
158
- --font-mono: 'JetBrains Mono', 'SF Mono', monospace;
159
-
160
- /* Layout */
161
- --nav-height: 56px;
162
-
163
- /* Shadows */
164
- --shadow-sm: 0 1px 2px rgba(0,0,0,0.04);
165
- --shadow-md: 0 4px 12px rgba(0,0,0,0.06);
166
- --shadow-lg: 0 8px 24px rgba(0,0,0,0.08);
167
- --shadow-xl: 0 16px 48px rgba(0,0,0,0.12);
168
- --shadow-heart: 0 4px 14px rgba(232,86,74,0.3);
169
-
170
- /* Input */
171
- --bg-input: var(--bg);
172
- --bg-input-focus: #FFFFFF;
173
-
174
- /* Controls (outline/ghost buttons, input fields) — a surface DISTINCT from both the page bg and
175
- white cards: white fill + a clearly visible border, so controls read as controls instead of
176
- "framed text" that melts into the background. */
177
- --control-bg: #FFFFFF;
178
- --control-border: #D1D5DB;
179
-
180
- /* Code */
181
- --code-bg: #F3F4F6;
182
-
183
- /* Semantic tints (chip/banner backgrounds + readable text/border on them).
184
- The accent semantic colors (--success/--warn/--danger/--info) keep their
185
- meaning across themes; only these tint surfaces flip. */
186
- --success-bg: #D1FAE5; --success-fg: #047857; --success-border: #A7F3D0;
187
- --warn-bg: #FEF3C7; --warn-fg: #B45309; --warn-border: #FDE68A;
188
- --danger-bg: #FEE2E2; --danger-fg: #DC2626; --danger-border: #FECACA;
189
- --info-bg: #EFF6FF; --info-fg: #1D4ED8; --info-border: #BFDBFE;
190
- --purple-bg: #F5F3FF; --purple-fg: #6D28D9; --purple-border: #DDD6FE;
191
-
192
- /* Shell surfaces */
193
- --scrollbar-thumb: #D1D5DB;
194
- --overlay-scrim: rgba(26, 26, 46, 0.4);
195
- --morsel-bg: linear-gradient(135deg, #FFF1F0, #FFE0DE);
196
-
197
- /* Decorative view gradients (theme-aware) */
198
- --pf-hero-gradient: linear-gradient(135deg, #FAFAF8 0%, #FFF1F0 40%, #EFF6FF 100%);
199
- --pf-cta-gradient: linear-gradient(135deg, #FFF1F0, #EFF6FF);
200
- --pf-callout-gradient: linear-gradient(135deg, #EEF0FF, #F8F0FF);
201
-
202
- /* ── Drift-alias layer ──
203
- Variables referenced across view CSS but never defined (rendered with no
204
- fallback = broken). Defined here as aliases of the canonical tokens above,
205
- so they (a) work now and (b) inherit the dark override automatically — no
206
- entry needed in [data-theme="dark"]. The --sp-* scale is theme-invariant. */
207
- --card: var(--bg-card);
208
- --surface: var(--bg-surface);
209
- --bg-dim: var(--bg-surface);
210
- --bg-hover: var(--card-bg-hover);
211
- --muted: var(--text-dim);
212
- --error: var(--danger);
213
- --warning: var(--warn);
214
- --primary: var(--accent);
215
- --accent-faint: var(--accent-subtle);
216
- --accent-soft: var(--accent-subtle); /* highlight/hover surfaces (was #FFF0EE) */
217
- --accent-dark: var(--accent-deep); /* darker coral for button gradients/hovers */
218
- --border-soft: var(--border); /* was #f0f0ec */
219
- --bg2: var(--bg-surface); /* secondary panel bg (was #f5f5f5) */
220
- --surface-hover: var(--bg-surface); /* hover surface (had a stale dark #252540 fallback) */
221
- --on-inverted: var(--bg); /* readable text on a var(--text) background — inverts opposite to --text */
222
- --mono: var(--font-mono);
223
- --sp-1: 4px;
224
- --sp-2: 8px;
225
- --sp-3: 12px;
226
- --sp-4: 16px;
227
- --sp-5: 20px;
228
- --sp-6: 24px;
229
- --sp-8: 32px;
230
- --sp-12: 48px;
231
-
232
- /* ── Font-size scale (theme-invariant) ──
233
- A shared type scale so views stop hardcoding font-size:0.7rem / 0.85rem /
234
- 1.1rem inline. Adopt in new code; the raw rem values below are the common
235
- ones already scattered across the view CSS, so migration is a clean swap. */
236
- --text-xs: 0.72rem;
237
- --text-sm: 0.82rem;
238
- --text-base: 0.92rem;
239
- --text-lg: 1.1rem;
240
- --text-xl: 1.35rem;
241
- }
242
-
243
- /* ── Dark Theme Override ──
244
- Redefines only the color/depth variables that must flip for dark mode.
245
- Brand identity (coral accent) preserved; accents brightened for dark
246
- contrast. Text tiers verified WCAG-AA on both --bg and --bg-card.
247
- Aliases above point at these tokens, so they invert automatically. */
248
- [data-theme="dark"] {
249
- /* Background */
250
- --bg: #14151A;
251
- --bg-surface: #23262F;
252
- --bg-card: #1C1E26;
253
- --bg-elevated: #23262F;
254
-
255
- /* Cards & Surfaces */
256
- --card-bg: #1C1E26;
257
- --card-bg-hover: #23262F;
258
- --card-bg-solid: #1C1E26;
259
- --card-bg-alt: #23262F;
260
- --card-border: #33363F;
261
-
262
- /* Accent (coral heart — brightened for dark contrast, brand stays coral) */
263
- --accent: #FF6F62;
264
- --accent-bright: #FF7A6E;
265
- --accent-deep: #E8564A;
266
- --accent-glow: rgba(255, 111, 98, 0.35);
267
- --accent-subtle: rgba(255, 111, 98, 0.10);
268
- --accent-border: rgba(255, 111, 98, 0.30); /* translucent accent hairline for tag/badge edges */
269
-
270
- /* Text */
271
- --text: #EDEEF2;
272
- --text-bright: #FFFFFF;
273
- --text-dim: #A4A9B6;
274
- --text-muted: #868C9B;
275
-
276
- /* Borders */
277
- --border: #33363F;
278
- --border-subtle: #26282F;
279
- --border-focus: #FF6F62;
280
-
281
- /* Shadows (deeper/more opaque so elevation reads on dark surfaces) */
282
- --shadow-sm: 0 1px 2px rgba(0,0,0,0.40);
283
- --shadow-md: 0 4px 12px rgba(0,0,0,0.50);
284
- --shadow-lg: 0 8px 24px rgba(0,0,0,0.55);
285
- --shadow-xl: 0 16px 48px rgba(0,0,0,0.65);
286
- --shadow-heart: 0 4px 14px rgba(255,111,98,0.40);
287
-
288
- /* Input */
289
- --bg-input: #1C1E26;
290
- --bg-input-focus: #23262F;
291
-
292
- /* Controls slightly lighter than the card surface so they read as raised, with a visible border */
293
- --control-bg: #262934;
294
- --control-border: #4A4E5A;
295
-
296
- /* Code */
297
- --code-bg: #0E0F13;
298
-
299
- /* Semantic tints (translucent so they read as native dark surfaces) */
300
- --success-bg: rgba(16, 185, 129, 0.16); --success-fg: #6EE7B7; --success-border: rgba(16, 185, 129, 0.32);
301
- --warn-bg: rgba(245, 158, 11, 0.16); --warn-fg: #FCD34D; --warn-border: rgba(245, 158, 11, 0.32);
302
- --danger-bg: rgba(239, 68, 68, 0.16); --danger-fg: #FCA5A5; --danger-border: rgba(239, 68, 68, 0.34);
303
- --info-bg: rgba(59, 130, 246, 0.16); --info-fg: #93C5FD; --info-border: rgba(59, 130, 246, 0.32);
304
- --purple-bg: rgba(139, 92, 246, 0.18); --purple-fg: #C4B5FD; --purple-border: rgba(139, 92, 246, 0.34);
305
-
306
- /* Shell surfaces */
307
- --scrollbar-thumb: #3A3D47;
308
- --overlay-scrim: rgba(0, 0, 0, 0.6);
309
- --morsel-bg: rgba(255, 111, 98, 0.16);
310
-
311
- /* Decorative view gradients — subtle dark tints matching the light intent */
312
- --pf-hero-gradient: linear-gradient(135deg, #16151A 0%, #201820 45%, #15191F 100%);
313
- --pf-cta-gradient: linear-gradient(135deg, #231A1E, #1A1F28);
314
- --pf-callout-gradient: linear-gradient(135deg, #1C1A29, #221A29);
315
- }
316
-
317
- /* ── Base ── */
318
- html { scroll-behavior: smooth; height: 100%; }
319
-
320
- body {
321
- font-family: var(--font);
322
- background: var(--bg);
323
- color: var(--text);
324
- line-height: 1.6;
325
- height: 100%;
326
- margin: 0; /* zero the UA default 8px — with the fixed app-shell frame it would push #app past the viewport */
327
- /* App-shell: the page (html/body) never scrolls. The topnav is a fixed-height
328
- flex row and .page-content owns the ONLY scroll region (see #app +
329
- .page-content). This is what stops view content sliding under the header and
330
- removes the ~nav-height phantom overscroll that body-scroll + an in-flow
331
- (sticky) header produced — the content fills the space below the header and
332
- scrolls within it. overflow:hidden also subsumes the old overflow-x clip. */
333
- overflow: hidden;
334
- -webkit-font-smoothing: antialiased;
335
- }
336
-
337
- a { color: inherit; text-decoration: none; }
338
-
339
- /* ── Animations ── */
340
- @keyframes heartPulse {
341
- 0%, 100% { transform: scale(1); }
342
- 50% { transform: scale(1.15); }
343
- }
344
-
345
- @keyframes twinkle {
346
- 0%, 100% { opacity: 0.05; transform: scale(0.8); }
347
- 50% { opacity: 0.6; transform: scale(1.1); }
348
- }
349
-
350
- @keyframes livePulse {
351
- 0%, 100% { opacity: 1; box-shadow: 0 0 8px rgba(34, 197, 94, 0.6); }
352
- 50% { opacity: 0.4; box-shadow: 0 0 18px rgba(34, 197, 94, 0.9); }
353
- }
354
-
355
- @keyframes fadeIn {
356
- from { opacity: 0; transform: translateY(-4px); }
357
- to { opacity: 1; transform: translateY(0); }
358
- }
359
-
360
- @keyframes fadeInUp {
361
- from { opacity: 0; transform: translateY(20px); }
362
- to { opacity: 1; transform: translateY(0); }
363
- }
364
-
365
- @keyframes btnGlow {
366
- 0%, 100% { box-shadow: 0 4px 12px rgba(232, 86, 74, 0.3); }
367
- 50% { box-shadow: 0 6px 20px rgba(232, 86, 74, 0.4); }
368
- }
369
-
370
- @keyframes expandGlow {
371
- 0%, 100% { box-shadow: 0 0 12px rgba(232, 86, 74, 0.08); }
372
- 50% { box-shadow: 0 0 24px rgba(232, 86, 74, 0.15); }
373
- }
374
-
375
- @keyframes worldOpen {
376
- from { opacity: 0; transform: translateY(20px); }
377
- to { opacity: 1; transform: translateY(0); }
378
- }
379
-
380
- @keyframes pageIn {
381
- from { opacity: 0; }
382
- to { opacity: 1; }
383
- }
384
-
385
- @keyframes nebulaDrift {
386
- 0% { transform: translate(0, 0) scale(1); }
387
- 100% { transform: translate(30px, -20px) scale(1.15); }
388
- }
389
-
390
- @keyframes auroraShift {
391
- 0% { transform: translateX(-20%) scaleY(1); }
392
- 100% { transform: translateX(-10%) scaleY(0.8); }
393
- }
394
-
395
- @keyframes spin {
396
- to { transform: rotate(360deg); }
397
- }
398
-
399
- /* ── Background layers ── */
400
- .bg-canvas {
401
- position: fixed;
402
- top: 0; left: 0;
403
- width: 100%; height: 100%;
404
- z-index: 0;
405
- pointer-events: none;
406
- background: var(--bg);
407
- }
408
-
409
- .bg-canvas .star { display: none; }
410
-
411
- /* Aurora waves — hidden in light theme */
412
- .bg-aurora { display: none; }
413
- .aurora-wave { display: none; }
414
-
415
- /* ── App root — must sit above bg-canvas (z-index:0) so all non-positioned
416
- descendants form a stacking context that paints over the fixed background ── */
417
- #app {
418
- position: relative;
419
- z-index: 1;
420
- /* App-shell frame: a full-viewport flex column — topnav (fixed height) on top,
421
- .page-content (the scroll region) filling the rest. dvh keeps the frame flush
422
- with the visual viewport as mobile browser chrome shows/hides. */
423
- height: 100vh;
424
- height: 100dvh;
425
- display: flex;
426
- flex-direction: column;
427
- }
428
-
429
- /* ── Top Navigation ── */
430
- .topnav {
431
- /* App-shell: a fixed-height flex row inside #app (no longer sticky — #app
432
- itself doesn't scroll, so the header stays put for free). z-index keeps the
433
- header's own dropdowns (notifications, mobile menu) above .page-content. */
434
- position: relative;
435
- z-index: 100;
436
- flex: 0 0 auto;
437
- height: var(--nav-height);
438
- /* border-box so the 1px border-bottom is INCLUDED in --nav-height otherwise the
439
- header renders 1px taller than the token and every `100dvh - var(--nav-height)`
440
- scroll region (sidebars) is 1px too tall and can't stay pinned. */
441
- box-sizing: border-box;
442
- display: flex;
443
- align-items: center;
444
- justify-content: space-between;
445
- padding: 0 1.5rem;
446
- background: var(--bg-card);
447
- border-bottom: 1px solid var(--border);
448
- }
449
-
450
- .topnav-brand {
451
- font-weight: 800;
452
- font-size: 1.125rem;
453
- color: var(--text);
454
- letter-spacing: 0.3px;
455
- display: flex;
456
- align-items: center;
457
- gap: 0;
458
- text-decoration: none;
459
- }
460
-
461
- .topnav-brand .brand-name { white-space: nowrap; }
462
-
463
- .brand-morsels {
464
- display: inline-flex;
465
- align-items: center;
466
- gap: 2px;
467
- padding: 3px 10px;
468
- border-radius: var(--radius-full);
469
- border: 1px solid var(--accent-glow);
470
- background: var(--morsel-bg);
471
- color: var(--accent);
472
- font-size: 0.75rem;
473
- font-weight: 700;
474
- line-height: 1.2;
475
- }
476
-
477
- .brand-morsels::before { content: '\2665 '; color: var(--accent); }
478
-
479
- .topnav-brand .heart {
480
- color: var(--accent);
481
- font-style: normal;
482
- margin: 0 1px;
483
- font-size: 1rem;
484
- animation: none;
485
- filter: none;
486
- }
487
- .topnav-brand .brand-at {
488
- color: var(--accent);
489
- }
490
-
491
- .topnav-center {
492
- display: flex;
493
- align-items: center;
494
- gap: 0;
495
- border: 1px solid var(--border);
496
- border-radius: var(--radius-xs);
497
- overflow: hidden;
498
- padding: 0;
499
- }
500
-
501
- .topnav-right {
502
- display: flex;
503
- align-items: center;
504
- gap: 0.75rem;
505
- }
506
-
507
- /* Header notification bell + dropdown */
508
- .notif-bell { position: relative; display: inline-flex; }
509
- .notif-bell-btn { position: relative; background: none; border: none; cursor: pointer; font-size: 1.15rem; line-height: 1; padding: 4px 6px; border-radius: 8px; }
510
- .notif-bell-btn:hover { background: var(--bg-dim); }
511
- .notif-badge { position: absolute; top: -1px; right: -1px; background: var(--accent); color: #fff; border-radius: 10px; font-size: 0.6rem; font-weight: 700; min-width: 15px; height: 15px; padding: 0 3px; display: flex; align-items: center; justify-content: center; }
512
- .notif-dropdown { position: absolute; right: 0; top: calc(100% + 6px); width: 320px; max-height: 60vh; overflow-y: auto; background: var(--card); border: 1px solid var(--border); border-radius: 10px; box-shadow: 0 10px 30px rgba(0,0,0,0.18); z-index: 1200; }
513
- .notif-dropdown-head { display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; font-weight: 700; font-size: 0.9rem; color: var(--text); padding: 0.6rem 0.85rem; border-bottom: 1px solid var(--border-subtle); position: sticky; top: 0; background: var(--card); z-index: 1; }
514
- .notif-clear-all { font-weight: 600; font-size: 0.78rem; color: var(--muted); background: none; border: none; padding: 0.15rem 0.35rem; border-radius: 6px; cursor: pointer; }
515
- .notif-clear-all:hover:not(:disabled) { color: var(--brand); background: var(--bg-dim); }
516
- .notif-clear-all:disabled { opacity: 0.6; cursor: default; }
517
- .notif-empty { padding: 1rem 0.85rem; color: var(--muted); font-size: 0.85rem; }
518
- .notif-item { display: block; border-bottom: 1px solid var(--border-subtle); }
519
- .notif-item.unread { background: var(--accent-subtle); }
520
- .notif-item-main { display: block; width: 100%; text-align: left; background: none; border: none; padding: 0.55rem 0.85rem; cursor: pointer; }
521
- .notif-item-main:hover { background: var(--bg-dim); }
522
- .notif-item-title { font-size: 0.85rem; font-weight: 600; color: var(--text); }
523
- .notif-item-body { font-size: 0.78rem; color: var(--muted); margin-top: 0.15rem; }
524
- .notif-item-time { font-size: 0.7rem; color: var(--muted); margin-top: 0.2rem; }
525
- /* Inline notification actions (reply / approve / deny …) */
526
- .notif-actions { display: flex; flex-wrap: wrap; gap: 0.4rem; padding: 0 0.85rem 0.55rem; }
527
- .notif-action-btn { font-size: 0.74rem; padding: 0.25rem 0.7rem; border-radius: 7px; line-height: 1.3; }
528
- .notif-reply { padding: 0 0.85rem 0.6rem; }
529
- .notif-reply-input { width: 100%; box-sizing: border-box; resize: vertical; font: inherit; font-size: 0.8rem; padding: 0.4rem 0.5rem; border-radius: 7px; border: 1px solid var(--border); background: var(--bg-dim); color: var(--text); }
530
- .notif-reply-row { display: flex; flex-wrap: wrap; gap: 0.4rem; margin-top: 0.4rem; }
531
- .notif-result { font-size: 0.76rem; padding: 0.3rem 0.85rem 0.55rem; }
532
- .notif-result.ok { color: var(--success, #4caf50); }
533
- .notif-result.err { color: var(--danger, #e0564a); }
534
- /* Long sender GHIIs / subjects wrap instead of forcing the panel wider than the screen. */
535
- .notif-item-title, .notif-item-body { overflow-wrap: anywhere; }
536
- /* Mobile: the 320px-wide, right:0-anchored dropdown runs off the LEFT edge (the bell sits
537
- mid-right of the bar) and gets clipped by body{overflow-x:hidden}. Pin it to fixed viewport
538
- insets so it spans the screen width minus small margins, regardless of the bell's position. */
539
- @media (max-width: 560px) {
540
- .notif-dropdown {
541
- position: fixed;
542
- top: calc(var(--nav-height, 56px) + 4px);
543
- right: 8px;
544
- left: 8px;
545
- width: auto;
546
- max-height: 72vh;
547
- }
548
- }
549
-
550
- .topnav-right a {
551
- font-size: 0.84rem;
552
- color: var(--text-dim);
553
- text-decoration: none;
554
- padding: 6px 12px;
555
- border-radius: var(--radius-xs);
556
- transition: all 0.15s;
557
- font-weight: 500;
558
- border: none;
559
- }
560
-
561
- .topnav-right a:hover {
562
- color: var(--text);
563
- background: var(--bg-surface);
564
- }
565
-
566
- .topnav-right a.active {
567
- color: var(--accent);
568
- background: var(--accent-subtle);
569
- }
570
-
571
- .topnav-right .profile-link {
572
- display: none;
573
- color: var(--accent);
574
- background: var(--accent-subtle);
575
- }
576
-
577
- .topnav-right .profile-link.visible { display: inline-flex; }
578
-
579
- .header-auth-slot {
580
- display: inline-flex;
581
- align-items: center;
582
- }
583
-
584
- /* ── Header nav: desktop inline; mobile = hamburger + dropdown (see @media) ── */
585
- .topnav-menu { display: flex; align-items: center; gap: 0.75rem; }
586
- .topnav-burger { display: none; }
587
- /* Truncate a long GHII in the gold pill so it never blows out the bar (desktop). */
588
- .aimeat-auth-ghii { max-width: 240px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
589
-
590
- /* Collapse the header to a hamburger well before the full inline nav (links +
591
- theme/lang + gold pill, wider still for operators with the Admin link) runs
592
- out of room otherwise the pill overflows in the ~900–1180px band. */
593
- @media (max-width: 1180px) {
594
- .topnav { padding: 0 0.5rem; }
595
- .topnav-right { gap: 0.5rem; }
596
- /* Free up bar width so the gold pill never overflows — the morsel count is
597
- still shown in the profile dashboard. */
598
- .brand-morsels { display: none !important; }
599
- .topnav-burger {
600
- display: inline-flex; align-items: center; justify-content: center;
601
- width: 38px; height: 34px; padding: 0; font-size: 1.2rem; line-height: 1;
602
- background: none; color: var(--text); border: 1px solid var(--border);
603
- border-radius: var(--radius-xs); cursor: pointer;
604
- }
605
- .topnav-menu {
606
- display: none; position: absolute; top: var(--nav-height); left: 0; right: 0;
607
- flex-direction: column; align-items: stretch; gap: 0;
608
- background: var(--bg-card); border-bottom: 1px solid var(--border);
609
- box-shadow: var(--shadow-lg, 0 8px 24px rgba(0,0,0,.18)); padding: 0.4rem;
610
- }
611
- .topnav-menu.open { display: flex; }
612
- .topnav-menu a { width: 100%; padding: 0.7rem 0.9rem; font-size: 0.95rem; border-radius: var(--radius-xs); }
613
- .topnav-menu .topnav-center { width: fit-content; margin: 0.45rem 0.6rem 0.2rem; }
614
- /* Compact gold pill: keep the green dot + Logout, drop the wordy label + GHII. */
615
- .aimeat-auth-pill .aimeat-auth-label,
616
- .aimeat-auth-pill .aimeat-auth-ghii { display: none !important; }
617
- .aimeat-auth-pill { padding: 5px 11px !important; gap: 6px !important; }
618
- }
619
-
620
- /* ── Language Buttons ── */
621
- .lang-btn {
622
- padding: 4px 10px;
623
- border-radius: 0;
624
- font-size: 0.75rem;
625
- font-weight: 600;
626
- text-decoration: none;
627
- color: var(--text-muted);
628
- transition: all 0.15s;
629
- cursor: pointer;
630
- background: transparent;
631
- border: none;
632
- font-family: var(--font);
633
- }
634
-
635
- .lang-btn.active {
636
- background: var(--text);
637
- color: var(--on-inverted);
638
- box-shadow: none;
639
- }
640
-
641
- .lang-btn:not(.active):hover {
642
- color: var(--text);
643
- background: var(--bg-surface);
644
- }
645
-
646
- /* ── Theme Toggle ── */
647
- .theme-toggle-btn {
648
- display: inline-flex;
649
- align-items: center;
650
- justify-content: center;
651
- width: 30px;
652
- height: 26px;
653
- padding: 0;
654
- border: none;
655
- border-right: 1px solid var(--border);
656
- background: transparent;
657
- color: var(--text-dim);
658
- font-size: 0.95rem;
659
- line-height: 1;
660
- cursor: pointer;
661
- transition: all 0.15s;
662
- font-family: var(--font);
663
- }
664
-
665
- .theme-toggle-btn:hover {
666
- color: var(--accent);
667
- background: var(--bg-surface);
668
- }
669
-
670
- /* ── Buttons ── */
671
- /* Button classes are anchor-safe: applied to <a> they render as buttons,
672
- not underlined links (lets views use canonical .btn-* on link-buttons). */
673
- .btn-primary, .btn-outline, .btn-ghost, .btn-danger, .btn-danger-solid,
674
- .btn-success, .btn-info {
675
- text-decoration: none;
676
- }
677
- .btn-primary {
678
- padding: 8px 20px;
679
- background: linear-gradient(135deg, #E8564A 0%, #FF6B6B 100%);
680
- color: #FFFFFF;
681
- border: none;
682
- border-radius: var(--radius-sm);
683
- font-size: 0.84rem;
684
- font-weight: 600;
685
- font-family: var(--font);
686
- cursor: pointer;
687
- transition: all 0.2s;
688
- box-shadow: var(--shadow-heart);
689
- letter-spacing: 0;
690
- animation: none;
691
- }
692
-
693
- .btn-primary:hover {
694
- transform: translateY(-1px);
695
- box-shadow: 0 6px 20px rgba(232, 86, 74, 0.35);
696
- }
697
-
698
- .btn-primary:active {
699
- transform: translateY(0);
700
- }
701
-
702
- .btn-primary.success {
703
- background: linear-gradient(135deg, #10B981, #059669);
704
- box-shadow: 0 4px 12px rgba(16, 185, 129, 0.25);
705
- animation: none;
706
- }
707
-
708
- .btn-outline {
709
- padding: 0.65rem 1.5rem;
710
- background: var(--control-bg);
711
- border: 1px solid var(--control-border);
712
- border-radius: var(--radius-sm);
713
- color: var(--text-dim);
714
- font-size: 0.84rem;
715
- font-weight: 500;
716
- font-family: var(--font);
717
- cursor: pointer;
718
- transition: all 0.15s;
719
- letter-spacing: 0;
720
- box-shadow: var(--shadow-sm);
721
- animation: none;
722
- }
723
-
724
- .btn-outline:hover {
725
- border-color: var(--text-muted);
726
- color: var(--text);
727
- background: var(--control-bg);
728
- box-shadow: var(--shadow-sm);
729
- transform: none;
730
- }
731
-
732
- .btn-sm {
733
- padding: 0.35rem 0.75rem;
734
- font-size: 0.8rem;
735
- border-radius: var(--radius-xs);
736
- }
737
-
738
- .btn-success {
739
- padding: 0.65rem 1.5rem;
740
- background: linear-gradient(135deg, #10B981, #059669);
741
- color: #fff;
742
- border: none;
743
- border-radius: var(--radius-sm);
744
- font-size: 0.9rem;
745
- font-weight: 600;
746
- font-family: var(--font);
747
- cursor: pointer;
748
- transition: all 0.2s;
749
- box-shadow: 0 4px 12px rgba(16, 185, 129, 0.2);
750
- }
751
-
752
- .btn-success:hover {
753
- transform: translateY(-1px);
754
- box-shadow: 0 6px 20px rgba(16, 185, 129, 0.3);
755
- }
756
-
757
- .btn-info {
758
- padding: 0.65rem 1.5rem;
759
- background: #3B82F6;
760
- color: #fff;
761
- border: none;
762
- border-radius: var(--radius-sm);
763
- font-size: 0.84rem;
764
- font-weight: 600;
765
- font-family: var(--font);
766
- cursor: pointer;
767
- transition: all 0.2s;
768
- box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2);
769
- }
770
- .btn-info:hover {
771
- transform: translateY(-1px);
772
- box-shadow: 0 6px 20px rgba(59, 130, 246, 0.3);
773
- }
774
-
775
- .btn-danger {
776
- background: var(--danger-bg);
777
- color: var(--danger-fg);
778
- border: 1px solid var(--danger-border);
779
- }
780
-
781
- .btn-ghost {
782
- display: inline-flex;
783
- align-items: center;
784
- gap: 0.35rem;
785
- padding: 7px 16px;
786
- border-radius: var(--radius-sm);
787
- border: 1px solid var(--control-border);
788
- background: var(--control-bg);
789
- color: var(--text-dim);
790
- text-decoration: none;
791
- font-size: 0.81rem;
792
- font-weight: 500;
793
- transition: all 0.15s;
794
- }
795
-
796
- .btn-ghost:hover {
797
- border-color: var(--text-muted);
798
- color: var(--text);
799
- background: var(--control-bg);
800
- }
801
-
802
- /* ── Cards ── */
803
- .card {
804
- background: var(--bg-card);
805
- border: 1px solid var(--border);
806
- border-radius: var(--radius);
807
- padding: 2rem;
808
- box-shadow: var(--shadow-sm);
809
- transition: all 0.2s ease;
810
- }
811
-
812
- .card:hover {
813
- box-shadow: var(--shadow-lg);
814
- transform: translateY(-2px);
815
- }
816
-
817
- .card-solid {
818
- background: var(--bg-card);
819
- border: 1px solid var(--border);
820
- border-radius: var(--radius);
821
- padding: 1.5rem;
822
- }
823
-
824
- /* Glass variant (Card variant="glass") — reproduces the former profile
825
- .pf-glass-card appearance, fully tokenized. Overrides .card defaults
826
- (2rem padding, var(--radius), shadow) with the glass card's flatter geometry. */
827
- .card-glass {
828
- padding: 16px;
829
- border-radius: 8px;
830
- background: var(--surface);
831
- border: 1px solid var(--border);
832
- margin-bottom: 1rem;
833
- box-shadow: none;
834
- }
835
- /* Glass card is flat — neutralize the generic .card:hover lift so it looks
836
- identical to the former static .pf-glass-card. */
837
- .card-glass:hover {
838
- box-shadow: none;
839
- transform: none;
840
- }
841
-
842
- /* ── Content Group Container ── */
843
- .content-group {
844
- position: relative;
845
- z-index: 1;
846
- max-width: 560px;
847
- margin: 3rem auto 0;
848
- padding: 2rem 1.5rem;
849
- border: 1px solid var(--border);
850
- border-radius: var(--radius);
851
- background: var(--bg-card);
852
- box-shadow: var(--shadow-md);
853
- }
854
-
855
- .content-group > *:first-child { margin-top: 0; }
856
- .content-group > *:last-child { margin-bottom: 0; }
857
-
858
- /* ── Stat Cards ── */
859
- .stat-card {
860
- border: 1px solid var(--border);
861
- border-radius: var(--radius-sm);
862
- padding: 12px 20px;
863
- background: var(--bg-card);
864
- box-shadow: var(--shadow-sm);
865
- text-align: center;
866
- }
867
-
868
- .stat-card-label {
869
- font-size: 0.66rem;
870
- color: var(--text-muted);
871
- text-transform: uppercase;
872
- letter-spacing: 0.5px;
873
- font-weight: 600;
874
- }
875
-
876
- .stat-card-value {
877
- font-size: 1.35rem;
878
- color: var(--text);
879
- font-weight: 800;
880
- margin-top: 0.15rem;
881
- }
882
- /* Value tone + mono modifiers — let accent-tinted / earned-spent / monospace stat
883
- clones converge onto canonical .stat-card-value without losing their semantics. */
884
- .stat-card-value.accent { color: var(--accent); }
885
- .stat-card-value.success { color: var(--success-fg); }
886
- .stat-card-value.danger { color: var(--danger-fg); }
887
- .stat-card-value.warn { color: var(--warn); }
888
- .stat-card-value.purple { color: var(--purple); }
889
- .stat-card-value.blue { color: var(--blue); }
890
- .stat-card-value.mono { font-family: var(--font-mono, monospace); }
891
- /* Shared responsive stat grid wrapper. */
892
- .stat-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 12px; margin-bottom: 32px; }
893
-
894
- /* ── Category Card ── */
895
- /* Canonical clickable directory tile (icon + name + optional count) shared by the
896
- marketplace category grid and the hobbies interest grid. Works on both <a> and
897
- <div> (text-decoration:none keeps anchors un-underlined). The grid wrapper stays
898
- per-view because column density differs (marketplace 160px / hobbies 200px min). */
899
- .category-card {
900
- background: var(--bg-card); border: 1px solid var(--border);
901
- border-radius: var(--radius); padding: 20px; text-align: center; text-decoration: none;
902
- transition: all 0.2s; cursor: pointer;
903
- }
904
- .category-card:hover { background: var(--bg-surface); border-color: var(--accent); box-shadow: var(--shadow-md); }
905
- .category-icon { font-size: 2rem; margin-bottom: 8px; }
906
- .category-name { font-size: 0.95rem; font-weight: 600; color: var(--text); }
907
- .category-count { font-size: 0.78rem; color: var(--text-muted); margin-top: 4px; }
908
-
909
- /* ── Badges ── */
910
- .badge {
911
- display: inline-block;
912
- padding: 2px 8px;
913
- border-radius: var(--radius-full);
914
- font-size: 0.66rem;
915
- font-weight: 600;
916
- text-transform: uppercase;
917
- letter-spacing: 0.3px;
918
- }
919
-
920
- .badge-success { background: var(--success-bg); color: var(--success-fg); }
921
- .badge-warn { background: var(--warn-bg); color: var(--warn-fg); }
922
- .badge-danger { background: var(--danger-bg); color: var(--danger-fg); }
923
- .badge-info { background: var(--info-bg); color: var(--info-fg); }
924
-
925
- /* ── Pill (canonical shape primitive) ──
926
- The common pill-chip *shape* only — no colors. Small inline-flex chip with
927
- pill radius, compact padding, small bold text, pointer cursor and a soft
928
- opacity hover. Colors are supplied by the caller's own tint classes (e.g.
929
- .vis-public / .vis-private) so this base stays theme-neutral. Matches the
930
- shape the profile visibility pill (.vis-pill) already used. New pill-shaped
931
- chips should build on this base + a tint class instead of re-declaring the
932
- shape. Note: the profile pills are styled via the higher-specificity
933
- `.pf .vis-pill`, which keeps its own shape declaration to avoid the
934
- scoped-override specificity trap; it now references the same --radius-full
935
- token so the two stay in lockstep. */
936
- .pill {
937
- display: inline-flex;
938
- align-items: center;
939
- border: none;
940
- cursor: pointer;
941
- padding: 2px 8px;
942
- border-radius: var(--radius-full);
943
- font-size: 0.7rem;
944
- font-weight: 600;
945
- transition: opacity 0.15s;
946
- }
947
- .pill:hover { opacity: 0.8; }
948
-
949
- /* ── Segmented control (canonical) ──
950
- A row of buttons in a bordered pill; the active segment is filled with the accent. Token-only so
951
- it flips in dark mode. The start of the deferred #8 tab-family consolidation — use this for new
952
- in-place view toggles (Draft/Published, picker tabs, scope toggles) instead of a per-view clone. */
953
- .seg { display: inline-flex; border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; background: var(--card); }
954
- .seg-btn { padding: 0.25rem 0.7rem; font-size: 0.8rem; line-height: 1.3; background: transparent; color: var(--text-dim); border: none; cursor: pointer; transition: background 0.15s, color 0.15s; }
955
- .seg-btn + .seg-btn { border-left: 1px solid var(--border); }
956
- .seg-btn:hover:not(:disabled) { background: var(--bg-surface); }
957
- .seg-btn.active { background: var(--accent); color: #fff; }
958
- .seg-btn:disabled { opacity: 0.6; cursor: default; }
959
-
960
- /* ── Status dot (canonical) ──
961
- Small circle whose color is driven by a semantic status token. Consolidates
962
- the bespoke per-view dots (.live-dot, .peer-dot, .pn-status-dot,
963
- .ext-status-dot, .dv-dot). Component: /components/StatusDot.js.
964
- All colors are theme tokens so the dot flips correctly in dark mode. */
965
- .status-dot {
966
- display: inline-block;
967
- width: 8px;
968
- height: 8px;
969
- border-radius: 50%;
970
- flex-shrink: 0;
971
- background: var(--text-muted);
972
- }
973
- .status-dot--online,
974
- .status-dot--active,
975
- .status-dot--healthy,
976
- .status-dot--alive,
977
- .status-dot--live { background: var(--success); }
978
- .status-dot--warn,
979
- .status-dot--degraded,
980
- .status-dot--syncing,
981
- .status-dot--pending { background: var(--warn); }
982
- .status-dot--error,
983
- .status-dot--offline,
984
- .status-dot--dead,
985
- .status-dot--down { background: var(--danger); }
986
- .status-dot--idle,
987
- .status-dot--inactive,
988
- .status-dot--detached,
989
- .status-dot--muted { background: var(--text-muted); }
990
- /* Online keeps the soft glow the former .pn-status-dot.online had */
991
- .status-dot--online { box-shadow: 0 0 6px rgba(34, 197, 94, 0.4); }
992
- /* Live additionally pulses (matches former .live-dot behaviour) */
993
- .status-dot--live {
994
- box-shadow: 0 0 8px rgba(34, 197, 94, 0.6);
995
- animation: livePulse 1.5s ease-in-out infinite;
996
- }
997
-
998
- /* ── Presence indicator (canonical) ──
999
- Backed by /components/PresenceDot.js. A small availability dot (+ optional
1000
- label) shown next to a person across views. Colors are theme tokens so the
1001
- dot flips in dark mode: available→success, busy→danger, away→warn,
1002
- offline/unknown→muted (unknown is extra-faded). */
1003
- .presence {
1004
- display: inline-flex;
1005
- align-items: center;
1006
- gap: 6px;
1007
- line-height: 1;
1008
- }
1009
- .presence-dot {
1010
- display: inline-block;
1011
- width: 8px;
1012
- height: 8px;
1013
- border-radius: 50%;
1014
- flex-shrink: 0;
1015
- background: var(--text-muted);
1016
- }
1017
- .presence--md .presence-dot { width: 10px; height: 10px; }
1018
- .presence-dot--available { background: var(--success); box-shadow: 0 0 6px rgba(16, 185, 129, 0.45); }
1019
- .presence-dot--busy { background: var(--danger); }
1020
- .presence-dot--away { background: var(--warn); }
1021
- .presence-dot--offline { background: var(--text-muted); }
1022
- .presence-dot--unknown { background: var(--text-muted); opacity: 0.4; }
1023
- .presence-label {
1024
- font-size: 0.85em;
1025
- color: var(--text-dim);
1026
- }
1027
-
1028
- /* ── Key/value detail row (canonical) ──
1029
- Backed by /components/KeyValueRow.js. A label/value pair laid out flex
1030
- space-between: muted label on the left, emphasized value on the right,
1031
- separated by a subtle bottom border (none on the last row). Consolidates the
1032
- common label+value-pair shape (admin .adm-erow / .adm-hrow, profile
1033
- .pf-agd-info-row). All colors are theme tokens so it flips correctly in dark
1034
- mode. `.kv-value.mono` renders the value in the monospace font (ids, hashes,
1035
- amounts). The existing per-view classes are intentionally left in place where
1036
- their look differs. */
1037
- .kv-row {
1038
- display: flex;
1039
- align-items: center;
1040
- justify-content: space-between;
1041
- gap: 0.5rem;
1042
- padding: 7px 0;
1043
- border-bottom: 1px solid var(--border-subtle);
1044
- font-size: 0.84rem;
1045
- }
1046
- .kv-row:last-child { border-bottom: none; }
1047
- .kv-label {
1048
- color: var(--text-dim);
1049
- flex-shrink: 0;
1050
- }
1051
- .kv-value {
1052
- color: var(--text);
1053
- font-weight: 600;
1054
- text-align: right;
1055
- word-break: break-word;
1056
- }
1057
- .kv-value.mono {
1058
- font-family: var(--font-mono);
1059
- font-size: 0.81rem;
1060
- }
1061
-
1062
- /* ── Pagination + Load more (canonical) ──
1063
- Backed by /components/Pagination.js. `.pagination` is the prev / "Page X / Y"
1064
- / next control (arrow buttons + disabled ends); `.load-more` centers a single
1065
- "load more" button. Consolidates the near-identical .adm-mem-pagination shape
1066
- and the centered load-more wrapper. All colors are theme tokens so both flip
1067
- correctly in dark mode. The numbered .hb-pagination variant is intentionally
1068
- left in place (different UI). */
1069
- .pagination {
1070
- display: flex;
1071
- align-items: center;
1072
- justify-content: center;
1073
- gap: 12px;
1074
- margin-top: 8px;
1075
- }
1076
- .pagination-info {
1077
- font-size: 0.85rem;
1078
- color: var(--text-dim);
1079
- }
1080
- .load-more {
1081
- text-align: center;
1082
- margin-top: 1.5rem;
1083
- }
1084
-
1085
- /* ── Collapsible (canonical) ──
1086
- Backed by /components/Collapsible.js. A clickable header (title + a chevron
1087
- that rotates 180° when open) with the body shown only while open. This is the
1088
- canonical shape for the hand-rolled expand/collapse toggles scattered across
1089
- views (.expand-btn + .pf-chevron, .scope-advanced-toggle, .pkv-entry-arrow).
1090
- All colors are theme tokens so it flips correctly in dark mode. Callers own
1091
- the open state (controlled component). The bespoke per-view toggles are left
1092
- in place where their expanded markup is wired into view state; this block is
1093
- the target for new collapsible sections. */
1094
- .collapsible {
1095
- border: 1px solid var(--border);
1096
- border-radius: var(--radius-sm);
1097
- margin-bottom: 0.75rem;
1098
- }
1099
- .collapsible-header {
1100
- display: flex;
1101
- align-items: center;
1102
- justify-content: space-between;
1103
- gap: 0.5rem;
1104
- width: 100%;
1105
- padding: 0.6rem 0.85rem;
1106
- background: none;
1107
- border: none;
1108
- border-radius: var(--radius-sm);
1109
- color: var(--text);
1110
- font-family: var(--font);
1111
- font-size: 0.85rem;
1112
- font-weight: 600;
1113
- text-align: left;
1114
- cursor: pointer;
1115
- transition: color 0.2s;
1116
- }
1117
- .collapsible-header:hover {
1118
- color: var(--accent);
1119
- }
1120
- .collapsible-chevron {
1121
- display: inline-block;
1122
- flex-shrink: 0;
1123
- font-size: 0.7rem;
1124
- color: var(--text-dim);
1125
- transition: transform 0.2s;
1126
- }
1127
- .collapsible-chevron.open {
1128
- transform: rotate(180deg);
1129
- }
1130
- .collapsible-body {
1131
- padding: 0 0.85rem 0.75rem;
1132
- }
1133
-
1134
- /* ── Data table (canonical) ──
1135
- Generic table look backed by /components/DataTable.js. Extracted as the common
1136
- denominator of the admin `.adm table` and profile `.pf .consent-table` /
1137
- `.audit-table` shapes: full-width collapsed borders, an uppercase muted header
1138
- row divided by `--border`, cells divided by `--border-subtle`, a subtle hover,
1139
- and a `.mono` cell modifier. All colors are theme tokens so the table flips
1140
- correctly in dark mode. The `.scrollable` wrapper caps height (admin reuses its
1141
- own `.adm .scrollable`; this generic one applies outside `.adm`). Callers supply
1142
- their own container (`.card` / `.adm-card`); this block adds none. */
1143
- .data-table { width: 100%; border-collapse: collapse; font-size: .81rem; }
1144
- .data-table th {
1145
- text-align: left;
1146
- color: var(--text-muted);
1147
- font-weight: 600;
1148
- padding: 8px 10px;
1149
- border-bottom: 1px solid var(--border);
1150
- white-space: nowrap;
1151
- font-size: .69rem;
1152
- text-transform: uppercase;
1153
- letter-spacing: .3px;
1154
- }
1155
- .data-table td {
1156
- padding: 8px 10px;
1157
- border-bottom: 1px solid var(--border-subtle);
1158
- color: var(--text-dim);
1159
- }
1160
- .data-table tr:hover td { background: var(--bg-surface); }
1161
- .data-table .mono { font-family: var(--font-mono); font-size: .78rem; }
1162
- /* Generic scrollable wrapper (the admin-scoped `.adm .scrollable` already exists
1163
- for admin tables; this one covers DataTable used outside `.adm`). */
1164
- .scrollable { max-height: 600px; overflow-y: auto; }
1165
-
1166
- /* ── Chart canvas wrapper (components/UsageChart.js) ──
1167
- Chart.js runs with maintainAspectRatio:false, so it needs a sized relative box.
1168
- Height is supplied per-instance via the --usage-chart-h custom property. */
1169
- .usage-chart { position: relative; width: 100%; height: var(--usage-chart-h, 220px); }
1170
-
1171
- /* ── Section divider ── */
1172
- .section-divider {
1173
- position: relative;
1174
- z-index: 1;
1175
- max-width: 520px;
1176
- margin: 1rem auto 1.5rem;
1177
- height: 1px;
1178
- background: var(--border);
1179
- }
1180
-
1181
- /* ── Inputs ── */
1182
- .input-field {
1183
- width: 100%;
1184
- padding: 11px 14px;
1185
- background: var(--control-bg);
1186
- border: 1.5px solid var(--control-border);
1187
- border-radius: var(--radius-sm);
1188
- color: var(--text);
1189
- font-family: var(--font);
1190
- font-size: 0.94rem;
1191
- outline: none;
1192
- transition: all 0.15s;
1193
- }
1194
-
1195
- .input-field::placeholder { color: var(--text-muted); }
1196
-
1197
- .input-field:focus {
1198
- border-color: var(--accent);
1199
- box-shadow: 0 0 0 3px var(--accent-subtle);
1200
- background: var(--bg-input-focus);
1201
- }
1202
-
1203
- /* Textarea + select behavior so .input-field works on all field types (lets views
1204
- drop per-view form-input/textarea/select clones). */
1205
- textarea.input-field { resize: vertical; min-height: 80px; }
1206
- select.input-field { cursor: pointer; }
1207
-
1208
- /* ── Search bar (canonical shell) ──
1209
- Backed by /components/SearchBar.js. `.search-bar` is the flex row that wraps a
1210
- single `type="search"` input; the input itself reuses `.input-field` so all
1211
- visuals (border, focus ring, placeholder, dark-mode flip) are token-driven and
1212
- need no per-view restyling. `.search-bar-input` only makes the input grow to
1213
- fill the row. Consolidates the hand-rolled search inputs (.pkv-search,
1214
- .cap-search-input, .pf-agd-search-input) and the profile .search-bar +
1215
- .input-field combo. The profile-scoped `.pf .search-bar` rule (with max-width)
1216
- coexists; this base provides the layout everywhere else. */
1217
- .search-bar {
1218
- display: flex;
1219
- align-items: center;
1220
- gap: 0.5rem;
1221
- flex: 1;
1222
- }
1223
- .search-bar-input { flex: 1; }
1224
-
1225
- .prompt-box {
1226
- width: 100%;
1227
- min-height: 140px;
1228
- max-height: 300px;
1229
- padding: 1rem 1.2rem;
1230
- background: var(--bg);
1231
- border: 1.5px solid var(--border);
1232
- border-radius: var(--radius-sm);
1233
- color: var(--text);
1234
- font-family: var(--font-mono);
1235
- font-size: 0.8rem;
1236
- line-height: 1.7;
1237
- resize: vertical;
1238
- outline: none;
1239
- text-align: left;
1240
- }
1241
-
1242
- .prompt-box:focus {
1243
- border-color: var(--accent);
1244
- box-shadow: 0 0 0 3px var(--accent-subtle);
1245
- }
1246
-
1247
- /* ── Spinner ── */
1248
- .spinner {
1249
- display: inline-block;
1250
- width: 1.25em;
1251
- height: 1.25em;
1252
- border: 2px solid var(--border);
1253
- border-top-color: var(--accent);
1254
- border-radius: 50%;
1255
- animation: spin 0.6s linear infinite;
1256
- }
1257
-
1258
- /* ── Empty state ── */
1259
- .empty {
1260
- padding: 1.5rem;
1261
- text-align: center;
1262
- font-size: 0.85rem;
1263
- color: var(--text-muted);
1264
- font-style: italic;
1265
- }
1266
- /* Optional icon for the canonical EmptyState component (#9). */
1267
- .empty-icon { display: block; font-size: 2.5rem; opacity: 0.4; margin-bottom: 0.5rem; font-style: normal; }
1268
- /* Richer EmptyState slots (#9 v1.1): bold title, body line, and an action row.
1269
- Lets the pkv title+desc, pwv icon+action gates, and mk/hb icon+text triads
1270
- fold into the one component. Body keeps the base .empty italic; title/action
1271
- are normal weight/style. */
1272
- .empty-title { font-style: normal; font-weight: 600; font-size: var(--text-base); color: var(--text); margin-bottom: 0.25rem; }
1273
- .empty-text { margin: 0 auto; max-width: 32rem; }
1274
- .empty-action { margin-top: 0.85rem; font-style: normal; display: flex; gap: 0.5rem; justify-content: center; flex-wrap: wrap; }
1275
-
1276
- /* ── Muted / meta text utilities ──
1277
- Shared replacements for the ~8 bespoke `.xx-muted` and ~30 `.xx-*-meta`
1278
- clones scattered across the view CSS. Colors are tokens so they flip in dark
1279
- mode. `.muted`/`.text-dim` dim to the mid tier; `.text-faint` to the dimmest;
1280
- `.meta` is the small dim caption used under cards/rows. */
1281
- .muted, .text-dim { color: var(--text-dim); }
1282
- .text-faint { color: var(--text-muted); }
1283
- .meta { font-size: var(--text-sm); color: var(--text-dim); }
1284
-
1285
- /* ── Toggle Switch (canonical /components/ToggleSwitch.js, #14) ── */
1286
- .toggle { display: flex; align-items: center; gap: 10px; cursor: pointer; }
1287
- .toggle-input { position: absolute; opacity: 0; width: 0; height: 0; }
1288
- .toggle-slider {
1289
- position: relative; display: inline-block; width: 44px; height: 24px;
1290
- background: var(--border); border-radius: 12px; transition: background 0.2s;
1291
- }
1292
- .toggle-slider::after {
1293
- content: ''; position: absolute; top: 2px; left: 2px;
1294
- width: 20px; height: 20px; border-radius: 50%; background: #fff;
1295
- transition: transform 0.2s; box-shadow: 0 1px 3px rgba(0,0,0,0.15);
1296
- }
1297
- .toggle-input:checked + .toggle-slider { background: var(--success); }
1298
- .toggle-input:checked + .toggle-slider::after { transform: translateX(20px); }
1299
- .toggle-label { font-size: .85rem; color: var(--text); }
1300
-
1301
- /* ── Scrollbar ── */
1302
- ::-webkit-scrollbar { width: 6px; }
1303
- ::-webkit-scrollbar-track { background: transparent; }
1304
- ::-webkit-scrollbar-thumb { background: var(--scrollbar-thumb); border-radius: 4px; }
1305
-
1306
- /* ── Footer ── */
1307
- .footer {
1308
- position: relative;
1309
- z-index: 1;
1310
- text-align: center;
1311
- padding: 3rem 1.25rem 3.5rem;
1312
- font-size: 0.82rem;
1313
- color: var(--text-dim);
1314
- line-height: 1.7;
1315
- max-width: 500px;
1316
- margin: 0 auto;
1317
- }
1318
-
1319
- .footer .heart-icon {
1320
- display: inline-block;
1321
- color: var(--accent);
1322
- font-size: 0.85rem;
1323
- margin: 0 0.1rem;
1324
- }
1325
-
1326
- /* ── Page entrance ── */
1327
- /* App-shell scroll region: fills the space under the topnav and owns the only
1328
- scroll. min-height:0 lets the flex child shrink so overflow-y actually scrolls;
1329
- overflow-x:hidden replaces the clip that used to live on body. */
1330
- .page-content { flex: 1 1 auto; min-height: 0; overflow-y: auto; overflow-x: hidden; animation: pageIn 0.8s ease; }
1331
-
1332
- /* ── Responsive ── */
1333
- @media (max-width: 480px) {
1334
- .content-group { margin-top: 2rem; padding: 1.5rem 1rem; }
1335
- .topnav { padding: 0 0.4rem; }
1336
- }
1337
-
1338
- /* ═══════════════════════════════════════════════════════
1339
- Shared Components
1340
- ═══════════════════════════════════════════════════════ */
1341
-
1342
- /* ── Alert ── */
1343
- .alert {
1344
- display: flex; align-items: center; gap: 0.5rem;
1345
- padding: 0.75rem 1rem; border-radius: var(--radius-xs);
1346
- font-size: 0.85rem; margin-bottom: 1rem;
1347
- }
1348
- .alert-icon { font-weight: 700; flex-shrink: 0; }
1349
- .alert-msg { flex: 1; }
1350
- .alert-close { background: none; border: none; color: inherit; cursor: pointer; font-size: 1rem; padding: 0 0.25rem; opacity: 0.7; }
1351
- .alert-close:hover { opacity: 1; }
1352
- .alert-success { background: var(--success-bg); color: var(--success-fg); border: 1px solid var(--success-border); }
1353
- .alert-error { background: var(--danger-bg); color: var(--danger-fg); border: 1px solid var(--danger-border); }
1354
- .alert-warn { background: var(--warn-bg); color: var(--warn-fg); border: 1px solid var(--warn-border); }
1355
- .alert-info { background: var(--info-bg); color: var(--info-fg); border: 1px solid var(--info-border); }
1356
-
1357
- /* ── Toast ── */
1358
- .toast {
1359
- /* width: max-content (NOT fit-content/auto): a fixed box anchored at left:50%
1360
- shrink-to-fits against the remaining 50vw, capping the pill at half the
1361
- viewport a tall skinny tower on phones. max-width does the real capping. */
1362
- position: fixed; bottom: 2rem; left: 50%; transform: translateX(-50%);
1363
- z-index: 9999; max-width: min(92vw, 40rem); width: max-content;
1364
- padding: 0.7rem 1.15rem; border-radius: var(--radius-sm);
1365
- font-size: 0.9rem; font-weight: 600; line-height: 1.45;
1366
- text-align: center; text-wrap: pretty; overflow-wrap: anywhere; white-space: normal;
1367
- background: var(--toast-success-bg); color: var(--toast-fg);
1368
- box-shadow: var(--shadow-xl);
1369
- animation: toastIn 0.3s ease, toastOut 0.4s ease 2.4s forwards;
1370
- pointer-events: auto; box-sizing: border-box;
1371
- }
1372
- .toast.error, .toast-error { background: var(--toast-danger-bg); color: var(--toast-fg); }
1373
- .toast-success { background: var(--toast-success-bg); color: var(--toast-fg); }
1374
- .toast-info { background: var(--toast-info-bg); color: var(--toast-fg); }
1375
- .toast-warn { background: var(--toast-warn-bg); color: var(--toast-warn-fg); }
1376
- @keyframes toastIn { from { opacity: 0; transform: translateX(-50%) translateY(16px); } to { opacity: 1; transform: translateX(-50%) translateY(0); } }
1377
- @keyframes toastOut { from { opacity: 1; } to { opacity: 0; pointer-events: none; } }
1378
-
1379
- /* ── Modal ── */
1380
- .modal-overlay {
1381
- position: fixed; inset: 0; z-index: 1000;
1382
- background: var(--overlay-scrim); backdrop-filter: blur(8px);
1383
- display: flex; align-items: center; justify-content: center;
1384
- padding: 24px;
1385
- animation: fadeIn 0.2s ease;
1386
- }
1387
- .modal {
1388
- background: var(--bg-card); border-radius: var(--radius-xl);
1389
- box-shadow: var(--shadow-xl); padding: 1.5rem;
1390
- min-width: 320px; max-width: 90vw; max-height: 85vh; overflow-y: auto;
1391
- }
1392
- .modal-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem; }
1393
- .modal-header h3 { font-size: 1.1rem; font-weight: 700; }
1394
- .modal-close { background: none; border: none; color: var(--text-dim); cursor: pointer; font-size: 1.2rem; padding: 0.25rem; opacity: 0.7; }
1395
- .modal-close:hover { opacity: 1; }
1396
- .modal-confirm-message { color: var(--text-dim); margin: 0 0 1.25rem; line-height: 1.5; }
1397
- .modal-footer { display: flex; justify-content: flex-end; gap: 8px; padding-top: 0.5rem; }
1398
- .btn-danger-solid { padding: 8px 20px; background: var(--danger,#ef4444); color: #fff; border: none; border-radius: var(--radius-sm); font-size: 0.84rem; font-weight: 500; cursor: pointer; transition: all 0.15s; }
1399
- .btn-danger-solid:hover { background: #dc2626; }
1400
-
1401
- /* ── Card extensions ── */
1402
- .card-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.5rem; }
1403
- .card-title { font-weight: 600; font-size: 1rem; }
1404
- .card-subtitle { color: var(--text-dim); font-size: 0.8rem; }
1405
- .card-hoverable { cursor: pointer; }
1406
-
1407
- /* ── Form Group ── */
1408
- .form-group { margin-bottom: 1rem; }
1409
- .form-label { display: block; font-size: 0.75rem; font-weight: 600; color: var(--text-dim); margin-bottom: 5px; text-transform: uppercase; letter-spacing: 0.5px; }
1410
- .form-hint { display: block; font-size: 0.72rem; color: var(--text-muted); margin-top: 0.25rem; }
1411
-
1412
- /* ── Loading text ── */
1413
- .loading-text { margin-left: 0.5rem; color: var(--text-dim); font-size: 0.85rem; }
1414
-
1415
- /* ── Section & page headers (canonical title + subtitle pairs) ──
1416
- Single source of truth for the "title + supporting copy" header that every
1417
- view re-implements. Use .section-title/.section-desc for in-page section
1418
- headers (accent title) and .page-title/.page-subtitle for top-of-view page
1419
- headers (gradient title). All values are theme tokens so they flip with
1420
- dark/light mode. Per-view clones (mk-/hb-/cl-/adm-page-title) are
1421
- token-equivalent and should converge onto these over time. */
1422
- .section-title { font-size: 1.15rem; font-weight: 700; margin-bottom: 0.4rem; color: var(--accent); }
1423
- .section-desc { color: var(--text-dim); font-size: 0.85rem; margin-bottom: 1.25rem; line-height: 1.5; max-width: 700px; }
1424
- .page-title {
1425
- font-size: 1.8rem; font-weight: 700; margin-bottom: 8px;
1426
- background: linear-gradient(135deg, var(--accent), var(--accent-deep));
1427
- -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;
1428
- }
1429
- .page-subtitle { color: var(--text-dim); font-size: 1rem; margin-bottom: 32px; }
1430
-
1431
- /* ── Accessibility ── */
1432
- .visually-hidden { position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0,0,0,0); white-space:nowrap; border:0; }
1
+ /* ═══════════════════════════════════════════════════════
2
+ @file theme.css
3
+ @description AIMEAT Unified Theme — single source of truth for all portal
4
+ CSS variables (tokens), base styles, animations, and shared components.
5
+ Defines the light theme in :root, a dark override in [data-theme="dark"],
6
+ and a drift-alias layer so undefined-but-referenced vars resolve.
7
+ @structure :root tokens, drift aliases, [data-theme="dark"] override,
8
+ base/reset, animations, topnav, buttons, cards, badges, inputs, modal,
9
+ toast, alert.
10
+ @usage Loaded first in spa.html <head>; the theme is toggled by /js/theme.js
11
+ which flips the data-theme attribute on <html>.
12
+ @version-history
13
+ v1.24.0 — 2026-07-21 — App-shell scroll model: html/body no longer scroll (height:100%;
14
+ overflow:hidden); #app is a full-viewport (100dvh) flex column with the topnav as a fixed-height
15
+ row and .page-content as the sole overflow-y:auto scroll region. Removes the ~nav-height phantom
16
+ overscroll and stops view content sliding under the (formerly sticky, now in-frame) header. Coupled
17
+ offset fixes: .pf-sidebar/.adm-sidebar stick to top:0 of the region and cap at 100dvh−nav-height.
18
+ v1.25.0 — 2026-07-28Header nav wraps instead of overflowing and its labels never break
19
+ mid-phrase (.topnav-menu flex-wrap + > a white-space:nowrap). Adding Learn and EXCHANGE
20
+ made two-word links split into "Try / it" on nodes that also run Companies/Members.
21
+ v1.24.0 — 2026-07-28Live counters: add .stat-card-value.is-loading (quiet placeholder while
22
+ the fetch is in flight a hard 0 on a live counter reads as a dead node) and .stat-card-sub
23
+ (second line under a counter, e.g. "2 online now"). Additive only.
24
+ v1.23.1 — 2026-07-20 Mobile: pin .notif-dropdown to fixed viewport insets under 560px (the
25
+ 320px, right:0-anchored panel ran off the LEFT edge — the bell sits mid-right of the bar — and
26
+ got clipped by body{overflow-x:hidden}); long notif titles/bodies wrap (overflow-wrap:anywhere).
27
+ v1.23.02026-07-18 Notification bell inline actions: split .notif-item into a clickable
28
+ .notif-item-main + an actions row; add .notif-actions/.notif-action-btn/.notif-reply*/.notif-result.
29
+ v1.22.0 — 2026-07-17 UI-unification foundation: extend the spacing scale (--sp-5=20/--sp-6=24/
30
+ --sp-8=32/--sp-12=48) and add a font-size scale (--text-xs..--text-xl) so views stop hardcoding
31
+ padding:24px / font-size:0.85rem inline; add .muted/.text-dim/.text-faint/.meta text utilities
32
+ (there was no muted/meta utility class, so ~8 views invented .xx-muted and ~30 invented .xx-*-meta).
33
+ Additive only no existing rule changed, so appearance is preserved until views adopt them.
34
+ v1.21.0 2026-07-06 Toast variants + mobile width: add --toast-info-bg/--toast-warn-bg tokens +
35
+ .toast-info/.toast-warn classes (call sites pass 'info'/'warning' kinds; they previously fell into the
36
+ truthy-isError red path). .toast width fit-content max-content: anchored at left:50%, fit-content
37
+ shrink-to-fit capped the pill at 50vw (a skinny tower on phones); max-width min(92vw, 40rem) now rules.
38
+ v1.20.0 2026-07-03 Toast legibility: .toast max-width 420px → min(92vw, 40rem) (was hard-capped
39
+ narrow on wide screens so longer messages wrapped into a tall skinny "tower"), plus line-height 1.45,
40
+ centered text, overflow-wrap:anywhere (guards long GAIIs/URLs) and a --shadow-xl lift. One class fixes
41
+ every toast pathway. Appearance of short toasts unchanged (still a compact pill via width:fit-content).
42
+ v1.19.0 — 2026-06-10Controls get their own surface: new --control-bg/--control-border tokens
43
+ (light: white + gray-300; dark: raised #262934 + #4A4E5A). .btn-outline/.btn-ghost drop
44
+ background:transparent (they melted into the page as "framed text") and .input-field drops
45
+ background:var(--bg) (fields were LITERALLY the page color) all three now use the control
46
+ tokens, buttons additionally get --shadow-sm so they read as pressable.
47
+ v1.18.0 — 2026-06-02 — Component unification (#10 third toast pathway): tokenize the shared .toast color literals. Added a theme-invariant --toast-success-bg (green-500 #22C55E @ .95, the legacy toast green deliberately NOT --success emerald, which would shift the hue), --toast-danger-bg (= --danger #EF4444 @ .95) and --toast-fg (white), same rationale as the badge palette. The base .toast and the .toast.error/.toast-error/.toast-success modifiers now reference these tokens instead of raw rgba()/#fff. Appearance-preserving: identical resolved values; solid saturated pills intentionally do not flip in dark mode. profile.js keeps its own showToast pathway (distinct .pf.toast-container wrapper + .toast.error markup) — left as a convergence candidate, NOT migrated, to avoid changing DOM/behavior.
48
+ v1.17.0 — 2026-06-02 — Component unification (#26 recipient badge): add a theme-invariant --badge-*-bg palette (wildcard→danger, ghii→purple, organism→success, gaii→blue; domain #F97316 / node #6B7280 kept as own invariant swatches as they have no palette match) + --badge-fg white, so the profile .badge-* recipient classifier can drop its hardcoded hex (#8b5cf6/#f97316/#6b7280/#3b82f6) and dead light-only fallbacks (var(--success,#22c55e)/var(--danger,#ef4444)). Appearance-preserving: values resolve identically and these solid swatches intentionally do not flip in dark mode.
49
+ v1.16.0 — 2026-06-02 — Component unification (#25 pill base): add a canonical token-only .pill shape primitive (inline-flex chip, --radius-full, compact padding, small bold text, pointer + opacity hover) shape only, no colors; tints come from caller classes. Mirrors the shape the profile .vis-pill already used. The scoped .pf .vis-pill keeps its own shape declaration (the (0,2,0)-beats-bare-.pill specificity trap) but its radius was retokenized to the same --radius-full so the two stay in lockstep.
50
+ v1.15.0 — 2026-06-02 — Component unification (#23 collapsible): add canonical .collapsible / .collapsible-header / .collapsible-chevron (chevron rotates 180° via .open) / .collapsible-body block, backing /components/Collapsible.js. All colors are theme tokens so it flips in dark mode. Establishes the canonical expand/collapse section for the hand-rolled toggles (.expand-btn + .pf-chevron, .scope-advanced-toggle, .pkv-entry-arrow); those bespoke toggles are left in place where their expanded markup is wired into view state.
51
+ v1.14.0 — 2026-06-02 — Component unification (#24 search bar): add canonical .search-bar (flex row, gap, flex:1) + .search-bar-input (flex:1) shell, backing /components/SearchBar.js. The input reuses .input-field for all visuals, so the shell only owns layout. Consolidates the hand-rolled search inputs (.pkv-search / .cap-search-input / .pf-agd-search-input) and the profile .search-bar + .input-field combo; the profile-scoped .pf .search-bar (max-width) coexists.
52
+ v1.13.0 — 2026-06-02 — Component unification (#21 key/value rows): add canonical .kv-row / .kv-label / .kv-value (flex space-between, muted label, emphasized value, --border-subtle divider, last-child no border; .kv-value.mono for monospace ids/amounts), backing /components/KeyValueRow.js. Extracted as the common look of the admin .adm-erow/.adm-hrow and profile .pf-agd-info-row families. Existing per-view classes left in place where their look differs.
53
+ v1.12.0 — 2026-06-02 — Component unification (#13 tables): add canonical .data-table block (full-width collapsed table, uppercase muted header divided by --border, cells by --border-subtle, --bg-surface hover, .mono cell) + generic .scrollable wrapper, backing /components/DataTable.js. Extracted as the common look of .adm table + .pf .consent-table so both converge on tokens that flip in dark mode.
54
+ v1.11.0 — 2026-06-02 — Component unification (#16 tags): add --accent-border token (translucent accent hairline, light rgba(232,86,74,0.2) / dark rgba(255,111,98,0.30)) so tag/badge clones (mk-tag, hb-tag) can replace their hardcoded rgba(232,86,74,0.2) borders and flip in dark mode.
55
+ v1.10.0 — 2026-06-02 — Component unification (#17 pagination): add canonical .pagination (prev / "Page X / Y" / next, token-based) + .pagination-info + .load-more (centered load-more wrapper), backing /components/Pagination.js. Consolidates the .adm-mem-pagination shape and the centered load-more wrapper. The numbered .hb-pagination variant is intentionally left in place (different UI).
56
+ v1.9.0 — 2026-06-02 — Component unification (#18 category cards): add canonical .category-card / -icon / -name / -count (token-based, anchor- and div-safe) so the marketplace .mk-category-* and hobbies .hb-category-* clones converge. Tokenized the formerly hardcoded hover colors (#E8564A → var(--accent); 0 2px 8px rgba(0,0,0,0.06) → var(--shadow-md)) dark-mode fix. Per-view *-categories-grid wrappers kept (column density differs).
57
+ v1.8.0 — 2026-06-02 — Component unification (#11 status dots): add canonical .status-dot base + semantic token modifiers (online/active/healthy/live → success; warn/degraded/syncing/pending → warn; error/offline/dead/down → danger; idle/inactive/detached/muted → text-muted), backing /components/StatusDot.js, so per-view dots (.peer-dot/.pn-status-dot/.ext-status-dot/.dv-dot/.live-dot) converge. Tokenized away hardcoded hex in the former .ext-status-dot (#4ade80/#9ca3af) so dots flip in dark mode.
58
+ v1.7.0 — 2026-06-02 — Component unification (#15 headers): add canonical .section-title/.section-desc (in-page accent header, lifted generic from .pf) + .page-title/.page-subtitle (top-of-view gradient header), all token-based, so per-view title/subtitle clones (mk-/hb-/cl-welcome-/adm-page-title) can converge.
59
+ v1.6.0 — 2026-06-02Component unification (#22): add .card-glass modifier (Card variant="glass") reproducing the former profile .pf-glass-card appearance, fully tokenized (--surface / --border), so profile's GlassCard folds into the canonical Card.
60
+ v1.5.0 — 2026-06-02 — Component unification (#6 stat cards): add canonical .stat-card-value tone (.accent/.success/.danger) + .mono modifiers and a .stat-grid wrapper, so per-view stat clones (mk-stat/hb-stat/dv-stat/wl-stat/...) converge onto .stat-card without losing accent-tint / earned-spent / monospace semantics.
61
+ v1.4.0 — 2026-06-02 — Component unification (#5 inputs): add canonical textarea.input-field (resize/min-height) + select.input-field (cursor) so .input-field works on all field types and views can drop per-view form-input/textarea/select clones (mk-form/hb-form/...).
62
+ v1.3.0 2026-06-02 Component unification (#4): make canonical .btn-* anchor-safe (text-decoration:none) so views can drop their per-view <a>-button clones (mk-btn/hb-btn/...) and use the canonical classes.
63
+ v1.2.0 2026-06-02 Tokenize shell component literals (semantic tints, scrollbar, overlay scrim, morsel pill, lang-btn active, input focus) so the whole shell flips for dark mode.
64
+ v1.1.0 — 2026-06-02 — Add dark theme override + drift-alias layer + .theme-toggle-btn.
65
+ v1.0.0 prior Light theme tokens, base styles, shared components.
66
+ ═══════════════════════════════════════════════════════ */
67
+
68
+ /* ── Reset ── */
69
+ *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
70
+
71
+ /* ── Root Variables ── */
72
+ :root {
73
+ /* Background */
74
+ --bg: #FAFAF8;
75
+ --bg-surface: #F3F4F6;
76
+ --bg-card: #FFFFFF;
77
+ --bg-elevated: #FFFFFF;
78
+
79
+ /* Cards & Surfaces */
80
+ --card-bg: #FFFFFF;
81
+ --card-bg-hover: #FFFFFF;
82
+ --card-bg-solid: #FFFFFF;
83
+ --card-bg-alt: #F3F4F6;
84
+ --card-border: #E5E7EB;
85
+
86
+ /* Accent (coral heart) */
87
+ --accent: #E8564A;
88
+ --accent-bright: #FF6B6B;
89
+ --accent-deep: #E8564A;
90
+ --accent-glow: rgba(232, 86, 74, 0.3);
91
+ --accent-subtle: rgba(232, 86, 74, 0.06);
92
+ --accent-border: rgba(232, 86, 74, 0.2); /* translucent accent hairline for tag/badge edges */
93
+
94
+ /* Love palette (profile gradients — now coral-based) */
95
+ --love1: #E8564A;
96
+ --love2: #FF6B6B;
97
+ --love3: #FF8A80;
98
+ --love4: #FF6B6B;
99
+ --love5: #E8564A;
100
+
101
+ /* Text */
102
+ --text: #1A1A2E;
103
+ --text-bright: #1A1A2E;
104
+ --text-dim: #6B7280;
105
+ --text-muted: #9CA3AF;
106
+
107
+ /* Semantic colors */
108
+ --success: #10B981;
109
+ --warn: #F59E0B;
110
+ --danger: #EF4444;
111
+ --purple: #8B5CF6;
112
+
113
+ /* Accent palette */
114
+ --blue: #3B82F6;
115
+ --mint: #34D399;
116
+ --teal: #06B6D4;
117
+ --pink: #F472B6;
118
+ --orange: #FB923C;
119
+ --yellow: #FBBF24;
120
+
121
+ /* Recipient badge palette (profile permission-recipient classifier:
122
+ wildcard/ghii/organism/domain/node/gaii). Theme-INVARIANT on purpose
123
+ these are saturated solid swatches carrying white text in both themes, so
124
+ they are defined only here and NOT re-overridden in [data-theme="dark"].
125
+ Four map onto existing palette tokens (identical values); domain/node have
126
+ no palette match and are kept as their own invariant swatches rather than
127
+ borrowed from --orange/--text-dim (which differ / flip in dark). */
128
+ --badge-wildcard-bg: var(--danger); /* #EF4444 */
129
+ --badge-ghii-bg: var(--purple); /* #8B5CF6 */
130
+ --badge-organism-bg: var(--success); /* #10B981 */
131
+ --badge-domain-bg: #F97316; /* no palette match (≠ --orange #FB923C) */
132
+ --badge-node-bg: #6B7280; /* invariant gray (≠ --text-dim, which flips dark) */
133
+ --badge-gaii-bg: var(--blue); /* #3B82F6 */
134
+ --badge-fg: #FFFFFF; /* white text on every saturated swatch */
135
+
136
+ /* Toast palette (floating notification pill). Theme-INVARIANT on purpose,
137
+ same rationale as the badge palette above: saturated solid fills carrying
138
+ white text read correctly on any background in both themes, so they are
139
+ defined only here and NOT re-overridden in [data-theme="dark"].
140
+ NOTE: --toast-success-bg is green-500 (#22C55E), the legacy toast green
141
+ it is deliberately NOT --success (emerald #10B981); swapping would shift
142
+ the hue. --toast-danger-bg equals --danger at the legacy 0.95 alpha. */
143
+ --toast-success-bg: rgba(34, 197, 94, 0.95);
144
+ --toast-danger-bg: rgba(239, 68, 68, 0.95); /* = --danger #EF4444 @ .95 */
145
+ --toast-info-bg: rgba(59, 130, 246, 0.95); /* = --blue #3B82F6 @ .95 */
146
+ --toast-warn-bg: rgba(245, 158, 11, 0.95); /* amber-500; pairs with dark fg */
147
+ --toast-fg: #FFFFFF;
148
+ --toast-warn-fg: #1A1A2E; /* white fails contrast on amber */
149
+
150
+ /* Borders */
151
+ --border: #E5E7EB;
152
+ --border-subtle: #F3F4F6;
153
+ --border-focus: #E8564A;
154
+
155
+ /* Radii */
156
+ --radius: 16px;
157
+ --radius-sm: 10px;
158
+ --radius-xs: 6px;
159
+ --radius-xl: 20px;
160
+ --radius-full: 9999px;
161
+
162
+ /* Typography */
163
+ --font: 'DM Sans', system-ui, -apple-system, 'Segoe UI', sans-serif;
164
+ --font-mono: 'JetBrains Mono', 'SF Mono', monospace;
165
+
166
+ /* Layout */
167
+ --nav-height: 56px;
168
+
169
+ /* Shadows */
170
+ --shadow-sm: 0 1px 2px rgba(0,0,0,0.04);
171
+ --shadow-md: 0 4px 12px rgba(0,0,0,0.06);
172
+ --shadow-lg: 0 8px 24px rgba(0,0,0,0.08);
173
+ --shadow-xl: 0 16px 48px rgba(0,0,0,0.12);
174
+ --shadow-heart: 0 4px 14px rgba(232,86,74,0.3);
175
+
176
+ /* Input */
177
+ --bg-input: var(--bg);
178
+ --bg-input-focus: #FFFFFF;
179
+
180
+ /* Controls (outline/ghost buttons, input fields) — a surface DISTINCT from both the page bg and
181
+ white cards: white fill + a clearly visible border, so controls read as controls instead of
182
+ "framed text" that melts into the background. */
183
+ --control-bg: #FFFFFF;
184
+ --control-border: #D1D5DB;
185
+
186
+ /* Code */
187
+ --code-bg: #F3F4F6;
188
+
189
+ /* Semantic tints (chip/banner backgrounds + readable text/border on them).
190
+ The accent semantic colors (--success/--warn/--danger/--info) keep their
191
+ meaning across themes; only these tint surfaces flip. */
192
+ --success-bg: #D1FAE5; --success-fg: #047857; --success-border: #A7F3D0;
193
+ --warn-bg: #FEF3C7; --warn-fg: #B45309; --warn-border: #FDE68A;
194
+ --danger-bg: #FEE2E2; --danger-fg: #DC2626; --danger-border: #FECACA;
195
+ --info-bg: #EFF6FF; --info-fg: #1D4ED8; --info-border: #BFDBFE;
196
+ --purple-bg: #F5F3FF; --purple-fg: #6D28D9; --purple-border: #DDD6FE;
197
+
198
+ /* Shell surfaces */
199
+ --scrollbar-thumb: #D1D5DB;
200
+ --overlay-scrim: rgba(26, 26, 46, 0.4);
201
+ --morsel-bg: linear-gradient(135deg, #FFF1F0, #FFE0DE);
202
+
203
+ /* Decorative view gradients (theme-aware) */
204
+ --pf-hero-gradient: linear-gradient(135deg, #FAFAF8 0%, #FFF1F0 40%, #EFF6FF 100%);
205
+ --pf-cta-gradient: linear-gradient(135deg, #FFF1F0, #EFF6FF);
206
+ --pf-callout-gradient: linear-gradient(135deg, #EEF0FF, #F8F0FF);
207
+
208
+ /* ── Drift-alias layer ──
209
+ Variables referenced across view CSS but never defined (rendered with no
210
+ fallback = broken). Defined here as aliases of the canonical tokens above,
211
+ so they (a) work now and (b) inherit the dark override automatically — no
212
+ entry needed in [data-theme="dark"]. The --sp-* scale is theme-invariant. */
213
+ --card: var(--bg-card);
214
+ --surface: var(--bg-surface);
215
+ --bg-dim: var(--bg-surface);
216
+ --bg-hover: var(--card-bg-hover);
217
+ --muted: var(--text-dim);
218
+ --error: var(--danger);
219
+ --warning: var(--warn);
220
+ --primary: var(--accent);
221
+ --accent-faint: var(--accent-subtle);
222
+ --accent-soft: var(--accent-subtle); /* highlight/hover surfaces (was #FFF0EE) */
223
+ --accent-dark: var(--accent-deep); /* darker coral for button gradients/hovers */
224
+ --border-soft: var(--border); /* was #f0f0ec */
225
+ --bg2: var(--bg-surface); /* secondary panel bg (was #f5f5f5) */
226
+ --surface-hover: var(--bg-surface); /* hover surface (had a stale dark #252540 fallback) */
227
+ --on-inverted: var(--bg); /* readable text on a var(--text) background — inverts opposite to --text */
228
+ --mono: var(--font-mono);
229
+ --sp-1: 4px;
230
+ --sp-2: 8px;
231
+ --sp-3: 12px;
232
+ --sp-4: 16px;
233
+ --sp-5: 20px;
234
+ --sp-6: 24px;
235
+ --sp-8: 32px;
236
+ --sp-12: 48px;
237
+
238
+ /* ── Font-size scale (theme-invariant) ──
239
+ A shared type scale so views stop hardcoding font-size:0.7rem / 0.85rem /
240
+ 1.1rem inline. Adopt in new code; the raw rem values below are the common
241
+ ones already scattered across the view CSS, so migration is a clean swap. */
242
+ --text-xs: 0.72rem;
243
+ --text-sm: 0.82rem;
244
+ --text-base: 0.92rem;
245
+ --text-lg: 1.1rem;
246
+ --text-xl: 1.35rem;
247
+ }
248
+
249
+ /* ── Dark Theme Override ──
250
+ Redefines only the color/depth variables that must flip for dark mode.
251
+ Brand identity (coral accent) preserved; accents brightened for dark
252
+ contrast. Text tiers verified WCAG-AA on both --bg and --bg-card.
253
+ Aliases above point at these tokens, so they invert automatically. */
254
+ [data-theme="dark"] {
255
+ /* Background */
256
+ --bg: #14151A;
257
+ --bg-surface: #23262F;
258
+ --bg-card: #1C1E26;
259
+ --bg-elevated: #23262F;
260
+
261
+ /* Cards & Surfaces */
262
+ --card-bg: #1C1E26;
263
+ --card-bg-hover: #23262F;
264
+ --card-bg-solid: #1C1E26;
265
+ --card-bg-alt: #23262F;
266
+ --card-border: #33363F;
267
+
268
+ /* Accent (coral heart brightened for dark contrast, brand stays coral) */
269
+ --accent: #FF6F62;
270
+ --accent-bright: #FF7A6E;
271
+ --accent-deep: #E8564A;
272
+ --accent-glow: rgba(255, 111, 98, 0.35);
273
+ --accent-subtle: rgba(255, 111, 98, 0.10);
274
+ --accent-border: rgba(255, 111, 98, 0.30); /* translucent accent hairline for tag/badge edges */
275
+
276
+ /* Text */
277
+ --text: #EDEEF2;
278
+ --text-bright: #FFFFFF;
279
+ --text-dim: #A4A9B6;
280
+ --text-muted: #868C9B;
281
+
282
+ /* Borders */
283
+ --border: #33363F;
284
+ --border-subtle: #26282F;
285
+ --border-focus: #FF6F62;
286
+
287
+ /* Shadows (deeper/more opaque so elevation reads on dark surfaces) */
288
+ --shadow-sm: 0 1px 2px rgba(0,0,0,0.40);
289
+ --shadow-md: 0 4px 12px rgba(0,0,0,0.50);
290
+ --shadow-lg: 0 8px 24px rgba(0,0,0,0.55);
291
+ --shadow-xl: 0 16px 48px rgba(0,0,0,0.65);
292
+ --shadow-heart: 0 4px 14px rgba(255,111,98,0.40);
293
+
294
+ /* Input */
295
+ --bg-input: #1C1E26;
296
+ --bg-input-focus: #23262F;
297
+
298
+ /* Controls — slightly lighter than the card surface so they read as raised, with a visible border */
299
+ --control-bg: #262934;
300
+ --control-border: #4A4E5A;
301
+
302
+ /* Code */
303
+ --code-bg: #0E0F13;
304
+
305
+ /* Semantic tints (translucent so they read as native dark surfaces) */
306
+ --success-bg: rgba(16, 185, 129, 0.16); --success-fg: #6EE7B7; --success-border: rgba(16, 185, 129, 0.32);
307
+ --warn-bg: rgba(245, 158, 11, 0.16); --warn-fg: #FCD34D; --warn-border: rgba(245, 158, 11, 0.32);
308
+ --danger-bg: rgba(239, 68, 68, 0.16); --danger-fg: #FCA5A5; --danger-border: rgba(239, 68, 68, 0.34);
309
+ --info-bg: rgba(59, 130, 246, 0.16); --info-fg: #93C5FD; --info-border: rgba(59, 130, 246, 0.32);
310
+ --purple-bg: rgba(139, 92, 246, 0.18); --purple-fg: #C4B5FD; --purple-border: rgba(139, 92, 246, 0.34);
311
+
312
+ /* Shell surfaces */
313
+ --scrollbar-thumb: #3A3D47;
314
+ --overlay-scrim: rgba(0, 0, 0, 0.6);
315
+ --morsel-bg: rgba(255, 111, 98, 0.16);
316
+
317
+ /* Decorative view gradients — subtle dark tints matching the light intent */
318
+ --pf-hero-gradient: linear-gradient(135deg, #16151A 0%, #201820 45%, #15191F 100%);
319
+ --pf-cta-gradient: linear-gradient(135deg, #231A1E, #1A1F28);
320
+ --pf-callout-gradient: linear-gradient(135deg, #1C1A29, #221A29);
321
+ }
322
+
323
+ /* ── Base ── */
324
+ html { scroll-behavior: smooth; height: 100%; }
325
+
326
+ body {
327
+ font-family: var(--font);
328
+ background: var(--bg);
329
+ color: var(--text);
330
+ line-height: 1.6;
331
+ height: 100%;
332
+ margin: 0; /* zero the UA default 8px — with the fixed app-shell frame it would push #app past the viewport */
333
+ /* App-shell: the page (html/body) never scrolls. The topnav is a fixed-height
334
+ flex row and .page-content owns the ONLY scroll region (see #app +
335
+ .page-content). This is what stops view content sliding under the header and
336
+ removes the ~nav-height phantom overscroll that body-scroll + an in-flow
337
+ (sticky) header produced the content fills the space below the header and
338
+ scrolls within it. overflow:hidden also subsumes the old overflow-x clip. */
339
+ overflow: hidden;
340
+ -webkit-font-smoothing: antialiased;
341
+ }
342
+
343
+ a { color: inherit; text-decoration: none; }
344
+
345
+ /* ── Animations ── */
346
+ @keyframes heartPulse {
347
+ 0%, 100% { transform: scale(1); }
348
+ 50% { transform: scale(1.15); }
349
+ }
350
+
351
+ @keyframes twinkle {
352
+ 0%, 100% { opacity: 0.05; transform: scale(0.8); }
353
+ 50% { opacity: 0.6; transform: scale(1.1); }
354
+ }
355
+
356
+ @keyframes livePulse {
357
+ 0%, 100% { opacity: 1; box-shadow: 0 0 8px rgba(34, 197, 94, 0.6); }
358
+ 50% { opacity: 0.4; box-shadow: 0 0 18px rgba(34, 197, 94, 0.9); }
359
+ }
360
+
361
+ @keyframes fadeIn {
362
+ from { opacity: 0; transform: translateY(-4px); }
363
+ to { opacity: 1; transform: translateY(0); }
364
+ }
365
+
366
+ @keyframes fadeInUp {
367
+ from { opacity: 0; transform: translateY(20px); }
368
+ to { opacity: 1; transform: translateY(0); }
369
+ }
370
+
371
+ @keyframes btnGlow {
372
+ 0%, 100% { box-shadow: 0 4px 12px rgba(232, 86, 74, 0.3); }
373
+ 50% { box-shadow: 0 6px 20px rgba(232, 86, 74, 0.4); }
374
+ }
375
+
376
+ @keyframes expandGlow {
377
+ 0%, 100% { box-shadow: 0 0 12px rgba(232, 86, 74, 0.08); }
378
+ 50% { box-shadow: 0 0 24px rgba(232, 86, 74, 0.15); }
379
+ }
380
+
381
+ @keyframes worldOpen {
382
+ from { opacity: 0; transform: translateY(20px); }
383
+ to { opacity: 1; transform: translateY(0); }
384
+ }
385
+
386
+ @keyframes pageIn {
387
+ from { opacity: 0; }
388
+ to { opacity: 1; }
389
+ }
390
+
391
+ @keyframes nebulaDrift {
392
+ 0% { transform: translate(0, 0) scale(1); }
393
+ 100% { transform: translate(30px, -20px) scale(1.15); }
394
+ }
395
+
396
+ @keyframes auroraShift {
397
+ 0% { transform: translateX(-20%) scaleY(1); }
398
+ 100% { transform: translateX(-10%) scaleY(0.8); }
399
+ }
400
+
401
+ @keyframes spin {
402
+ to { transform: rotate(360deg); }
403
+ }
404
+
405
+ /* ── Background layers ── */
406
+ .bg-canvas {
407
+ position: fixed;
408
+ top: 0; left: 0;
409
+ width: 100%; height: 100%;
410
+ z-index: 0;
411
+ pointer-events: none;
412
+ background: var(--bg);
413
+ }
414
+
415
+ .bg-canvas .star { display: none; }
416
+
417
+ /* Aurora waves — hidden in light theme */
418
+ .bg-aurora { display: none; }
419
+ .aurora-wave { display: none; }
420
+
421
+ /* ── App root must sit above bg-canvas (z-index:0) so all non-positioned
422
+ descendants form a stacking context that paints over the fixed background ── */
423
+ #app {
424
+ position: relative;
425
+ z-index: 1;
426
+ /* App-shell frame: a full-viewport flex column — topnav (fixed height) on top,
427
+ .page-content (the scroll region) filling the rest. dvh keeps the frame flush
428
+ with the visual viewport as mobile browser chrome shows/hides. */
429
+ height: 100vh;
430
+ height: 100dvh;
431
+ display: flex;
432
+ flex-direction: column;
433
+ }
434
+
435
+ /* ── Top Navigation ── */
436
+ .topnav {
437
+ /* App-shell: a fixed-height flex row inside #app (no longer sticky — #app
438
+ itself doesn't scroll, so the header stays put for free). z-index keeps the
439
+ header's own dropdowns (notifications, mobile menu) above .page-content. */
440
+ position: relative;
441
+ z-index: 100;
442
+ flex: 0 0 auto;
443
+ height: var(--nav-height);
444
+ /* border-box so the 1px border-bottom is INCLUDED in --nav-height — otherwise the
445
+ header renders 1px taller than the token and every `100dvh - var(--nav-height)`
446
+ scroll region (sidebars) is 1px too tall and can't stay pinned. */
447
+ box-sizing: border-box;
448
+ display: flex;
449
+ align-items: center;
450
+ justify-content: space-between;
451
+ padding: 0 1.5rem;
452
+ background: var(--bg-card);
453
+ border-bottom: 1px solid var(--border);
454
+ }
455
+
456
+ .topnav-brand {
457
+ font-weight: 800;
458
+ font-size: 1.125rem;
459
+ color: var(--text);
460
+ letter-spacing: 0.3px;
461
+ display: flex;
462
+ align-items: center;
463
+ gap: 0;
464
+ text-decoration: none;
465
+ }
466
+
467
+ .topnav-brand .brand-name { white-space: nowrap; }
468
+
469
+ .brand-morsels {
470
+ display: inline-flex;
471
+ align-items: center;
472
+ gap: 2px;
473
+ padding: 3px 10px;
474
+ border-radius: var(--radius-full);
475
+ border: 1px solid var(--accent-glow);
476
+ background: var(--morsel-bg);
477
+ color: var(--accent);
478
+ font-size: 0.75rem;
479
+ font-weight: 700;
480
+ line-height: 1.2;
481
+ }
482
+
483
+ .brand-morsels::before { content: '\2665 '; color: var(--accent); }
484
+
485
+ .topnav-brand .heart {
486
+ color: var(--accent);
487
+ font-style: normal;
488
+ margin: 0 1px;
489
+ font-size: 1rem;
490
+ animation: none;
491
+ filter: none;
492
+ }
493
+ .topnav-brand .brand-at {
494
+ color: var(--accent);
495
+ }
496
+
497
+ .topnav-center {
498
+ display: flex;
499
+ align-items: center;
500
+ gap: 0;
501
+ border: 1px solid var(--border);
502
+ border-radius: var(--radius-xs);
503
+ overflow: hidden;
504
+ padding: 0;
505
+ }
506
+
507
+ .topnav-right {
508
+ display: flex;
509
+ align-items: center;
510
+ gap: 0.75rem;
511
+ }
512
+
513
+ /* Header notification bell + dropdown */
514
+ .notif-bell { position: relative; display: inline-flex; }
515
+ .notif-bell-btn { position: relative; background: none; border: none; cursor: pointer; font-size: 1.15rem; line-height: 1; padding: 4px 6px; border-radius: 8px; }
516
+ .notif-bell-btn:hover { background: var(--bg-dim); }
517
+ .notif-badge { position: absolute; top: -1px; right: -1px; background: var(--accent); color: #fff; border-radius: 10px; font-size: 0.6rem; font-weight: 700; min-width: 15px; height: 15px; padding: 0 3px; display: flex; align-items: center; justify-content: center; }
518
+ .notif-dropdown { position: absolute; right: 0; top: calc(100% + 6px); width: 320px; max-height: 60vh; overflow-y: auto; background: var(--card); border: 1px solid var(--border); border-radius: 10px; box-shadow: 0 10px 30px rgba(0,0,0,0.18); z-index: 1200; }
519
+ .notif-dropdown-head { display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; font-weight: 700; font-size: 0.9rem; color: var(--text); padding: 0.6rem 0.85rem; border-bottom: 1px solid var(--border-subtle); position: sticky; top: 0; background: var(--card); z-index: 1; }
520
+ .notif-clear-all { font-weight: 600; font-size: 0.78rem; color: var(--muted); background: none; border: none; padding: 0.15rem 0.35rem; border-radius: 6px; cursor: pointer; }
521
+ .notif-clear-all:hover:not(:disabled) { color: var(--brand); background: var(--bg-dim); }
522
+ .notif-clear-all:disabled { opacity: 0.6; cursor: default; }
523
+ .notif-empty { padding: 1rem 0.85rem; color: var(--muted); font-size: 0.85rem; }
524
+ .notif-item { display: block; border-bottom: 1px solid var(--border-subtle); }
525
+ .notif-item.unread { background: var(--accent-subtle); }
526
+ .notif-item-main { display: block; width: 100%; text-align: left; background: none; border: none; padding: 0.55rem 0.85rem; cursor: pointer; }
527
+ .notif-item-main:hover { background: var(--bg-dim); }
528
+ .notif-item-title { font-size: 0.85rem; font-weight: 600; color: var(--text); }
529
+ .notif-item-body { font-size: 0.78rem; color: var(--muted); margin-top: 0.15rem; }
530
+ .notif-item-time { font-size: 0.7rem; color: var(--muted); margin-top: 0.2rem; }
531
+ /* Inline notification actions (reply / approve / deny …) */
532
+ .notif-actions { display: flex; flex-wrap: wrap; gap: 0.4rem; padding: 0 0.85rem 0.55rem; }
533
+ .notif-action-btn { font-size: 0.74rem; padding: 0.25rem 0.7rem; border-radius: 7px; line-height: 1.3; }
534
+ .notif-reply { padding: 0 0.85rem 0.6rem; }
535
+ .notif-reply-input { width: 100%; box-sizing: border-box; resize: vertical; font: inherit; font-size: 0.8rem; padding: 0.4rem 0.5rem; border-radius: 7px; border: 1px solid var(--border); background: var(--bg-dim); color: var(--text); }
536
+ .notif-reply-row { display: flex; flex-wrap: wrap; gap: 0.4rem; margin-top: 0.4rem; }
537
+ .notif-result { font-size: 0.76rem; padding: 0.3rem 0.85rem 0.55rem; }
538
+ .notif-result.ok { color: var(--success, #4caf50); }
539
+ .notif-result.err { color: var(--danger, #e0564a); }
540
+ /* Long sender GHIIs / subjects wrap instead of forcing the panel wider than the screen. */
541
+ .notif-item-title, .notif-item-body { overflow-wrap: anywhere; }
542
+ /* Mobile: the 320px-wide, right:0-anchored dropdown runs off the LEFT edge (the bell sits
543
+ mid-right of the bar) and gets clipped by body{overflow-x:hidden}. Pin it to fixed viewport
544
+ insets so it spans the screen width minus small margins, regardless of the bell's position. */
545
+ @media (max-width: 560px) {
546
+ .notif-dropdown {
547
+ position: fixed;
548
+ top: calc(var(--nav-height, 56px) + 4px);
549
+ right: 8px;
550
+ left: 8px;
551
+ width: auto;
552
+ max-height: 72vh;
553
+ }
554
+ }
555
+
556
+ .topnav-right a {
557
+ font-size: 0.84rem;
558
+ color: var(--text-dim);
559
+ text-decoration: none;
560
+ padding: 6px 12px;
561
+ border-radius: var(--radius-xs);
562
+ transition: all 0.15s;
563
+ font-weight: 500;
564
+ border: none;
565
+ }
566
+
567
+ .topnav-right a:hover {
568
+ color: var(--text);
569
+ background: var(--bg-surface);
570
+ }
571
+
572
+ .topnav-right a.active {
573
+ color: var(--accent);
574
+ background: var(--accent-subtle);
575
+ }
576
+
577
+ .topnav-right .profile-link {
578
+ display: none;
579
+ color: var(--accent);
580
+ background: var(--accent-subtle);
581
+ }
582
+
583
+ .topnav-right .profile-link.visible { display: inline-flex; }
584
+
585
+ .header-auth-slot {
586
+ display: inline-flex;
587
+ align-items: center;
588
+ }
589
+
590
+ /* ── Header nav: desktop inline; mobile = hamburger + dropdown (see @media) ── */
591
+ /* .topnav is a FIXED-height row, so the menu must never wrap: a second row does not make
592
+ the bar taller, it spills out below it. Links stay on one line (no "Try / it" splits) and
593
+ the whole bar collapses to the hamburger the moment it stops fitting — see .topnav--compact. */
594
+ .topnav-menu { display: flex; align-items: center; gap: 0.75rem; flex-wrap: nowrap; justify-content: flex-end; }
595
+ .topnav-menu > a { white-space: nowrap; }
596
+ .topnav-burger { display: none; }
597
+ /* Truncate a long GHII in the gold pill so it never blows out the bar (desktop). */
598
+ .aimeat-auth-ghii { max-width: 240px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
599
+
600
+ /* Collapse the header to a hamburger the moment the inline nav stops fitting.
601
+ TWO triggers, one rule set:
602
+ - the media query is the floor (narrow screens always collapse);
603
+ - `.topnav--compact` is set by the header itself when it MEASURES an overflow.
604
+ The measurement matters because how much the bar needs is not a function of screen
605
+ width alone: signing in adds four links, a bell and a wide gold pill, and an operator
606
+ adds Admin on top. A fixed pixel breakpoint cannot know that, which is how a 2000px
607
+ window ended up with a nav hanging out below the bar. */
608
+ @media (max-width: 1180px) {
609
+ .topnav { padding: 0 0.5rem; }
610
+ .topnav-right { gap: 0.5rem; }
611
+ /* Free up bar width so the gold pill never overflows — the morsel count is
612
+ still shown in the profile dashboard. */
613
+ .brand-morsels { display: none !important; }
614
+ }
615
+ .topnav--compact { padding: 0 0.5rem; }
616
+ .topnav--compact .topnav-right { gap: 0.5rem; }
617
+ .topnav--compact .brand-morsels { display: none !important; }
618
+
619
+ @media (max-width: 1180px) {
620
+ .topnav-burger {
621
+ display: inline-flex; align-items: center; justify-content: center;
622
+ width: 38px; height: 34px; padding: 0; font-size: 1.2rem; line-height: 1;
623
+ background: none; color: var(--text); border: 1px solid var(--border);
624
+ border-radius: var(--radius-xs); cursor: pointer;
625
+ }
626
+ .topnav-menu {
627
+ display: none; position: absolute; top: var(--nav-height); left: 0; right: 0;
628
+ flex-direction: column; align-items: stretch; gap: 0;
629
+ background: var(--bg-card); border-bottom: 1px solid var(--border);
630
+ box-shadow: var(--shadow-lg, 0 8px 24px rgba(0,0,0,.18)); padding: 0.4rem;
631
+ /* border-box so the padding + border count INSIDE the cap; content-box let the sheet
632
+ stand 14px past the fold on a short screen. */
633
+ box-sizing: border-box; max-height: calc(100dvh - var(--nav-height)); overflow-y: auto;
634
+ }
635
+ .topnav-menu.open { display: flex; }
636
+ .topnav-menu a { width: 100%; padding: 0.7rem 0.9rem; font-size: 0.95rem; border-radius: var(--radius-xs); }
637
+ .topnav-menu .topnav-center { width: fit-content; margin: 0.45rem 0.6rem 0.2rem; }
638
+ /* Compact gold pill: keep the green dot + Logout, drop the wordy label + GHII. */
639
+ .aimeat-auth-pill .aimeat-auth-label,
640
+ .aimeat-auth-pill .aimeat-auth-ghii { display: none !important; }
641
+ .aimeat-auth-pill { padding: 5px 11px !important; gap: 6px !important; }
642
+ }
643
+ .topnav--compact .topnav-burger {
644
+ display: inline-flex; align-items: center; justify-content: center;
645
+ width: 38px; height: 34px; padding: 0; font-size: 1.2rem; line-height: 1;
646
+ background: none; color: var(--text); border: 1px solid var(--border);
647
+ border-radius: var(--radius-xs); cursor: pointer;
648
+ }
649
+ .topnav--compact .topnav-menu {
650
+ display: none; position: absolute; top: var(--nav-height); left: 0; right: 0;
651
+ flex-direction: column; align-items: stretch; gap: 0;
652
+ background: var(--bg-card); border-bottom: 1px solid var(--border);
653
+ box-shadow: var(--shadow-lg, 0 8px 24px rgba(0,0,0,.18)); padding: 0.4rem;
654
+ box-sizing: border-box; max-height: calc(100dvh - var(--nav-height)); overflow-y: auto;
655
+ }
656
+ .topnav--compact .topnav-menu.open { display: flex; }
657
+ .topnav--compact .topnav-menu a { width: 100%; padding: 0.7rem 0.9rem; font-size: 0.95rem; border-radius: var(--radius-xs); }
658
+ .topnav--compact .topnav-menu .topnav-center { width: fit-content; margin: 0.45rem 0.6rem 0.2rem; }
659
+ .topnav--compact .aimeat-auth-pill .aimeat-auth-label,
660
+ .topnav--compact .aimeat-auth-pill .aimeat-auth-ghii { display: none !important; }
661
+ .topnav--compact .aimeat-auth-pill { padding: 5px 11px !important; gap: 6px !important; }
662
+
663
+ /* Signed-in destinations live behind one "Me" button instead of four more top-level
664
+ links. Four links, a bell and a gold pill is what tipped the bar over. */
665
+ .topnav-me { position: relative; }
666
+ .topnav-me-btn {
667
+ display: inline-flex; align-items: center; gap: 0.3rem; white-space: nowrap;
668
+ padding: 6px 12px; background: none; color: var(--text); font: inherit; font-size: 0.84rem;
669
+ font-weight: 600; border: 1px solid var(--border); border-radius: var(--radius-xs); cursor: pointer;
670
+ }
671
+ .topnav-me-btn:hover { border-color: var(--accent); color: var(--accent); }
672
+ .topnav-me-btn .chev { font-size: 0.7em; opacity: 0.7; }
673
+ .topnav-me-menu {
674
+ position: absolute; top: calc(100% + 6px); right: 0; min-width: 190px; z-index: 200;
675
+ /* Closed by default in the wide bar; the burger sheet overrides this to always-visible
676
+ below, so the dropdown's open state never has to know which mode it is in. */
677
+ display: none; flex-direction: column; padding: 0.3rem;
678
+ background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-sm);
679
+ box-shadow: var(--shadow-lg, 0 8px 24px rgba(0,0,0,.18));
680
+ }
681
+ .topnav-me-menu.open { display: flex; }
682
+ .topnav-me-menu a { padding: 0.55rem 0.75rem; border-radius: var(--radius-xs); font-size: 0.9rem; white-space: nowrap; }
683
+ .topnav-me-menu a:hover { background: var(--bg-surface, var(--bg-dim)); }
684
+ /* Inside the burger sheet the dropdown is pointless — the links just join the list.
685
+ Scoped to --compact ONLY: a bare `.topnav-menu .topnav-me` also matches the wide bar,
686
+ which drops the anchor and slides the dropdown out to the edge of the header. */
687
+ .topnav--compact .topnav-me { position: static; }
688
+ .topnav--compact .topnav-me-btn { display: none; }
689
+ .topnav--compact .topnav-me-menu {
690
+ display: flex; position: static; min-width: 0; border: none; box-shadow: none; padding: 0; background: none;
691
+ }
692
+ @media (max-width: 1180px) {
693
+ .topnav-me-btn { display: none; }
694
+ .topnav-me-menu {
695
+ display: flex; position: static; min-width: 0; border: none; box-shadow: none; padding: 0; background: none;
696
+ }
697
+ }
698
+
699
+ /* ── Language Buttons ── */
700
+ .lang-btn {
701
+ padding: 4px 10px;
702
+ border-radius: 0;
703
+ font-size: 0.75rem;
704
+ font-weight: 600;
705
+ text-decoration: none;
706
+ color: var(--text-muted);
707
+ transition: all 0.15s;
708
+ cursor: pointer;
709
+ background: transparent;
710
+ border: none;
711
+ font-family: var(--font);
712
+ }
713
+
714
+ .lang-btn.active {
715
+ background: var(--text);
716
+ color: var(--on-inverted);
717
+ box-shadow: none;
718
+ }
719
+
720
+ .lang-btn:not(.active):hover {
721
+ color: var(--text);
722
+ background: var(--bg-surface);
723
+ }
724
+
725
+ /* ── Theme Toggle ── */
726
+ .theme-toggle-btn {
727
+ display: inline-flex;
728
+ align-items: center;
729
+ justify-content: center;
730
+ width: 30px;
731
+ height: 26px;
732
+ padding: 0;
733
+ border: none;
734
+ border-right: 1px solid var(--border);
735
+ background: transparent;
736
+ color: var(--text-dim);
737
+ font-size: 0.95rem;
738
+ line-height: 1;
739
+ cursor: pointer;
740
+ transition: all 0.15s;
741
+ font-family: var(--font);
742
+ }
743
+
744
+ .theme-toggle-btn:hover {
745
+ color: var(--accent);
746
+ background: var(--bg-surface);
747
+ }
748
+
749
+ /* ── Buttons ── */
750
+ /* Button classes are anchor-safe: applied to <a> they render as buttons,
751
+ not underlined links (lets views use canonical .btn-* on link-buttons). */
752
+ .btn-primary, .btn-outline, .btn-ghost, .btn-danger, .btn-danger-solid,
753
+ .btn-success, .btn-info {
754
+ text-decoration: none;
755
+ }
756
+ .btn-primary {
757
+ padding: 8px 20px;
758
+ background: linear-gradient(135deg, #E8564A 0%, #FF6B6B 100%);
759
+ color: #FFFFFF;
760
+ border: none;
761
+ border-radius: var(--radius-sm);
762
+ font-size: 0.84rem;
763
+ font-weight: 600;
764
+ font-family: var(--font);
765
+ cursor: pointer;
766
+ transition: all 0.2s;
767
+ box-shadow: var(--shadow-heart);
768
+ letter-spacing: 0;
769
+ animation: none;
770
+ }
771
+
772
+ .btn-primary:hover {
773
+ transform: translateY(-1px);
774
+ box-shadow: 0 6px 20px rgba(232, 86, 74, 0.35);
775
+ }
776
+
777
+ .btn-primary:active {
778
+ transform: translateY(0);
779
+ }
780
+
781
+ .btn-primary.success {
782
+ background: linear-gradient(135deg, #10B981, #059669);
783
+ box-shadow: 0 4px 12px rgba(16, 185, 129, 0.25);
784
+ animation: none;
785
+ }
786
+
787
+ .btn-outline {
788
+ padding: 0.65rem 1.5rem;
789
+ background: var(--control-bg);
790
+ border: 1px solid var(--control-border);
791
+ border-radius: var(--radius-sm);
792
+ color: var(--text-dim);
793
+ font-size: 0.84rem;
794
+ font-weight: 500;
795
+ font-family: var(--font);
796
+ cursor: pointer;
797
+ transition: all 0.15s;
798
+ letter-spacing: 0;
799
+ box-shadow: var(--shadow-sm);
800
+ animation: none;
801
+ }
802
+
803
+ .btn-outline:hover {
804
+ border-color: var(--text-muted);
805
+ color: var(--text);
806
+ background: var(--control-bg);
807
+ box-shadow: var(--shadow-sm);
808
+ transform: none;
809
+ }
810
+
811
+ .btn-sm {
812
+ padding: 0.35rem 0.75rem;
813
+ font-size: 0.8rem;
814
+ border-radius: var(--radius-xs);
815
+ }
816
+
817
+ .btn-success {
818
+ padding: 0.65rem 1.5rem;
819
+ background: linear-gradient(135deg, #10B981, #059669);
820
+ color: #fff;
821
+ border: none;
822
+ border-radius: var(--radius-sm);
823
+ font-size: 0.9rem;
824
+ font-weight: 600;
825
+ font-family: var(--font);
826
+ cursor: pointer;
827
+ transition: all 0.2s;
828
+ box-shadow: 0 4px 12px rgba(16, 185, 129, 0.2);
829
+ }
830
+
831
+ .btn-success:hover {
832
+ transform: translateY(-1px);
833
+ box-shadow: 0 6px 20px rgba(16, 185, 129, 0.3);
834
+ }
835
+
836
+ .btn-info {
837
+ padding: 0.65rem 1.5rem;
838
+ background: #3B82F6;
839
+ color: #fff;
840
+ border: none;
841
+ border-radius: var(--radius-sm);
842
+ font-size: 0.84rem;
843
+ font-weight: 600;
844
+ font-family: var(--font);
845
+ cursor: pointer;
846
+ transition: all 0.2s;
847
+ box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2);
848
+ }
849
+ .btn-info:hover {
850
+ transform: translateY(-1px);
851
+ box-shadow: 0 6px 20px rgba(59, 130, 246, 0.3);
852
+ }
853
+
854
+ .btn-danger {
855
+ background: var(--danger-bg);
856
+ color: var(--danger-fg);
857
+ border: 1px solid var(--danger-border);
858
+ }
859
+
860
+ .btn-ghost {
861
+ display: inline-flex;
862
+ align-items: center;
863
+ gap: 0.35rem;
864
+ padding: 7px 16px;
865
+ border-radius: var(--radius-sm);
866
+ border: 1px solid var(--control-border);
867
+ background: var(--control-bg);
868
+ color: var(--text-dim);
869
+ text-decoration: none;
870
+ font-size: 0.81rem;
871
+ font-weight: 500;
872
+ transition: all 0.15s;
873
+ }
874
+
875
+ .btn-ghost:hover {
876
+ border-color: var(--text-muted);
877
+ color: var(--text);
878
+ background: var(--control-bg);
879
+ }
880
+
881
+ /* ── Cards ── */
882
+ .card {
883
+ background: var(--bg-card);
884
+ border: 1px solid var(--border);
885
+ border-radius: var(--radius);
886
+ padding: 2rem;
887
+ box-shadow: var(--shadow-sm);
888
+ transition: all 0.2s ease;
889
+ }
890
+
891
+ .card:hover {
892
+ box-shadow: var(--shadow-lg);
893
+ transform: translateY(-2px);
894
+ }
895
+
896
+ .card-solid {
897
+ background: var(--bg-card);
898
+ border: 1px solid var(--border);
899
+ border-radius: var(--radius);
900
+ padding: 1.5rem;
901
+ }
902
+
903
+ /* Glass variant (Card variant="glass") — reproduces the former profile
904
+ .pf-glass-card appearance, fully tokenized. Overrides .card defaults
905
+ (2rem padding, var(--radius), shadow) with the glass card's flatter geometry. */
906
+ .card-glass {
907
+ padding: 16px;
908
+ border-radius: 8px;
909
+ background: var(--surface);
910
+ border: 1px solid var(--border);
911
+ margin-bottom: 1rem;
912
+ box-shadow: none;
913
+ }
914
+ /* Glass card is flat — neutralize the generic .card:hover lift so it looks
915
+ identical to the former static .pf-glass-card. */
916
+ .card-glass:hover {
917
+ box-shadow: none;
918
+ transform: none;
919
+ }
920
+
921
+ /* ── Content Group Container ── */
922
+ .content-group {
923
+ position: relative;
924
+ z-index: 1;
925
+ max-width: 560px;
926
+ margin: 3rem auto 0;
927
+ padding: 2rem 1.5rem;
928
+ border: 1px solid var(--border);
929
+ border-radius: var(--radius);
930
+ background: var(--bg-card);
931
+ box-shadow: var(--shadow-md);
932
+ }
933
+
934
+ .content-group > *:first-child { margin-top: 0; }
935
+ .content-group > *:last-child { margin-bottom: 0; }
936
+
937
+ /* ── Stat Cards ── */
938
+ .stat-card {
939
+ border: 1px solid var(--border);
940
+ border-radius: var(--radius-sm);
941
+ padding: 12px 20px;
942
+ background: var(--bg-card);
943
+ box-shadow: var(--shadow-sm);
944
+ text-align: center;
945
+ }
946
+
947
+ .stat-card-label {
948
+ font-size: 0.66rem;
949
+ color: var(--text-muted);
950
+ text-transform: uppercase;
951
+ letter-spacing: 0.5px;
952
+ font-weight: 600;
953
+ }
954
+
955
+ .stat-card-value {
956
+ font-size: 1.35rem;
957
+ color: var(--text);
958
+ font-weight: 800;
959
+ margin-top: 0.15rem;
960
+ }
961
+ /* Value tone + mono modifiers let accent-tinted / earned-spent / monospace stat
962
+ clones converge onto canonical .stat-card-value without losing their semantics. */
963
+ .stat-card-value.accent { color: var(--accent); }
964
+ .stat-card-value.success { color: var(--success-fg); }
965
+ .stat-card-value.danger { color: var(--danger-fg); }
966
+ .stat-card-value.warn { color: var(--warn); }
967
+ .stat-card-value.purple { color: var(--purple); }
968
+ .stat-card-value.blue { color: var(--blue); }
969
+ .stat-card-value.mono { font-family: var(--font-mono, monospace); }
970
+ /* Placeholder while the counter's fetch is still in flight. A hard 0 on a live counter
971
+ reads as "nothing runs here", so the card stays quiet until it knows the number. */
972
+ .stat-card-value.is-loading { color: var(--text-muted); opacity: 0.45; }
973
+ /* Optional second line under a counter (e.g. "2 online now"). */
974
+ .stat-card-sub { font-size: 0.68rem; color: var(--text-muted); margin-top: 0.2rem; }
975
+ /* Shared responsive stat grid wrapper. */
976
+ .stat-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 12px; margin-bottom: 32px; }
977
+
978
+ /* ── Category Card ── */
979
+ /* Canonical clickable directory tile (icon + name + optional count) shared by the
980
+ marketplace category grid and the hobbies interest grid. Works on both <a> and
981
+ <div> (text-decoration:none keeps anchors un-underlined). The grid wrapper stays
982
+ per-view because column density differs (marketplace 160px / hobbies 200px min). */
983
+ .category-card {
984
+ background: var(--bg-card); border: 1px solid var(--border);
985
+ border-radius: var(--radius); padding: 20px; text-align: center; text-decoration: none;
986
+ transition: all 0.2s; cursor: pointer;
987
+ }
988
+ .category-card:hover { background: var(--bg-surface); border-color: var(--accent); box-shadow: var(--shadow-md); }
989
+ .category-icon { font-size: 2rem; margin-bottom: 8px; }
990
+ .category-name { font-size: 0.95rem; font-weight: 600; color: var(--text); }
991
+ .category-count { font-size: 0.78rem; color: var(--text-muted); margin-top: 4px; }
992
+
993
+ /* ── Badges ── */
994
+ .badge {
995
+ display: inline-block;
996
+ padding: 2px 8px;
997
+ border-radius: var(--radius-full);
998
+ font-size: 0.66rem;
999
+ font-weight: 600;
1000
+ text-transform: uppercase;
1001
+ letter-spacing: 0.3px;
1002
+ }
1003
+
1004
+ .badge-success { background: var(--success-bg); color: var(--success-fg); }
1005
+ .badge-warn { background: var(--warn-bg); color: var(--warn-fg); }
1006
+ .badge-danger { background: var(--danger-bg); color: var(--danger-fg); }
1007
+ .badge-info { background: var(--info-bg); color: var(--info-fg); }
1008
+
1009
+ /* ── Pill (canonical shape primitive) ──
1010
+ The common pill-chip *shape* only — no colors. Small inline-flex chip with
1011
+ pill radius, compact padding, small bold text, pointer cursor and a soft
1012
+ opacity hover. Colors are supplied by the caller's own tint classes (e.g.
1013
+ .vis-public / .vis-private) so this base stays theme-neutral. Matches the
1014
+ shape the profile visibility pill (.vis-pill) already used. New pill-shaped
1015
+ chips should build on this base + a tint class instead of re-declaring the
1016
+ shape. Note: the profile pills are styled via the higher-specificity
1017
+ `.pf .vis-pill`, which keeps its own shape declaration to avoid the
1018
+ scoped-override specificity trap; it now references the same --radius-full
1019
+ token so the two stay in lockstep. */
1020
+ .pill {
1021
+ display: inline-flex;
1022
+ align-items: center;
1023
+ border: none;
1024
+ cursor: pointer;
1025
+ padding: 2px 8px;
1026
+ border-radius: var(--radius-full);
1027
+ font-size: 0.7rem;
1028
+ font-weight: 600;
1029
+ transition: opacity 0.15s;
1030
+ }
1031
+ .pill:hover { opacity: 0.8; }
1032
+
1033
+ /* ── Segmented control (canonical) ──
1034
+ A row of buttons in a bordered pill; the active segment is filled with the accent. Token-only so
1035
+ it flips in dark mode. The start of the deferred #8 tab-family consolidation use this for new
1036
+ in-place view toggles (Draft/Published, picker tabs, scope toggles) instead of a per-view clone. */
1037
+ .seg { display: inline-flex; border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; background: var(--card); }
1038
+ .seg-btn { padding: 0.25rem 0.7rem; font-size: 0.8rem; line-height: 1.3; background: transparent; color: var(--text-dim); border: none; cursor: pointer; transition: background 0.15s, color 0.15s; }
1039
+ .seg-btn + .seg-btn { border-left: 1px solid var(--border); }
1040
+ .seg-btn:hover:not(:disabled) { background: var(--bg-surface); }
1041
+ .seg-btn.active { background: var(--accent); color: #fff; }
1042
+ .seg-btn:disabled { opacity: 0.6; cursor: default; }
1043
+
1044
+ /* ── Status dot (canonical) ──
1045
+ Small circle whose color is driven by a semantic status token. Consolidates
1046
+ the bespoke per-view dots (.live-dot, .peer-dot, .pn-status-dot,
1047
+ .ext-status-dot, .dv-dot). Component: /components/StatusDot.js.
1048
+ All colors are theme tokens so the dot flips correctly in dark mode. */
1049
+ .status-dot {
1050
+ display: inline-block;
1051
+ width: 8px;
1052
+ height: 8px;
1053
+ border-radius: 50%;
1054
+ flex-shrink: 0;
1055
+ background: var(--text-muted);
1056
+ }
1057
+ .status-dot--online,
1058
+ .status-dot--active,
1059
+ .status-dot--healthy,
1060
+ .status-dot--alive,
1061
+ .status-dot--live { background: var(--success); }
1062
+ .status-dot--warn,
1063
+ .status-dot--degraded,
1064
+ .status-dot--syncing,
1065
+ .status-dot--pending { background: var(--warn); }
1066
+ .status-dot--error,
1067
+ .status-dot--offline,
1068
+ .status-dot--dead,
1069
+ .status-dot--down { background: var(--danger); }
1070
+ .status-dot--idle,
1071
+ .status-dot--inactive,
1072
+ .status-dot--detached,
1073
+ .status-dot--muted { background: var(--text-muted); }
1074
+ /* Online keeps the soft glow the former .pn-status-dot.online had */
1075
+ .status-dot--online { box-shadow: 0 0 6px rgba(34, 197, 94, 0.4); }
1076
+ /* Live additionally pulses (matches former .live-dot behaviour) */
1077
+ .status-dot--live {
1078
+ box-shadow: 0 0 8px rgba(34, 197, 94, 0.6);
1079
+ animation: livePulse 1.5s ease-in-out infinite;
1080
+ }
1081
+
1082
+ /* ── Presence indicator (canonical) ──
1083
+ Backed by /components/PresenceDot.js. A small availability dot (+ optional
1084
+ label) shown next to a person across views. Colors are theme tokens so the
1085
+ dot flips in dark mode: available→success, busy→danger, away→warn,
1086
+ offline/unknown→muted (unknown is extra-faded). */
1087
+ .presence {
1088
+ display: inline-flex;
1089
+ align-items: center;
1090
+ gap: 6px;
1091
+ line-height: 1;
1092
+ }
1093
+ .presence-dot {
1094
+ display: inline-block;
1095
+ width: 8px;
1096
+ height: 8px;
1097
+ border-radius: 50%;
1098
+ flex-shrink: 0;
1099
+ background: var(--text-muted);
1100
+ }
1101
+ .presence--md .presence-dot { width: 10px; height: 10px; }
1102
+ .presence-dot--available { background: var(--success); box-shadow: 0 0 6px rgba(16, 185, 129, 0.45); }
1103
+ .presence-dot--busy { background: var(--danger); }
1104
+ .presence-dot--away { background: var(--warn); }
1105
+ .presence-dot--offline { background: var(--text-muted); }
1106
+ .presence-dot--unknown { background: var(--text-muted); opacity: 0.4; }
1107
+ .presence-label {
1108
+ font-size: 0.85em;
1109
+ color: var(--text-dim);
1110
+ }
1111
+
1112
+ /* ── Key/value detail row (canonical) ──
1113
+ Backed by /components/KeyValueRow.js. A label/value pair laid out flex
1114
+ space-between: muted label on the left, emphasized value on the right,
1115
+ separated by a subtle bottom border (none on the last row). Consolidates the
1116
+ common label+value-pair shape (admin .adm-erow / .adm-hrow, profile
1117
+ .pf-agd-info-row). All colors are theme tokens so it flips correctly in dark
1118
+ mode. `.kv-value.mono` renders the value in the monospace font (ids, hashes,
1119
+ amounts). The existing per-view classes are intentionally left in place where
1120
+ their look differs. */
1121
+ .kv-row {
1122
+ display: flex;
1123
+ align-items: center;
1124
+ justify-content: space-between;
1125
+ gap: 0.5rem;
1126
+ padding: 7px 0;
1127
+ border-bottom: 1px solid var(--border-subtle);
1128
+ font-size: 0.84rem;
1129
+ }
1130
+ .kv-row:last-child { border-bottom: none; }
1131
+ .kv-label {
1132
+ color: var(--text-dim);
1133
+ flex-shrink: 0;
1134
+ }
1135
+ .kv-value {
1136
+ color: var(--text);
1137
+ font-weight: 600;
1138
+ text-align: right;
1139
+ word-break: break-word;
1140
+ }
1141
+ .kv-value.mono {
1142
+ font-family: var(--font-mono);
1143
+ font-size: 0.81rem;
1144
+ }
1145
+
1146
+ /* ── Pagination + Load more (canonical) ──
1147
+ Backed by /components/Pagination.js. `.pagination` is the prev / "Page X / Y"
1148
+ / next control (arrow buttons + disabled ends); `.load-more` centers a single
1149
+ "load more" button. Consolidates the near-identical .adm-mem-pagination shape
1150
+ and the centered load-more wrapper. All colors are theme tokens so both flip
1151
+ correctly in dark mode. The numbered .hb-pagination variant is intentionally
1152
+ left in place (different UI). */
1153
+ .pagination {
1154
+ display: flex;
1155
+ align-items: center;
1156
+ justify-content: center;
1157
+ gap: 12px;
1158
+ margin-top: 8px;
1159
+ }
1160
+ .pagination-info {
1161
+ font-size: 0.85rem;
1162
+ color: var(--text-dim);
1163
+ }
1164
+ .load-more {
1165
+ text-align: center;
1166
+ margin-top: 1.5rem;
1167
+ }
1168
+
1169
+ /* ── Collapsible (canonical) ──
1170
+ Backed by /components/Collapsible.js. A clickable header (title + a chevron
1171
+ that rotates 180° when open) with the body shown only while open. This is the
1172
+ canonical shape for the hand-rolled expand/collapse toggles scattered across
1173
+ views (.expand-btn + .pf-chevron, .scope-advanced-toggle, .pkv-entry-arrow).
1174
+ All colors are theme tokens so it flips correctly in dark mode. Callers own
1175
+ the open state (controlled component). The bespoke per-view toggles are left
1176
+ in place where their expanded markup is wired into view state; this block is
1177
+ the target for new collapsible sections. */
1178
+ .collapsible {
1179
+ border: 1px solid var(--border);
1180
+ border-radius: var(--radius-sm);
1181
+ margin-bottom: 0.75rem;
1182
+ }
1183
+ .collapsible-header {
1184
+ display: flex;
1185
+ align-items: center;
1186
+ justify-content: space-between;
1187
+ gap: 0.5rem;
1188
+ width: 100%;
1189
+ padding: 0.6rem 0.85rem;
1190
+ background: none;
1191
+ border: none;
1192
+ border-radius: var(--radius-sm);
1193
+ color: var(--text);
1194
+ font-family: var(--font);
1195
+ font-size: 0.85rem;
1196
+ font-weight: 600;
1197
+ text-align: left;
1198
+ cursor: pointer;
1199
+ transition: color 0.2s;
1200
+ }
1201
+ .collapsible-header:hover {
1202
+ color: var(--accent);
1203
+ }
1204
+ .collapsible-chevron {
1205
+ display: inline-block;
1206
+ flex-shrink: 0;
1207
+ font-size: 0.7rem;
1208
+ color: var(--text-dim);
1209
+ transition: transform 0.2s;
1210
+ }
1211
+ .collapsible-chevron.open {
1212
+ transform: rotate(180deg);
1213
+ }
1214
+ .collapsible-body {
1215
+ padding: 0 0.85rem 0.75rem;
1216
+ }
1217
+
1218
+ /* ── Data table (canonical) ──
1219
+ Generic table look backed by /components/DataTable.js. Extracted as the common
1220
+ denominator of the admin `.adm table` and profile `.pf .consent-table` /
1221
+ `.audit-table` shapes: full-width collapsed borders, an uppercase muted header
1222
+ row divided by `--border`, cells divided by `--border-subtle`, a subtle hover,
1223
+ and a `.mono` cell modifier. All colors are theme tokens so the table flips
1224
+ correctly in dark mode. The `.scrollable` wrapper caps height (admin reuses its
1225
+ own `.adm .scrollable`; this generic one applies outside `.adm`). Callers supply
1226
+ their own container (`.card` / `.adm-card`); this block adds none. */
1227
+ .data-table { width: 100%; border-collapse: collapse; font-size: .81rem; }
1228
+ .data-table th {
1229
+ text-align: left;
1230
+ color: var(--text-muted);
1231
+ font-weight: 600;
1232
+ padding: 8px 10px;
1233
+ border-bottom: 1px solid var(--border);
1234
+ white-space: nowrap;
1235
+ font-size: .69rem;
1236
+ text-transform: uppercase;
1237
+ letter-spacing: .3px;
1238
+ }
1239
+ .data-table td {
1240
+ padding: 8px 10px;
1241
+ border-bottom: 1px solid var(--border-subtle);
1242
+ color: var(--text-dim);
1243
+ }
1244
+ .data-table tr:hover td { background: var(--bg-surface); }
1245
+ .data-table .mono { font-family: var(--font-mono); font-size: .78rem; }
1246
+ /* Generic scrollable wrapper (the admin-scoped `.adm .scrollable` already exists
1247
+ for admin tables; this one covers DataTable used outside `.adm`). */
1248
+ .scrollable { max-height: 600px; overflow-y: auto; }
1249
+
1250
+ /* ── Chart canvas wrapper (components/UsageChart.js) ──
1251
+ Chart.js runs with maintainAspectRatio:false, so it needs a sized relative box.
1252
+ Height is supplied per-instance via the --usage-chart-h custom property. */
1253
+ .usage-chart { position: relative; width: 100%; height: var(--usage-chart-h, 220px); }
1254
+
1255
+ /* ── Section divider ── */
1256
+ .section-divider {
1257
+ position: relative;
1258
+ z-index: 1;
1259
+ max-width: 520px;
1260
+ margin: 1rem auto 1.5rem;
1261
+ height: 1px;
1262
+ background: var(--border);
1263
+ }
1264
+
1265
+ /* ── Inputs ── */
1266
+ .input-field {
1267
+ width: 100%;
1268
+ padding: 11px 14px;
1269
+ background: var(--control-bg);
1270
+ border: 1.5px solid var(--control-border);
1271
+ border-radius: var(--radius-sm);
1272
+ color: var(--text);
1273
+ font-family: var(--font);
1274
+ font-size: 0.94rem;
1275
+ outline: none;
1276
+ transition: all 0.15s;
1277
+ }
1278
+
1279
+ .input-field::placeholder { color: var(--text-muted); }
1280
+
1281
+ .input-field:focus {
1282
+ border-color: var(--accent);
1283
+ box-shadow: 0 0 0 3px var(--accent-subtle);
1284
+ background: var(--bg-input-focus);
1285
+ }
1286
+
1287
+ /* Textarea + select behavior so .input-field works on all field types (lets views
1288
+ drop per-view form-input/textarea/select clones). */
1289
+ textarea.input-field { resize: vertical; min-height: 80px; }
1290
+ select.input-field { cursor: pointer; }
1291
+
1292
+ /* ── Search bar (canonical shell) ──
1293
+ Backed by /components/SearchBar.js. `.search-bar` is the flex row that wraps a
1294
+ single `type="search"` input; the input itself reuses `.input-field` so all
1295
+ visuals (border, focus ring, placeholder, dark-mode flip) are token-driven and
1296
+ need no per-view restyling. `.search-bar-input` only makes the input grow to
1297
+ fill the row. Consolidates the hand-rolled search inputs (.pkv-search,
1298
+ .cap-search-input, .pf-agd-search-input) and the profile .search-bar +
1299
+ .input-field combo. The profile-scoped `.pf .search-bar` rule (with max-width)
1300
+ coexists; this base provides the layout everywhere else. */
1301
+ .search-bar {
1302
+ display: flex;
1303
+ align-items: center;
1304
+ gap: 0.5rem;
1305
+ flex: 1;
1306
+ }
1307
+ .search-bar-input { flex: 1; }
1308
+
1309
+ .prompt-box {
1310
+ width: 100%;
1311
+ min-height: 140px;
1312
+ max-height: 300px;
1313
+ padding: 1rem 1.2rem;
1314
+ background: var(--bg);
1315
+ border: 1.5px solid var(--border);
1316
+ border-radius: var(--radius-sm);
1317
+ color: var(--text);
1318
+ font-family: var(--font-mono);
1319
+ font-size: 0.8rem;
1320
+ line-height: 1.7;
1321
+ resize: vertical;
1322
+ outline: none;
1323
+ text-align: left;
1324
+ }
1325
+
1326
+ .prompt-box:focus {
1327
+ border-color: var(--accent);
1328
+ box-shadow: 0 0 0 3px var(--accent-subtle);
1329
+ }
1330
+
1331
+ /* ── Spinner ── */
1332
+ .spinner {
1333
+ display: inline-block;
1334
+ width: 1.25em;
1335
+ height: 1.25em;
1336
+ border: 2px solid var(--border);
1337
+ border-top-color: var(--accent);
1338
+ border-radius: 50%;
1339
+ animation: spin 0.6s linear infinite;
1340
+ }
1341
+
1342
+ /* ── Empty state ── */
1343
+ .empty {
1344
+ padding: 1.5rem;
1345
+ text-align: center;
1346
+ font-size: 0.85rem;
1347
+ color: var(--text-muted);
1348
+ font-style: italic;
1349
+ }
1350
+ /* Optional icon for the canonical EmptyState component (#9). */
1351
+ .empty-icon { display: block; font-size: 2.5rem; opacity: 0.4; margin-bottom: 0.5rem; font-style: normal; }
1352
+ /* Richer EmptyState slots (#9 v1.1): bold title, body line, and an action row.
1353
+ Lets the pkv title+desc, pwv icon+action gates, and mk/hb icon+text triads
1354
+ fold into the one component. Body keeps the base .empty italic; title/action
1355
+ are normal weight/style. */
1356
+ .empty-title { font-style: normal; font-weight: 600; font-size: var(--text-base); color: var(--text); margin-bottom: 0.25rem; }
1357
+ .empty-text { margin: 0 auto; max-width: 32rem; }
1358
+ .empty-action { margin-top: 0.85rem; font-style: normal; display: flex; gap: 0.5rem; justify-content: center; flex-wrap: wrap; }
1359
+
1360
+ /* ── Muted / meta text utilities ──
1361
+ Shared replacements for the ~8 bespoke `.xx-muted` and ~30 `.xx-*-meta`
1362
+ clones scattered across the view CSS. Colors are tokens so they flip in dark
1363
+ mode. `.muted`/`.text-dim` dim to the mid tier; `.text-faint` to the dimmest;
1364
+ `.meta` is the small dim caption used under cards/rows. */
1365
+ .muted, .text-dim { color: var(--text-dim); }
1366
+ .text-faint { color: var(--text-muted); }
1367
+ .meta { font-size: var(--text-sm); color: var(--text-dim); }
1368
+
1369
+ /* ── Toggle Switch (canonical /components/ToggleSwitch.js, #14) ── */
1370
+ .toggle { display: flex; align-items: center; gap: 10px; cursor: pointer; }
1371
+ .toggle-input { position: absolute; opacity: 0; width: 0; height: 0; }
1372
+ .toggle-slider {
1373
+ position: relative; display: inline-block; width: 44px; height: 24px;
1374
+ background: var(--border); border-radius: 12px; transition: background 0.2s;
1375
+ }
1376
+ .toggle-slider::after {
1377
+ content: ''; position: absolute; top: 2px; left: 2px;
1378
+ width: 20px; height: 20px; border-radius: 50%; background: #fff;
1379
+ transition: transform 0.2s; box-shadow: 0 1px 3px rgba(0,0,0,0.15);
1380
+ }
1381
+ .toggle-input:checked + .toggle-slider { background: var(--success); }
1382
+ .toggle-input:checked + .toggle-slider::after { transform: translateX(20px); }
1383
+ .toggle-label { font-size: .85rem; color: var(--text); }
1384
+
1385
+ /* ── Scrollbar ── */
1386
+ ::-webkit-scrollbar { width: 6px; }
1387
+ ::-webkit-scrollbar-track { background: transparent; }
1388
+ ::-webkit-scrollbar-thumb { background: var(--scrollbar-thumb); border-radius: 4px; }
1389
+
1390
+ /* ── Footer ── */
1391
+ .footer {
1392
+ position: relative;
1393
+ z-index: 1;
1394
+ text-align: center;
1395
+ padding: 3rem 1.25rem 3.5rem;
1396
+ font-size: 0.82rem;
1397
+ color: var(--text-dim);
1398
+ line-height: 1.7;
1399
+ max-width: 500px;
1400
+ margin: 0 auto;
1401
+ }
1402
+
1403
+ .footer .heart-icon {
1404
+ display: inline-block;
1405
+ color: var(--accent);
1406
+ font-size: 0.85rem;
1407
+ margin: 0 0.1rem;
1408
+ }
1409
+
1410
+ /* ── Page entrance ── */
1411
+ /* App-shell scroll region: fills the space under the topnav and owns the only
1412
+ scroll. min-height:0 lets the flex child shrink so overflow-y actually scrolls;
1413
+ overflow-x:hidden replaces the clip that used to live on body. */
1414
+ .page-content { flex: 1 1 auto; min-height: 0; overflow-y: auto; overflow-x: hidden; animation: pageIn 0.8s ease; }
1415
+
1416
+ /* ── Responsive ── */
1417
+ @media (max-width: 480px) {
1418
+ .content-group { margin-top: 2rem; padding: 1.5rem 1rem; }
1419
+ .topnav { padding: 0 0.4rem; }
1420
+ }
1421
+
1422
+ /* ═══════════════════════════════════════════════════════
1423
+ Shared Components
1424
+ ═══════════════════════════════════════════════════════ */
1425
+
1426
+ /* ── Alert ── */
1427
+ .alert {
1428
+ display: flex; align-items: center; gap: 0.5rem;
1429
+ padding: 0.75rem 1rem; border-radius: var(--radius-xs);
1430
+ font-size: 0.85rem; margin-bottom: 1rem;
1431
+ }
1432
+ .alert-icon { font-weight: 700; flex-shrink: 0; }
1433
+ .alert-msg { flex: 1; }
1434
+ .alert-close { background: none; border: none; color: inherit; cursor: pointer; font-size: 1rem; padding: 0 0.25rem; opacity: 0.7; }
1435
+ .alert-close:hover { opacity: 1; }
1436
+ .alert-success { background: var(--success-bg); color: var(--success-fg); border: 1px solid var(--success-border); }
1437
+ .alert-error { background: var(--danger-bg); color: var(--danger-fg); border: 1px solid var(--danger-border); }
1438
+ .alert-warn { background: var(--warn-bg); color: var(--warn-fg); border: 1px solid var(--warn-border); }
1439
+ .alert-info { background: var(--info-bg); color: var(--info-fg); border: 1px solid var(--info-border); }
1440
+
1441
+ /* ── Toast ── */
1442
+ .toast {
1443
+ /* width: max-content (NOT fit-content/auto): a fixed box anchored at left:50%
1444
+ shrink-to-fits against the remaining 50vw, capping the pill at half the
1445
+ viewport — a tall skinny tower on phones. max-width does the real capping. */
1446
+ position: fixed; bottom: 2rem; left: 50%; transform: translateX(-50%);
1447
+ z-index: 9999; max-width: min(92vw, 40rem); width: max-content;
1448
+ padding: 0.7rem 1.15rem; border-radius: var(--radius-sm);
1449
+ font-size: 0.9rem; font-weight: 600; line-height: 1.45;
1450
+ text-align: center; text-wrap: pretty; overflow-wrap: anywhere; white-space: normal;
1451
+ background: var(--toast-success-bg); color: var(--toast-fg);
1452
+ box-shadow: var(--shadow-xl);
1453
+ animation: toastIn 0.3s ease, toastOut 0.4s ease 2.4s forwards;
1454
+ pointer-events: auto; box-sizing: border-box;
1455
+ }
1456
+ .toast.error, .toast-error { background: var(--toast-danger-bg); color: var(--toast-fg); }
1457
+ .toast-success { background: var(--toast-success-bg); color: var(--toast-fg); }
1458
+ .toast-info { background: var(--toast-info-bg); color: var(--toast-fg); }
1459
+ .toast-warn { background: var(--toast-warn-bg); color: var(--toast-warn-fg); }
1460
+ @keyframes toastIn { from { opacity: 0; transform: translateX(-50%) translateY(16px); } to { opacity: 1; transform: translateX(-50%) translateY(0); } }
1461
+ @keyframes toastOut { from { opacity: 1; } to { opacity: 0; pointer-events: none; } }
1462
+
1463
+ /* ── Modal ── */
1464
+ .modal-overlay {
1465
+ position: fixed; inset: 0; z-index: 1000;
1466
+ background: var(--overlay-scrim); backdrop-filter: blur(8px);
1467
+ display: flex; align-items: center; justify-content: center;
1468
+ padding: 24px;
1469
+ animation: fadeIn 0.2s ease;
1470
+ }
1471
+ .modal {
1472
+ background: var(--bg-card); border-radius: var(--radius-xl);
1473
+ box-shadow: var(--shadow-xl); padding: 1.5rem;
1474
+ min-width: 320px; max-width: 90vw; max-height: 85vh; overflow-y: auto;
1475
+ }
1476
+ .modal-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem; }
1477
+ .modal-header h3 { font-size: 1.1rem; font-weight: 700; }
1478
+ .modal-close { background: none; border: none; color: var(--text-dim); cursor: pointer; font-size: 1.2rem; padding: 0.25rem; opacity: 0.7; }
1479
+ .modal-close:hover { opacity: 1; }
1480
+ .modal-confirm-message { color: var(--text-dim); margin: 0 0 1.25rem; line-height: 1.5; }
1481
+ .modal-footer { display: flex; justify-content: flex-end; gap: 8px; padding-top: 0.5rem; }
1482
+ .btn-danger-solid { padding: 8px 20px; background: var(--danger,#ef4444); color: #fff; border: none; border-radius: var(--radius-sm); font-size: 0.84rem; font-weight: 500; cursor: pointer; transition: all 0.15s; }
1483
+ .btn-danger-solid:hover { background: #dc2626; }
1484
+
1485
+ /* ── Card extensions ── */
1486
+ .card-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.5rem; }
1487
+ .card-title { font-weight: 600; font-size: 1rem; }
1488
+ .card-subtitle { color: var(--text-dim); font-size: 0.8rem; }
1489
+ .card-hoverable { cursor: pointer; }
1490
+
1491
+ /* ── Form Group ── */
1492
+ .form-group { margin-bottom: 1rem; }
1493
+ .form-label { display: block; font-size: 0.75rem; font-weight: 600; color: var(--text-dim); margin-bottom: 5px; text-transform: uppercase; letter-spacing: 0.5px; }
1494
+ .form-hint { display: block; font-size: 0.72rem; color: var(--text-muted); margin-top: 0.25rem; }
1495
+
1496
+ /* ── Loading text ── */
1497
+ .loading-text { margin-left: 0.5rem; color: var(--text-dim); font-size: 0.85rem; }
1498
+
1499
+ /* ── Section & page headers (canonical title + subtitle pairs) ──
1500
+ Single source of truth for the "title + supporting copy" header that every
1501
+ view re-implements. Use .section-title/.section-desc for in-page section
1502
+ headers (accent title) and .page-title/.page-subtitle for top-of-view page
1503
+ headers (gradient title). All values are theme tokens so they flip with
1504
+ dark/light mode. Per-view clones (mk-/hb-/cl-/adm-page-title) are
1505
+ token-equivalent and should converge onto these over time. */
1506
+ .section-title { font-size: 1.15rem; font-weight: 700; margin-bottom: 0.4rem; color: var(--accent); }
1507
+ .section-desc { color: var(--text-dim); font-size: 0.85rem; margin-bottom: 1.25rem; line-height: 1.5; max-width: 700px; }
1508
+ .page-title {
1509
+ font-size: 1.8rem; font-weight: 700; margin-bottom: 8px;
1510
+ background: linear-gradient(135deg, var(--accent), var(--accent-deep));
1511
+ -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;
1512
+ }
1513
+ .page-subtitle { color: var(--text-dim); font-size: 1rem; margin-bottom: 32px; }
1514
+
1515
+ /* ── Accessibility ── */
1516
+ .visually-hidden { position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0,0,0,0); white-space:nowrap; border:0; }