@jaimevalasek/aioson 1.3.0 → 1.5.1

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 (330) hide show
  1. package/CHANGELOG.md +31 -1
  2. package/LICENSE +661 -21
  3. package/README.md +22 -3
  4. package/docs/en/squad-dashboard.md +372 -0
  5. package/docs/openclaw-bridge.md +308 -0
  6. package/docs/pt/README.md +62 -2
  7. package/docs/pt/advisor-spec.md +5 -5
  8. package/docs/pt/agentes-customizados.md +670 -0
  9. package/docs/pt/agentes.md +235 -23
  10. package/docs/pt/automacao-squads.md +407 -0
  11. package/docs/pt/cenarios.md +49 -5
  12. package/docs/pt/clientes-ai.md +62 -0
  13. package/docs/pt/comandos-cli.md +226 -17
  14. package/docs/pt/deyvin.md +115 -0
  15. package/docs/pt/genome-3.0-spec.md +11 -11
  16. package/docs/pt/inicio-rapido.md +63 -2
  17. package/docs/pt/memoria-contexto.md +255 -0
  18. package/docs/pt/output-strategy-delivery.md +655 -0
  19. package/docs/pt/profiler-system.md +17 -17
  20. package/docs/pt/runtime-observability.md +5 -1
  21. package/docs/pt/skills.md +175 -0
  22. package/docs/pt/squad-dashboard.md +373 -0
  23. package/docs/pt/{squad-genoma.md → squad-genome.md} +81 -75
  24. package/docs/testing/genome-2.0-matrix.md +5 -5
  25. package/docs/testing/genome-2.0-rollout.md +10 -10
  26. package/package.json +4 -4
  27. package/src/agents.js +21 -5
  28. package/src/backup-local.js +74 -0
  29. package/src/backup-provider.js +303 -0
  30. package/src/cli.js +276 -2
  31. package/src/commands/agents.js +22 -4
  32. package/src/commands/backup-local-cmd.js +25 -0
  33. package/src/commands/backup.js +533 -0
  34. package/src/commands/cloud.js +17 -17
  35. package/src/commands/context-pack.js +45 -0
  36. package/src/commands/implementation-plan.js +340 -0
  37. package/src/commands/learning.js +134 -0
  38. package/src/commands/live.js +1583 -0
  39. package/src/commands/runtime.js +1075 -2
  40. package/src/commands/scan-project.js +288 -24
  41. package/src/commands/setup-context.js +30 -2
  42. package/src/commands/skill.js +558 -0
  43. package/src/commands/squad-agent-create.js +788 -0
  44. package/src/commands/squad-daemon.js +209 -0
  45. package/src/commands/squad-dashboard.js +39 -0
  46. package/src/commands/squad-deploy.js +64 -0
  47. package/src/commands/squad-doctor.js +103 -1
  48. package/src/commands/squad-investigate.js +261 -0
  49. package/src/commands/squad-learning.js +209 -0
  50. package/src/commands/squad-mcp.js +270 -0
  51. package/src/commands/squad-pipeline.js +247 -1
  52. package/src/commands/squad-plan.js +329 -0
  53. package/src/commands/squad-processes.js +56 -0
  54. package/src/commands/squad-recovery.js +42 -0
  55. package/src/commands/squad-roi.js +291 -0
  56. package/src/commands/squad-score.js +250 -0
  57. package/src/commands/squad-status.js +38 -2
  58. package/src/commands/squad-validate.js +118 -1
  59. package/src/commands/squad-webhook.js +160 -0
  60. package/src/commands/squad-worker.js +191 -0
  61. package/src/commands/squad-worktrees.js +75 -0
  62. package/src/commands/test-agents.js +6 -1
  63. package/src/commands/web-map.js +70 -0
  64. package/src/commands/web-scrape.js +71 -0
  65. package/src/commands/workflow-next.js +8 -1
  66. package/src/commands/workflow-status.js +250 -0
  67. package/src/constants.js +88 -16
  68. package/src/context-memory.js +837 -0
  69. package/src/context-writer.js +47 -1
  70. package/src/delivery-runner.js +319 -0
  71. package/src/genome-files.js +1 -1
  72. package/src/genome-format.js +1 -1
  73. package/src/i18n/messages/en.js +333 -8
  74. package/src/i18n/messages/es.js +240 -6
  75. package/src/i18n/messages/fr.js +239 -5
  76. package/src/i18n/messages/pt-BR.js +330 -12
  77. package/src/installer.js +30 -2
  78. package/src/lib/genomes/compat.js +1 -1
  79. package/src/lib/webhook-server.js +328 -0
  80. package/src/mcp-connectors/registry.js +602 -0
  81. package/src/runtime-store.js +1037 -42
  82. package/src/session-handoff.js +77 -0
  83. package/src/squad/external-session.js +180 -0
  84. package/src/squad/inter-squad.js +74 -0
  85. package/src/squad/recovery-context.js +201 -0
  86. package/src/squad/worktree-manager.js +114 -0
  87. package/src/squad-daemon.js +490 -0
  88. package/src/squad-dashboard/api.js +223 -0
  89. package/src/squad-dashboard/attachment-handler.js +93 -0
  90. package/src/squad-dashboard/context-monitor.js +157 -0
  91. package/src/squad-dashboard/execution-logs.js +115 -0
  92. package/src/squad-dashboard/hunk-review.js +209 -0
  93. package/src/squad-dashboard/metrics.js +133 -0
  94. package/src/squad-dashboard/process-monitor.js +125 -0
  95. package/src/squad-dashboard/renderer.js +858 -0
  96. package/src/squad-dashboard/server.js +232 -0
  97. package/src/squad-dashboard/styles.js +525 -0
  98. package/src/squad-dashboard/token-tracker.js +99 -0
  99. package/src/web.js +284 -0
  100. package/src/worker-runner.js +339 -0
  101. package/template/.aioson/agents/analyst.md +40 -9
  102. package/template/.aioson/agents/architect.md +24 -5
  103. package/template/.aioson/agents/dev.md +254 -25
  104. package/template/.aioson/agents/deyvin.md +174 -0
  105. package/template/.aioson/agents/discovery-design-doc.md +25 -1
  106. package/template/.aioson/agents/{genoma.md → genome.md} +20 -20
  107. package/template/.aioson/agents/neo.md +152 -0
  108. package/template/.aioson/agents/orache.md +388 -0
  109. package/template/.aioson/agents/orchestrator.md +63 -2
  110. package/template/.aioson/agents/pair.md +5 -0
  111. package/template/.aioson/agents/pm.md +17 -5
  112. package/template/.aioson/agents/product.md +113 -29
  113. package/template/.aioson/agents/profiler-enricher.md +1 -1
  114. package/template/.aioson/agents/profiler-forge.md +9 -9
  115. package/template/.aioson/agents/profiler-researcher.md +1 -1
  116. package/template/.aioson/agents/qa.md +18 -5
  117. package/template/.aioson/agents/setup.md +138 -18
  118. package/template/.aioson/agents/sheldon.md +603 -0
  119. package/template/.aioson/agents/squad.md +866 -28
  120. package/template/.aioson/agents/tester.md +254 -0
  121. package/template/.aioson/agents/ux-ui.md +289 -34
  122. package/template/.aioson/config.md +181 -0
  123. package/template/.aioson/context/spec.md.template +17 -0
  124. package/template/.aioson/genomes/.gitkeep +0 -0
  125. package/template/.aioson/installed-skills/.gitkeep +0 -0
  126. package/template/.aioson/locales/en/agents/analyst.md +34 -4
  127. package/template/.aioson/locales/en/agents/architect.md +18 -0
  128. package/template/.aioson/locales/en/agents/dev.md +155 -11
  129. package/template/.aioson/locales/en/agents/deyvin.md +137 -0
  130. package/template/.aioson/locales/en/agents/{genoma.md → genome.md} +14 -14
  131. package/template/.aioson/locales/en/agents/neo.md +8 -0
  132. package/template/.aioson/locales/en/agents/orchestrator.md +62 -2
  133. package/template/.aioson/locales/en/agents/pair.md +5 -0
  134. package/template/.aioson/locales/en/agents/pm.md +7 -0
  135. package/template/.aioson/locales/en/agents/product.md +35 -17
  136. package/template/.aioson/locales/en/agents/qa.md +56 -0
  137. package/template/.aioson/locales/en/agents/setup.md +53 -6
  138. package/template/.aioson/locales/en/agents/sheldon.md +340 -0
  139. package/template/.aioson/locales/en/agents/squad.md +203 -15
  140. package/template/.aioson/locales/en/agents/ux-ui.md +383 -35
  141. package/template/.aioson/locales/es/agents/analyst.md +24 -4
  142. package/template/.aioson/locales/es/agents/architect.md +18 -0
  143. package/template/.aioson/locales/es/agents/dev.md +136 -9
  144. package/template/.aioson/locales/es/agents/deyvin.md +97 -0
  145. package/template/.aioson/locales/es/agents/{genoma.md → genome.md} +13 -13
  146. package/template/.aioson/locales/es/agents/neo.md +48 -0
  147. package/template/.aioson/locales/es/agents/orache.md +103 -0
  148. package/template/.aioson/locales/es/agents/orchestrator.md +62 -2
  149. package/template/.aioson/locales/es/agents/pair.md +5 -0
  150. package/template/.aioson/locales/es/agents/pm.md +7 -0
  151. package/template/.aioson/locales/es/agents/product.md +13 -3
  152. package/template/.aioson/locales/es/agents/qa.md +33 -0
  153. package/template/.aioson/locales/es/agents/setup.md +30 -6
  154. package/template/.aioson/locales/es/agents/sheldon.md +192 -0
  155. package/template/.aioson/locales/es/agents/squad.md +284 -15
  156. package/template/.aioson/locales/es/agents/ux-ui.md +34 -25
  157. package/template/.aioson/locales/fr/agents/analyst.md +24 -4
  158. package/template/.aioson/locales/fr/agents/architect.md +18 -0
  159. package/template/.aioson/locales/fr/agents/dev.md +136 -9
  160. package/template/.aioson/locales/fr/agents/deyvin.md +97 -0
  161. package/template/.aioson/locales/fr/agents/{genoma.md → genome.md} +7 -7
  162. package/template/.aioson/locales/fr/agents/neo.md +48 -0
  163. package/template/.aioson/locales/fr/agents/orache.md +104 -0
  164. package/template/.aioson/locales/fr/agents/orchestrator.md +62 -2
  165. package/template/.aioson/locales/fr/agents/pair.md +5 -0
  166. package/template/.aioson/locales/fr/agents/pm.md +7 -0
  167. package/template/.aioson/locales/fr/agents/product.md +13 -3
  168. package/template/.aioson/locales/fr/agents/qa.md +33 -0
  169. package/template/.aioson/locales/fr/agents/setup.md +30 -6
  170. package/template/.aioson/locales/fr/agents/sheldon.md +192 -0
  171. package/template/.aioson/locales/fr/agents/squad.md +279 -10
  172. package/template/.aioson/locales/fr/agents/ux-ui.md +34 -25
  173. package/template/.aioson/locales/pt-BR/agents/analyst.md +45 -4
  174. package/template/.aioson/locales/pt-BR/agents/architect.md +29 -0
  175. package/template/.aioson/locales/pt-BR/agents/dev.md +167 -15
  176. package/template/.aioson/locales/pt-BR/agents/deyvin.md +137 -0
  177. package/template/.aioson/locales/pt-BR/agents/{genoma.md → genome.md} +49 -49
  178. package/template/.aioson/locales/pt-BR/agents/neo.md +147 -0
  179. package/template/.aioson/locales/pt-BR/agents/orache.md +137 -0
  180. package/template/.aioson/locales/pt-BR/agents/orchestrator.md +62 -2
  181. package/template/.aioson/locales/pt-BR/agents/pair.md +5 -0
  182. package/template/.aioson/locales/pt-BR/agents/pm.md +7 -0
  183. package/template/.aioson/locales/pt-BR/agents/product.md +43 -20
  184. package/template/.aioson/locales/pt-BR/agents/qa.md +67 -0
  185. package/template/.aioson/locales/pt-BR/agents/setup.md +53 -6
  186. package/template/.aioson/locales/pt-BR/agents/sheldon.md +192 -0
  187. package/template/.aioson/locales/pt-BR/agents/squad.md +591 -47
  188. package/template/.aioson/locales/pt-BR/agents/ux-ui.md +369 -22
  189. package/template/.aioson/my-agents/.gitkeep +0 -0
  190. package/template/.aioson/rules/.gitkeep +0 -0
  191. package/template/.aioson/rules/squad/.gitkeep +0 -0
  192. package/template/.aioson/rules/squad/README.md +50 -0
  193. package/template/.aioson/schemas/genome-meta.schema.json +1 -1
  194. package/template/.aioson/schemas/genome.schema.json +1 -1
  195. package/template/.aioson/schemas/squad-blueprint.schema.json +32 -0
  196. package/template/.aioson/schemas/squad-manifest.schema.json +434 -1
  197. package/template/.aioson/skills/design/bold-editorial-ui/SKILL.md +205 -0
  198. package/template/.aioson/skills/design/bold-editorial-ui/references/art-direction.md +338 -0
  199. package/template/.aioson/skills/design/bold-editorial-ui/references/components.md +977 -0
  200. package/template/.aioson/skills/design/bold-editorial-ui/references/dashboards.md +218 -0
  201. package/template/.aioson/skills/design/bold-editorial-ui/references/design-tokens.md +326 -0
  202. package/template/.aioson/skills/design/bold-editorial-ui/references/motion.md +461 -0
  203. package/template/.aioson/skills/design/bold-editorial-ui/references/patterns.md +293 -0
  204. package/template/.aioson/skills/design/bold-editorial-ui/references/websites.md +352 -0
  205. package/template/.aioson/skills/design/clean-saas-ui/SKILL.md +210 -0
  206. package/template/.aioson/skills/design/clean-saas-ui/references/art-direction.md +319 -0
  207. package/template/.aioson/skills/design/clean-saas-ui/references/components.md +365 -0
  208. package/template/.aioson/skills/design/clean-saas-ui/references/dashboards.md +196 -0
  209. package/template/.aioson/skills/design/clean-saas-ui/references/design-tokens.md +244 -0
  210. package/template/.aioson/skills/design/clean-saas-ui/references/motion.md +235 -0
  211. package/template/.aioson/skills/design/clean-saas-ui/references/patterns.md +215 -0
  212. package/template/.aioson/skills/design/clean-saas-ui/references/websites.md +295 -0
  213. package/template/.aioson/skills/design/cognitive-core-ui/SKILL.md +203 -0
  214. package/template/.aioson/skills/design/cognitive-core-ui/references/art-direction.md +339 -0
  215. package/template/.aioson/skills/design/cognitive-core-ui/references/components.md +407 -0
  216. package/template/.aioson/skills/design/cognitive-core-ui/references/dashboards.md +272 -0
  217. package/template/.aioson/skills/design/cognitive-core-ui/references/design-tokens.md +524 -0
  218. package/template/.aioson/skills/design/cognitive-core-ui/references/motion.md +277 -0
  219. package/template/.aioson/skills/design/cognitive-core-ui/references/patterns.md +289 -0
  220. package/template/.aioson/skills/design/cognitive-core-ui/references/websites.md +437 -0
  221. package/template/.aioson/skills/design/interface-design/SKILL.md +47 -0
  222. package/template/.aioson/skills/design/interface-design/references/components-and-states.md +105 -0
  223. package/template/.aioson/skills/design/interface-design/references/design-directions.md +101 -0
  224. package/template/.aioson/skills/design/interface-design/references/handoff-and-quality.md +71 -0
  225. package/template/.aioson/skills/design/interface-design/references/intent-and-domain.md +74 -0
  226. package/template/.aioson/skills/design/interface-design/references/tokens-and-depth.md +173 -0
  227. package/template/.aioson/skills/design/premium-command-center-ui/SKILL.md +62 -0
  228. package/template/.aioson/skills/design/premium-command-center-ui/references/operations.md +74 -0
  229. package/template/.aioson/skills/design/premium-command-center-ui/references/patterns.md +116 -0
  230. package/template/.aioson/skills/design/premium-command-center-ui/references/validation.md +47 -0
  231. package/template/.aioson/skills/design/premium-command-center-ui/references/visual-system.md +215 -0
  232. package/template/.aioson/skills/design/warm-craft-ui/SKILL.md +209 -0
  233. package/template/.aioson/skills/design/warm-craft-ui/references/art-direction.md +324 -0
  234. package/template/.aioson/skills/design/warm-craft-ui/references/components.md +508 -0
  235. package/template/.aioson/skills/design/warm-craft-ui/references/dashboards.md +223 -0
  236. package/template/.aioson/skills/design/warm-craft-ui/references/design-tokens.md +374 -0
  237. package/template/.aioson/skills/design/warm-craft-ui/references/motion.md +356 -0
  238. package/template/.aioson/skills/design/warm-craft-ui/references/patterns.md +288 -0
  239. package/template/.aioson/skills/design/warm-craft-ui/references/websites.md +289 -0
  240. package/template/.aioson/skills/design-system/SKILL.md +92 -0
  241. package/template/.aioson/skills/design-system/cognitive-core-ui.skill +0 -0
  242. package/template/.aioson/skills/design-system/components/SKILL.md +274 -0
  243. package/template/.aioson/skills/design-system/components/SKILL.md:Zone.Identifier +0 -0
  244. package/template/.aioson/skills/design-system/dashboards/SKILL.md +184 -0
  245. package/template/.aioson/skills/design-system/dashboards/SKILL.md:Zone.Identifier +0 -0
  246. package/template/.aioson/skills/design-system/foundations/SKILL.md +250 -0
  247. package/template/.aioson/skills/design-system/foundations/SKILL.md:Zone.Identifier +0 -0
  248. package/template/.aioson/skills/design-system/motion/SKILL.md +197 -0
  249. package/template/.aioson/skills/design-system/motion/SKILL.md:Zone.Identifier +0 -0
  250. package/template/.aioson/skills/design-system/patterns/SKILL.md +231 -0
  251. package/template/.aioson/skills/design-system/patterns/SKILL.md:Zone.Identifier +0 -0
  252. package/template/.aioson/skills/premium-visual-design/SKILL.md +83 -0
  253. package/template/.aioson/skills/premium-visual-design/components/agent-badge.md +92 -0
  254. package/template/.aioson/skills/premium-visual-design/components/dependency-node.md +102 -0
  255. package/template/.aioson/skills/premium-visual-design/components/mention-autocomplete.md +136 -0
  256. package/template/.aioson/skills/premium-visual-design/components/notification-center.md +136 -0
  257. package/template/.aioson/skills/premium-visual-design/components/review-action-bar.md +188 -0
  258. package/template/.aioson/skills/premium-visual-design/components/team-switcher.md +131 -0
  259. package/template/.aioson/skills/premium-visual-design/patterns/agent-message-thread.md +198 -0
  260. package/template/.aioson/skills/premium-visual-design/patterns/notification-panel.md +275 -0
  261. package/template/.aioson/skills/premium-visual-design/patterns/review-workflow-ui.md +234 -0
  262. package/template/.aioson/skills/premium-visual-design/patterns/task-dependency-graph.md +147 -0
  263. package/template/.aioson/skills/premium-visual-design/tokens/status-extended.md +142 -0
  264. package/template/.aioson/skills/squad/SKILL.md +58 -0
  265. package/template/.aioson/skills/squad/domains/.gitkeep +0 -0
  266. package/template/.aioson/skills/squad/formats/.gitkeep +0 -0
  267. package/template/.aioson/skills/squad/formats/catalog.json +15 -0
  268. package/template/.aioson/skills/squad/formats/content/blog-post.md +47 -0
  269. package/template/.aioson/skills/squad/formats/content/newsletter.md +47 -0
  270. package/template/.aioson/skills/squad/formats/creative/podcast-script.md +43 -0
  271. package/template/.aioson/skills/squad/formats/creative/video-script.md +41 -0
  272. package/template/.aioson/skills/squad/formats/social/instagram-feed.md +42 -0
  273. package/template/.aioson/skills/squad/formats/social/linkedin-post.md +42 -0
  274. package/template/.aioson/skills/squad/formats/social/tiktok.md +39 -0
  275. package/template/.aioson/skills/squad/formats/social/twitter-thread.md +39 -0
  276. package/template/.aioson/skills/squad/formats/social/youtube-long.md +47 -0
  277. package/template/.aioson/skills/squad/formats/social/youtube-shorts.md +39 -0
  278. package/template/.aioson/skills/squad/patterns/.gitkeep +0 -0
  279. package/template/.aioson/skills/squad/patterns/multi-platform-pattern.md +108 -0
  280. package/template/.aioson/skills/squad/patterns/persona-based-pattern.md +98 -0
  281. package/template/.aioson/skills/squad/patterns/pipeline-pattern.md +106 -0
  282. package/template/.aioson/skills/squad/patterns/review-loop-pattern.md +81 -0
  283. package/template/.aioson/skills/squad/references/.gitkeep +0 -0
  284. package/template/.aioson/skills/squad/references/checklist-templates.md +122 -0
  285. package/template/.aioson/skills/squad/references/executor-archetypes.md +123 -0
  286. package/template/.aioson/skills/squad/references/workflow-templates.md +169 -0
  287. package/template/.aioson/skills/static/debugging-protocol.md +42 -0
  288. package/template/.aioson/skills/static/git-worktrees.md +36 -0
  289. package/template/.aioson/tasks/implementation-plan.md +307 -0
  290. package/template/.aioson/tasks/squad-create.md +1 -1
  291. package/template/.aioson/tasks/squad-design.md +28 -0
  292. package/template/.aioson/tasks/squad-execution-plan.md +279 -0
  293. package/template/.aioson/tasks/squad-export.md +1 -1
  294. package/template/.aioson/tasks/squad-investigate.md +44 -0
  295. package/template/.aioson/tasks/squad-learning-review.md +44 -0
  296. package/template/.aioson/tasks/squad-output-config.md +177 -0
  297. package/template/.aioson/tasks/squad-profile.md +48 -0
  298. package/template/.aioson/tasks/squad-review.md +61 -0
  299. package/template/.aioson/tasks/squad-task-decompose.md +66 -0
  300. package/template/.aioson/tasks/squad-validate.md +1 -1
  301. package/template/.claude/commands/aioson/agent/deyvin.md +5 -0
  302. package/template/.claude/commands/aioson/agent/discovery-design-doc.md +5 -0
  303. package/template/.claude/commands/aioson/agent/genome.md +5 -0
  304. package/template/.claude/commands/aioson/agent/neo.md +5 -0
  305. package/template/.claude/commands/aioson/agent/product.md +5 -0
  306. package/template/.claude/commands/aioson/agent/profiler-enricher.md +5 -0
  307. package/template/.claude/commands/aioson/agent/profiler-forge.md +5 -0
  308. package/template/.claude/commands/aioson/agent/profiler-researcher.md +5 -0
  309. package/template/.claude/commands/aioson/agent/squad.md +5 -0
  310. package/template/.claude/commands/aioson/agent/tester.md +5 -0
  311. package/template/.gemini/GEMINI.md +3 -0
  312. package/template/.gemini/commands/aios-deyvin.toml +6 -0
  313. package/template/.gemini/commands/aios-neo.toml +4 -0
  314. package/template/.gemini/commands/aios-pair.toml +6 -0
  315. package/template/.gemini/commands/aios-tester.toml +6 -0
  316. package/template/AGENTS.md +37 -6
  317. package/template/CLAUDE.md +34 -4
  318. package/template/OPENCODE.md +8 -2
  319. package/template/squad-searches/.gitkeep +0 -0
  320. package/template/.aioson/skills/static/interface-design.md +0 -372
  321. package/template/.aioson/skills/static/premium-command-center-ui.md +0 -190
  322. /package/template/.aioson/{genomas → docs}/.gitkeep +0 -0
  323. /package/template/.claude/commands/aioson/{analyst.md → agent/analyst.md} +0 -0
  324. /package/template/.claude/commands/aioson/{architect.md → agent/architect.md} +0 -0
  325. /package/template/.claude/commands/aioson/{dev.md → agent/dev.md} +0 -0
  326. /package/template/.claude/commands/aioson/{orchestrator.md → agent/orchestrator.md} +0 -0
  327. /package/template/.claude/commands/aioson/{pm.md → agent/pm.md} +0 -0
  328. /package/template/.claude/commands/aioson/{qa.md → agent/qa.md} +0 -0
  329. /package/template/.claude/commands/aioson/{setup.md → agent/setup.md} +0 -0
  330. /package/template/.claude/commands/aioson/{ux-ui.md → agent/ux-ui.md} +0 -0
@@ -0,0 +1,277 @@
1
+ # Motion — Cognitive Core UI
2
+
3
+ Read after `design-tokens.md`. Add to context only when motion materially improves the result.
4
+
5
+ Motion is **purposeful and restrained**. Dashboards use minimal motion. Landing pages use more dramatic entrances and scroll effects.
6
+
7
+ ---
8
+
9
+ ## Principles
10
+
11
+ 1. **Functional first** — every animation communicates state change or hierarchy
12
+ 2. **Fast transitions** — UI state: 140ms. Theme: 240ms. Entrances: 400–600ms
13
+ 3. **Ease curves** — default `ease`. Entrances: `cubic-bezier(0.16, 1, 0.3, 1)` (smooth decelerate)
14
+ 4. **No bounce, no elastic** — this is a command center, not a toy
15
+ 5. **Always include** `@media (prefers-reduced-motion: reduce)` fallback
16
+
17
+ ---
18
+
19
+ ## CSS Keyframes
20
+
21
+ ```css
22
+ @keyframes fadeInUp {
23
+ from { opacity: 0; transform: translateY(20px); }
24
+ to { opacity: 1; transform: translateY(0); }
25
+ }
26
+ @keyframes fadeInDown {
27
+ from { opacity: 0; transform: translateY(-12px); }
28
+ to { opacity: 1; transform: translateY(0); }
29
+ }
30
+ @keyframes fadeIn {
31
+ from { opacity: 0; }
32
+ to { opacity: 1; }
33
+ }
34
+ @keyframes slideInLeft {
35
+ from { opacity: 0; transform: translateX(-20px); }
36
+ to { opacity: 1; transform: translateX(0); }
37
+ }
38
+ @keyframes slideInRight {
39
+ from { opacity: 0; transform: translateX(20px); }
40
+ to { opacity: 1; transform: translateX(0); }
41
+ }
42
+ @keyframes scaleIn {
43
+ from { opacity: 0; transform: scale(0.95); }
44
+ to { opacity: 1; transform: scale(1); }
45
+ }
46
+ @keyframes pulseGlow {
47
+ 0%, 100% { box-shadow: 0 0 20px var(--accent-glow); }
48
+ 50% { box-shadow: var(--shadow-glow-strong); }
49
+ }
50
+ @keyframes shimmer {
51
+ 0% { background-position: -200% 0; }
52
+ 100% { background-position: 200% 0; }
53
+ }
54
+ @keyframes progressFill {
55
+ from { width: 0%; }
56
+ }
57
+ @keyframes countUp {
58
+ from { opacity: 0; transform: translateY(8px); }
59
+ to { opacity: 1; transform: translateY(0); }
60
+ }
61
+
62
+ /* Reduced motion fallback */
63
+ @media (prefers-reduced-motion: reduce) {
64
+ *, *::before, *::after {
65
+ animation-duration: 0.01ms !important;
66
+ transition-duration: 0.01ms !important;
67
+ }
68
+ }
69
+ ```
70
+
71
+ ---
72
+
73
+ ## Entrance Patterns
74
+
75
+ ### Dashboard Page Load (staggered)
76
+
77
+ ```
78
+ Top bar: fadeInDown 0ms 300ms
79
+ Stats row: fadeInUp 100ms 400ms (each card +80ms delay)
80
+ Tab bar: fadeIn 250ms 300ms
81
+ Sidebar: slideInLeft 200ms 400ms
82
+ Content: fadeInUp 350ms 500ms (each card in grid +60ms stagger)
83
+ ```
84
+
85
+ **React helper:**
86
+ ```jsx
87
+ const stagger = (index, base = 0, step = 60) => ({
88
+ animation: `fadeInUp 500ms cubic-bezier(0.16, 1, 0.3, 1) ${base + index * step}ms both`,
89
+ });
90
+ // Usage on each card: style={{ ...stagger(cardIndex, 350) }}
91
+ ```
92
+
93
+ ### Landing Page Hero
94
+
95
+ ```
96
+ Mono label: fadeInUp 0ms 500ms
97
+ Heading: fadeInUp 150ms 600ms
98
+ Subtitle: fadeInUp 300ms 500ms
99
+ CTA buttons: fadeInUp 450ms 500ms
100
+ ```
101
+
102
+ ### Modal
103
+
104
+ ```css
105
+ .modal-backdrop { animation: fadeIn 200ms ease both; }
106
+ .modal-content { animation: scaleIn 300ms cubic-bezier(0.16, 1, 0.3, 1) both; }
107
+ ```
108
+
109
+ ---
110
+
111
+ ## Expression-Aware Motion
112
+
113
+ Match motion to the expression mode chosen in `references/art-direction.md`.
114
+
115
+ ### Tactical Monolith
116
+ - Keep motion short, directional, and low drama
117
+ - Prefer panel reveals, status updates, and quiet count-up behavior
118
+ - Avoid floaty motion, oversized parallax, or decorative loops
119
+
120
+ ### Quiet Graphite
121
+ - Use soft fades, small elevation shifts, and measured reveal delays
122
+ - Let motion reinforce polish, not spectacle
123
+
124
+ ### Signal Editorial
125
+ - Use more narrative sequencing: headings, side notes, proof blocks, and media can enter in layered stages
126
+ - Favor stagger and reveal rhythm over obvious bounce or glow pulses
127
+
128
+ ### Luminous Light
129
+ - Keep motion crisp and clean
130
+ - Favor focus, control feedback, and gentle surface lifts over cinematic effects
131
+
132
+ ### Industrial Flow
133
+ - Motion should feel functional and linear
134
+ - Sliding panels, queue shifts, progress fills, and status transitions work better than float or blur-heavy effects
135
+
136
+ ### Gallery Intelligence
137
+ - Let media frames, profile blocks, and showcase surfaces reveal with slightly richer sequencing
138
+ - Keep metadata motion subtle so the content remains primary
139
+
140
+ ---
141
+
142
+ ## Hover Effects
143
+
144
+ ### Card Hover
145
+
146
+ ```jsx
147
+ onMouseEnter={e => {
148
+ e.currentTarget.style.borderColor = 'var(--border-medium)';
149
+ e.currentTarget.style.boxShadow = 'var(--shadow-glow)';
150
+ e.currentTarget.style.transform = 'translateY(-2px)';
151
+ }}
152
+ onMouseLeave={e => {
153
+ e.currentTarget.style.borderColor = '';
154
+ e.currentTarget.style.boxShadow = 'none';
155
+ e.currentTarget.style.transform = '';
156
+ }}
157
+ ```
158
+
159
+ Card must have: `transition: border-color 150ms ease, box-shadow 150ms ease, transform 150ms ease`
160
+
161
+ ### Button Hover
162
+ ```
163
+ Primary: background → var(--accent-hover)
164
+ Secondary: borderColor → var(--border-accent), color → var(--text-accent)
165
+ transition: 150ms ease
166
+ ```
167
+
168
+ ### Tab Hover (non-active)
169
+ `background: var(--bg-elevated)`, `border-radius: var(--radius-md) var(--radius-md) 0 0`
170
+
171
+ ### Sidebar Item Hover
172
+ `background: var(--bg-elevated)`, `color: var(--text-primary)`
173
+
174
+ ---
175
+
176
+ ## Loading States
177
+
178
+ ### Skeleton Shimmer
179
+
180
+ ```jsx
181
+ const skeletonStyle = {
182
+ background: `linear-gradient(90deg,
183
+ var(--bg-elevated) 25%,
184
+ var(--bg-overlay) 50%,
185
+ var(--bg-elevated) 75%)`,
186
+ backgroundSize: '200% 100%',
187
+ animation: 'shimmer 1.5s ease-in-out infinite',
188
+ borderRadius: 'var(--radius-md)',
189
+ };
190
+ // Usage: <div style={{ ...skeletonStyle, height: 20, width: '60%', marginBottom: 8 }} />
191
+ ```
192
+
193
+ ### Pulse Glow (Mode Panel when active)
194
+ ```css
195
+ animation: pulseGlow 3s ease-in-out infinite;
196
+ ```
197
+
198
+ ### Progress Bar Fill (on mount)
199
+ ```css
200
+ animation: progressFill 800ms cubic-bezier(0.16, 1, 0.3, 1) both;
201
+ ```
202
+
203
+ ### Stat Number Count-up
204
+ ```css
205
+ animation: countUp 600ms cubic-bezier(0.16, 1, 0.3, 1) both;
206
+ ```
207
+
208
+ ---
209
+
210
+ ## Scroll-Triggered Animations (Landing Pages)
211
+
212
+ ```jsx
213
+ function useScrollReveal(ref, delay = 0) {
214
+ const [visible, setVisible] = useState(false);
215
+ useEffect(() => {
216
+ const obs = new IntersectionObserver(
217
+ ([e]) => { if (e.isIntersecting) { setVisible(true); obs.disconnect(); } },
218
+ { threshold: 0.15 }
219
+ );
220
+ if (ref.current) obs.observe(ref.current);
221
+ return () => obs.disconnect();
222
+ }, []);
223
+ return {
224
+ opacity: visible ? 1 : 0,
225
+ transform: visible ? 'translateY(0)' : 'translateY(24px)',
226
+ transition: `opacity 600ms cubic-bezier(0.16,1,0.3,1) ${delay}ms,
227
+ transform 600ms cubic-bezier(0.16,1,0.3,1) ${delay}ms`,
228
+ };
229
+ }
230
+
231
+ // Usage:
232
+ const ref = useRef(null);
233
+ const reveal = useScrollReveal(ref, 100);
234
+ <div ref={ref} style={reveal}>...</div>
235
+ ```
236
+
237
+ **CSS-only alternative (no JS):**
238
+ ```css
239
+ .reveal {
240
+ opacity: 0; transform: translateY(24px);
241
+ transition: opacity 600ms cubic-bezier(0.16,1,0.3,1), transform 600ms cubic-bezier(0.16,1,0.3,1);
242
+ }
243
+ .reveal.visible { opacity: 1; transform: translateY(0); }
244
+ ```
245
+
246
+ ---
247
+
248
+ ## Theme Transition
249
+
250
+ Apply to ALL themed containers so dark/light switch feels smooth:
251
+
252
+ ```jsx
253
+ const TT = { transition: 'background 240ms ease, color 240ms ease, border-color 240ms ease, box-shadow 240ms ease' };
254
+ // Or in CSS: transition: var(--transition-theme);
255
+ ```
256
+
257
+ ---
258
+
259
+ ## When to Use What
260
+
261
+ | Context | Level | Techniques |
262
+ |---|---|---|
263
+ | Dashboard | Minimal | Card hover, tab switch, theme transition, progress fill |
264
+ | Landing page | Moderate | Staggered entrances, scroll reveals, hero sequence, card hovers |
265
+ | Frontpage | Moderate | Hero entrance, scroll reveals, CTA glow pulse |
266
+ | Modal/Detail | Light | scaleIn entrance, fadeIn backdrop |
267
+ | Loading state | Ambient | Skeleton shimmer, pulse glow |
268
+ | Admin CRUD | None/minimal | Only theme transition + hover states |
269
+
270
+ ---
271
+
272
+ ## Anti-Generic Motion Rules
273
+
274
+ - Do not use the same stagger recipe on every page type.
275
+ - Do not animate everything just because motion is available.
276
+ - One memorable sequence beats constant moving surfaces.
277
+ - If motion draws more attention than hierarchy or content, reduce it.
@@ -0,0 +1,289 @@
1
+ # Patterns — Page Layouts (Cognitive Core UI)
2
+
3
+ Requires `design-tokens.md` + `components.md` loaded first.
4
+
5
+ These patterns define how to compose full pages. All use CSS variables from design-tokens.md.
6
+
7
+ ---
8
+
9
+ ## 1. Dashboard Shell
10
+
11
+ The base layout for any admin/overview interface.
12
+
13
+ ```
14
+ ┌────────────────────────────────────────────────────────┐
15
+ │ TOP BAR (sticky, bg-void, border-bottom) │
16
+ ├────────────────────────────────────────────────────────┤
17
+ │ STATS ROW: [StatCard] [StatCard] [StatCard] [StatCard]│
18
+ ├────────────────────────────────────────────────────────┤
19
+ │ TAB BAR (full width, border-bottom) │
20
+ ├───────────┬────────────────────────────────────────────┤
21
+ │ SIDEBAR │ CONTENT │
22
+ │ 200px │ ┌─ Section Header ──────────────────┐ │
23
+ │ tree nav │ │ Card Grid (auto-fill, 260px min) │ │
24
+ │ │ └───────────────────────────────────┘ │
25
+ │ │ ┌─ Section Header ──────────────────┐ │
26
+ │ │ │ Card Grid │ │
27
+ │ │ └───────────────────────────────────┘ │
28
+ └───────────┴────────────────────────────────────────────┘
29
+ ```
30
+
31
+ **CSS skeleton:**
32
+ ```css
33
+ .shell { min-height: 100vh; background: var(--bg-base); font-family: var(--font-body); }
34
+ .stats-row { display: flex; gap: var(--space-3); padding: var(--space-5) var(--space-5) 0; flex-wrap: wrap; }
35
+ .main-layout { display: flex; min-height: calc(100vh - 230px); }
36
+ .sidebar { width: 200px; flex-shrink: 0; border-right: 1px solid var(--border-subtle); padding: var(--space-4); transition: var(--transition-theme); }
37
+ .content { flex: 1; padding: var(--space-4) var(--space-5); overflow-y: auto; }
38
+ .card-grid { display: grid; gap: var(--space-4); grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); }
39
+ .section { margin-bottom: var(--space-8); }
40
+ ```
41
+
42
+ **Variant — with feature panels (2-col below stats):**
43
+ ```css
44
+ .feature-row { display: grid; grid-template-columns: 1fr 280px; gap: var(--space-4); padding: var(--space-4) var(--space-5); }
45
+ ```
46
+
47
+ ---
48
+
49
+ ## 2. Detail / Profile Page
50
+
51
+ For viewing a single entity (person, product, contact, project).
52
+
53
+ ```
54
+ ┌────────────────────────────────────────────────────────┐
55
+ │ TOP BAR │
56
+ ├────────────────────────────────────────────────────────┤
57
+ │ Breadcrumbs: Gallery → Entity Name │
58
+ │ PROFILE HEADER │
59
+ │ ┌───────────────────────────────────────────────────┐ │
60
+ │ │ [Avatar 96px] NAME (text-3xl, black) │ │
61
+ │ │ Role (accent, italic) │ │
62
+ │ │ ✦ Tagline │ │
63
+ │ │ │ │
64
+ │ │ [StatCard] [StatCard] [StatCard] [Badge][Badge]│ │
65
+ │ └───────────────────────────────────────────────────┘ │
66
+ ├────────────────────────────────────────────────────────┤
67
+ │ TAB BAR (Geral | DNA | Comunicação | Histórico | ...) │
68
+ ├───────────┬────────────────────────────────────────────┤
69
+ │ SIDEBAR │ TAB CONTENT │
70
+ │ 180px │ Varies per tab: │
71
+ │ │ — Card grid (2-col) │
72
+ │ │ — DNA analysis panels │
73
+ │ │ — History table │
74
+ └───────────┴────────────────────────────────────────────┘
75
+ ```
76
+
77
+ **Profile Header styles:**
78
+ ```css
79
+ .profile-header {
80
+ padding: var(--space-5) var(--space-6);
81
+ background: var(--bg-base);
82
+ border-bottom: 1px solid var(--border-subtle);
83
+ transition: var(--transition-theme);
84
+ }
85
+ .profile-avatar {
86
+ width: 96px; height: 96px;
87
+ border-radius: var(--radius-lg);
88
+ border: 2px solid var(--border-subtle);
89
+ object-fit: cover;
90
+ }
91
+ .profile-name {
92
+ font-family: var(--font-display); font-weight: var(--weight-bold);
93
+ font-size: var(--text-3xl); color: var(--text-heading);
94
+ letter-spacing: var(--tracking-tight); line-height: var(--leading-tight);
95
+ }
96
+ .profile-role {
97
+ color: var(--accent); font-style: italic; font-size: var(--text-base);
98
+ }
99
+ .profile-tagline {
100
+ font-family: var(--font-mono); font-size: var(--text-xs);
101
+ color: var(--text-muted); letter-spacing: var(--tracking-wider);
102
+ text-transform: uppercase;
103
+ }
104
+ .profile-stats { display: flex; gap: var(--space-3); margin-top: var(--space-4); flex-wrap: wrap; }
105
+ .profile-badges { display: flex; gap: var(--space-2); align-items: center; }
106
+ ```
107
+
108
+ **Featured quote block (inside tab content):**
109
+ ```css
110
+ .quote-block {
111
+ padding: var(--space-8) var(--space-6);
112
+ text-align: center;
113
+ border-bottom: 1px solid var(--border-subtle);
114
+ }
115
+ .quote-text {
116
+ font-family: var(--font-display); font-size: var(--text-xl);
117
+ font-weight: var(--weight-medium); font-style: italic;
118
+ color: var(--text-primary); line-height: var(--leading-snug);
119
+ max-width: 680px; margin: 0 auto;
120
+ }
121
+ .quote-attribution {
122
+ font-family: var(--font-mono); font-size: var(--text-xs);
123
+ color: var(--text-muted); letter-spacing: var(--tracking-wider);
124
+ text-transform: uppercase; margin-top: var(--space-3);
125
+ }
126
+ ```
127
+
128
+ ---
129
+
130
+ ## 3. Settings / Config Page
131
+
132
+ Apply the **Compact Density** scale from `design-tokens.md` throughout. Settings pages are operational UI, not marketing — no generous whitespace.
133
+
134
+ ```
135
+ ┌────────────────────────────────────────────────────────┐
136
+ │ TOP BAR │
137
+ ├───────────┬────────────────────────────────────────────┤
138
+ │ SIDEBAR │ SETTINGS TITLE (text-2xl, no description) │
139
+ │ │ │
140
+ │ General │ ┌─ Entity grid ──────────────────────┐ │
141
+ │ Security │ │ [Card 280px] [Card 280px] [Card] │ │ ← 3-col auto-fill
142
+ │ Billing │ │ name + ID + status badges │ │
143
+ │ Team │ │ [Ativar btn] [Editar btn] │ │
144
+ │ API │ └─────────────────────────────────────┘ │
145
+ │ │ │
146
+ │ │ ┌─ Section card (p-4 rounded-[22px]) ─┐ │
147
+ │ │ │ eyebrow (mono xs) + title (text-base)│ │
148
+ │ │ │ [row] dot · name model badges Editar│ │ ← divide-y py-2
149
+ │ │ │ [row] dot · name model badges Editar│ │
150
+ │ │ │ ▸ Sync / secondary tool (details) │ │ ← collapsed
151
+ │ │ └─────────────────────────────────────┘ │
152
+ │ │ │
153
+ │ │ ┌─ Danger Zone Card ──────────────────┐ │
154
+ │ │ │ border: var(--semantic-red-dim) │ │
155
+ │ │ └─────────────────────────────────────┘ │
156
+ └───────────┴────────────────────────────────────────────┘
157
+ ```
158
+
159
+ **Page heading:** `text-2xl` max — no verbose description subtitle on the page header.
160
+
161
+ **Entity cards (projects, providers, squads):**
162
+ - Grid: `grid-cols-[repeat(auto-fill,minmax(280px,1fr))]`, `gap: var(--space-3)`
163
+ - Card: `rounded-[18px] p-3`
164
+ - Name: `text-sm font-semibold truncate`
165
+ - ID: `font-mono text-[0.58rem] truncate`
166
+ - Status badges: `px-2 py-0.5 text-[0.58rem]`
167
+ - Actions: compact row at bottom — `py-1.5 text-[0.62rem]`
168
+
169
+ **Add/Edit forms → Modal pattern (not inline expansion):**
170
+ ```
171
+ + Adicionar button → opens modal (max-w-md, centered, backdrop)
172
+ Editar button → opens same modal pre-filled
173
+ Never use accordion/RevealPanel inside entity cards
174
+ ```
175
+
176
+ **Section cards (provider lists, license, LLM config):**
177
+ - Card: `rounded-[22px] p-4`
178
+ - Header row: eyebrow + title + right-side control (select, badge) in one flex row
179
+ - File path or meta: `font-mono text-[0.62rem] truncate` — one line below title, no card for it
180
+ - Row items: `divide-y divide-[border]` with `py-2`, `text-xs` names, `text-[0.65rem]` models
181
+ - Edit button: `px-2.5 py-1 text-[0.65rem] rounded-xl`
182
+
183
+ **Disclosure pattern for secondary tools:**
184
+ ```html
185
+ <details class="rounded-[16px] border bg-elevated mt-3">
186
+ <summary> <!-- flex: label + status badge + action button in one row --> </summary>
187
+ <div class="border-t px-3 pb-3 pt-2">
188
+ <!-- compact diff rows or secondary form -->
189
+ </div>
190
+ </details>
191
+ ```
192
+
193
+ **Form inputs inside modals and cards:**
194
+ - Input/Select: `px-3 py-2 text-xs rounded-xl`
195
+ - Label: `text-[0.65rem] mb-0.5`
196
+ - Submit button: `w-full px-3 py-2 text-xs rounded-xl`
197
+
198
+ ---
199
+
200
+ ## 4. Auth Page (Login / Register)
201
+
202
+ ```
203
+ ┌────────────────────────────────────────────────────────┐
204
+ │ bg-void (full viewport, dark) │
205
+ │ │
206
+ │ ┌─ Card max-w: 420px ─────────────────┐ │
207
+ │ │ [Logo] AppName (mono, weight-bold) │ │
208
+ │ │ SUBTITLE (mono, xs, muted, upper) │ │
209
+ │ │ │ │
210
+ │ │ MONO LABEL: EMAIL │ │
211
+ │ │ [Input] │ │
212
+ │ │ MONO LABEL: PASSWORD │ │
213
+ │ │ [Input] │ │
214
+ │ │ [Primary Button: full width] │ │
215
+ │ │ divider ─── ou ─── │ │
216
+ │ │ [Secondary Button: OAuth] │ │
217
+ │ │ Link: esqueceu / criar conta │ │
218
+ │ └──────────────────────────────────────┘ │
219
+ │ radial glow behind card (accent-glow) │
220
+ └────────────────────────────────────────────────────────┘
221
+ ```
222
+
223
+ ```css
224
+ .auth-shell {
225
+ min-height: 100vh; background: var(--bg-void);
226
+ display: flex; align-items: center; justify-content: center;
227
+ position: relative;
228
+ }
229
+ .auth-glow {
230
+ position: absolute;
231
+ width: 600px; height: 600px; border-radius: 50%;
232
+ background: radial-gradient(circle, var(--accent-glow) 0%, transparent 70%);
233
+ pointer-events: none;
234
+ }
235
+ .auth-card {
236
+ background: var(--bg-surface); border: 1px solid var(--border-subtle);
237
+ border-radius: var(--radius-xl); padding: var(--space-8);
238
+ width: 100%; max-width: 420px; position: relative; z-index: 1;
239
+ }
240
+ ```
241
+
242
+ ---
243
+
244
+ ## 5. List-Detail (Split View)
245
+
246
+ ```
247
+ ┌────────────────────────────────────────────────────────┐
248
+ │ TOP BAR │
249
+ ├────────────────────────────────────────────────────────┤
250
+ │ TAB BAR + Filter badges │
251
+ ├──────────────────────┬─────────────────────────────────┤
252
+ │ LIST 340px │ DETAIL PANEL (flex: 1) │
253
+ │ ┌──────────────┐ │ Profile Header (compact) │
254
+ │ │ Item (active)│◄───│ border-left: 3px accent │
255
+ │ ├──────────────┤ │ Stat Cards row │
256
+ │ │ Item │ │ Tab sub-navigation │
257
+ │ ├──────────────┤ │ Content (cards, table, DNA) │
258
+ │ │ Item │ │ │
259
+ │ └──────────────┘ │ │
260
+ └──────────────────────┴─────────────────────────────────┘
261
+ ```
262
+
263
+ ```css
264
+ .list-panel { width: 340px; flex-shrink: 0; border-right: 1px solid var(--border-subtle); overflow-y: auto; }
265
+ .list-item { padding: var(--space-4); border-bottom: 1px solid var(--border-subtle); cursor: pointer; transition: var(--transition-theme); }
266
+ .list-item:hover { background: var(--bg-elevated); }
267
+ .list-item.active { background: var(--bg-elevated); border-left: 3px solid var(--accent); }
268
+ .detail-panel { flex: 1; overflow-y: auto; }
269
+ ```
270
+
271
+ ---
272
+
273
+ ## Responsive Rules (all patterns)
274
+
275
+ ```css
276
+ @media (max-width: 768px) {
277
+ .main-layout { flex-direction: column; }
278
+ .sidebar { width: 100%; border-right: none; border-bottom: 1px solid var(--border-subtle); }
279
+ .card-grid { grid-template-columns: 1fr; }
280
+ .stats-row { flex-direction: column; }
281
+ .list-panel { width: 100%; border-right: none; border-bottom: 1px solid var(--border-subtle); }
282
+ }
283
+ @media (min-width: 768px) and (max-width: 1024px) {
284
+ .card-grid { grid-template-columns: repeat(2, 1fr); }
285
+ }
286
+ @media (min-width: 1024px) {
287
+ .card-grid { grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); }
288
+ }
289
+ ```