agent-docs-kit 2.1.0__py3-none-any.whl

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 (40) hide show
  1. agent_docs_kit-2.1.0.dist-info/METADATA +299 -0
  2. agent_docs_kit-2.1.0.dist-info/RECORD +40 -0
  3. agent_docs_kit-2.1.0.dist-info/WHEEL +4 -0
  4. agent_docs_kit-2.1.0.dist-info/entry_points.txt +3 -0
  5. agent_docs_kit-2.1.0.dist-info/licenses/LICENSE +21 -0
  6. living_docs_cli/__init__.py +686 -0
  7. living_docs_cli/__main__.py +3 -0
  8. living_docs_cli/assets/fumadocs-starter/app/docs/[[...slug]]/page.tsx +44 -0
  9. living_docs_cli/assets/fumadocs-starter/app/docs/layout.tsx +12 -0
  10. living_docs_cli/assets/fumadocs-starter/app/global.css +450 -0
  11. living_docs_cli/assets/fumadocs-starter/app/layout.tsx +15 -0
  12. living_docs_cli/assets/fumadocs-starter/app/page.tsx +5 -0
  13. living_docs_cli/assets/fumadocs-starter/components/living-docs/index.tsx +185 -0
  14. living_docs_cli/assets/fumadocs-starter/components/mdx.tsx +27 -0
  15. living_docs_cli/assets/fumadocs-starter/content/docs/architecture.mdx +55 -0
  16. living_docs_cli/assets/fumadocs-starter/content/docs/components.mdx +132 -0
  17. living_docs_cli/assets/fumadocs-starter/content/docs/glossary.mdx +16 -0
  18. living_docs_cli/assets/fumadocs-starter/content/docs/index.mdx +72 -0
  19. living_docs_cli/assets/fumadocs-starter/content/docs/meta.json +4 -0
  20. living_docs_cli/assets/fumadocs-starter/lib/layout.shared.ts +7 -0
  21. living_docs_cli/assets/fumadocs-starter/lib/source.ts +7 -0
  22. living_docs_cli/assets/fumadocs-starter/next-env.d.ts +4 -0
  23. living_docs_cli/assets/fumadocs-starter/next.config.mjs +10 -0
  24. living_docs_cli/assets/fumadocs-starter/package.json +27 -0
  25. living_docs_cli/assets/fumadocs-starter/source.config.ts +34 -0
  26. living_docs_cli/assets/fumadocs-starter/tsconfig.json +23 -0
  27. living_docs_cli/assets/project/.living-docs/scripts/check.mjs +72 -0
  28. living_docs_cli/assets/project/.living-docs/scripts/create-doc.mjs +88 -0
  29. living_docs_cli/assets/project/.living-docs/scripts/glossary.mjs +107 -0
  30. living_docs_cli/assets/project/.living-docs/templates/architecture.mdx +51 -0
  31. living_docs_cli/assets/project/.living-docs/templates/change.mdx +40 -0
  32. living_docs_cli/assets/project/.living-docs/templates/glossary.mdx +15 -0
  33. living_docs_cli/assets/project/.living-docs/templates/plan.mdx +54 -0
  34. living_docs_cli/assets/styles/atlas.css +450 -0
  35. living_docs_cli/assets/workflow-skills/living-docs-architecture/SKILL.md +55 -0
  36. living_docs_cli/assets/workflow-skills/living-docs-change/SKILL.md +62 -0
  37. living_docs_cli/assets/workflow-skills/living-docs-check/SKILL.md +32 -0
  38. living_docs_cli/assets/workflow-skills/living-docs-glossary/SKILL.md +30 -0
  39. living_docs_cli/assets/workflow-skills/living-docs-plan/SKILL.md +55 -0
  40. living_docs_cli/assets/workflow-skills/living-docs-write/SKILL.md +46 -0
@@ -0,0 +1,107 @@
1
+ #!/usr/bin/env node
2
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
3
+ import { join, relative } from 'node:path';
4
+ import { readdirSync, statSync } from 'node:fs';
5
+
6
+ const root = process.cwd();
7
+ const configPath = join(root, '.living-docs', 'config.json');
8
+
9
+ function fail(message) {
10
+ console.error(`Error: ${message}`);
11
+ process.exit(1);
12
+ }
13
+
14
+ if (!existsSync(configPath)) {
15
+ fail('missing .living-docs/config.json; run living-docs init first');
16
+ }
17
+
18
+ const config = JSON.parse(readFileSync(configPath, 'utf8'));
19
+ const contentDir = join(root, config.contentDir || 'docs/content/docs');
20
+ const glossaryPath = join(contentDir, 'glossary.mdx');
21
+
22
+ function walk(dir) {
23
+ const results = [];
24
+ for (const name of readdirSync(dir)) {
25
+ const path = join(dir, name);
26
+ const stat = statSync(path);
27
+ if (stat.isDirectory()) results.push(...walk(path));
28
+ if (stat.isFile() && path.endsWith('.mdx')) results.push(path);
29
+ }
30
+ return results;
31
+ }
32
+
33
+ function frontmatter(text) {
34
+ if (!text.startsWith('---\n')) return '';
35
+ const end = text.indexOf('\n---', 4);
36
+ return end === -1 ? '' : text.slice(4, end);
37
+ }
38
+
39
+ function scalar(fm, key) {
40
+ const match = fm.match(new RegExp(`^${key}:\\s*["']?([^"'\\n]+)["']?\\s*$`, 'm'));
41
+ return match?.[1]?.trim() || '';
42
+ }
43
+
44
+ function terms(fm) {
45
+ const lines = fm.split(/\r?\n/);
46
+ const out = [];
47
+ let inTerms = false;
48
+ let current = null;
49
+ for (const line of lines) {
50
+ if (line.startsWith('terms:')) {
51
+ inTerms = true;
52
+ continue;
53
+ }
54
+ if (inTerms && /^[a-zA-Z0-9_-]+:/.test(line)) break;
55
+ if (!inTerms) continue;
56
+ const name = line.match(/^\s*-\s*name:\s*["']?(.+?)["']?\s*$/);
57
+ if (name) {
58
+ current = { name: name[1], description: '' };
59
+ out.push(current);
60
+ continue;
61
+ }
62
+ const description = line.match(/^\s*description:\s*["']?(.+?)["']?\s*$/);
63
+ if (description && current) current.description = description[1];
64
+ }
65
+ return out;
66
+ }
67
+
68
+ const byName = new Map();
69
+ for (const file of walk(contentDir)) {
70
+ if (file === glossaryPath) continue;
71
+ const fm = frontmatter(readFileSync(file, 'utf8'));
72
+ const domain = scalar(fm, 'domain') || 'system';
73
+ for (const term of terms(fm)) {
74
+ const key = term.name.toLowerCase();
75
+ if (!byName.has(key)) {
76
+ byName.set(key, { ...term, domain, sources: [] });
77
+ }
78
+ byName.get(key).sources.push(relative(contentDir, file));
79
+ }
80
+ }
81
+
82
+ const items = [...byName.values()].sort((a, b) => a.name.localeCompare(b.name));
83
+ const bodyItems = items
84
+ .map((item) => ` { name: ${JSON.stringify(item.name)}, description: ${JSON.stringify(item.description)}, meta: ${JSON.stringify(`${item.domain} · ${item.sources.join(', ')}`)} },`)
85
+ .join('\n');
86
+
87
+ const content = [
88
+ '---',
89
+ 'title: "Glossary"',
90
+ 'description: "Generated term index for living-docs"',
91
+ 'type: "glossary"',
92
+ '---',
93
+ '',
94
+ '# Glossary',
95
+ '',
96
+ 'Generated from MDX frontmatter `terms`.',
97
+ '',
98
+ '<TermGrid',
99
+ ' items={[',
100
+ bodyItems,
101
+ ' ]}',
102
+ '/>',
103
+ '',
104
+ ].join('\n');
105
+
106
+ writeFileSync(glossaryPath, content);
107
+ console.log(`wrote ${relative(root, glossaryPath)} (${items.length} terms)`);
@@ -0,0 +1,51 @@
1
+ ---
2
+ title: "__TITLE__"
3
+ description: "__DOMAIN__ architecture living document"
4
+ domain: "__DOMAIN__"
5
+ type: "architecture"
6
+ status: "active"
7
+ date: "__DATE__"
8
+ terms:
9
+ - name: "__DOMAIN__"
10
+ description: "Replace with the subsystem responsibility in this project."
11
+ ---
12
+
13
+ # __TITLE__
14
+
15
+ Use this page for the current architecture of `__DOMAIN__`. Keep history in change records.
16
+
17
+ <ArchMap
18
+ tiers={[
19
+ {
20
+ title: 'Entry points',
21
+ boxes: [
22
+ { title: 'TODO', body: 'Describe the inputs this subsystem receives.', tone: 'blue' },
23
+ ],
24
+ },
25
+ {
26
+ title: 'Core flow',
27
+ boxes: [
28
+ { title: 'TODO', body: 'Describe the main internal responsibility.' },
29
+ ],
30
+ },
31
+ ]}
32
+ />
33
+
34
+ ## Current Shape
35
+
36
+ Document the current runtime truth: entry points, important modules, storage, external contracts, and operational constraints.
37
+
38
+ <FlowSteps
39
+ title="Runtime path"
40
+ steps={[
41
+ { title: 'Input', body: 'Describe the request, job, event, or operator action.', tone: 'blue' },
42
+ { title: 'Process', body: 'Describe the main modules and state transitions.', tone: 'green' },
43
+ { title: 'Output', body: 'Describe persisted state, response, or side effects.', tone: 'amber' },
44
+ ]}
45
+ />
46
+
47
+ <TermGrid
48
+ items={[
49
+ { name: '__DOMAIN__', description: 'Replace with the project-specific definition.' },
50
+ ]}
51
+ />
@@ -0,0 +1,40 @@
1
+ ---
2
+ title: "__TITLE__"
3
+ description: "Change record for __DOMAIN__"
4
+ domain: "__DOMAIN__"
5
+ type: "change"
6
+ status: "shipped"
7
+ date: "__DATE__"
8
+ source: "__SOURCE__"
9
+ tests: "__TESTS__"
10
+ terms:
11
+ - name: "__DOMAIN__"
12
+ description: "Replace with the subsystem or concept changed here."
13
+ ---
14
+
15
+ # __TITLE__
16
+
17
+ <ChangeMeta date="__DATE__" source="__SOURCE__" tests="__TESTS__" />
18
+
19
+ ## What Changed
20
+
21
+ Explain what changed and why. Focus on motivation, behavior, and trade-offs.
22
+
23
+ <FlowSteps
24
+ title="Behavior change"
25
+ steps={[
26
+ { title: 'Before', body: 'Describe the old behavior or limitation.', tone: 'amber' },
27
+ { title: 'Change', body: 'Describe the shipped implementation change.', tone: 'blue' },
28
+ { title: 'After', body: 'Describe the new user-visible or system-visible behavior.', tone: 'green' },
29
+ ]}
30
+ />
31
+
32
+ ## Verification
33
+
34
+ - TODO: command or live check
35
+
36
+ <TermGrid
37
+ items={[
38
+ { name: '__DOMAIN__', description: 'Replace with the relevant system-specific term.' },
39
+ ]}
40
+ />
@@ -0,0 +1,15 @@
1
+ ---
2
+ title: "Glossary"
3
+ description: "Generated term index for living-docs"
4
+ type: "glossary"
5
+ ---
6
+
7
+ # Glossary
8
+
9
+ This page is generated from MDX frontmatter `terms`. Run:
10
+
11
+ ```bash
12
+ node .living-docs/scripts/glossary.mjs
13
+ ```
14
+
15
+ <TermGrid items={[]} />
@@ -0,0 +1,54 @@
1
+ ---
2
+ title: "__TITLE__"
3
+ description: "Plan for __DOMAIN__"
4
+ domain: "__DOMAIN__"
5
+ type: "plan"
6
+ status: "draft"
7
+ date: "__DATE__"
8
+ terms:
9
+ - name: "__DOMAIN__"
10
+ description: "Replace with the subsystem or concept planned here."
11
+ ---
12
+
13
+ # __TITLE__
14
+
15
+ ## Goal
16
+
17
+ Describe the target outcome and the user/system value.
18
+
19
+ ## Scope
20
+
21
+ - In scope: TODO
22
+ - Out of scope: TODO
23
+
24
+ ## Design Direction
25
+
26
+ <ArchMap
27
+ tiers={[
28
+ {
29
+ title: 'Proposed flow',
30
+ boxes: [
31
+ { title: 'TODO', body: 'Describe the proposed step.', tone: 'violet' },
32
+ ],
33
+ },
34
+ ]}
35
+ />
36
+
37
+ <StateFlow
38
+ title="Target lifecycle"
39
+ states={[
40
+ { name: 'draft', description: 'Current plan or proposal.', tone: 'amber' },
41
+ { name: 'validated', description: 'Proven by implementation checks.', tone: 'blue' },
42
+ { name: 'shipped', description: 'Converted into change records.', tone: 'green' },
43
+ ]}
44
+ />
45
+
46
+ ## Validation
47
+
48
+ - TODO: how this plan will be proven when implemented
49
+
50
+ <TermGrid
51
+ items={[
52
+ { name: '__DOMAIN__', description: 'Replace with the plan-specific term.' },
53
+ ]}
54
+ />
@@ -0,0 +1,450 @@
1
+ :root {
2
+ --ld-bg: #f6f8fb;
3
+ --ld-ink: #101828;
4
+ --ld-muted: #667085;
5
+ --ld-panel: rgba(255, 255, 255, 0.9);
6
+ --ld-panel-soft: #f9fbff;
7
+ --ld-line: rgba(16, 24, 40, 0.12);
8
+ --ld-line-strong: rgba(16, 24, 40, 0.2);
9
+ --ld-accent: #2563eb;
10
+ --ld-accent-2: #0f766e;
11
+ --ld-accent-3: #b45309;
12
+ --ld-danger: #c2410c;
13
+ --ld-radius: 8px;
14
+ --ld-shadow: 0 18px 60px rgba(16, 24, 40, 0.1);
15
+ }
16
+
17
+ .dark {
18
+ --ld-bg: #101215;
19
+ --ld-ink: #edf2f7;
20
+ --ld-muted: #a7b0bd;
21
+ --ld-panel: rgba(22, 25, 31, 0.9);
22
+ --ld-panel-soft: #191d24;
23
+ --ld-line: rgba(237, 242, 247, 0.12);
24
+ --ld-line-strong: rgba(237, 242, 247, 0.2);
25
+ --ld-accent: #60a5fa;
26
+ --ld-accent-2: #2dd4bf;
27
+ --ld-accent-3: #f59e0b;
28
+ --ld-danger: #fb923c;
29
+ --ld-shadow: 0 18px 66px rgba(0, 0, 0, 0.34);
30
+ }
31
+
32
+ html,
33
+ body {
34
+ background: var(--ld-bg);
35
+ }
36
+
37
+ body {
38
+ color: var(--ld-ink);
39
+ background:
40
+ linear-gradient(120deg, color-mix(in oklab, var(--ld-accent) 10%, transparent), transparent 32%),
41
+ linear-gradient(300deg, color-mix(in oklab, var(--ld-accent-2) 9%, transparent), transparent 38%),
42
+ var(--ld-bg);
43
+ font-feature-settings: 'cv02', 'cv03', 'cv04', 'cv11';
44
+ -webkit-font-smoothing: antialiased;
45
+ }
46
+
47
+ header {
48
+ border-bottom: 1px solid var(--ld-line);
49
+ background: color-mix(in oklab, var(--ld-panel) 92%, transparent);
50
+ backdrop-filter: blur(18px);
51
+ }
52
+
53
+ #nd-sidebar {
54
+ border-inline-end: 1px solid var(--ld-line);
55
+ background: color-mix(in oklab, var(--ld-panel) 90%, transparent);
56
+ backdrop-filter: blur(18px);
57
+ }
58
+
59
+ article#nd-page {
60
+ border: 0;
61
+ border-radius: 0;
62
+ background: transparent;
63
+ box-sizing: border-box;
64
+ max-width: min(900px, 100vw) !important;
65
+ box-shadow: none;
66
+ }
67
+
68
+ article#nd-page > .prose {
69
+ max-width: 100% !important;
70
+ }
71
+
72
+ #nd-page p,
73
+ #nd-page li {
74
+ overflow-wrap: anywhere;
75
+ }
76
+
77
+ #nd-page h1,
78
+ #nd-page h2,
79
+ #nd-page h3 {
80
+ color: var(--ld-ink);
81
+ letter-spacing: 0;
82
+ overflow-wrap: anywhere;
83
+ }
84
+
85
+ #nd-page h2 {
86
+ padding-top: 14px;
87
+ border-top: 1px solid var(--ld-line);
88
+ }
89
+
90
+ #nd-page :where(code):not(pre code) {
91
+ border: 1px solid var(--ld-line);
92
+ border-radius: 6px;
93
+ background: color-mix(in oklab, var(--ld-panel-soft) 84%, var(--ld-accent) 7%);
94
+ padding: 0.12rem 0.34rem;
95
+ color: var(--ld-accent);
96
+ }
97
+
98
+ .ld-docs-hero {
99
+ position: relative;
100
+ display: grid;
101
+ gap: 18px;
102
+ margin: 0 0 32px;
103
+ overflow: hidden;
104
+ border: 1px solid var(--ld-line-strong);
105
+ border-radius: 8px;
106
+ background:
107
+ linear-gradient(135deg, color-mix(in oklab, var(--ld-accent) 16%, transparent), transparent 42%),
108
+ linear-gradient(315deg, color-mix(in oklab, var(--ld-accent-3) 12%, transparent), transparent 42%),
109
+ var(--ld-panel);
110
+ padding: clamp(22px, 4vw, 42px);
111
+ box-shadow: var(--ld-shadow);
112
+ }
113
+
114
+ .ld-docs-hero::after {
115
+ position: absolute;
116
+ inset: auto 0 0;
117
+ height: 70px;
118
+ content: '';
119
+ background:
120
+ linear-gradient(90deg, var(--ld-line) 1px, transparent 1px),
121
+ linear-gradient(0deg, var(--ld-line) 1px, transparent 1px);
122
+ background-size: 24px 24px;
123
+ mask-image: linear-gradient(to top, black, transparent);
124
+ }
125
+
126
+ .ld-hero-kicker {
127
+ width: fit-content;
128
+ border: 1px solid var(--ld-line-strong);
129
+ border-radius: 999px;
130
+ background: var(--ld-panel-soft);
131
+ padding: 5px 10px;
132
+ color: var(--ld-muted);
133
+ font-size: 0.78rem;
134
+ font-weight: 700;
135
+ letter-spacing: 0;
136
+ text-transform: uppercase;
137
+ }
138
+
139
+ .ld-docs-hero h1 {
140
+ max-width: 780px;
141
+ margin: 0;
142
+ color: var(--ld-ink);
143
+ font-size: clamp(2.2rem, 5vw, 4rem);
144
+ line-height: 0.98;
145
+ overflow-wrap: anywhere;
146
+ }
147
+
148
+ .ld-docs-hero p {
149
+ max-width: 700px;
150
+ margin: 0;
151
+ color: var(--ld-muted);
152
+ font-size: clamp(1rem, 1.7vw, 1.13rem);
153
+ }
154
+
155
+ .ld-hero-actions,
156
+ .ld-change-meta {
157
+ display: flex;
158
+ flex-wrap: wrap;
159
+ gap: 10px;
160
+ }
161
+
162
+ .ld-hero-action,
163
+ .ld-chip {
164
+ display: inline-flex;
165
+ min-height: 38px;
166
+ align-items: center;
167
+ border: 1px solid var(--ld-line-strong);
168
+ border-radius: var(--ld-radius);
169
+ padding: 8px 12px;
170
+ background: var(--ld-panel);
171
+ color: var(--ld-ink);
172
+ font-size: 0.92rem;
173
+ font-weight: 650;
174
+ text-decoration: none;
175
+ }
176
+
177
+ .ld-hero-action[data-primary='true'] {
178
+ border-color: var(--ld-accent);
179
+ background: var(--ld-accent);
180
+ color: #fff;
181
+ }
182
+
183
+ .ld-skill-grid,
184
+ .ld-term-grid {
185
+ display: grid;
186
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
187
+ gap: 12px;
188
+ margin: 22px 0;
189
+ padding: 0;
190
+ }
191
+
192
+ .ld-skill-card,
193
+ .ld-term,
194
+ .ld-box {
195
+ position: relative;
196
+ list-style: none;
197
+ border: 1px solid var(--ld-line);
198
+ border-radius: var(--ld-radius);
199
+ background: var(--ld-panel);
200
+ box-shadow: 0 8px 28px rgba(16, 24, 40, 0.06);
201
+ }
202
+
203
+ .ld-skill-card,
204
+ .ld-term,
205
+ .ld-box {
206
+ padding: 15px;
207
+ }
208
+
209
+ .ld-skill-card {
210
+ min-height: 134px;
211
+ }
212
+
213
+ .ld-skill-card::before,
214
+ .ld-box::before {
215
+ display: block;
216
+ width: 32px;
217
+ height: 3px;
218
+ margin-bottom: 14px;
219
+ border-radius: 999px;
220
+ background: var(--ld-accent);
221
+ content: '';
222
+ }
223
+
224
+ .ld-skill-card code {
225
+ color: var(--ld-accent);
226
+ font-weight: 700;
227
+ white-space: normal;
228
+ overflow-wrap: anywhere;
229
+ }
230
+
231
+ .ld-skill-card span,
232
+ .ld-box span,
233
+ .ld-term span,
234
+ .ld-meta {
235
+ display: block;
236
+ margin-top: 8px;
237
+ color: var(--ld-muted);
238
+ font-size: 0.92rem;
239
+ line-height: 1.55;
240
+ }
241
+
242
+ .ld-box strong,
243
+ .ld-term strong {
244
+ display: block;
245
+ color: var(--ld-ink);
246
+ }
247
+
248
+ .ld-arch-map {
249
+ display: grid;
250
+ gap: 12px;
251
+ margin: 24px 0;
252
+ }
253
+
254
+ .ld-tier {
255
+ border: 1px solid var(--ld-line);
256
+ border-radius: 8px;
257
+ background: var(--ld-panel);
258
+ padding: 14px;
259
+ }
260
+
261
+ .ld-tier-title {
262
+ margin-bottom: 10px;
263
+ color: var(--ld-ink);
264
+ font-weight: 700;
265
+ }
266
+
267
+ .ld-boxes {
268
+ display: grid;
269
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
270
+ gap: 10px;
271
+ }
272
+
273
+ .ld-flow,
274
+ .ld-state-flow {
275
+ margin: 24px 0;
276
+ border: 1px solid var(--ld-line);
277
+ border-radius: 8px;
278
+ background: var(--ld-panel);
279
+ padding: 14px;
280
+ box-shadow: 0 8px 28px rgba(16, 24, 40, 0.06);
281
+ }
282
+
283
+ .ld-flow-title {
284
+ margin-bottom: 12px;
285
+ color: var(--ld-ink);
286
+ font-weight: 700;
287
+ }
288
+
289
+ .ld-flow-steps {
290
+ display: grid;
291
+ gap: 10px;
292
+ margin: 0;
293
+ padding: 0;
294
+ }
295
+
296
+ .ld-flow-step {
297
+ display: grid;
298
+ grid-template-columns: 42px minmax(0, 1fr);
299
+ gap: 12px;
300
+ align-items: start;
301
+ list-style: none;
302
+ border: 1px solid var(--ld-line);
303
+ border-radius: var(--ld-radius);
304
+ background: color-mix(in oklab, var(--ld-panel-soft) 84%, var(--ld-accent) 4%);
305
+ padding: 12px;
306
+ }
307
+
308
+ .ld-step-index {
309
+ display: inline-flex;
310
+ width: 32px;
311
+ height: 32px;
312
+ align-items: center;
313
+ justify-content: center;
314
+ border-radius: 999px;
315
+ background: var(--ld-accent);
316
+ color: #fff;
317
+ font-size: 0.78rem;
318
+ font-weight: 800;
319
+ }
320
+
321
+ .ld-flow-step strong,
322
+ .ld-state-node strong {
323
+ display: block;
324
+ color: var(--ld-ink);
325
+ }
326
+
327
+ .ld-flow-step span:not(.ld-step-index),
328
+ .ld-state-node span {
329
+ display: block;
330
+ margin-top: 6px;
331
+ color: var(--ld-muted);
332
+ font-size: 0.92rem;
333
+ line-height: 1.55;
334
+ }
335
+
336
+ .ld-state-row {
337
+ display: flex;
338
+ flex-wrap: wrap;
339
+ gap: 10px;
340
+ align-items: stretch;
341
+ }
342
+
343
+ .ld-state-group {
344
+ display: contents;
345
+ }
346
+
347
+ .ld-state-node {
348
+ min-width: min(180px, 100%);
349
+ flex: 1 1 180px;
350
+ border: 1px solid var(--ld-line);
351
+ border-radius: var(--ld-radius);
352
+ background: color-mix(in oklab, var(--ld-panel-soft) 84%, var(--ld-accent) 4%);
353
+ padding: 13px;
354
+ }
355
+
356
+ .ld-state-arrow {
357
+ display: inline-flex;
358
+ min-width: 22px;
359
+ align-items: center;
360
+ justify-content: center;
361
+ color: var(--ld-muted);
362
+ font-weight: 800;
363
+ }
364
+
365
+ .ld-flow-step[data-tone='green'] .ld-step-index,
366
+ .ld-state-node[data-tone='green'] {
367
+ border-color: color-mix(in oklab, var(--ld-accent-2) 36%, var(--ld-line));
368
+ }
369
+
370
+ .ld-flow-step[data-tone='green'] .ld-step-index {
371
+ background: var(--ld-accent-2);
372
+ }
373
+
374
+ .ld-flow-step[data-tone='amber'] .ld-step-index,
375
+ .ld-state-node[data-tone='amber'] {
376
+ border-color: color-mix(in oklab, var(--ld-accent-3) 36%, var(--ld-line));
377
+ }
378
+
379
+ .ld-flow-step[data-tone='amber'] .ld-step-index {
380
+ background: var(--ld-accent-3);
381
+ }
382
+
383
+ .ld-flow-step[data-tone='red'] .ld-step-index,
384
+ .ld-state-node[data-tone='red'] {
385
+ border-color: color-mix(in oklab, var(--ld-danger) 36%, var(--ld-line));
386
+ }
387
+
388
+ .ld-flow-step[data-tone='red'] .ld-step-index {
389
+ background: var(--ld-danger);
390
+ }
391
+
392
+ .ld-skill-card[data-tone='green']::before,
393
+ .ld-box[data-tone='green']::before {
394
+ background: var(--ld-accent-2);
395
+ }
396
+
397
+ .ld-skill-card[data-tone='amber']::before,
398
+ .ld-box[data-tone='amber']::before {
399
+ background: var(--ld-accent-3);
400
+ }
401
+
402
+ .ld-skill-card[data-tone='red']::before,
403
+ .ld-box[data-tone='red']::before {
404
+ background: var(--ld-danger);
405
+ }
406
+
407
+ @media (max-width: 640px) {
408
+ article#nd-page {
409
+ box-sizing: border-box;
410
+ width: 100vw !important;
411
+ max-width: 100vw !important;
412
+ margin-inline: 0 !important;
413
+ }
414
+
415
+ article#nd-page > .prose,
416
+ .ld-docs-hero,
417
+ .ld-skill-card,
418
+ .ld-term,
419
+ .ld-box,
420
+ .ld-tier,
421
+ .ld-flow,
422
+ .ld-state-flow,
423
+ .ld-flow-step,
424
+ .ld-state-node {
425
+ max-width: 100% !important;
426
+ }
427
+
428
+ .ld-flow-step {
429
+ grid-template-columns: 34px minmax(0, 1fr);
430
+ }
431
+
432
+ .ld-step-index {
433
+ width: 28px;
434
+ height: 28px;
435
+ }
436
+
437
+ .ld-state-row {
438
+ display: grid;
439
+ }
440
+
441
+ .ld-state-arrow {
442
+ min-height: 18px;
443
+ transform: rotate(90deg);
444
+ }
445
+
446
+ #nd-page p,
447
+ #nd-page li {
448
+ overflow-wrap: anywhere;
449
+ }
450
+ }