dsh-data-domain-knowledge 0.1.0-alpha.9 → 0.1.1-alpha.2

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 (438) hide show
  1. package/README.md +118 -567
  2. package/cordis.patch.yml +5 -418
  3. package/eval/README.md +19 -8
  4. package/eval/benchmark-extraction-format.mjs +20 -0
  5. package/eval/evaluate-retrieval.mjs +17 -8
  6. package/eval/queries.example.jsonl +1 -0
  7. package/lib/client.js +4181 -3239
  8. package/lib/contract-envelope.d.ts +91 -0
  9. package/lib/contract-envelope.js +106 -0
  10. package/lib/contract-layout.d.ts +130 -0
  11. package/lib/contract-layout.js +138 -0
  12. package/lib/contract-refs.d.ts +39 -0
  13. package/lib/contract-refs.js +9 -0
  14. package/lib/contract-version.d.ts +311 -0
  15. package/lib/contract-version.js +270 -0
  16. package/lib/contract-wire.d.ts +147 -0
  17. package/lib/contract-wire.js +99 -0
  18. package/lib/contracts.d.ts +12 -0
  19. package/lib/contracts.js +12 -0
  20. package/lib/doc-page.js +2 -2
  21. package/lib/pages.js +3329 -1296
  22. package/lib/types/agent-behavior-rules.d.ts +10 -0
  23. package/lib/types/agent-behavior-rules.d.ts.map +1 -0
  24. package/lib/types/agent-behavior-rules.js +28 -0
  25. package/lib/types/agent-behavior-rules.js.map +1 -0
  26. package/lib/types/axis-registry.d.ts +37 -5
  27. package/lib/types/axis-registry.d.ts.map +1 -1
  28. package/lib/types/axis-registry.js +234 -26
  29. package/lib/types/axis-registry.js.map +1 -1
  30. package/lib/types/card-organize.d.ts +27 -12
  31. package/lib/types/card-organize.d.ts.map +1 -1
  32. package/lib/types/card-organize.js +58 -73
  33. package/lib/types/card-organize.js.map +1 -1
  34. package/lib/types/compiler/embedding-identity.d.ts +3 -0
  35. package/lib/types/compiler/embedding-identity.d.ts.map +1 -0
  36. package/lib/types/compiler/embedding-identity.js +24 -0
  37. package/lib/types/compiler/embedding-identity.js.map +1 -0
  38. package/lib/types/compiler/snapshot.d.ts +16 -0
  39. package/lib/types/compiler/snapshot.d.ts.map +1 -0
  40. package/lib/types/compiler/snapshot.js +2 -0
  41. package/lib/types/compiler/snapshot.js.map +1 -0
  42. package/lib/types/config-schema.d.ts +6 -3
  43. package/lib/types/config-schema.d.ts.map +1 -1
  44. package/lib/types/config-schema.js +6 -2
  45. package/lib/types/config-schema.js.map +1 -1
  46. package/lib/types/convert/host.d.ts +6 -5
  47. package/lib/types/convert/host.d.ts.map +1 -1
  48. package/lib/types/convert/host.js +58 -18
  49. package/lib/types/convert/host.js.map +1 -1
  50. package/lib/types/convert/ingest.d.ts +10 -1
  51. package/lib/types/convert/ingest.d.ts.map +1 -1
  52. package/lib/types/convert/ingest.js +68 -9
  53. package/lib/types/convert/ingest.js.map +1 -1
  54. package/lib/types/derive-contract.d.ts +3 -0
  55. package/lib/types/derive-contract.d.ts.map +1 -0
  56. package/lib/types/derive-contract.js +15 -0
  57. package/lib/types/derive-contract.js.map +1 -0
  58. package/lib/types/diagnosis/cards.d.ts +7 -3
  59. package/lib/types/diagnosis/cards.d.ts.map +1 -1
  60. package/lib/types/diagnosis/cards.js +13 -8
  61. package/lib/types/diagnosis/cards.js.map +1 -1
  62. package/lib/types/diagnosis/run.d.ts +4 -13
  63. package/lib/types/diagnosis/run.d.ts.map +1 -1
  64. package/lib/types/diagnosis/run.js +26 -16
  65. package/lib/types/diagnosis/run.js.map +1 -1
  66. package/lib/types/diagnosis/schema.js +2 -2
  67. package/lib/types/diagnosis/schema.js.map +1 -1
  68. package/lib/types/diagnosis/seed-source.d.ts +1 -1
  69. package/lib/types/diagnosis/seed-source.d.ts.map +1 -1
  70. package/lib/types/diagnosis/seed-source.js +5 -4
  71. package/lib/types/diagnosis/seed-source.js.map +1 -1
  72. package/lib/types/diagnosis/seed.d.ts +4 -4
  73. package/lib/types/diagnosis/seed.d.ts.map +1 -1
  74. package/lib/types/diagnosis/seed.js +6 -8
  75. package/lib/types/diagnosis/seed.js.map +1 -1
  76. package/lib/types/diagnosis/store.d.ts +24 -18
  77. package/lib/types/diagnosis/store.d.ts.map +1 -1
  78. package/lib/types/diagnosis/store.js +130 -65
  79. package/lib/types/diagnosis/store.js.map +1 -1
  80. package/lib/types/diagnosis/types.d.ts +47 -15
  81. package/lib/types/diagnosis/types.d.ts.map +1 -1
  82. package/lib/types/diagnosis/types.js.map +1 -1
  83. package/lib/types/environment/dsh-python.d.ts +77 -0
  84. package/lib/types/environment/dsh-python.d.ts.map +1 -0
  85. package/lib/types/environment/dsh-python.js +139 -0
  86. package/lib/types/environment/dsh-python.js.map +1 -0
  87. package/lib/types/environment/install.d.ts +15 -0
  88. package/lib/types/environment/install.d.ts.map +1 -0
  89. package/lib/types/environment/install.js +297 -0
  90. package/lib/types/environment/install.js.map +1 -0
  91. package/lib/types/environment/manifest.d.ts +208 -0
  92. package/lib/types/environment/manifest.d.ts.map +1 -0
  93. package/lib/types/environment/manifest.js +26 -0
  94. package/lib/types/environment/manifest.js.map +1 -0
  95. package/lib/types/environment/model-catalog.d.ts +223 -0
  96. package/lib/types/environment/model-catalog.d.ts.map +1 -0
  97. package/lib/types/environment/model-catalog.js +129 -0
  98. package/lib/types/environment/model-catalog.js.map +1 -0
  99. package/lib/types/environment/process.d.ts +10 -0
  100. package/lib/types/environment/process.d.ts.map +1 -0
  101. package/lib/types/environment/process.js +54 -0
  102. package/lib/types/environment/process.js.map +1 -0
  103. package/lib/types/environment/selection.d.ts +9 -0
  104. package/lib/types/environment/selection.d.ts.map +1 -0
  105. package/lib/types/environment/selection.js +29 -0
  106. package/lib/types/environment/selection.js.map +1 -0
  107. package/lib/types/environment/service.d.ts +64 -0
  108. package/lib/types/environment/service.d.ts.map +1 -0
  109. package/lib/types/environment/service.js +424 -0
  110. package/lib/types/environment/service.js.map +1 -0
  111. package/lib/types/environment/types.d.ts +56 -0
  112. package/lib/types/environment/types.d.ts.map +1 -0
  113. package/lib/types/environment/types.js +2 -0
  114. package/lib/types/environment/types.js.map +1 -0
  115. package/lib/types/events.d.ts +76 -0
  116. package/lib/types/events.d.ts.map +1 -0
  117. package/lib/types/events.js +52 -0
  118. package/lib/types/events.js.map +1 -0
  119. package/lib/types/extract-contract.d.ts +3 -0
  120. package/lib/types/extract-contract.d.ts.map +1 -0
  121. package/lib/types/extract-contract.js +41 -0
  122. package/lib/types/extract-contract.js.map +1 -0
  123. package/lib/types/extract-model.d.ts +5 -0
  124. package/lib/types/extract-model.d.ts.map +1 -1
  125. package/lib/types/extract-model.js.map +1 -1
  126. package/lib/types/extract-table-contract.d.ts +3 -0
  127. package/lib/types/extract-table-contract.d.ts.map +1 -0
  128. package/lib/types/extract-table-contract.js +27 -0
  129. package/lib/types/extract-table-contract.js.map +1 -0
  130. package/lib/types/extract-table.d.ts +8 -0
  131. package/lib/types/extract-table.d.ts.map +1 -0
  132. package/lib/types/extract-table.js +158 -0
  133. package/lib/types/extract-table.js.map +1 -0
  134. package/lib/types/extraction-runs.d.ts +30 -6
  135. package/lib/types/extraction-runs.d.ts.map +1 -1
  136. package/lib/types/extraction-runs.js +69 -8
  137. package/lib/types/extraction-runs.js.map +1 -1
  138. package/lib/types/fs-atomic.d.ts +0 -7
  139. package/lib/types/fs-atomic.d.ts.map +1 -1
  140. package/lib/types/fs-atomic.js +17 -2
  141. package/lib/types/fs-atomic.js.map +1 -1
  142. package/lib/types/images.d.ts +26 -0
  143. package/lib/types/images.d.ts.map +1 -0
  144. package/lib/types/images.js +196 -0
  145. package/lib/types/images.js.map +1 -0
  146. package/lib/types/index.d.ts +2 -2
  147. package/lib/types/index.d.ts.map +1 -1
  148. package/lib/types/index.js +598 -209
  149. package/lib/types/index.js.map +1 -1
  150. package/lib/types/intent/engine.d.ts +12 -4
  151. package/lib/types/intent/engine.d.ts.map +1 -1
  152. package/lib/types/intent/engine.js +43 -5
  153. package/lib/types/intent/engine.js.map +1 -1
  154. package/lib/types/intent/host.d.ts +5 -8
  155. package/lib/types/intent/host.d.ts.map +1 -1
  156. package/lib/types/intent/host.js +56 -11
  157. package/lib/types/intent/host.js.map +1 -1
  158. package/lib/types/intent/scope.d.ts +25 -0
  159. package/lib/types/intent/scope.d.ts.map +1 -0
  160. package/lib/types/intent/scope.js +116 -0
  161. package/lib/types/intent/scope.js.map +1 -0
  162. package/lib/types/intent/tools.d.ts +24 -20
  163. package/lib/types/intent/tools.d.ts.map +1 -1
  164. package/lib/types/intent/tools.js +65 -23
  165. package/lib/types/intent/tools.js.map +1 -1
  166. package/lib/types/intent/types.d.ts +11 -4
  167. package/lib/types/intent/types.d.ts.map +1 -1
  168. package/lib/types/knowledge-bases.d.ts +11 -5
  169. package/lib/types/knowledge-bases.d.ts.map +1 -1
  170. package/lib/types/knowledge-bases.js +52 -20
  171. package/lib/types/knowledge-bases.js.map +1 -1
  172. package/lib/types/knowledge-contract.d.ts +32 -0
  173. package/lib/types/knowledge-contract.d.ts.map +1 -0
  174. package/lib/types/knowledge-contract.js +116 -0
  175. package/lib/types/knowledge-contract.js.map +1 -0
  176. package/lib/types/knowledge.d.ts +31 -9
  177. package/lib/types/knowledge.d.ts.map +1 -1
  178. package/lib/types/knowledge.js +137 -60
  179. package/lib/types/knowledge.js.map +1 -1
  180. package/lib/types/layout.d.ts +10 -29
  181. package/lib/types/layout.d.ts.map +1 -1
  182. package/lib/types/layout.js +17 -36
  183. package/lib/types/layout.js.map +1 -1
  184. package/lib/types/materialize-snapshot.d.ts +49 -0
  185. package/lib/types/materialize-snapshot.d.ts.map +1 -0
  186. package/lib/types/materialize-snapshot.js +2 -0
  187. package/lib/types/materialize-snapshot.js.map +1 -0
  188. package/lib/types/migrate.d.ts +11 -0
  189. package/lib/types/migrate.d.ts.map +1 -1
  190. package/lib/types/migrate.js +83 -2
  191. package/lib/types/migrate.js.map +1 -1
  192. package/lib/types/model-text.d.ts +58 -1
  193. package/lib/types/model-text.d.ts.map +1 -1
  194. package/lib/types/model-text.js +85 -30
  195. package/lib/types/model-text.js.map +1 -1
  196. package/lib/types/oplog.d.ts.map +1 -1
  197. package/lib/types/oplog.js +7 -0
  198. package/lib/types/oplog.js.map +1 -1
  199. package/lib/types/organize-contract.d.ts +18 -0
  200. package/lib/types/organize-contract.d.ts.map +1 -0
  201. package/lib/types/organize-contract.js +82 -0
  202. package/lib/types/organize-contract.js.map +1 -0
  203. package/lib/types/pipeline/engine.d.ts +66 -0
  204. package/lib/types/pipeline/engine.d.ts.map +1 -0
  205. package/lib/types/pipeline/engine.js +352 -0
  206. package/lib/types/pipeline/engine.js.map +1 -0
  207. package/lib/types/pipeline/store.d.ts +73 -0
  208. package/lib/types/pipeline/store.d.ts.map +1 -0
  209. package/lib/types/pipeline/store.js +143 -0
  210. package/lib/types/pipeline/store.js.map +1 -0
  211. package/lib/types/pipeline/types.d.ts +102 -0
  212. package/lib/types/pipeline/types.d.ts.map +1 -0
  213. package/lib/types/pipeline/types.js +5 -0
  214. package/lib/types/pipeline/types.js.map +1 -0
  215. package/lib/types/present.d.ts +2 -0
  216. package/lib/types/present.d.ts.map +1 -1
  217. package/lib/types/present.js +9 -4
  218. package/lib/types/present.js.map +1 -1
  219. package/lib/types/preset-ids.d.ts +4 -0
  220. package/lib/types/preset-ids.d.ts.map +1 -0
  221. package/lib/types/preset-ids.js +6 -0
  222. package/lib/types/preset-ids.js.map +1 -0
  223. package/lib/types/query-analysis.d.ts +13 -1
  224. package/lib/types/query-analysis.d.ts.map +1 -1
  225. package/lib/types/query-analysis.js +62 -6
  226. package/lib/types/query-analysis.js.map +1 -1
  227. package/lib/types/recall-rank.d.ts +3 -3
  228. package/lib/types/recall-rank.d.ts.map +1 -1
  229. package/lib/types/recall-rank.js +4 -4
  230. package/lib/types/recall-rank.js.map +1 -1
  231. package/lib/types/retention.d.ts +39 -0
  232. package/lib/types/retention.d.ts.map +1 -0
  233. package/lib/types/retention.js +42 -0
  234. package/lib/types/retention.js.map +1 -0
  235. package/lib/types/retrieval/vector-index.d.ts +32 -0
  236. package/lib/types/retrieval/vector-index.d.ts.map +1 -0
  237. package/lib/types/retrieval/vector-index.js +15 -0
  238. package/lib/types/retrieval/vector-index.js.map +1 -0
  239. package/lib/types/retrieval/visibility.d.ts +6 -0
  240. package/lib/types/retrieval/visibility.d.ts.map +1 -0
  241. package/lib/types/retrieval/visibility.js +11 -0
  242. package/lib/types/retrieval/visibility.js.map +1 -0
  243. package/lib/types/runtime.d.ts +272 -27
  244. package/lib/types/runtime.d.ts.map +1 -1
  245. package/lib/types/runtime.js +2751 -537
  246. package/lib/types/runtime.js.map +1 -1
  247. package/lib/types/settings-schema.d.ts +17 -15
  248. package/lib/types/settings-schema.d.ts.map +1 -1
  249. package/lib/types/settings-schema.js +50 -47
  250. package/lib/types/settings-schema.js.map +1 -1
  251. package/lib/types/settings-volatile.d.ts +4 -4
  252. package/lib/types/settings-volatile.js +4 -4
  253. package/lib/types/source-evidence.d.ts +14 -0
  254. package/lib/types/source-evidence.d.ts.map +1 -0
  255. package/lib/types/source-evidence.js +36 -0
  256. package/lib/types/source-evidence.js.map +1 -0
  257. package/lib/types/store/axis-references.d.ts +5 -0
  258. package/lib/types/store/axis-references.d.ts.map +1 -0
  259. package/lib/types/store/axis-references.js +106 -0
  260. package/lib/types/store/axis-references.js.map +1 -0
  261. package/lib/types/store/derived.d.ts +12 -1
  262. package/lib/types/store/derived.d.ts.map +1 -1
  263. package/lib/types/store/derived.js +71 -12
  264. package/lib/types/store/derived.js.map +1 -1
  265. package/lib/types/store/knowledge-db.d.ts +31 -1
  266. package/lib/types/store/knowledge-db.d.ts.map +1 -1
  267. package/lib/types/store/knowledge-db.js +252 -18
  268. package/lib/types/store/knowledge-db.js.map +1 -1
  269. package/lib/types/store/migrate.d.ts.map +1 -1
  270. package/lib/types/store/migrate.js +17 -6
  271. package/lib/types/store/migrate.js.map +1 -1
  272. package/lib/types/trajectory-types.d.ts +172 -0
  273. package/lib/types/trajectory-types.d.ts.map +1 -0
  274. package/lib/types/trajectory-types.js +36 -0
  275. package/lib/types/trajectory-types.js.map +1 -0
  276. package/lib/types/types.d.ts +59 -27
  277. package/lib/types/types.d.ts.map +1 -1
  278. package/lib/types/types.js +6 -15
  279. package/lib/types/types.js.map +1 -1
  280. package/lib/types/wiki-finalize.d.ts +16 -0
  281. package/lib/types/wiki-finalize.d.ts.map +1 -1
  282. package/lib/types/wiki-finalize.js +26 -0
  283. package/lib/types/wiki-finalize.js.map +1 -1
  284. package/lib/types/wiki-materialize.d.ts +4 -0
  285. package/lib/types/wiki-materialize.d.ts.map +1 -1
  286. package/lib/types/wiki-materialize.js +21 -7
  287. package/lib/types/wiki-materialize.js.map +1 -1
  288. package/lib/types/wiki-trial-types.d.ts +87 -0
  289. package/lib/types/wiki-trial-types.d.ts.map +1 -1
  290. package/lib/types/wiki-trial-types.js +0 -16
  291. package/lib/types/wiki-trial-types.js.map +1 -1
  292. package/lib/types/wiki-trial.d.ts +40 -16
  293. package/lib/types/wiki-trial.d.ts.map +1 -1
  294. package/lib/types/wiki-trial.js +337 -224
  295. package/lib/types/wiki-trial.js.map +1 -1
  296. package/package.json +29 -20
  297. package/python/prepare-models.py +19 -0
  298. package/python/requirements.txt +8 -6
  299. package/scripts/doctor.mjs +13 -19
  300. package/scripts/environment.mjs +29 -0
  301. package/scripts/setup-embedding.sh +15 -5
  302. package/src/agent-behavior-rules.ts +37 -0
  303. package/src/axis-registry.ts +234 -27
  304. package/src/card-organize.ts +69 -75
  305. package/src/client/AgentBehaviorRulesCard.tsx +65 -0
  306. package/src/client/AttributionEventGuide.tsx +41 -39
  307. package/src/client/AxisRegistrySection.tsx +204 -164
  308. package/src/client/CompileDialogs.tsx +44 -29
  309. package/src/client/DeleteDocumentDialog.tsx +36 -5
  310. package/src/client/DirectoryPicker.tsx +0 -10
  311. package/src/client/EnvironmentSetup.tsx +243 -0
  312. package/src/client/ExpansionGraph.tsx +13 -7
  313. package/src/client/ExtractionTasksPage.tsx +578 -0
  314. package/src/client/GuideArchitectureCanvas.tsx +470 -0
  315. package/src/client/ImportFilesDialog.tsx +2 -13
  316. package/src/client/IntentLogic.tsx +2 -2
  317. package/src/client/IntentTab.tsx +118 -47
  318. package/src/client/KnowledgeBaseTab.tsx +277 -197
  319. package/src/client/KnowledgeLayerSection.tsx +24 -6
  320. package/src/client/KnowledgePanel.tsx +58 -93
  321. package/src/client/KnowledgeSettingsDrawer.tsx +90 -0
  322. package/src/client/ListPager.tsx +15 -5
  323. package/src/client/MaterializeTrajectoryView.tsx +124 -0
  324. package/src/client/NodeSettings.tsx +210 -89
  325. package/src/client/NormalizeTrajectoryView.tsx +136 -0
  326. package/src/client/PipelineNotice.tsx +26 -0
  327. package/src/client/PreviewSections.tsx +118 -51
  328. package/src/client/RecallPanel.tsx +89 -85
  329. package/src/client/TabGuide.tsx +159 -184
  330. package/src/client/TrialReportView.tsx +391 -214
  331. package/src/client/TypeDefinitionDrawer.tsx +150 -23
  332. package/src/client/WikiCardPreview.tsx +62 -16
  333. package/src/client/WikiFlowPanel.tsx +4 -4
  334. package/src/client/arch/NodeLogicPanel.tsx +3 -4
  335. package/src/client/arch/model.ts +6 -9
  336. package/src/client/architecture.tsx +23 -33
  337. package/src/client/attribution/AttributionGraph.tsx +10 -6
  338. package/src/client/attribution/AttributionTab.tsx +136 -84
  339. package/src/client/attribution/CaseView.tsx +3 -1
  340. package/src/client/attribution/EventView.tsx +108 -0
  341. package/src/client/attribution/RunView.tsx +2 -2
  342. package/src/client/attribution/StageChrome.tsx +34 -3
  343. package/src/client/attribution/ViewSwitch.tsx +20 -5
  344. package/src/client/attribution/graph-options.ts +47 -39
  345. package/src/client/attribution/model.ts +17 -10
  346. package/src/client/config-scope.ts +3 -3
  347. package/src/client/graph/palette.ts +165 -0
  348. package/src/client/index.ts +49 -42
  349. package/src/client/pages.css +459 -135
  350. package/src/client/pages.tsx +37 -9
  351. package/src/client/problem-domains.ts +1 -1
  352. package/src/client/session-remote.ts +9 -0
  353. package/src/client/styles.css +205 -62
  354. package/src/client/wiki-trial.ts +44 -3
  355. package/src/compiler/embedding-identity.ts +21 -0
  356. package/src/compiler/snapshot.ts +17 -0
  357. package/src/config-schema.ts +8 -3
  358. package/src/convert/host.ts +56 -21
  359. package/src/convert/ingest.ts +74 -10
  360. package/src/derive-contract.ts +14 -0
  361. package/src/diagnosis/cards.ts +13 -8
  362. package/src/diagnosis/run.ts +27 -17
  363. package/src/diagnosis/schema.ts +2 -2
  364. package/src/diagnosis/seed-source.ts +5 -4
  365. package/src/diagnosis/seed.ts +6 -8
  366. package/src/diagnosis/store.ts +138 -69
  367. package/src/diagnosis/types.ts +34 -15
  368. package/src/environment/dsh-python.ts +156 -0
  369. package/src/environment/install.ts +244 -0
  370. package/src/environment/manifest.ts +28 -0
  371. package/src/environment/model-catalog.ts +147 -0
  372. package/src/environment/process.ts +54 -0
  373. package/src/environment/selection.ts +29 -0
  374. package/src/environment/service.ts +348 -0
  375. package/src/environment/types.ts +45 -0
  376. package/src/events.ts +108 -0
  377. package/src/extract-contract.ts +42 -0
  378. package/src/extract-model.ts +10 -1
  379. package/src/extract-table-contract.ts +26 -0
  380. package/src/extract-table.ts +132 -0
  381. package/src/extraction-runs.ts +70 -11
  382. package/src/fs-atomic.ts +19 -2
  383. package/src/images.ts +203 -0
  384. package/src/index.ts +553 -205
  385. package/src/intent/README.md +8 -6
  386. package/src/intent/engine.ts +44 -6
  387. package/src/intent/host.ts +59 -18
  388. package/src/intent/scope.ts +125 -0
  389. package/src/intent/tools.ts +70 -28
  390. package/src/intent/types.ts +11 -4
  391. package/src/knowledge-bases.ts +56 -20
  392. package/src/knowledge-contract.ts +114 -0
  393. package/src/knowledge.ts +138 -69
  394. package/src/layout.ts +17 -37
  395. package/src/materialize-snapshot.ts +46 -0
  396. package/src/migrate.ts +75 -2
  397. package/src/model-text.ts +109 -4
  398. package/src/oplog.ts +7 -0
  399. package/src/organize-contract.ts +83 -0
  400. package/src/pipeline/engine.ts +323 -0
  401. package/src/pipeline/store.ts +147 -0
  402. package/src/pipeline/types.ts +93 -0
  403. package/src/present.ts +10 -4
  404. package/src/preset-ids.ts +6 -0
  405. package/src/python/embedding_worker.py +66 -2
  406. package/src/query-analysis.ts +68 -8
  407. package/src/recall-rank.ts +5 -5
  408. package/src/retention.ts +76 -0
  409. package/src/retrieval/vector-index.ts +45 -0
  410. package/src/retrieval/visibility.ts +14 -0
  411. package/src/runtime.ts +2708 -567
  412. package/src/settings-schema.ts +11 -8
  413. package/src/settings-volatile.ts +4 -4
  414. package/src/source-evidence.ts +37 -0
  415. package/src/store/axis-references.ts +96 -0
  416. package/src/store/derived.ts +70 -12
  417. package/src/store/knowledge-db.ts +248 -17
  418. package/src/store/migrate.ts +16 -6
  419. package/src/trajectory-types.ts +142 -0
  420. package/src/types.ts +61 -35
  421. package/src/wiki-finalize.ts +28 -0
  422. package/src/wiki-materialize.ts +25 -6
  423. package/src/wiki-trial-types.ts +83 -1
  424. package/src/wiki-trial.ts +357 -185
  425. package/lib/types/intent/preset-tools.d.ts +0 -37
  426. package/lib/types/intent/preset-tools.d.ts.map +0 -1
  427. package/lib/types/intent/preset-tools.js +0 -45
  428. package/lib/types/intent/preset-tools.js.map +0 -1
  429. package/preset/tita-data-agent/agent.cordis.yml +0 -394
  430. package/preset/tita-data-agent/preset.yml +0 -3
  431. package/scripts/install-agent-preset.mjs +0 -92
  432. package/scripts/sync-agent-preset.mjs +0 -188
  433. package/src/client/AgentPresetCard.tsx +0 -247
  434. package/src/client/agent-preset.ts +0 -121
  435. package/src/client/convert/ConvertPanel.tsx +0 -583
  436. package/src/client/convert/styles.css +0 -138
  437. package/src/client/convert/styles.ts +0 -49
  438. package/src/intent/preset-tools.ts +0 -48
@@ -46,11 +46,17 @@ body {
46
46
 
47
47
  .page-main { padding: 28px 28px 120px; }
48
48
 
49
- /* 内容列。宽度按页给:说明 860,试跑报告 1180。 */
49
+ /* 内容列。宽度按页给:说明 860,试跑报告 1080,架构说明页 1560。 */
50
50
  .page-column { width: 100%; margin-inline: auto; }
51
51
  .page-column-help { max-width: 860px; }
52
52
  .page-column-trial { max-width: 1080px; }
53
- .page-column-guide { max-width: 1120px; }
53
+ .page-column-tasks { max-width: 1220px; }
54
+ /* 架构说明页是**一块画布**,不是一栏正文:画布设计宽 1172px,再加右列 400px,
55
+ 窄于 1560 就只能靠缩字把图塞进来(实测 0.55 倍,卡片上的字读不出)。 */
56
+ .page-column-guide { max-width: 1560px; }
57
+ /* 这一页的边框要贴住视口底,所以把给「读排版」那几页留的 120px 页脚内边距收成 40px ——
58
+ 省下的 80px 全部换成画布高度。`:has` 不支持时这条被忽略,退回 120px,不会坏。 */
59
+ .page-main:has(> .page-column-guide) { padding-bottom: 40px; }
54
60
 
55
61
  /* 地址不对、或还没载入时的整页状态。与 `doc-page.css` 的 `.docPage-state` 同形。 */
56
62
  .page-state {
@@ -85,6 +91,230 @@ body {
85
91
  }
86
92
  .page-loading { margin: 0; color: var(--tita-ink-muted); font-size: 12px; }
87
93
 
94
+ /* ---------------------------------------------------------- 知识处理与运行记录
95
+ *
96
+ * 2026-10-18 重排。这一页只有三层,而每一层回答一个问题:
97
+ *
98
+ * 1. **页头** —— 现在什么状态(一行实时结论)+ 两个动作。**没有标题**:标题在常驻窄条上,
99
+ * 内容区再写一遍就是同一句话说两次。
100
+ * 2. **步骤轨** —— 四段各差多少。它横贯整页而不是缩在左栏里:这一页的骨架是一条有方向的
101
+ * 流水线,把骨架塞进左栏,右栏就变成了「第二根柱子」。
102
+ * 3. **两栏** —— 左栏「这一段跑了什么」,右栏「我要跑哪些」+「以前跑过什么」。
103
+ *
104
+ * 上一版的问题是**同一件事说了三遍**(页签徽标 / 段头 / 结果摘要的第一行都是「部分失败」),
105
+ * 而真正有用的「还剩多少待办」被压成一行 10.5px 的灰字,模型原始日志却占着一屏。
106
+ * 所以这里守一条:**一个事实只出现一次**。阶段状态只住在步骤轨上,待办计数只住在同一格的
107
+ * 第二行,段名只住在段头。
108
+ */
109
+ .extractTasksPage { display: grid; min-width: 0; gap: 15px; color: var(--tita-ink); }
110
+
111
+ .extractTasksHead { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px 18px; }
112
+ /* 结论行:12.5px 而不是 13px —— 它是一句状态,不是正文。宽度上限 76ch:
113
+ 整页 1220px 时这一句会独占一整行,读起来像标题。 */
114
+ .extractTasksHeadline { max-width: 76ch; margin: 0; color: var(--tita-ink-muted); font-size: 12.5px; line-height: 1.6; }
115
+ .extractTasksHeadActions { display: flex; flex: 0 0 auto; align-items: center; gap: 6px; }
116
+ .extractTasksError { margin: 0; border: 1px solid color-mix(in srgb, var(--tita-danger) 32%, var(--tita-surface)); border-radius: 8px; background: color-mix(in srgb, var(--tita-danger) 8%, var(--tita-surface)); padding: 9px 12px; color: var(--tita-danger); font-size: 12px; }
117
+
118
+ /* ---- 步骤轨
119
+ *
120
+ * 复用 `KnowledgeStepRail` 那一套语言(节点 + 箭头 + 当前步描边),因为它们是同一件事:
121
+ * 一条流水线上「你现在站在哪一段」。区别只有一处 —— 这里的节点是 Radix 的 trigger,
122
+ * 所以键盘、`aria-controls`、方向键切换都是现成的。
123
+ *
124
+ * 默认的 `TabsList` 是「一排等宽按钮」(等宽 pill + 32px 高):它表达的是「几选一」,
125
+ * 而这里是「谁接谁」。所以把 pill 的底、内边距、固定高全部收掉,节点自己长成带描边的一格。
126
+ */
127
+ .extractTasksWork { display: flex; min-width: 0; flex-direction: column; gap: 14px; }
128
+ .extractTasksRailList {
129
+ display: flex;
130
+ width: 100%;
131
+ height: auto;
132
+ align-items: stretch;
133
+ gap: 6px;
134
+ border-radius: 0;
135
+ background: transparent;
136
+ padding: 0;
137
+ }
138
+ .extractTasksRailArrow { display: inline-flex; flex: 0 0 auto; align-self: center; align-items: center; color: var(--tita-ink-faint); }
139
+ .extractTasksRailStep {
140
+ display: grid;
141
+ flex: 1 1 0;
142
+ box-sizing: border-box;
143
+ min-width: 0;
144
+ height: auto;
145
+ align-content: start;
146
+ justify-items: start;
147
+ gap: 7px;
148
+ border: 1px solid var(--tita-line);
149
+ border-radius: 9px;
150
+ background: var(--tita-surface);
151
+ padding: 10px 12px;
152
+ color: var(--tita-ink-muted);
153
+ text-align: left;
154
+ white-space: normal;
155
+ transition: border-color 120ms ease-out, background-color 120ms ease-out;
156
+ }
157
+ .extractTasksRailStep:hover { border-color: var(--tita-line-strong); background: var(--tita-surface-muted); color: var(--tita-ink); }
158
+ .extractTasksRailStep:focus-visible { outline: 2px solid var(--tita-focus-ring); outline-offset: 1px; }
159
+ /* 当前步不是「已选中」,而是「你站在哪一段」。用主色描边 + 浅底,不用左侧色条 ——
160
+ 色条会把这一格读成一条「提示卡」,而它不是提示。两个属性都写上:Radix 给的是
161
+ `data-state="active"`,新版 shadcn 的类名等的是 `data-active`。 */
162
+ .extractTasksRailStep[data-state="active"],
163
+ .extractTasksRailStep[data-active] {
164
+ border-color: var(--tita-primary);
165
+ background: var(--tita-primary-soft);
166
+ box-shadow: inset 0 0 0 1px var(--tita-primary);
167
+ color: var(--tita-ink);
168
+ }
169
+ .extractTasksRailName { min-width: 0; color: inherit; font-size: 12.5px; font-weight: 680; line-height: 1.4; letter-spacing: -.01em; }
170
+ .extractTasksRailFacts { display: flex; min-width: 0; flex-wrap: wrap; align-items: center; gap: 6px; }
171
+ /* 待办计数:等宽数字,**比徽标轻** —— 徽标说的是「上次跑成什么样」(结论),
172
+ 这一句说的是「现在还剩多少」(读数)。两件事不同重,才读得出哪句是结论。 */
173
+ .extractTasksRailPending { color: var(--tita-ink-faint); font-size: 10.5px; line-height: 1.4; white-space: nowrap; font-variant-numeric: tabular-nums; }
174
+
175
+ /* ---- 两栏 */
176
+ .extractTasksBody { display: grid; grid-template-columns: minmax(0, 1.6fr) minmax(316px, 1fr); align-items: start; gap: 18px; }
177
+ .extractTasksMain { min-width: 0; }
178
+ .extractTasksSide { display: grid; min-width: 0; gap: 14px; }
179
+
180
+ /* ---- 阶段卡
181
+ *
182
+ * 卡里**不再套卡**:输入范围 / 结果摘要 / 抽取报告 / 运行输出 都是这张卡里的**分节**,
183
+ * 用一条发丝线分开,不各长一圈描边。卡片套卡片读起来是四个同级的东西,
184
+ * 而它们其实是同一件事的四段。
185
+ */
186
+ .extractTasksStage { min-width: 0; border: 1px solid var(--tita-line); border-radius: 10px; background: var(--tita-surface); padding: 15px 17px 17px; }
187
+ .extractTasksStageIntro { display: flex; align-items: flex-start; justify-content: space-between; gap: 14px; }
188
+ .extractTasksStageIntro > div { min-width: 0; }
189
+ .extractTasksStageIntro h2 { margin: 0; color: var(--tita-ink); font-size: 14.5px; font-weight: 700; line-height: 1.4; letter-spacing: -.015em; }
190
+ .extractTasksStageIntro p { margin: 3px 0 0; color: var(--tita-ink-muted); font-size: 11.5px; line-height: 1.55; }
191
+
192
+ .extractTasksFacts { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 0; border-top: 1px solid var(--tita-line); margin-top: 13px; }
193
+ .extractTasksFacts > section { min-width: 0; padding-top: 13px; }
194
+ .extractTasksFacts > section + section { border-left: 1px solid var(--tita-line); padding-left: 20px; }
195
+ .extractTasksFacts h3 { margin: 0 0 9px; color: var(--tita-ink-muted); font-size: 10.5px; font-weight: 700; letter-spacing: .02em; }
196
+ .extractTasksFacts dl { display: grid; gap: 7px; margin: 0; }
197
+ .extractTasksFacts dl > div { display: grid; grid-template-columns: 68px minmax(0, 1fr); align-items: start; gap: 10px; }
198
+ .extractTasksFacts dt { color: var(--tita-ink-faint); font-size: 10.5px; line-height: 1.55; }
199
+ .extractTasksFacts dd { min-width: 0; margin: 0; color: var(--tita-ink); font-size: 11px; line-height: 1.55; overflow-wrap: anywhere; }
200
+
201
+ /* ---- 抽取报告 */
202
+ .extractTasksReports { border-top: 1px solid var(--tita-line); margin-top: 15px; padding-top: 13px; }
203
+ .extractTasksSubhead { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }
204
+ .extractTasksSubhead > div { min-width: 0; }
205
+ .extractTasksSubhead h3 { margin: 0; color: var(--tita-ink); font-size: 11.5px; font-weight: 700; }
206
+ .extractTasksSubhead p { margin: 3px 0 0; color: var(--tita-ink-faint); font-size: 10.5px; line-height: 1.5; }
207
+ .extractTasksCount { flex: 0 0 auto; color: var(--tita-ink-muted); font-size: 11px; font-variant-numeric: tabular-nums; }
208
+ .extractTasksEmpty { margin: 0; padding: 14px 0; color: var(--tita-ink-muted); font-size: 11.5px; }
209
+ /* 这一行是一个 `<button>`:应用内路径不能靠 `<a href>` 开(见 `ExtractionTasksPage`
210
+ 里那段注释)。所以要把裸按钮的浏览器默认样式复位掉,外观保持原样。 */
211
+ .extractReportRow { display: flex; width: 100%; min-width: 0; align-items: flex-start; justify-content: space-between; gap: 14px; border: 0; border-bottom: 1px solid var(--tita-line); border-radius: 0; background: none; padding: 11px 0; color: var(--tita-ink); font: inherit; text-align: left; text-decoration: none; cursor: pointer; }
212
+ .extractReportRow:last-child { border-bottom: 0; padding-bottom: 2px; }
213
+ .extractReportRow:hover .extractReportMain strong { color: var(--tita-primary); text-decoration: underline; text-underline-offset: 3px; }
214
+ .extractReportRow:focus-visible { outline: 2px solid var(--tita-focus-ring); outline-offset: 2px; border-radius: 6px; }
215
+ .extractReportMain { display: grid; min-width: 0; gap: 3px; }
216
+ .extractReportMain strong { font-size: 12px; font-weight: 650; line-height: 1.5; overflow-wrap: anywhere; }
217
+ .extractReportMain > span { color: var(--tita-ink-muted); font-size: 11px; line-height: 1.55; overflow-wrap: anywhere; }
218
+ .extractReportMeta { display: inline-flex; flex: 0 0 auto; align-items: center; gap: 6px; color: var(--tita-ink-faint); font-size: 10.5px; font-variant-numeric: tabular-nums; white-space: nowrap; }
219
+
220
+ /* ---- 运行输出(默认收起) */
221
+ .extractTasksOutput { border-top: 1px solid var(--tita-line); margin-top: 15px; padding-top: 4px; }
222
+ .extractTasksOutputToggle { gap: 5px; padding-inline: 2px 6px; color: var(--tita-ink-muted); font-size: 11px; font-weight: 650; }
223
+ .extractTasksOutputToggle:hover { color: var(--tita-ink); }
224
+ /* 第二段是「展开 / 收起」的补充说明:它是提示,不是按钮名,所以更轻。 */
225
+ .extractTasksOutputToggle > span { color: var(--tita-ink-faint); font-size: 10.5px; font-weight: 500; }
226
+ .extractTasksOutputToggle svg { transition: transform 140ms ease-out; }
227
+ .extractTasksOutputToggle[aria-expanded="true"] svg { transform: rotate(180deg); }
228
+ .extractTasksOutputBody { display: grid; gap: 8px; margin-top: 6px; }
229
+ .extractTasksOutputBody > p { margin: 0; color: var(--tita-ink-muted); font-size: 11px; line-height: 1.55; }
230
+ /* 模型原始返回:等宽、可滚、限高。**限高 320px** —— 它是底料,不是结论,
231
+ 但也不能矮到看不见上下文。 */
232
+ .extractTasksPre { margin: 0; max-height: 320px; overflow: auto; border-radius: 8px; background: var(--tita-surface-muted); padding: 11px 13px; color: var(--tita-ink); font-family: var(--tita-mono); font-size: 11.5px; line-height: 1.6; white-space: pre-wrap; overflow-wrap: anywhere; tab-size: 2; }
233
+ .extractTasksReportsInline { display: flex; flex-wrap: wrap; gap: 14px; }
234
+ .extractTasksLink { height: auto; padding-inline: 0; color: var(--tita-primary); font-size: 11px; font-weight: 500; text-decoration: underline; text-underline-offset: 2px; }
235
+ .extractTasksLink:hover { background: transparent; color: var(--tita-primary); }
236
+
237
+ /* ---- 右侧两栏:面板 */
238
+ .extractTasksPanel { min-width: 0; overflow: hidden; border: 1px solid var(--tita-line); border-radius: 10px; background: var(--tita-surface); }
239
+ .extractTasksPanelHead { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; border-bottom: 1px solid var(--tita-line); padding: 13px 15px 11px; }
240
+ .extractTasksPanelHead > div { min-width: 0; }
241
+ .extractTasksPanelHead h2 { margin: 0; color: var(--tita-ink); font-size: 13px; font-weight: 700; letter-spacing: -.01em; }
242
+ .extractTasksPanelHead p { margin: 3px 0 0; color: var(--tita-ink-muted); font-size: 11px; line-height: 1.5; }
243
+ .extractTasksPanelBody { min-width: 0; padding: 0 15px; }
244
+
245
+ /* ---- 处理范围
246
+ *
247
+ * 每一行原来是一枚「选择」按钮 + 名字 + 徽标:N 行就有 N 枚写着同一个词的按钮,
248
+ * 而真正要读的是那一行的名字。现在整行就是按钮,前面一枚方框表示选中
249
+ * (`aria-pressed` 与视觉同时成立,键盘 Tab 也走得通)。
250
+ */
251
+ .extractTasksScopeTab { margin-top: 12px; }
252
+ .extractTasksScopeNote { margin: 0 0 2px; color: var(--tita-ink-muted); font-size: 11px; line-height: 1.5; }
253
+ .extractTasksChoiceList { display: grid; max-height: 260px; overflow: auto; margin: 0; padding: 0; list-style: none; scrollbar-color: var(--tita-line-strong) transparent; scrollbar-width: thin; }
254
+ .extractTasksChoiceList > li { border-bottom: 1px solid var(--tita-line); }
255
+ .extractTasksChoiceList > li:last-child { border-bottom: 0; }
256
+ .extractTasksPick { display: flex; width: 100%; min-width: 0; align-items: center; gap: 9px; border: 0; border-radius: 7px; background: none; padding: 9px 4px 9px 2px; color: inherit; font: inherit; text-align: left; cursor: pointer; }
257
+ .extractTasksPick:hover { background: var(--tita-surface-muted); }
258
+ .extractTasksPick:focus-visible { outline: 2px solid var(--tita-focus-ring); outline-offset: 1px; }
259
+ .extractTasksPickBox { display: inline-flex; width: 14px; height: 14px; flex: 0 0 auto; align-items: center; justify-content: center; border: 1px solid var(--tita-line-strong); border-radius: 4px; background: var(--tita-surface); color: var(--tita-primary); }
260
+ .extractTasksPick[aria-pressed="true"] .extractTasksPickBox { border-color: var(--tita-primary); background: var(--tita-primary-soft); }
261
+ .extractTasksChoiceName { display: grid; min-width: 0; flex: 1 1 auto; gap: 2px; color: var(--tita-ink); font-size: 11.5px; line-height: 1.5; overflow-wrap: anywhere; }
262
+ .extractTasksChoiceName > span { color: var(--tita-ink-muted); font-size: 10.5px; }
263
+ .extractTasksChoiceName > span.extractTasksGroupReason { color: var(--tita-warning); }
264
+ .extractTasksChoiceName > strong { font-weight: 620; }
265
+ .extractTasksGroupList { max-height: 330px; }
266
+ .extractTasksScopeActions { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; border-top: 1px solid var(--tita-line); margin-top: 4px; padding: 10px 0 11px; }
267
+
268
+ /* ---- 运行记录
269
+ *
270
+ * 一行一条,不设左右两列:这一栏只有 316–420px,右侧再挂一排动作会把摘要压成三行。
271
+ * 所以身份 / 摘要 / 时间 / 动作四行顺着写下来,动作在最下面一行左对齐 ——
272
+ * 视线从「哪一段、跑成什么样」自然落到「还能对它做什么」。
273
+ */
274
+ .extractTaskRow { display: grid; gap: 5px; border-bottom: 1px solid var(--tita-line); padding: 12px 0; }
275
+ .extractTaskRow:last-of-type { border-bottom: 0; }
276
+ .extractTaskTitle { display: flex; min-width: 0; align-items: center; flex-wrap: wrap; gap: 7px; }
277
+ .extractTaskTitle strong { color: var(--tita-ink); font-size: 12px; font-weight: 680; }
278
+ .extractTaskSummary { margin: 0; color: var(--tita-ink-muted); font-size: 11px; line-height: 1.55; overflow-wrap: anywhere; }
279
+ .extractTaskTime { margin: 0; color: var(--tita-ink-faint); font-size: 10.5px; line-height: 1.5; overflow-wrap: anywhere; font-variant-numeric: tabular-nums; }
280
+ .extractTaskControls { display: flex; flex-wrap: wrap; align-items: center; gap: 5px; margin-top: 2px; }
281
+ .extractTaskStepToggle { gap: 4px; padding-inline: 6px; color: var(--tita-ink-muted); font-size: 10.5px; }
282
+ .extractTaskStepToggle[aria-expanded="true"] svg { transform: rotate(180deg); }
283
+ .extractTaskStepToggle svg { transition: transform 120ms ease-out; }
284
+ .extractTaskSteps { min-width: 0; }
285
+
286
+ /* ---- 窄屏 */
287
+ @media (max-width: 1080px) {
288
+ /* 两栏并排需要约 950px 才站得住(左栏 560 + 右栏 316 + 间隔)。再窄就把右栏落到下面 ——
289
+ 硬挤的结果是左栏的结论被压成一行两个字。 */
290
+ .extractTasksBody { grid-template-columns: minmax(0, 1fr); }
291
+ }
292
+
293
+ @media (max-width: 720px) {
294
+ .page-main { padding: 18px 16px 70px; }
295
+ .page-bar { padding-inline: 16px; }
296
+ .extractTasksHead { align-items: flex-start; }
297
+ /* 窄屏把步骤轨排成 2×2:四个节点横排时每个不到 90px,段名会被折成三行。
298
+ 箭头在这一档去掉 —— 网格的阅读顺序已经是 1→2→3→4,再画箭头只会插在两行之间空转。 */
299
+ .extractTasksRailList { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
300
+ .extractTasksRailArrow { display: none; }
301
+ .extractTasksStageIntro { flex-direction: column; }
302
+ .extractTasksFacts { grid-template-columns: minmax(0, 1fr); }
303
+ .extractTasksFacts > section + section { border-top: 1px solid var(--tita-line); border-left: 0; margin-top: 13px; padding-left: 0; }
304
+ .extractReportRow { flex-direction: column; gap: 4px; }
305
+ .extractReportMeta { white-space: normal; }
306
+ .extractTaskStepToggle { padding-inline: 0 4px; }
307
+ }
308
+
309
+ @media (max-width: 420px) {
310
+ .extractTasksFacts dl > div { grid-template-columns: 62px minmax(0, 1fr); gap: 8px; }
311
+ .extractTasksRailStep { padding: 9px 10px; }
312
+ }
313
+
314
+ @media (prefers-reduced-motion: reduce) {
315
+ .extractTasksRailStep, .extractTaskStepToggle svg, .extractTasksOutputToggle svg { transition: none; }
316
+ }
317
+
88
318
  /* ---------------------------------------------------------- attribution event guide
89
319
  *
90
320
  * 这是说明页,不是另一个业务面板。用一条主流程和几条细边界承载内容,避免把四个
@@ -105,8 +335,11 @@ body {
105
335
  .attributionGuideSectionHead { display: grid; gap: 3px; }
106
336
  .attributionGuideSectionHead h3 { margin: 0; color: var(--tita-ink); font-size: 16px; font-weight: 730; letter-spacing: -.018em; line-height: 1.35; }
107
337
  .attributionGuideSectionHead p:last-child { max-width: 72ch; margin: 0; color: var(--tita-ink-muted); font-size: 12px; line-height: 1.7; }
108
- .attributionGuidePipeline { display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr) auto minmax(0, 1fr) auto minmax(0, 1fr); align-items: center; gap: 9px; border: 1px solid var(--tita-line); border-radius: 14px; background: var(--tita-surface); padding: 18px 16px; }
109
- .attributionGuideNode { display: grid; min-width: 0; gap: 3px; border-left: 3px solid var(--tita-line-strong); padding: 2px 0 2px 11px; }
338
+ .attributionGuidePipeline { display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1.25fr) auto minmax(0, 1fr); align-items: center; gap: 9px; border: 1px solid var(--tita-line); border-radius: 14px; background: var(--tita-surface); padding: 18px 16px; }
339
+ .attributionGuideBranches { display: grid; gap: 10px; border: 1px dashed var(--tita-line-strong); border-radius: 12px; background: var(--tita-surface-muted); padding: 10px; }
340
+ /* 1px 发丝线,不是 3px 色条:这一页其余的分隔全是发丝线,一条 3px 的竖条会把它读成
341
+ 另一个东西(而且那是模板的记号)。段位身份色仍然在下面那枚小徽标上,没有丢。 */
342
+ .attributionGuideNode { display: grid; min-width: 0; gap: 3px; border-left: 1px solid var(--tita-line-strong); padding: 2px 0 2px 11px; }
110
343
  .attributionGuideNode-source { border-left-color: var(--tita-tone-blue); }
111
344
  .attributionGuideNode-event { border-left-color: var(--tita-tone-green); }
112
345
  .attributionGuideNode-knowledge { border-left-color: var(--tita-tone-violet); }
@@ -124,7 +357,8 @@ body {
124
357
  .attributionGuideRelations { display: flex; flex-wrap: wrap; gap: 8px 18px; border-top: 1px solid var(--tita-line); padding-top: 11px; color: var(--tita-ink-muted); font-size: 10.5px; }
125
358
  .attributionGuideRelations span { display: inline-flex; align-items: center; gap: 5px; }
126
359
  .attributionGuideRelations svg { color: var(--tita-primary); }
127
- .attributionGuideCaseIntro { display: flex; align-items: center; justify-content: space-between; gap: 14px; border-left: 3px solid var(--tita-tone-green); background: var(--tita-tone-green-tint); padding: 10px 13px; }
360
+ /* 底色留着(它说的是「这一块是案例」),竖条收成 1px。 */
361
+ .attributionGuideCaseIntro { display: flex; align-items: center; justify-content: space-between; gap: 14px; border-left: 1px solid var(--tita-tone-green); background: var(--tita-tone-green-tint); padding: 10px 13px; }
128
362
  .attributionGuideCaseIntro > div { display: grid; gap: 3px; }
129
363
  .attributionGuideLabel { color: var(--tita-ink-faint); font-family: var(--tita-mono); font-size: 9.5px; }
130
364
  .attributionGuideCaseIntro p { margin: 0; color: var(--tita-ink-muted); font-size: 10.5px; }
@@ -159,151 +393,251 @@ body {
159
393
 
160
394
  /* --------------------------------------------------------------- tab guide
161
395
  *
162
- * 五个 Tab 的说明汇总页。上面的 SVG 是导航,不是装饰:节点是可聚焦、可点击的真实
163
- * 交互元素;下面只保留当前节点的一份说明,避免把五套内容同时堆成卡片墙。
396
+ * 架构说明页(`/knowledge/pages/help/overview`)。
397
+ *
398
+ * 版式:**一条链路 = 画布上的一条工序带**,右边一列是当前环节的说明。
399
+ * 画布的构图纪律写在 `GuideArchitectureCanvas.tsx` 的文件头 —— 这里只管长相。
400
+ *
401
+ * 尺寸上的两条硬规矩,改版时最容易踩:
402
+ * 1. **视口高度不是 CSS 定的**,它由组件按缩放比例写在行内 style 上;进入全屏后由 CSS 接管,
403
+ * 让画布填满视口。
404
+ * 2. **卡片、牌子、带的位置全部由 `arch/model.ts` 算好写在行内 style 上**,
405
+ * 这里不许出现第二套坐标。
164
406
  */
165
- .tabGuide { display: grid; gap: 22px; }
166
- .tabGuideIntro { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: start; gap: 22px; border-bottom: 1px solid var(--tita-line); padding: 3px 0 20px; }
167
- .tabGuideEyebrow { margin: 0 0 4px; color: var(--tita-primary); font-size: 10px; font-weight: 760; letter-spacing: .08em; text-transform: uppercase; }
168
- .tabGuideIntro h2 { margin: 0; color: var(--tita-ink); font-size: 24px; font-weight: 760; letter-spacing: -.035em; line-height: 1.2; }
169
- .tabGuideIntro p:not(.tabGuideEyebrow) { max-width: 70ch; margin: 8px 0 0; color: var(--tita-ink-muted); font-size: 12.5px; line-height: 1.75; }
170
- .tabGuideIntroMeta { display: inline-flex; align-items: flex-start; gap: 8px; border-left: 1px solid var(--tita-line); padding: 4px 0 3px 16px; color: var(--tita-ink-muted); font-size: 10.5px; line-height: 1.55; }
171
- .tabGuideIntroMeta svg { flex: 0 0 auto; color: var(--tita-primary); }
172
- .tabGuideMap { overflow-x: auto; border: 1px solid var(--tita-line); border-radius: 14px; background: var(--tita-surface); padding: 17px 16px 13px; }
173
- .tabGuideSvg { display: block; width: 100%; min-width: 760px; height: auto; color: var(--tita-ink); }
174
- .tabGuideArchitectureSvg { display: block; width: 100%; min-width: 980px; height: auto; color: var(--tita-ink); }
175
- .tabGuideArchitectureBand { fill: var(--tita-surface-muted); stroke: var(--tita-line); stroke-width: 1; }
176
- .tabGuideArchitectureLegendTitle { fill: var(--tita-ink); font-family: var(--tita-font); font-size: 11px; font-weight: 760; }
177
- .tabGuideArchitectureLegendText, .tabGuideArchitectureLegendNote { fill: var(--tita-ink-faint); font-family: var(--tita-font); font-size: 9.5px; }
178
- .tabGuideArchitectureLegendNote { text-anchor: end; }
179
- .tabGuideArchitectureLegendLine { fill: none; stroke-linecap: round; stroke-width: 1.6; }
180
- .tabGuideArchitectureLegendLine-flow { stroke: var(--tita-ink-faint); }
181
- .tabGuideArchitectureLegendLine-cross { stroke: var(--tita-primary); }
182
- .tabGuideArchitectureLegendLine-feedback { stroke: var(--tita-primary); stroke-dasharray: 5 4; }
183
- .tabGuideArchitectureLaneBadge { fill: var(--tita-surface); stroke: var(--tita-line-strong); stroke-width: 1; }
184
- .tabGuideArchitectureLaneBadge-interaction { fill: var(--tita-tone-blue-tint); stroke: var(--tita-tone-blue-line); }
185
- .tabGuideArchitectureLaneBadge-knowledge { fill: var(--tita-tone-violet-tint); stroke: var(--tita-tone-violet-line); }
186
- .tabGuideArchitectureLaneBadge-evolution { fill: var(--tita-tone-amber-tint); stroke: var(--tita-tone-amber-line); }
187
- .tabGuideArchitectureLaneLabel { fill: var(--tita-ink); font-family: var(--tita-font); font-size: 12px; font-weight: 760; }
188
- .tabGuideArchitectureLaneNote { fill: var(--tita-ink-faint); font-family: var(--tita-mono); font-size: 9.5px; }
189
- .tabGuideArchitectureEdge { fill: none; stroke-linecap: round; stroke-linejoin: round; }
190
- .tabGuideArchitectureEdge-flow, .tabGuideArchitectureEdge-branch { stroke: var(--tita-ink-faint); }
191
- .tabGuideArchitectureEdge-inject, .tabGuideArchitectureEdge-collect { stroke: var(--tita-primary); }
192
- .tabGuideArchitectureEdge-feedback { stroke: var(--tita-primary); stroke-dasharray: 5 4; }
193
- .tabGuideArchitectureEdgeLabel { paint-order: stroke; stroke: var(--tita-surface); stroke-width: 5px; stroke-linejoin: round; fill: var(--tita-primary); font-family: var(--tita-font); font-size: 10px; font-weight: 720; text-anchor: middle; }
194
- .tabGuideArchitectureNode { cursor: pointer; outline: none; }
195
- .tabGuideArchitectureNodeRect { fill: var(--tita-surface); stroke: var(--tita-line-strong); stroke-width: 1.2; transition: fill .16s ease, stroke .16s ease, stroke-width .16s ease, filter .16s ease; }
196
- .tabGuideArchitectureNode:hover .tabGuideArchitectureNodeRect { fill: var(--tita-surface-muted); stroke: var(--tita-primary-line); }
197
- .tabGuideArchitectureNode:focus-visible .tabGuideArchitectureNodeRect { stroke: var(--tita-primary); stroke-width: 2; }
198
- .tabGuideArchitectureNodeSelected .tabGuideArchitectureNodeRect { fill: var(--tita-primary-soft); stroke: var(--tita-primary); stroke-width: 2; filter: drop-shadow(0 3px 7px rgb(15 23 42 / .1)); }
199
- .tabGuideArchitectureNodeTitle { fill: var(--tita-ink); font-family: var(--tita-font); font-size: 12.5px; font-weight: 760; }
200
- .tabGuideArchitectureNodeSubtitle { fill: var(--tita-ink-muted); font-family: var(--tita-font); font-size: 9.5px; }
201
- .tabGuideArchitectureNodeStatus { fill: var(--tita-ink-faint); font-family: var(--tita-font); font-size: 9px; }
202
- .tabGuideArchitectureProblemTitle { fill: var(--tita-ink); font-family: var(--tita-font); font-size: 12px; font-weight: 760; }
203
- .tabGuideArchitectureProblemNote { fill: var(--tita-ink-faint); font-family: var(--tita-mono); font-size: 9.5px; }
204
- .tabGuideArchitectureProblemRect { fill: var(--tita-surface); stroke: var(--tita-line-strong); stroke-width: 1; }
205
- .tabGuideArchitectureProblemIndex { fill: var(--tita-primary); font-family: var(--tita-mono); font-size: 10px; font-weight: 760; }
206
- .tabGuideArchitectureProblemLabel { fill: var(--tita-ink); font-family: var(--tita-font); font-size: 11px; font-weight: 720; }
207
- .tabGuideArchitectureProblemText, .tabGuideArchitectureProblemMeasure { fill: var(--tita-ink-muted); font-family: var(--tita-font); font-size: 9.5px; }
208
- .tabGuideModuleRail { display: grid; grid-template-columns: minmax(220px, .85fr) minmax(0, 1.7fr); align-items: center; gap: 20px; border-top: 1px solid var(--tita-line); border-bottom: 1px solid var(--tita-line); padding: 14px 0; }
209
- .tabGuideModuleRailCopy { margin: 3px 0 0; color: var(--tita-ink-muted); font-size: 11px; line-height: 1.55; }
210
- .tabGuideModuleButtons { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 7px; }
211
- .tabGuideModuleButtons button { gap: 5px; }
212
- .tabGuideModuleButtons svg { color: currentColor; }
213
- .tabGuideConceptRelation { display: grid; grid-template-columns: minmax(230px, .8fr) minmax(0, 1.8fr); align-items: center; gap: 22px; border: 1px solid var(--tita-primary-line); border-radius: 12px; background: var(--tita-primary-soft); padding: 16px 18px; }
407
+
408
+ .tabGuide { display: grid; gap: 20px; }
409
+ .tabGuideWorkbench { display: block; }
410
+ /* 左列只有画布,不吸顶:整图最高 1120px,比视口高 —— 吸顶会把下半张图钉在屏幕外。 */
411
+ .tabGuideCanvasColumn { display: grid; min-width: 0; gap: 14px; }
412
+
413
+ /* ---------------------------------------------------------------- 画布 */
414
+
415
+ .tabGuideCanvas { position: relative; display: flex; min-width: 0; min-height: 0; flex-direction: column; overflow: hidden; border: 1px solid var(--tita-line); border-radius: 12px; background: var(--tita-canvas); box-shadow: 0 1px 2px rgb(16 24 40 / .04); container-type: inline-size; }
416
+
417
+ /* 浮层:画布上只剩左上角这一排链路 Tab。它不占画布的设计尺寸。 */
418
+ .tabGuideCanvasOverlay { position: absolute; z-index: 2; top: 10px; left: 10px; display: flex; align-items: flex-start; gap: 12px; pointer-events: none; }
419
+ .tabGuideCanvasOverlay > * { pointer-events: auto; }
420
+
421
+ .tabGuideChainTabs .tita-uiTabsList { display: inline-flex; max-width: 100%; overflow-x: auto; border: 1px solid var(--tita-line); border-radius: 9px; background: color-mix(in srgb, var(--tita-surface) 93%, transparent); padding: 2px; box-shadow: 0 1px 2px rgb(16 24 40 / .05); backdrop-filter: blur(6px); scrollbar-width: none; }
422
+ .tabGuideChainTabs .tita-uiTabsList::-webkit-scrollbar { display: none; }
423
+ .tabGuideChainTabs .tita-uiTabsTrigger { min-height: 30px; border: 0; border-radius: 7px; padding-inline: 13px; font-size: 12px; }
424
+ .tabGuideChainTabs .tita-uiTabsTrigger[data-state='active'] { border-bottom-color: transparent; background: var(--tita-surface); box-shadow: 0 1px 2px rgb(15 23 42 / .12), inset 0 0 0 1px var(--tita-primary-shadow); }
425
+
426
+ /* **固定边框。** 高度由这里给,不跟缩放走 —— 缩放只动框里的内容。
427
+ 第一版把高度写成「板高 × 比例」,于是捏合时连边框一起长大/缩小,读起来像整页在动。
428
+
429
+ 高度取「视口高 - 顶栏 - 内边距 - 一行读法」,上下限兜住:太矮读不了图,太高会把
430
+ 一行读法挤出屏幕。滚动交给容器自己(滚到头会继续滚页面),**不要 `overscroll-behavior: contain`**
431
+ —— 那会把页面滚动锁在画布里。 */
432
+ .tabGuideCanvasViewport { position: relative; width: 100%; height: clamp(520px, calc(100vh - 124px), 1120px); overflow: auto; background: var(--tita-canvas); cursor: default; scrollbar-color: var(--tita-line-strong) transparent; touch-action: pan-x pan-y; }
433
+ .tabGuideCanvasViewport[data-pannable='true'] { cursor: grab; }
434
+ .tabGuideCanvasViewportPanning { cursor: grabbing !important; user-select: none; }
435
+
436
+ /* 板:设计尺寸 1172 × 902。缩放由 `transform` 承担 —— 比例是组件按裁剪区算的,
437
+ 不写进 CSS,避免两处各写一份。 */
438
+ .tabGuideCanvasFrame { position: absolute; overflow: hidden; }
439
+ .tabGuideCanvasBoard { position: relative; transform-origin: top left; }
440
+
441
+ /* 节点详情是画布内的 Inspector:右侧固定,内容独立滚动,不改变图的设计宽度。 */
442
+ .tabGuideInspector { position: absolute; z-index: 3; top: 58px; right: 12px; display: flex; width: min(380px, calc(100% - 24px)); max-height: calc(100% - 70px); flex-direction: column; overflow: hidden; border: 1px solid var(--tita-line); border-radius: 10px; background: color-mix(in srgb, var(--tita-surface) 97%, transparent); box-shadow: 0 12px 28px rgb(16 24 40 / .13); backdrop-filter: blur(5px); }
443
+ .tabGuideInspectorHeader { display: flex; flex: 0 0 auto; align-items: center; justify-content: space-between; gap: 10px; border-bottom: 1px solid var(--tita-line); padding: 9px 10px 9px 13px; color: var(--tita-ink); }
444
+ .tabGuideInspectorHeaderCopy { display: grid; gap: 2px; min-width: 0; }
445
+ .tabGuideInspectorHeaderCopy span { color: var(--tita-ink-faint); font-family: var(--tita-mono); font-size: 9px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; }
446
+ .tabGuideInspectorHeaderCopy strong { color: var(--tita-ink); font-size: 12px; font-weight: 750; }
447
+ .tabGuideInspectorBody { min-height: 0; overflow-y: auto; padding: 0 14px 18px; scrollbar-color: var(--tita-line-strong) transparent; }
448
+ .tabGuideInspectorBody .tabGuideDetailColumn { gap: 0; }
449
+ .tabGuideInspectorBody .tabGuideDetailColumn .tabGuideDetailGrid,
450
+ .tabGuideInspectorBody .tabGuideDetailColumn .tabGuideSections { grid-template-columns: minmax(0, 1fr); }
451
+ .tabGuideInspectorBody .tabGuideDetailColumn .tabGuideDefinitions > div { grid-template-columns: minmax(0, 1fr); gap: 3px; }
452
+ .tabGuideInspectorBody .tabGuideDetail { border: 0; border-radius: 0; background: transparent; padding: 15px 0 18px; box-shadow: none; }
453
+ .tabGuideInspectorBody .tabGuideConceptRelation { border-right: 0; border-left: 0; border-radius: 0; margin-inline: -14px; padding-inline: 14px; }
454
+
455
+ /* ---------------------------------------------------------------- 带与连线 */
456
+
457
+ .tabGuideBoardEdges { position: absolute; top: 0; left: 0; }
458
+ /* 带只是**底纹**,不是卡片:它的作用是让人一眼看出「这几张卡是一条链路上的」。
459
+ 所以它比画布底色只深一档,且不再铺满整屏(裁剪区有多高,它就有多高)。 */
460
+ .tabGuideBoardBand { fill: color-mix(in srgb, var(--tita-surface-muted) 62%, var(--tita-surface)); stroke: var(--tita-line); stroke-width: 1; }
461
+ .tabGuideBoardLaneBadge { fill: var(--tita-surface); stroke: var(--tita-line-strong); stroke-width: 1; }
462
+ .tabGuideBoardLaneBadge-interaction { fill: var(--tita-tone-blue-tint); stroke: var(--tita-tone-blue-line); }
463
+ .tabGuideBoardLaneBadge-knowledge { fill: var(--tita-tone-violet-tint); stroke: var(--tita-tone-violet-line); }
464
+ .tabGuideBoardLaneBadge-evolution { fill: var(--tita-tone-amber-tint); stroke: var(--tita-tone-amber-line); }
465
+ .tabGuideBoardLaneLabel { fill: var(--tita-ink); font-family: var(--tita-font); font-size: 11.5px; font-weight: 720; }
466
+ .tabGuideBoardLaneNote { fill: var(--tita-ink-muted); font-family: var(--tita-mono); font-size: 9.5px; }
467
+ .tabGuideBoardEdge { fill: none; stroke-linecap: round; stroke-linejoin: round; transition: opacity 180ms ease; }
468
+ /* 边标签压在通道上:白底靠 `paint-order: stroke` 描一圈画布色,而不是加一块矩形
469
+ —— 矩形会盖住底下那条线本身。 */
470
+ .tabGuideBoardEdgeLabel { fill: var(--tita-primary); font-family: var(--tita-font); font-size: 10px; font-weight: 700; text-anchor: middle; paint-order: stroke; stroke: var(--tita-canvas); stroke-width: 5px; stroke-linejoin: round; transition: opacity 180ms ease; }
471
+
472
+ /* ---------------------------------------------------------------- 环节卡片 */
473
+
474
+ .tabGuideCard { position: absolute; display: flex; box-sizing: border-box; flex-direction: column; gap: 5px; overflow: hidden; border: 1px solid var(--tita-line); border-radius: 8px; background: var(--tita-surface); padding: 10px 11px 9px; color: var(--tita-ink); font-family: var(--tita-font); text-align: left; cursor: pointer; box-shadow: 0 1px 2px rgb(16 24 40 / .04); transition: background 180ms ease, border-color 140ms ease, box-shadow 140ms ease; }
475
+ .tabGuideCard:hover { border-color: var(--tita-primary-line); box-shadow: 0 2px 8px rgb(16 24 40 / .09); }
476
+ .tabGuideCard:focus-visible { outline: 2px solid var(--tita-primary); outline-offset: 1px; }
477
+ .tabGuideCardSelected { border-color: var(--tita-primary); box-shadow: 0 0 0 3px var(--tita-primary-soft), 0 2px 8px rgb(16 24 40 / .09); }
478
+ /* 次级环节**不靠透明度**:0.14 的不透明文字是读不了的灰,而它们就在旁边,
479
+ 仍然是这张图的一部分。改成「无底 + 无描边 + 灰字」,白底 4.97:1、灰带 4.93:1。 */
480
+ /* 次级卡片:丢底、丢描边,**整体再压一档透明度**。
481
+ 只把字换成灰色是不够的 —— 边上那些线已经淡到 0.1,字还站在同一个深度上,
482
+ 看上去像「没亮的那些反而更清楚」。悬停恢复,因为点它就是要切过去。 */
483
+ .tabGuideCardDim { border-color: transparent; background: transparent; box-shadow: none; opacity: .42; transition: opacity 180ms ease; }
484
+ .tabGuideCardDim:hover, .tabGuideCardDim:focus-visible { opacity: 1; }
485
+ .tabGuideCardDim .tabGuideCardTitle,
486
+ .tabGuideCardDim .tabGuideCardSub,
487
+ .tabGuideCardDim .tabGuideCardStep { color: var(--tita-ink-faint); }
488
+ .tabGuideCardDim .tabGuideCardStep i { color: var(--tita-line-strong); }
489
+ .tabGuideCardDim .tabGuideCardDot { background: var(--tita-line-strong) !important; }
490
+ .tabGuideCardDim:hover { border-color: var(--tita-primary-line); background: var(--tita-surface); }
491
+ .tabGuideCardDim:hover .tabGuideCardTitle { color: var(--tita-ink); }
492
+ .tabGuideCardDim:hover .tabGuideCardSub,
493
+ .tabGuideCardDim:hover .tabGuideCardStep { color: var(--tita-ink-muted); }
494
+
495
+ .tabGuideCardHead { display: flex; min-width: 0; align-items: center; gap: 6px; }
496
+ .tabGuideCardDot { width: 6px; height: 6px; flex: 0 0 auto; border-radius: 999px; }
497
+ .tabGuideCardTitle { overflow: hidden; min-width: 0; font-size: 12.5px; font-weight: 650; line-height: 1.25; text-overflow: ellipsis; white-space: nowrap; }
498
+ /* 状态词带色,且**四档各有自己的色**:这张图是契约,做没做出来是第一信息。 */
499
+
500
+ .tabGuideCardSub { display: -webkit-box; overflow: hidden; color: var(--tita-ink-muted); font-size: 11px; line-height: 1.4; -webkit-box-orient: vertical; }
501
+ /* 步骤表:**编号 + 一条**。编号说明顺序,而顺序正是链路的意思。 */
502
+ .tabGuideCardSteps { display: flex; min-height: 0; flex-direction: column; overflow: hidden; }
503
+ .tabGuideCardStep { display: flex; align-items: baseline; gap: 6px; overflow: hidden; color: var(--tita-ink-muted); font-size: 10.5px; line-height: 13.5px; white-space: nowrap; }
504
+ .tabGuideCardStep > i { flex: 0 0 auto; width: 9px; color: var(--tita-primary); font-family: var(--tita-mono); font-size: 9px; font-style: normal; font-weight: 700; text-align: right; }
505
+ .tabGuideCardStep[data-state='partial'] > i { color: var(--tita-tone-amber); }
506
+ .tabGuideCardStep[data-state='todo'],
507
+ .tabGuideCardStep[data-state='todo'] > i { color: var(--tita-ink-faint); }
508
+ .tabGuideCardStepRest { color: var(--tita-ink-faint); font-style: italic; }
509
+
510
+ /* ---------------------------------------------------------------- 右列 */
511
+
512
+ .tabGuideDetailColumn { display: grid; min-width: 0; gap: 14px; }
513
+ /* 右列只有 340–400px:详情里那两组两栏网格在这里会被挤成两条窄柱,一律改成单栏。
514
+ 宽度再窄(≤1180px)时两栏工作台已经叠起来,那时再放开成两栏。 */
515
+ .tabGuideDetailColumn .tabGuideDetailGrid, .tabGuideDetailColumn .tabGuideSections { grid-template-columns: minmax(0, 1fr); }
516
+ /* 对象关系图在 400px 的右列里:三个节点 + 两支箭头要挤进一行,
517
+ 否则「Document → Knowledge → WikiCard」会折成两行,链路就读断了。 */
518
+ .tabGuideDetailColumn .tabGuideDefinitions > div { grid-template-columns: minmax(0, 1fr); gap: 3px; }
519
+
520
+ /* 环节轨:这条链路有哪几环,点一下就走过去。它回答画布回答不了的那个问题 ——
521
+ 画布上一条链路是空间关系,「我现在读的是第几环」是顺序关系。 */
522
+ .tabGuideChainRail { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; border: 1px solid var(--tita-line); border-radius: 10px; background: var(--tita-surface); padding: 9px 12px; }
523
+ .tabGuideChainRailHead { color: var(--tita-ink-faint); font-size: 10px; font-weight: 700; letter-spacing: .06em; }
524
+ .tabGuideChainRail ol { display: flex; flex-wrap: wrap; align-items: center; gap: 3px; margin: 0; padding: 0; list-style: none; }
525
+ .tabGuideChainRail li { display: flex; align-items: center; }
526
+ .tabGuideChainRail li + li::before { content: '›'; margin-right: 3px; color: var(--tita-ink-faint); font-size: 11px; }
527
+ .tabGuideChainRailStep { display: inline-flex; align-items: center; gap: 5px; border: 1px solid transparent; border-radius: 7px; background: transparent; padding: 3px 7px; color: var(--tita-ink-muted); font: inherit; font-size: 11px; cursor: pointer; transition: background 140ms ease, color 140ms ease, border-color 140ms ease; }
528
+ .tabGuideChainRailStep:hover { background: var(--tita-surface-muted); color: var(--tita-ink); }
529
+ .tabGuideChainRailStep:focus-visible { outline: 2px solid var(--tita-focus-ring); outline-offset: 1px; }
530
+ .tabGuideChainRailStep[aria-pressed='true'] { border-color: var(--tita-primary-line); background: var(--tita-primary-soft); color: var(--tita-primary); font-weight: 650; }
531
+ .tabGuideChainRailIndex { color: var(--tita-ink-faint); font-family: var(--tita-mono); font-size: 9.5px; font-variant-numeric: tabular-nums; }
532
+ .tabGuideChainRailStep[aria-pressed='true'] .tabGuideChainRailIndex { color: var(--tita-primary); }
533
+
534
+ /* ---------------------------------------------------------------- 详情 */
535
+
536
+ /* 对象关系图。**它只出现在 380px 的 Inspector 里**,所以版面按窄栏定:
537
+ 上面一段话、下面两行节点。三个节点挤一行是硬要求 —— 折成两行就把链路读断了。 */
538
+ .tabGuideConceptRelation { display: grid; grid-template-columns: minmax(0, 1fr); gap: 12px; border: 1px solid var(--tita-primary-line); border-radius: 12px; background: var(--tita-primary-soft); padding: 14px 15px; }
214
539
  .tabGuideConceptRelationIntro h3 { margin: 0; color: var(--tita-ink); font-size: 14px; font-weight: 760; line-height: 1.35; }
215
540
  .tabGuideConceptRelationIntro p:last-child { margin: 7px 0 0; color: var(--tita-ink-muted); font-size: 11px; line-height: 1.65; }
216
541
  .tabGuideRelationFlow { min-width: 0; }
217
- .tabGuideRelationRow { display: flex; align-items: center; justify-content: center; gap: 9px; }
218
- .tabGuideRelationNode { display: inline-flex; height: auto; min-width: 102px; flex-direction: column; align-items: flex-start; gap: 1px; border-color: var(--tita-primary-line); padding: 7px 10px; }
219
- .tabGuideRelationNode span { color: currentColor; font-family: var(--tita-mono); font-size: 10.5px; font-weight: 760; }
542
+ .tabGuideRelationRow { display: flex; flex-wrap: nowrap; align-items: center; justify-content: flex-start; gap: 6px; }
543
+ .tabGuideRelationNode { display: inline-flex; height: auto; min-width: 0; flex: 1 1 0; flex-direction: column; align-items: flex-start; gap: 1px; border-color: var(--tita-primary-line); padding: 6px 8px; }
544
+ .tabGuideRelationNode span { color: currentColor; font-family: var(--tita-mono); font-size: 9.5px; font-weight: 760; }
220
545
  .tabGuideRelationNode small { color: var(--tita-ink-muted); font-size: 9px; font-weight: 500; line-height: 1.3; }
221
546
  .tabGuideRelationNode[aria-pressed="true"] small { color: inherit; opacity: .78; }
222
- .tabGuideRelationArrow { flex: 0 0 auto; color: var(--tita-primary); }
223
- .tabGuideRelationBranch { display: flex; align-items: center; justify-content: center; gap: 6px; margin: 5px 0; color: var(--tita-primary); font-size: 9.5px; font-weight: 700; }
224
- .tabGuideRelationRowEvent { justify-content: center; }
225
- .tabGuideRelationFootnote { margin: 9px 0 0; color: var(--tita-ink-faint); font-size: 10px; line-height: 1.5; text-align: center; }
226
- .tabGuideDefinitionBlock { border-bottom: 1px solid var(--tita-line); padding: 14px 0 2px; }
547
+ .tabGuideRelationArrow { width: 12px; flex: 0 0 auto; color: var(--tita-primary); }
548
+ .tabGuideRelationBranch { display: flex; align-items: center; justify-content: flex-start; gap: 6px; margin: 5px 0; padding-left: 40px; color: var(--tita-primary); font-size: 9.5px; font-weight: 700; }
549
+ .tabGuideRelationFootnote { margin: 9px 0 0; color: var(--tita-ink-faint); font-size: 10px; line-height: 1.5; text-align: left; }
550
+
551
+ /* 说明卡:一张卡、几条发丝线,不再是一摞小方块。 */
552
+ .tabGuideDetail { scroll-margin-top: 74px; border: 1px solid var(--tita-line); border-radius: 12px; background: var(--tita-surface); padding: 18px 20px 20px; box-shadow: 0 1px 2px rgb(16 24 40 / .04); }
553
+ .tabGuideDetailHeader { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: start; gap: 12px; }
554
+ .tabGuideDetailIcon { display: inline-flex; width: 36px; height: 36px; align-items: center; justify-content: center; border: 1px solid var(--tita-primary-line); border-radius: 10px; background: var(--tita-primary-soft); color: var(--tita-primary); }
555
+ .tabGuideDetailIcon-knowledge { color: var(--tita-tone-violet); background: var(--tita-tone-violet-tint); border-color: var(--tita-tone-violet-line); }
556
+ .tabGuideDetailIcon-attribution { color: var(--tita-tone-green); background: var(--tita-tone-green-tint); border-color: var(--tita-tone-green-line); }
557
+ .tabGuideDetailIcon-memory { color: var(--tita-tone-amber); background: var(--tita-tone-amber-tint); border-color: var(--tita-tone-amber-line); }
558
+ .tabGuideDetailIcon-eval { color: var(--tita-tone-blue); background: var(--tita-tone-blue-tint); border-color: var(--tita-tone-blue-line); }
559
+ .tabGuideDetailHeader h2 { margin: 0; color: var(--tita-ink); font-size: 18px; font-weight: 740; letter-spacing: -.025em; line-height: 1.25; }
560
+ .tabGuideDetailSubtitle { margin: 3px 0 0; color: var(--tita-ink-muted); font-size: 11.5px; line-height: 1.5; }
561
+ /* 链路归属:一枚身份色圆点 + 链路名。颜色由行内 style 给(链路身份色在 model.ts 里)。 */
562
+ .tabGuideDetailLane { display: inline-flex; align-items: center; gap: 5px; margin-top: 6px; color: var(--tita-ink-faint); font-size: 10px; }
563
+ .tabGuideDetailLane > i { width: 6px; height: 6px; border-radius: 999px; }
564
+ .tabGuideDetailLaneConcept { color: var(--tita-ink-faint); }
227
565
  .tabGuideDefinitionLabel { margin: 0; color: var(--tita-primary); font-family: var(--tita-mono); font-size: 10px; font-weight: 760; letter-spacing: .06em; }
228
- .tabGuideDetailGrid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 28px; border-bottom: 1px solid var(--tita-line); }
229
- .tabGuideLogicSection { min-width: 0; padding: 15px 0 13px; }
230
- .tabGuideLogicSection h3 { margin: 0 0 8px; color: var(--tita-ink); font-size: 12.5px; font-weight: 720; }
566
+ .tabGuideSummary { margin: 0; color: var(--tita-ink-muted); font-size: 12px; line-height: 1.75; }
567
+ .tabGuideDefinitionBlock { display: grid; gap: 7px; border-bottom: 1px solid var(--tita-line); padding: 15px 0 15px; }
568
+ /* 输入 → 输出:并排两格,中间一支箭头。竖着堆会把这段拉成两行半高,
569
+ 而它只是「凭什么能工作」的一句话。 */
570
+ .tabGuideFacts { display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); align-items: center; gap: 10px; border-bottom: 1px solid var(--tita-line); padding: 13px 0; }
571
+ .tabGuideDetailColumn .tabGuideFacts { grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); }
572
+ .tabGuideFacts > div { display: grid; min-width: 0; gap: 3px; }
573
+ .tabGuideFacts > svg { flex: 0 0 auto; color: var(--tita-ink-faint); }
574
+ .tabGuideDetailColumn .tabGuideFacts > svg { transform: none; }
575
+ .tabGuideFacts span { color: var(--tita-ink-faint); font-size: 9.5px; font-weight: 700; letter-spacing: .06em; }
576
+ .tabGuideFacts strong { color: var(--tita-ink); font-family: var(--tita-mono); font-size: 10.5px; font-weight: 650; line-height: 1.5; }
577
+ .tabGuideDetailGrid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 28px; }
578
+ .tabGuideLogicSection { min-width: 0; border-bottom: 1px solid var(--tita-line); padding: 15px 0 14px; }
579
+ .tabGuideLogicSection h3 { margin: 0 0 10px; color: var(--tita-ink); font-size: 12.5px; font-weight: 720; }
231
580
  .tabGuideStatusNote { margin: 0; color: var(--tita-ink-muted); font-size: 11.5px; line-height: 1.7; }
232
- .tabGuideStepList { display: grid; gap: 10px; margin: 0; padding: 0; list-style: none; }
233
- .tabGuideStep { display: grid; grid-template-columns: 17px minmax(0, 1fr); gap: 7px; align-items: start; color: var(--tita-tone-green); }
581
+ /* 步骤是一条时间线:图标列下面拉一条发丝线,把「先后」画出来。 */
582
+ .tabGuideStepList { display: grid; gap: 11px; margin: 0; padding: 0; list-style: none; }
583
+ .tabGuideStep { position: relative; display: grid; grid-template-columns: 16px minmax(0, 1fr); gap: 8px; align-items: start; color: var(--tita-tone-green); }
584
+ .tabGuideStep:not(:last-child)::after { content: ''; position: absolute; top: 18px; bottom: -11px; left: 7px; width: 1px; background: var(--tita-line); }
234
585
  .tabGuideStep-partial { color: var(--tita-tone-amber); }
235
586
  .tabGuideStep-todo { color: var(--tita-ink-faint); }
236
587
  .tabGuideStep > span { display: grid; gap: 2px; }
237
588
  .tabGuideStep strong { color: var(--tita-ink); font-size: 11px; font-weight: 700; line-height: 1.45; }
238
589
  .tabGuideStep small { color: var(--tita-ink-muted); font-size: 10.5px; line-height: 1.55; }
239
- .tabGuideBand { fill: var(--tita-surface-muted); stroke: var(--tita-line); stroke-width: 1; }
240
- .tabGuideLaneLabel { fill: var(--tita-ink-faint); font-family: var(--tita-font); font-size: 11px; font-weight: 700; letter-spacing: .02em; }
241
- .tabGuideConnector { fill: none; stroke: var(--tita-line-strong); stroke-width: 1.4; }
242
- .tabGuideConnectorCross { stroke: var(--tita-primary); stroke-width: 1.6; }
243
- .tabGuideConnectorFeedback { stroke: var(--tita-ink-faint); stroke-dasharray: 5 5; stroke-width: 1.4; }
244
- .tabGuideConnectorLabel { fill: var(--tita-ink-faint); font-family: var(--tita-font); font-size: 10px; text-anchor: middle; }
245
- .tabGuideNode { cursor: pointer; outline: none; }
246
- .tabGuideNodeRect { fill: var(--tita-surface); stroke: var(--tita-line-strong); stroke-width: 1.2; transition: fill .16s ease, stroke .16s ease, stroke-width .16s ease, filter .16s ease; }
247
- .tabGuideNode:hover .tabGuideNodeRect { fill: var(--tita-surface-muted); stroke: var(--tita-primary-line); }
248
- .tabGuideNode:focus-visible .tabGuideNodeRect { stroke: var(--tita-primary); stroke-width: 2; }
249
- .tabGuideNodeSelected .tabGuideNodeRect { fill: var(--tita-primary-soft); stroke: var(--tita-primary); stroke-width: 2; filter: drop-shadow(0 3px 7px rgb(15 23 42 / .09)); }
250
- .tabGuideNodeTitle { fill: var(--tita-ink); font-family: var(--tita-font); font-size: 16px; font-weight: 760; }
251
- .tabGuideNodeSubtitle { fill: var(--tita-ink-muted); font-family: var(--tita-font); font-size: 11px; }
252
- .tabGuideNodeAction { fill: var(--tita-primary); font-family: var(--tita-font); font-size: 10px; font-weight: 700; opacity: .78; }
253
- .tabGuideNodeSelected .tabGuideNodeAction { opacity: 1; }
254
- .tabGuideNode-intent .tabGuideNodeRect { stroke: var(--tita-tone-blue-line); }
255
- .tabGuideNode-knowledge .tabGuideNodeRect { stroke: var(--tita-tone-violet-line); }
256
- .tabGuideNode-attribution .tabGuideNodeRect { stroke: var(--tita-tone-green-line); }
257
- .tabGuideNode-memory .tabGuideNodeRect { stroke: var(--tita-tone-amber-line); }
258
- .tabGuideNode-eval .tabGuideNodeRect { stroke: var(--tita-tone-blue-line); }
259
- .tabGuideNodeSelected .tabGuideNodeRect { stroke: var(--tita-primary); }
260
- .tabGuideStaticNode { pointer-events: none; }
261
- .tabGuideStaticNodeRect { fill: var(--tita-surface); stroke: var(--tita-line-strong); stroke-width: 1.1; }
262
- .tabGuideStaticNode-document .tabGuideStaticNodeRect { stroke: var(--tita-tone-blue-line); }
263
- .tabGuideStaticNode-card .tabGuideStaticNodeRect { stroke: var(--tita-tone-green-line); }
264
- .tabGuideStaticNode-event .tabGuideStaticNodeRect { stroke: var(--tita-tone-amber-line); }
265
- .tabGuideStaticNodeTitle { fill: var(--tita-ink); font-family: var(--tita-font); font-size: 15px; font-weight: 720; }
266
- .tabGuideStaticNodeSubtitle { fill: var(--tita-ink-muted); font-family: var(--tita-font); font-size: 10.5px; }
267
- .tabGuideMapHint { display: flex; align-items: center; gap: 7px; margin: -9px 0 0; color: var(--tita-ink-faint); font-size: 10.5px; }
268
- .tabGuideHintDot { display: inline-block; width: 7px; height: 7px; border: 2px solid var(--tita-primary); border-radius: 999px; }
269
- .tabGuideDetail { scroll-margin-top: 70px; border-top: 2px solid var(--tita-primary); background: var(--tita-surface); padding: 20px 22px 22px; }
270
- .tabGuideDetailHeader { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: start; gap: 13px; }
271
- .tabGuideDetailIcon { display: inline-flex; width: 40px; height: 40px; align-items: center; justify-content: center; border: 1px solid var(--tita-primary-line); border-radius: 11px; background: var(--tita-primary-soft); color: var(--tita-primary); }
272
- .tabGuideDetailIcon-knowledge { color: var(--tita-tone-violet); background: var(--tita-tone-violet-tint); border-color: var(--tita-tone-violet-line); }
273
- .tabGuideDetailIcon-attribution { color: var(--tita-tone-green); background: var(--tita-tone-green-tint); border-color: var(--tita-tone-green-line); }
274
- .tabGuideDetailIcon-memory { color: var(--tita-tone-amber); background: var(--tita-tone-amber-tint); border-color: var(--tita-tone-amber-line); }
275
- .tabGuideDetailIcon-eval { color: var(--tita-tone-blue); background: var(--tita-tone-blue-tint); border-color: var(--tita-tone-blue-line); }
276
- .tabGuideDetailHeader .tabGuideEyebrow { margin-bottom: 2px; }
277
- .tabGuideDetailHeader h2 { margin: 0; color: var(--tita-ink); font-size: 20px; font-weight: 750; letter-spacing: -.025em; line-height: 1.25; }
278
- .tabGuideDetailSubtitle { margin: 2px 0 0; color: var(--tita-ink-muted); font-size: 11.5px; }
279
- .tabGuideDetailState { display: inline-flex; align-items: center; gap: 5px; color: var(--tita-tone-green); font-size: 10.5px; white-space: nowrap; }
280
- .tabGuideSummary { max-width: 72ch; margin: 16px 0 14px; color: var(--tita-ink-muted); font-size: 12px; line-height: 1.75; }
281
- .tabGuideFacts { display: flex; align-items: center; gap: 13px; border-top: 1px solid var(--tita-line); border-bottom: 1px solid var(--tita-line); padding: 13px 0; }
282
- .tabGuideFacts > div { display: grid; min-width: 0; gap: 3px; }
283
- .tabGuideFacts > div:first-child { flex: 1 1 0; }
284
- .tabGuideFacts > div:last-child { flex: 1.2 1 0; }
285
- .tabGuideFacts > svg { flex: 0 0 auto; color: var(--tita-primary); }
286
- .tabGuideFacts span { color: var(--tita-ink-faint); font-size: 10px; }
287
- .tabGuideFacts strong { color: var(--tita-ink); font-family: var(--tita-mono); font-size: 10.5px; font-weight: 650; line-height: 1.5; }
288
590
  .tabGuideSections { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 28px; }
289
- .tabGuideSection { border-bottom: 1px solid var(--tita-line); padding: 15px 0 13px; }
591
+ .tabGuideSection { border-bottom: 1px solid var(--tita-line); padding: 15px 0 14px; }
290
592
  .tabGuideSectionWide { grid-column: 1 / -1; }
291
- .tabGuideSection h3 { margin: 0 0 7px; color: var(--tita-ink); font-size: 12.5px; font-weight: 720; }
292
- .tabGuideDefinitions { display: grid; margin: 0; border-top: 1px solid var(--tita-line); }
593
+ .tabGuideSections > .tabGuideSection:last-child { border-bottom: 0; padding-bottom: 0; }
594
+ .tabGuideSection h3 { margin: 0 0 8px; color: var(--tita-ink); font-size: 12.5px; font-weight: 720; }
595
+ .tabGuideDefinitions { display: grid; margin: 0; }
293
596
  .tabGuideDefinitions > div { display: grid; grid-template-columns: 112px minmax(0, 1fr); gap: 13px; align-items: baseline; border-bottom: 1px solid var(--tita-line); padding: 9px 0; }
597
+ .tabGuideDefinitions > div:last-child { border-bottom: 0; padding-bottom: 0; }
294
598
  .tabGuideDefinitions dt { color: var(--tita-primary); font-family: var(--tita-mono); font-size: 10.5px; font-weight: 700; }
295
599
  .tabGuideDefinitions dd { margin: 0; color: var(--tita-ink-muted); font-size: 11.5px; line-height: 1.65; }
600
+ /* 长提示词先折起来:380px 的栏里整段铺开会占掉好几屏,而它是参考材料不是正文。 */
601
+ .tabGuidePromptDetails { border: 1px solid var(--tita-line); border-radius: 8px; background: var(--tita-surface-muted); }
602
+ .tabGuidePromptDetails > summary { cursor: pointer; padding: 9px 13px; color: var(--tita-primary); font-size: 11px; font-weight: 650; list-style: none; }
603
+ .tabGuidePromptDetails > summary::-webkit-details-marker { display: none; }
604
+ .tabGuidePromptDetails > summary::before { content: '▸'; display: inline-block; width: 14px; color: var(--tita-ink-faint); }
605
+ .tabGuidePromptDetails[open] > summary { border-bottom: 1px solid var(--tita-line); }
606
+ .tabGuidePromptDetails[open] > summary::before { content: '▾'; }
607
+ .tabGuidePromptDetails > summary:hover { color: var(--tita-primary-hover); }
608
+ .tabGuidePromptDetails > summary:focus-visible { outline: 2px solid var(--tita-focus-ring); outline-offset: -2px; }
609
+ .tabGuidePromptDetails .tabGuidePrompt { border: 0; border-radius: 0; background: transparent; }
610
+
296
611
  .tabGuidePrompt { overflow-x: auto; margin: 0; border: 1px solid var(--tita-line); border-radius: 8px; background: var(--tita-surface-muted); padding: 13px 14px; color: var(--tita-ink); font-family: var(--tita-mono); font-size: 10.5px; line-height: 1.7; white-space: pre-wrap; }
297
612
  .tabGuidePrompt + ul { margin-top: 9px; }
298
613
  .tabGuideSection ul { display: grid; gap: 6px; margin: 0; padding: 0 0 0 17px; color: var(--tita-ink-muted); font-size: 11.5px; line-height: 1.65; }
299
614
  .tabGuideSection li::marker { color: var(--tita-primary); }
300
615
 
616
+ /* 两栏放不下时**叠成一栏**:画布拿到整幅宽度,说明落到它下面。
617
+ 断点取 1520 而不是 1180:左列要装下 1172px 宽的整图,窄于 1520 时两栏会让图缩到
618
+ 「一眼看全但读不出步骤」,那还不如叠起来。 */
619
+ @media (max-width: 1520px) {
620
+ .tabGuideDetailColumn .tabGuideDetailGrid, .tabGuideDetailColumn .tabGuideSections { grid-template-columns: repeat(2, minmax(0, 1fr)); }
621
+ .tabGuideDetailColumn .tabGuideDefinitions > div { grid-template-columns: 112px minmax(0, 1fr); gap: 13px; }
622
+ }
623
+
624
+ /* 窄到放不下「图 + 右栏」时,Inspector **落到画布下面**,不再浮在图上。
625
+ 阈值与组件里的 `BESIDE_MIN_WIDTH` 是同一个数,两处必须一起改。 */
626
+ @container (max-width: 1100px) {
627
+ .tabGuideInspector { position: static; width: auto; max-height: none; margin: 0 14px 14px; box-shadow: none; }
628
+ .tabGuideInspectorBody { overflow: visible; }
629
+ }
630
+
631
+ @media (max-width: 820px) {
632
+ .tabGuideDetailColumn .tabGuideDetailGrid, .tabGuideDetailColumn .tabGuideSections { grid-template-columns: minmax(0, 1fr); }
633
+ .tabGuideDetailColumn .tabGuideDefinitions > div { grid-template-columns: minmax(0, 1fr); gap: 3px; }
634
+ }
635
+
301
636
  @media (max-width: 820px) {
302
637
  .attributionGuideIntro { grid-template-columns: auto minmax(0, 1fr); }
303
638
  .attributionGuideFormula { grid-column: 2; justify-items: start; text-align: left; }
304
- .attributionGuidePipeline { grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); }
305
- .attributionGuidePipeline > :nth-child(6) { display: none; }
306
- .attributionGuidePipeline > :nth-child(7) { grid-column: 2 / 4; }
639
+ .attributionGuidePipeline { grid-template-columns: 1fr; gap: 12px; }
640
+ .attributionGuidePipeline > .attributionGuideConnector svg { transform: rotate(90deg); }
307
641
  .attributionGuideField { grid-template-columns: 90px minmax(0, 1fr); gap: 5px 12px; }
308
642
  .attributionGuideField span { grid-column: 2; }
309
643
  }
@@ -314,9 +648,7 @@ body {
314
648
  .attributionGuideFormula { grid-column: auto; }
315
649
  .attributionGuideIntroCopy h2 { font-size: 19px; }
316
650
  .attributionGuidePipeline { grid-template-columns: 1fr; gap: 12px; padding: 14px; }
317
- .attributionGuidePipeline > :nth-child(2), .attributionGuidePipeline > :nth-child(4), .attributionGuidePipeline > :nth-child(6) { display: grid; transform: none; }
318
651
  .attributionGuidePipeline > .attributionGuideConnector svg { transform: rotate(90deg); }
319
- .attributionGuidePipeline > :nth-child(7) { grid-column: auto; }
320
652
  .attributionGuideConnector span { width: auto; }
321
653
  .attributionGuideRelations { display: grid; }
322
654
  .attributionGuideCaseIntro { display: grid; gap: 7px; }
@@ -424,25 +756,17 @@ body {
424
756
  @media (max-width: 760px) {
425
757
  .page-main { padding-inline: 20px; }
426
758
  .page-bar { padding-inline: 20px; }
427
- .tabGuideIntro { grid-template-columns: 1fr; gap: 12px; }
428
- .tabGuideIntroMeta { border-top: 1px solid var(--tita-line); border-left: 0; padding: 11px 0 0; }
429
759
  .tabGuideDetail { padding-inline: 17px; }
430
- .tabGuideConceptRelation { grid-template-columns: 1fr; gap: 13px; }
431
- .tabGuideConceptRelationIntro { max-width: 62ch; }
432
- .tabGuideModuleRail { grid-template-columns: 1fr; gap: 11px; }
433
- .tabGuideModuleButtons { justify-content: flex-start; }
434
760
  .trialPageIntro { grid-template-columns: auto minmax(0, 1fr); }
435
761
  .trialPageBoundary { grid-column: 2; justify-items: start; padding-top: 0; text-align: left; }
436
762
  .trialEmptyState { grid-template-columns: 1fr; gap: 16px; }
437
763
  }
438
764
 
765
+
439
766
  @media (max-width: 560px) {
440
767
  .page-main { padding: 20px 14px 90px; }
441
768
  .page-bar { padding: 11px 14px; }
442
- .tabGuideIntro h2 { font-size: 21px; }
443
- .tabGuideMap { margin-inline: -2px; padding-inline: 10px; }
444
769
  .tabGuideDetailHeader { grid-template-columns: auto minmax(0, 1fr); }
445
- .tabGuideDetailState { grid-column: 2; }
446
770
  .tabGuideDetailGrid { grid-template-columns: 1fr; }
447
771
  .tabGuideFacts { align-items: stretch; flex-direction: column; gap: 8px; }
448
772
  .tabGuideFacts > svg { display: none; }