@yss123/cage-cli 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (607) hide show
  1. package/README.md +47 -3
  2. package/bin/cage.js +5 -0
  3. package/bin/create-cage-app.js +5 -0
  4. package/dist/analyze.d.ts +16 -0
  5. package/dist/analyze.js +18 -2
  6. package/dist/analyze.js.map +1 -1
  7. package/dist/baseline.d.ts +8 -0
  8. package/dist/baseline.js +13 -0
  9. package/dist/baseline.js.map +1 -1
  10. package/dist/bootstrap.d.ts +20 -0
  11. package/dist/bootstrap.js +75 -0
  12. package/dist/bootstrap.js.map +1 -0
  13. package/dist/budget.d.ts +7 -0
  14. package/dist/budget.js +49 -5
  15. package/dist/budget.js.map +1 -1
  16. package/dist/capabilities.d.ts +38 -0
  17. package/dist/capabilities.js +133 -0
  18. package/dist/capabilities.js.map +1 -0
  19. package/dist/config.d.ts +31 -2
  20. package/dist/config.js +22 -0
  21. package/dist/config.js.map +1 -1
  22. package/dist/context.d.ts +14 -0
  23. package/dist/context.js +35 -2
  24. package/dist/context.js.map +1 -1
  25. package/dist/create-prompt.d.ts +7 -0
  26. package/dist/create-prompt.js +12 -0
  27. package/dist/create-prompt.js.map +1 -1
  28. package/dist/create.d.ts +21 -1
  29. package/dist/create.js +23 -1
  30. package/dist/create.js.map +1 -1
  31. package/dist/derive.d.ts +23 -0
  32. package/dist/derive.js +40 -0
  33. package/dist/derive.js.map +1 -1
  34. package/dist/dev.d.ts +6 -0
  35. package/dist/dev.js +11 -0
  36. package/dist/dev.js.map +1 -1
  37. package/dist/doctor.d.ts +98 -0
  38. package/dist/doctor.js +93 -0
  39. package/dist/doctor.js.map +1 -0
  40. package/dist/env.d.ts +6 -0
  41. package/dist/env.js +11 -0
  42. package/dist/env.js.map +1 -1
  43. package/dist/findings.d.ts +27 -0
  44. package/dist/findings.js +20 -0
  45. package/dist/findings.js.map +1 -1
  46. package/dist/gen/contracts.d.ts +28 -0
  47. package/dist/gen/contracts.js +52 -12
  48. package/dist/gen/contracts.js.map +1 -1
  49. package/dist/gen/index.d.ts +26 -0
  50. package/dist/gen/index.js +69 -1
  51. package/dist/gen/index.js.map +1 -1
  52. package/dist/gen/zod-code.d.ts +42 -0
  53. package/dist/gen/zod-code.js +178 -16
  54. package/dist/gen/zod-code.js.map +1 -1
  55. package/dist/graph-approvals.d.ts +60 -0
  56. package/dist/graph-approvals.js +80 -0
  57. package/dist/graph-approvals.js.map +1 -0
  58. package/dist/graph-business.d.ts +135 -0
  59. package/dist/graph-business.js +404 -0
  60. package/dist/graph-business.js.map +1 -0
  61. package/dist/graph-command.d.ts +17 -0
  62. package/dist/graph-command.js +21 -0
  63. package/dist/graph-command.js.map +1 -1
  64. package/dist/graph-model.d.ts +44 -0
  65. package/dist/graph-model.js +36 -3
  66. package/dist/graph-model.js.map +1 -1
  67. package/dist/graph-presentation.d.ts +16 -0
  68. package/dist/graph-presentation.js +10 -1
  69. package/dist/graph-presentation.js.map +1 -1
  70. package/dist/graph-query.d.ts +95 -0
  71. package/dist/graph-query.js +62 -0
  72. package/dist/graph-query.js.map +1 -1
  73. package/dist/graph-relations.d.ts +20 -0
  74. package/dist/graph-relations.js +34 -4
  75. package/dist/graph-relations.js.map +1 -1
  76. package/dist/graph-search.d.ts +35 -0
  77. package/dist/graph-search.js +36 -0
  78. package/dist/graph-search.js.map +1 -1
  79. package/dist/graph-snapshot.d.ts +26 -0
  80. package/dist/graph-snapshot.js +30 -1
  81. package/dist/graph-snapshot.js.map +1 -1
  82. package/dist/graph.d.ts +13 -2
  83. package/dist/graph.js +59 -4
  84. package/dist/graph.js.map +1 -1
  85. package/dist/impact.d.ts +50 -0
  86. package/dist/impact.js +62 -2
  87. package/dist/impact.js.map +1 -1
  88. package/dist/index.d.ts +10 -0
  89. package/dist/index.js +10 -0
  90. package/dist/index.js.map +1 -1
  91. package/dist/init.d.ts +12 -0
  92. package/dist/init.js +15 -0
  93. package/dist/init.js.map +1 -1
  94. package/dist/load.d.ts +10 -0
  95. package/dist/load.js +15 -0
  96. package/dist/load.js.map +1 -1
  97. package/dist/main.d.ts +6 -0
  98. package/dist/main.js +93 -5
  99. package/dist/main.js.map +1 -1
  100. package/dist/migrate.d.ts +12 -0
  101. package/dist/migrate.js +17 -0
  102. package/dist/migrate.js.map +1 -1
  103. package/dist/ontology.d.ts +67 -2
  104. package/dist/ontology.js +89 -2
  105. package/dist/ontology.js.map +1 -1
  106. package/dist/process-rules.d.ts +21 -0
  107. package/dist/process-rules.js +100 -0
  108. package/dist/process-rules.js.map +1 -0
  109. package/dist/process.d.ts +32 -0
  110. package/dist/process.js +32 -0
  111. package/dist/process.js.map +1 -1
  112. package/dist/project-structure.d.ts +5 -0
  113. package/dist/project-structure.js +10 -0
  114. package/dist/project-structure.js.map +1 -1
  115. package/dist/registration.d.ts +16 -0
  116. package/dist/registration.js +56 -0
  117. package/dist/registration.js.map +1 -0
  118. package/dist/rules.d.ts +52 -0
  119. package/dist/rules.js +58 -0
  120. package/dist/rules.js.map +1 -1
  121. package/dist/runtime-diagnostics.d.ts +27 -0
  122. package/dist/runtime-diagnostics.js +60 -0
  123. package/dist/runtime-diagnostics.js.map +1 -0
  124. package/dist/snapshots.d.ts +40 -0
  125. package/dist/snapshots.js +62 -0
  126. package/dist/snapshots.js.map +1 -0
  127. package/dist/static-check.d.ts +33 -0
  128. package/dist/static-check.js +37 -1
  129. package/dist/static-check.js.map +1 -1
  130. package/dist/sync.d.ts +11 -0
  131. package/dist/sync.js +65 -8
  132. package/dist/sync.js.map +1 -1
  133. package/dist/upgrade.d.ts +16 -0
  134. package/dist/upgrade.js +21 -0
  135. package/dist/upgrade.js.map +1 -1
  136. package/dist/verify.d.ts +14 -0
  137. package/dist/verify.js +19 -0
  138. package/dist/verify.js.map +1 -1
  139. package/dist/version.js +5 -0
  140. package/dist/version.js.map +1 -1
  141. package/graph-ui/app.js +321 -27
  142. package/graph-ui/approval-flow.js +165 -0
  143. package/graph-ui/business.css +985 -0
  144. package/graph-ui/business.js +549 -0
  145. package/graph-ui/flowchart-interaction.js +177 -0
  146. package/graph-ui/flowchart.js +1059 -0
  147. package/graph-ui/graph-approvals.js +79 -0
  148. package/graph-ui/graph-business.js +403 -0
  149. package/graph-ui/graph-model.js +36 -3
  150. package/graph-ui/graph-relations.js +34 -4
  151. package/graph-ui/graph-search.js +36 -0
  152. package/graph-ui/index.html +26 -12
  153. package/graph-ui/model.js +28 -0
  154. package/graph-ui/relations.js +4 -0
  155. package/graph-ui/structure.js +44 -0
  156. package/graph-ui/style.css +12 -0
  157. package/package.json +6 -4
  158. package/templates/app/.dockerignore +2 -0
  159. package/templates/app/.env.example +10 -0
  160. package/templates/app/AGENTS.md +49 -9
  161. package/templates/app/README.md +4 -1
  162. package/templates/app/_gitignore +1 -0
  163. package/templates/app/apps/api/package.json +2 -2
  164. package/templates/app/apps/api/src/main.ts +5 -1
  165. package/templates/app/apps/api/src/worker.ts +3 -0
  166. package/templates/app/apps/web/index.html +1 -0
  167. package/templates/app/apps/web/package.json +7 -3
  168. package/templates/app/apps/web/src/app/app.tsx +122 -12
  169. package/templates/app/apps/web/src/app/styles/global.css +88 -8
  170. package/templates/app/apps/web/src/app/use-session.ts +43 -0
  171. package/templates/app/apps/web/src/app/workspace-layout.tsx +58 -19
  172. package/templates/app/apps/web/src/main.tsx +5 -0
  173. package/templates/app/apps/web/src/modules/approval/hooks/use-approval-tasks.ts +11 -0
  174. package/templates/app/apps/web/src/modules/approval/index.ts +4 -0
  175. package/templates/app/apps/web/src/modules/approval/pages/approval-tasks-page.tsx +20 -1
  176. package/templates/app/apps/web/src/modules/auth/index.ts +4 -0
  177. package/templates/app/apps/web/src/modules/auth/pages/login-page.tsx +12 -0
  178. package/templates/app/apps/web/src/modules/inventory/index.ts +4 -0
  179. package/templates/app/apps/web/src/modules/inventory/pages/inventory-page.tsx +29 -1
  180. package/templates/app/apps/web/src/modules/purchase/components/approval-history.tsx +32 -0
  181. package/templates/app/apps/web/src/modules/purchase/components/order-attachments.tsx +29 -0
  182. package/templates/app/apps/web/src/modules/purchase/components/purchase-assistant-context.tsx +17 -0
  183. package/templates/app/apps/web/src/modules/purchase/components/purchase-order-form.css +6 -0
  184. package/templates/app/apps/web/src/modules/purchase/components/purchase-order-form.tsx +25 -3
  185. package/templates/app/apps/web/src/modules/purchase/index.ts +5 -0
  186. package/templates/app/apps/web/src/modules/purchase/lib/presentation.ts +20 -0
  187. package/templates/app/apps/web/src/modules/purchase/pages/purchase-intelligence.css +15 -0
  188. package/templates/app/apps/web/src/modules/purchase/pages/purchase-order-detail-page.tsx +154 -0
  189. package/templates/app/apps/web/src/modules/purchase/pages/purchase-orders-page.tsx +52 -22
  190. package/templates/app/apps/web/src/modules/workspace/index.ts +5 -0
  191. package/templates/app/apps/web/src/modules/workspace/pages/home-page.tsx +44 -0
  192. package/templates/app/apps/web/src/shared/hooks/use-command.ts +13 -0
  193. package/templates/app/apps/web/src/shared/lib/error-message.ts +9 -0
  194. package/templates/app/apps/web/src/shared/lib/navigation.ts +21 -0
  195. package/templates/app/apps/web/src/shared/ui/assistant-markdown.tsx +19 -0
  196. package/templates/app/apps/web/src/shared/ui/assistant-panel.css +134 -0
  197. package/templates/app/apps/web/src/shared/ui/assistant-panel.tsx +200 -0
  198. package/templates/app/apps/web/src/shared/ui/assistant-scope.tsx +72 -0
  199. package/templates/app/apps/web/src/shared/ui/attachment-upload.css +28 -0
  200. package/templates/app/apps/web/src/shared/ui/attachment-upload.tsx +163 -0
  201. package/templates/app/apps/web/src/shared/ui/notice.tsx +7 -0
  202. package/templates/app/apps/web/src/shared/ui/page-heading.tsx +7 -0
  203. package/templates/app/apps/web/src/shared/ui/page-state.css +47 -0
  204. package/templates/app/apps/web/src/shared/ui/page-state.tsx +76 -0
  205. package/templates/app/apps/web/src/shared/ui/require-capability.tsx +34 -0
  206. package/templates/app/apps/web/vite.config.ts +5 -0
  207. package/templates/app/cage.config.json +9 -0
  208. package/templates/app/db/migrations/0002_draft.sql +12 -0
  209. package/templates/app/db/migrations/0003_draft.sql +8 -0
  210. package/templates/app/deploy/nginx.conf +52 -0
  211. package/templates/app/docs/ai/README.md +21 -0
  212. package/templates/app/docs/ai/architecture.md +26 -0
  213. package/templates/app/docs/ai/commenting.md +203 -0
  214. package/templates/app/docs/ai/diagnostics.md +80 -0
  215. package/templates/app/docs/ai/files.md +93 -0
  216. package/templates/app/docs/ai/intelligence.md +348 -0
  217. package/templates/app/docs/ai/ontology-context.md +59 -4
  218. package/templates/app/docs/ai/primitives.md +33 -0
  219. package/templates/app/docs/ai/project-structure.md +8 -3
  220. package/templates/app/docs/ai/purchase-example.md +16 -2
  221. package/templates/app/docs/ai/recipes.md +9 -1
  222. package/templates/app/docs/ai/routing.md +86 -0
  223. package/templates/app/docs/ai/troubleshooting.md +5 -0
  224. package/templates/app/docs/ai/workflow.md +24 -11
  225. package/templates/app/docs/errors/CAGE-AI-001.md +61 -0
  226. package/templates/app/docs/errors/CAGE-APPR-001.md +7 -6
  227. package/templates/app/docs/errors/CAGE-APPR-002.md +2 -2
  228. package/templates/app/docs/errors/CAGE-APPR-003.md +1 -1
  229. package/templates/app/docs/errors/CAGE-APPR-004.md +4 -4
  230. package/templates/app/docs/errors/CAGE-APPR-005.md +1 -1
  231. package/templates/app/docs/errors/CAGE-APPR-006.md +12 -6
  232. package/templates/app/docs/errors/CAGE-APPR-007.md +3 -3
  233. package/templates/app/docs/errors/CAGE-APPR-010.md +5 -5
  234. package/templates/app/docs/errors/CAGE-AUDIT-001.md +53 -0
  235. package/templates/app/docs/errors/CAGE-AUTH-001.md +1 -1
  236. package/templates/app/docs/errors/CAGE-BIZ-001.md +51 -0
  237. package/templates/app/docs/errors/CAGE-BIZ-002.md +49 -0
  238. package/templates/app/docs/errors/CAGE-BUDGET-001.md +1 -1
  239. package/templates/app/docs/errors/CAGE-BUDGET-002.md +1 -1
  240. package/templates/app/docs/errors/CAGE-BUDGET-003.md +1 -1
  241. package/templates/app/docs/errors/CAGE-CMD-002.md +1 -1
  242. package/templates/app/docs/errors/CAGE-CMD-003.md +1 -1
  243. package/templates/app/docs/errors/CAGE-CONN-001.md +3 -3
  244. package/templates/app/docs/errors/CAGE-CONN-002.md +1 -1
  245. package/templates/app/docs/errors/CAGE-CONN-003.md +1 -1
  246. package/templates/app/docs/errors/CAGE-CONN-004.md +1 -1
  247. package/templates/app/docs/errors/CAGE-CONN-005.md +1 -1
  248. package/templates/app/docs/errors/CAGE-CONN-006.md +1 -1
  249. package/templates/app/docs/errors/CAGE-CONN-007.md +6 -6
  250. package/templates/app/docs/errors/CAGE-CONN-008.md +5 -5
  251. package/templates/app/docs/errors/CAGE-CONN-009.md +6 -6
  252. package/templates/app/docs/errors/CAGE-CONN-010.md +6 -6
  253. package/templates/app/docs/errors/CAGE-CONN-011.md +1 -1
  254. package/templates/app/docs/errors/CAGE-CONN-012.md +1 -1
  255. package/templates/app/docs/errors/CAGE-CONN-013.md +49 -0
  256. package/templates/app/docs/errors/CAGE-CONN-014.md +48 -0
  257. package/templates/app/docs/errors/CAGE-CONN-015.md +49 -0
  258. package/templates/app/docs/errors/CAGE-CREATE-001.md +10 -9
  259. package/templates/app/docs/errors/CAGE-DECL-001.md +2 -2
  260. package/templates/app/docs/errors/CAGE-DECL-002.md +7 -6
  261. package/templates/app/docs/errors/CAGE-DECL-003.md +1 -1
  262. package/templates/app/docs/errors/CAGE-DECL-004.md +1 -1
  263. package/templates/app/docs/errors/CAGE-DEP-001.md +2 -2
  264. package/templates/app/docs/errors/CAGE-DEP-002.md +1 -1
  265. package/templates/app/docs/errors/CAGE-DEP-003.md +2 -2
  266. package/templates/app/docs/errors/CAGE-DEP-004.md +1 -1
  267. package/templates/app/docs/errors/CAGE-DEP-005.md +1 -1
  268. package/templates/app/docs/errors/CAGE-DIAG-001.md +53 -0
  269. package/templates/app/docs/errors/CAGE-DLQ-001.md +2 -2
  270. package/templates/app/docs/errors/CAGE-ENV-001.md +4 -4
  271. package/templates/app/docs/errors/CAGE-ENV-002.md +51 -0
  272. package/templates/app/docs/errors/CAGE-ENV-003.md +48 -0
  273. package/templates/app/docs/errors/CAGE-EVENT-001.md +1 -1
  274. package/templates/app/docs/errors/CAGE-EVENT-002.md +7 -7
  275. package/templates/app/docs/errors/CAGE-FIELD-001.md +2 -2
  276. package/templates/app/docs/errors/CAGE-FIELD-002.md +1 -1
  277. package/templates/app/docs/errors/CAGE-FIELD-003.md +1 -1
  278. package/templates/app/docs/errors/CAGE-FIELD-004.md +1 -1
  279. package/templates/app/docs/errors/CAGE-FILE-001.md +56 -0
  280. package/templates/app/docs/errors/CAGE-GEN-001.md +2 -2
  281. package/templates/app/docs/errors/CAGE-GEN-002.md +1 -1
  282. package/templates/app/docs/errors/CAGE-GEN-003.md +53 -0
  283. package/templates/app/docs/errors/CAGE-GRANT-001.md +3 -3
  284. package/templates/app/docs/errors/CAGE-GRANT-002.md +2 -2
  285. package/templates/app/docs/errors/CAGE-GRANT-003.md +7 -6
  286. package/templates/app/docs/errors/CAGE-IMPACT-001.md +2 -2
  287. package/templates/app/docs/errors/CAGE-IMPACT-002.md +52 -0
  288. package/templates/app/docs/errors/CAGE-INIT-001.md +1 -1
  289. package/templates/app/docs/errors/CAGE-INIT-002.md +1 -1
  290. package/templates/app/docs/errors/CAGE-INIT-003.md +2 -2
  291. package/templates/app/docs/errors/CAGE-INIT-004.md +1 -1
  292. package/templates/app/docs/errors/CAGE-INIT-005.md +52 -0
  293. package/templates/app/docs/errors/CAGE-JOB-001.md +1 -1
  294. package/templates/app/docs/errors/CAGE-JOB-002.md +1 -1
  295. package/templates/app/docs/errors/CAGE-JOB-003.md +1 -1
  296. package/templates/app/docs/errors/CAGE-LINT-001.md +1 -1
  297. package/templates/app/docs/errors/CAGE-MIG-001.md +1 -1
  298. package/templates/app/docs/errors/CAGE-MIG-002.md +1 -1
  299. package/templates/app/docs/errors/CAGE-MIG-005.md +1 -1
  300. package/templates/app/docs/errors/CAGE-NAME-001.md +1 -1
  301. package/templates/app/docs/errors/CAGE-NAME-002.md +1 -1
  302. package/templates/app/docs/errors/CAGE-NAME-003.md +3 -3
  303. package/templates/app/docs/errors/CAGE-NAME-004.md +1 -1
  304. package/templates/app/docs/errors/CAGE-NAME-005.md +1 -1
  305. package/templates/app/docs/errors/CAGE-NAME-006.md +1 -1
  306. package/templates/app/docs/errors/CAGE-ORG-001.md +7 -6
  307. package/templates/app/docs/errors/CAGE-PAIR-002.md +6 -5
  308. package/templates/app/docs/errors/CAGE-QUERY-001.md +1 -1
  309. package/templates/app/docs/errors/CAGE-QUERY-002.md +2 -2
  310. package/templates/app/docs/errors/CAGE-QUERY-003.md +7 -6
  311. package/templates/app/docs/errors/CAGE-REACT-001.md +3 -3
  312. package/templates/app/docs/errors/CAGE-REACT-002.md +1 -1
  313. package/templates/app/docs/errors/CAGE-REACT-003.md +50 -0
  314. package/templates/app/docs/errors/CAGE-READS-001.md +9 -6
  315. package/templates/app/docs/errors/CAGE-REG-001.md +13 -12
  316. package/templates/app/docs/errors/CAGE-REG-002.md +2 -1
  317. package/templates/app/docs/errors/CAGE-REG-003.md +1 -1
  318. package/templates/app/docs/errors/CAGE-REL-001.md +14 -14
  319. package/templates/app/docs/errors/CAGE-ROUTE-001.md +7 -6
  320. package/templates/app/docs/errors/CAGE-SCOPE-001.md +1 -1
  321. package/templates/app/docs/errors/CAGE-SCOPE-002.md +2 -2
  322. package/templates/app/docs/errors/CAGE-SECRET-001.md +2 -2
  323. package/templates/app/docs/errors/CAGE-SECRET-002.md +1 -1
  324. package/templates/app/docs/errors/CAGE-SENS-001.md +5 -5
  325. package/templates/app/docs/errors/CAGE-SQL-001.md +1 -1
  326. package/templates/app/docs/errors/CAGE-SQL-002.md +1 -1
  327. package/templates/app/docs/errors/CAGE-STATE-001.md +3 -3
  328. package/templates/app/docs/errors/CAGE-STATE-002.md +1 -1
  329. package/templates/app/docs/errors/CAGE-STATE-003.md +1 -1
  330. package/templates/app/docs/errors/CAGE-STATE-004.md +1 -1
  331. package/templates/app/docs/errors/CAGE-STATE-005.md +3 -2
  332. package/templates/app/docs/errors/CAGE-STATE-010.md +5 -5
  333. package/templates/app/docs/errors/CAGE-STATE-011.md +5 -5
  334. package/templates/app/docs/errors/CAGE-STRUCT-001.md +1 -1
  335. package/templates/app/docs/errors/CAGE-STRUCT-002.md +1 -1
  336. package/templates/app/docs/errors/CAGE-SYNC-001.md +3 -2
  337. package/templates/app/docs/errors/CAGE-TEST-001.md +1 -1
  338. package/templates/app/docs/errors/CAGE-TEST-002.md +50 -0
  339. package/templates/app/docs/errors/CAGE-TEST-003.md +52 -0
  340. package/templates/app/docs/errors/CAGE-UNSAFE-001.md +3 -2
  341. package/templates/app/docs/errors/CAGE-UPGRADE-001.md +2 -2
  342. package/templates/app/docs/errors/CAGE-WORKER-001.md +48 -0
  343. package/templates/app/docs/errors/CAGE-WORKER-002.md +50 -0
  344. package/templates/app/docs/errors/CAGE-WORKER-003.md +48 -0
  345. package/templates/app/docs/errors/README.md +50 -0
  346. package/templates/app/package.json +3 -3
  347. package/templates/app/packages/contracts/package.json +1 -1
  348. package/templates/app/packages/contracts/src/aggregates/dept/index.ts +10 -10
  349. package/templates/app/packages/contracts/src/aggregates/inventory/index.ts +5 -5
  350. package/templates/app/packages/contracts/src/aggregates/inventory-lock/index.ts +4 -4
  351. package/templates/app/packages/contracts/src/aggregates/purchase-order/index.ts +26 -12
  352. package/templates/app/packages/contracts/src/aggregates/role/index.ts +15 -15
  353. package/templates/app/packages/contracts/src/aggregates/user/index.ts +16 -16
  354. package/templates/app/packages/contracts/src/index.ts +7 -1
  355. package/templates/app/packages/contracts/src/queries/index.ts +2 -2
  356. package/templates/app/packages/domain/package.json +5 -4
  357. package/templates/app/packages/domain/src/index.ts +4 -0
  358. package/templates/app/packages/domain/src/integrations/erp.ts +15 -0
  359. package/templates/app/packages/domain/src/integrations/intelligence.ts +20 -0
  360. package/templates/app/packages/domain/src/modules/inventory/index.ts +1 -0
  361. package/templates/app/packages/domain/src/modules/inventory/inventory.ts +12 -0
  362. package/templates/app/packages/domain/src/modules/purchase/approvals.ts +22 -1
  363. package/templates/app/packages/domain/src/modules/purchase/index.ts +1 -0
  364. package/templates/app/packages/domain/src/modules/purchase/intelligence.test.ts +62 -0
  365. package/templates/app/packages/domain/src/modules/purchase/jobs.ts +5 -0
  366. package/templates/app/packages/domain/src/modules/purchase/purchase-order.test.ts +9 -0
  367. package/templates/app/packages/domain/src/modules/purchase/purchase-order.ts +70 -0
  368. package/templates/app/packages/domain/src/modules/purchase/queries.ts +5 -0
  369. package/templates/app/packages/domain/src/workflows/purchase-inventory.ts +6 -0
  370. package/templates/app/packages/domain/src/workflows/purchase-process.ts +42 -0
  371. package/templates/blank/.dockerignore +2 -0
  372. package/templates/blank/.env.example +10 -0
  373. package/templates/blank/AGENTS.md +49 -9
  374. package/templates/blank/README.md +4 -1
  375. package/templates/blank/_gitignore +1 -0
  376. package/templates/blank/apps/api/package.json +1 -1
  377. package/templates/blank/apps/api/src/main.ts +4 -1
  378. package/templates/blank/apps/api/src/worker.ts +2 -0
  379. package/templates/blank/apps/web/index.html +1 -0
  380. package/templates/blank/apps/web/package.json +7 -3
  381. package/templates/blank/apps/web/src/app/app.tsx +80 -18
  382. package/templates/blank/apps/web/src/app/styles/global.css +90 -0
  383. package/templates/blank/apps/web/src/app/use-session.ts +43 -0
  384. package/templates/blank/apps/web/src/app/workspace-layout.tsx +30 -5
  385. package/templates/blank/apps/web/src/main.tsx +5 -0
  386. package/templates/blank/apps/web/src/modules/auth/index.ts +4 -0
  387. package/templates/blank/apps/web/src/modules/auth/pages/login-page.tsx +18 -1
  388. package/templates/blank/apps/web/src/modules/directory/index.ts +7 -0
  389. package/templates/blank/apps/web/src/modules/directory/pages/user-detail-page.tsx +78 -0
  390. package/templates/blank/apps/web/src/modules/directory/pages/users-page.tsx +93 -0
  391. package/templates/blank/apps/web/src/modules/workspace/index.ts +4 -0
  392. package/templates/blank/apps/web/src/modules/workspace/pages/home-page.tsx +17 -0
  393. package/templates/blank/apps/web/src/shared/lib/error-message.ts +11 -0
  394. package/templates/blank/apps/web/src/shared/lib/navigation.ts +21 -0
  395. package/templates/blank/apps/web/src/shared/ui/brand.tsx +10 -2
  396. package/templates/blank/apps/web/src/shared/ui/page-state.css +47 -0
  397. package/templates/blank/apps/web/src/shared/ui/page-state.tsx +76 -0
  398. package/templates/blank/apps/web/src/shared/ui/require-capability.tsx +34 -0
  399. package/templates/blank/apps/web/vite.config.ts +5 -0
  400. package/templates/blank/deploy/nginx.conf +52 -0
  401. package/templates/blank/docs/ai/README.md +21 -0
  402. package/templates/blank/docs/ai/architecture.md +26 -0
  403. package/templates/blank/docs/ai/commenting.md +203 -0
  404. package/templates/blank/docs/ai/diagnostics.md +80 -0
  405. package/templates/blank/docs/ai/files.md +93 -0
  406. package/templates/blank/docs/ai/intelligence.md +348 -0
  407. package/templates/blank/docs/ai/ontology-context.md +59 -4
  408. package/templates/blank/docs/ai/primitives.md +33 -0
  409. package/templates/blank/docs/ai/project-structure.md +8 -3
  410. package/templates/blank/docs/ai/purchase-example.md +16 -2
  411. package/templates/blank/docs/ai/recipes.md +9 -1
  412. package/templates/blank/docs/ai/routing.md +86 -0
  413. package/templates/blank/docs/ai/troubleshooting.md +5 -0
  414. package/templates/blank/docs/ai/workflow.md +24 -11
  415. package/templates/blank/docs/errors/CAGE-AI-001.md +61 -0
  416. package/templates/blank/docs/errors/CAGE-APPR-001.md +7 -6
  417. package/templates/blank/docs/errors/CAGE-APPR-002.md +2 -2
  418. package/templates/blank/docs/errors/CAGE-APPR-003.md +1 -1
  419. package/templates/blank/docs/errors/CAGE-APPR-004.md +4 -4
  420. package/templates/blank/docs/errors/CAGE-APPR-005.md +1 -1
  421. package/templates/blank/docs/errors/CAGE-APPR-006.md +12 -6
  422. package/templates/blank/docs/errors/CAGE-APPR-007.md +3 -3
  423. package/templates/blank/docs/errors/CAGE-APPR-010.md +5 -5
  424. package/templates/blank/docs/errors/CAGE-AUDIT-001.md +53 -0
  425. package/templates/blank/docs/errors/CAGE-AUTH-001.md +1 -1
  426. package/templates/blank/docs/errors/CAGE-BIZ-001.md +51 -0
  427. package/templates/blank/docs/errors/CAGE-BIZ-002.md +49 -0
  428. package/templates/blank/docs/errors/CAGE-BUDGET-001.md +1 -1
  429. package/templates/blank/docs/errors/CAGE-BUDGET-002.md +1 -1
  430. package/templates/blank/docs/errors/CAGE-BUDGET-003.md +1 -1
  431. package/templates/blank/docs/errors/CAGE-CMD-002.md +1 -1
  432. package/templates/blank/docs/errors/CAGE-CMD-003.md +1 -1
  433. package/templates/blank/docs/errors/CAGE-CONN-001.md +3 -3
  434. package/templates/blank/docs/errors/CAGE-CONN-002.md +1 -1
  435. package/templates/blank/docs/errors/CAGE-CONN-003.md +1 -1
  436. package/templates/blank/docs/errors/CAGE-CONN-004.md +1 -1
  437. package/templates/blank/docs/errors/CAGE-CONN-005.md +1 -1
  438. package/templates/blank/docs/errors/CAGE-CONN-006.md +1 -1
  439. package/templates/blank/docs/errors/CAGE-CONN-007.md +6 -6
  440. package/templates/blank/docs/errors/CAGE-CONN-008.md +5 -5
  441. package/templates/blank/docs/errors/CAGE-CONN-009.md +6 -6
  442. package/templates/blank/docs/errors/CAGE-CONN-010.md +6 -6
  443. package/templates/blank/docs/errors/CAGE-CONN-011.md +1 -1
  444. package/templates/blank/docs/errors/CAGE-CONN-012.md +1 -1
  445. package/templates/blank/docs/errors/CAGE-CONN-013.md +49 -0
  446. package/templates/blank/docs/errors/CAGE-CONN-014.md +48 -0
  447. package/templates/blank/docs/errors/CAGE-CONN-015.md +49 -0
  448. package/templates/blank/docs/errors/CAGE-CREATE-001.md +10 -9
  449. package/templates/blank/docs/errors/CAGE-DECL-001.md +2 -2
  450. package/templates/blank/docs/errors/CAGE-DECL-002.md +7 -6
  451. package/templates/blank/docs/errors/CAGE-DECL-003.md +1 -1
  452. package/templates/blank/docs/errors/CAGE-DECL-004.md +1 -1
  453. package/templates/blank/docs/errors/CAGE-DEP-001.md +2 -2
  454. package/templates/blank/docs/errors/CAGE-DEP-002.md +1 -1
  455. package/templates/blank/docs/errors/CAGE-DEP-003.md +2 -2
  456. package/templates/blank/docs/errors/CAGE-DEP-004.md +1 -1
  457. package/templates/blank/docs/errors/CAGE-DEP-005.md +1 -1
  458. package/templates/blank/docs/errors/CAGE-DIAG-001.md +53 -0
  459. package/templates/blank/docs/errors/CAGE-DLQ-001.md +2 -2
  460. package/templates/blank/docs/errors/CAGE-ENV-001.md +4 -4
  461. package/templates/blank/docs/errors/CAGE-ENV-002.md +51 -0
  462. package/templates/blank/docs/errors/CAGE-ENV-003.md +48 -0
  463. package/templates/blank/docs/errors/CAGE-EVENT-001.md +1 -1
  464. package/templates/blank/docs/errors/CAGE-EVENT-002.md +7 -7
  465. package/templates/blank/docs/errors/CAGE-FIELD-001.md +2 -2
  466. package/templates/blank/docs/errors/CAGE-FIELD-002.md +1 -1
  467. package/templates/blank/docs/errors/CAGE-FIELD-003.md +1 -1
  468. package/templates/blank/docs/errors/CAGE-FIELD-004.md +1 -1
  469. package/templates/blank/docs/errors/CAGE-FILE-001.md +56 -0
  470. package/templates/blank/docs/errors/CAGE-GEN-001.md +2 -2
  471. package/templates/blank/docs/errors/CAGE-GEN-002.md +1 -1
  472. package/templates/blank/docs/errors/CAGE-GEN-003.md +53 -0
  473. package/templates/blank/docs/errors/CAGE-GRANT-001.md +3 -3
  474. package/templates/blank/docs/errors/CAGE-GRANT-002.md +2 -2
  475. package/templates/blank/docs/errors/CAGE-GRANT-003.md +7 -6
  476. package/templates/blank/docs/errors/CAGE-IMPACT-001.md +2 -2
  477. package/templates/blank/docs/errors/CAGE-IMPACT-002.md +52 -0
  478. package/templates/blank/docs/errors/CAGE-INIT-001.md +1 -1
  479. package/templates/blank/docs/errors/CAGE-INIT-002.md +1 -1
  480. package/templates/blank/docs/errors/CAGE-INIT-003.md +2 -2
  481. package/templates/blank/docs/errors/CAGE-INIT-004.md +1 -1
  482. package/templates/blank/docs/errors/CAGE-INIT-005.md +52 -0
  483. package/templates/blank/docs/errors/CAGE-JOB-001.md +1 -1
  484. package/templates/blank/docs/errors/CAGE-JOB-002.md +1 -1
  485. package/templates/blank/docs/errors/CAGE-JOB-003.md +1 -1
  486. package/templates/blank/docs/errors/CAGE-LINT-001.md +1 -1
  487. package/templates/blank/docs/errors/CAGE-MIG-001.md +1 -1
  488. package/templates/blank/docs/errors/CAGE-MIG-002.md +1 -1
  489. package/templates/blank/docs/errors/CAGE-MIG-005.md +1 -1
  490. package/templates/blank/docs/errors/CAGE-NAME-001.md +1 -1
  491. package/templates/blank/docs/errors/CAGE-NAME-002.md +1 -1
  492. package/templates/blank/docs/errors/CAGE-NAME-003.md +3 -3
  493. package/templates/blank/docs/errors/CAGE-NAME-004.md +1 -1
  494. package/templates/blank/docs/errors/CAGE-NAME-005.md +1 -1
  495. package/templates/blank/docs/errors/CAGE-NAME-006.md +1 -1
  496. package/templates/blank/docs/errors/CAGE-ORG-001.md +7 -6
  497. package/templates/blank/docs/errors/CAGE-PAIR-002.md +6 -5
  498. package/templates/blank/docs/errors/CAGE-QUERY-001.md +1 -1
  499. package/templates/blank/docs/errors/CAGE-QUERY-002.md +2 -2
  500. package/templates/blank/docs/errors/CAGE-QUERY-003.md +7 -6
  501. package/templates/blank/docs/errors/CAGE-REACT-001.md +3 -3
  502. package/templates/blank/docs/errors/CAGE-REACT-002.md +1 -1
  503. package/templates/blank/docs/errors/CAGE-REACT-003.md +50 -0
  504. package/templates/blank/docs/errors/CAGE-READS-001.md +9 -6
  505. package/templates/blank/docs/errors/CAGE-REG-001.md +13 -12
  506. package/templates/blank/docs/errors/CAGE-REG-002.md +2 -1
  507. package/templates/blank/docs/errors/CAGE-REG-003.md +1 -1
  508. package/templates/blank/docs/errors/CAGE-REL-001.md +14 -14
  509. package/templates/blank/docs/errors/CAGE-ROUTE-001.md +7 -6
  510. package/templates/blank/docs/errors/CAGE-SCOPE-001.md +1 -1
  511. package/templates/blank/docs/errors/CAGE-SCOPE-002.md +2 -2
  512. package/templates/blank/docs/errors/CAGE-SECRET-001.md +2 -2
  513. package/templates/blank/docs/errors/CAGE-SECRET-002.md +1 -1
  514. package/templates/blank/docs/errors/CAGE-SENS-001.md +5 -5
  515. package/templates/blank/docs/errors/CAGE-SQL-001.md +1 -1
  516. package/templates/blank/docs/errors/CAGE-SQL-002.md +1 -1
  517. package/templates/blank/docs/errors/CAGE-STATE-001.md +3 -3
  518. package/templates/blank/docs/errors/CAGE-STATE-002.md +1 -1
  519. package/templates/blank/docs/errors/CAGE-STATE-003.md +1 -1
  520. package/templates/blank/docs/errors/CAGE-STATE-004.md +1 -1
  521. package/templates/blank/docs/errors/CAGE-STATE-005.md +3 -2
  522. package/templates/blank/docs/errors/CAGE-STATE-010.md +5 -5
  523. package/templates/blank/docs/errors/CAGE-STATE-011.md +5 -5
  524. package/templates/blank/docs/errors/CAGE-STRUCT-001.md +1 -1
  525. package/templates/blank/docs/errors/CAGE-STRUCT-002.md +1 -1
  526. package/templates/blank/docs/errors/CAGE-SYNC-001.md +3 -2
  527. package/templates/blank/docs/errors/CAGE-TEST-001.md +1 -1
  528. package/templates/blank/docs/errors/CAGE-TEST-002.md +50 -0
  529. package/templates/blank/docs/errors/CAGE-TEST-003.md +52 -0
  530. package/templates/blank/docs/errors/CAGE-UNSAFE-001.md +3 -2
  531. package/templates/blank/docs/errors/CAGE-UPGRADE-001.md +2 -2
  532. package/templates/blank/docs/errors/CAGE-WORKER-001.md +48 -0
  533. package/templates/blank/docs/errors/CAGE-WORKER-002.md +50 -0
  534. package/templates/blank/docs/errors/CAGE-WORKER-003.md +48 -0
  535. package/templates/blank/docs/errors/README.md +50 -0
  536. package/templates/blank/docs/examples/purchase-admin/apps/api/src/main.ts +5 -1
  537. package/templates/blank/docs/examples/purchase-admin/apps/api/src/worker.ts +3 -0
  538. package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/app.tsx +122 -12
  539. package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/styles/global.css +88 -8
  540. package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/use-session.ts +43 -0
  541. package/templates/blank/docs/examples/purchase-admin/apps/web/src/app/workspace-layout.tsx +58 -19
  542. package/templates/blank/docs/examples/purchase-admin/apps/web/src/main.tsx +5 -0
  543. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/hooks/use-approval-tasks.ts +11 -0
  544. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/index.ts +4 -0
  545. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/approval/pages/approval-tasks-page.tsx +20 -1
  546. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/auth/index.ts +4 -0
  547. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/auth/pages/login-page.tsx +12 -0
  548. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/inventory/index.ts +4 -0
  549. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/inventory/pages/inventory-page.tsx +29 -1
  550. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/approval-history.tsx +32 -0
  551. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/order-attachments.tsx +29 -0
  552. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/purchase-assistant-context.tsx +17 -0
  553. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/purchase-order-form.css +6 -0
  554. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/components/purchase-order-form.tsx +25 -3
  555. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/index.ts +5 -0
  556. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/lib/presentation.ts +20 -0
  557. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/pages/purchase-intelligence.css +15 -0
  558. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/pages/purchase-order-detail-page.tsx +154 -0
  559. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/purchase/pages/purchase-orders-page.tsx +52 -22
  560. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/workspace/index.ts +5 -0
  561. package/templates/blank/docs/examples/purchase-admin/apps/web/src/modules/workspace/pages/home-page.tsx +44 -0
  562. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/hooks/use-command.ts +13 -0
  563. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/lib/error-message.ts +9 -0
  564. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/lib/navigation.ts +21 -0
  565. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/assistant-markdown.tsx +19 -0
  566. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/assistant-panel.css +134 -0
  567. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/assistant-panel.tsx +200 -0
  568. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/assistant-scope.tsx +72 -0
  569. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/attachment-upload.css +28 -0
  570. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/attachment-upload.tsx +163 -0
  571. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/notice.tsx +7 -0
  572. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/page-heading.tsx +7 -0
  573. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/page-state.css +47 -0
  574. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/page-state.tsx +76 -0
  575. package/templates/blank/docs/examples/purchase-admin/apps/web/src/shared/ui/require-capability.tsx +34 -0
  576. package/templates/blank/docs/examples/purchase-admin/cage.config.json +9 -0
  577. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/dept/index.ts +10 -10
  578. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/inventory/index.ts +5 -5
  579. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/inventory-lock/index.ts +4 -4
  580. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/purchase-order/index.ts +26 -12
  581. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/role/index.ts +15 -15
  582. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/aggregates/user/index.ts +16 -16
  583. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/index.ts +7 -1
  584. package/templates/blank/docs/examples/purchase-admin/packages/contracts/src/queries/index.ts +2 -2
  585. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/index.ts +4 -0
  586. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/integrations/erp.ts +15 -0
  587. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/integrations/intelligence.ts +20 -0
  588. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/inventory/index.ts +1 -0
  589. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/inventory/inventory.ts +12 -0
  590. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/approvals.ts +22 -1
  591. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/index.ts +1 -0
  592. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/intelligence.test.ts +62 -0
  593. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/jobs.ts +5 -0
  594. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/purchase-order.test.ts +9 -0
  595. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/purchase-order.ts +70 -0
  596. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/modules/purchase/queries.ts +5 -0
  597. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/workflows/purchase-inventory.ts +6 -0
  598. package/templates/blank/docs/examples/purchase-admin/packages/domain/src/workflows/purchase-process.ts +42 -0
  599. package/templates/blank/package.json +3 -3
  600. package/templates/blank/packages/contracts/package.json +1 -1
  601. package/templates/blank/packages/contracts/src/aggregates/dept/index.ts +10 -10
  602. package/templates/blank/packages/contracts/src/aggregates/role/index.ts +15 -15
  603. package/templates/blank/packages/contracts/src/aggregates/user/index.ts +16 -16
  604. package/templates/blank/packages/contracts/src/index.ts +1 -1
  605. package/templates/blank/packages/contracts/src/queries/index.ts +1 -1
  606. package/templates/blank/packages/domain/package.json +5 -4
  607. package/templates/blank/packages/domain/src/index.ts +2 -1
@@ -0,0 +1,985 @@
1
+ /* 业务板块逐层进入流程图;节点、分支与箭头表达执行关系,代码按需展开。 */
2
+ /* 业务地图专属样式,由 index.html 在基础 style.css 之后加载。
3
+ * 配合 business.ts 与 flowchart.ts 的 DOM/SVG 状态,区分板块入口、流程画布、审批子图与证据详情;不决定业务执行。 */
4
+ .business-journeys {
5
+ margin: 22px 0 30px;
6
+ }
7
+ .business-journeys .business-flow-entry {
8
+ border-left: 3px solid #397a56;
9
+ padding: 25px;
10
+ }
11
+ .business-operations {
12
+ margin-top: 28px;
13
+ border-top: 1px solid #e1e8db;
14
+ padding-top: 18px;
15
+ }
16
+ .business-operations > summary {
17
+ color: #567260;
18
+ font-size: 13px;
19
+ cursor: pointer;
20
+ }
21
+ .business-process-controls {
22
+ display: flex;
23
+ flex-wrap: wrap;
24
+ align-items: center;
25
+ gap: 12px 22px;
26
+ margin: 0 0 12px;
27
+ color: #4b6856;
28
+ font-size: 13px;
29
+ }
30
+ .business-process-controls > p {
31
+ flex-basis: 100%;
32
+ margin: 0 0 3px;
33
+ line-height: 1.8;
34
+ }
35
+ .business-process-controls label {
36
+ display: flex;
37
+ align-items: center;
38
+ gap: 8px;
39
+ min-height: 32px;
40
+ cursor: pointer;
41
+ }
42
+ .business-process-controls input {
43
+ accent-color: #397a56;
44
+ width: 16px;
45
+ height: 16px;
46
+ }
47
+ .business-process-legend {
48
+ font-size: 12px;
49
+ color: #627c69;
50
+ line-height: 1.8;
51
+ margin: 0 0 18px;
52
+ }
53
+ .flow-node.association .flow-node-shape {
54
+ fill: #f4f7ef;
55
+ stroke-dasharray: 5 4;
56
+ }
57
+ .flow-edge.association .flow-edge-line {
58
+ stroke: #8b9975;
59
+ stroke-dasharray: 5 4;
60
+ }
61
+ /* 业务模式隐藏完整本体画布的旧工具区,保留同页共用的视图切换和检索入口。 */
62
+ .explorer.business-mode {
63
+ display: block;
64
+ height: auto;
65
+ min-height: 520px;
66
+ max-height: none;
67
+ overflow: clip;
68
+ }
69
+ .business-page .overview {
70
+ display: none;
71
+ }
72
+ .business-page .page-heading .eyebrow,
73
+ .business-page .page-heading p {
74
+ display: none;
75
+ }
76
+ .business-page .page-heading {
77
+ margin-bottom: 22px;
78
+ }
79
+ .business-health {
80
+ display: none;
81
+ }
82
+ .business-page .business-health {
83
+ display: flex;
84
+ align-items: center;
85
+ flex-wrap: wrap;
86
+ justify-content: space-between;
87
+ gap: 10px;
88
+ margin-top: 15px;
89
+ font-size: 10px;
90
+ color: #819378;
91
+ }
92
+ .business-mode .graph-subbar,
93
+ .business-mode .relation-guide,
94
+ .business-mode .canvas,
95
+ .business-mode .graph-footer,
96
+ .business-mode > .inspector {
97
+ display: none;
98
+ }
99
+ .business-mode .graph-toolbar {
100
+ background: #fcfdfa;
101
+ }
102
+ .business-mode .graph-panel {
103
+ height: auto;
104
+ }
105
+ .business-view {
106
+ padding: 26px 30px 36px;
107
+ }
108
+ .business-breadcrumb {
109
+ display: flex;
110
+ flex-wrap: wrap;
111
+ align-items: center;
112
+ gap: 10px;
113
+ color: #7b8e81;
114
+ font-size: 12px;
115
+ margin-bottom: 22px;
116
+ }
117
+ .business-breadcrumb a:hover {
118
+ color: var(--green);
119
+ text-decoration: underline;
120
+ text-underline-offset: 4px;
121
+ }
122
+ .business-breadcrumb strong {
123
+ color: #30483d;
124
+ font-weight: 500;
125
+ }
126
+ .business-intro,
127
+ .business-scene-heading {
128
+ display: flex;
129
+ align-items: center;
130
+ justify-content: space-between;
131
+ gap: 24px;
132
+ margin-bottom: 26px;
133
+ }
134
+ .business-kicker {
135
+ display: block;
136
+ font-size: 10px;
137
+ letter-spacing: 2px;
138
+ color: #7e927e;
139
+ margin-bottom: 11px;
140
+ }
141
+ .business-intro h2,
142
+ .business-scene-heading h2 {
143
+ margin: 0;
144
+ font-size: clamp(21px, 2vw, 29px);
145
+ line-height: 1.6;
146
+ letter-spacing: -0.5px;
147
+ font-weight: 600;
148
+ color: #244638;
149
+ overflow-wrap: anywhere;
150
+ }
151
+ .business-intro p {
152
+ font-size: 13px;
153
+ color: #758477;
154
+ line-height: 1.9;
155
+ margin: 12px 0 0;
156
+ }
157
+ .business-total {
158
+ flex-shrink: 0;
159
+ border: 1px solid #dce7d9;
160
+ color: #4d7757;
161
+ background: #f0f5ec;
162
+ border-radius: 30px;
163
+ padding: 7px 13px;
164
+ font-size: 12px;
165
+ }
166
+ /* 板块卡片和对象标签构成从业务主题进入流程的导航;实际跳转使用脚本生成的锚点 URL。 */
167
+ .business-blocks {
168
+ display: grid;
169
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 290px), 1fr));
170
+ gap: 18px;
171
+ }
172
+ .business-block {
173
+ display: flex;
174
+ flex-direction: column;
175
+ border: 1px solid #dce5d8;
176
+ border-radius: 9px;
177
+ padding: 25px 23px 0;
178
+ background: linear-gradient(135deg, #f6f9f2 0%, #fff 70%);
179
+ transition:
180
+ border-color 0.15s,
181
+ box-shadow 0.15s,
182
+ transform 0.15s;
183
+ min-height: 253px;
184
+ }
185
+ .business-block:hover {
186
+ border-color: #71a18a;
187
+ box-shadow: 0 8px 24px #28462f0e;
188
+ transform: translateY(-2px);
189
+ }
190
+ .business-block-top {
191
+ display: flex;
192
+ align-items: center;
193
+ justify-content: space-between;
194
+ }
195
+ .business-number {
196
+ font:
197
+ 23px 'Bahnschrift',
198
+ sans-serif;
199
+ font-weight: 300;
200
+ color: #97b293;
201
+ }
202
+ .business-block-kind {
203
+ font-size: 10px;
204
+ color: #83967b;
205
+ letter-spacing: 1.5px;
206
+ }
207
+ .business-block h3 {
208
+ font-size: 20px;
209
+ line-height: 1.6;
210
+ margin: 19px 0 12px;
211
+ font-weight: 600;
212
+ overflow-wrap: anywhere;
213
+ }
214
+ .business-object-chips {
215
+ display: flex;
216
+ flex-wrap: wrap;
217
+ gap: 7px;
218
+ }
219
+ .business-object-chips > span,
220
+ .object-chip-button {
221
+ border: 1px solid #e5ebdf;
222
+ background: #f6f8f2;
223
+ border-radius: 4px;
224
+ padding: 4px 8px;
225
+ font-size: 11px;
226
+ line-height: 1.5;
227
+ color: #637660;
228
+ }
229
+ .object-chip-button:hover {
230
+ border-color: #729b7a;
231
+ }
232
+ .business-block-description {
233
+ font-size: 12px;
234
+ color: #879380;
235
+ line-height: 1.9;
236
+ margin: 16px 0 20px;
237
+ flex: 1;
238
+ }
239
+ .business-block-footer {
240
+ border-top: 1px solid #e6ecdf;
241
+ padding: 16px 0;
242
+ display: flex;
243
+ flex-wrap: wrap;
244
+ justify-content: space-between;
245
+ gap: 10px;
246
+ font-size: 11px;
247
+ color: #829179;
248
+ }
249
+ .business-block-footer strong {
250
+ color: #3c7055;
251
+ font-weight: 500;
252
+ }
253
+ .business-reading-note {
254
+ border-top: 1px solid #e8ece2;
255
+ margin-top: 35px;
256
+ padding-top: 22px;
257
+ font-size: 12px;
258
+ color: #8c9985;
259
+ line-height: 1.9;
260
+ }
261
+ .business-reading-note strong {
262
+ color: #5e7c60;
263
+ font-weight: 500;
264
+ }
265
+ .business-reading-note p {
266
+ margin: 5px 0 0;
267
+ }
268
+ .business-scene-heading .button {
269
+ flex-shrink: 0;
270
+ }
271
+ .business-scene-description,
272
+ .business-flow-intro {
273
+ font-size: 12px;
274
+ color: #7e8c7a;
275
+ line-height: 1.9;
276
+ margin: 20px 0;
277
+ }
278
+ .business-section-title {
279
+ margin: 30px 0 14px;
280
+ font-size: 12px;
281
+ font-weight: 500;
282
+ color: #72906c;
283
+ letter-spacing: 1px;
284
+ }
285
+ .business-flow-grid {
286
+ display: grid;
287
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr));
288
+ gap: 13px;
289
+ }
290
+ .business-flow-entry {
291
+ display: flex;
292
+ flex-direction: column;
293
+ border: 1px solid #e1e8db;
294
+ border-radius: 7px;
295
+ padding: 20px;
296
+ background: #fff;
297
+ transition:
298
+ border-color 0.15s,
299
+ background 0.15s;
300
+ }
301
+ .business-flow-entry:hover {
302
+ border-color: #709d80;
303
+ background: #fafcf7;
304
+ }
305
+ .business-flow-entry > small {
306
+ font-size: 10px;
307
+ color: #8b9e83;
308
+ }
309
+ .business-flow-entry h4 {
310
+ font-size: 15px;
311
+ line-height: 1.7;
312
+ margin: 10px 0 6px;
313
+ overflow-wrap: anywhere;
314
+ }
315
+ .business-flow-entry p {
316
+ font-size: 11px;
317
+ line-height: 1.9;
318
+ color: #82917a;
319
+ margin: 0 0 16px;
320
+ flex: 1;
321
+ }
322
+ .business-flow-count {
323
+ font-size: 10px;
324
+ color: #4c7c58;
325
+ }
326
+ /* 流程画布与详情栏的工作区;inspecting 控制详情空间,画布尺寸变化由 ResizeObserver 通知相机。 */
327
+ .business-workspace {
328
+ display: grid;
329
+ grid-template-columns: minmax(0, 1fr);
330
+ gap: 20px;
331
+ align-items: start;
332
+ }
333
+ .business-workspace.inspecting {
334
+ grid-template-columns: minmax(0, 1fr) 350px;
335
+ }
336
+ .business-flowchart {
337
+ min-width: 0;
338
+ border: 1px solid #dce6d7;
339
+ border-radius: 8px;
340
+ overflow: hidden;
341
+ }
342
+ .flowchart-toolbar {
343
+ display: flex;
344
+ flex-wrap: wrap;
345
+ gap: 10px;
346
+ align-items: center;
347
+ justify-content: space-between;
348
+ padding: 12px 15px;
349
+ background: #fbfcf8;
350
+ border-bottom: 1px solid #e4eadf;
351
+ }
352
+ .flowchart-toolbar > strong {
353
+ font-size: 12px;
354
+ font-weight: 500;
355
+ color: #668262;
356
+ }
357
+ .flowchart-controls {
358
+ display: flex;
359
+ flex-wrap: wrap;
360
+ gap: 4px;
361
+ align-items: center;
362
+ }
363
+ .flowchart-controls button,
364
+ .flowchart-zoom button {
365
+ background: transparent;
366
+ border: 1px solid transparent;
367
+ border-radius: 4px;
368
+ color: #82957a;
369
+ min-width: 34px;
370
+ height: 32px;
371
+ padding: 4px 10px;
372
+ font-size: 12px;
373
+ }
374
+ .flowchart-controls button:hover,
375
+ .flowchart-controls button[aria-pressed='true'],
376
+ .flowchart-zoom button:hover {
377
+ background: #edf3e7;
378
+ border-color: #d7e3cf;
379
+ color: #416e47;
380
+ }
381
+ .flowchart-zoom {
382
+ position: absolute;
383
+ bottom: 16px;
384
+ left: 16px;
385
+ z-index: 2;
386
+ display: flex;
387
+ flex-wrap: wrap;
388
+ max-width: calc(100% - 32px);
389
+ align-items: center;
390
+ gap: 2px;
391
+ background: #fff;
392
+ border: 1px solid #d6e1d2;
393
+ border-radius: 7px;
394
+ box-shadow: 0 3px 16px #294b2414;
395
+ padding: 5px;
396
+ }
397
+ .flowchart-zoom .flowchart-percentage {
398
+ min-width: 58px;
399
+ color: #3d6951;
400
+ font-variant-numeric: tabular-nums;
401
+ }
402
+ .flowchart-zoom button:disabled {
403
+ opacity: 0.35;
404
+ cursor: default;
405
+ }
406
+ /* 画布禁止浏览器默认触控滚动,由手势状态机接管;SVG 内坐标仍由相机 transform 控制。 */
407
+ .flowchart-canvas {
408
+ position: relative;
409
+ width: 100%;
410
+ height: 640px;
411
+ overflow: hidden;
412
+ overscroll-behavior: contain;
413
+ background:
414
+ radial-gradient(#dfe7d8 0.7px, transparent 0.8px) 0 0 / 20px 20px,
415
+ #fcfdf9;
416
+ }
417
+ .flowchart-canvas > svg {
418
+ display: block;
419
+ width: 100%;
420
+ height: 100%;
421
+ cursor: grab;
422
+ touch-action: none;
423
+ user-select: none;
424
+ -webkit-user-select: none;
425
+ outline: none;
426
+ }
427
+ .flowchart-canvas > svg:focus-visible {
428
+ box-shadow: inset 0 0 0 2px #87a786;
429
+ }
430
+ .flowchart-canvas.mode-pan .flow-node,
431
+ .flowchart-canvas.mode-pan .flow-edge {
432
+ cursor: grab;
433
+ }
434
+ .flowchart-canvas > svg.interacting,
435
+ .flowchart-canvas > svg.interacting * {
436
+ cursor: grabbing !important;
437
+ }
438
+ /* 展开模式将当前工作区覆盖视窗,保留画布和详情;退出时复用同一阅读状态,不创建第二幅图。 */
439
+ .flow-workspace.expanded {
440
+ position: fixed;
441
+ inset: 12px;
442
+ z-index: 100;
443
+ padding: 12px;
444
+ background: #f8faf5;
445
+ border: 1px solid #cfdcc7;
446
+ border-radius: 12px;
447
+ box-shadow: 0 0 0 20px #243d2866;
448
+ align-items: stretch;
449
+ gap: 14px;
450
+ }
451
+ .flow-workspace.expanded .business-flowchart {
452
+ display: flex;
453
+ flex-direction: column;
454
+ height: 100%;
455
+ min-height: 0;
456
+ }
457
+ .flow-workspace.expanded .flowchart-canvas {
458
+ height: auto;
459
+ flex: 1;
460
+ min-height: 0;
461
+ }
462
+ .flow-workspace.expanded .business-detail {
463
+ height: 100%;
464
+ max-height: 100%;
465
+ }
466
+ .flowchart-footer {
467
+ display: flex;
468
+ flex-wrap: wrap;
469
+ justify-content: space-between;
470
+ gap: 8px;
471
+ border-top: 1px solid #e4eadf;
472
+ background: #fbfcf8;
473
+ padding: 11px 13px;
474
+ font-size: 9px;
475
+ color: #8b9a81;
476
+ line-height: 1.8;
477
+ }
478
+ .flow-node {
479
+ cursor: grab;
480
+ }
481
+ .flow-node-shape {
482
+ fill: #fff;
483
+ stroke: #c4d6bc;
484
+ stroke-width: 1.3;
485
+ filter: drop-shadow(0 3px 4px #294a2810);
486
+ }
487
+ .flow-node.decision .flow-node-shape {
488
+ fill: #f9f7ee;
489
+ stroke: #c4b88a;
490
+ }
491
+ .flow-node.approval-subflow .flow-node-shape {
492
+ fill: #fafaf3;
493
+ stroke: #b5bf9e;
494
+ }
495
+ /* 审批容器内部的条件、任务和跳过支路样式;布局尺寸和换行已由 approval-flow.ts 计算。 */
496
+ .approval-flow-content {
497
+ pointer-events: none;
498
+ }
499
+ .approval-flow-title {
500
+ fill: #35573b;
501
+ font-size: 17px;
502
+ font-weight: 600;
503
+ }
504
+ .approval-flow-subtitle,
505
+ .approval-flow-hint {
506
+ fill: #6c7f60;
507
+ font-size: 11px;
508
+ }
509
+ .approval-flow-line {
510
+ fill: none;
511
+ stroke: #8ba28e;
512
+ stroke-width: 1.3;
513
+ stroke-linejoin: round;
514
+ }
515
+ .approval-flow-line.skip {
516
+ stroke: #a5ae92;
517
+ }
518
+ .approval-flow-label-box {
519
+ fill: #fafaf3;
520
+ }
521
+ .approval-flow-branch {
522
+ fill: #61774f;
523
+ font-size: 12px;
524
+ }
525
+ .approval-task-shape {
526
+ fill: #fffef8;
527
+ stroke: #bac9ad;
528
+ }
529
+ .approval-task-title {
530
+ fill: #35573b;
531
+ font-size: 16px;
532
+ font-weight: 600;
533
+ }
534
+ .approval-task-actor,
535
+ .approval-task-rule {
536
+ fill: #5b7151;
537
+ font-size: 12px;
538
+ }
539
+ .approval-task-number-shape {
540
+ fill: #e8eddb;
541
+ }
542
+ .approval-task-number {
543
+ fill: #61794c;
544
+ font-size: 10px;
545
+ font-weight: 600;
546
+ }
547
+ .approval-condition-shape {
548
+ fill: #f7f2de;
549
+ stroke: #bfb27e;
550
+ }
551
+ .approval-condition-title {
552
+ fill: #6c6031;
553
+ font-size: 12px;
554
+ font-weight: 500;
555
+ }
556
+ .approval-flow-merge {
557
+ fill: #8ba28e;
558
+ }
559
+ .approval-flow-outcome {
560
+ fill: #3c6f48;
561
+ font-size: 12px;
562
+ font-weight: 500;
563
+ }
564
+ .approval-flow-rejection {
565
+ fill: #926451;
566
+ font-size: 11px;
567
+ }
568
+ .flow-node:hover .flow-node-shape,
569
+ .flow-node:focus-visible .flow-node-shape {
570
+ stroke: #668c60;
571
+ stroke-width: 2;
572
+ }
573
+ .flow-node.selected .flow-node-shape {
574
+ fill: #edf5e7;
575
+ stroke: #3e7e50;
576
+ stroke-width: 2;
577
+ }
578
+ .flow-node.path-source .flow-node-shape,
579
+ .flow-node.path-target .flow-node-shape {
580
+ stroke: #397a56;
581
+ stroke-width: 2.5;
582
+ }
583
+ .flow-node.path-target .flow-node-shape {
584
+ fill: #edf5e7;
585
+ }
586
+ .flow-node-title {
587
+ fill: #305539;
588
+ font-size: 16px;
589
+ font-weight: 600;
590
+ pointer-events: none;
591
+ }
592
+ .flow-node-state {
593
+ fill: #819574;
594
+ font-size: 11px;
595
+ pointer-events: none;
596
+ }
597
+ .flow-node-boundary {
598
+ fill: #84966e;
599
+ font-size: 10px;
600
+ pointer-events: none;
601
+ }
602
+ /* 主线、次要分支、关联及异步边分别呈现;透明粗命中线便于选择,不扩大实际可见线条。 */
603
+ .flow-edge {
604
+ cursor: pointer;
605
+ }
606
+ .flow-edge-line {
607
+ fill: none;
608
+ stroke: #537f60;
609
+ stroke-width: 2;
610
+ stroke-linejoin: round;
611
+ }
612
+ .flow-edge-direction {
613
+ fill: #537f60;
614
+ pointer-events: none;
615
+ }
616
+ .flow-edge.branch .flow-edge-line {
617
+ stroke: #a57950;
618
+ stroke-width: 1.7;
619
+ }
620
+ .flow-edge.branch .flow-edge-direction {
621
+ fill: #a57950;
622
+ }
623
+ .flow-edge.branch .flow-edge-label {
624
+ fill: #8c6545;
625
+ }
626
+ .flow-edge.association .flow-edge-line {
627
+ stroke: #8ba28e;
628
+ stroke-width: 1.3;
629
+ }
630
+ .flow-edge.async .flow-edge-line {
631
+ stroke-dasharray: 5 4;
632
+ }
633
+ .flow-edge-hit {
634
+ fill: none;
635
+ stroke: transparent;
636
+ stroke-width: 15;
637
+ }
638
+ .flow-edge-label-box {
639
+ fill: #fcfdf9;
640
+ }
641
+ .flow-edge-label {
642
+ fill: #527253;
643
+ font-size: 11px;
644
+ }
645
+ .flow-edge:hover .flow-edge-line,
646
+ .flow-edge.selected .flow-edge-line {
647
+ stroke: #397a56;
648
+ stroke-width: 2;
649
+ }
650
+ .flow-edge.selected .flow-edge-label {
651
+ fill: #3e7250;
652
+ }
653
+ .flow-edge:hover .flow-edge-direction,
654
+ .flow-edge.selected .flow-edge-direction {
655
+ fill: #397a56;
656
+ }
657
+ .business-detail-close {
658
+ position: absolute;
659
+ right: 13px;
660
+ top: 12px;
661
+ background: none;
662
+ color: #7f9174;
663
+ font-size: 22px;
664
+ padding: 0 5px;
665
+ }
666
+ /* 步骤详情承担说明、来源和技术入口,选中态跟随 URL;源码仅在展开时由脚本请求。 */
667
+ .business-detail {
668
+ min-width: 0;
669
+ border: 1px solid #dce6d7;
670
+ background: #fbfcf8;
671
+ border-radius: 8px;
672
+ padding: 24px;
673
+ position: relative;
674
+ max-height: 728px;
675
+ overflow: auto;
676
+ }
677
+ .business-detail > h3 {
678
+ font-size: 19px;
679
+ line-height: 1.7;
680
+ margin: 0 0 20px;
681
+ font-weight: 600;
682
+ overflow-wrap: anywhere;
683
+ }
684
+ .business-detail-tabs {
685
+ display: flex;
686
+ gap: 25px;
687
+ border-bottom: 1px solid #dfe7d8;
688
+ margin-bottom: 22px;
689
+ }
690
+ .business-detail-tabs button {
691
+ padding: 0 0 11px;
692
+ background: none;
693
+ font-size: 12px;
694
+ color: #8a987f;
695
+ border-bottom: 2px solid transparent;
696
+ }
697
+ .business-detail-tabs button.active {
698
+ color: #346c4e;
699
+ border-color: #346c4e;
700
+ }
701
+ .business-detail-section {
702
+ margin: 0 0 23px;
703
+ }
704
+ .business-detail-section h4 {
705
+ font-size: 11px;
706
+ font-weight: 500;
707
+ color: #6a8765;
708
+ margin: 0 0 9px;
709
+ }
710
+ .business-detail-section p {
711
+ font-size: 12px;
712
+ line-height: 1.95;
713
+ margin: 6px 0;
714
+ color: #4c6349;
715
+ overflow-wrap: anywhere;
716
+ }
717
+ .business-detail .source-note {
718
+ color: #8b9981;
719
+ font-size: 10px;
720
+ }
721
+ .business-evidence {
722
+ display: block;
723
+ text-align: left;
724
+ width: 100%;
725
+ border-bottom: 1px solid #e5ebdf;
726
+ background: none;
727
+ padding: 10px 0;
728
+ font-size: 11px;
729
+ line-height: 1.7;
730
+ color: #557a52;
731
+ }
732
+ .business-technical-link {
733
+ display: block;
734
+ background: none;
735
+ color: #8a9981;
736
+ font-size: 10px;
737
+ padding: 20px 0 0;
738
+ }
739
+ .business-source-picker {
740
+ display: flex;
741
+ flex-wrap: wrap;
742
+ gap: 6px;
743
+ margin-bottom: 16px;
744
+ }
745
+ .business-source-picker button {
746
+ background: #f0f4eb;
747
+ color: #7a8d70;
748
+ border: 1px solid #e1e8d9;
749
+ border-radius: 4px;
750
+ padding: 6px 9px;
751
+ font-size: 10px;
752
+ text-align: left;
753
+ line-height: 1.7;
754
+ }
755
+ .business-source-picker button.active {
756
+ color: #37694a;
757
+ border-color: #83a481;
758
+ background: #eaf2e3;
759
+ }
760
+ .business-empty {
761
+ font-size: 13px;
762
+ color: #84947b;
763
+ line-height: 2;
764
+ padding: 35px 0;
765
+ }
766
+ .business-approval-steps {
767
+ padding-left: 0;
768
+ list-style: none;
769
+ font-size: 12px;
770
+ line-height: 1.9;
771
+ }
772
+ .business-approval-steps > li {
773
+ margin: 10px 0;
774
+ padding-left: 3px;
775
+ }
776
+ .business-approval-steps strong {
777
+ display: block;
778
+ font-size: 12px;
779
+ font-weight: 500;
780
+ }
781
+ .business-approval-steps p {
782
+ font-size: 10px;
783
+ }
784
+ /* 源码预览按行显示并保留原始缩进,横向溢出在代码框内滚动;行号只参与显示。 */
785
+ .source-preview {
786
+ min-width: 0;
787
+ margin-top: 12px;
788
+ }
789
+ .source-preview > summary {
790
+ font-size: 11px;
791
+ color: #6a865e;
792
+ cursor: pointer;
793
+ line-height: 1.9;
794
+ }
795
+ .source-body {
796
+ min-width: 0;
797
+ margin-top: 13px;
798
+ }
799
+ .source-tools {
800
+ display: flex;
801
+ align-items: start;
802
+ justify-content: space-between;
803
+ gap: 10px;
804
+ font-size: 10px;
805
+ color: #7d9372;
806
+ line-height: 1.8;
807
+ margin-bottom: 10px;
808
+ }
809
+ .source-tools > span {
810
+ overflow-wrap: anywhere;
811
+ }
812
+ .source-tools button {
813
+ flex-shrink: 0;
814
+ }
815
+ .source-code {
816
+ border: 1px solid #dce5d5;
817
+ border-radius: 5px;
818
+ overflow: auto;
819
+ background: #f1f5ec;
820
+ padding: 14px 0;
821
+ margin: 0;
822
+ font:
823
+ 11px/1.95 'Cascadia Code',
824
+ Consolas,
825
+ monospace;
826
+ color: #38593c;
827
+ tab-size: 2;
828
+ max-height: 55vh;
829
+ }
830
+ .source-line {
831
+ display: block;
832
+ white-space: pre;
833
+ min-height: 1.95em;
834
+ padding-right: 17px;
835
+ }
836
+ .source-line::before {
837
+ content: attr(data-line);
838
+ display: inline-block;
839
+ position: sticky;
840
+ left: 0;
841
+ width: 43px;
842
+ text-align: right;
843
+ margin-right: 14px;
844
+ padding-right: 11px;
845
+ color: #97a78b;
846
+ border-right: 1px solid #dae3d1;
847
+ background: #f1f5ec;
848
+ user-select: none;
849
+ }
850
+ .source-error {
851
+ font-size: 11px;
852
+ color: #9c6b4e;
853
+ line-height: 1.9;
854
+ overflow-wrap: anywhere;
855
+ }
856
+ .aggregate-list a.aggregate-button {
857
+ display: flex;
858
+ align-items: center;
859
+ }
860
+ .aggregate-button > span:nth-child(2) {
861
+ overflow-wrap: anywhere;
862
+ }
863
+ @media (min-width: 1600px) {
864
+ .business-blocks {
865
+ grid-template-columns: repeat(3, minmax(0, 1fr));
866
+ }
867
+ }
868
+ /* 随视窗收窄调整卡片与工作区宽度;后续断点将详情移到下方,并缩短触控画布高度。 */
869
+ @media (max-width: 1150px) {
870
+ .business-view {
871
+ padding: 24px 20px;
872
+ }
873
+ .business-workspace {
874
+ gap: 18px;
875
+ }
876
+ .business-workspace.inspecting {
877
+ grid-template-columns: minmax(0, 1fr) 310px;
878
+ }
879
+ .business-detail {
880
+ padding: 18px;
881
+ }
882
+ }
883
+ @media (max-width: 800px) {
884
+ .business-workspace,
885
+ .business-workspace.inspecting {
886
+ grid-template-columns: 1fr;
887
+ }
888
+ .business-detail {
889
+ max-height: none;
890
+ }
891
+ .flow-workspace.expanded.inspecting .business-detail {
892
+ position: absolute;
893
+ z-index: 5;
894
+ top: 82px;
895
+ right: 12px;
896
+ bottom: 12px;
897
+ width: min(350px, calc(100% - 24px));
898
+ height: auto;
899
+ box-shadow: -8px 0 30px #294b2424;
900
+ }
901
+ .business-intro,
902
+ .business-scene-heading {
903
+ align-items: start;
904
+ }
905
+ .business-total {
906
+ display: none;
907
+ }
908
+ .business-intro h2 {
909
+ font-size: 23px;
910
+ }
911
+ }
912
+ @media (max-width: 980px) {
913
+ .app-shell:has(.business-page) {
914
+ grid-template-columns: minmax(0, 1fr);
915
+ }
916
+ .app-shell:has(.business-page) .sidebar {
917
+ display: none;
918
+ }
919
+ .app-shell:has(.business-page) .mobile-filters {
920
+ display: inline-flex;
921
+ }
922
+ .app-shell:has(.business-page) .sidebar.open {
923
+ display: flex;
924
+ position: fixed;
925
+ top: 69px;
926
+ bottom: 0;
927
+ left: 0;
928
+ width: 220px;
929
+ z-index: 20;
930
+ overflow: auto;
931
+ box-shadow: 8px 0 30px #243b2520;
932
+ }
933
+ }
934
+ @media (max-width: 640px) {
935
+ .business-view {
936
+ padding: 20px 16px;
937
+ }
938
+ .business-intro h2 {
939
+ font-size: 21px;
940
+ }
941
+ .business-scene-heading {
942
+ flex-direction: column;
943
+ gap: 12px;
944
+ }
945
+ .business-block {
946
+ min-height: 235px;
947
+ padding: 21px 20px 0;
948
+ }
949
+ .business-breadcrumb {
950
+ gap: 7px;
951
+ margin-bottom: 23px;
952
+ font-size: 11px;
953
+ }
954
+ .flowchart-canvas {
955
+ height: 550px;
956
+ }
957
+ .flowchart-toolbar {
958
+ padding: 10px;
959
+ }
960
+ .flowchart-controls button {
961
+ padding: 4px 8px;
962
+ font-size: 11px;
963
+ }
964
+ .flowchart-zoom {
965
+ left: 10px;
966
+ bottom: 10px;
967
+ }
968
+ .flowchart-zoom button {
969
+ padding: 4px 7px;
970
+ }
971
+ .flowchart-toolbar > strong {
972
+ display: none;
973
+ }
974
+ .flowchart-footer {
975
+ font-size: 9px;
976
+ padding: 8px 10px;
977
+ }
978
+ }
979
+ /* 尊重系统减少动画偏好,只移除过渡效果,不影响拖动和相机坐标计算。 */
980
+ @media (prefers-reduced-motion: reduce) {
981
+ .business-block,
982
+ .business-flow-entry {
983
+ transition: none;
984
+ }
985
+ }