@atmem/architect 0.0.0-stage → 0.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 (512) hide show
  1. package/CONSTITUTION.md +144 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +6 -0
  4. package/README.md +31 -2
  5. package/agent-skills/discovery/SKILL.md +48 -0
  6. package/agent-skills/discovery/topics.json +139 -0
  7. package/agent-skills/generation-capabilities.json +760 -0
  8. package/agent-skills/service-lifecycle.json +21 -0
  9. package/agent-skills/specialists/architecture/SKILL.md +15 -0
  10. package/agent-skills/specialists/aws/SKILL.md +17 -0
  11. package/agent-skills/specialists/azure/SKILL.md +7 -0
  12. package/agent-skills/specialists/composition/SKILL.md +17 -0
  13. package/agent-skills/specialists/devops/SKILL.md +10 -0
  14. package/agent-skills/specialists/finops/SKILL.md +7 -0
  15. package/agent-skills/specialists/gcp/SKILL.md +7 -0
  16. package/agent-skills/specialists/ibm/SKILL.md +7 -0
  17. package/agent-skills/specialists/manifest.json +13 -0
  18. package/agent-skills/specialists/pulumi/SKILL.md +7 -0
  19. package/agent-skills/specialists/security/SKILL.md +7 -0
  20. package/agent-skills/specialists/terraform/SKILL.md +14 -0
  21. package/agent-skills/upstream/aws/LICENSE +175 -0
  22. package/agent-skills/upstream/aws/SKILL.md +125 -0
  23. package/agent-skills/upstream/azure/LICENSE +21 -0
  24. package/agent-skills/upstream/azure/SKILL.md +387 -0
  25. package/agent-skills/upstream/gcp/LICENSE +202 -0
  26. package/agent-skills/upstream/gcp/SKILL.md +159 -0
  27. package/agent-skills/upstream/manifest.json +57 -0
  28. package/agent-skills/upstream/pulumi/LICENSE +201 -0
  29. package/agent-skills/upstream/pulumi/SKILL.md +501 -0
  30. package/agent-skills/upstream/terraform/LICENSE +373 -0
  31. package/agent-skills/upstream/terraform/SKILL.md +316 -0
  32. package/agent-skills/workflows/workflows.json +601 -0
  33. package/cli/architect.mjs +3 -0
  34. package/cli/runtime.mjs +115 -0
  35. package/dist/assets/html2canvas.esm-QH1iLAAe.js +22 -0
  36. package/dist/assets/index-BTLHaa3J.css +1 -0
  37. package/dist/assets/index-CQ2C1gKF.js +21338 -0
  38. package/dist/assets/index.es-DTyqIdaO.js +18 -0
  39. package/dist/assets/purify.es-CAi2OJFm.js +3 -0
  40. package/dist/assets/visual-export-Ox0j5xj5.js +173 -0
  41. package/dist/favicon.svg +2 -0
  42. package/dist/fonts/DM-Sans-OFL.txt +93 -0
  43. package/dist/fonts/Manrope-OFL.txt +93 -0
  44. package/dist/fonts/NotoSans-Regular.ttf +0 -0
  45. package/dist/fonts/OFL.txt +94 -0
  46. package/dist/fonts/dm-sans-latin-wght-normal.woff2 +0 -0
  47. package/dist/fonts/manrope-latin-wght-normal.woff2 +0 -0
  48. package/dist/index.html +4 -0
  49. package/dist/licenses/atmem-APACHE-2.0.txt +202 -0
  50. package/dist/licenses/aws-architect-LICENSE.txt +17 -0
  51. package/dist/licenses/aws-mcp-LICENSE.txt +175 -0
  52. package/dist/licenses/aws-mcp-NOTICE.txt +1 -0
  53. package/dist/licenses/cloud-emulation-notices.txt +36619 -0
  54. package/dist/licenses/dependency-notices.txt +6379 -0
  55. package/dist/licenses/emulation-notices.txt +717 -0
  56. package/dist/licenses/github-copilot-sdk-LICENSE.txt +21 -0
  57. package/dist/licenses/memory-dependency-notices.txt +3319 -0
  58. package/dist/licenses/openarchflow-LICENSE.txt +21 -0
  59. package/dist/licenses/python-dependency-notices.txt +11951 -0
  60. package/docs/upstream-lock.json +26 -0
  61. package/knowledge/engineering-practices.json +536 -0
  62. package/package.json +30 -4
  63. package/packaging/uv-release-lock.json +54 -0
  64. package/public/licenses/atmem-APACHE-2.0.txt +202 -0
  65. package/public/licenses/aws-architect-LICENSE.txt +17 -0
  66. package/public/licenses/aws-mcp-LICENSE.txt +175 -0
  67. package/public/licenses/aws-mcp-NOTICE.txt +1 -0
  68. package/public/licenses/cloud-emulation-notices.txt +36619 -0
  69. package/public/licenses/dependency-notices.txt +6379 -0
  70. package/public/licenses/emulation-notices.txt +717 -0
  71. package/public/licenses/github-copilot-sdk-LICENSE.txt +21 -0
  72. package/public/licenses/memory-dependency-notices.txt +3319 -0
  73. package/public/licenses/openarchflow-LICENSE.txt +21 -0
  74. package/public/licenses/python-dependency-notices.txt +11951 -0
  75. package/scripts/terraform-render.mjs +8 -0
  76. package/server/__init__.py +0 -0
  77. package/server/abstraction.py +28 -0
  78. package/server/agent_runtime.py +153 -0
  79. package/server/app.py +257 -0
  80. package/server/architect.py +112 -0
  81. package/server/architecture_activity.py +67 -0
  82. package/server/attachments.py +101 -0
  83. package/server/cloud-emulation-requirements.txt +29 -0
  84. package/server/codex_app_server.py +219 -0
  85. package/server/codex_engineering_backend.py +266 -0
  86. package/server/codex_worker_policy.py +193 -0
  87. package/server/contracts.py +315 -0
  88. package/server/copilot_worker.py +16 -0
  89. package/server/dependency_mirror.py +54 -0
  90. package/server/design_patch.py +43 -0
  91. package/server/emulation-requirements.txt +8 -0
  92. package/server/emulation_adapters.py +20 -0
  93. package/server/emulation_routes.py +98 -0
  94. package/server/emulation_worker.py +351 -0
  95. package/server/engineering_artifacts.py +221 -0
  96. package/server/engineering_assets/application-runtime.json +4372 -0
  97. package/server/engineering_assets/architecture_work.schema.json +79 -0
  98. package/server/engineering_assets/materialize_runtime.py +62 -0
  99. package/server/engineering_assets/prepare_tools.py +96 -0
  100. package/server/engineering_assets/sql_validation.py +59 -0
  101. package/server/engineering_contexts.py +120 -0
  102. package/server/engineering_delivery.py +210 -0
  103. package/server/engineering_finalization.py +210 -0
  104. package/server/engineering_handoff.py +172 -0
  105. package/server/engineering_jobs.py +206 -0
  106. package/server/engineering_knowledge.py +75 -0
  107. package/server/engineering_reconciliation.py +159 -0
  108. package/server/engineering_routes.py +483 -0
  109. package/server/engineering_sessions.py +273 -0
  110. package/server/engineering_tools.py +166 -0
  111. package/server/generation_lint.py +18 -0
  112. package/server/local_providers.py +185 -0
  113. package/server/local_validation.py +236 -0
  114. package/server/memory-requirements.lock +181 -0
  115. package/server/memory-requirements.txt +6 -0
  116. package/server/memory_context.py +58 -0
  117. package/server/memory_routes.py +141 -0
  118. package/server/memory_service.py +306 -0
  119. package/server/memory_worker.py +129 -0
  120. package/server/openai_voice.py +80 -0
  121. package/server/orca_handoff.py +90 -0
  122. package/server/packaged_app.py +9 -0
  123. package/server/pricing.py +190 -0
  124. package/server/process_control_observation.py +31 -0
  125. package/server/prompts.py +136 -0
  126. package/server/public_faq_emulation_worker.py +44 -0
  127. package/server/requirements.lock +1618 -0
  128. package/server/requirements.txt +68 -0
  129. package/server/runtime_dependency_locks.py +27 -0
  130. package/server/runtime_evidence.py +93 -0
  131. package/server/settings.py +14 -0
  132. package/server/skills.py +103 -0
  133. package/server/storage_emulation_worker.py +160 -0
  134. package/server/structured_emulation_worker.py +48 -0
  135. package/server/terraform_routes.py +118 -0
  136. package/server/upstream/__init__.py +0 -0
  137. package/server/upstream/agent/__init__.py +1 -0
  138. package/server/upstream/agent/aws_architect.py +600 -0
  139. package/server/upstream/agent/config/__init__.py +1 -0
  140. package/server/upstream/agent/config/agent_config.py +82 -0
  141. package/server/upstream/agent/config/prompts.py +138 -0
  142. package/server/upstream/agent/rate_limiter.py +62 -0
  143. package/server/upstream/utils/__init__.py +1 -0
  144. package/server/upstream/utils/file_writer.py +43 -0
  145. package/server/validation_applicability.py +85 -0
  146. package/server/validation_jobs.py +252 -0
  147. package/server/validation_workers.py +48 -0
  148. package/server/voice_routes.py +91 -0
  149. package/server/voice_worker.py +26 -0
  150. package/server/windows_snapshot.py +119 -0
  151. package/specs/028-convergence-evaluation/evidence/20261110-ibm-invoice-native/registry-structured/qualification.json +72 -0
  152. package/specs/028-convergence-evaluation/evidence/20261110-invoice-runtime/durable-current/receipt.json +61 -0
  153. package/specs/029-general-purpose-engine/evidence/20261111-runtime-dependencies/sdk/receipt.json +22 -0
  154. package/src/ArchitectureActivity.jsx +54 -0
  155. package/src/ArchitectureWorkPanel.jsx +39 -0
  156. package/src/ArtifactChecks.jsx +49 -0
  157. package/src/BlockRequirements.jsx +13 -0
  158. package/src/BrainActivity.jsx +11 -0
  159. package/src/ChatMessage.jsx +29 -0
  160. package/src/ChatResizeHandle.jsx +6 -0
  161. package/src/CodePreview.jsx +8 -0
  162. package/src/ComponentReview.jsx +31 -0
  163. package/src/DeliveryViews.jsx +59 -0
  164. package/src/EmulationPanel.jsx +44 -0
  165. package/src/EngagementViews.jsx +387 -0
  166. package/src/EngineeringPanel.jsx +151 -0
  167. package/src/FileTree.jsx +7 -0
  168. package/src/FinalChecklist.jsx +15 -0
  169. package/src/HelpNote.jsx +3 -0
  170. package/src/ImplementationDelivery.jsx +91 -0
  171. package/src/JourneyViews.jsx +403 -0
  172. package/src/LocationChoices.jsx +12 -0
  173. package/src/MemoryPanel.jsx +58 -0
  174. package/src/OpenAIVoicePanel.jsx +66 -0
  175. package/src/OutputsView.jsx +71 -0
  176. package/src/ProjectChecks.jsx +44 -0
  177. package/src/TerraformView.jsx +57 -0
  178. package/src/WorkbenchDialogs.jsx +532 -0
  179. package/src/activity-presentation.mjs +28 -0
  180. package/src/ai-qualification-scenarios.mjs +31 -0
  181. package/src/approval-application-files.mjs +32 -0
  182. package/src/approval-applications.mjs +82 -0
  183. package/src/approval-spec-kit.mjs +30 -0
  184. package/src/architecture-activity.css +28 -0
  185. package/src/architecture-activity.mjs +63 -0
  186. package/src/architecture-work.mjs +176 -0
  187. package/src/artifact-work.mjs +103 -0
  188. package/src/async-documents.mjs +191 -0
  189. package/src/atflow.css +1140 -0
  190. package/src/atforma.css +748 -0
  191. package/src/atmem-tokens.css +79 -0
  192. package/src/aws-preflight.mjs +60 -0
  193. package/src/aws-public-faq.mjs +102 -0
  194. package/src/aws-validation-scenarios.mjs +10 -0
  195. package/src/aws-validation.mjs +48 -0
  196. package/src/azure-plan-mocks.mjs +25 -0
  197. package/src/azure-structured.mjs +133 -0
  198. package/src/bedrock-summary.mjs +152 -0
  199. package/src/bounded-rag.mjs +60 -0
  200. package/src/brand.css +9 -0
  201. package/src/canvas-view.mjs +28 -0
  202. package/src/capability-composition.mjs +44 -0
  203. package/src/chat-attachments.mjs +13 -0
  204. package/src/cloud-provider-locks.mjs +9 -0
  205. package/src/cloud-storage-scenarios.mjs +2 -0
  206. package/src/component-review.mjs +55 -0
  207. package/src/composition-spec-kit.mjs +30 -0
  208. package/src/consultation-context.mjs +15 -0
  209. package/src/consultation.mjs +52 -0
  210. package/src/container-contracts.mjs +5 -0
  211. package/src/container-inspection.mjs +75 -0
  212. package/src/container-runtime.mjs +30 -0
  213. package/src/container-security-inspection.mjs +49 -0
  214. package/src/container-terraform.mjs +109 -0
  215. package/src/conversation.mjs +18 -0
  216. package/src/core.mjs +863 -0
  217. package/src/cross-cloud-storage.mjs +100 -0
  218. package/src/delivery-capabilities.mjs +25 -0
  219. package/src/delivery.mjs +58 -0
  220. package/src/deployment-ownership.mjs +10 -0
  221. package/src/deployment-region.mjs +11 -0
  222. package/src/derive.mjs +31 -0
  223. package/src/design-build-flow.mjs +10 -0
  224. package/src/diagram-attention.mjs +24 -0
  225. package/src/discovery.mjs +359 -0
  226. package/src/document.mjs +170 -0
  227. package/src/emulation-feedback.mjs +61 -0
  228. package/src/emulation-guidance.mjs +37 -0
  229. package/src/engagement.mjs +274 -0
  230. package/src/engineering-client.mjs +73 -0
  231. package/src/engineering-defaults.mjs +17 -0
  232. package/src/engineering.css +31 -0
  233. package/src/enterprise-application.mjs +76 -0
  234. package/src/enterprise-aws-host-infrastructure.mjs +62 -0
  235. package/src/enterprise-aws-host-tests.mjs +15 -0
  236. package/src/enterprise-aws-infrastructure-tests.mjs +38 -0
  237. package/src/enterprise-aws-infrastructure.mjs +138 -0
  238. package/src/enterprise-google-infrastructure.mjs +84 -0
  239. package/src/enterprise-google-tests.mjs +25 -0
  240. package/src/estimate.mjs +190 -0
  241. package/src/existing-references.mjs +18 -0
  242. package/src/external-identities.mjs +17 -0
  243. package/src/faq-lambda-build.mjs +28 -0
  244. package/src/final-package.mjs +34 -0
  245. package/src/gcp-structured.mjs +104 -0
  246. package/src/generation-provider.mjs +7 -0
  247. package/src/generation-quality.mjs +69 -0
  248. package/src/handoff.mjs +141 -0
  249. package/src/ibm-registry.mjs +12 -0
  250. package/src/ibm-structured.mjs +103 -0
  251. package/src/identifiers.mjs +15 -0
  252. package/src/implementation-map.mjs +14 -0
  253. package/src/implementation-outcome.mjs +8 -0
  254. package/src/incomplete-terraform.mjs +9 -0
  255. package/src/integrations.ts +137 -0
  256. package/src/interface-contracts.mjs +30 -0
  257. package/src/invoice-application.mjs +66 -0
  258. package/src/invoice-aws-operations.mjs +136 -0
  259. package/src/invoice-aws.mjs +143 -0
  260. package/src/invoice-azure-operations.mjs +147 -0
  261. package/src/invoice-azure.mjs +134 -0
  262. package/src/invoice-builder.mjs +35 -0
  263. package/src/invoice-dependencies.mjs +43 -0
  264. package/src/invoice-gcp-operations.mjs +178 -0
  265. package/src/invoice-gcp.mjs +104 -0
  266. package/src/invoice-ibm-operations.mjs +278 -0
  267. package/src/invoice-ibm.mjs +142 -0
  268. package/src/invoice-operations.mjs +143 -0
  269. package/src/invoice-plan.mjs +45 -0
  270. package/src/invoice-region.mjs +6 -0
  271. package/src/invoice-spec-kit.mjs +61 -0
  272. package/src/invoice-state.mjs +7 -0
  273. package/src/invoice-terraform.mjs +29 -0
  274. package/src/invoice-tests.mjs +122 -0
  275. package/src/journey-workspace.css +106 -0
  276. package/src/journey.mjs +97 -0
  277. package/src/levels.mjs +145 -0
  278. package/src/local-agent.mjs +184 -0
  279. package/src/main.jsx +2481 -0
  280. package/src/model-policy-preflight.mjs +34 -0
  281. package/src/openai-voice.mjs +102 -0
  282. package/src/output-bundle.mjs +13 -0
  283. package/src/ownership-inspection.mjs +28 -0
  284. package/src/pack.mjs +201 -0
  285. package/src/pricing.mjs +85 -0
  286. package/src/production-state.mjs +8 -0
  287. package/src/project-copy.mjs +10 -0
  288. package/src/project-file.mjs +160 -0
  289. package/src/project-links.mjs +3 -0
  290. package/src/protected-state.mjs +43 -0
  291. package/src/public-faq-builder.mjs +19 -0
  292. package/src/public-faq-clouds.mjs +251 -0
  293. package/src/public-faq.mjs +122 -0
  294. package/src/pulumi.mjs +123 -0
  295. package/src/python-container.mjs +25 -0
  296. package/src/python-runtime.mjs +50 -0
  297. package/src/rag-handler.mjs +43 -0
  298. package/src/rag-web-assets.mjs +52 -0
  299. package/src/rag-web.mjs +68 -0
  300. package/src/records.mjs +177 -0
  301. package/src/resources.mjs +163 -0
  302. package/src/review.mjs +252 -0
  303. package/src/runtime/EnterpriseDocument.java +89 -0
  304. package/src/runtime/approved_http_destination.py +72 -0
  305. package/src/runtime/aws-lambda-qualification-lock.json +7 -0
  306. package/src/runtime/aws-python-lock.json +82 -0
  307. package/src/runtime/aws-web-python-lock.json +887 -0
  308. package/src/runtime/aws_json_model.py +42 -0
  309. package/src/runtime/azure-python-lock.json +863 -0
  310. package/src/runtime/azure-sources.json +8 -0
  311. package/src/runtime/azure-test-lock.json +23 -0
  312. package/src/runtime/azure_acceptance.py +192 -0
  313. package/src/runtime/azure_structured.py +153 -0
  314. package/src/runtime/bounded_rag.py +126 -0
  315. package/src/runtime/catalog_admin.py +70 -0
  316. package/src/runtime/cloud-sql-proxy-lock.json +8 -0
  317. package/src/runtime/cloud-sql-proxy-security-review.json +30 -0
  318. package/src/runtime/connector_cli.py +50 -0
  319. package/src/runtime/connector_sync.py +70 -0
  320. package/src/runtime/durable-python-lock.json +247 -0
  321. package/src/runtime/durable_workflow.py +325 -0
  322. package/src/runtime/enterprise-application-manifest.json +110 -0
  323. package/src/runtime/enterprise-application-sources.json +266 -0
  324. package/src/runtime/enterprise-auth-python-lock.json +592 -0
  325. package/src/runtime/enterprise-aws-host-bootstrap-source.json +1 -0
  326. package/src/runtime/enterprise-aws-host-probe-source.json +1 -0
  327. package/src/runtime/enterprise-aws-task-template.json +235 -0
  328. package/src/runtime/enterprise-document-lock.json +18 -0
  329. package/src/runtime/enterprise-document.Dockerfile +15 -0
  330. package/src/runtime/enterprise-runtime-aws-python-lock.json +1115 -0
  331. package/src/runtime/enterprise-runtime-azure-python-lock.json +1106 -0
  332. package/src/runtime/enterprise-runtime-gcp-python-lock.json +1060 -0
  333. package/src/runtime/enterprise-runtime-ibm-python-lock.json +1096 -0
  334. package/src/runtime/enterprise-runtime-python-lock.json +1058 -0
  335. package/src/runtime/enterprise-runtime.Dockerfile +15 -0
  336. package/src/runtime/enterprise-web-app.js +1 -0
  337. package/src/runtime/enterprise-web-entry.js +105 -0
  338. package/src/runtime/enterprise-web-lock.json +29 -0
  339. package/src/runtime/enterprise-web-notices.txt +229 -0
  340. package/src/runtime/enterprise-web.css +4 -0
  341. package/src/runtime/enterprise-web.html +8 -0
  342. package/src/runtime/enterprise_audit.py +91 -0
  343. package/src/runtime/enterprise_audit_schema.sql +25 -0
  344. package/src/runtime/enterprise_auth_schema.sql +67 -0
  345. package/src/runtime/enterprise_auth_store.py +241 -0
  346. package/src/runtime/enterprise_aws_host_bootstrap.py +120 -0
  347. package/src/runtime/enterprise_aws_host_probe.py +105 -0
  348. package/src/runtime/enterprise_aws_hosts.py +136 -0
  349. package/src/runtime/enterprise_aws_jobs.py +300 -0
  350. package/src/runtime/enterprise_aws_objects.py +93 -0
  351. package/src/runtime/enterprise_aws_transfer.py +83 -0
  352. package/src/runtime/enterprise_azure_batch_api.py +128 -0
  353. package/src/runtime/enterprise_azure_host.py +599 -0
  354. package/src/runtime/enterprise_azure_jobs.py +294 -0
  355. package/src/runtime/enterprise_azure_objects.py +234 -0
  356. package/src/runtime/enterprise_azure_pool.py +161 -0
  357. package/src/runtime/enterprise_azure_transfer.py +122 -0
  358. package/src/runtime/enterprise_configuration.py +136 -0
  359. package/src/runtime/enterprise_document.py +116 -0
  360. package/src/runtime/enterprise_document_cli.py +32 -0
  361. package/src/runtime/enterprise_document_contract.py +54 -0
  362. package/src/runtime/enterprise_document_job.py +109 -0
  363. package/src/runtime/enterprise_document_jobs.py +122 -0
  364. package/src/runtime/enterprise_document_jobs_schema.sql +23 -0
  365. package/src/runtime/enterprise_extraction_cache.py +186 -0
  366. package/src/runtime/enterprise_extraction_schema.sql +17 -0
  367. package/src/runtime/enterprise_google_jobs.py +275 -0
  368. package/src/runtime/enterprise_google_transfer.py +85 -0
  369. package/src/runtime/enterprise_http.py +212 -0
  370. package/src/runtime/enterprise_identity.py +52 -0
  371. package/src/runtime/enterprise_knowledge.py +152 -0
  372. package/src/runtime/enterprise_models.py +94 -0
  373. package/src/runtime/enterprise_native.py +181 -0
  374. package/src/runtime/enterprise_oauth.py +132 -0
  375. package/src/runtime/enterprise_operator.py +160 -0
  376. package/src/runtime/enterprise_parser_service.py +136 -0
  377. package/src/runtime/enterprise_parser_transport.py +68 -0
  378. package/src/runtime/enterprise_queries.py +255 -0
  379. package/src/runtime/enterprise_queries_schema.sql +27 -0
  380. package/src/runtime/enterprise_query_service.py +111 -0
  381. package/src/runtime/enterprise_secrets.py +110 -0
  382. package/src/runtime/enterprise_sessions.py +95 -0
  383. package/src/runtime/enterprise_sources.py +260 -0
  384. package/src/runtime/enterprise_web.py +39 -0
  385. package/src/runtime/enterprise_worker.py +68 -0
  386. package/src/runtime/export_contract_acceptance.py +18 -0
  387. package/src/runtime/faq-output-contract.json +40 -0
  388. package/src/runtime/faq-web-app.js +41 -0
  389. package/src/runtime/faq-web.css +1 -0
  390. package/src/runtime/faq-web.html +6 -0
  391. package/src/runtime/gcp-sources.json +9 -0
  392. package/src/runtime/gcp_acceptance.py +110 -0
  393. package/src/runtime/gcp_structured.py +150 -0
  394. package/src/runtime/http_acceptance.py +39 -0
  395. package/src/runtime/iap-web-app.js +36 -0
  396. package/src/runtime/iap-web-source.json +1 -0
  397. package/src/runtime/ibm-python-lock.json +856 -0
  398. package/src/runtime/ibm-sources.json +9 -0
  399. package/src/runtime/ibm_acceptance.py +133 -0
  400. package/src/runtime/ibm_structured.py +113 -0
  401. package/src/runtime/invoice-azapi-provider-lock.json +7 -0
  402. package/src/runtime/invoice-ibm-provider-lock.json +7 -0
  403. package/src/runtime/invoice-parser-lock.json +1199 -0
  404. package/src/runtime/invoice-parser-python-lock.json +56 -0
  405. package/src/runtime/invoice-parser.Dockerfile +190 -0
  406. package/src/runtime/invoice-sources.json +58 -0
  407. package/src/runtime/invoice-test-sources.json +24 -0
  408. package/src/runtime/invoice-web.css +2 -0
  409. package/src/runtime/invoice-web.html +12 -0
  410. package/src/runtime/invoice-web.js +112 -0
  411. package/src/runtime/invoice_configuration.py +17 -0
  412. package/src/runtime/invoice_document.py +95 -0
  413. package/src/runtime/invoice_extraction.py +96 -0
  414. package/src/runtime/invoice_http.py +129 -0
  415. package/src/runtime/invoice_identity.py +5 -0
  416. package/src/runtime/invoice_maintenance.py +40 -0
  417. package/src/runtime/invoice_native.py +77 -0
  418. package/src/runtime/invoice_object_store.py +153 -0
  419. package/src/runtime/invoice_operations.py +108 -0
  420. package/src/runtime/invoice_operator.py +79 -0
  421. package/src/runtime/invoice_operator_core.py +39 -0
  422. package/src/runtime/invoice_operator_job.py +147 -0
  423. package/src/runtime/invoice_parser_cli.py +17 -0
  424. package/src/runtime/invoice_parser_identity.py +39 -0
  425. package/src/runtime/invoice_parser_service.py +89 -0
  426. package/src/runtime/invoice_parser_transport.py +89 -0
  427. package/src/runtime/invoice_processing.py +24 -0
  428. package/src/runtime/invoice_retention.py +16 -0
  429. package/src/runtime/invoice_runtime_secrets.py +43 -0
  430. package/src/runtime/invoice_stage.py +80 -0
  431. package/src/runtime/invoice_web.py +39 -0
  432. package/src/runtime/invoice_worker.py +50 -0
  433. package/src/runtime/lambda_faq.py +5 -0
  434. package/src/runtime/parser-requirements.lock +4 -0
  435. package/src/runtime/policy_review.py +18 -0
  436. package/src/runtime/postgres-qualification-lock.json +21 -0
  437. package/src/runtime/public-faq-sources.json +22 -0
  438. package/src/runtime/public_catalog_admin.py +122 -0
  439. package/src/runtime/public_catalog_store.py +125 -0
  440. package/src/runtime/public_faq.py +144 -0
  441. package/src/runtime/public_faq_app.py +49 -0
  442. package/src/runtime/python-container-lock.json +18 -0
  443. package/src/runtime/rag-sources.json +10 -0
  444. package/src/runtime/rag_acceptance.py +60 -0
  445. package/src/runtime/rag_aws_adapter.py +95 -0
  446. package/src/runtime/rds-ca-source.json +9 -0
  447. package/src/runtime/rds-global-ca.pem +2888 -0
  448. package/src/runtime/state-contract-check-source.json +4 -0
  449. package/src/runtime/state_contract_check.py +338 -0
  450. package/src/runtime/structured-source.json +1 -0
  451. package/src/runtime/structured-web-app.js +71 -0
  452. package/src/runtime/structured-web-source.json +1 -0
  453. package/src/runtime/structured_http.py +105 -0
  454. package/src/runtime/structured_output.py +48 -0
  455. package/src/runtime/web-python-lock.json +802 -0
  456. package/src/runtime/web_user_admin.py +44 -0
  457. package/src/runtime/workflow_application.py +62 -0
  458. package/src/runtime/workflow_bindings.py +128 -0
  459. package/src/runtime/workflow_configuration.py +40 -0
  460. package/src/runtime/workflow_connection.py +105 -0
  461. package/src/runtime/workflow_contract.py +54 -0
  462. package/src/runtime/workflow_database.py +94 -0
  463. package/src/runtime/workflow_errors.py +6 -0
  464. package/src/runtime/workflow_http.py +178 -0
  465. package/src/runtime/workflow_identity.py +69 -0
  466. package/src/runtime/workflow_payload.py +118 -0
  467. package/src/runtime/workflow_process_stage.py +88 -0
  468. package/src/runtime/workflow_profile.py +91 -0
  469. package/src/runtime/workflow_review.py +106 -0
  470. package/src/runtime/workflow_role_bootstrap.py +104 -0
  471. package/src/runtime/workflow_schema.sql +72 -0
  472. package/src/runtime/workflow_worker.py +142 -0
  473. package/src/runtime-settings.mjs +15 -0
  474. package/src/s3-access.mjs +14 -0
  475. package/src/source-contracts.mjs +17 -0
  476. package/src/spec-kit.mjs +186 -0
  477. package/src/state-custody.mjs +32 -0
  478. package/src/state-inspection.mjs +45 -0
  479. package/src/state-spec-kit.mjs +13 -0
  480. package/src/storage-tests.mjs +25 -0
  481. package/src/structured-api.mjs +133 -0
  482. package/src/structured-contract.mjs +19 -0
  483. package/src/structured-operation-policy.mjs +2 -0
  484. package/src/structured-web.mjs +17 -0
  485. package/src/style.css +1 -0
  486. package/src/system-description.mjs +26 -0
  487. package/src/terraform-admission.mjs +66 -0
  488. package/src/terraform-composition.mjs +83 -0
  489. package/src/terraform-expressions.mjs +46 -0
  490. package/src/terraform-validation-coverage.mjs +11 -0
  491. package/src/terraform.mjs +128 -0
  492. package/src/text-statistics.mjs +51 -0
  493. package/src/upstream/openarchflow/format-payload.ts +26 -0
  494. package/src/upstream/openarchflow/import/mermaid.ts +205 -0
  495. package/src/upstream/openarchflow/import/sql-ddl.ts +109 -0
  496. package/src/upstream/openarchflow/layout.ts +54 -0
  497. package/src/upstream/openarchflow/providers/aws.ts +196 -0
  498. package/src/upstream/openarchflow/providers/azure.ts +126 -0
  499. package/src/upstream/openarchflow/providers/cloudnative.ts +71 -0
  500. package/src/upstream/openarchflow/providers/generic.ts +227 -0
  501. package/src/upstream/openarchflow/providers/integration.ts +22 -0
  502. package/src/upstream/openarchflow/providers/types.ts +2 -0
  503. package/src/upstream/openarchflow/templates.ts +937 -0
  504. package/src/upstream-catalog.mjs +10 -0
  505. package/src/useChatScroll.jsx +37 -0
  506. package/src/useEmulation.jsx +36 -0
  507. package/src/useEngineeringStatus.mjs +17 -0
  508. package/src/validation-receipt.mjs +10 -0
  509. package/src/visual-export.mjs +92 -0
  510. package/src/voice-conversation.mjs +117 -0
  511. package/src/work-intake.mjs +24 -0
  512. package/src/workflow-runtime-inventory.mjs +3 -0
package/src/atflow.css ADDED
@@ -0,0 +1,1140 @@
1
+ /* Light by default; the header toggle sets data-theme="dark". */
2
+ :root { color-scheme: light; }
3
+ :root[data-theme="dark"] { color-scheme: dark; }
4
+
5
+ /* AtFlow — Architecture Canvas shell. Tokens from atmem-tokens.css (generated from AtMem.ai packages/tokens). */
6
+ @font-face { font-family: "DM Sans"; font-style: normal; font-display: swap; font-weight: 100 1000;
7
+ src: url("/fonts/dm-sans-latin-wght-normal.woff2") format("woff2-variations"), url("/fonts/dm-sans-latin-wght-normal.woff2") format("woff2"); }
8
+ @font-face { font-family: "Manrope"; font-style: normal; font-display: swap; font-weight: 200 800;
9
+ src: url("/fonts/manrope-latin-wght-normal.woff2") format("woff2-variations"), url("/fonts/manrope-latin-wght-normal.woff2") format("woff2"); }
10
+ :root {
11
+ /* Shared AtMem.ai tokens: pink actions, neutral surfaces, accessible light/dark contrast. */
12
+ --ink: var(--color-ink);
13
+ --ink-2: var(--color-muted);
14
+ --paper: var(--color-card);
15
+ --board: var(--color-bg);
16
+ --line: var(--color-line);
17
+ --edge: var(--color-muted);
18
+ --accent: var(--color-brand-text);
19
+ --accent-soft: var(--color-brand-soft);
20
+ --action: var(--color-brand);
21
+ --action-hover: light-dark(#EB8DA3, #F7B8C6);
22
+ --chrome: var(--color-card);
23
+ --chrome-2: var(--color-line);
24
+ --chrome-ink: var(--color-ink);
25
+ --good: var(--color-good);
26
+ --bad: var(--color-bad);
27
+ --warn: var(--color-warn);
28
+ --radius: var(--radius-lg);
29
+ --shadow: var(--elevation-card);
30
+ font-family: var(--type-family-sans);
31
+ color: var(--ink);
32
+ background: var(--board);
33
+ }
34
+ * { box-sizing: border-box; }
35
+ html, body, #root { margin: 0; height: 100%; }
36
+ body { background: var(--board); font-size: 14px; -webkit-font-smoothing: antialiased; }
37
+ button, input, select, textarea { font: inherit; color: inherit; }
38
+ button { cursor: pointer; background: none; border: 0; padding: 0; }
39
+ button:disabled { cursor: not-allowed; opacity: 0.4; }
40
+ :focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
41
+ .muted { color: var(--ink-2); }
42
+ .small { font-size: 12px; }
43
+ .spin { animation: spin 0.9s linear infinite; }
44
+ @keyframes spin { to { transform: rotate(360deg); } }
45
+
46
+ /* ---------- Layout ---------- */
47
+ .app {
48
+ display: grid;
49
+ grid-template-columns: minmax(0, 1fr) 360px;
50
+ grid-template-rows: 52px 1fr;
51
+ height: 100vh;
52
+ }
53
+ .app.chat-closed { grid-template-columns: minmax(0, 1fr); }
54
+ .bar { grid-column: 1 / -1; }
55
+
56
+ /* ---------- Top bar ---------- */
57
+ .bar {
58
+ position: relative;
59
+ display: flex;
60
+ align-items: center;
61
+ gap: 14px;
62
+ padding: 0 12px;
63
+ background: var(--paper);
64
+ border-bottom: 1px solid var(--line);
65
+ z-index: 20;
66
+ }
67
+ .brand { display: flex; align-items: center; gap: 7px; font-weight: 700; font-size: 15px; padding: 6px; border-radius: 8px; }
68
+ .brand:hover { background: var(--board); }
69
+ .crumbs { display: flex; align-items: center; gap: 4px; min-width: 0; flex: 1; color: var(--ink-2); }
70
+ .crumbs button, .crumbs span { padding: 5px 8px; border-radius: 6px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 200px; }
71
+ .crumbs button:hover { background: var(--board); color: var(--ink); }
72
+ .crumbs .here { color: var(--ink); font-weight: 600; }
73
+ .crumbs .clear { padding: 4px; display: grid; place-items: center; }
74
+ .project-name {
75
+ border: 1px solid transparent; background: none; border-radius: 6px;
76
+ padding: 5px 8px; font-weight: 600; color: var(--ink); width: 22ch; min-width: 6ch;
77
+ text-overflow: ellipsis;
78
+ }
79
+ .project-name:hover { border-color: var(--line); }
80
+ .project-name:focus { border-color: var(--accent); outline: none; }
81
+
82
+ .modes { display: flex; background: var(--board); border: 1px solid var(--line); border-radius: 9px; padding: 3px; }
83
+ .modes button { padding: 5px 14px; border-radius: 6px; font-weight: 500; color: var(--ink-2); display: flex; gap: 5px; align-items: center; }
84
+ .modes button.on { background: var(--paper); color: var(--ink); box-shadow: 0 0 0 1px var(--line); }
85
+ .bar-actions { display: flex; align-items: center; gap: 6px; }
86
+ .warn-text { color: var(--warn); font-size: 12px; }
87
+
88
+ .icon {
89
+ display: inline-grid; place-items: center; width: 34px; height: 34px;
90
+ border-radius: 8px; color: var(--ink);
91
+ }
92
+ .icon:hover:not(:disabled) { background: var(--board); }
93
+ .btn {
94
+ display: inline-flex; align-items: center; justify-content: center; gap: 6px;
95
+ height: 34px; padding: 0 14px; border-radius: 8px; font-weight: 600;
96
+ border: 1.5px solid var(--ink); background: var(--paper);
97
+ }
98
+ .btn:hover:not(:disabled) { background: var(--board); }
99
+ .btn.primary { background: var(--ink); color: var(--paper); }
100
+ .btn.primary:hover:not(:disabled) { background: var(--accent); border-color: var(--accent); }
101
+ .btn.ghost { border-color: transparent; }
102
+ .btn.danger { color: var(--bad); }
103
+ .run-button.broken { background: var(--paper); color: var(--bad); border-color: var(--bad); }
104
+ .issues-pill {
105
+ display: flex; align-items: center; gap: 4px; height: 28px; padding: 0 9px;
106
+ border-radius: 99px; color: var(--bad); border: 1.5px solid var(--bad); font-weight: 600; font-size: 12px;
107
+ }
108
+
109
+ .menu {
110
+ position: absolute; top: 48px; right: 50px; min-width: 200px;
111
+ background: var(--paper); border: 1px solid var(--line); border-radius: var(--radius);
112
+ box-shadow: var(--shadow); padding: 6px; display: flex; flex-direction: column;
113
+ }
114
+ .menu button { text-align: left; padding: 8px 10px; border-radius: 6px; }
115
+ .menu button:hover:not(:disabled) { background: var(--board); }
116
+ .menu hr { border: 0; border-top: 1px solid var(--line); margin: 4px 0; width: 100%; }
117
+ .menu.issues { right: 140px; max-width: 360px; }
118
+ .menu.issues button { color: var(--bad); }
119
+
120
+ /* ---------- Canvas ---------- */
121
+ .canvas { position: relative; min-width: 0; min-height: 0; overflow: hidden; background: var(--board); }
122
+ .canvas .react-flow { background: var(--board); --xy-background-pattern-dots-color-default: light-dark(#c9cdce, #2c3133); }
123
+ .toolbar {
124
+ position: absolute; left: 14px; top: 50%; transform: translateY(-50%);
125
+ display: flex; flex-direction: column; gap: 2px; padding: 5px;
126
+ background: var(--paper); border: 1px solid var(--line); border-radius: 12px; box-shadow: var(--shadow); z-index: 5;
127
+ }
128
+ .toolbar .icon { width: 40px; height: 40px; }
129
+ .zoom {
130
+ position: absolute; right: 14px; bottom: 14px; display: flex; gap: 2px; padding: 4px;
131
+ background: var(--paper); border: 1px solid var(--line); border-radius: 10px; box-shadow: var(--shadow); z-index: 5;
132
+ }
133
+ .hint {
134
+ position: absolute; top: 12px; left: 50%; transform: translateX(-50%); margin: 0;
135
+ font-size: 12px; color: var(--ink-2); background: var(--paper); padding: 4px 10px;
136
+ border-radius: 99px; border: 1px solid var(--line); pointer-events: none; z-index: 4; white-space: nowrap;
137
+ }
138
+ .empty-canvas { position: absolute; inset: 0; display: grid; place-content: center; gap: 10px; text-align: center; z-index: 3; }
139
+ .empty-canvas p { font-size: 18px; font-weight: 600; margin: 0 0 4px; }
140
+
141
+ /* Blocks: one clear shape, icon for intent, label, provider. */
142
+ .blk {
143
+ display: flex; align-items: center; gap: 10px; width: 210px; min-height: 58px; padding: 10px 12px;
144
+ background: var(--paper); border: 2px solid var(--ink); border-radius: 12px;
145
+ transition: box-shadow var(--motion-fast), opacity var(--motion-fast);
146
+ }
147
+ .blk:hover { box-shadow: var(--shadow); }
148
+ .blk.selected { border-color: var(--accent); box-shadow: 0 0 0 4px var(--accent-soft); }
149
+ .blk.dim { opacity: 0.25; }
150
+ .blk.kind-source { border-radius: 12px 12px 22px 22px; }
151
+ .blk.kind-guard { border-style: double; border-width: 4px; }
152
+ .blk.kind-output { border-radius: 99px; }
153
+ .blk.kind-resource { border-style: dashed; }
154
+ .blk-icon {
155
+ display: grid; place-items: center; width: 34px; height: 34px; flex: none;
156
+ border-radius: 9px; background: var(--board); color: var(--ink);
157
+ }
158
+ .blk-text { display: flex; flex-direction: column; min-width: 0; flex: 1; }
159
+ .blk-text strong { font-size: 14px; line-height: 1.25; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
160
+ .blk-text small { display: flex; align-items: center; gap: 5px; color: var(--ink-2); font-size: 12px; }
161
+ .pdot { width: 8px; height: 8px; border-radius: 50%; background: var(--provider); display: inline-block; }
162
+ .blk-state { display: grid; place-items: center; width: 20px; height: 20px; border-radius: 50%; flex: none; }
163
+ .state-passed .blk-state { background: var(--good); color: #fff; }
164
+ .state-failed .blk-state { background: var(--bad); color: #fff; }
165
+ .state-running .blk-state { color: var(--accent); }
166
+ .blk.state-passed { border-color: var(--good); }
167
+ .blk.state-failed { border-color: var(--bad); box-shadow: 0 0 0 4px light-dark(#fde3e5, #3a1519); }
168
+ .blk.state-running { border-color: var(--accent); }
169
+ .blk.state-skipped { opacity: 0.45; border-style: dashed; }
170
+
171
+ .react-flow__handle {
172
+ width: 12px; height: 12px; background: var(--paper); border: 2px solid var(--ink);
173
+ opacity: 0; transition: opacity var(--motion-fast);
174
+ }
175
+ .react-flow__node:hover .react-flow__handle, .react-flow__node.selected .react-flow__handle,
176
+ .react-flow__handle.connectingfrom, .react-flow__handle.connectingto { opacity: 1; }
177
+ .react-flow__handle:hover { background: var(--accent); border-color: var(--accent); }
178
+ .level-system .react-flow__handle { opacity: 0 !important; }
179
+
180
+ /* Layers (System level) */
181
+ .layer {
182
+ width: 230px; padding: 16px 18px; background: var(--paper);
183
+ border: 2px solid var(--ink); border-radius: 16px; display: flex; flex-direction: column; gap: 6px;
184
+ box-shadow: 6px 6px 0 light-dark(#e3e5e6, #22282a);
185
+ }
186
+ .layer:hover { box-shadow: 6px 6px 0 var(--accent-soft); border-color: var(--accent); }
187
+ .layer-head { display: flex; justify-content: space-between; align-items: center; }
188
+ .layer-head strong { font-size: 17px; }
189
+ .layer small { color: var(--ink-2); }
190
+ .layer-providers { display: flex; gap: 4px; }
191
+ .layer-providers span { width: 10px; height: 10px; border-radius: 50%; }
192
+ .layer.state-passed { border-color: var(--good); }
193
+ .layer.state-failed { border-color: var(--bad); }
194
+
195
+ /* Wires */
196
+ .react-flow__edge-path { stroke: var(--edge); stroke-width: 2; }
197
+ .react-flow__edge .react-flow__arrowhead polyline,
198
+ .react-flow__arrowhead polyline { stroke: var(--edge); fill: var(--edge); }
199
+ .react-flow__edge.selected .react-flow__edge-path, .react-flow__edge:hover .react-flow__edge-path { stroke: var(--accent); stroke-width: 3; }
200
+ .wire-passed .react-flow__edge-path { stroke: var(--good); }
201
+ .wire-failed .react-flow__edge-path { stroke: var(--bad); stroke-dasharray: 6 4; }
202
+ .react-flow__edge.dim { opacity: 0.2; }
203
+ .react-flow__edge-text { fill: var(--ink-2); font-size: 11px; }
204
+ .react-flow__edge-textbg { fill: var(--board); }
205
+ .react-flow__connectionline path, .react-flow__connection-path { stroke: var(--accent); stroke-width: 2; }
206
+
207
+ /* Palette */
208
+ .palette {
209
+ position: absolute; left: 72px; top: 50%; transform: translateY(-50%); width: 300px; max-height: min(520px, 80%);
210
+ display: flex; flex-direction: column; background: var(--paper); border: 1px solid var(--line);
211
+ border-radius: 12px; box-shadow: var(--shadow); z-index: 6; overflow: hidden;
212
+ }
213
+ .palette-search { display: flex; align-items: center; gap: 8px; padding: 10px 12px; border-bottom: 1px solid var(--line); }
214
+ .palette-search input { flex: 1; border: 0; background: none; outline: none; min-width: 0; }
215
+ .palette-search select { border: 0; background: var(--board); border-radius: 6px; padding: 3px 4px; font-size: 12px; }
216
+ .chips { display: flex; flex-wrap: wrap; gap: 4px; padding: 8px 10px; }
217
+ .chips button { padding: 3px 9px; border-radius: 99px; border: 1px solid var(--line); font-size: 12px; }
218
+ .chips button.on { background: var(--ink); color: var(--paper); border-color: var(--ink); }
219
+ .palette-list { overflow: auto; padding: 4px 6px 8px; }
220
+ .palette-item { display: flex; align-items: center; gap: 10px; width: 100%; padding: 8px; border-radius: 7px; text-align: left; }
221
+ .palette-item:hover { background: var(--board); }
222
+ .palette-item span:not(.dot) { flex: 1; }
223
+ .dot { width: 8px; height: 8px; border-radius: 50%; flex: none; }
224
+ .pad { padding: 12px; margin: 0; }
225
+
226
+ /* Block detail (level 3) */
227
+ .detail {
228
+ position: absolute; inset: 0; z-index: 7; background: var(--board);
229
+ display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 380px) minmax(0, 1fr); gap: 20px; padding: 16px 28px 28px 80px; overflow: auto; align-content: start;
230
+ }
231
+ .detail-navigation { position: sticky; top: 0; grid-column: 1 / -1; align-self: start; z-index: 10; background: var(--board); padding-bottom: 8px; }
232
+ .detail .back { display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px 6px 10px; border-radius: 20px; background: var(--paper); border: 1px solid var(--line); box-shadow: var(--shadow); font-weight: 600; font-size: 13px; z-index: 10; }
233
+ .detail .back:hover { border-color: var(--accent); color: var(--accent); }
234
+ .detail .back kbd { font: 11px var(--type-family-mono); color: var(--ink-2); border: 1px solid var(--line); border-radius: 4px; padding: 0 4px; }
235
+ .detail h3 { font-size: 12px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-2); margin: 0 0 10px; }
236
+ .detail h4 { font-size: 12px; color: var(--ink-2); margin: 16px 0 6px; font-weight: 600; }
237
+ .detail-col { min-width: 0; }
238
+ .terminal {
239
+ display: flex; justify-content: space-between; gap: 10px; width: 100%; padding: 10px 12px; margin-bottom: 6px;
240
+ background: var(--paper); border: 1.5px solid var(--ink); border-radius: 10px; text-align: left; font-weight: 500;
241
+ }
242
+ .terminal:hover { border-color: var(--accent); }
243
+ .terminal small { color: var(--ink-2); }
244
+ .detail pre {
245
+ margin: 0; padding: 12px; background: var(--paper); border: 1px solid var(--line); border-radius: 10px;
246
+ font: 12px/1.5 var(--type-family-mono); white-space: pre-wrap; word-break: break-word; max-height: 360px; overflow: auto;
247
+ }
248
+ .detail-col.probed pre { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); }
249
+ .detail-core {
250
+ align-self: start; background: var(--paper); border: 2px solid var(--ink); border-radius: 16px;
251
+ padding: 18px; min-width: 0; overflow-wrap: anywhere; display: flex; flex-direction: column; gap: 12px;
252
+ }
253
+ .detail-core p { margin: 0; }
254
+ .detail-title { display: flex; align-items: center; gap: 10px; }
255
+ .blk-provider { width: 12px; height: 12px; border-radius: 50%; background: var(--provider); flex: none; }
256
+ .detail-title input { flex: 1; min-width: 0; width: 100%; font-size: 18px; font-weight: 700; border: 0; background: none; outline: none; padding: 2px 0; border-bottom: 1.5px solid transparent; }
257
+ .detail-title input:focus { border-bottom-color: var(--accent); }
258
+ .fields { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
259
+ .fields > label { min-width: 0; }
260
+ .fields .field-wide { grid-column: 1 / -1; }
261
+ .fields input:not([type="checkbox"]), .fields select { min-width: 0; width: 100%; max-width: 100%; }
262
+ .detail .terminal > * { min-width: 0; overflow-wrap: anywhere; }
263
+ @media (max-width: 520px) { .detail .fields { grid-template-columns: minmax(0, 1fr); } }
264
+ .fields label, .dialog-field { display: flex; flex-direction: column; gap: 4px; font-size: 12px; color: var(--ink-2); font-weight: 500; }
265
+ .fields input, .fields select, .dialog-field input, .dialog-field select, .runbar select, .code-input {
266
+ height: 34px; padding: 0 9px; border: 1.5px solid var(--line); border-radius: 8px; background: var(--paper); color: var(--ink); font-size: 13px;
267
+ }
268
+ .fields input:focus, .fields select:focus { border-color: var(--accent); outline: none; }
269
+ .trace { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; font-weight: 600; }
270
+ .trace.passed { color: var(--good); }
271
+ .trace.failed { color: var(--bad); }
272
+ .trace .error-box { flex-basis: 100%; }
273
+ .error-box { margin: 0; padding: 10px 12px; border-radius: 8px; background: light-dark(#fde3e5, #3a1519); color: var(--bad); font-weight: 500; font-size: 13px; }
274
+
275
+ /* Test run bar */
276
+ .runbar {
277
+ position: absolute; left: 72px; right: 140px; bottom: 14px; z-index: 6;
278
+ display: flex; align-items: center; gap: 10px; padding: 8px 10px;
279
+ background: var(--paper); border: 1px solid var(--line); border-radius: 12px; box-shadow: var(--shadow);
280
+ }
281
+ .seg { display: flex; border: 1px solid var(--line); border-radius: 8px; padding: 2px; flex: none; }
282
+ .seg button { padding: 4px 10px; border-radius: 6px; font-size: 13px; color: var(--ink-2); }
283
+ .seg button.on { background: var(--ink); color: var(--paper); }
284
+ .run-summary { display: inline-flex; align-items: center; gap: 4px; font-weight: 600; white-space: nowrap; }
285
+ .run-summary.passed { color: var(--good); }
286
+ .run-summary.failed { color: var(--bad); }
287
+ .steps { display: flex; gap: 6px; overflow-x: auto; min-width: 0; flex: 1; }
288
+ .step {
289
+ white-space: nowrap; padding: 4px 10px; border-radius: 99px; font-size: 12px; font-weight: 500;
290
+ border: 1.5px solid var(--line);
291
+ }
292
+ .step.passed { border-color: var(--good); color: var(--good); }
293
+ .step.failed { border-color: var(--bad); color: var(--bad); background: light-dark(#fde3e5, #3a1519); }
294
+ .step.skipped { border-style: dashed; color: var(--ink-2); }
295
+ .step.on { box-shadow: 0 0 0 3px var(--accent-soft); }
296
+
297
+ /* Front panel (LabVIEW indicators) */
298
+ .front-panel {
299
+ position: absolute; inset: 0 0 72px; z-index: 5; background: var(--board);
300
+ display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); align-content: start; gap: 14px; padding: 28px 28px 28px 80px; overflow: auto;
301
+ }
302
+ .indicator {
303
+ position: relative; display: flex; flex-direction: column; gap: 4px; align-items: flex-start;
304
+ padding: 16px; background: var(--paper); border: 2px solid var(--ink); border-radius: 14px; text-align: left;
305
+ }
306
+ .indicator strong { font-size: 28px; font-weight: 700; line-height: 1.1; }
307
+ .indicator span:last-child { color: var(--ink-2); font-size: 13px; }
308
+ .indicator-number { position: absolute; top: 10px; right: 12px; font-size: 11px; color: var(--ink-2); }
309
+ .indicator.passed { border-color: var(--good); }
310
+ .indicator.passed strong { color: var(--good); }
311
+ .indicator.failed { border-color: var(--bad); }
312
+ .indicator.failed strong { color: var(--bad); }
313
+ .indicator.skipped { border-style: dashed; opacity: 0.6; }
314
+
315
+ /* Deploy card */
316
+ .deploy {
317
+ position: absolute; right: 14px; top: 14px; width: 280px; z-index: 6;
318
+ display: flex; flex-direction: column; gap: 10px; padding: 16px;
319
+ background: var(--paper); border: 1px solid var(--line); border-radius: 14px; box-shadow: var(--shadow);
320
+ }
321
+ .deploy h3 { margin: 0; font-size: 15px; }
322
+ .deploy p { margin: 0; }
323
+ .checks { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
324
+ .checks li { display: flex; gap: 8px; align-items: center; color: var(--ink-2); font-size: 13px; }
325
+ .checks li::before { content: ""; width: 14px; height: 14px; border: 1.5px solid var(--ink-2); border-radius: 4px; flex: none; }
326
+ .checks li.ok { color: var(--ink); }
327
+ .checks li.ok::before { background: var(--good); border-color: var(--good); }
328
+
329
+ /* ---------- Architect chat ---------- */
330
+ .chat { display: flex; flex-direction: column; min-height: 0; background: var(--paper); border-left: 1px solid var(--line); }
331
+ .chat-head { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px 8px; }
332
+ .chat-head strong { font-size: 15px; }
333
+ .model { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--ink-2); padding: 4px 8px; border-radius: 99px; border: 1px solid var(--line); }
334
+ .model:hover { color: var(--ink); border-color: var(--ink); }
335
+ .led { width: 7px; height: 7px; border-radius: 50%; background: var(--ink-2); }
336
+ .led.on { background: var(--good); }
337
+ .phases { display: flex; list-style: none; margin: 0; padding: 0 16px 10px; gap: 4px; border-bottom: 1px solid var(--line); }
338
+ .phases li { flex: 1; }
339
+ .phases button {
340
+ width: 100%; padding: 6px 0 4px; font-size: 12px; color: var(--ink-2); border-top: 3px solid var(--line); text-align: left;
341
+ }
342
+ .phases button.done { border-top-color: var(--ink); color: var(--ink); }
343
+ .phases button.on { border-top-color: var(--accent); color: var(--ink); font-weight: 600; }
344
+ .messages { flex: 1; min-height: 0; overflow: auto; overflow-anchor: none; overscroll-behavior: contain; padding: 16px; }
345
+ .chat > :not(.messages) { flex-shrink: 0; }
346
+ .message-list { display: flex; flex-direction: column; gap: 12px; }
347
+ .msg { white-space: pre-wrap; line-height: 1.5; font-size: 14px; max-width: 95%; }
348
+ .msg.user { align-self: flex-end; background: var(--ink); color: var(--paper); padding: 8px 12px; border-radius: 14px 14px 4px 14px; max-width: 85%; }
349
+ .msg.working { display: flex; align-items: center; gap: 8px; color: var(--ink-2); }
350
+ .link { color: var(--accent); font-weight: 500; }
351
+ .proposal { border: 2px solid var(--ink); border-radius: 12px; padding: 12px; display: flex; flex-direction: column; gap: 8px; }
352
+ .proposal ul { list-style: none; margin: 0; padding: 0; font: 13px/1.6 var(--type-family-mono); }
353
+ .proposal .add { color: var(--good); }
354
+ .proposal .chg { color: var(--warn); }
355
+ .proposal .del { color: var(--bad); }
356
+ .row { display: flex; gap: 6px; }
357
+ .prompts { display: flex; flex-wrap: wrap; gap: 6px; padding: 0 16px 10px; }
358
+ .prompts button { padding: 5px 10px; border: 1px solid var(--line); border-radius: 99px; font-size: 12px; }
359
+ .prompts button:hover:not(:disabled) { border-color: var(--ink); }
360
+ .composer { position: relative; margin: 0 12px 12px; }
361
+ .composer textarea {
362
+ width: 100%; resize: none; padding: 10px 46px 10px 12px; border: 1.5px solid var(--ink); border-radius: 12px;
363
+ background: var(--paper); line-height: 1.4; min-height: 60px;
364
+ }
365
+ .composer textarea:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); }
366
+ .send { position: absolute; right: 8px; bottom: 10px; width: 32px; height: 32px; border-radius: 50%; display: grid; place-items: center; background: var(--ink); color: var(--paper); }
367
+
368
+ /* ---------- Toast & modal ---------- */
369
+ .toast {
370
+ position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%); z-index: 50;
371
+ background: var(--ink); color: var(--paper); padding: 9px 16px; border-radius: 10px; font-size: 13px; box-shadow: var(--shadow); max-width: calc(100vw - 32px);
372
+ }
373
+ .backdrop { position: fixed; inset: 0; background: rgb(0 0 0 / 0.35); display: grid; place-items: center; z-index: 40; padding: 16px; }
374
+ .modal {
375
+ position: relative; width: min(560px, 100%); max-height: 86vh; overflow: auto;
376
+ background: var(--paper); border-radius: 16px; padding: 24px; box-shadow: var(--shadow);
377
+ display: flex; flex-direction: column; gap: 12px;
378
+ }
379
+ .modal h2 { margin: 0; font-size: 20px; padding-right: 32px; }
380
+ .modal p { margin: 0; color: var(--ink-2); line-height: 1.5; }
381
+ .modal .eyebrow { display: none; }
382
+ .modal-close { position: absolute; top: 14px; right: 14px; }
383
+ .modal-fine { font-size: 12px; }
384
+ .modal a { color: var(--accent); }
385
+ .template-list { display: flex; flex-direction: column; gap: 6px; }
386
+ .template-list button {
387
+ display: flex; align-items: center; gap: 12px; padding: 12px; border: 1.5px solid var(--line); border-radius: 10px; text-align: left;
388
+ }
389
+ .template-list button:hover { border-color: var(--ink); }
390
+ .template-list button span { flex: 1; display: flex; flex-direction: column; }
391
+ .template-list small { color: var(--ink-2); }
392
+ .section-label { font-size: 12px; font-weight: 600; color: var(--ink-2); text-transform: uppercase; letter-spacing: 0.05em; margin-top: 6px; }
393
+ .code-input { height: 160px; padding: 10px; font-family: var(--type-family-mono); resize: vertical; }
394
+ .run-button.full, .button.full { width: 100%; }
395
+ .modal .button {
396
+ display: inline-flex; align-items: center; justify-content: center; gap: 6px; height: 34px; padding: 0 14px;
397
+ border-radius: 8px; font-weight: 600; border: 1.5px solid var(--ink);
398
+ }
399
+ .modal .button.run-button { background: var(--ink); color: var(--paper); }
400
+ .sidecar-state, .inspector-info, .login-instructions, .snapshot-result, .pulumi-path, .snapshot-upload {
401
+ display: flex; flex-wrap: wrap; align-items: center; gap: 8px; padding: 10px 12px; border: 1px solid var(--line); border-radius: 10px; font-size: 13px;
402
+ }
403
+ .login-instructions { flex-direction: column; align-items: flex-start; }
404
+ .login-instructions code { font-family: var(--type-family-mono); background: var(--board); padding: 4px 8px; border-radius: 6px; }
405
+ .status-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--ink-2); display: inline-block; }
406
+ .status-dot.passed { background: var(--good); }
407
+ .licences { margin: 0; display: grid; gap: 4px; }
408
+ .licences dt { font-weight: 600; margin-top: 8px; }
409
+ .licences dd { margin: 0; color: var(--ink-2); font-size: 13px; }
410
+
411
+
412
+ /* ---------- Engagement documents (Discover, Options, Decisions) ---------- */
413
+ .doc {
414
+ position: absolute; inset: 0; z-index: 8; overflow: auto; background: var(--board);
415
+ padding: 72px max(24px, calc((100% - 980px) / 2)) 40px;
416
+ display: flex; flex-direction: column; gap: 14px;
417
+ }
418
+ .doc-head h2 { margin: 0 0 2px; font-size: 22px; }
419
+ .doc-head p { margin: 0; }
420
+ .row-between { display: flex; justify-content: space-between; align-items: flex-end; gap: 12px; }
421
+ .doc-sub { display: flex; flex-wrap: wrap; gap: 4px 12px; justify-content: space-between; align-items: center; margin-top: 8px; }
422
+ .doc-sub h3 { margin: 0; font-size: 15px; }
423
+ .doc-foot { display: flex; justify-content: space-between; align-items: center; margin-top: 8px; }
424
+ .field { display: flex; flex-direction: column; gap: 4px; font-size: 12px; font-weight: 600; color: var(--ink-2); }
425
+ .field textarea, .doc input, .doc select, .build textarea {
426
+ font-size: 14px; font-weight: 400; color: var(--ink); background: var(--paper);
427
+ border: 1.5px solid var(--line); border-radius: 8px; padding: 8px 10px; resize: vertical; min-width: 0;
428
+ }
429
+ .doc select { padding: 6px 8px; }
430
+ .field textarea:focus, .doc input:focus, .doc select:focus, .build textarea:focus { outline: none; border-color: var(--accent); }
431
+ .field.known textarea { border-color: var(--ink); }
432
+ .field.wide textarea { min-height: 64px; font-size: 15px; }
433
+ .brief-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 10px; }
434
+ .cases { display: flex; flex-direction: column; gap: 6px; }
435
+ .case { display: grid; grid-template-columns: 2fr 90px 90px 90px auto 2fr 34px; gap: 6px; align-items: center; }
436
+ .case.head { font-size: 12px; font-weight: 600; color: var(--ink-2); }
437
+ .verdicts button { font-size: 12px; padding: 4px 8px; white-space: nowrap; }
438
+ .case.verdict-pursue .verdicts .on { background: var(--good); }
439
+ .case.verdict-rule-out .verdicts .on { background: var(--bad); }
440
+ .case.verdict-rule-out > input:first-child { text-decoration: line-through; color: var(--ink-2); }
441
+
442
+ .subviews { position: absolute; top: 12px; left: 50%; transform: translateX(-50%); z-index: 9; background: var(--paper); box-shadow: var(--shadow); }
443
+ .level-system .hint, .level-flow .hint { top: 56px; }
444
+
445
+ .options-wrap { overflow-x: auto; }
446
+ .options { border-collapse: separate; border-spacing: 0; width: 100%; background: var(--paper); border: 1px solid var(--line); border-radius: 12px; }
447
+ .options th, .options td { padding: 10px; border-bottom: 1px solid var(--line); text-align: left; vertical-align: top; }
448
+ .options thead th { font-size: 14px; }
449
+ .options thead th .link { display: block; font-weight: 500; margin-top: 2px; }
450
+ .options tbody th { font-weight: 600; min-width: 170px; }
451
+ .options tbody th small { display: block; font-weight: 400; font-size: 11px; }
452
+ .options td textarea { width: 100%; min-width: 110px; font-size: 12px; }
453
+ .options .total td, .options .total th { font-size: 16px; font-weight: 700; }
454
+ .options .best { background: var(--accent-soft); }
455
+
456
+ .adr { background: var(--paper); border: 2px solid var(--ink); border-radius: 14px; padding: 14px; display: flex; flex-direction: column; gap: 10px; }
457
+ .adr.status-proposed { border-style: dashed; }
458
+ .adr.status-superseded { opacity: 0.55; }
459
+ .adr-head { display: grid; grid-template-columns: auto 1fr 160px 130px 34px; gap: 8px; align-items: center; }
460
+ .adr-head input:first-of-type { font-weight: 700; font-size: 15px; }
461
+ .adr-head .missing { border-color: var(--warn); }
462
+ .adr-id { font: 600 12px var(--type-family-mono); color: var(--ink-2); }
463
+ .adr-body { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
464
+
465
+ .build { width: 300px; max-height: calc(100% - 100px); overflow: auto; }
466
+ .build h4 { margin: 4px 0 0; font-size: 12px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-2); }
467
+ .build textarea { font-size: 13px; }
468
+ .checks li.bad { color: var(--bad); }
469
+ .checks li.bad::before { background: var(--bad); border-color: var(--bad); }
470
+ .link-plain { text-align: left; }
471
+ .blk.existing { background: light-dark(#eef0f1, #1b2022); border-style: solid; }
472
+
473
+ .measures { display: flex; flex-direction: column; gap: 6px; }
474
+ .measures h4 { margin: 0; font-size: 12px; color: var(--ink-2); }
475
+ .measure { display: grid; grid-template-columns: 1.4fr 1.2fr 56px 70px 30px; gap: 4px; }
476
+ .measure input, .measure select { min-width: 0; height: 30px; padding: 0 6px; border: 1.5px solid var(--line); border-radius: 6px; background: var(--paper); font-size: 12px; }
477
+ .mono { font-family: var(--type-family-mono); }
478
+ label.check { flex-direction: row; align-items: center; gap: 8px; color: var(--ink); grid-column: 1 / -1; }
479
+
480
+ @media (max-width: 900px) {
481
+ .doc { padding: 64px 16px 24px; }
482
+ .case { grid-template-columns: 1fr 1fr; }
483
+ .line { grid-template-columns: 1fr 1fr; }
484
+ .discover .ask h2 { font-size: 20px; }
485
+ .case.head { display: none; }
486
+ .adr-head, .adr-body { grid-template-columns: 1fr; }
487
+ .build { width: auto; }
488
+ }
489
+
490
+
491
+ /* Requirements, assumptions, open questions */
492
+ .records { display: flex; flex-direction: column; gap: 8px; }
493
+ .record { background: var(--paper); border: 1.5px solid var(--line); border-radius: 12px; padding: 10px; display: flex; flex-direction: column; gap: 6px; }
494
+ .record.answered { opacity: 0.7; }
495
+ .record-row { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
496
+ .record-row > input:first-child { flex: 1 1 260px; }
497
+ .measure-row input { width: 110px; }
498
+ .measure-row input:first-of-type { width: 170px; }
499
+ .links { display: flex; flex-wrap: wrap; gap: 4px; align-items: center; }
500
+ .chip { display: inline-flex; align-items: center; gap: 4px; padding: 2px 4px 2px 9px; border-radius: 99px; border: 1px solid var(--ink); font-size: 12px; }
501
+ .chip.missing { border-color: var(--warn); color: var(--warn); }
502
+ .chip button { width: 18px; height: 18px; border-radius: 50%; }
503
+ .chip button:hover { background: var(--board); }
504
+ .links select { font-size: 12px; padding: 2px 6px; border-radius: 99px; }
505
+ .adr-meta { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; }
506
+ label.inline { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; color: var(--ink-2); }
507
+ label.inline input { width: 200px; font-size: 12px; }
508
+ .revise { display: flex; gap: 6px; align-items: center; flex: 1; }
509
+ .revise input { flex: 1; min-width: 160px; }
510
+ .history summary { cursor: pointer; font-size: 13px; color: var(--ink-2); }
511
+ .history ol { margin: 6px 0 0; padding-left: 18px; font-size: 13px; display: flex; flex-direction: column; gap: 4px; }
512
+ .linked { display: flex; flex-direction: column; gap: 4px; border-top: 1px solid var(--line); padding-top: 8px; }
513
+ .linked p { margin: 0; font-size: 13px; }
514
+ .linked strong { font-size: 11px; text-transform: uppercase; letter-spacing: 0.04em; color: var(--ink-2); margin-right: 4px; }
515
+
516
+
517
+ /* Discover: one open question at a time */
518
+ .discover .ask { background: var(--paper); border: 2px solid var(--ink); border-radius: 18px; padding: 22px; display: flex; flex-direction: column; gap: 8px; }
519
+ .discover .ask h2 { margin: 0; font-size: 24px; line-height: 1.25; }
520
+ .discover .ask p { margin: 0; }
521
+ .discover .ask form { display: flex; flex-direction: column; gap: 10px; margin-top: 6px; }
522
+ .discover .ask textarea { font-size: 16px; padding: 12px 14px; border: 1.5px solid var(--line); border-radius: 12px; background: var(--paper); color: var(--ink); resize: vertical; }
523
+ .discover .ask textarea:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); }
524
+ .why { color: var(--accent); font-size: 13px; }
525
+ .discover .intro { background: var(--paper); border: 2px solid var(--ink); border-radius: 18px; padding: 22px; }
526
+ .discover .intro h2 { margin: 0 0 6px; font-size: 22px; }
527
+ .discover .intro p { margin: 0; }
528
+ .prompts .primary-chip { background: var(--accent); border-color: var(--accent); color: #fff; font-weight: 600; }
529
+ .btn.sketch { margin-left: auto; background: var(--accent); border-color: var(--accent); color: #fff; }
530
+ .facts { display: flex; flex-wrap: wrap; gap: 6px; }
531
+ .field.assumed textarea { border-style: dashed; }
532
+ .extra summary { cursor: pointer; color: var(--ink-2); font-size: 13px; margin-top: 10px; }
533
+ .extra[open] summary { margin-bottom: 10px; }
534
+ .badge { display: inline-grid; place-items: center; min-width: 17px; height: 17px; padding: 0 4px; border-radius: 99px; background: var(--bad); color: #fff; font-size: 11px; font-weight: 700; }
535
+
536
+ /* Notes card and proposal preview on the board */
537
+ .notes-card {
538
+ position: absolute; top: 14px; left: 72px; width: 340px; max-height: calc(100% - 90px); overflow: auto; z-index: 6;
539
+ background: var(--paper); border: 1px solid var(--line); border-radius: 14px; box-shadow: var(--shadow); padding: 12px 14px;
540
+ display: flex; flex-direction: column; gap: 8px;
541
+ }
542
+ .notes-card .doc-sub { margin: 0; }
543
+ .notes-card .brief-grid { grid-template-columns: 1fr; }
544
+ .notes-card .field textarea, .notes-card input, .notes-card select { font-size: 13px; padding: 6px 8px; border: 1.5px solid var(--line); border-radius: 8px; background: var(--paper); color: var(--ink); }
545
+ .notes-card .case { grid-template-columns: 1fr; }
546
+ .connect { display: flex; flex-direction: column; gap: 12px; }
547
+ .connect .signin { min-height: 34px; display: flex; align-items: center; }
548
+ .connect code { font-family: var(--type-family-mono); }
549
+ .skills { display: flex; flex-wrap: wrap; gap: 4px; padding: 0 16px 10px; border-bottom: 1px solid var(--line); }
550
+ .skills span { font-size: 11px; font-weight: 600; padding: 2px 8px; border-radius: 99px; background: var(--accent-soft); color: var(--accent); cursor: default; }
551
+ .signals { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 6px; }
552
+ .signals span { font-size: 11px; padding: 1px 7px; border-radius: 99px; border: 1px solid var(--line); color: var(--ink-2); }
553
+ .msg.user .signals span { color: inherit; }
554
+ .btn.fix { margin-top: 8px; height: 30px; }
555
+ .live-toggle { display: flex; align-items: center; gap: 5px; font-size: 12px; color: var(--ink-2); margin-left: auto; margin-right: 8px; cursor: pointer; }
556
+ .known { margin: 0; display: flex; flex-direction: column; gap: 8px; }
557
+ .known-item dt { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em; color: var(--ink-2); display: flex; gap: 6px; align-items: baseline; }
558
+ .known-item dt em { text-transform: none; font-weight: 500; color: var(--warn); }
559
+ .known-item dt .link { margin-left: auto; text-transform: none; letter-spacing: 0; font-weight: 500; opacity: 0; }
560
+ .known-item:hover dt .link, .known-item dt .link:focus { opacity: 1; }
561
+ .known-item dd { margin: 2px 0 0; font-size: 13px; line-height: 1.45; white-space: pre-wrap; }
562
+ .known-item dd textarea { width: 100%; }
563
+ .chat-title { display: flex; align-items: center; gap: 6px; }
564
+ .blk { width: 240px; align-items: flex-start; }
565
+ .blk-why { font-size: 12px; line-height: 1.35; color: var(--ink-2); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; margin: 2px 0 3px; }
566
+ .blk-text strong { white-space: normal; }
567
+ .note { width: 200px; min-height: 90px; background: light-dark(#fff7cc, #4a4318); border: 1px solid light-dark(#f2d96b, #7a6c22); border-radius: 4px; box-shadow: 2px 3px 8px rgb(0 0 0 / 0.12); padding: 8px; }
568
+ .note.selected { outline: 2px solid var(--accent); }
569
+ .note textarea { width: 100%; min-height: 72px; border: 0; background: transparent; resize: none; font-size: 13px; line-height: 1.4; color: var(--ink); }
570
+ .note textarea:focus { outline: none; }
571
+ .ctx-menu { position: fixed; z-index: 30; min-width: 190px; background: var(--paper); border: 1px solid var(--line); border-radius: 10px; box-shadow: var(--shadow); padding: 5px; display: flex; flex-direction: column; }
572
+ .ctx-menu button { text-align: left; padding: 8px 10px; border-radius: 6px; font-size: 13px; }
573
+ .ctx-menu button:hover:not(:disabled) { background: var(--board); }
574
+ .ctx-menu .danger { color: var(--bad); }
575
+ .projects-btn { color: #d1d5db; display: grid; place-items: center; width: 28px; height: 28px; border-radius: 6px; }
576
+ .projects-btn:hover { background: rgb(255 255 255 / 0.08); color: #fff; }
577
+ .projects { display: flex; flex-direction: column; gap: 12px; }
578
+ .project-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
579
+ .project-list li { display: flex; align-items: center; gap: 8px; border: 1.5px solid var(--line); border-radius: 10px; padding: 6px 8px; }
580
+ .project-list li.current { border-color: var(--accent); }
581
+ .project-list .open { flex: 1; display: flex; flex-direction: column; text-align: left; padding: 4px; min-width: 0; }
582
+ .project-list .open strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
583
+ .project-list .open small { color: var(--ink-2); font-size: 12px; }
584
+ .project-list .open:disabled { opacity: 1; cursor: default; }
585
+ .project-list .bin { font-size: 16px; }
586
+ .bin-list summary { cursor: pointer; color: var(--ink-2); font-size: 13px; }
587
+ .bin-list ul { margin-top: 8px; }
588
+ .btn.danger { color: var(--bad); border-color: var(--bad); }
589
+ .notes-tab { position: absolute; top: 14px; left: 72px; z-index: 6; padding: 6px 12px; border-radius: 99px; background: var(--paper); border: 1px solid var(--line); box-shadow: var(--shadow); font-size: 13px; font-weight: 600; }
590
+ .preview-bar {
591
+ position: absolute; top: 56px; left: 50%; transform: translateX(-50%); z-index: 9; display: flex; gap: 8px; align-items: center;
592
+ background: var(--paper); border: 2px solid var(--accent); border-radius: 12px; padding: 6px 8px 6px 14px; box-shadow: var(--shadow); white-space: nowrap;
593
+ }
594
+ .react-flow__node.preview .blk, .react-flow__node.preview .layer { border-style: dashed; border-color: var(--accent); }
595
+ .react-flow__edge.preview .react-flow__edge-path { stroke: var(--accent); stroke-dasharray: 6 4; }
596
+
597
+ /* Review */
598
+ .finding-group h3 { margin: 10px 0 6px; font-size: 15px; }
599
+ .finding { background: var(--paper); border: 1.5px solid var(--line); border-left: 5px solid var(--ink-2); border-radius: 10px; padding: 12px 14px; display: flex; flex-direction: column; gap: 4px; margin-bottom: 8px; }
600
+ .finding p { margin: 0; font-size: 13px; }
601
+ .finding.sev-blocker { border-left-color: var(--bad); }
602
+ .finding.sev-major { border-left-color: var(--warn); }
603
+ .finding.accepted { opacity: 0.65; }
604
+ .finding-head { display: flex; gap: 8px; align-items: baseline; }
605
+ .finding-foot { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin-top: 4px; }
606
+ .finding-foot .chip { padding: 2px 9px; }
607
+ .sev { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em; padding: 1px 7px; border-radius: 99px; border: 1px solid currentColor; color: var(--ink-2); white-space: nowrap; }
608
+ .sev.blocker { color: var(--bad); }
609
+ .sev.major { color: var(--warn); }
610
+
611
+ /* Estimate */
612
+ .totals { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px; }
613
+ .totals > div { background: var(--paper); border: 1.5px solid var(--line); border-radius: 12px; padding: 12px 14px; display: flex; flex-direction: column; gap: 2px; }
614
+ .totals strong { font-size: 24px; }
615
+ .ok-text { color: var(--good); font-weight: 600; }
616
+ .bad-text { color: var(--bad); font-weight: 600; }
617
+ .warn-text { font-weight: 600; }
618
+ .usage { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 10px; }
619
+ .usage small { font-weight: 400; }
620
+ .lines { display: flex; flex-direction: column; gap: 6px; }
621
+ .line { display: grid; grid-template-columns: 2fr 110px 60px 1.4fr 110px; gap: 6px; align-items: center; background: var(--paper); border: 1.5px solid var(--line); border-radius: 10px; padding: 8px 10px; }
622
+ .line > span:first-child { display: flex; flex-direction: column; min-width: 0; }
623
+ .line.priced { border-color: var(--good); }
624
+ .line .cost { text-align: right; font-weight: 700; }
625
+ .line .cur { text-transform: uppercase; }
626
+ label.inline input { width: 60px; }
627
+
628
+ .runbar.note { font-size: 13px; }
629
+
630
+ /* Deploy */
631
+ .ready { border-radius: 12px; padding: 12px 14px; border: 2px solid var(--good); background: var(--paper); }
632
+ .ready.no { border-color: var(--bad); }
633
+ .ready ul { margin: 6px 0 0; padding-left: 18px; }
634
+ .steps-list { margin: 0; padding-left: 22px; display: flex; flex-direction: column; gap: 6px; }
635
+
636
+
637
+ /* ---------- Infrastructure console theme ---------- */
638
+ .bar { background: var(--chrome); border-bottom: 1px solid var(--chrome-2); color: var(--chrome-ink); }
639
+ .bar .brand { color: var(--chrome-ink); }
640
+ .bar .brand:hover, .bar .icon:hover:not(:disabled), .crumbs button:hover { background: rgb(255 255 255 / 0.08); color: #fff; }
641
+ .bar .icon { color: #d1d5db; }
642
+ .crumbs { color: #aab7b8; }
643
+ .crumbs .here, .project-name { color: #fff; }
644
+ .project-name:hover { border-color: rgb(255 255 255 / 0.25); }
645
+ .modes { background: transparent; border: 0; padding: 0; gap: 2px; }
646
+ .modes button { color: #d1d5db; border-radius: 0; padding: 14px 14px 12px; border-bottom: 3px solid transparent; display: flex; gap: 6px; align-items: center; }
647
+ .modes button:hover { color: #fff; }
648
+ .modes button.on { background: transparent; color: #fff; box-shadow: none; border-bottom-color: var(--action); }
649
+ .btn.primary, .button.run-button, .modal .button.run-button { background: var(--action); border-color: var(--action); color: #fff; }
650
+ .btn.primary:hover:not(:disabled), .button.run-button:hover:not(:disabled) { background: var(--action-hover); border-color: var(--action-hover); }
651
+ .btn { border-color: var(--line); border-width: 1.5px; border-radius: 20px; }
652
+ .btn:hover:not(:disabled) { border-color: var(--ink); }
653
+ .seg button.on, .chips button.on { background: var(--chrome); color: #fff; }
654
+
655
+ /* Service tiles: coloured by role like architecture icons */
656
+ .blk { border: 1px solid var(--line); border-radius: 10px; box-shadow: var(--shadow); gap: 12px; }
657
+ .blk:hover { border-color: var(--role); }
658
+ .blk.selected { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft), var(--shadow); }
659
+ .blk-icon { background: var(--role); color: #fff; border-radius: 8px; width: 38px; height: 38px; box-shadow: inset 0 -2px 0 rgb(0 0 0 / 0.15); }
660
+ .blk.kind-guard, .blk.kind-source, .blk.kind-output { border-style: solid; border-width: 1px; border-radius: 10px; }
661
+ .blk.kind-resource { border-style: dashed; }
662
+ .blk.existing { background: light-dark(#f8f8f8, #142030); }
663
+ .layer { border: 1px solid var(--line); border-left: 6px solid var(--role); border-radius: 12px; box-shadow: var(--shadow); }
664
+ .layer:hover { border-color: var(--role); box-shadow: 0 0 0 3px light-dark(rgb(9 114 211 / 0.12), rgb(83 159 229 / 0.2)), var(--shadow); }
665
+ .layer-head strong { font-size: 16px; }
666
+
667
+ /* Wires: a calm flow so connections feel live */
668
+ .react-flow__edge-path { stroke: var(--edge); stroke-width: 1.8; }
669
+ .react-flow__edge.wire .react-flow__edge-path { stroke-dasharray: none; animation: none; }
670
+ .react-flow__edge.wire-passed .react-flow__edge-path { stroke: var(--good); stroke-dasharray: none; animation: none; }
671
+ .react-flow__edge.wire-failed .react-flow__edge-path { animation: none; }
672
+ @keyframes flow { to { stroke-dashoffset: -20; } }
673
+
674
+ .react-flow__edge-textbg { fill: var(--board); }
675
+ .canvas .react-flow { --xy-background-pattern-dots-color-default: light-dark(#c6cbd1, #2a3a4d); }
676
+
677
+ /* Chat */
678
+ .chat { background: var(--paper); }
679
+ .chat-title { font-size: 15px; }
680
+ .msg.user { background: var(--chrome); color: #fff; }
681
+ .msg.assistant { padding-left: 12px; border-left: 3px solid var(--accent-soft); }
682
+ .skills span, .skills .skill { background: var(--accent-soft); color: var(--accent); display: inline-flex; gap: 4px; align-items: center; font-size: 11px; font-weight: 600; padding: 2px 8px; border-radius: 99px; }
683
+ .skills > span::before, .skills .skill::before { content: "✦"; font-size: 10px; }
684
+ .skills .skill.on { background: var(--accent); color: #fff; }
685
+ .chat .notes-card { position: static; width: auto; max-height: 45%; margin: 0; border: 0; border-bottom: 1px solid var(--line); border-radius: 0; box-shadow: none; padding: 10px 16px; background: light-dark(#fafafa, #15202e); }
686
+ .dots { display: flex; gap: 2px; flex-wrap: wrap; }
687
+ .dot { display: inline-flex; align-items: center; gap: 4px; font-size: 11px; color: var(--ink-2); padding: 2px 6px; border-radius: 99px; }
688
+ .dot i { width: 8px; height: 8px; border-radius: 50%; border: 1.5px solid var(--ink-2); display: inline-block; }
689
+ .dot.known { color: var(--ink); }
690
+ .dot.known i { background: var(--good); border-color: var(--good); }
691
+ .dot.assumed i { background: linear-gradient(90deg, var(--warn) 50%, transparent 50%); border-color: var(--warn); }
692
+ .dot.on, .dot:hover { background: var(--accent-soft); }
693
+ .skills { align-items: center; }
694
+ .known-bar { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 600; color: var(--ink-2); padding: 3px 8px; border-radius: 99px; }
695
+ .known-bar:hover, .known-bar.on { background: var(--accent-soft); color: var(--accent); }
696
+ .known-bar .segs { display: inline-flex; gap: 2px; }
697
+ .known-bar .segs i { width: 10px; height: 4px; border-radius: 2px; background: var(--line); }
698
+ .known-bar .segs i.known { background: var(--good); }
699
+ .known-bar .segs i.assumed { background: var(--warn); }
700
+ .known-list { list-style: none; display: flex; flex-direction: column; gap: 3px; }
701
+ .known-list li { display: grid; grid-template-columns: 14px auto 1fr; gap: 6px; align-items: baseline; font-size: 12px; }
702
+ .known-list li em { font-style: normal; color: var(--ink-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
703
+ .known-list li.open { color: var(--ink-2); }
704
+ .known-list li.known > span { color: var(--good); font-weight: 700; }
705
+ .known-list li.assumed > span { color: var(--warn); font-weight: 700; }
706
+ .peek { margin: 0 16px 8px; padding: 8px 10px; border-radius: 8px; background: var(--accent-soft); font-size: 13px; }
707
+ .peek p { margin: 4px 0 0; }
708
+ .knows { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 6px; }
709
+ .knows span { font-size: 11px; padding: 2px 8px; border-radius: 99px; background: var(--paper); border: 1px solid var(--line); }
710
+ .doc .notes-card { position: static; width: auto; max-height: none; box-shadow: none; }
711
+ .cases.compact { display: flex; flex-direction: column; gap: 6px; }
712
+ .cases.compact .case { grid-template-columns: 1fr auto 28px; }
713
+ .cases.compact input { min-width: 0; }
714
+ .chat-head { flex-wrap: wrap; row-gap: 6px; }
715
+ .live-toggle { order: 3; flex-basis: 100%; margin: 0; }
716
+ .signals span::before { content: "↳ "; color: var(--accent); }
717
+ .composer textarea { border-color: var(--line); }
718
+ .composer textarea:focus { border-color: var(--accent); }
719
+ .send { background: var(--action); }
720
+ .composer textarea { padding-right: 84px; }
721
+ .mic { position: absolute; right: 46px; bottom: 10px; width: 32px; height: 32px; border-radius: 50%; display: grid; place-items: center; color: var(--ink-2); border: 1.5px solid var(--line); background: var(--paper); }
722
+ .mic:hover { color: var(--ink); border-color: var(--ink-2); }
723
+ .mic.on { color: #fff; background: var(--bad); border-color: var(--bad); animation: pulse 1.4s ease-in-out infinite; }
724
+ @keyframes pulse { 50% { box-shadow: 0 0 0 6px rgb(217 21 21 / 0.18); } }
725
+ @media (prefers-reduced-motion: reduce) { .mic.on { animation: none; } }
726
+ .prompts button { border-radius: 20px; }
727
+
728
+ /* Connection: provider tiles */
729
+ .provider-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 8px; }
730
+ .provider-tile { display: flex; align-items: center; gap: 10px; padding: 10px; border: 1.5px solid var(--line); border-radius: 10px; background: var(--paper); text-align: left; }
731
+ .provider-tile:hover { border-color: var(--ink-2); }
732
+ .provider-tile.on { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); }
733
+ .provider-tile .mono { width: 30px; height: 30px; border-radius: 8px; display: grid; place-items: center; color: #fff; font-weight: 800; font-size: 13px; flex: none; }
734
+ .provider-tile small { display: block; color: var(--ink-2); font-size: 11px; }
735
+ .provider-tile .signed { margin-left: auto; color: var(--good); font-weight: 700; }
736
+
737
+ /* ---------- Small screens ---------- */
738
+ @media (max-width: 900px) {
739
+ .app { grid-template-columns: minmax(0, 1fr); grid-template-rows: auto 60vh auto; height: auto; min-height: 100vh; }
740
+ .bar { flex-wrap: wrap; padding: 8px 12px; gap: 8px; }
741
+ .crumbs { order: 3; flex-basis: 100%; overflow-x: auto; }
742
+ .project-name { width: 14ch; }
743
+ .chat { border-left: 0; border-top: 1px solid var(--line); height: 85dvh; min-height: 0; }
744
+ .runbar { left: 10px; right: 10px; bottom: 60px; flex-wrap: wrap; }
745
+ .detail { grid-template-columns: minmax(0, 1fr); padding: 16px; }
746
+ .palette { width: min(300px, calc(100vw - 90px)); }
747
+ .deploy { left: 70px; right: 10px; width: auto; }
748
+ .menu { right: 12px; }
749
+ .menu.issues { right: 12px; left: 12px; }
750
+ }
751
+ @media (max-width: 520px) {
752
+ .modes button { padding: 5px 9px; }
753
+ .brand span { display: none; }
754
+ }
755
+
756
+ /* Progressive delivery details stay collapsed until requested. */
757
+ .delivery-fields { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 12px; }
758
+ .charge-editor { min-width: 0; margin: 16px 0; padding: 14px; border: 1px solid var(--border, #d5dbd8); border-radius: 8px; }
759
+ .charge-editor legend { padding: 0 6px; font-weight: 600; }
760
+ .delivery-basis { grid-column: 1 / -1; }
761
+ .resource-schedule { display: grid; gap: 10px; margin: 16px 0; }
762
+ .resource-schedule article { display: grid; gap: 5px; padding: 12px; border: 1px solid var(--border, #d5dbd8); border-radius: 8px; overflow-wrap: anywhere; }
763
+ .resource-schedule article span, .resource-schedule article small { color: var(--muted, #58645e); }
764
+ @media (max-width: 600px) { .delivery-fields { grid-template-columns: minmax(0, 1fr); } }
765
+
766
+ /* Keep existing document cards readable inside the page's scroll area. */
767
+ .doc > * { flex-shrink: 0; }
768
+ .doc .notes-card { overflow: visible; }
769
+ .context-used { font-size: 11px; margin-top: 6px; overflow-wrap: anywhere; }
770
+ .context-used p { font-size: 11px; }
771
+ .memory-profile { display: grid; gap: 10px; margin: 14px 0; }
772
+
773
+ .requirements-summary li { margin: 1rem 0; }
774
+ .requirements-summary li > p { margin-bottom: .3rem; }
775
+ .requirements-summary li > .link { margin-left: .75rem; }
776
+
777
+ .consultation-summary { padding: 1rem 0; border-bottom: 1px solid var(--border, #334155); }
778
+
779
+ /* Requirements read as a continuous document, while chat stays alongside it. */
780
+ .requirements-document { background: var(--board); }
781
+ .requirements-actions { width: min(100%, 850px); margin: 0 auto 20px; }
782
+ .requirements-paper { box-sizing: border-box; width: min(100%, 850px); margin: 0 auto 32px; padding: 56px 64px; background: #fffefa; color: #172033; box-shadow: 0 4px 24px #0002; overflow-wrap: anywhere; }
783
+ .requirements-paper p { font-family: Georgia, 'Times New Roman', serif; font-size: 16px; line-height: 1.8; margin: 0 0 16px; white-space: pre-line; }
784
+ .requirements-cover { border-bottom: 2px solid #F3A2B4; padding-bottom: 24px; margin-bottom: 32px; }
785
+ .requirements-paper h2 { color: #172033; font-size: 32px; line-height: 1.25; margin: 16px 0; }
786
+ .requirements-paper .document-kicker, .requirements-paper .document-meta, .requirements-paper .document-subtitle { font-family: inherit; }
787
+ .requirements-paper .document-kicker { text-transform: uppercase; letter-spacing: .14em; font-size: 11px; color: #52616c; }
788
+ .requirements-paper .document-subtitle { font-size: 19px; color: #52616c; }
789
+ .requirements-paper .document-meta { font-size: 11px; line-height: 1.6; color: #63717b; }
790
+ .requirements-chapter { margin: 30px 0; }
791
+ .requirements-paper h3 { font-size: 19px; line-height: 1.4; color: #172033; margin: 0 0 16px; }
792
+ .requirement-paragraph { margin-bottom: 24px; }
793
+ .requirement-paragraph > p:first-child { margin-bottom: 8px; }
794
+ .requirements-paper .acceptance-target { font-size: 14px; }
795
+ .requirements-paper .document-discuss { color: #873B50; font-size: 12px; text-align: left; }
796
+ .document-footer { border-top: 1px solid #d8dee1; padding-top: 16px; margin-top: 44px; font-size: 10px; color: #63717b; }
797
+ @media (max-width: 700px) { .requirements-paper { padding: 28px 22px; } .requirements-paper h2 { font-size: 25px; } }
798
+
799
+ .requirements-actions { display:flex; flex-wrap:wrap; gap:12px; }
800
+ .requirement-comments { margin-top:10px; }
801
+ .requirement-comment { background:#FCF5F7; border-left:3px solid #DCA2B1; padding:10px 14px; margin:8px 0; }
802
+ .requirements-paper .requirement-comment p { font-family:inherit; font-size:13px; margin-bottom:4px; white-space:pre-wrap; }
803
+ .requirement-comment small { color:#52616c; margin-right:16px; }
804
+ .requirement-comments .link { color:#873B50; font-size:12px; }
805
+ .comment-composer textarea { display:block; width:100%; min-height:80px; margin:10px 0; padding:10px; background:white; color:#172033; border:1px solid #DCA2B1; border-radius:4px; box-sizing:border-box; font:inherit; }
806
+ .comment-composer .btn { background:#873B50; color:white; margin-right:12px; }
807
+
808
+ .requirements-paper .requirement-number { color:#873B50; font-size:12px; letter-spacing:.06em; margin:0 0 8px; }
809
+
810
+ .requirement-add-comment { display:inline-flex; align-items:center; padding:7px 12px; border:1px solid #DCA2B1; border-radius:5px; background:#FCECF0; color:#873B50; font-size:12px; font-weight:600; cursor:pointer; }
811
+ .requirement-add-comment:hover { background:#F6D7E0; }
812
+ .requirement-comments blockquote { border-left:3px solid #DCA2B1; margin:8px 0; padding:6px 12px; color:#52616c; font-size:13px; white-space:pre-wrap; }
813
+ .requirement-text-menu { z-index:100; }
814
+ .requirement-text::selection { background:#F6D7E0; color:#172033; }
815
+
816
+ .requirements-paper .requirement-reason { margin:12px 0; padding-left:14px; border-left:2px solid #F6D7E0; }
817
+ .requirements-paper .requirement-reason p { font-family:inherit; font-size:13px; line-height:1.7; }
818
+ .requirements-paper .comment-status { font-family:inherit; font-size:12px; color:#52616c; }
819
+ .requirement-comments .link { margin:8px 12px; }
820
+ .requirement-revision { margin-top:16px; }
821
+ .requirement-revision h5 { font-size:14px; margin:12px 0; }
822
+ .requirements-paper .revision-label { font-weight:600; margin-bottom:4px; }
823
+ .requirements-paper .revision-after { background:#e6f2e9; padding:12px; }
824
+ .comment-history { margin:10px 0; font-size:12px; color:#52616c; }
825
+ .comment-history summary, .requirements-chapter > summary { cursor:pointer; font-weight:600; }
826
+
827
+ .journey-guide { padding:12px 16px; border-top:1px solid var(--line); background:var(--paper); flex-shrink:0; }
828
+ .journey-guide small { color:var(--accent); font-weight:600; }
829
+ .journey-guide p { font-size:12px; line-height:1.5; margin:6px 0 10px; }
830
+ .journey-guide .btn { width:100%; font-size:12px; padding:7px 10px; }
831
+ .journey-continue { display:block; margin-top:8px; font-size:12px; text-align:left; }
832
+
833
+ /* Journey stays visible above the workspace, even with chat closed. */
834
+ .app { grid-template-rows:52px auto minmax(0,1fr); }
835
+ .journey-wizard { grid-column:1 / -1; padding:12px 22px; background:var(--paper); border-bottom:1px solid var(--line); min-width:0; }
836
+ .journey-steps { display:flex; align-items:center; flex-wrap:wrap; gap:10px 22px; list-style:none; padding:0; margin:0 0 12px; }
837
+ .journey-steps li { display:flex; align-items:center; gap:7px; color:var(--ink-2); font-size:12px; }
838
+ .journey-steps li span { width:22px; height:22px; display:grid; place-items:center; border:1px solid var(--line); border-radius:50%; }
839
+ .journey-steps li[aria-current=step] { color:var(--ink); font-weight:700; }
840
+ .journey-steps li[aria-current=step] span { background:var(--action); color:#fff; border-color:var(--action); }
841
+ .journey-current { display:flex; align-items:center; justify-content:space-between; gap:24px; }
842
+ .journey-current strong { font-size:14px; }
843
+ .journey-current p { margin:4px 0 0; color:var(--ink-2); font-size:12px; line-height:1.5; }
844
+ .journey-actions { display:flex; align-items:center; gap:14px; flex-shrink:0; }
845
+ .journey-actions .btn, .journey-actions .link { font-size:12px; }
846
+ .consultation-summary > button { margin-right:14px; margin-top:8px; }
847
+ @media(max-width:900px){.app { grid-template-rows:auto auto 60vh auto; }.journey-wizard{padding:12px;}.journey-current{align-items:flex-start;flex-direction:column;gap:12px;}.journey-actions{flex-wrap:wrap;}.journey-steps{gap:8px 14px;}}
848
+
849
+ .journey-steps li button { display:flex; align-items:center; gap:7px; padding:3px 5px; border:0; background:none; color:inherit; font:inherit; border-radius:5px; cursor:pointer; }
850
+ .journey-steps li button:disabled { cursor:default; }
851
+ .journey-steps li button:not(:disabled):hover { background:var(--color-brand-soft); text-decoration:none; }
852
+ .journey-steps li button:focus-visible { outline:2px solid var(--action); outline-offset:3px; }
853
+ .cloud-selection { display:flex; flex-wrap:wrap; gap:10px; align-items:center; padding:14px; border:1px solid var(--line); border-radius:8px; }
854
+
855
+ .journey-actions { flex-wrap:wrap; justify-content:flex-end; flex-shrink:1; }
856
+ @media(max-width:900px){.journey-actions{justify-content:flex-start;}}
857
+
858
+ .terraform-code { white-space:pre-wrap; overflow-wrap:anywhere; max-height:55vh; overflow:auto; padding:18px; background:var(--paper); border:1px solid var(--line); border-radius:8px; font-size:12px; line-height:1.6; }
859
+ .terraform-view .row, .terraform-view .seg { margin:16px 0; flex-wrap:wrap; }
860
+
861
+ /* AtMem · AtForma lockup and shared theme; retain workspace layout. */
862
+ .bar .icon, .crumbs, .modes button { color:var(--color-muted); }
863
+ .crumbs .here, .project-name, .modes button.on, .modes button:hover { color:var(--color-ink); }
864
+ .bar .brand:hover, .bar .icon:hover:not(:disabled), .crumbs button:hover { background:var(--color-brand-soft); color:var(--color-ink); }
865
+ .btn.primary, .button.run-button, .modal .button.run-button, .send, .journey-steps li[aria-current=step] span { color:var(--color-brand-ink); }
866
+ .seg button.on, .chips button.on { background:var(--color-brand-soft); color:var(--color-ink); }
867
+ .brand { white-space:nowrap; }
868
+ .brand-divider { color:var(--color-brand); padding:0 3px; }
869
+ @media(max-width:900px){.brand span{display:inline;}}
870
+
871
+ .outputs-view { overflow:auto; }
872
+ .outputs-view aside { min-width:0; overflow-wrap:anywhere; }
873
+ .outputs-browser { display:grid; grid-template-columns:220px minmax(0,1fr); gap:20px; align-items:start; margin-top:20px; }
874
+ .outputs-directory { border:1px solid var(--line); border-radius:8px; padding:12px; min-width:0; }
875
+ .outputs-directory details+details { margin-top:16px; }
876
+ .outputs-directory summary { font-weight:600; cursor:pointer; margin-bottom:8px; }
877
+ .outputs-directory button { display:block; width:100%; text-align:left; padding:7px 8px; overflow-wrap:anywhere; font-size:12px; border-radius:4px; }
878
+ .outputs-directory button[aria-current=page] { background:var(--accent-soft); color:var(--accent); }
879
+ .output-preview { min-width:0; }
880
+ .output-preview > h3 { overflow-wrap:anywhere; margin-top:0; }
881
+ .output-document { background:var(--paper); border:1px solid var(--line); padding:28px; border-radius:6px; overflow-wrap:anywhere; line-height:1.65; }
882
+ .output-document h2,.output-document h3,.output-document h4 { margin:26px 0 12px; }
883
+ .output-document h2:first-child { margin-top:0; }
884
+ .output-document ul { padding-left:22px; }
885
+ .output-document pre,.output-code { white-space:pre-wrap; overflow-wrap:anywhere; font-size:12px; padding:16px; background:var(--paper); border:1px solid var(--line); border-radius:6px; }
886
+ .output-table-row { font-family:var(--type-family-mono); font-size:12px; }
887
+ .output-image { display:block; width:100%; height:auto; background:white; border:1px solid var(--line); }
888
+ .output-pdf { width:100%; height:70vh; border:1px solid var(--line); background:white; }
889
+ @media(max-width:900px){.outputs-browser{grid-template-columns:minmax(0,1fr);}.outputs-directory{max-height:250px;overflow:auto;}.output-document{padding:18px;}}
890
+
891
+ .outputs-directory { position:sticky; top:12px; max-height:65vh; overflow:auto; }
892
+ @media(max-width:900px){.outputs-directory{position:static;max-height:250px;}}
893
+
894
+ /* ---------- Architecture Canvas type ---------- */
895
+ h1, h2, h3, .brand, .doc-head h2, .modal h2, .detail-title input, .indicator strong { font-family: var(--type-family-display); letter-spacing: -0.01em; }
896
+
897
+ /* ---------- Architecture Canvas: Miro-like, few edges ----------
898
+ Panels and controls separate by soft fills and shadow rather than outlines.
899
+ Text inputs keep a visible boundary so it stays obvious where to type. */
900
+ .modes { border-color: transparent; background: var(--color-card-raised); border-radius: 12px; padding: 4px; }
901
+ .modes button { border-radius: 9px; }
902
+ .modes button.on { box-shadow: var(--elevation-card); }
903
+ .seg { border-color: transparent; background: var(--color-card-raised); border-radius: 12px; padding: 3px; }
904
+ .seg button { border-radius: 9px; }
905
+ .seg button.on { background: var(--paper); color: var(--ink); box-shadow: var(--elevation-card); }
906
+ .chat { border-left-color: transparent; box-shadow: -10px 0 30px rgba(23, 32, 51, 0.05); }
907
+ .chips button, .prompts button, .skills, .linked, .notes-tab, .blk, .layer, .chat .notes-card, .cloud-selection, .outputs-directory, .output-document { border-color: transparent; background: var(--color-card-raised); border-radius: 12px; }
908
+ .ctx-menu, .palette-search { border-color: transparent; border-radius: 14px; box-shadow: var(--elevation-raised); }
909
+ .journey-guide, .journey-wizard { border-color: transparent; }
910
+ .composer textarea { border-radius: 18px; }
911
+ .terraform-code { border-radius: 12px; }
912
+
913
+ /* AtMem.ai lockup shared with the website and the other AtMem.ai apps. */
914
+ .atmem-mark { flex: none; color: var(--color-ink); }
915
+ .atmem-dot { fill: #F3A2B4; }
916
+ :root[data-theme="dark"] .atmem-dot { fill: #F3A2B4; }
917
+ .bar .brand { color: var(--color-ink); font-weight: 800; }
918
+ .brand-divider { color: var(--color-muted); font-weight: 500; padding: 0 6px; }
919
+
920
+ .voice-status{font-size:12px;line-height:1.5;padding:0 16px 10px;color:var(--muted)}
921
+ .voice-status:empty{display:none}
922
+ .voice-status button{display:block;margin-top:6px;text-decoration:underline;background:none;border:0;color:inherit;cursor:pointer;font:inherit}
923
+
924
+ /* Two gentle pulses, then a steady outline until the change cue expires. */
925
+ .react-flow__node.diagram-attention {
926
+ outline: 3px solid var(--accent);
927
+ outline-offset: 7px;
928
+ border-radius: 14px;
929
+ animation: diagram-change-pulse 1s ease-in-out 2;
930
+ }
931
+ .react-flow__edge.diagram-attention .react-flow__edge-path {
932
+ stroke: var(--accent);
933
+ stroke-width: 4;
934
+ animation: diagram-edge-pulse 1s ease-in-out 2;
935
+ }
936
+ @keyframes diagram-change-pulse {
937
+ 50% { outline-offset: 13px; box-shadow: 0 0 0 12px var(--accent-soft); }
938
+ }
939
+ @keyframes diagram-edge-pulse { 50% { stroke-width: 7; } }
940
+ @media (prefers-reduced-motion: reduce) {
941
+ .react-flow__node.diagram-attention,
942
+ .react-flow__edge.diagram-attention .react-flow__edge-path { animation: none; }
943
+ }
944
+
945
+ .emulation-panel { margin: 16px 0; padding: 16px; border: 1px solid var(--line); border-radius: 12px; }
946
+ .emulation-panel h3 { margin-top: 0; }
947
+ .emulation-panel li { margin: 6px 0; }
948
+ .emulation-panel details { margin-top: 12px; }
949
+ /* Canvas-native emulation: a small live instrument, never a replacement page. */
950
+ .emulation-dock{position:absolute;left:76px;bottom:24px;z-index:10;width:min(370px,calc(100% - 100px));pointer-events:auto}
951
+ .emulation-panel{margin:0;padding:16px;background:var(--paper);border:1px solid var(--line);border-radius:20px;box-shadow:0 12px 40px #153c3c18;text-align:left}
952
+ .emulation-heading{display:flex;align-items:center;gap:12px}.emulation-heading>div{flex:1;min-width:0}.emulation-heading h3{font-size:14px;line-height:1.4;margin:3px 0}.emulation-eyebrow{font-size:9px;font-weight:700;letter-spacing:1.5px;color:var(--muted)}
953
+ .emulation-orb{display:grid;place-items:center;width:46px;height:46px;border-radius:16px;background:var(--accent-soft);color:var(--accent);flex-shrink:0}.emulation-orb.working{animation:mentor-pulse 1.6s ease-in-out infinite}
954
+ .emulation-controls{display:flex;gap:6px;align-items:center;margin:14px 0}.emulation-icon{width:36px;height:36px;border:1px solid var(--line);border-radius:11px;flex-shrink:0}.emulation-icon:hover,.emulation-icon:focus-visible{background:var(--accent-soft)}.emulation-icon.active{color:var(--color-brand-ink);background:var(--action);border-color:var(--action)}.emulation-controls .emulation-icon:last-child{margin-left:auto}
955
+ .emulation-track{display:flex;align-items:center;gap:7px;font-size:10px;color:var(--muted)}.emulation-track i{height:1px;background:var(--line);flex:1}.emulation-track .current,.emulation-track .complete{color:var(--accent);font-weight:700}.emulation-caption{font-size:11px!important;line-height:1.6;margin-top:10px!important;color:var(--muted)}
956
+ .emulation-evidence{max-height:260px;overflow:auto;border-top:1px solid var(--line);margin-top:12px;padding-top:10px;font-size:11px;line-height:1.6}.emulation-evidence p{margin:8px 0}.emulation-check{display:flex;align-items:flex-start;gap:8px;padding:8px 0}.emulation-check svg{flex-shrink:0;color:var(--accent)}.emulation-check small{display:block}
957
+ .emulation-progress{height:3px;overflow:hidden;border-radius:6px;background:var(--accent-soft);margin-top:12px}.emulation-progress span{display:block;width:35%;height:100%;background:var(--accent);animation:emulation-sweep 1.5s ease-in-out infinite}
958
+ @keyframes mentor-pulse{50%{box-shadow:0 0 0 7px var(--accent-soft);transform:scale(1.05)}}@keyframes emulation-sweep{from{transform:translateX(-110%)}to{transform:translateX(390%)}}
959
+ .workspace-label{font-size:9px;letter-spacing:1.4px;font-weight:700;color:var(--muted)}.crumbs{flex-wrap:wrap;gap:8px!important}.crumbs .project-name{width:clamp(220px,30vw,520px);max-width:none!important;font-size:15px;font-weight:650}.crumbs button.here{background:var(--accent-soft);border:1px solid var(--color-brand);border-radius:9px;padding:7px 10px;color:var(--accent)}.crumbs button:not(.projects-btn){gap:6px}.journey-actions>.btn{min-width:42px;min-height:42px}
960
+ @media(prefers-reduced-motion:reduce){.emulation-orb.working,.emulation-progress span{animation:none}}
961
+ @media(max-width:700px){.emulation-dock{left:12px;bottom:12px;width:min(340px,calc(100% - 24px))}.emulation-evidence{max-height:140px}.workspace-label{display:none}.crumbs .project-name{width:200px;max-width:55vw!important}.crumbs{font-size:11px}}
962
+ .system-component,.system-interaction{margin:26px 0;padding-bottom:22px;border-bottom:1px solid var(--line)}.system-component h4,.system-interaction h4{font-size:19px;margin:0 0 14px}.system-component h5{font-size:13px;margin:20px 0 8px}.requirements-paper .system-component p,.requirements-paper .system-interaction p{font-family:inherit;font-size:14px;line-height:1.8}.system-component ul{font-size:14px;line-height:1.8;padding-left:20px}
963
+ .app{grid-template-rows:auto auto minmax(0,1fr)}.bar{flex-wrap:wrap;padding:10px 16px;gap:10px}.crumbs{order:3;flex-basis:100%;flex-wrap:nowrap;overflow:visible}.crumbs .project-name{flex:1;min-width:0;width:auto;max-width:none!important}.workspace-label{flex-shrink:0}.component-navigator{position:relative;flex-shrink:0}.tree-trigger{border:1px solid var(--line);background:var(--board);padding:8px 12px!important;max-width:none!important}.current-view{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--ink-2)}.component-tree{position:absolute;right:0;top:calc(100% + 8px);width:340px;max-height:65vh;overflow:auto;background:var(--paper);border:1px solid var(--line);border-radius:14px;box-shadow:var(--shadow);padding:16px;z-index:40}.component-tree strong{display:block;padding-bottom:12px;line-height:1.5}.component-tree summary{padding:10px 0;font-size:12px;font-weight:700}.component-tree button{width:100%;max-width:none!important;justify-content:flex-start;text-align:left;white-space:normal!important;padding:9px!important;border-radius:8px!important}.component-tree button span{padding:0;white-space:normal;max-width:none;font-size:12px}.component-tree small{display:block;color:var(--ink-2);font-size:10px}.component-tree details{border-top:1px solid var(--line)}.tree-views{padding-bottom:10px}.menu button{display:flex;align-items:center;justify-content:flex-start;gap:12px}.menu button svg{color:var(--ink-2);flex-shrink:0}.menu hr{border:0;border-top:1px solid var(--line);margin:7px 6px}.reset-actions{display:flex;flex-wrap:wrap;gap:10px;margin:24px 0}.reset-actions .btn{padding:12px 16px;min-height:44px;white-space:nowrap;border-radius:10px;line-height:1.3}
964
+ @media(max-width:900px){.app{grid-template-rows:auto auto 60vh auto}.current-view{display:none}.component-tree{position:fixed;top:110px;right:12px;width:min(340px,calc(100vw - 24px))}.tree-trigger{font-size:11px}.crumbs .project-name{max-width:none!important}.workspace-label{display:none}}
965
+
966
+ /* Filled brand controls use dark ink against the soft pink. */
967
+ .prompts .primary-chip, .btn.sketch, .skills .skill.on { background:var(--action); border-color:var(--action); color:var(--color-brand-ink); }
968
+
969
+ /* Place workspace controls beside the surface they affect. */
970
+ .bar-actions { margin-left:auto; gap:2px; padding:3px; border:1px solid var(--line); border-radius:12px; background:var(--paper); }
971
+ .bar>.menu { top:56px; right:16px; }
972
+ .chat-heading-row { display:flex; align-items:center; justify-content:space-between; width:100%; gap:12px; }
973
+ .chat-reopen { position:fixed; right:16px; top:180px; z-index:21; width:40px; height:40px; border:1px solid var(--line); background:var(--paper); box-shadow:var(--shadow); }
974
+ @media(max-width:900px){.chat-reopen{top:auto;bottom:16px;}}
975
+
976
+ /* Visible card boundaries on both the light and dark canvas. */
977
+ .blk, .layer { border-color:light-dark(#9AA2AD, #7B8B8D); }
978
+
979
+ .menu button:hover:not(:disabled), .menu button:focus-visible { background:var(--color-brand-soft); color:var(--color-brand-text); }
980
+
981
+ /* Shared interaction palette: hover and keyboard focus use the same rose family. */
982
+ :is(.icon,.btn,.menu button,.ctx-menu button,.palette-item,.chip button,.seg button,.chips button,.modes button,.prompts button,.template-list button,.provider-tile,.model,.link,.outputs-directory button,.tree-views button,.component-tree button,.journey-steps button):not(:disabled):is(:hover,:focus-visible) {
983
+ background:var(--color-brand-soft); color:var(--color-brand-text);
984
+ }
985
+ :is(.btn.primary,.button.run-button,.prompts .primary-chip,.btn.sketch,.emulation-icon.active):not(:disabled):is(:hover,:focus-visible) {
986
+ background:var(--action-hover); border-color:var(--action-hover); color:var(--color-brand-ink);
987
+ }
988
+ .blk:hover, .layer:hover { border-color:var(--color-brand-text); box-shadow:0 0 0 3px var(--color-brand-soft),var(--shadow); }
989
+ .project-name:hover, .model:hover, .provider-tile:hover, .prompts button:hover:not(:disabled), .template-list button:hover { border-color:var(--color-brand-text); }
990
+
991
+ .brain-activity { display:inline-block; vertical-align:middle; flex-shrink:0; overflow:visible; }
992
+ .brain-activity.is-active { animation:brain-breathe 1.6s ease-in-out infinite; }
993
+ @keyframes brain-breathe { 0%,100% { transform:scale(.92); } 50% { transform:scale(1.07); filter:drop-shadow(0 0 3px #F3A2B466); } }
994
+ @media(prefers-reduced-motion:reduce){.brain-activity.is-active{animation:none;}}
995
+
996
+ /* Persistent workspace navigation, aligned to the content edge. */
997
+ .subviews.seg { top:0; left:0; right:0; transform:none; display:flex; gap:8px; padding:10px 18px; border:0; border-bottom:1px solid var(--line); border-radius:0; background:var(--paper); box-shadow:none; }
998
+ .subviews.seg button { display:inline-flex; align-items:center; justify-content:center; gap:8px; padding:10px 14px; min-height:42px; font-size:14px; font-weight:600; border-radius:8px; white-space:nowrap; }
999
+ .subviews.seg button.on { background:var(--color-brand-soft); color:var(--color-brand-text); box-shadow:inset 0 -3px var(--color-brand); }
1000
+ .level-system .hint, .level-flow .hint { top:72px; }
1001
+ .canvas .doc { padding-top:88px; }
1002
+ @media(max-width:600px){.subviews.seg{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:4px;padding:8px;}.subviews.seg button{font-size:12px;padding:8px;}.canvas .doc{padding-top:112px;}.level-system .hint,.level-flow .hint{top:108px;}}
1003
+
1004
+ /* One journey, with workspace views and conversation context clearly secondary. */
1005
+ .journey-map { margin-bottom:12px; }
1006
+ .journey-map>summary { display:flex; align-items:center; gap:12px; width:fit-content; padding:6px 9px; border-radius:8px; color:var(--color-brand-text); font-size:12px; font-weight:600; cursor:pointer; list-style:none; }
1007
+ .journey-map>summary::-webkit-details-marker{display:none;}
1008
+ .journey-map>summary span { color:var(--ink-2); font-size:11px; font-weight:400; }
1009
+ .journey-map>summary::after{content:'⌄';}
1010
+ .journey-map[open]>summary::after{content:'⌃';}
1011
+ .journey-map>summary:is(:hover,:focus-visible){background:var(--color-brand-soft);}
1012
+ .journey-map .journey-steps{margin:12px 0;padding:12px;border:1px solid var(--line);border-radius:10px;}
1013
+ .journey-current .journey-next{margin-top:8px;color:var(--ink);font-weight:600;}
1014
+ .journey-next>span{font-size:10px;text-transform:uppercase;letter-spacing:.06em;color:var(--color-brand-text);margin-right:6px;}
1015
+ .workspace-views-label{align-self:center;font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-2);margin-right:8px;}
1016
+ .known-bar{gap:6px;}.known-bar[aria-expanded=true]>svg:last-child{transform:rotate(90deg);}
1017
+ .known-list .context-caption{display:block;font-size:10px;color:var(--ink-2);padding-bottom:8px;}
1018
+ @media(max-width:600px){.workspace-views-label{display:none;}}
1019
+
1020
+ /* Canvas-first shell: one identity row and one compact working toolbar. */
1021
+ .bar { flex-wrap:nowrap; padding:5px 12px; gap:10px; min-height:52px; }
1022
+ .crumbs { order:0; flex-basis:auto; flex:1; gap:6px!important; }
1023
+ .crumbs .workspace-label,.crumbs .current-view { display:none; }
1024
+ .crumbs .project-name { font-size:13px; padding:5px 4px; }
1025
+ .crumbs .tree-trigger { padding:5px 8px!important; font-size:11px; }
1026
+ .bar .brand { font-size:13px; }
1027
+ .bar .modes button { padding:7px 9px; }
1028
+ .journey-wizard { display:flex; align-items:center; gap:12px; padding:6px 12px; min-height:48px; border-bottom:1px solid var(--line); }
1029
+ .journey-map { position:relative; margin:0; flex-shrink:0; }
1030
+ .journey-map>summary { font-size:11px; padding:7px; max-width:170px; }
1031
+ .journey-map .journey-steps { position:absolute; left:0; top:100%; z-index:30; width:270px; background:var(--paper); box-shadow:var(--shadow); display:flex; flex-direction:column; align-items:stretch; margin:8px 0; }
1032
+ .journey-current { margin-left:auto; display:block; }
1033
+ .journey-current>div:first-child { display:none; }
1034
+ .journey-actions { gap:5px; flex-wrap:nowrap; }
1035
+ .journey-actions>.btn { min-width:34px; min-height:34px; height:34px; padding:6px; border-radius:10px; }
1036
+ .workspace-tabs.seg { display:flex; gap:3px; padding:0; border:0; border-radius:0; background:none; box-shadow:none; }
1037
+ .workspace-tabs.seg button { display:flex; align-items:center; gap:6px; white-space:nowrap; font-size:12px; padding:7px 9px; min-height:34px; }
1038
+ .workspace-tabs.seg button.on { background:var(--color-brand-soft); color:var(--color-brand-text); box-shadow:inset 0 -2px var(--color-brand); }
1039
+ .canvas .doc { padding-top:24px; }
1040
+ .level-system .hint,.level-flow .hint { top:12px; }
1041
+ @media(max-width:1100px){.bar .brand>span{display:none;}.crumbs .tree-trigger>span{display:none;}.journey-wizard{gap:6px;}.workspace-tabs.seg button{font-size:11px;padding:7px;}.journey-map>summary{max-width:130px;}}
1042
+ @media(max-width:700px){.bar{flex-wrap:wrap;gap:4px;padding:4px 8px;}.crumbs{min-width:220px;}.bar .modes{order:2;}.journey-wizard{flex-wrap:wrap;padding:5px 8px;}.workspace-tabs.seg{order:3;width:100%;}.workspace-tabs.seg button{flex:1;justify-content:center;font-size:11px;}.journey-map>summary{max-width:none;}.journey-current{margin-left:auto;}.canvas .doc{padding-top:20px;}}
1043
+
1044
+ .chat-markdown { white-space:normal; overflow-wrap:anywhere; }
1045
+ .chat-markdown p { margin:0 0 10px; }.chat-markdown p:last-child{margin-bottom:0;}
1046
+ .chat-markdown h4 { margin:14px 0 8px; font-size:14px; }.chat-markdown ul,.chat-markdown ol{margin:8px 0;padding-left:20px;}.chat-markdown li{margin:5px 0;}
1047
+ .chat-markdown pre{white-space:pre-wrap;overflow:auto;padding:12px;background:var(--board);color:var(--ink);border:1px solid var(--line);border-radius:8px;font-size:12px;}
1048
+ .chat-markdown code{font-family:var(--type-family-mono);font-size:.9em;}.chat-markdown a{color:var(--color-brand-text);text-decoration:underline;}
1049
+ .attachment-tray{margin:6px 14px;font-size:11px;max-height:180px;overflow:auto;}.attachment-tray>p{color:var(--ink-2);margin:6px 0;}
1050
+ .attachment-chip{display:flex;align-items:center;gap:8px;padding:6px;margin:4px 0;background:var(--color-brand-soft);border-radius:9px;}.attachment-chip>img{width:36px;height:36px;object-fit:cover;border-radius:4px;}.attachment-chip>span{flex:1;min-width:0;overflow-wrap:anywhere;}.attachment-chip small{display:block;color:var(--ink-2);font-size:10px;}.attachment-chip .icon{width:28px;height:28px;flex-shrink:0;}
1051
+ .attachment-status{margin:6px 16px;font-size:12px;}.sent-attachments{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px;}.sent-attachments figure{margin:0;max-width:100%;}.sent-attachments img{max-width:100%;max-height:180px;border-radius:8px;}.sent-attachments figcaption{display:flex;gap:5px;font-size:10px;overflow-wrap:anywhere;}
1052
+
1053
+ .modal-close { position:static; align-self:flex-end; flex-shrink:0; margin:-10px -10px -4px 0; border:1px solid var(--line); background:var(--paper); }
1054
+
1055
+ .composer { display:flex; flex-direction:column; gap:0; border:1px solid var(--line); border-radius:16px; background:var(--paper); padding:8px; }
1056
+ .composer:focus-within { border-color:var(--color-brand-text); box-shadow:0 0 0 2px var(--color-brand-soft); }
1057
+ .composer textarea { display:block; width:100%; min-height:58px; max-height:180px; padding:6px; border:0; border-radius:8px; resize:vertical; background:transparent; }
1058
+ .composer textarea:focus { border:0; box-shadow:none; }
1059
+ .composer-actions { display:flex; align-items:center; gap:8px; padding-top:6px; }
1060
+ .composer-actions .mic,.composer-actions .send { position:static; width:34px; height:34px; flex-shrink:0; }
1061
+ .composer-actions .mic { margin-left:auto; }
1062
+
1063
+ /* Clearly distinguish the user's own turns from architect replies. */
1064
+ .msg.user { align-self:flex-end; max-width:92%; background:var(--color-brand-soft); color:var(--color-ink); border:1px solid var(--color-line); border-radius:14px 14px 4px 14px; padding:12px 14px; }
1065
+ .msg.user .chat-markdown,.msg.user figcaption { color:var(--color-ink); }
1066
+ .msg.assistant { align-self:stretch; }
1067
+ .sent-attachments figcaption {display:flex;flex-wrap:wrap;align-items:center;gap:4px;overflow-wrap:anywhere;}
1068
+ .sent-attachments figcaption small {flex-basis:100%;font-size:10px;line-height:1.4;color:var(--color-muted);}
1069
+ /* Paper styling is tilted independently so note handles and typing stay aligned. */
1070
+ .note.sticky-note {position:relative;isolation:isolate;width:220px;min-height:140px;padding:22px 18px 24px;background:transparent;border:0;border-radius:0;box-shadow:none;}
1071
+ .note.sticky-note::before {content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;background:linear-gradient(150deg,light-dark(#fff5ba,#51451f),light-dark(#fff0a0,#42391d));border:1px solid light-dark(#d9c46d,#938052);border-radius:2px 2px 18px 2px;box-shadow:3px 7px 12px rgb(0 0 0 / .16);transform:rotate(-1.5deg);}
1072
+ .note.sticky-note::after {content:"";position:absolute;right:-1px;bottom:2px;width:22px;height:22px;pointer-events:none;background:linear-gradient(135deg,light-dark(#ddc66e,#8c7840) 48%,light-dark(#fff9d9,#63562b) 50%);clip-path:polygon(0 0,100% 0,0 100%);transform:rotate(-1.5deg);filter:drop-shadow(-1px -1px 1px rgb(0 0 0 / .12));}
1073
+ .note.sticky-note.selected {outline:none;}
1074
+ .note.sticky-note.selected::before,.note.sticky-note:focus-within::before {outline:2px solid var(--accent);outline-offset:3px;}
1075
+ .note.sticky-note textarea {min-height:94px;font-size:14px;line-height:1.55;color:light-dark(#453918,#fff4cb);}
1076
+ .note.sticky-note textarea::placeholder {color:light-dark(#786b40,#cabc8e);}
1077
+ .ctx-menu {min-width:204px;padding:6px;border:1px solid var(--line);border-radius:12px;box-shadow:0 8px 28px rgb(0 0 0 / .14);}
1078
+ .ctx-menu button {display:flex;align-items:center;gap:10px;min-height:36px;padding:8px 10px;font-size:13px;border-radius:7px;}
1079
+ .ctx-menu button svg {flex-shrink:0;color:var(--muted);}
1080
+ .ctx-menu .danger svg {color:inherit;}
1081
+ .ctx-divider {height:1px;margin:5px 8px;background:var(--line);}
1082
+ .empty-canvas {pointer-events:none;}
1083
+ .emulation-icon[aria-busy="true"]:disabled {opacity:1;cursor:wait;}
1084
+ .journey-actions [aria-busy="true"] {box-shadow:0 0 0 2px var(--color-brand-soft);}
1085
+ .emulation-icon.active[aria-busy="true"],.journey-actions .btn.primary[aria-busy="true"] {background:var(--paper);border:1px solid var(--color-brand);}
1086
+
1087
+ /* Component design review stays distinct from execution evidence. */
1088
+ .block-review-badge { display:inline-flex; align-items:center; gap:5px; align-self:flex-start; max-width:100%; padding:4px 8px; border:1px solid var(--line); border-radius:99px; font-size:11px; font-weight:600; line-height:1.3; color:var(--ink-2); background:var(--board); }
1089
+ .blk .block-review-badge { margin-top:7px; }
1090
+ .block-review-badge svg { flex-shrink:0; }
1091
+ .block-review-badge.reviewed { color:var(--color-brand-text); background:var(--color-brand-soft); border-color:var(--color-brand); }
1092
+ .block-review-badge.questions { color:light-dark(#795215,#f2ce8e); background:light-dark(#fff6e5,#332a1c); border-color:light-dark(#e7ce9d,#746039); }
1093
+ .block-review-badge.changed { color:var(--color-brand-text); border-color:var(--color-brand); }
1094
+ .component-review { display:flex; flex-direction:column; gap:12px; min-width:0; padding:14px; border:1px solid var(--line); border-radius:12px; background:var(--board); }
1095
+ .block-review-heading,.block-review-progress { display:flex; align-items:center; justify-content:space-between; flex-wrap:wrap; gap:8px; }
1096
+ .block-review-heading strong { font-size:13px; }
1097
+ .block-review-progress progress { flex:1; min-width:40px; height:6px; accent-color:var(--color-brand); }
1098
+ .block-review-progress small,.block-review-boundary { color:var(--ink-2); font-size:11px; }
1099
+ .block-review-checks,.block-review-questions { list-style:none; padding:0; margin:0; display:grid; gap:8px; font-size:12px; }
1100
+ .block-review-checks li { display:flex; align-items:center; gap:6px; }
1101
+ .block-review-checks svg { flex-shrink:0; }
1102
+ .block-review-checks .complete { color:var(--ink-2); }
1103
+ .block-review-checks .incomplete { color:light-dark(#795215,#f2ce8e); }
1104
+ .block-review-questions li { display:grid; gap:6px; padding:10px; background:var(--paper); border-left:3px solid var(--color-brand); border-radius:4px; overflow-wrap:anywhere; }
1105
+ .block-review-questions small { color:var(--ink-2); }
1106
+ .block-review-actions { display:flex; flex-wrap:wrap; gap:6px; }
1107
+ .block-review-actions .btn,.block-review-navigation .btn { padding:7px 9px; font-size:12px; }
1108
+ .block-review-navigation { display:flex; justify-content:space-between; gap:8px; border-top:1px solid var(--line); padding-top:10px; }
1109
+ .block-question-form,.block-review-questions form { display:grid; gap:8px; }
1110
+ .block-question-form label,.block-review-questions label { display:grid; gap:5px; font-size:12px; }
1111
+ .block-question-form textarea,.block-review-questions textarea { width:100%; min-width:0; min-height:70px; resize:vertical; border:1px solid var(--line); border-radius:8px; padding:8px; background:var(--paper); color:var(--ink); }
1112
+ .block-review-questions summary { color:var(--color-brand-text); cursor:pointer; font-size:12px; }
1113
+ .tree-review-state.reviewed { color:var(--color-brand-text); }
1114
+ .tree-review-state.questions { color:light-dark(#795215,#f2ce8e); }
1115
+ .block-architect-note { padding:10px; border-radius:8px; background:var(--paper); font-size:12px; line-height:1.5; }
1116
+ .block-architect-note strong { display:block; margin-bottom:5px; color:var(--color-brand-text); }
1117
+ .canvas-view-switch { display:flex; align-items:center; flex-wrap:wrap; gap:4px; margin-left:auto; border:1px solid var(--line); border-radius:10px; padding:3px; }
1118
+ .canvas-view-switch button { display:inline-flex; align-items:center; gap:5px; padding:6px 8px; border-radius:7px; font-size:11px; color:var(--ink-2); }
1119
+ .canvas-view-switch button[aria-pressed="true"] { color:var(--color-brand-text); background:var(--color-brand-soft); }
1120
+ .canvas-view-switch .topology-organise { border-left:1px solid var(--line); border-radius:0; }
1121
+ .topology-review-summary { font-size:12px; color:var(--color-brand-text); }
1122
+ .layer .topology-drill-hint { font-size:10px; color:var(--ink-2); margin-top:6px; }
1123
+ .component-settings > summary { cursor:pointer; font-size:12px; color:var(--ink-2); font-weight:600; padding:5px 0; }
1124
+ .component-settings[open] > summary { margin-bottom:10px; }
1125
+ @media(max-width:600px){.canvas-view-switch{margin-left:0;}.canvas-view-switch .topology-organise{font-size:10px;}}
1126
+ .block-requirements { display:grid; gap:10px; padding:12px; border:1px solid var(--line); border-radius:10px; background:var(--board); }
1127
+ .block-requirements > strong { font-size:13px; }
1128
+ .block-requirement { display:grid; gap:8px; border-top:1px solid var(--line); padding-top:10px; font-size:12px; line-height:1.5; overflow-wrap:anywhere; }
1129
+ .block-requirement form,.block-requirement label { display:grid; gap:8px; }
1130
+ .block-requirement textarea { width:100%; min-height:110px; resize:vertical; padding:8px; border:1px solid var(--line); border-radius:8px; color:var(--ink); background:var(--paper); }
1131
+ .block-requirements small { font-size:11px; color:var(--ink-2); }
1132
+ .layer .topology-review-summary { justify-content:flex-start; padding:0; text-align:left; }
1133
+ .layer .topology-review-summary:hover { text-decoration:underline; }
1134
+ .layer .topology-drill-hint { display:inline-flex; align-items:center; justify-content:flex-start; gap:4px; padding:0; }
1135
+ .recorded-answer { display:block; margin-top:4px; color:var(--ink-2); }
1136
+ .emulation-next-step { display:grid; gap:10px; padding:10px 0; font-size:12px; line-height:1.5; }
1137
+ .emulation-next-step .btn { justify-self:start; }
1138
+ .emulation-next-step .link { justify-self:start; }
1139
+ .intake-status { display:flex; align-items:center; gap:8px; padding:8px 16px; font-size:12px; color:var(--color-brand-text); background:var(--color-brand-soft); }
1140
+ .message-work-state { display:flex; flex-wrap:wrap; align-items:center; gap:8px; margin-top:6px; font-size:11px; color:var(--ink-2); }