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.
- agent_docs_kit-2.1.0.dist-info/METADATA +299 -0
- agent_docs_kit-2.1.0.dist-info/RECORD +40 -0
- agent_docs_kit-2.1.0.dist-info/WHEEL +4 -0
- agent_docs_kit-2.1.0.dist-info/entry_points.txt +3 -0
- agent_docs_kit-2.1.0.dist-info/licenses/LICENSE +21 -0
- living_docs_cli/__init__.py +686 -0
- living_docs_cli/__main__.py +3 -0
- living_docs_cli/assets/fumadocs-starter/app/docs/[[...slug]]/page.tsx +44 -0
- living_docs_cli/assets/fumadocs-starter/app/docs/layout.tsx +12 -0
- living_docs_cli/assets/fumadocs-starter/app/global.css +450 -0
- living_docs_cli/assets/fumadocs-starter/app/layout.tsx +15 -0
- living_docs_cli/assets/fumadocs-starter/app/page.tsx +5 -0
- living_docs_cli/assets/fumadocs-starter/components/living-docs/index.tsx +185 -0
- living_docs_cli/assets/fumadocs-starter/components/mdx.tsx +27 -0
- living_docs_cli/assets/fumadocs-starter/content/docs/architecture.mdx +55 -0
- living_docs_cli/assets/fumadocs-starter/content/docs/components.mdx +132 -0
- living_docs_cli/assets/fumadocs-starter/content/docs/glossary.mdx +16 -0
- living_docs_cli/assets/fumadocs-starter/content/docs/index.mdx +72 -0
- living_docs_cli/assets/fumadocs-starter/content/docs/meta.json +4 -0
- living_docs_cli/assets/fumadocs-starter/lib/layout.shared.ts +7 -0
- living_docs_cli/assets/fumadocs-starter/lib/source.ts +7 -0
- living_docs_cli/assets/fumadocs-starter/next-env.d.ts +4 -0
- living_docs_cli/assets/fumadocs-starter/next.config.mjs +10 -0
- living_docs_cli/assets/fumadocs-starter/package.json +27 -0
- living_docs_cli/assets/fumadocs-starter/source.config.ts +34 -0
- living_docs_cli/assets/fumadocs-starter/tsconfig.json +23 -0
- living_docs_cli/assets/project/.living-docs/scripts/check.mjs +72 -0
- living_docs_cli/assets/project/.living-docs/scripts/create-doc.mjs +88 -0
- living_docs_cli/assets/project/.living-docs/scripts/glossary.mjs +107 -0
- living_docs_cli/assets/project/.living-docs/templates/architecture.mdx +51 -0
- living_docs_cli/assets/project/.living-docs/templates/change.mdx +40 -0
- living_docs_cli/assets/project/.living-docs/templates/glossary.mdx +15 -0
- living_docs_cli/assets/project/.living-docs/templates/plan.mdx +54 -0
- living_docs_cli/assets/styles/atlas.css +450 -0
- living_docs_cli/assets/workflow-skills/living-docs-architecture/SKILL.md +55 -0
- living_docs_cli/assets/workflow-skills/living-docs-change/SKILL.md +62 -0
- living_docs_cli/assets/workflow-skills/living-docs-check/SKILL.md +32 -0
- living_docs_cli/assets/workflow-skills/living-docs-glossary/SKILL.md +30 -0
- living_docs_cli/assets/workflow-skills/living-docs-plan/SKILL.md +55 -0
- 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
|
+
}
|