@azure-id/orc 1.9.1 → 2.0.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 (224) hide show
  1. package/CHANGELOG.md +390 -0
  2. package/README-id.md +20 -36
  3. package/README.md +24 -34
  4. package/bin/build-agents.js +206 -109
  5. package/bin/cli.js +760 -62
  6. package/bin/gotcha-import.js +1081 -0
  7. package/bin/gotcha.js +1286 -0
  8. package/bin/graph-query.js +1 -1
  9. package/bin/graph.js +717 -717
  10. package/bin/habit.js +1453 -0
  11. package/bin/mockrun-catalog.js +281 -276
  12. package/bin/onboarding-content.js +4 -4
  13. package/bin/pricing.json +207 -200
  14. package/bin/run-undo.js +398 -0
  15. package/bin/trace-write.js +657 -0
  16. package/bin/verify-contracts.js +527 -81
  17. package/bin/verify-package.js +58 -11
  18. package/bin/webui/api.js +26 -0
  19. package/bin/webui/app.html +239 -232
  20. package/bin/webui/css/00-tokens.css +110 -92
  21. package/bin/webui/css/04-motion.css +249 -152
  22. package/bin/webui/css/06-responsive.css +203 -178
  23. package/bin/webui/css/panels/behaviour.css +205 -0
  24. package/bin/webui/css/panels/knowledge.css +563 -116
  25. package/bin/webui/fixtures/behaviour.js +532 -0
  26. package/bin/webui/fixtures/extra.js +2036 -2036
  27. package/bin/webui/fixtures/hookui.js +5 -5
  28. package/bin/webui/fixtures/index.js +34 -0
  29. package/bin/webui/fixtures/knowledge.js +7 -1
  30. package/bin/webui/fixtures/settings.js +305 -305
  31. package/bin/webui/fixtures/stats.js +16 -0
  32. package/bin/webui/i18n/en/behaviour.json +143 -0
  33. package/bin/webui/i18n/en/knowledge.json +117 -2
  34. package/bin/webui/i18n/en/nav.json +25 -24
  35. package/bin/webui/i18n/en/tour.json +37 -35
  36. package/bin/webui/i18n/id/behaviour.json +143 -0
  37. package/bin/webui/i18n/id/knowledge.json +117 -2
  38. package/bin/webui/i18n/id/nav.json +25 -24
  39. package/bin/webui/i18n/id/tour.json +37 -35
  40. package/bin/webui/js/01-i18n.js +155 -154
  41. package/bin/webui/js/90-tour.js +498 -494
  42. package/bin/webui/js/91-shortcuts.js +126 -126
  43. package/bin/webui/js/99-boot.js +121 -118
  44. package/bin/webui/js/panels/behaviour.js +1022 -0
  45. package/bin/webui/js/panels/knowledge.js +552 -7
  46. package/bin/webui/js/panels/overview.js +13 -4
  47. package/mock-run/INDEX.md +109 -107
  48. package/mock-run/context-combiner.md +100 -100
  49. package/mock-run/gotcha-import.md +118 -0
  50. package/mock-run/habits.md +129 -0
  51. package/mock-run/orc-budget.md +534 -534
  52. package/mock-run/orc-challenge-council.md +262 -262
  53. package/mock-run/orc-quick.md +6 -1
  54. package/mock-run/orc-ultra.md +103 -103
  55. package/package.json +1 -1
  56. package/templates/agents/MODEL-MAPPING.md +49 -49
  57. package/templates/agents/orc-advisor-opus-5-xhigh.md +50 -56
  58. package/templates/agents/orc-analyze-mini-opus-5-med.md +55 -60
  59. package/templates/agents/orc-analyze-mini-sonnet-5-high.md +55 -58
  60. package/templates/agents/orc-challenge-advisor-opus-5-med.md +75 -75
  61. package/templates/agents/orc-challenge-contrarian-opus-5-high.md +110 -110
  62. package/templates/agents/orc-challenge-executor-opus-5-med.md +114 -114
  63. package/templates/agents/orc-challenge-expansionist-opus-5-med.md +112 -112
  64. package/templates/agents/orc-challenge-judge-opus-5-high.md +132 -132
  65. package/templates/agents/orc-challenge-outsider-opus-5-low.md +109 -109
  66. package/templates/agents/orc-challenge-principles-opus-5-high.md +109 -109
  67. package/templates/agents/orc-challenge-reader-opus-5-low.md +90 -90
  68. package/templates/agents/orc-claude-writer-opus-4-8-high.md +48 -53
  69. package/templates/agents/orc-claude-writer-opus-5-med.md +48 -55
  70. package/templates/agents/orc-context-combiner-opus-5-high.md +78 -88
  71. package/templates/agents/orc-doc-checker-opus-5-low.md +108 -108
  72. package/templates/agents/orc-doc-writer-opus-5-med.md +134 -134
  73. package/templates/agents/orc-executor-haiku-4-5.md +14 -6
  74. package/templates/agents/orc-executor-opus-4-7-high.md +14 -6
  75. package/templates/agents/orc-executor-opus-4-7-med.md +14 -6
  76. package/templates/agents/orc-executor-opus-4-8-high.md +14 -6
  77. package/templates/agents/orc-executor-opus-5-high.md +15 -7
  78. package/templates/agents/orc-executor-opus-5-low.md +15 -7
  79. package/templates/agents/orc-executor-opus-5-med.md +15 -7
  80. package/templates/agents/orc-executor-sonnet-4-6-high.md +14 -6
  81. package/templates/agents/orc-executor-sonnet-4-6-med.md +14 -6
  82. package/templates/agents/orc-executor-sonnet-5-high.md +14 -6
  83. package/templates/agents/orc-graph-noter-sonnet-4-6-med.md +1 -10
  84. package/templates/agents/orc-judge-opus-5-xhigh.md +81 -85
  85. package/templates/agents/orc-learn-writer-opus-5-low.md +67 -73
  86. package/templates/agents/orc-pattern-codifier-opus-5-med.md +58 -65
  87. package/templates/agents/orc-pattern-codifier-sonnet-5-high.md +58 -63
  88. package/templates/agents/orc-planner-mini-opus-5-med.md +4 -7
  89. package/templates/agents/orc-planner-mini-sonnet-5-high.md +2 -3
  90. package/templates/agents/orc-planner-opus-5-med.md +157 -160
  91. package/templates/agents/orc-recon-opus-5-low.md +3 -10
  92. package/templates/agents/orc-recon-sonnet-4-6-med.md +1 -8
  93. package/templates/agents/orc-retro-opus-5-med.md +8 -10
  94. package/templates/agents/orc-retro-sonnet-5-high.md +6 -7
  95. package/templates/agents/orc-reviewer-opus-5-med.md +96 -60
  96. package/templates/agents/orc-scout-opus-5-low.md +35 -40
  97. package/templates/agents/orc-scout-sonnet-4-6-high.md +35 -39
  98. package/templates/agents/orc-system-analyst-opus-5-high.md +115 -120
  99. package/templates/agents/orc-test-author-opus-5-med.md +70 -71
  100. package/templates/agents/orc-test-designer-opus-5-high.md +158 -158
  101. package/templates/agents/orc-test-interpreter-opus-5-low.md +130 -130
  102. package/templates/agents/orc-trace-writer-haiku-4-5.md +3 -7
  103. package/templates/agents/orc-verifier-opus-5-med.md +77 -69
  104. package/templates/agents/orc-wiki-scanner-opus-4-8-high.md +74 -79
  105. package/templates/agents/orc-wiki-scanner-opus-5-med.md +74 -81
  106. package/templates/agents/orc-wiki-scanner-sonnet-5-high.md +97 -106
  107. package/templates/commands/orc-analyze.md +13 -21
  108. package/templates/commands/orc-fast.md +10 -15
  109. package/templates/commands/orc-poly.md +12 -21
  110. package/templates/commands/orc-pr-driver.md +11 -30
  111. package/templates/commands/orc-pr-setup.md +10 -31
  112. package/templates/commands/orc-route.md +11 -41
  113. package/templates/commands/orc-test.md +5 -60
  114. package/templates/commands/orc-ultra.md +17 -17
  115. package/templates/commands/orc-verify.md +11 -11
  116. package/templates/hooks/README.md +36 -2
  117. package/templates/hooks/orc-effort-guard.js +178 -178
  118. package/templates/hooks/orc-session-hook.js +264 -0
  119. package/templates/hooks/orc-statusline.js +9 -7
  120. package/templates/skills/_shared/README.md +9 -0
  121. package/templates/skills/_shared/code-graph.md +48 -56
  122. package/templates/skills/_shared/config-precedence.md +200 -198
  123. package/templates/skills/_shared/extra-dispatch.md +1331 -1346
  124. package/templates/skills/_shared/gotchas.md +228 -177
  125. package/templates/skills/_shared/habits.md +101 -0
  126. package/templates/skills/_shared/lane-contract.md +84 -0
  127. package/templates/skills/_shared/opus5-only.md +8 -8
  128. package/templates/skills/_shared/phases/README.md +142 -83
  129. package/templates/skills/_shared/phases/analyst-gates.md +125 -136
  130. package/templates/skills/_shared/phases/execution.md +8 -14
  131. package/templates/skills/_shared/phases/house-rules.md +27 -32
  132. package/templates/skills/_shared/phases/intake.md +127 -133
  133. package/templates/skills/_shared/phases/mock-example.md +46 -56
  134. package/templates/skills/_shared/phases/plan-handoff.md +91 -97
  135. package/templates/skills/_shared/phases/planning.md +7 -17
  136. package/templates/skills/_shared/phases/preflight.md +19 -42
  137. package/templates/skills/_shared/phases/review.md +23 -27
  138. package/templates/skills/_shared/phases/rules.md +18 -42
  139. package/templates/skills/_shared/phases/scoring.md +55 -65
  140. package/templates/skills/_shared/phases/security-checklist.md +46 -50
  141. package/templates/skills/_shared/phases/security.md +45 -55
  142. package/templates/skills/_shared/phases/ship.md +6 -15
  143. package/templates/skills/_shared/phases/stop-resume.md +2 -5
  144. package/templates/skills/_shared/phases/summary.md +73 -48
  145. package/templates/skills/_shared/phases/testgen.md +41 -51
  146. package/templates/skills/_shared/phases/trace-verbs.md +433 -0
  147. package/templates/skills/_shared/phases/trace.md +136 -367
  148. package/templates/skills/_shared/phases/verify.md +62 -70
  149. package/templates/skills/_shared/phases/wave-grouping.md +128 -133
  150. package/templates/skills/_shared/phases/wiki-consult.md +10 -6
  151. package/templates/skills/_shared/read-ladder.md +2 -55
  152. package/templates/skills/_shared/return-validation.md +17 -70
  153. package/templates/skills/_shared/review-slice.md +79 -0
  154. package/templates/skills/_shared/smoke-gate.md +46 -28
  155. package/templates/skills/context-combiner/SKILL.md +16 -45
  156. package/templates/skills/context-combiner/schemas/combined-report.md +78 -78
  157. package/templates/skills/orc/README.md +2 -2
  158. package/templates/skills/orc/SKILL.md +41 -69
  159. package/templates/skills/orc/config.md +9 -9
  160. package/templates/skills/orc/examples/full-run-mock.md +73 -73
  161. package/templates/skills/orc/references/effort-and-mode.md +222 -222
  162. package/templates/skills/orc/references/pattern-gate.md +89 -89
  163. package/templates/skills/orc/references/phases/intake.md +41 -47
  164. package/templates/skills/orc/references/phases/integration.md +13 -19
  165. package/templates/skills/orc/references/preflight-report.md +10 -11
  166. package/templates/skills/orc/references/ultra-mode.md +11 -9
  167. package/templates/skills/orc/subskills/orc-execution/SKILL.md +27 -73
  168. package/templates/skills/orc/subskills/orc-execution/core.md +12 -99
  169. package/templates/skills/orc/subskills/orc-execution/subagent.md +14 -13
  170. package/templates/skills/orc/subskills/orc-planner/SKILL.md +2 -2
  171. package/templates/skills/orc/subskills/orc-planner-mini/SKILL.md +121 -121
  172. package/templates/skills/orc/subskills/orc-review-verify/SKILL.md +35 -76
  173. package/templates/skills/orc/subskills/orc-review-verify/core.md +52 -135
  174. package/templates/skills/orc/subskills/orc-review-verify/subagent.md +7 -7
  175. package/templates/skills/orc/subskills/orc-testgen/SKILL.md +34 -45
  176. package/templates/skills/orc/subskills/orc-testgen/core.md +20 -59
  177. package/templates/skills/orc/subskills/orc-testgen/subagent.md +7 -7
  178. package/templates/skills/orc-advisor/SKILL.md +56 -60
  179. package/templates/skills/orc-analyze/SKILL.md +32 -68
  180. package/templates/skills/orc-analyze/examples/analyze-mock.md +42 -42
  181. package/templates/skills/orc-analyze/schemas/report-audit.md +84 -83
  182. package/templates/skills/orc-analyze/schemas/report-prose.md +64 -63
  183. package/templates/skills/orc-analyze/schemas/report-requirement.md +78 -78
  184. package/templates/skills/orc-analyze-mini/SKILL.md +35 -70
  185. package/templates/skills/orc-challenge/README.md +142 -142
  186. package/templates/skills/orc-challenge/examples/council-full-roster.md +273 -273
  187. package/templates/skills/orc-challenge/references/council.md +315 -315
  188. package/templates/skills/orc-challenge/references/intake.md +171 -171
  189. package/templates/skills/orc-claude/SKILL.md +14 -14
  190. package/templates/skills/orc-diy/README.md +174 -143
  191. package/templates/skills/orc-diy/SKILL.md +23 -74
  192. package/templates/skills/orc-diy/references/blocks/pattern.md +18 -18
  193. package/templates/skills/orc-diy/references/flow-schema.md +1 -1
  194. package/templates/skills/orc-doc/README.md +229 -229
  195. package/templates/skills/orc-doc/examples/orc-doc-prd-run.md +325 -325
  196. package/templates/skills/orc-doc/references/chunking.md +527 -527
  197. package/templates/skills/orc-fast/SKILL.md +45 -73
  198. package/templates/skills/orc-judge/SKILL.md +77 -82
  199. package/templates/skills/orc-learn/SKILL.md +14 -14
  200. package/templates/skills/orc-learn/examples/learn-run-mock.md +61 -61
  201. package/templates/skills/orc-mini/SKILL.md +65 -113
  202. package/templates/skills/orc-pattern/SKILL.md +27 -48
  203. package/templates/skills/orc-poly/SKILL.md +32 -61
  204. package/templates/skills/orc-pr-driver/SKILL.md +25 -51
  205. package/templates/skills/orc-pr-driver/references/green-gate.md +113 -105
  206. package/templates/skills/orc-pr-setup/SKILL.md +20 -45
  207. package/templates/skills/orc-quick/README.md +43 -2
  208. package/templates/skills/orc-quick/SKILL.md +76 -107
  209. package/templates/skills/orc-quick/references/dispatch-gate.md +16 -5
  210. package/templates/skills/orc-quick/references/gh-mode.md +48 -1
  211. package/templates/skills/orc-quick/references/look.md +3 -1
  212. package/templates/skills/orc-retro/SKILL.md +19 -18
  213. package/templates/skills/orc-retro/examples/retro-mock.md +1 -1
  214. package/templates/skills/orc-route/SKILL.md +25 -45
  215. package/templates/skills/orc-test/SKILL.md +16 -37
  216. package/templates/skills/orc-verify/SKILL.md +21 -39
  217. package/templates/skills/orc-verify/examples/verify-mock.md +33 -33
  218. package/templates/skills/orc-wait/SKILL.md +156 -163
  219. package/templates/skills/orc-wiki/references/extra.md +1 -1
  220. package/templates/skills/orc-wiki/references/phases/phase-0.md +1 -6
  221. package/templates/skills/orc-wiki/references/phases/phase-1.md +1 -6
  222. package/templates/skills/orc-wiki/references/phases/phase-2.md +1 -6
  223. package/templates/skills/orc-wiki/references/phases/phase-3.md +1 -6
  224. package/templates/skills/orc-wiki/references/phases/phase-3c.md +1 -6
@@ -1,116 +1,563 @@
1
- /* panels/knowledge.css — the Knowledge panel (v0.49.1).
2
-
3
- Five tabs' worth of surface. Loaded by app.html in the order its <link> sits
4
- in that manifest, and for CSS the load order IS the cascade order — which is
5
- why 06-responsive and 04-motion come after every panel sheet.
6
-
7
- NO COLOUR TOKEN IS DEFINED HERE. Every one of them is declared once, on bare
8
- :root, in 00-tokens.css. */
9
-
10
- /* --- the header strip (v0.49.1) ------------------------------------------ */
11
- /* Above the tabs, on every one of them: what ORC knows about this repo, in one
12
- line. A `—` means the CLI could not compute it, and that is an ANSWER. */
13
- .kn-strip {
14
- display: flex;
15
- flex-wrap: wrap;
16
- gap: var(--sp-4);
17
- padding: var(--sp-3);
18
- border: 1px solid var(--line-soft);
19
- border-radius: var(--radius-sm);
20
- margin-bottom: var(--sp-3);
21
- }
22
- .kn-strip-item { display: grid; gap: 2px; }
23
- .kn-strip-value { font-size: 18px; font-weight: 600; font-variant-numeric: tabular-nums; }
24
- .kn-strip-label { font-size: 11px; color: var(--text-faint); text-transform: uppercase; letter-spacing: .04em; }
25
-
26
- /* --- the per-doc tier bar + the coverage bar ------------------------------ */
27
- .kn-tierbar {
28
- display: flex;
29
- height: 8px;
30
- min-width: 120px;
31
- flex: 1;
32
- border-radius: 4px;
33
- overflow: hidden;
34
- background: var(--line-soft);
35
- }
36
- .kn-tierbar-seg { width: var(--w); }
37
- .kn-tier-ok { background: var(--ok); }
38
- .kn-tier-warn { background: var(--warn); }
39
- .kn-tier-bad { background: var(--bad); }
40
- .kn-tier-idle { background: var(--idle); }
41
-
42
- .kn-coverage { display: flex; align-items: baseline; gap: var(--sp-3); margin-bottom: var(--sp-2); }
43
- .kn-coverage-num { font-size: 34px; font-weight: 600; font-variant-numeric: tabular-nums; }
44
-
45
- /* --- rows that expand IN PLACE ------------------------------------------- */
46
- /* One at a time, detail fetched on first open, and NO detail box below the
47
- table — the Runs-row rule. */
48
- .kn-doc-row { cursor: pointer; }
49
- .kn-doc-row:hover td { background: var(--surface-2); }
50
- .kn-doc-row.open td { background: var(--surface-2); }
51
- .kn-doc-detail > td { background: var(--surface-2); padding: var(--sp-3); }
52
-
53
- /* --- revealed prose ------------------------------------------------------- */
54
- /* Rendered as DOM by renderMd, never as HTML. It scrolls INSIDE itself; the page
55
- body never scrolls horizontally. */
56
- .kn-body {
57
- margin-top: var(--sp-2);
58
- max-height: 420px;
59
- overflow: auto;
60
- padding: var(--sp-3);
61
- border: 1px solid var(--line-soft);
62
- border-radius: var(--radius-sm);
63
- scrollbar-width: thin;
64
- scrollbar-color: var(--line) transparent;
65
- }
66
- .kn-body::-webkit-scrollbar { width: 8px; height: 8px; }
67
- .kn-body::-webkit-scrollbar-track { background: transparent; }
68
- .kn-body::-webkit-scrollbar-thumb { background: var(--line); border-radius: 4px; }
69
-
70
- /* --- patterns ------------------------------------------------------------- */
71
- .kn-pattern {
72
- border: 1px solid var(--line-soft);
73
- border-radius: var(--radius-sm);
74
- padding: var(--sp-3);
75
- margin-top: var(--sp-2);
76
- display: grid;
77
- gap: var(--sp-2);
78
- }
79
- /* The most decision-shaped thing in a pattern file, and until now invisible
80
- outside it. */
81
- .kn-conflicts { border-left: 3px solid var(--warn); padding-left: var(--sp-3); display: grid; gap: 4px; }
82
- .kn-conflicts-head { font-weight: 600; font-size: 13px; }
83
-
84
- /* --- preview-then-apply --------------------------------------------------- */
85
- .kn-prune { margin-top: var(--sp-3); display: grid; gap: var(--sp-2); }
86
- .kn-prune-head { font-weight: 600; font-size: 13px; }
87
-
88
- /* ── one doc at a time (v1.7.0) ───────────────────────────────────────────── */
89
- /* The resolver and the derived-reference sweep. Both are probes, so the card is
90
- read-shaped: a row of results, and a command where a lane would have to run. */
91
- .kn-one-topic { flex: 1 1 260px; min-width: 0; }
92
- .kn-one-out { margin-top: var(--sp-2); display: flex; flex-direction: column; gap: 4px; }
93
- .kn-one-cand {
94
- display: flex;
95
- flex-wrap: wrap;
96
- gap: var(--sp-1) var(--sp-2);
97
- align-items: baseline;
98
- padding-left: var(--sp-2);
99
- }
100
- .kn-one-sweep {
101
- margin-top: var(--sp-3);
102
- border-top: 1px solid var(--line-soft);
103
- padding-top: var(--sp-2);
104
- }
105
- .kn-one-ref {
106
- display: flex;
107
- flex-wrap: wrap;
108
- gap: var(--sp-1) var(--sp-2);
109
- align-items: baseline;
110
- padding: 3px 0;
111
- }
112
- .kn-one-fix { padding-left: var(--sp-4); }
113
-
114
- @media (max-width: 720px) {
115
- .kn-one-ref, .kn-one-cand { flex-direction: column; align-items: flex-start; gap: 2px; }
116
- }
1
+ /* panels/knowledge.css — the Knowledge panel (v0.49.1).
2
+
3
+ Five tabs' worth of surface. Loaded by app.html in the order its <link> sits
4
+ in that manifest, and for CSS the load order IS the cascade order — which is
5
+ why 06-responsive and 04-motion come after every panel sheet.
6
+
7
+ NO COLOUR TOKEN IS DEFINED HERE. Every one of them is declared once, on bare
8
+ :root, in 00-tokens.css. */
9
+
10
+ /* --- the header strip (v0.49.1) ------------------------------------------ */
11
+ /* Above the tabs, on every one of them: what ORC knows about this repo, in one
12
+ line. A `—` means the CLI could not compute it, and that is an ANSWER. */
13
+ .kn-strip {
14
+ display: flex;
15
+ flex-wrap: wrap;
16
+ gap: var(--sp-4);
17
+ padding: var(--sp-3);
18
+ border: 1px solid var(--line-soft);
19
+ border-radius: var(--radius-sm);
20
+ margin-bottom: var(--sp-3);
21
+ }
22
+ .kn-strip-item { display: grid; gap: 2px; }
23
+ .kn-strip-value { font-size: 18px; font-weight: 600; font-variant-numeric: tabular-nums; }
24
+ .kn-strip-label { font-size: 11px; color: var(--text-faint); text-transform: uppercase; letter-spacing: .04em; }
25
+
26
+ /* --- the per-doc tier bar + the coverage bar ------------------------------ */
27
+ .kn-tierbar {
28
+ display: flex;
29
+ height: 8px;
30
+ min-width: 120px;
31
+ flex: 1;
32
+ border-radius: 4px;
33
+ overflow: hidden;
34
+ background: var(--line-soft);
35
+ }
36
+ .kn-tierbar-seg { width: var(--w); }
37
+ .kn-tier-ok { background: var(--ok); }
38
+ .kn-tier-warn { background: var(--warn); }
39
+ .kn-tier-bad { background: var(--bad); }
40
+ .kn-tier-idle { background: var(--idle); }
41
+
42
+ .kn-coverage { display: flex; align-items: baseline; gap: var(--sp-3); margin-bottom: var(--sp-2); }
43
+ .kn-coverage-num { font-size: 34px; font-weight: 600; font-variant-numeric: tabular-nums; }
44
+
45
+ /* --- rows that expand IN PLACE ------------------------------------------- */
46
+ /* One at a time, detail fetched on first open, and NO detail box below the
47
+ table — the Runs-row rule. */
48
+ .kn-doc-row { cursor: pointer; }
49
+ .kn-doc-row:hover td { background: var(--surface-2); }
50
+ .kn-doc-row.open td { background: var(--surface-2); }
51
+ .kn-doc-detail > td { background: var(--surface-2); padding: var(--sp-3); }
52
+
53
+ /* --- revealed prose ------------------------------------------------------- */
54
+ /* Rendered as DOM by renderMd, never as HTML. It scrolls INSIDE itself; the page
55
+ body never scrolls horizontally. */
56
+ .kn-body {
57
+ margin-top: var(--sp-2);
58
+ max-height: 420px;
59
+ overflow: auto;
60
+ padding: var(--sp-3);
61
+ border: 1px solid var(--line-soft);
62
+ border-radius: var(--radius-sm);
63
+ scrollbar-width: thin;
64
+ scrollbar-color: var(--line) transparent;
65
+ }
66
+ .kn-body::-webkit-scrollbar { width: 8px; height: 8px; }
67
+ .kn-body::-webkit-scrollbar-track { background: transparent; }
68
+ .kn-body::-webkit-scrollbar-thumb { background: var(--line); border-radius: 4px; }
69
+
70
+ /* --- patterns ------------------------------------------------------------- */
71
+ .kn-pattern {
72
+ border: 1px solid var(--line-soft);
73
+ border-radius: var(--radius-sm);
74
+ padding: var(--sp-3);
75
+ margin-top: var(--sp-2);
76
+ display: grid;
77
+ gap: var(--sp-2);
78
+ }
79
+ /* The most decision-shaped thing in a pattern file, and until now invisible
80
+ outside it. */
81
+ .kn-conflicts { border-left: 3px solid var(--warn); padding-left: var(--sp-3); display: grid; gap: 4px; }
82
+ .kn-conflicts-head { font-weight: 600; font-size: 13px; }
83
+
84
+ /* --- preview-then-apply --------------------------------------------------- */
85
+ .kn-prune { margin-top: var(--sp-3); display: grid; gap: var(--sp-2); }
86
+ .kn-prune-head { font-weight: 600; font-size: 13px; }
87
+
88
+ /* ── one doc at a time (v1.7.0) ───────────────────────────────────────────── */
89
+ /* The resolver and the derived-reference sweep. Both are probes, so the card is
90
+ read-shaped: a row of results, and a command where a lane would have to run. */
91
+ .kn-one-topic { flex: 1 1 260px; min-width: 0; }
92
+ .kn-one-out { margin-top: var(--sp-2); display: flex; flex-direction: column; gap: 4px; }
93
+ .kn-one-cand {
94
+ display: flex;
95
+ flex-wrap: wrap;
96
+ gap: var(--sp-1) var(--sp-2);
97
+ align-items: baseline;
98
+ padding-left: var(--sp-2);
99
+ }
100
+ .kn-one-sweep {
101
+ margin-top: var(--sp-3);
102
+ border-top: 1px solid var(--line-soft);
103
+ padding-top: var(--sp-2);
104
+ }
105
+ .kn-one-ref {
106
+ display: flex;
107
+ flex-wrap: wrap;
108
+ gap: var(--sp-1) var(--sp-2);
109
+ align-items: baseline;
110
+ padding: 3px 0;
111
+ }
112
+ .kn-one-fix { padding-left: var(--sp-4); }
113
+
114
+ @media (max-width: 720px) {
115
+ .kn-one-ref, .kn-one-cand { flex-direction: column; align-items: flex-start; gap: 2px; }
116
+ }
117
+
118
+ /* ── the Code graph tab (v1.9.2) ──────────────────────────────────────────── */
119
+ /* Six cards: the state ladder, the pipeline, an example graph, the numbers, the
120
+ cost bars and the glossary. Every moving part is listed again in the ONE
121
+ reduced-motion block in 04-motion.css. The three INFINITE ones — the ladder
122
+ beacon, the pipeline dots and the edge pulses — are removed there with
123
+ `display: none`, because a capped infinite animation freezes mid-cycle. */
124
+
125
+ .cg-sub {
126
+ margin-top: var(--sp-4);
127
+ margin-bottom: var(--sp-2);
128
+ font-size: 11px;
129
+ font-weight: 600;
130
+ color: var(--text-faint);
131
+ text-transform: uppercase;
132
+ letter-spacing: .06em;
133
+ }
134
+ @keyframes cg-rise {
135
+ from { opacity: 0; transform: translateY(10px); }
136
+ to { opacity: 1; transform: none; }
137
+ }
138
+ @keyframes cg-pop {
139
+ 0% { opacity: 0; transform: scale(.6); }
140
+ 70% { opacity: 1; transform: scale(1.08); }
141
+ 100% { opacity: 1; transform: none; }
142
+ }
143
+
144
+ /* --- 1. the state ladder -------------------------------------------------- */
145
+ .cg-ladder {
146
+ display: grid;
147
+ grid-template-columns: minmax(0, 1fr) repeat(3, minmax(70px, .6fr) minmax(0, 1fr));
148
+ align-items: stretch;
149
+ margin-top: var(--sp-3);
150
+ }
151
+ .cg-step {
152
+ --c: var(--idle);
153
+ position: relative;
154
+ display: flex;
155
+ flex-direction: column;
156
+ align-items: center;
157
+ text-align: center;
158
+ gap: 6px;
159
+ padding: var(--sp-3) var(--sp-2);
160
+ border: 1px solid var(--line-soft);
161
+ border-radius: var(--radius);
162
+ background: var(--surface);
163
+ opacity: .62;
164
+ animation: cg-rise 420ms var(--ease) calc(var(--i, 0) * 110ms) backwards;
165
+ transition: opacity var(--dur) var(--ease), border-color var(--dur) var(--ease);
166
+ }
167
+ .cg-step:hover { opacity: 1; }
168
+ .cg-step-none { --c: var(--accent); }
169
+ .cg-step-fresh { --c: var(--ok); }
170
+ .cg-step-drifted { --c: var(--warn); }
171
+ .cg-step-now {
172
+ opacity: 1;
173
+ border-color: var(--c);
174
+ background: linear-gradient(180deg, var(--surface-2), var(--surface));
175
+ box-shadow: 0 0 0 1px var(--c) inset;
176
+ }
177
+ .cg-step-dot {
178
+ position: relative;
179
+ width: 14px;
180
+ height: 14px;
181
+ border-radius: 50%;
182
+ background: var(--c);
183
+ }
184
+ /* The current state sends a ring outward — the first INFINITE animation. */
185
+ .cg-beacon {
186
+ position: absolute;
187
+ inset: -2px;
188
+ border-radius: 50%;
189
+ border: 2px solid var(--c);
190
+ animation: cg-ping 2.2s var(--ease) infinite;
191
+ }
192
+ @keyframes cg-ping {
193
+ 0% { transform: scale(1); opacity: .9; }
194
+ 80% { transform: scale(2.6); opacity: 0; }
195
+ 100% { transform: scale(2.6); opacity: 0; }
196
+ }
197
+ .cg-step-word { font-family: var(--mono); font-weight: 700; font-size: 13px; letter-spacing: .06em; color: var(--c); }
198
+ .cg-step-what { font-size: 12px; color: var(--text-dim); line-height: 1.4; }
199
+ .cg-step-here {
200
+ margin-top: 2px;
201
+ font-size: 10px;
202
+ font-weight: 700;
203
+ text-transform: uppercase;
204
+ letter-spacing: .08em;
205
+ padding: 2px 8px;
206
+ border-radius: 999px;
207
+ color: var(--bg);
208
+ background: var(--c);
209
+ }
210
+ .cg-step-link {
211
+ display: flex;
212
+ flex-direction: column;
213
+ align-items: center;
214
+ justify-content: center;
215
+ gap: 6px;
216
+ padding: 0 4px;
217
+ }
218
+ .cg-step-line {
219
+ display: block;
220
+ width: 100%;
221
+ height: 2px;
222
+ border-radius: 1px;
223
+ background: linear-gradient(90deg, var(--line), var(--text-faint));
224
+ transform-origin: left center;
225
+ animation: cg-draw-x 380ms var(--ease) calc(var(--i, 0) * 110ms + 220ms) backwards;
226
+ }
227
+ @keyframes cg-draw-x { from { transform: scaleX(0); } }
228
+ @keyframes cg-draw-y { from { transform: scaleY(0); } }
229
+ .cg-step-next { font-size: 11px; color: var(--text-faint); text-align: center; line-height: 1.3; }
230
+ .cg-loop {
231
+ margin-top: var(--sp-2);
232
+ text-align: right;
233
+ font-size: 12px;
234
+ color: var(--text-dim);
235
+ }
236
+ .cg-now {
237
+ display: flex;
238
+ flex-wrap: wrap;
239
+ align-items: center;
240
+ gap: var(--sp-2) var(--sp-3);
241
+ margin-top: var(--sp-3);
242
+ padding: var(--sp-3);
243
+ border-radius: var(--radius-sm);
244
+ border-left: 3px solid var(--idle);
245
+ background: var(--idle-wash);
246
+ }
247
+ .cg-now > div { flex: 1 1 260px; }
248
+ .cg-now .cmd { margin: 0; }
249
+ .cg-now-fresh { border-left-color: var(--ok); background: var(--ok-wash); }
250
+ .cg-now-drifted { border-left-color: var(--warn); background: var(--warn-wash); }
251
+ .cg-now-none { border-left-color: var(--accent); background: var(--accent-wash); }
252
+ .cg-line { white-space: pre-wrap; word-break: break-word; }
253
+
254
+ /* --- 2. the pipeline ------------------------------------------------------ */
255
+ .cg-flow {
256
+ display: grid;
257
+ grid-template-columns: minmax(0, 1fr) repeat(4, 34px minmax(0, 1fr));
258
+ align-items: stretch;
259
+ margin-top: var(--sp-3);
260
+ }
261
+ .cg-station {
262
+ --c: var(--accent);
263
+ position: relative;
264
+ display: flex;
265
+ flex-direction: column;
266
+ gap: 4px;
267
+ padding: var(--sp-3);
268
+ border: 1px solid var(--line-soft);
269
+ border-top: 3px solid var(--c);
270
+ border-radius: var(--radius);
271
+ background: var(--surface);
272
+ animation: cg-rise 460ms var(--ease) calc(var(--i, 0) * 140ms) backwards;
273
+ transition: transform var(--dur) var(--ease), border-color var(--dur) var(--ease);
274
+ }
275
+ .cg-station:hover { transform: translateY(-3px); border-color: var(--c); }
276
+ .cg-cost-free { --c: var(--ok); }
277
+ .cg-cost-paid { --c: var(--warn); }
278
+ .cg-station-num {
279
+ position: absolute;
280
+ top: 8px;
281
+ right: 10px;
282
+ font-size: 11px;
283
+ font-weight: 700;
284
+ color: var(--text-faint);
285
+ font-variant-numeric: tabular-nums;
286
+ }
287
+ .cg-station-glyph {
288
+ display: inline-grid;
289
+ place-items: center;
290
+ width: 44px;
291
+ height: 34px;
292
+ border-radius: var(--radius-sm);
293
+ font-family: var(--mono);
294
+ font-weight: 700;
295
+ font-size: 14px;
296
+ color: var(--c);
297
+ background: var(--surface-2);
298
+ border: 1px solid var(--line-soft);
299
+ }
300
+ .cg-station-name { font-weight: 600; font-size: 14px; }
301
+ .cg-station-what { font-size: 12px; color: var(--text-dim); line-height: 1.45; }
302
+ .cg-station-value {
303
+ margin-top: auto;
304
+ padding-top: 4px;
305
+ font-family: var(--mono);
306
+ font-size: 12px;
307
+ color: var(--c);
308
+ }
309
+ .cg-link { position: relative; align-self: center; height: 2px; margin: 0 4px; background: var(--line); }
310
+ /* Three dots run station to station — the second INFINITE animation. */
311
+ .cg-link-dot {
312
+ position: absolute;
313
+ top: -3px;
314
+ left: 0;
315
+ width: 8px;
316
+ height: 8px;
317
+ border-radius: 50%;
318
+ background: var(--accent);
319
+ box-shadow: 0 0 8px var(--accent);
320
+ opacity: 0;
321
+ animation: cg-travel-x 1.8s linear calc(var(--i, 1) * 180ms + var(--k, 0) * 600ms) infinite;
322
+ }
323
+ @keyframes cg-travel-x {
324
+ 0% { left: -4px; opacity: 0; }
325
+ 15% { opacity: 1; }
326
+ 85% { opacity: 1; }
327
+ 100% { left: calc(100% - 4px); opacity: 0; }
328
+ }
329
+ @keyframes cg-travel-y {
330
+ 0% { top: -4px; opacity: 0; }
331
+ 15% { opacity: 1; }
332
+ 85% { opacity: 1; }
333
+ 100% { top: calc(100% - 4px); opacity: 0; }
334
+ }
335
+ .cg-notes-layer {
336
+ display: flex;
337
+ flex-wrap: wrap;
338
+ align-items: baseline;
339
+ gap: var(--sp-2);
340
+ margin-top: var(--sp-3);
341
+ padding: var(--sp-2) var(--sp-3);
342
+ border: 1px dashed var(--line);
343
+ border-radius: var(--radius-sm);
344
+ font-size: 13px;
345
+ color: var(--text-dim);
346
+ }
347
+ .cg-notes-tag {
348
+ font-size: 10px;
349
+ font-weight: 700;
350
+ text-transform: uppercase;
351
+ letter-spacing: .08em;
352
+ padding: 2px 8px;
353
+ border-radius: 999px;
354
+ color: var(--warn);
355
+ background: var(--warn-wash);
356
+ }
357
+
358
+ /* --- 3. the example graph ------------------------------------------------- */
359
+ .cg-anatomy { display: grid; grid-template-columns: minmax(0, 1fr) 260px; gap: var(--sp-3) var(--sp-4); margin-top: var(--sp-3); }
360
+ .cg-anatomy-scroll { grid-column: 1; grid-row: 1; }
361
+ .cg-caption { grid-column: 1; grid-row: 2; }
362
+ .cg-legend { grid-column: 2; grid-row: 1 / span 2; }
363
+ .cg-svg {
364
+ display: block;
365
+ width: 100%;
366
+ min-width: 560px;
367
+ height: auto;
368
+ border: 1px solid var(--line-soft);
369
+ border-radius: var(--radius);
370
+ background: radial-gradient(circle at 50% 40%, var(--surface-2) 0%, var(--surface) 70%);
371
+ }
372
+ .cg-file { animation: cg-fade 480ms var(--ease) var(--d, 0ms) backwards; }
373
+ .cg-file rect { fill: var(--surface-2); stroke: var(--line); stroke-width: 1; }
374
+ .cg-file-name { fill: var(--text-faint); font-family: var(--mono); font-size: 11px; }
375
+ .cg-edge { transition: opacity var(--dur) var(--ease); }
376
+ .cg-edge-line { fill: none; stroke-width: 1.6; }
377
+ .cg-edge-call .cg-edge-line {
378
+ stroke: var(--accent-dim);
379
+ stroke-dasharray: 1;
380
+ animation: cg-edge-draw 620ms var(--ease) var(--d, 0ms) backwards;
381
+ }
382
+ .cg-edge-ref .cg-edge-line { stroke: var(--warn); stroke-dasharray: 5 4; animation: cg-fade 500ms var(--ease) var(--d, 0ms) backwards; }
383
+ .cg-edge-import .cg-edge-line { stroke: var(--text-faint); stroke-dasharray: 1.5 4; stroke-linecap: round; animation: cg-fade 500ms var(--ease) var(--d, 0ms) backwards; }
384
+ @keyframes cg-edge-draw { from { stroke-dashoffset: 1; opacity: 0; } to { stroke-dashoffset: 0; opacity: 1; } }
385
+ @keyframes cg-fade { from { opacity: 0; } }
386
+ .cg-head-call { fill: var(--accent-dim); }
387
+ .cg-head-ref { fill: var(--warn); }
388
+ /* A short bright dash runs along every call, caller to callee — the third
389
+ INFINITE animation. */
390
+ .cg-pulse {
391
+ fill: none;
392
+ stroke: var(--accent);
393
+ stroke-width: 3.5;
394
+ stroke-linecap: round;
395
+ stroke-dasharray: .06 .94;
396
+ animation: cg-run 2.6s linear var(--d, 0ms) infinite backwards;
397
+ }
398
+ @keyframes cg-run {
399
+ 0% { stroke-dashoffset: 1; opacity: 0; }
400
+ 10% { opacity: 1; }
401
+ 90% { opacity: 1; }
402
+ 100% { stroke-dashoffset: 0; opacity: 0; }
403
+ }
404
+ .cg-sym { cursor: pointer; outline: none; transform-box: fill-box; transform-origin: center; animation: cg-pop 480ms var(--ease) var(--d, 0ms) backwards; }
405
+ .cg-sym-halo { fill: var(--accent-wash); stroke: var(--accent); stroke-width: 1; opacity: 0; transition: opacity var(--dur) var(--ease); }
406
+ .cg-sym-dot { fill: var(--accent); stroke: var(--surface); stroke-width: 2.5; transition: fill var(--dur) var(--ease); }
407
+ .cg-sym-name { fill: var(--text); font-family: var(--mono); font-size: 12px; font-weight: 600; pointer-events: none; }
408
+ .cg-sym:hover .cg-sym-halo, .cg-sym:focus-visible .cg-sym-halo, .cg-sym-hi .cg-sym-halo { opacity: 1; }
409
+ .cg-sym:focus-visible .cg-sym-dot { stroke: var(--text); }
410
+ /* Point at a dot: its edges light up and every other edge steps back. */
411
+ .cg-focus .cg-edge { opacity: .18; }
412
+ .cg-focus .cg-edge.cg-edge-hi { opacity: 1; }
413
+ .cg-edge-hi .cg-edge-line { stroke-width: 2.6; }
414
+ .cg-caption {
415
+ display: flex;
416
+ flex-wrap: wrap;
417
+ align-items: baseline;
418
+ gap: var(--sp-1) var(--sp-3);
419
+ min-height: 46px;
420
+ padding: var(--sp-2) var(--sp-3);
421
+ border-radius: var(--radius-sm);
422
+ background: var(--surface-2);
423
+ font-size: 13px;
424
+ }
425
+ .cg-caption-hint { color: var(--text-faint); }
426
+ .cg-caption-sym { color: var(--accent); font-weight: 700; }
427
+ .cg-caption-text { flex: 1 1 240px; }
428
+ .cg-caption-cmd { color: var(--text-faint); font-size: 12px; }
429
+ .cg-legend { display: grid; gap: var(--sp-2); align-content: start; }
430
+ .cg-legend-row { display: grid; grid-template-columns: 36px minmax(0, 1fr); gap: var(--sp-2); align-items: start; }
431
+ .cg-legend-text { display: grid; gap: 2px; font-size: 13px; }
432
+ .cg-lg { display: block; margin-top: 4px; width: 32px; height: 16px; }
433
+ .cg-lg-file { border: 1px solid var(--line); background: var(--surface-2); border-radius: 4px; }
434
+ .cg-lg-sym { width: 14px; height: 14px; margin-left: 9px; border-radius: 50%; background: var(--accent); }
435
+ .cg-lg-call { height: 0; margin-top: 11px; border-top: 2px solid var(--accent-dim); }
436
+ .cg-lg-ref { height: 0; margin-top: 11px; border-top: 2px dashed var(--warn); }
437
+ .cg-lg-import { height: 0; margin-top: 11px; border-top: 2px dotted var(--text-faint); }
438
+
439
+ /* --- 4. the numbers ------------------------------------------------------- */
440
+ .cg-tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: var(--sp-3); }
441
+ .cg-tile {
442
+ display: grid;
443
+ gap: 2px;
444
+ padding: var(--sp-3) var(--sp-4);
445
+ border: 1px solid var(--line-soft);
446
+ border-radius: var(--radius);
447
+ background: linear-gradient(160deg, var(--surface-2), var(--surface));
448
+ animation: cg-rise 440ms var(--ease) calc(var(--i, 0) * 100ms) backwards;
449
+ }
450
+ .cg-tile-value { font-size: 30px; font-weight: 700; font-variant-numeric: tabular-nums; line-height: 1.1; }
451
+ .cg-tile-label { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: .05em; color: var(--text-faint); }
452
+ .cg-tile-what { font-size: 12px; color: var(--text-dim); line-height: 1.4; }
453
+ .cg-behind { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2); margin-top: var(--sp-3); }
454
+ .cg-behind-label { font-size: 13px; color: var(--text-dim); margin-right: var(--sp-1); }
455
+ .cg-bchip {
456
+ --c: var(--ok);
457
+ display: inline-flex;
458
+ align-items: baseline;
459
+ gap: 6px;
460
+ padding: 4px 10px;
461
+ border-radius: 999px;
462
+ border: 1px solid var(--c);
463
+ font-size: 12px;
464
+ animation: cg-pop 420ms var(--ease) 300ms backwards;
465
+ }
466
+ .cg-bchip strong { color: var(--c); font-family: var(--mono); }
467
+ .cg-b-chg { --c: var(--warn); }
468
+ .cg-b-del { --c: var(--bad); }
469
+ .cg-b-zero { --c: var(--line); color: var(--text-faint); }
470
+ .cg-bar {
471
+ display: flex;
472
+ height: 12px;
473
+ border-radius: 6px;
474
+ overflow: hidden;
475
+ background: var(--line-soft);
476
+ }
477
+ .cg-bar-sm { height: 8px; border-radius: 4px; }
478
+ .cg-bar-lg { height: 18px; border-radius: 9px; }
479
+ .cg-seg { width: var(--w); flex: none; animation: cg-grow 900ms var(--ease) 200ms backwards; }
480
+ @keyframes cg-grow { from { width: 0; } }
481
+ .cg-seg-ok { background: var(--ok); }
482
+ .cg-seg-empty { background: repeating-linear-gradient(135deg, var(--warn) 0 6px, var(--warn-wash) 6px 10px); }
483
+ .cg-seg-card { background: var(--accent); }
484
+ .cg-seg-source { background: var(--accent-dim); }
485
+ .cg-seg-hints { background: var(--warn); }
486
+ .cg-seg-env { background: var(--idle); }
487
+ .cg-seg-low { background: var(--ok); }
488
+ .cg-seg-range { background: repeating-linear-gradient(135deg, var(--ok) 0 6px, var(--ok-wash) 6px 12px); }
489
+ .cg-seg-read { background: linear-gradient(90deg, var(--accent-dim), var(--accent)); }
490
+ .cg-bar-key { display: flex; flex-wrap: wrap; gap: var(--sp-1) var(--sp-4); margin-top: var(--sp-2); font-size: 12px; color: var(--text-dim); }
491
+ .cg-key { display: inline-flex; align-items: center; gap: 6px; }
492
+ .cg-key::before { content: ""; width: 10px; height: 10px; border-radius: 3px; background: var(--kc, var(--idle)); }
493
+ .cg-key-ok { --kc: var(--ok); }
494
+ .cg-key-empty { --kc: var(--warn); }
495
+ .cg-key-card { --kc: var(--accent); }
496
+ .cg-key-source { --kc: var(--accent-dim); }
497
+ .cg-key-hints { --kc: var(--warn); }
498
+ .cg-key-env { --kc: var(--idle); }
499
+ .cg-key-range::before { background: repeating-linear-gradient(135deg, var(--ok) 0 3px, var(--ok-wash) 3px 6px); }
500
+ .cg-langs { display: grid; gap: var(--sp-2); margin-top: var(--sp-3); }
501
+ .cg-lang {
502
+ display: grid;
503
+ grid-template-columns: 70px minmax(0, 1fr) minmax(0, 240px);
504
+ gap: var(--sp-3);
505
+ align-items: center;
506
+ animation: cg-rise 380ms var(--ease) calc(var(--i, 0) * 90ms + 200ms) backwards;
507
+ }
508
+ .cg-lang-name { font-weight: 600; }
509
+ .cg-lang-nums { font-size: 12px; color: var(--text-dim); }
510
+
511
+ /* --- 5. cost and savings -------------------------------------------------- */
512
+ .cg-gain { display: grid; gap: var(--sp-3); margin-top: var(--sp-3); }
513
+ .cg-gain-row { display: grid; grid-template-columns: 190px minmax(0, 1fr) minmax(90px, auto); gap: var(--sp-3); align-items: center; }
514
+ .cg-gain-name { font-size: 13px; font-weight: 600; }
515
+ .cg-gain-val { font-family: var(--mono); font-size: 13px; text-align: right; }
516
+ .cg-reads { display: grid; gap: 6px; }
517
+ .cg-read {
518
+ display: grid;
519
+ grid-template-columns: 90px minmax(80px, 1fr) 90px minmax(0, 2fr);
520
+ gap: var(--sp-3);
521
+ align-items: center;
522
+ padding: 4px 0;
523
+ animation: cg-rise 360ms var(--ease) calc(var(--i, 0) * 60ms + 200ms) backwards;
524
+ }
525
+ .cg-read-cmd { font-weight: 700; color: var(--accent); }
526
+ .cg-read-n { font-family: var(--mono); font-size: 12px; text-align: right; }
527
+ .cg-read-what { font-size: 12px; color: var(--text-dim); }
528
+ .cg-read-never .cg-read-cmd, .cg-read-never .cg-read-n { color: var(--text-faint); }
529
+ .cg-read-never .cg-read-n { font-family: var(--font); font-style: italic; }
530
+
531
+ /* --- 6. the glossary ------------------------------------------------------ */
532
+ .cg-gloss { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: var(--sp-3); margin-top: var(--sp-3); }
533
+ .cg-gloss-group {
534
+ padding: var(--sp-3);
535
+ border: 1px solid var(--line-soft);
536
+ border-radius: var(--radius);
537
+ background: var(--surface);
538
+ animation: cg-rise 420ms var(--ease) calc(var(--i, 0) * 110ms) backwards;
539
+ }
540
+ .cg-gloss-head { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; color: var(--accent); margin-bottom: var(--sp-2); }
541
+ .cg-gloss-list { display: grid; gap: 8px; margin: 0; }
542
+ .cg-gloss-list dt { font-weight: 600; font-size: 13px; }
543
+ .cg-gloss-list dd { margin: 0; font-size: 12px; color: var(--text-dim); line-height: 1.45; }
544
+
545
+ /* --- narrow screens ------------------------------------------------------- */
546
+ @media (max-width: 900px) {
547
+ .cg-ladder, .cg-flow { grid-template-columns: minmax(0, 1fr); }
548
+ .cg-step-link { flex-direction: row; min-height: 34px; }
549
+ .cg-step-line { width: 2px; height: 22px; transform-origin: center top; animation-name: cg-draw-y; }
550
+ .cg-link { width: 2px; height: 28px; margin: 4px auto; }
551
+ .cg-link-dot { top: 0; left: -3px; animation-name: cg-travel-y; }
552
+ .cg-anatomy { grid-template-columns: minmax(0, 1fr); }
553
+ .cg-legend { grid-column: 1; grid-row: auto; }
554
+ .cg-loop { text-align: left; }
555
+ }
556
+ @media (max-width: 720px) {
557
+ .cg-gain-row { grid-template-columns: minmax(0, 1fr); gap: 4px; }
558
+ .cg-gain-val { text-align: left; }
559
+ .cg-read { grid-template-columns: 80px minmax(0, 1fr) 70px; }
560
+ .cg-read-what { grid-column: 1 / -1; }
561
+ .cg-lang { grid-template-columns: 56px minmax(0, 1fr); }
562
+ .cg-lang-nums { grid-column: 1 / -1; }
563
+ }