aimeat 2.1.0 → 2.2.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 (422) hide show
  1. package/dist/.env.example +9 -4
  2. package/dist/locales/en.json +28 -0
  3. package/dist/locales/fi.json +28 -0
  4. package/dist/public/cortex-bundled/aimeat-charts.js +158 -10
  5. package/dist/public/cortex-bundled/aimeat-charts.yaml +1 -1
  6. package/dist/public/cortex-bundled/aimeat-dag.js +515 -173
  7. package/dist/public/cortex-bundled/aimeat-dag.yaml +1 -1
  8. package/dist/public/cortex-bundled/aimeat-i18n.js +6 -1
  9. package/dist/public/cortex-bundled/aimeat-i18n.yaml +1 -1
  10. package/dist/public/cortex-bundled/aimeat-surface.js +577 -0
  11. package/dist/public/cortex-bundled/aimeat-surface.yaml +107 -0
  12. package/dist/public/cortex-bundled/aimeat-viewport.js +405 -0
  13. package/dist/public/cortex-bundled/aimeat-viewport.yaml +100 -0
  14. package/dist/public/css/views/inbox.css +1 -1
  15. package/dist/public/css/views/profile.css +9 -0
  16. package/dist/public/lib/VENDORED.md +6 -3
  17. package/dist/public/lib/aimeat-daisyui-bridge.css +39 -2
  18. package/dist/public/lib/aimeat-theme.css +538 -0
  19. package/dist/public/lib/fonts/LICENSE.md +11 -4
  20. package/dist/public/lib/fonts/fraunces-var-latin-ext.woff2 +0 -0
  21. package/dist/public/lib/fonts/fraunces-var-latin.woff2 +0 -0
  22. package/dist/public/lib/fonts/inter-var-latin-ext.woff2 +0 -0
  23. package/dist/public/lib/fonts/inter-var-latin.woff2 +0 -0
  24. package/dist/public/lib/fonts/jetbrains-mono-var-latin-ext.woff2 +0 -0
  25. package/dist/public/lib/fonts/jetbrains-mono-var-latin.woff2 +0 -0
  26. package/dist/public/lib/fonts/space-grotesk-var-latin-ext.woff2 +0 -0
  27. package/dist/public/lib/fonts/space-grotesk-var-latin.woff2 +0 -0
  28. package/dist/public/lib/samples/theme-check.html +92 -0
  29. package/dist/public/lib/samples/themes-boot.js +20 -0
  30. package/dist/public/lib/samples/themes.html +154 -0
  31. package/dist/public/lib/samples/themes.js +60 -0
  32. package/dist/public/views/profile/access-tab/connected-apps.js +81 -5
  33. package/dist/public/views/profile/extensions-tab.maturity.js +4 -1
  34. package/dist/public/views/profile/inbox-tab/components.js +17 -1
  35. package/dist/public/views/profile/inbox-tab/use-thread-ux.js +29 -2
  36. package/dist/public/views/profile/libraries-tab.js +10 -2
  37. package/dist/public/views/profile/wallet-tab.js +64 -0
  38. package/dist/scripts/check-openapi.d.ts +2 -0
  39. package/dist/scripts/check-openapi.d.ts.map +1 -0
  40. package/dist/scripts/check-openapi.js +139 -0
  41. package/dist/scripts/check-openapi.js.map +1 -0
  42. package/dist/scripts/embed-viewport.d.ts +23 -0
  43. package/dist/scripts/embed-viewport.d.ts.map +1 -0
  44. package/dist/scripts/embed-viewport.js +116 -0
  45. package/dist/scripts/embed-viewport.js.map +1 -0
  46. package/dist/src/auth/sse-domain-scopes.d.ts +50 -0
  47. package/dist/src/auth/sse-domain-scopes.d.ts.map +1 -0
  48. package/dist/src/auth/sse-domain-scopes.js +111 -0
  49. package/dist/src/auth/sse-domain-scopes.js.map +1 -0
  50. package/dist/src/cli/connect/mcp/tools/agent-tasks.d.ts.map +1 -1
  51. package/dist/src/cli/connect/mcp/tools/agent-tasks.js +4 -1
  52. package/dist/src/cli/connect/mcp/tools/agent-tasks.js.map +1 -1
  53. package/dist/src/cli/connect/mcp/tools/core.d.ts.map +1 -1
  54. package/dist/src/cli/connect/mcp/tools/core.js +14 -3
  55. package/dist/src/cli/connect/mcp/tools/core.js.map +1 -1
  56. package/dist/src/cli/connect/mcp/tools/workspaces.d.ts +3 -0
  57. package/dist/src/cli/connect/mcp/tools/workspaces.d.ts.map +1 -1
  58. package/dist/src/cli/connect/mcp/tools/workspaces.js +4 -2
  59. package/dist/src/cli/connect/mcp/tools/workspaces.js.map +1 -1
  60. package/dist/src/cli/connect/tool-call-defs-core.d.ts.map +1 -1
  61. package/dist/src/cli/connect/tool-call-defs-core.js +13 -1
  62. package/dist/src/cli/connect/tool-call-defs-core.js.map +1 -1
  63. package/dist/src/commerce/__tests__/x402-registry.test.d.ts +2 -0
  64. package/dist/src/commerce/__tests__/x402-registry.test.d.ts.map +1 -0
  65. package/dist/src/commerce/__tests__/x402-registry.test.js +105 -0
  66. package/dist/src/commerce/__tests__/x402-registry.test.js.map +1 -0
  67. package/dist/src/commerce/evm-address.d.ts +21 -0
  68. package/dist/src/commerce/evm-address.d.ts.map +1 -0
  69. package/dist/src/commerce/evm-address.js +94 -0
  70. package/dist/src/commerce/evm-address.js.map +1 -0
  71. package/dist/src/commerce/money.d.ts +18 -5
  72. package/dist/src/commerce/money.d.ts.map +1 -1
  73. package/dist/src/commerce/money.js +27 -6
  74. package/dist/src/commerce/money.js.map +1 -1
  75. package/dist/src/commerce/x402-facilitator.d.ts +64 -13
  76. package/dist/src/commerce/x402-facilitator.d.ts.map +1 -1
  77. package/dist/src/commerce/x402-facilitator.js +71 -19
  78. package/dist/src/commerce/x402-facilitator.js.map +1 -1
  79. package/dist/src/commerce/x402-handler.d.ts +13 -7
  80. package/dist/src/commerce/x402-handler.d.ts.map +1 -1
  81. package/dist/src/commerce/x402-handler.js +23 -10
  82. package/dist/src/commerce/x402-handler.js.map +1 -1
  83. package/dist/src/commerce/x402.d.ts +11 -6
  84. package/dist/src/commerce/x402.d.ts.map +1 -1
  85. package/dist/src/commerce/x402.js +10 -7
  86. package/dist/src/commerce/x402.js.map +1 -1
  87. package/dist/src/config-types.d.ts +12 -0
  88. package/dist/src/config-types.d.ts.map +1 -1
  89. package/dist/src/config.d.ts.map +1 -1
  90. package/dist/src/config.js +8 -0
  91. package/dist/src/config.js.map +1 -1
  92. package/dist/src/data/app-templates/shells.d.ts +11 -3
  93. package/dist/src/data/app-templates/shells.d.ts.map +1 -1
  94. package/dist/src/data/app-templates/shells.js +87 -6
  95. package/dist/src/data/app-templates/shells.js.map +1 -1
  96. package/dist/src/data/app-templates.js +2 -2
  97. package/dist/src/data/app-templates.js.map +1 -1
  98. package/dist/src/data/library-packs/cortex.d.ts.map +1 -1
  99. package/dist/src/data/library-packs/cortex.js +108 -5
  100. package/dist/src/data/library-packs/cortex.js.map +1 -1
  101. package/dist/src/data/library-packs/sdk.d.ts.map +1 -1
  102. package/dist/src/data/library-packs/sdk.js +32 -8
  103. package/dist/src/data/library-packs/sdk.js.map +1 -1
  104. package/dist/src/data/library-packs/vendored.d.ts.map +1 -1
  105. package/dist/src/data/library-packs/vendored.js +83 -6
  106. package/dist/src/data/library-packs/vendored.js.map +1 -1
  107. package/dist/src/generated/api-types.d.ts +478 -19
  108. package/dist/src/generated/api-types.d.ts.map +1 -1
  109. package/dist/src/mcp/agent-tasks.d.ts +4 -0
  110. package/dist/src/mcp/agent-tasks.d.ts.map +1 -1
  111. package/dist/src/mcp/agent-tasks.js +20 -2
  112. package/dist/src/mcp/agent-tasks.js.map +1 -1
  113. package/dist/src/mcp/capabilities.d.ts +7 -1
  114. package/dist/src/mcp/capabilities.d.ts.map +1 -1
  115. package/dist/src/mcp/capabilities.js +5 -2
  116. package/dist/src/mcp/capabilities.js.map +1 -1
  117. package/dist/src/mcp/catalog/definitions/commerce.d.ts.map +1 -1
  118. package/dist/src/mcp/catalog/definitions/commerce.js +4 -2
  119. package/dist/src/mcp/catalog/definitions/commerce.js.map +1 -1
  120. package/dist/src/mcp/catalog/definitions/discovery-work-boards.d.ts.map +1 -1
  121. package/dist/src/mcp/catalog/definitions/discovery-work-boards.js +4 -3
  122. package/dist/src/mcp/catalog/definitions/discovery-work-boards.js.map +1 -1
  123. package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.js +1 -1
  124. package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.js.map +1 -1
  125. package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.d.ts.map +1 -1
  126. package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.js +3 -2
  127. package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.js.map +1 -1
  128. package/dist/src/mcp/catalog/output-schemas.d.ts +6 -1
  129. package/dist/src/mcp/catalog/output-schemas.d.ts.map +1 -1
  130. package/dist/src/mcp/catalog/output-schemas.js +6 -1
  131. package/dist/src/mcp/catalog/output-schemas.js.map +1 -1
  132. package/dist/src/mcp/commerce.d.ts.map +1 -1
  133. package/dist/src/mcp/commerce.js +15 -3
  134. package/dist/src/mcp/commerce.js.map +1 -1
  135. package/dist/src/mcp/core-storage.d.ts +23 -0
  136. package/dist/src/mcp/core-storage.d.ts.map +1 -0
  137. package/dist/src/mcp/core-storage.js +157 -0
  138. package/dist/src/mcp/core-storage.js.map +1 -0
  139. package/dist/src/mcp/core.d.ts +16 -0
  140. package/dist/src/mcp/core.d.ts.map +1 -1
  141. package/dist/src/mcp/core.js +75 -119
  142. package/dist/src/mcp/core.js.map +1 -1
  143. package/dist/src/mcp/dm-messages.d.ts +4 -0
  144. package/dist/src/mcp/dm-messages.d.ts.map +1 -1
  145. package/dist/src/mcp/dm-messages.js +43 -2
  146. package/dist/src/mcp/dm-messages.js.map +1 -1
  147. package/dist/src/mcp/exchange.d.ts.map +1 -1
  148. package/dist/src/mcp/exchange.js +3 -2
  149. package/dist/src/mcp/exchange.js.map +1 -1
  150. package/dist/src/mcp/extensions.d.ts.map +1 -1
  151. package/dist/src/mcp/extensions.js +6 -2
  152. package/dist/src/mcp/extensions.js.map +1 -1
  153. package/dist/src/mcp/index.d.ts +5 -0
  154. package/dist/src/mcp/index.d.ts.map +1 -1
  155. package/dist/src/mcp/index.js +23 -4
  156. package/dist/src/mcp/index.js.map +1 -1
  157. package/dist/src/mcp/memory-namespace-hints.d.ts +33 -0
  158. package/dist/src/mcp/memory-namespace-hints.d.ts.map +1 -0
  159. package/dist/src/mcp/memory-namespace-hints.js +60 -0
  160. package/dist/src/mcp/memory-namespace-hints.js.map +1 -0
  161. package/dist/src/mcp/workspaces.d.ts +5 -0
  162. package/dist/src/mcp/workspaces.d.ts.map +1 -1
  163. package/dist/src/mcp/workspaces.js +5 -3
  164. package/dist/src/mcp/workspaces.js.map +1 -1
  165. package/dist/src/models/agent-task-schemas.d.ts +25 -3
  166. package/dist/src/models/agent-task-schemas.d.ts.map +1 -1
  167. package/dist/src/models/agent-task-schemas.js +16 -0
  168. package/dist/src/models/agent-task-schemas.js.map +1 -1
  169. package/dist/src/models/app-tool-schemas.d.ts +518 -1
  170. package/dist/src/models/app-tool-schemas.d.ts.map +1 -1
  171. package/dist/src/models/app-tool-schemas.js +53 -1
  172. package/dist/src/models/app-tool-schemas.js.map +1 -1
  173. package/dist/src/models/odps-schemas.d.ts +305 -0
  174. package/dist/src/models/odps-schemas.d.ts.map +1 -0
  175. package/dist/src/models/odps-schemas.js +182 -0
  176. package/dist/src/models/odps-schemas.js.map +1 -0
  177. package/dist/src/models/offer-schemas.d.ts +357 -2
  178. package/dist/src/models/offer-schemas.d.ts.map +1 -1
  179. package/dist/src/models/offer-schemas.js +37 -0
  180. package/dist/src/models/offer-schemas.js.map +1 -1
  181. package/dist/src/models/schemas.d.ts +6 -3
  182. package/dist/src/models/schemas.d.ts.map +1 -1
  183. package/dist/src/models/schemas.js +10 -1
  184. package/dist/src/models/schemas.js.map +1 -1
  185. package/dist/src/models/webhook-schemas.d.ts +8 -8
  186. package/dist/src/routes/agent-tasks/create-read.d.ts +4 -0
  187. package/dist/src/routes/agent-tasks/create-read.d.ts.map +1 -1
  188. package/dist/src/routes/agent-tasks/create-read.js +20 -1
  189. package/dist/src/routes/agent-tasks/create-read.js.map +1 -1
  190. package/dist/src/routes/agent-tasks/lifecycle.d.ts.map +1 -1
  191. package/dist/src/routes/agent-tasks/lifecycle.js +10 -0
  192. package/dist/src/routes/agent-tasks/lifecycle.js.map +1 -1
  193. package/dist/src/routes/agents/offers.d.ts +2 -0
  194. package/dist/src/routes/agents/offers.d.ts.map +1 -1
  195. package/dist/src/routes/agents/offers.js +0 -0
  196. package/dist/src/routes/agents/offers.js.map +1 -1
  197. package/dist/src/routes/app-grants.d.ts +6 -0
  198. package/dist/src/routes/app-grants.d.ts.map +1 -1
  199. package/dist/src/routes/app-grants.js +55 -25
  200. package/dist/src/routes/app-grants.js.map +1 -1
  201. package/dist/src/routes/apps/drafts.d.ts +3 -0
  202. package/dist/src/routes/apps/drafts.d.ts.map +1 -1
  203. package/dist/src/routes/apps/drafts.js +63 -1
  204. package/dist/src/routes/apps/drafts.js.map +1 -1
  205. package/dist/src/routes/apps/publish.d.ts +2 -0
  206. package/dist/src/routes/apps/publish.d.ts.map +1 -1
  207. package/dist/src/routes/apps/publish.js +17 -2
  208. package/dist/src/routes/apps/publish.js.map +1 -1
  209. package/dist/src/routes/commerce.d.ts.map +1 -1
  210. package/dist/src/routes/commerce.js +122 -2
  211. package/dist/src/routes/commerce.js.map +1 -1
  212. package/dist/src/routes/exchange-market.d.ts +6 -2
  213. package/dist/src/routes/exchange-market.d.ts.map +1 -1
  214. package/dist/src/routes/exchange-market.js +154 -28
  215. package/dist/src/routes/exchange-market.js.map +1 -1
  216. package/dist/src/routes/exchange.d.ts.map +1 -1
  217. package/dist/src/routes/exchange.js +5 -2
  218. package/dist/src/routes/exchange.js.map +1 -1
  219. package/dist/src/routes/extensions/actions.d.ts.map +1 -1
  220. package/dist/src/routes/extensions/actions.js +18 -0
  221. package/dist/src/routes/extensions/actions.js.map +1 -1
  222. package/dist/src/routes/extensions/crud.d.ts.map +1 -1
  223. package/dist/src/routes/extensions/crud.js +36 -3
  224. package/dist/src/routes/extensions/crud.js.map +1 -1
  225. package/dist/src/routes/extensions/entitlement-gate.d.ts.map +1 -1
  226. package/dist/src/routes/extensions/entitlement-gate.js +13 -0
  227. package/dist/src/routes/extensions/entitlement-gate.js.map +1 -1
  228. package/dist/src/routes/extensions/manifest.d.ts +6 -0
  229. package/dist/src/routes/extensions/manifest.d.ts.map +1 -1
  230. package/dist/src/routes/extensions/manifest.js +68 -1
  231. package/dist/src/routes/extensions/manifest.js.map +1 -1
  232. package/dist/src/routes/extensions/pacing.d.ts +31 -0
  233. package/dist/src/routes/extensions/pacing.d.ts.map +1 -0
  234. package/dist/src/routes/extensions/pacing.js +73 -0
  235. package/dist/src/routes/extensions/pacing.js.map +1 -0
  236. package/dist/src/routes/extensions/paywall.d.ts.map +1 -1
  237. package/dist/src/routes/extensions/paywall.js +17 -17
  238. package/dist/src/routes/extensions/paywall.js.map +1 -1
  239. package/dist/src/routes/memory/crud.d.ts.map +1 -1
  240. package/dist/src/routes/memory/crud.js +10 -0
  241. package/dist/src/routes/memory/crud.js.map +1 -1
  242. package/dist/src/routes/organisms/crud.d.ts +3 -0
  243. package/dist/src/routes/organisms/crud.d.ts.map +1 -1
  244. package/dist/src/routes/organisms/crud.js +5 -2
  245. package/dist/src/routes/organisms/crud.js.map +1 -1
  246. package/dist/src/routes/organisms/workspace-read.d.ts.map +1 -1
  247. package/dist/src/routes/organisms/workspace-read.js +7 -2
  248. package/dist/src/routes/organisms/workspace-read.js.map +1 -1
  249. package/dist/src/routes/public-stats.d.ts +7 -0
  250. package/dist/src/routes/public-stats.d.ts.map +1 -1
  251. package/dist/src/routes/public-stats.js +28 -7
  252. package/dist/src/routes/public-stats.js.map +1 -1
  253. package/dist/src/routes/sse.d.ts +7 -0
  254. package/dist/src/routes/sse.d.ts.map +1 -1
  255. package/dist/src/routes/sse.js +36 -6
  256. package/dist/src/routes/sse.js.map +1 -1
  257. package/dist/src/routes/storage-files.d.ts +11 -0
  258. package/dist/src/routes/storage-files.d.ts.map +1 -1
  259. package/dist/src/routes/storage-files.js +58 -51
  260. package/dist/src/routes/storage-files.js.map +1 -1
  261. package/dist/src/routes/subdomains.d.ts +4 -0
  262. package/dist/src/routes/subdomains.d.ts.map +1 -1
  263. package/dist/src/routes/subdomains.js +42 -5
  264. package/dist/src/routes/subdomains.js.map +1 -1
  265. package/dist/src/routes/upload.d.ts +11 -0
  266. package/dist/src/routes/upload.d.ts.map +1 -1
  267. package/dist/src/routes/upload.js +108 -28
  268. package/dist/src/routes/upload.js.map +1 -1
  269. package/dist/src/routes/webmcp.d.ts.map +1 -1
  270. package/dist/src/routes/webmcp.js +4 -0
  271. package/dist/src/routes/webmcp.js.map +1 -1
  272. package/dist/src/schemas/knowledge-package.d.ts +1 -1
  273. package/dist/src/server-bootstrap/static-files.d.ts +4 -0
  274. package/dist/src/server-bootstrap/static-files.d.ts.map +1 -1
  275. package/dist/src/server-bootstrap/static-files.js +11 -0
  276. package/dist/src/server-bootstrap/static-files.js.map +1 -1
  277. package/dist/src/services/build-app-prompt.d.ts +19 -0
  278. package/dist/src/services/build-app-prompt.d.ts.map +1 -1
  279. package/dist/src/services/build-app-prompt.js +97 -11
  280. package/dist/src/services/build-app-prompt.js.map +1 -1
  281. package/dist/src/services/call-timing.d.ts +51 -0
  282. package/dist/src/services/call-timing.d.ts.map +1 -0
  283. package/dist/src/services/call-timing.js +91 -0
  284. package/dist/src/services/call-timing.js.map +1 -0
  285. package/dist/src/services/capability-invoke.d.ts +2 -0
  286. package/dist/src/services/capability-invoke.d.ts.map +1 -1
  287. package/dist/src/services/capability-invoke.js +10 -0
  288. package/dist/src/services/capability-invoke.js.map +1 -1
  289. package/dist/src/services/config-schema.d.ts.map +1 -1
  290. package/dist/src/services/config-schema.js +6 -0
  291. package/dist/src/services/config-schema.js.map +1 -1
  292. package/dist/src/services/draft-token.d.ts +22 -2
  293. package/dist/src/services/draft-token.d.ts.map +1 -1
  294. package/dist/src/services/draft-token.js +52 -3
  295. package/dist/src/services/draft-token.js.map +1 -1
  296. package/dist/src/services/exchange-market.d.ts +41 -8
  297. package/dist/src/services/exchange-market.d.ts.map +1 -1
  298. package/dist/src/services/exchange-market.js +24 -2
  299. package/dist/src/services/exchange-market.js.map +1 -1
  300. package/dist/src/services/exchange-odps.d.ts +58 -0
  301. package/dist/src/services/exchange-odps.d.ts.map +1 -0
  302. package/dist/src/services/exchange-odps.js +400 -0
  303. package/dist/src/services/exchange-odps.js.map +1 -0
  304. package/dist/src/services/exchange-projection.d.ts +61 -0
  305. package/dist/src/services/exchange-projection.d.ts.map +1 -0
  306. package/dist/src/services/exchange-projection.js +504 -0
  307. package/dist/src/services/exchange-projection.js.map +1 -0
  308. package/dist/src/services/exchange-proposals.d.ts.map +1 -1
  309. package/dist/src/services/exchange-proposals.js +2 -0
  310. package/dist/src/services/exchange-proposals.js.map +1 -1
  311. package/dist/src/services/extension-files.d.ts +64 -0
  312. package/dist/src/services/extension-files.d.ts.map +1 -0
  313. package/dist/src/services/extension-files.js +88 -0
  314. package/dist/src/services/extension-files.js.map +1 -0
  315. package/dist/src/services/extension-runtime.d.ts +33 -0
  316. package/dist/src/services/extension-runtime.d.ts.map +1 -1
  317. package/dist/src/services/extension-runtime.js +52 -0
  318. package/dist/src/services/extension-runtime.js.map +1 -1
  319. package/dist/src/services/file-refs.d.ts +105 -0
  320. package/dist/src/services/file-refs.d.ts.map +1 -0
  321. package/dist/src/services/file-refs.js +106 -0
  322. package/dist/src/services/file-refs.js.map +1 -0
  323. package/dist/src/services/metered-entitlements.d.ts +7 -0
  324. package/dist/src/services/metered-entitlements.d.ts.map +1 -1
  325. package/dist/src/services/metered-entitlements.js +4 -0
  326. package/dist/src/services/metered-entitlements.js.map +1 -1
  327. package/dist/src/services/owner-memory.d.ts +14 -1
  328. package/dist/src/services/owner-memory.d.ts.map +1 -1
  329. package/dist/src/services/owner-memory.js +8 -14
  330. package/dist/src/services/owner-memory.js.map +1 -1
  331. package/dist/src/services/task-files.d.ts +51 -0
  332. package/dist/src/services/task-files.d.ts.map +1 -0
  333. package/dist/src/services/task-files.js +58 -0
  334. package/dist/src/services/task-files.js.map +1 -0
  335. package/dist/src/services/upload-token.d.ts +29 -0
  336. package/dist/src/services/upload-token.d.ts.map +1 -1
  337. package/dist/src/services/upload-token.js +37 -0
  338. package/dist/src/services/upload-token.js.map +1 -1
  339. package/dist/src/services/upload-zip.d.ts +2 -0
  340. package/dist/src/services/upload-zip.d.ts.map +1 -1
  341. package/dist/src/services/upload-zip.js +5 -1
  342. package/dist/src/services/upload-zip.js.map +1 -1
  343. package/dist/src/services/workspace-meta.d.ts +15 -0
  344. package/dist/src/services/workspace-meta.d.ts.map +1 -1
  345. package/dist/src/services/workspace-meta.js +17 -0
  346. package/dist/src/services/workspace-meta.js.map +1 -1
  347. package/dist/src/services/workspace-provision.d.ts +3 -0
  348. package/dist/src/services/workspace-provision.d.ts.map +1 -1
  349. package/dist/src/services/workspace-provision.js +5 -3
  350. package/dist/src/services/workspace-provision.js.map +1 -1
  351. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.d.ts +1 -0
  352. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.d.ts.map +1 -1
  353. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.js +10 -0
  354. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.js.map +1 -1
  355. package/dist/src/storage/providers/postgres-kysely/methods/memory.d.ts +2 -0
  356. package/dist/src/storage/providers/postgres-kysely/methods/memory.d.ts.map +1 -1
  357. package/dist/src/storage/providers/postgres-kysely/methods/memory.js +12 -1
  358. package/dist/src/storage/providers/postgres-kysely/methods/memory.js.map +1 -1
  359. package/dist/src/storage/providers/postgres-kysely/methods/organisms.d.ts.map +1 -1
  360. package/dist/src/storage/providers/postgres-kysely/methods/organisms.js +5 -1
  361. package/dist/src/storage/providers/postgres-kysely/methods/organisms.js.map +1 -1
  362. package/dist/src/storage/providers/postgres-kysely/migrations/0012_unique_live_app_grant.sql +29 -0
  363. package/dist/src/storage/providers/sqlite/methods/apps.d.ts +3 -0
  364. package/dist/src/storage/providers/sqlite/methods/apps.d.ts.map +1 -1
  365. package/dist/src/storage/providers/sqlite/methods/apps.js +7 -0
  366. package/dist/src/storage/providers/sqlite/methods/apps.js.map +1 -1
  367. package/dist/src/storage/providers/sqlite/methods/governance.d.ts +1 -0
  368. package/dist/src/storage/providers/sqlite/methods/governance.d.ts.map +1 -1
  369. package/dist/src/storage/providers/sqlite/methods/governance.js +4 -1
  370. package/dist/src/storage/providers/sqlite/methods/governance.js.map +1 -1
  371. package/dist/src/storage/providers/sqlite/methods/owner.d.ts +5 -0
  372. package/dist/src/storage/providers/sqlite/methods/owner.d.ts.map +1 -1
  373. package/dist/src/storage/providers/sqlite/methods/owner.js +8 -0
  374. package/dist/src/storage/providers/sqlite/methods/owner.js.map +1 -1
  375. package/dist/src/storage/providers/sqlite/schema.d.ts +3 -0
  376. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  377. package/dist/src/storage/providers/sqlite/schema.js +20 -0
  378. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  379. package/dist/src/storage/repositories/app-grant.repository.d.ts +9 -1
  380. package/dist/src/storage/repositories/app-grant.repository.d.ts.map +1 -1
  381. package/dist/src/storage/repositories/memory.repository.d.ts +14 -0
  382. package/dist/src/storage/repositories/memory.repository.d.ts.map +1 -1
  383. package/dist/src/storage/repositories-impl/memory-repository.d.ts +8 -1
  384. package/dist/src/storage/repositories-impl/memory-repository.d.ts.map +1 -1
  385. package/dist/src/storage/repositories-impl/memory-repository.js +15 -4
  386. package/dist/src/storage/repositories-impl/memory-repository.js.map +1 -1
  387. package/dist/src/storage/types/agents-messaging.d.ts +19 -0
  388. package/dist/src/storage/types/agents-messaging.d.ts.map +1 -1
  389. package/dist/src/storage/types/agents-messaging.js.map +1 -1
  390. package/dist/src/storage/types/organisms-federation.d.ts +29 -0
  391. package/dist/src/storage/types/organisms-federation.d.ts.map +1 -1
  392. package/dist/src/utils/app-badge.d.ts.map +1 -1
  393. package/dist/src/utils/app-badge.js +7 -3
  394. package/dist/src/utils/app-badge.js.map +1 -1
  395. package/dist/static/app-catalog/_template.html +6 -5
  396. package/dist/static/app-catalog/js/cortex.js +3 -1
  397. package/dist/static/app-catalog/js/detail.js +411 -36
  398. package/dist/static/app-catalog/js/i18n-data.js +279 -3
  399. package/dist/static/app-catalog/js/main.js +28 -37
  400. package/dist/static/app-catalog/js/monetize.js +204 -16
  401. package/dist/static/app-catalog/js/odps.js +489 -0
  402. package/dist/static/app-catalog/js/render.js +3 -0
  403. package/dist/static/app-catalog/js/workcopy.js +198 -0
  404. package/dist/static/app-catalog/styles/app-catalog.css +60 -0
  405. package/dist/static/app-catalog.html +1450 -137
  406. package/dist/static/sdk-libs/agents/index.js +45 -7
  407. package/dist/static/sdk-libs/auth/cluster.js +97 -0
  408. package/dist/static/sdk-libs/auth/index.js +25 -1
  409. package/dist/static/sdk-libs/auth/locale.js +151 -0
  410. package/dist/static/sdk-libs/auth/modal.js +11 -2
  411. package/dist/static/sdk-libs/auth/palette.js +172 -0
  412. package/dist/static/sdk-libs/auth/pill.js +37 -6
  413. package/dist/static/sdk-libs/auth/theme.js +61 -20
  414. package/dist/static/sdk-libs/data/index.js +70 -8
  415. package/dist/static/sdk-libs/dist/aimeat-agents.js +41 -8
  416. package/dist/static/sdk-libs/dist/aimeat-auth.js +422 -21
  417. package/dist/static/sdk-libs/dist/aimeat-data.js +50 -8
  418. package/dist/static/sdk-libs/dist/aimeat-live.js +54 -2
  419. package/dist/static/sdk-libs/dist/aimeat-markdown.js +32 -1
  420. package/dist/static/sdk-libs/live/index.js +71 -4
  421. package/dist/static/sdk-libs/markdown/index.js +49 -1
  422. package/package.json +6 -2
@@ -11,7 +11,8 @@ with per-lib AI docs + changelogs) — keep this table and the registry in sync.
11
11
  |------|---------|---------|---------|--------|---------|
12
12
  | `tailwindcss@4.js` | `@tailwindcss/browser` | 4.3.1 | `styling` | `https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4` | MIT |
13
13
  | `daisyui@5.css` | `daisyui` | 5.5.23 | `styling` | `https://cdn.jsdelivr.net/npm/daisyui@5` | MIT |
14
- | `aimeat-daisyui-bridge.css` | AIMEAT-local (theme bridge) | | `styling` | this repo | MIT |
14
+ | `aimeat-theme.css` | AIMEAT-local (the theme SYSTEM: 5 palettes × light+dark on the `data-theme` × `data-palette` axes, self-hosted faces, elevation/motion/type tokens; verified by `pnpm check:theme`) | 2.0.0 | `styling` | this repo | MIT |
15
+ | `aimeat-daisyui-bridge.css` | AIMEAT-local (theme bridge; `@import`s the theme) | — | `styling` | this repo | MIT |
15
16
  | `chartjs@4.js` | `chart.js` (UMD) | 4.5.1 | `chartjs` | `https://cdn.jsdelivr.net/npm/chart.js@4/dist/chart.umd.min.js` | MIT |
16
17
  | `mermaid/mermaid.min.js` | `mermaid` (UMD) | 11.15.0 | `mermaid` | `node_modules/mermaid/dist` (see mermaid/README.md) | MIT |
17
18
  | `three.min.js` | `three` (r128 UMD) | r128 | `three` | `https://cdn.jsdelivr.net/npm/three@0.128.0/build/three.min.js` | MIT |
@@ -20,10 +21,11 @@ with per-lib AI docs + changelogs) — keep this table and the registry in sync.
20
21
  | `pixi-unsafe-eval@8.min.js` | `pixi.js` (unsafe-eval companion — REQUIRED after pixi under the app CSP) | 8.19.0 | `pixi` | `https://cdn.jsdelivr.net/npm/pixi.js@8/dist/packages/unsafe-eval.min.js` | MIT |
21
22
  | `phaser@3.min.js` | `phaser` | 3.90.0 | `phaser` | `https://cdn.jsdelivr.net/npm/phaser@3/dist/phaser.min.js` | MIT |
22
23
  | `drawflow@0.min.js` + `.min.css` | `drawflow` (engine INSIDE the aimeat-flow cortex — apps use AIMEAT.flow, never Drawflow directly) | 0.0.60 | `aimeat-flow` | `https://cdn.jsdelivr.net/npm/drawflow@0.0.60/dist/` | MIT |
23
- | `fonts.css` + `fonts/*.woff2` | Baloo 2 (variable 400–800) + Bangers display fonts, latin + latin-ext (ä/ö) | Baloo 2 v23 · Bangers v25 | `fonts` | Google Fonts CDN (see `fonts/LICENSE.md`) | OFL-1.1 |
24
+ | `fonts.css` + `fonts/*.woff2` | Baloo 2 + Bangers display fonts (the `fonts` pack, via `fonts.css`) AND the theme-system faces Inter, Space Grotesk, Fraunces, JetBrains Mono (declared by `aimeat-theme.css`, lazy-loaded per family). All latin + latin-ext (ä/ö); see `fonts/LICENSE.md` | Baloo 2 v23 · Bangers v25 · Inter v20 · Space Grotesk v22 · Fraunces v38 · JetBrains Mono v24 | `fonts` / `styling` | Google Fonts CDN (see `fonts/LICENSE.md`) | OFL-1.1 |
24
25
  | `realtime.js` | AIMEAT-local (WS/WebRTC/Yjs client + `SharedClock` synced timeline) | 1 | `realtime` | this repo | MIT |
25
26
  | `toastui/toastui-editor-all.min.js` + `.min.css` | TOAST UI Editor | (SPA-internal) | — | `https://uicdn.toast.com` | MIT |
26
- | `preact.mjs`, `preact-hooks.mjs`, `htm.mjs`, `yaml.mjs`, `minidenticons.min.js` | preact / htm / yaml / minidenticons (ESM) | (SPA-internal, importmap) | | jsdelivr | MIT |
27
+ | `yaml.mjs` | `yaml` (ESM) | 2.x | `yaml` | jsdelivr | ISC |
28
+ | `preact.mjs`, `preact-hooks.mjs`, `htm.mjs`, `minidenticons.min.js` | preact / htm / minidenticons (ESM) | (SPA-internal, importmap) | — | jsdelivr | MIT |
27
29
  | `live-updates.js` | AIMEAT-local (SSE ESM wrapper) | (SPA-internal) | — | this repo | MIT |
28
30
  | `samples/` | audio samples for aimeat-audio | — | — | CC | CC |
29
31
 
@@ -51,6 +53,7 @@ The same append-only rule applies to the node-bundled cortex wrappers
51
53
 
52
54
  ```html
53
55
  <link href="/lib/daisyui@5.css" rel="stylesheet" type="text/css" />
56
+ <link href="/lib/aimeat-theme.css" rel="stylesheet" type="text/css" />
54
57
  <link href="/lib/aimeat-daisyui-bridge.css" rel="stylesheet" type="text/css" />
55
58
  <script src="/lib/tailwindcss@4.js"></script>
56
59
  <!-- charts: <script src="/lib/chartjs@4.js"></script> before aimeat-charts -->
@@ -1,6 +1,10 @@
1
1
  /*
2
2
  * @file aimeat-daisyui-bridge.css
3
3
  * @description Theme-compat layer so the bundled cortex UI libraries cohere with daisyUI.
4
+ * (0) Pulls in the AIMEAT daisyUI theme (aimeat-theme.css) so any app already loading this
5
+ * bridge gets the house palette — coral primary, the designed dark surface ramp and
6
+ * correct `-content` pairs — without editing the app. Before this, `--color-primary` was
7
+ * daisyUI's indigo and every branded app hardcoded `#E8564A` by hand.
4
8
  * (1) Maps AIMEAT theme.css variable NAMES to daisyUI 5 theme variables so libs that read
5
9
  * --text / --bg-card / --accent / … follow a daisyUI app's `data-theme` automatically.
6
10
  * (2) Dark-mode polish: a few cortex components hardcode LIGHT colors (no var) — alerts,
@@ -8,12 +12,30 @@
8
12
  * theme-aware tints (`:root .aui-*` wins on specificity). No changes to the libraries.
9
13
  * Load this AFTER the daisyUI stylesheet. Hardcoded fallbacks keep it working if daisyUI
10
14
  * vars are absent.
15
+ *
16
+ * NOTE on daisyUI's OWN components: they are not overridden here. With the theme loaded they
17
+ * are already theme-correct, and daisyUI 5 ships the quiet variants an app usually wants —
18
+ * `badge-soft`, `alert-soft`, `btn-soft`, `card-border`. Reach for those instead of a solid
19
+ * `badge-warning`, which is a loud block of amber on a dark page even when it is legible.
11
20
  * @usage <link href="/lib/daisyui@5.css" rel="stylesheet" />
12
21
  * <link href="/lib/aimeat-daisyui-bridge.css" rel="stylesheet" />
13
22
  * @version-history
14
- * v1.0.0 — 2026-06-26Initial bridge (cortex libs follow daisyUI theme).
23
+ * v1.3.0 — 2026-07-25FIX the --border collision: the bridge mapped --border to a COLOUR at
24
+ * :root for the aui-* cortex components, while daisyUI 5 uses the same name as a border WIDTH
25
+ * inside calc() on nearly every component — the invalid calc collapsed badge/input paddings to
26
+ * 0 and toggles to slivers on every bridge-loading page since v1.0.0. The colour mapping is now
27
+ * scoped to aui-* elements, with a --border-w restore for daisyUI components nested inside.
28
+ * v1.2.0 — 2026-07-25 — @import the AIMEAT daisyUI theme, so the house palette reaches every
29
+ * app that already loads the bridge. Contrast + surface ramp verified by
30
+ * `pnpm check:theme` (tools/theme-contrast.ts).
15
31
  * v1.1.0 — 2026-06-26 — Map --bg-surface-dim (table zebra) + theme-aware alert/badge tints.
32
+ * v1.0.0 — 2026-06-26 — Initial bridge (cortex libs follow daisyUI theme).
16
33
  */
34
+
35
+ /* MUST be the first rule: @import is only valid ahead of ordinary rules. Same-origin, cached
36
+ alongside this file, and a no-op duplicate when the app also links the theme directly. */
37
+ @import url('/lib/aimeat-theme.css');
38
+
17
39
  :root {
18
40
  --text: var(--color-base-content, #1A1A2E);
19
41
  --text-dim: color-mix(in oklab, var(--color-base-content, #6B7280) 70%, transparent);
@@ -24,7 +46,6 @@
24
46
  --bg-surface-dim: color-mix(in oklab, var(--color-base-content, #111827) 5%, var(--color-base-100, #ffffff));
25
47
  --bg-dim: var(--color-base-200, #f3f4f6);
26
48
  --surface: var(--color-base-200, #f3f4f6);
27
- --border: var(--color-base-300, #e5e7eb);
28
49
  --accent: var(--color-primary, #e8564a);
29
50
  --blue: var(--color-info, #3b82f6);
30
51
  --danger: var(--color-error, #ef4444);
@@ -33,6 +54,22 @@
33
54
  --warning: var(--color-warning, #f59e0b);
34
55
  }
35
56
 
57
+ /* ── The --border name collision, fixed. The cortex `aui-*` components read `var(--border)` as a
58
+ border COLOUR; daisyUI 5 reads the same name as a border WIDTH in calc() maths on nearly every
59
+ component (`padding-inline: calc(var(--size)/2 - var(--border))` on .badge, toggle geometry,
60
+ input paddings…). Mapping the colour at :root (bridge v1.0.0–v1.2.0) made those calcs invalid
61
+ at computed-value time, so paddings collapsed to 0 and toggles rendered as slivers on EVERY
62
+ page that loaded this bridge. The colour is now scoped to elements that actually carry an
63
+ aui-* class, and daisyUI components nested inside an aui container get the palette's width
64
+ back via --border-w (declared per theme block in aimeat-theme.css). ── */
65
+ [class^='aui-'], [class*=' aui-'] {
66
+ --border: var(--color-base-300, #e5e7eb);
67
+ }
68
+ [class^='aui-'] :where(.btn, .badge, .toggle, .checkbox, .radio, .input, .select, .textarea, .file-input, .range, .tab, .tabs, .card, .alert, .table, .kbd, .status, .divider, .menu, .modal-box, .stats, .progress),
69
+ [class*=' aui-'] :where(.btn, .badge, .toggle, .checkbox, .radio, .input, .select, .textarea, .file-input, .range, .tab, .tabs, .card, .alert, .table, .kbd, .status, .divider, .menu, .modal-box, .stats, .progress) {
70
+ --border: var(--border-w, 1px);
71
+ }
72
+
36
73
  /* ── Dark-mode polish: override the cortex libs' hardcoded light colors with theme-aware
37
74
  tints. `:root .aui-*` (specificity 0,1,1) beats the libs' `.aui-*` (0,1,0) regardless
38
75
  of stylesheet order. Tint = subtle wash of the semantic colour over the card bg; text
@@ -0,0 +1,538 @@
1
+ /*
2
+ * @file aimeat-theme.css
3
+ * @description THE AIMEAT theme system — five designed palettes, each defining BOTH light and
4
+ * dark, expressed as daisyUI 5 theme variables so a published app gets a finished look without
5
+ * hardcoding a single hex value. Two orthogonal axes (the model proven by aimeat-tdr-cortex):
6
+ *
7
+ * data-theme="light" | "dark" MODE — the user's light/dark choice ('aimeat-theme' key)
8
+ * data-palette="paper" | ... PALETTE — which designed look ('aimeat-palette' key;
9
+ * absent = the default AIMEAT coral palette)
10
+ *
11
+ * Palettes (each with a personality beyond colour — its own display face, radii and border
12
+ * weight; body text is Inter everywhere so content stays quiet and legible):
13
+ * aimeat coral + slate steel, Inter, crisp 6px controls (the house default)
14
+ * paper warm editorial: cream/ink, bordeaux, Fraunces serif display
15
+ * circuit cold technical: steel/blueprint, cyan, JetBrains Mono display
16
+ * contrast high-contrast accessible: black/white, 2px borders, every pair >= 4.5:1
17
+ * mist quiet neutral: low-chroma sage/grey, soft 20px radii
18
+ *
19
+ * Every colour pair is verified by `pnpm check:theme` (tools/theme-contrast.ts), which parses
20
+ * the `@theme-block` markers below and holds each block to: -content pairs (4.5:1, or 3:1 when
21
+ * marked large/bold-UI-only), body text 4.5:1 on page AND card, the card-boundary step + edge,
22
+ * primary >= 3:1 against page and card (WCAG 1.4.11 — a button must be discernible), and the
23
+ * accuracy of every ratio claimed in a comment. Do not edit a colour without re-running it.
24
+ *
25
+ * ELEVATION DIRECTION — deliberately inverted vs daisyUI: base-200 (card) is ELEVATED above
26
+ * base-100 (page) in both modes. base-300 is the strongest separation — borders and dividers.
27
+ *
28
+ * FONTS are self-hosted at /lib/fonts/ (SIL OFL 1.1, latin + latin-ext so ä/ö render) and
29
+ * lazy-load per family: a page only downloads the faces its palette actually uses.
30
+ * @structure @font-face (Inter, Space Grotesk, Fraunces, JetBrains Mono) · shared tokens
31
+ * (type scale, motion, spacing) · per-mode elevation · 5 palettes x 2 modes (each tagged
32
+ * `@theme-block <palette> <mode>` for the verifier) · typography application rules
33
+ * @usage <link href="/lib/daisyui@5.css" rel="stylesheet" />
34
+ * <link href="/lib/aimeat-theme.css" rel="stylesheet" /> <-- after daisyUI
35
+ * <link href="/lib/aimeat-daisyui-bridge.css" rel="stylesheet" />
36
+ * The bridge @imports this file, so an app that already loads the bridge gets it with no edit.
37
+ * Deliberately UNLAYERED: daisyUI declares its themes inside `@layer base`, and any unlayered
38
+ * rule beats every layered one regardless of order or specificity.
39
+ * @version-history
40
+ * v2.1.0 — 2026-07-25 — Owner review round: the default (and mist) display face is Inter — the
41
+ * geometric Space Grotesk read wrong in the hero sizes (the faces stay vendored for apps);
42
+ * aimeat secondary is slate steel #45637A/#9AB8D0 (full 4.5:1+ pairs) instead of the purple;
43
+ * aimeat controls take circuit's crisper shape (field 6px, selector 4px); every block declares
44
+ * --border-w, the width mirror the bridge uses to undo its aui --border colour scoping.
45
+ * v2.0.0 — 2026-07-25 — The theme SYSTEM: data-palette axis (paper/circuit/contrast/mist next
46
+ * to the aimeat default), per-palette display faces (self-hosted OFL fonts), elevation/motion/
47
+ * type-scale tokens, and typography application (body=Inter, headings=palette display face).
48
+ * Additive: the default palette's colour values are unchanged from v1.0.0.
49
+ * v1.0.0 — 2026-07-25 — Initial AIMEAT daisyUI theme (single coral palette, light + dark).
50
+ */
51
+
52
+ /* ── SELF-HOSTED FACES (/lib/fonts/, SIL OFL 1.1 — see /lib/fonts/LICENSE.md) ──
53
+ Variable fonts, latin + latin-ext subsets. Browsers fetch a face only when a rendered
54
+ element actually uses it, so unused palettes cost nothing. */
55
+ @font-face {
56
+ font-family: 'Inter'; font-style: normal; font-weight: 100 900; font-display: swap;
57
+ src: url('/lib/fonts/inter-var-latin.woff2') format('woff2');
58
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
59
+ }
60
+ @font-face {
61
+ font-family: 'Inter'; font-style: normal; font-weight: 100 900; font-display: swap;
62
+ src: url('/lib/fonts/inter-var-latin-ext.woff2') format('woff2');
63
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
64
+ }
65
+ @font-face {
66
+ font-family: 'Space Grotesk'; font-style: normal; font-weight: 300 700; font-display: swap;
67
+ src: url('/lib/fonts/space-grotesk-var-latin.woff2') format('woff2');
68
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
69
+ }
70
+ @font-face {
71
+ font-family: 'Space Grotesk'; font-style: normal; font-weight: 300 700; font-display: swap;
72
+ src: url('/lib/fonts/space-grotesk-var-latin-ext.woff2') format('woff2');
73
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
74
+ }
75
+ @font-face {
76
+ font-family: 'Fraunces'; font-style: normal; font-weight: 100 900; font-display: swap;
77
+ src: url('/lib/fonts/fraunces-var-latin.woff2') format('woff2');
78
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
79
+ }
80
+ @font-face {
81
+ font-family: 'Fraunces'; font-style: normal; font-weight: 100 900; font-display: swap;
82
+ src: url('/lib/fonts/fraunces-var-latin-ext.woff2') format('woff2');
83
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
84
+ }
85
+ @font-face {
86
+ font-family: 'JetBrains Mono'; font-style: normal; font-weight: 100 800; font-display: swap;
87
+ src: url('/lib/fonts/jetbrains-mono-var-latin.woff2') format('woff2');
88
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
89
+ }
90
+ @font-face {
91
+ font-family: 'JetBrains Mono'; font-style: normal; font-weight: 100 800; font-display: swap;
92
+ src: url('/lib/fonts/jetbrains-mono-var-latin-ext.woff2') format('woff2');
93
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
94
+ }
95
+
96
+ /* ── SHARED TOKENS (palette-independent) ─────────────────────────────────────
97
+ Type scale: a real hierarchy an app can lean on instead of inventing sizes.
98
+ Motion: durations + easings for the cortex libs and app transitions.
99
+ Spacing rhythm: gaps that make unrelated apps read as one product. */
100
+ :root {
101
+ --text-hero: clamp(1.9rem, 1.3rem + 2.4vw, 2.75rem); /* the one biggest thing on the page */
102
+ --text-title: 1.375rem; /* section/card titles */
103
+ --text-body: 0.9375rem; /* default reading size (15px) */
104
+ --text-fine: 0.8125rem; /* captions/meta — never smaller (13px) */
105
+
106
+ --motion-fast: 120ms;
107
+ --motion-base: 200ms;
108
+ --motion-slow: 320ms;
109
+ --ease-out: cubic-bezier(0.2, 0.8, 0.3, 1);
110
+ --ease-inout: cubic-bezier(0.65, 0, 0.35, 1);
111
+
112
+ --gap-card: 1rem; /* inside a card */
113
+ --gap-section: 1.5rem; /* between cards/sections */
114
+ }
115
+
116
+ /* ── ELEVATION (follows MODE, not palette) ───────────────────────────────────
117
+ Three steps: card (resting), raise (hover/dragging), pop (menus/dialogs). Dark shadows in
118
+ both modes — light-on-dark "glow" shadows read as smears. */
119
+ :root,
120
+ [data-theme='light'] {
121
+ --elev-card: 0 1px 2px rgb(15 18 25 / 0.06), 0 4px 14px rgb(15 18 25 / 0.05);
122
+ --elev-raise: 0 2px 4px rgb(15 18 25 / 0.08), 0 10px 24px rgb(15 18 25 / 0.09);
123
+ --elev-pop: 0 4px 10px rgb(15 18 25 / 0.10), 0 18px 44px rgb(15 18 25 / 0.16);
124
+ }
125
+ [data-theme='dark'] {
126
+ --elev-card: 0 1px 2px rgb(0 0 0 / 0.45), 0 5px 16px rgb(0 0 0 / 0.30);
127
+ --elev-raise: 0 2px 5px rgb(0 0 0 / 0.50), 0 12px 28px rgb(0 0 0 / 0.38);
128
+ --elev-pop: 0 5px 12px rgb(0 0 0 / 0.55), 0 22px 52px rgb(0 0 0 / 0.48);
129
+ }
130
+
131
+ /* ═══ PALETTE: aimeat (default — coral + slate, Space Grotesk display) ═══════ */
132
+
133
+ /* @theme-block aimeat light */
134
+ :root,
135
+ [data-theme='light'] {
136
+ color-scheme: light;
137
+
138
+ /* Surfaces. base-100 = page AND the default form-control fill, base-200 = card (elevated),
139
+ base-300 = wells + borders. The page must be a real step off a white card, or cards and the
140
+ inputs daisyUI fills with base-100 vanish (the v1.0.0 lesson — see check:theme). */
141
+ --color-base-100: #efeee8;
142
+ --color-base-200: #ffffff;
143
+ --color-base-300: #d9dbe1;
144
+ --color-base-content: #1a1a2e; /* 14.7:1 on base-100, 17.1:1 on base-200 */
145
+
146
+ /* Brand. Coral is the AIMEAT heart. */
147
+ --color-primary: #e8564a;
148
+ --color-primary-content: #ffffff; /* 3.6:1 — large/bold UI text only, per the SPA */
149
+ --color-secondary: #45637a;
150
+ --color-secondary-content: #ffffff; /* 6.3:1 */
151
+ --color-accent: #06b6d4;
152
+ --color-accent-content: #06253a; /* 6.5:1 — teal needs DARK content; white is 2.4:1 */
153
+ --color-neutral: #1a1a2e;
154
+ --color-neutral-content: #ffffff; /* 17.1:1 */
155
+
156
+ /* Semantic. */
157
+ --color-info: #3b82f6;
158
+ --color-info-content: #ffffff; /* 3.7:1 — large/bold UI text only */
159
+ --color-success: #10b981;
160
+ --color-success-content: #05271c; /* 6.3:1 — green is LIGHT; white fails at 2.5:1 */
161
+ --color-warning: #f59e0b;
162
+ --color-warning-content: #1a1a2e; /* 7.9:1 — amber is LIGHT; white fails at 2.2:1 */
163
+ --color-error: #ef4444;
164
+ --color-error-content: #ffffff; /* 3.8:1 — large/bold UI text only */
165
+
166
+ /* Shape + type. AIMEAT is generous on boxes, tighter on controls, flat + shadow. */
167
+ --radius-box: 16px;
168
+ --radius-field: 6px;
169
+ --radius-selector: 4px;
170
+ --border: 1px;
171
+ --border-w: 1px;
172
+ --depth: 0;
173
+ --noise: 0;
174
+ --font-display: 'Inter', 'Segoe UI', system-ui, sans-serif;
175
+ --font-body: 'Inter', 'Segoe UI', system-ui, sans-serif;
176
+ --font-mono: 'JetBrains Mono', 'Cascadia Code', Consolas, monospace;
177
+ --display-tracking: -0.01em;
178
+ }
179
+
180
+ /* @theme-block aimeat dark */
181
+ [data-theme='dark'] {
182
+ color-scheme: dark;
183
+
184
+ /* The designed dark ramp: real separation between page, card and edge. */
185
+ --color-base-100: #14151a;
186
+ --color-base-200: #21232e;
187
+ --color-base-300: #383c46;
188
+ --color-base-content: #edeef2; /* 15.7:1 on base-100, 13.5:1 on base-200 */
189
+
190
+ /* Brand. Coral is brightened for dark surfaces — the brand stays coral, the contrast holds. */
191
+ --color-primary: #ff6f62; /* 6.7:1 as text/icon on base-100 */
192
+ --color-primary-content: #14151a; /* 6.7:1 — white on this coral FAILS at 2.7:1 */
193
+ --color-secondary: #9ab8d0;
194
+ --color-secondary-content: #14151a; /* 8.8:1 */
195
+ --color-accent: #22d3ee;
196
+ --color-accent-content: #06253a; /* 8.7:1 */
197
+ --color-neutral: #23262f;
198
+ --color-neutral-content: #edeef2; /* 13.0:1 */
199
+
200
+ /* Semantic — brightened so they read as light-on-dark, with dark content on every fill. */
201
+ --color-info: #60a5fa;
202
+ --color-info-content: #0b1b33; /* 6.8:1 */
203
+ --color-success: #34d399;
204
+ --color-success-content: #05271c; /* 8.3:1 */
205
+ --color-warning: #fbbf24;
206
+ --color-warning-content: #1a1a2e; /* 10.2:1 */
207
+ --color-error: #f87171;
208
+ --color-error-content: #2a0a0a; /* 6.6:1 */
209
+
210
+ --radius-box: 16px;
211
+ --radius-field: 6px;
212
+ --radius-selector: 4px;
213
+ --border: 1px;
214
+ --border-w: 1px;
215
+ --depth: 0;
216
+ --noise: 0;
217
+ --font-display: 'Inter', 'Segoe UI', system-ui, sans-serif;
218
+ --font-body: 'Inter', 'Segoe UI', system-ui, sans-serif;
219
+ --font-mono: 'JetBrains Mono', 'Cascadia Code', Consolas, monospace;
220
+ --display-tracking: -0.01em;
221
+ }
222
+
223
+ /* ═══ PALETTE: paper (warm editorial — cream/ink, bordeaux, Fraunces display) ═
224
+ The `html[data-palette]` prefix outranks the base blocks (0,1,1 vs 0,1,0), and the
225
+ palette-dark block outranks palette-light (0,2,1) — so the cascade is decided by
226
+ specificity, never by source order. Every block is COMPLETE: all tokens, both modes. */
227
+
228
+ /* @theme-block paper light */
229
+ html[data-palette='paper'] {
230
+ color-scheme: light;
231
+ --color-base-100: #eae2cf;
232
+ --color-base-200: #fdfaf1;
233
+ --color-base-300: #d2c6aa;
234
+ --color-base-content: #26201a; /* 12.5:1 on base-100, 15.4:1 on base-200 */
235
+ --color-primary: #a03040;
236
+ --color-primary-content: #ffffff; /* 7.0:1 */
237
+ --color-secondary: #7d5a3c;
238
+ --color-secondary-content: #ffffff; /* 6.2:1 */
239
+ --color-accent: #3f6e58;
240
+ --color-accent-content: #ffffff; /* 5.9:1 */
241
+ --color-neutral: #26201a;
242
+ --color-neutral-content: #f7f2e8; /* 14.4:1 */
243
+ --color-info: #2f6da8;
244
+ --color-info-content: #ffffff; /* 5.4:1 */
245
+ --color-success: #2f7d4f;
246
+ --color-success-content: #ffffff; /* 5.0:1 */
247
+ --color-warning: #b9770a;
248
+ --color-warning-content: #26140a; /* 4.8:1 */
249
+ --color-error: #b03028;
250
+ --color-error-content: #ffffff; /* 6.4:1 */
251
+ --radius-box: 10px;
252
+ --radius-field: 8px;
253
+ --radius-selector: 4px;
254
+ --border: 1px;
255
+ --border-w: 1px;
256
+ --depth: 0;
257
+ --noise: 0;
258
+ --font-display: 'Fraunces', Georgia, 'Times New Roman', serif;
259
+ --font-body: 'Inter', 'Segoe UI', system-ui, sans-serif;
260
+ --font-mono: 'JetBrains Mono', 'Cascadia Code', Consolas, monospace;
261
+ --display-tracking: 0;
262
+ }
263
+
264
+ /* @theme-block paper dark */
265
+ html[data-palette='paper'][data-theme='dark'] {
266
+ color-scheme: dark;
267
+ --color-base-100: #151110;
268
+ --color-base-200: #282017;
269
+ --color-base-300: #453b2d;
270
+ --color-base-content: #ece4d4; /* 14.8:1 on base-100, 12.7:1 on base-200 */
271
+ --color-primary: #e08590;
272
+ --color-primary-content: #2a0e14; /* 6.8:1 */
273
+ --color-secondary: #c9a06a;
274
+ --color-secondary-content: #241708; /* 7.3:1 */
275
+ --color-accent: #86c2a5;
276
+ --color-accent-content: #0c2a1c; /* 7.5:1 */
277
+ --color-neutral: #241e18;
278
+ --color-neutral-content: #ece4d4; /* 13.0:1 */
279
+ --color-info: #7fb3e3;
280
+ --color-info-content: #0d2135; /* 7.4:1 */
281
+ --color-success: #7fce9f;
282
+ --color-success-content: #0b2a18; /* 8.3:1 */
283
+ --color-warning: #e6b45a;
284
+ --color-warning-content: #2a1d05; /* 8.7:1 */
285
+ --color-error: #ee8f85;
286
+ --color-error-content: #2c0d0a; /* 7.6:1 */
287
+ --radius-box: 10px;
288
+ --radius-field: 8px;
289
+ --radius-selector: 4px;
290
+ --border: 1px;
291
+ --border-w: 1px;
292
+ --depth: 0;
293
+ --noise: 0;
294
+ --font-display: 'Fraunces', Georgia, 'Times New Roman', serif;
295
+ --font-body: 'Inter', 'Segoe UI', system-ui, sans-serif;
296
+ --font-mono: 'JetBrains Mono', 'Cascadia Code', Consolas, monospace;
297
+ --display-tracking: 0;
298
+ }
299
+
300
+ /* ═══ PALETTE: circuit (cold technical — steel/blueprint, cyan, mono display) ═ */
301
+
302
+ /* @theme-block circuit light */
303
+ html[data-palette='circuit'] {
304
+ color-scheme: light;
305
+ --color-base-100: #e9edf1;
306
+ --color-base-200: #ffffff;
307
+ --color-base-300: #c3cdd8;
308
+ --color-base-content: #10181f; /* 15.2:1 on base-100, 17.9:1 on base-200 */
309
+ --color-primary: #0e7290;
310
+ --color-primary-content: #ffffff; /* 5.5:1 */
311
+ --color-secondary: #47566b;
312
+ --color-secondary-content: #ffffff; /* 7.5:1 */
313
+ --color-accent: #9a5b00;
314
+ --color-accent-content: #ffffff; /* 5.4:1 */
315
+ --color-neutral: #10181f;
316
+ --color-neutral-content: #e9edf1; /* 15.2:1 */
317
+ --color-info: #2563eb;
318
+ --color-info-content: #ffffff; /* 5.2:1 */
319
+ --color-success: #177245;
320
+ --color-success-content: #ffffff; /* 6.0:1 */
321
+ --color-warning: #a16207;
322
+ --color-warning-content: #ffffff; /* 4.9:1 */
323
+ --color-error: #c62828;
324
+ --color-error-content: #ffffff; /* 5.6:1 */
325
+ --radius-box: 8px;
326
+ --radius-field: 6px;
327
+ --radius-selector: 3px;
328
+ --border: 1px;
329
+ --border-w: 1px;
330
+ --depth: 0;
331
+ --noise: 0;
332
+ --font-display: 'JetBrains Mono', 'Cascadia Code', Consolas, monospace;
333
+ --font-body: 'Inter', 'Segoe UI', system-ui, sans-serif;
334
+ --font-mono: 'JetBrains Mono', 'Cascadia Code', Consolas, monospace;
335
+ --display-tracking: -0.02em;
336
+ }
337
+
338
+ /* @theme-block circuit dark */
339
+ html[data-palette='circuit'][data-theme='dark'] {
340
+ color-scheme: dark;
341
+ --color-base-100: #0a0f14;
342
+ --color-base-200: #18202b;
343
+ --color-base-300: #31404f;
344
+ --color-base-content: #d9e4ee; /* 14.9:1 on base-100, 12.7:1 on base-200 */
345
+ --color-primary: #4fd2f2;
346
+ --color-primary-content: #062a35; /* 8.5:1 */
347
+ --color-secondary: #93a7c0;
348
+ --color-secondary-content: #101823; /* 7.2:1 */
349
+ --color-accent: #ffb454;
350
+ --color-accent-content: #2a1a02; /* 9.5:1 */
351
+ --color-neutral: #151c25;
352
+ --color-neutral-content: #d9e4ee; /* 13.3:1 */
353
+ --color-info: #74a9f7;
354
+ --color-info-content: #0c1b33; /* 7.2:1 */
355
+ --color-success: #56d493;
356
+ --color-success-content: #06281a; /* 8.5:1 */
357
+ --color-warning: #f2c14e;
358
+ --color-warning-content: #271d04; /* 9.9:1 */
359
+ --color-error: #f28b82;
360
+ --color-error-content: #2b0d09; /* 7.6:1 */
361
+ --radius-box: 8px;
362
+ --radius-field: 6px;
363
+ --radius-selector: 3px;
364
+ --border: 1px;
365
+ --border-w: 1px;
366
+ --depth: 0;
367
+ --noise: 0;
368
+ --font-display: 'JetBrains Mono', 'Cascadia Code', Consolas, monospace;
369
+ --font-body: 'Inter', 'Segoe UI', system-ui, sans-serif;
370
+ --font-mono: 'JetBrains Mono', 'Cascadia Code', Consolas, monospace;
371
+ --display-tracking: -0.02em;
372
+ }
373
+
374
+ /* ═══ PALETTE: contrast (high-contrast accessible — black/white, 2px borders) ═
375
+ Every -content pair >= 4.5:1 in both modes; edges are BOLD (>= 2.8:1 against both
376
+ neighbours) so boundaries survive low-vision and bright-sunlight conditions. */
377
+
378
+ /* @theme-block contrast light */
379
+ html[data-palette='contrast'] {
380
+ color-scheme: light;
381
+ --color-base-100: #e9e9e9;
382
+ --color-base-200: #ffffff;
383
+ --color-base-300: #8a8a8a;
384
+ --color-base-content: #000000; /* 17.3:1 on base-100, 21.0:1 on base-200 */
385
+ --color-primary: #1d4ed8;
386
+ --color-primary-content: #ffffff; /* 6.7:1 */
387
+ --color-secondary: #6d28d9;
388
+ --color-secondary-content: #ffffff; /* 7.1:1 */
389
+ --color-accent: #0e7490;
390
+ --color-accent-content: #ffffff; /* 5.4:1 */
391
+ --color-neutral: #000000;
392
+ --color-neutral-content: #ffffff; /* 21.0:1 */
393
+ --color-info: #1e5fa8;
394
+ --color-info-content: #ffffff; /* 6.4:1 */
395
+ --color-success: #15803d;
396
+ --color-success-content: #ffffff; /* 5.0:1 */
397
+ --color-warning: #ffd60a;
398
+ --color-warning-content: #241a00; /* 12.2:1 */
399
+ --color-error: #b91c1c;
400
+ --color-error-content: #ffffff; /* 6.5:1 */
401
+ --radius-box: 12px;
402
+ --radius-field: 8px;
403
+ --radius-selector: 4px;
404
+ --border: 2px;
405
+ --border-w: 2px;
406
+ --depth: 0;
407
+ --noise: 0;
408
+ --font-display: 'Inter', 'Segoe UI', system-ui, sans-serif;
409
+ --font-body: 'Inter', 'Segoe UI', system-ui, sans-serif;
410
+ --font-mono: 'JetBrains Mono', 'Cascadia Code', Consolas, monospace;
411
+ --display-tracking: -0.01em;
412
+ }
413
+
414
+ /* @theme-block contrast dark */
415
+ html[data-palette='contrast'][data-theme='dark'] {
416
+ color-scheme: dark;
417
+ --color-base-100: #000000;
418
+ --color-base-200: #17171c;
419
+ --color-base-300: #62626c;
420
+ --color-base-content: #ffffff; /* 21.0:1 on base-100, 17.9:1 on base-200 */
421
+ --color-primary: #99c2ff;
422
+ --color-primary-content: #001433; /* 10.0:1 */
423
+ --color-secondary: #cdb1ff;
424
+ --color-secondary-content: #1d0a40; /* 9.7:1 */
425
+ --color-accent: #6fe3ff;
426
+ --color-accent-content: #003040; /* 9.4:1 */
427
+ --color-neutral: #ffffff;
428
+ --color-neutral-content: #000000; /* 21.0:1 */
429
+ --color-info: #8ab8ff;
430
+ --color-info-content: #001b3d; /* 8.5:1 */
431
+ --color-success: #6fe3a1;
432
+ --color-success-content: #00250f; /* 10.4:1 */
433
+ --color-warning: #ffd60a;
434
+ --color-warning-content: #241a00; /* 12.2:1 */
435
+ --color-error: #ff9d94;
436
+ --color-error-content: #300500; /* 9.2:1 */
437
+ --radius-box: 12px;
438
+ --radius-field: 8px;
439
+ --radius-selector: 4px;
440
+ --border: 2px;
441
+ --border-w: 2px;
442
+ --depth: 0;
443
+ --noise: 0;
444
+ --font-display: 'Inter', 'Segoe UI', system-ui, sans-serif;
445
+ --font-body: 'Inter', 'Segoe UI', system-ui, sans-serif;
446
+ --font-mono: 'JetBrains Mono', 'Cascadia Code', Consolas, monospace;
447
+ --display-tracking: -0.01em;
448
+ }
449
+
450
+ /* ═══ PALETTE: mist (quiet neutral — low-chroma sage/grey, soft radii) ═══════ */
451
+
452
+ /* @theme-block mist light */
453
+ html[data-palette='mist'] {
454
+ color-scheme: light;
455
+ --color-base-100: #e6eae4;
456
+ --color-base-200: #fbfcfa;
457
+ --color-base-300: #c6cec4;
458
+ --color-base-content: #2b322d; /* 10.8:1 on base-100, 12.8:1 on base-200 */
459
+ --color-primary: #47695a;
460
+ --color-primary-content: #ffffff; /* 6.1:1 */
461
+ --color-secondary: #5c6470;
462
+ --color-secondary-content: #ffffff; /* 6.0:1 */
463
+ --color-accent: #7a6455;
464
+ --color-accent-content: #ffffff; /* 5.6:1 */
465
+ --color-neutral: #2b322d;
466
+ --color-neutral-content: #f4f6f3; /* 12.1:1 */
467
+ --color-info: #4a7196;
468
+ --color-info-content: #ffffff; /* 5.1:1 */
469
+ --color-success: #4d7d5f;
470
+ --color-success-content: #ffffff; /* 4.8:1 */
471
+ --color-warning: #8a6d2f;
472
+ --color-warning-content: #ffffff; /* 4.9:1 */
473
+ --color-error: #9c4f47;
474
+ --color-error-content: #ffffff; /* 5.8:1 */
475
+ --radius-box: 20px;
476
+ --radius-field: 12px;
477
+ --radius-selector: 8px;
478
+ --border: 1px;
479
+ --border-w: 1px;
480
+ --depth: 0;
481
+ --noise: 0;
482
+ --font-display: 'Inter', 'Segoe UI', system-ui, sans-serif;
483
+ --font-body: 'Inter', 'Segoe UI', system-ui, sans-serif;
484
+ --font-mono: 'JetBrains Mono', 'Cascadia Code', Consolas, monospace;
485
+ --display-tracking: 0;
486
+ }
487
+
488
+ /* @theme-block mist dark */
489
+ html[data-palette='mist'][data-theme='dark'] {
490
+ color-scheme: dark;
491
+ --color-base-100: #141715;
492
+ --color-base-200: #252b27;
493
+ --color-base-300: #414a44;
494
+ --color-base-content: #e2e6e2; /* 14.3:1 on base-100, 11.5:1 on base-200 */
495
+ --color-primary: #9cc0ae;
496
+ --color-primary-content: #10241a; /* 8.2:1 */
497
+ --color-secondary: #aeb6c0;
498
+ --color-secondary-content: #171b20; /* 8.4:1 */
499
+ --color-accent: #c2ab97;
500
+ --color-accent-content: #241a0e; /* 7.8:1 */
501
+ --color-neutral: #212523;
502
+ --color-neutral-content: #e2e6e2; /* 12.3:1 */
503
+ --color-info: #93b3d1;
504
+ --color-info-content: #101f2e; /* 7.6:1 */
505
+ --color-success: #97c6a6;
506
+ --color-success-content: #10241a; /* 8.5:1 */
507
+ --color-warning: #d3b878;
508
+ --color-warning-content: #241c08; /* 8.8:1 */
509
+ --color-error: #d49a92;
510
+ --color-error-content: #2a100c; /* 7.5:1 */
511
+ --radius-box: 20px;
512
+ --radius-field: 12px;
513
+ --radius-selector: 8px;
514
+ --border: 1px;
515
+ --border-w: 1px;
516
+ --depth: 0;
517
+ --noise: 0;
518
+ --font-display: 'Inter', 'Segoe UI', system-ui, sans-serif;
519
+ --font-body: 'Inter', 'Segoe UI', system-ui, sans-serif;
520
+ --font-mono: 'JetBrains Mono', 'Cascadia Code', Consolas, monospace;
521
+ --display-tracking: 0;
522
+ }
523
+
524
+ /* ── TYPOGRAPHY APPLICATION ──────────────────────────────────────────────────
525
+ Font FAMILY only — never size or weight, which stay with the app's utility classes
526
+ (an unlayered `h1 { font-weight }` would silently override every `font-bold`).
527
+ Body text is the palette's body face; headings + .card-title get the display face,
528
+ which is where a palette's personality lives; code gets the mono face. */
529
+ body {
530
+ font-family: var(--font-body, 'Inter', 'Segoe UI', system-ui, sans-serif);
531
+ }
532
+ h1, h2, h3, h4, h5, h6, .card-title {
533
+ font-family: var(--font-display, 'Inter', 'Segoe UI', system-ui, sans-serif);
534
+ letter-spacing: var(--display-tracking, 0);
535
+ }
536
+ code, pre, kbd, samp {
537
+ font-family: var(--font-mono, 'JetBrains Mono', Consolas, monospace);
538
+ }